SQLite
Hex Artifact Content
Not logged in

Artifact e6056373044d55296d21f81467dba7632bbb81dc49af072b3f0e76338771497e:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0190: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
01a0: 0a 23 64 65 66 69 6e 65 20 49 53 53 50 41 43 45  .#define ISSPACE
01b0: 28 58 29 20 69 73 73 70 61 63 65 28 28 75 6e 73  (X) isspace((uns
01c0: 69 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a  igned char)(X)).
01d0: 23 64 65 66 69 6e 65 20 49 53 44 49 47 49 54 28  #define ISDIGIT(
01e0: 58 29 20 69 73 64 69 67 69 74 28 28 75 6e 73 69  X) isdigit((unsi
01f0: 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23  gned char)(X)).#
0200: 64 65 66 69 6e 65 20 49 53 41 4c 4e 55 4d 28 58  define ISALNUM(X
0210: 29 20 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67  ) isalnum((unsig
0220: 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64  ned char)(X)).#d
0230: 65 66 69 6e 65 20 49 53 41 4c 50 48 41 28 58 29  efine ISALPHA(X)
0240: 20 69 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e   isalpha((unsign
0250: 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65  ed char)(X)).#de
0260: 66 69 6e 65 20 49 53 55 50 50 45 52 28 58 29 20  fine ISUPPER(X) 
0270: 69 73 75 70 70 65 72 28 28 75 6e 73 69 67 6e 65  isupper((unsigne
0280: 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65 66  d char)(X)).#def
0290: 69 6e 65 20 49 53 4c 4f 57 45 52 28 58 29 20 69  ine ISLOWER(X) i
02a0: 73 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65 64  slower((unsigned
02b0: 20 63 68 61 72 29 28 58 29 29 0a 0a 0a 23 69 66   char)(X))...#if
02c0: 6e 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  ndef __WIN32__.#
02d0: 20 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 57     if defined(_W
02e0: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
02f0: 28 57 49 4e 33 32 29 0a 23 20 20 20 20 20 20 20  (WIN32).#       
0300: 64 65 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f  define __WIN32__
0310: 0a 23 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  .#   endif.#endi
0320: 66 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33  f..#ifdef __WIN3
0330: 32 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c  2__.#ifdef __cpl
0340: 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20 22 43  usplus.extern "C
0350: 22 20 7b 0a 23 65 6e 64 69 66 0a 65 78 74 65 72  " {.#endif.exter
0360: 6e 20 69 6e 74 20 61 63 63 65 73 73 28 63 6f 6e  n int access(con
0370: 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 69  st char *path, i
0380: 6e 74 20 6d 6f 64 65 29 3b 0a 23 69 66 64 65 66  nt mode);.#ifdef
0390: 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 7d 0a 23   __cplusplus.}.#
03a0: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 6e 63  endif.#else.#inc
03b0: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
03c0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66 69  #endif../* #defi
03d0: 6e 65 20 50 52 49 56 41 54 45 20 73 74 61 74 69  ne PRIVATE stati
03e0: 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 49  c */.#define PRI
03f0: 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54 45 53  VATE..#ifdef TES
0400: 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48 53  T.#define MAXRHS
0410: 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20   5       /* Set 
0420: 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73 65 20  low to exercise 
0430: 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65 20 2a  exception code *
0440: 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  /.#else.#define 
0450: 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65 6e 64  MAXRHS 1000.#end
0460: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  if..static int s
0470: 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e  howPrecedenceCon
0480: 66 6c 69 63 74 20 3d 20 30 3b 0a 73 74 61 74 69  flict = 0;.stati
0490: 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 63 68  c char *msort(ch
04a0: 61 72 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 28 2a  ar*,char**,int(*
04b0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
04c0: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a  nst char*));../*
04d0: 0a 2a 2a 20 43 6f 6d 70 69 6c 65 72 73 20 61 72  .** Compilers ar
04e0: 65 20 67 65 74 74 69 6e 67 20 69 6e 63 72 65 61  e getting increa
04f0: 73 69 6e 67 6c 79 20 70 65 64 61 6e 74 69 63 20  singly pedantic 
0500: 61 62 6f 75 74 20 74 79 70 65 20 63 6f 6e 76 65  about type conve
0510: 72 73 69 6f 6e 73 0a 2a 2a 20 61 73 20 43 20 65  rsions.** as C e
0520: 76 6f 6c 76 65 73 20 65 76 65 72 20 63 6c 6f 73  volves ever clos
0530: 65 72 20 74 6f 20 41 64 61 2e 2e 2e 2e 20 20 54  er to Ada....  T
0540: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
0550: 65 20 6c 61 74 65 73 74 20 70 72 6f 62 6c 65 6d  e latest problem
0560: 73 0a 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20  s.** we have to 
0570: 64 65 66 69 6e 65 20 74 68 65 20 66 6f 6c 6c 6f  define the follo
0580: 77 69 6e 67 20 76 61 72 69 61 6e 74 20 6f 66 20  wing variant of 
0590: 73 74 72 6c 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65  strlen()..*/.#de
05a0: 66 69 6e 65 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  fine lemonStrlen
05b0: 28 58 29 20 20 20 28 28 69 6e 74 29 73 74 72 6c  (X)   ((int)strl
05c0: 65 6e 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f  en(X))../*.** Co
05d0: 6d 70 69 6c 65 72 73 20 61 72 65 20 73 74 61 72  mpilers are star
05e0: 74 69 6e 67 20 74 6f 20 63 6f 6d 70 6c 61 69 6e  ting to complain
05f0: 20 61 62 6f 75 74 20 74 68 65 20 75 73 65 20 6f   about the use o
0600: 66 20 73 70 72 69 6e 74 66 28 29 20 61 6e 64 20  f sprintf() and 
0610: 73 74 72 63 70 79 28 29 2c 0a 2a 2a 20 73 61 79  strcpy(),.** say
0620: 69 6e 67 20 74 68 65 79 20 61 72 65 20 75 6e 73  ing they are uns
0630: 61 66 65 2e 20 20 53 6f 20 77 65 20 64 65 66 69  afe.  So we defi
0640: 6e 65 20 6f 75 72 20 6f 77 6e 20 76 65 72 73 69  ne our own versi
0650: 6f 6e 73 20 6f 66 20 74 68 6f 73 65 20 72 6f 75  ons of those rou
0660: 74 69 6e 65 73 20 74 6f 6f 2e 0a 2a 2a 0a 2a 2a  tines too..**.**
0670: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
0680: 20 72 6f 75 74 69 6e 65 73 20 68 65 72 65 3a 20   routines here: 
0690: 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 29   lemon_sprintf()
06a0: 2c 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74 66  , lemon_vsprintf
06b0: 28 29 2c 20 61 6e 64 0a 2a 2a 20 6c 65 6d 6f 6e  (), and.** lemon
06c0: 5f 61 64 64 74 65 78 74 28 29 2e 20 54 68 65 20  _addtext(). The 
06d0: 66 69 72 73 74 20 74 77 6f 20 61 72 65 20 72 65  first two are re
06e0: 70 6c 61 63 65 6d 65 6e 74 73 20 66 6f 72 20 73  placements for s
06f0: 70 72 69 6e 74 66 28 29 20 61 6e 64 20 76 73 70  printf() and vsp
0700: 72 69 6e 74 66 28 29 2e 0a 2a 2a 20 54 68 65 20  rintf()..** The 
0710: 74 68 69 72 64 20 69 73 20 61 20 68 65 6c 70 65  third is a helpe
0720: 72 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 76 73  r routine for vs
0730: 6e 70 72 69 6e 74 66 28 29 20 74 68 61 74 20 61  nprintf() that a
0740: 64 64 73 20 74 65 78 74 73 20 74 6f 20 74 68 65  dds texts to the
0750: 20 65 6e 64 20 6f 66 20 61 0a 2a 2a 20 62 75 66   end of a.** buf
0760: 66 65 72 2c 20 6d 61 6b 69 6e 67 20 73 75 72 65  fer, making sure
0770: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 61   the buffer is a
0780: 6c 77 61 79 73 20 7a 65 72 6f 2d 74 65 72 6d 69  lways zero-termi
0790: 6e 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nated..**.** The
07a0: 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 65   string formatte
07b0: 72 20 69 73 20 61 20 6d 69 6e 69 6d 61 6c 20 73  r is a minimal s
07c0: 75 62 73 65 74 20 6f 66 20 73 74 64 6c 69 62 20  ubset of stdlib 
07d0: 73 70 72 69 6e 74 66 28 29 20 73 75 70 70 6f 72  sprintf() suppor
07e0: 74 69 6e 67 20 6f 6e 6c 79 0a 2a 2a 20 61 20 66  ting only.** a f
07f0: 65 77 20 73 69 6d 70 6c 79 20 63 6f 6e 76 65 72  ew simply conver
0800: 73 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 25  sions:.**.**   %
0810: 64 0a 2a 2a 20 20 20 25 73 0a 2a 2a 20 20 20 25  d.**   %s.**   %
0820: 2e 2a 73 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  .*s.**.*/.static
0830: 20 76 6f 69 64 20 6c 65 6d 6f 6e 5f 61 64 64 74   void lemon_addt
0840: 65 78 74 28 0a 20 20 63 68 61 72 20 2a 7a 42 75  ext(.  char *zBu
0850: 66 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  f,           /* 
0860: 54 68 65 20 62 75 66 66 65 72 20 74 6f 20 77 68  The buffer to wh
0870: 69 63 68 20 74 65 78 74 20 69 73 20 61 64 64 65  ich text is adde
0880: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 55 73  d */.  int *pnUs
0890: 65 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed,          /* 
08a0: 53 6c 6f 74 73 20 6f 66 20 74 68 65 20 62 75 66  Slots of the buf
08b0: 66 65 72 20 75 73 65 64 20 73 6f 20 66 61 72 20  fer used so far 
08c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
08d0: 2a 7a 49 6e 2c 20 20 20 20 20 20 2f 2a 20 54 65  *zIn,      /* Te
08e0: 78 74 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69  xt to add */.  i
08f0: 6e 74 20 6e 49 6e 2c 20 20 20 20 20 20 20 20 20  nt nIn,         
0900: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
0910: 20 74 65 78 74 20 74 6f 20 61 64 64 2e 20 20 2d   text to add.  -
0920: 31 20 74 6f 20 75 73 65 20 73 74 72 6c 65 6e 28  1 to use strlen(
0930: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 57 69 64 74  ) */.  int iWidt
0940: 68 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h            /* 
0950: 46 69 65 6c 64 20 77 69 64 74 68 2e 20 20 4e 65  Field width.  Ne
0960: 67 61 74 69 76 65 20 74 6f 20 6c 65 66 74 20 6a  gative to left j
0970: 75 73 74 69 66 79 20 2a 2f 0a 29 7b 0a 20 20 69  ustify */.){.  i
0980: 66 28 20 6e 49 6e 3c 30 20 29 20 66 6f 72 28 6e  f( nIn<0 ) for(n
0990: 49 6e 3d 30 3b 20 7a 49 6e 5b 6e 49 6e 5d 3b 20  In=0; zIn[nIn]; 
09a0: 6e 49 6e 2b 2b 29 7b 7d 0a 20 20 77 68 69 6c 65  nIn++){}.  while
09b0: 28 20 69 57 69 64 74 68 3e 6e 49 6e 20 29 7b 20  ( iWidth>nIn ){ 
09c0: 7a 42 75 66 5b 28 2a 70 6e 55 73 65 64 29 2b 2b  zBuf[(*pnUsed)++
09d0: 5d 20 3d 20 27 20 27 3b 20 69 57 69 64 74 68 2d  ] = ' '; iWidth-
09e0: 2d 3b 20 7d 0a 20 20 69 66 28 20 6e 49 6e 3d 3d  -; }.  if( nIn==
09f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  0 ) return;.  me
0a00: 6d 63 70 79 28 26 7a 42 75 66 5b 2a 70 6e 55 73  mcpy(&zBuf[*pnUs
0a10: 65 64 5d 2c 20 7a 49 6e 2c 20 6e 49 6e 29 3b 0a  ed], zIn, nIn);.
0a20: 20 20 2a 70 6e 55 73 65 64 20 2b 3d 20 6e 49 6e    *pnUsed += nIn
0a30: 3b 0a 20 20 77 68 69 6c 65 28 20 28 2d 69 57 69  ;.  while( (-iWi
0a40: 64 74 68 29 3e 6e 49 6e 20 29 7b 20 7a 42 75 66  dth)>nIn ){ zBuf
0a50: 5b 28 2a 70 6e 55 73 65 64 29 2b 2b 5d 20 3d 20  [(*pnUsed)++] = 
0a60: 27 20 27 3b 20 69 57 69 64 74 68 2b 2b 3b 20 7d  ' '; iWidth++; }
0a70: 0a 20 20 7a 42 75 66 5b 2a 70 6e 55 73 65 64 5d  .  zBuf[*pnUsed]
0a80: 20 3d 20 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69   = 0;.}.static i
0a90: 6e 74 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74  nt lemon_vsprint
0aa0: 66 28 63 68 61 72 20 2a 73 74 72 2c 20 63 6f 6e  f(char *str, con
0ab0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
0ac0: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
0ad0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 63 3b   int i, j, k, c;
0ae0: 0a 20 20 69 6e 74 20 6e 55 73 65 64 20 3d 20 30  .  int nUsed = 0
0af0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
0b00: 7a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  z;.  char zTemp[
0b10: 35 30 5d 3b 0a 20 20 73 74 72 5b 30 5d 20 3d 20  50];.  str[0] = 
0b20: 30 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  0;.  for(i=j=0; 
0b30: 28 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 69 5d 29  (c = zFormat[i])
0b40: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  !=0; i++){.    i
0b50: 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a 20 20 20  f( c=='%' ){.   
0b60: 20 20 20 69 6e 74 20 69 57 69 64 74 68 20 3d 20     int iWidth = 
0b70: 30 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  0;.      lemon_a
0b80: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0b90: 65 64 2c 20 26 7a 46 6f 72 6d 61 74 5b 6a 5d 2c  ed, &zFormat[j],
0ba0: 20 69 2d 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20   i-j, 0);.      
0bb0: 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 2b 2b 69 5d  c = zFormat[++i]
0bc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 44 49  ;.      if( ISDI
0bd0: 47 49 54 28 63 29 20 7c 7c 20 28 63 3d 3d 27 2d  GIT(c) || (c=='-
0be0: 27 20 26 26 20 49 53 44 49 47 49 54 28 7a 46 6f  ' && ISDIGIT(zFo
0bf0: 72 6d 61 74 5b 69 2b 31 5d 29 29 20 29 7b 0a 20  rmat[i+1])) ){. 
0c00: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2d         if( c=='-
0c10: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) i++;.       
0c20: 20 77 68 69 6c 65 28 20 49 53 44 49 47 49 54 28   while( ISDIGIT(
0c30: 7a 46 6f 72 6d 61 74 5b 69 5d 29 20 29 20 69 57  zFormat[i]) ) iW
0c40: 69 64 74 68 20 3d 20 69 57 69 64 74 68 2a 31 30  idth = iWidth*10
0c50: 20 2b 20 7a 46 6f 72 6d 61 74 5b 69 2b 2b 5d 20   + zFormat[i++] 
0c60: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69  - '0';.        i
0c70: 66 28 20 63 3d 3d 27 2d 27 20 29 20 69 57 69 64  f( c=='-' ) iWid
0c80: 74 68 20 3d 20 2d 69 57 69 64 74 68 3b 0a 20 20  th = -iWidth;.  
0c90: 20 20 20 20 20 20 63 20 3d 20 7a 46 6f 72 6d 61        c = zForma
0ca0: 74 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t[i];.      }.  
0cb0: 20 20 20 20 69 66 28 20 63 3d 3d 27 64 27 20 29      if( c=='d' )
0cc0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76 20  {.        int v 
0cd0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
0ce0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
0cf0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
0d00: 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74  lemon_addtext(st
0d10: 72 2c 20 26 6e 55 73 65 64 2c 20 22 2d 22 2c 20  r, &nUsed, "-", 
0d20: 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20 20 20  1, iWidth);.    
0d30: 20 20 20 20 20 20 76 20 3d 20 2d 76 3b 0a 20 20        v = -v;.  
0d40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
0d50: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  v==0 ){.        
0d60: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0d70: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 22 30 22  str, &nUsed, "0"
0d80: 2c 20 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20  , 1, iWidth);.  
0d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0da0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77  k = 0;.        w
0db0: 68 69 6c 65 28 20 76 3e 30 20 29 7b 0a 20 20 20  hile( v>0 ){.   
0dc0: 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20         k++;.    
0dd0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 73 69 7a 65        zTemp[size
0de0: 6f 66 28 7a 54 65 6d 70 29 2d 6b 5d 20 3d 20 28  of(zTemp)-k] = (
0df0: 76 25 31 30 29 20 2b 20 27 30 27 3b 0a 20 20 20  v%10) + '0';.   
0e00: 20 20 20 20 20 20 20 76 20 2f 3d 20 31 30 3b 0a         v /= 10;.
0e10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0e20: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0e30: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 26 7a 54  str, &nUsed, &zT
0e40: 65 6d 70 5b 73 69 7a 65 6f 66 28 7a 54 65 6d 70  emp[sizeof(zTemp
0e50: 29 2d 6b 5d 2c 20 6b 2c 20 69 57 69 64 74 68 29  )-k], k, iWidth)
0e60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
0e70: 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20  ( c=='s' ){.    
0e80: 20 20 20 20 7a 20 3d 20 76 61 5f 61 72 67 28 61      z = va_arg(a
0e90: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
0ea0: 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  .        lemon_a
0eb0: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0ec0: 65 64 2c 20 7a 2c 20 2d 31 2c 20 69 57 69 64 74  ed, z, -1, iWidt
0ed0: 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  h);.      }else 
0ee0: 69 66 28 20 63 3d 3d 27 2e 27 20 26 26 20 6d 65  if( c=='.' && me
0ef0: 6d 63 6d 70 28 26 7a 46 6f 72 6d 61 74 5b 69 5d  mcmp(&zFormat[i]
0f00: 2c 20 22 2e 2a 73 22 2c 20 33 29 3d 3d 30 20 29  , ".*s", 3)==0 )
0f10: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  {.        i += 2
0f20: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 76 61  ;.        k = va
0f30: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
0f40: 20 20 20 20 20 20 20 7a 20 3d 20 76 61 5f 61 72         z = va_ar
0f50: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
0f60: 2a 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f  *);.        lemo
0f70: 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20 26  n_addtext(str, &
0f80: 6e 55 73 65 64 2c 20 7a 2c 20 6b 2c 20 69 57 69  nUsed, z, k, iWi
0f90: 64 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dth);.      }els
0fa0: 65 20 69 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a  e if( c=='%' ){.
0fb0: 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64          lemon_ad
0fc0: 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65  dtext(str, &nUse
0fd0: 64 2c 20 22 25 22 2c 20 31 2c 20 30 29 3b 0a 20  d, "%", 1, 0);. 
0fe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
0ff0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1000: 72 72 2c 20 22 69 6c 6c 65 67 61 6c 20 66 6f 72  rr, "illegal for
1010: 6d 61 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  mat\n");.       
1020: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
1030: 7d 0a 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b  }.      j = i+1;
1040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 65 6d  .    }.  }.  lem
1050: 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20  on_addtext(str, 
1060: 26 6e 55 73 65 64 2c 20 26 7a 46 6f 72 6d 61 74  &nUsed, &zFormat
1070: 5b 6a 5d 2c 20 69 2d 6a 2c 20 30 29 3b 0a 20 20  [j], i-j, 0);.  
1080: 72 65 74 75 72 6e 20 6e 55 73 65 64 3b 0a 7d 0a  return nUsed;.}.
1090: 73 74 61 74 69 63 20 69 6e 74 20 6c 65 6d 6f 6e  static int lemon
10a0: 5f 73 70 72 69 6e 74 66 28 63 68 61 72 20 2a 73  _sprintf(char *s
10b0: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
10c0: 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  format, ...){.  
10d0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
10e0: 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  t rc;.  va_start
10f0: 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20  (ap, format);.  
1100: 72 63 20 3d 20 6c 65 6d 6f 6e 5f 76 73 70 72 69  rc = lemon_vspri
1110: 6e 74 66 28 73 74 72 2c 20 66 6f 72 6d 61 74 2c  ntf(str, format,
1120: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1130: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1140: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
1150: 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63 68 61 72  emon_strcpy(char
1160: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
1170: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
1180: 65 28 20 28 2a 28 64 65 73 74 2b 2b 29 20 3d 20  e( (*(dest++) = 
1190: 2a 28 73 72 63 2b 2b 29 29 21 3d 30 20 29 7b 7d  *(src++))!=0 ){}
11a0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
11b0: 65 6d 6f 6e 5f 73 74 72 63 61 74 28 63 68 61 72  emon_strcat(char
11c0: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
11d0: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
11e0: 65 28 20 2a 64 65 73 74 20 29 20 64 65 73 74 2b  e( *dest ) dest+
11f0: 2b 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70  +;.  lemon_strcp
1200: 79 28 64 65 73 74 2c 20 73 72 63 29 3b 0a 7d 0a  y(dest, src);.}.
1210: 0a 0a 2f 2a 20 61 20 66 65 77 20 66 6f 72 77 61  ../* a few forwa
1220: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e  rd declarations.
1230: 2e 2e 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c  .. */.struct rul
1240: 65 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 3b  e;.struct lemon;
1250: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 3b 0a  .struct action;.
1260: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
1270: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65  ction *Action_ne
1280: 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63 20  w(void);.static 
1290: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
12a0: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72 75 63  ction_sort(struc
12b0: 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a  t action *);../*
12c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
12d0: 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 68  he file "build.h
12e0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
12f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1300: 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e  ******/.void Fin
1310: 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73  dRulePrecedences
1320: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a 29 3b  (struct lemon*);
1330: 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53  .void FindFirstS
1340: 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ets(struct lemon
1350: 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64 53 74 61  *);.void FindSta
1360: 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  tes(struct lemon
1370: 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e  *);.void FindLin
1380: 6b 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a  ks(struct lemon*
1390: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c  );.void FindFoll
13a0: 6f 77 53 65 74 73 28 73 74 72 75 63 74 20 6c 65  owSets(struct le
13b0: 6d 6f 6e 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64  mon*);.void Find
13c0: 41 63 74 69 6f 6e 73 28 73 74 72 75 63 74 20 6c  Actions(struct l
13d0: 65 6d 6f 6e 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  emon*);../******
13e0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
13f0: 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 68 22  e "configlist.h"
1400: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1420: 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  **/.void Configl
1430: 69 73 74 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a  ist_init(void);.
1440: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
1450: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 73 74  onfiglist_add(st
1460: 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74  ruct rule *, int
1470: 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  );.struct config
1480: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   *Configlist_add
1490: 62 61 73 69 73 28 73 74 72 75 63 74 20 72 75 6c  basis(struct rul
14a0: 65 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20  e *, int);.void 
14b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75  Configlist_closu
14c0: 72 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  re(struct lemon 
14d0: 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  *);.void Configl
14e0: 69 73 74 5f 73 6f 72 74 28 76 6f 69 64 29 3b 0a  ist_sort(void);.
14f0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1500: 73 6f 72 74 62 61 73 69 73 28 76 6f 69 64 29 3b  sortbasis(void);
1510: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1520: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72  Configlist_retur
1530: 6e 28 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20  n(void);.struct 
1540: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
1550: 73 74 5f 62 61 73 69 73 28 76 6f 69 64 29 3b 0a  st_basis(void);.
1560: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1570: 65 61 74 28 73 74 72 75 63 74 20 63 6f 6e 66 69  eat(struct confi
1580: 67 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  g *);.void Confi
1590: 67 6c 69 73 74 5f 72 65 73 65 74 28 76 6f 69 64  glist_reset(void
15a0: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  );../********* F
15b0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 65 72  rom the file "er
15c0: 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ror.h" *********
15d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
15f0: 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f  void ErrorMsg(co
1600: 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c  nst char *, int,
1610: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 2e 2e  const char *, ..
1620: 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 20 46 72 6f  .);../****** Fro
1630: 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69  m the file "opti
1640: 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on.h" **********
1650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1670: 2f 0a 65 6e 75 6d 20 6f 70 74 69 6f 6e 5f 74 79  /.enum option_ty
1680: 70 65 20 7b 20 4f 50 54 5f 46 4c 41 47 3d 31 2c  pe { OPT_FLAG=1,
1690: 20 20 4f 50 54 5f 49 4e 54 2c 20 20 4f 50 54 5f    OPT_INT,  OPT_
16a0: 44 42 4c 2c 20 20 4f 50 54 5f 53 54 52 2c 0a 20  DBL,  OPT_STR,. 
16b0: 20 20 20 20 20 20 20 20 4f 50 54 5f 46 46 4c 41          OPT_FFLA
16c0: 47 2c 20 4f 50 54 5f 46 49 4e 54 2c 20 4f 50 54  G, OPT_FINT, OPT
16d0: 5f 46 44 42 4c 2c 20 4f 50 54 5f 46 53 54 52 7d  _FDBL, OPT_FSTR}
16e0: 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  ;.struct s_optio
16f0: 6e 73 20 7b 0a 20 20 65 6e 75 6d 20 6f 70 74 69  ns {.  enum opti
1700: 6f 6e 5f 74 79 70 65 20 74 79 70 65 3b 0a 20 20  on_type type;.  
1710: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 61 62 65  const char *labe
1720: 6c 3b 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 0a  l;.  char *arg;.
1730: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 65    const char *me
1740: 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e 74 20 20 20  ssage;.};.int   
1750: 20 4f 70 74 49 6e 69 74 28 63 68 61 72 2a 2a 2c   OptInit(char**,
1760: 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73  struct s_options
1770: 2a 2c 46 49 4c 45 2a 29 3b 0a 69 6e 74 20 20 20  *,FILE*);.int   
1780: 20 4f 70 74 4e 41 72 67 73 28 76 6f 69 64 29 3b   OptNArgs(void);
1790: 0a 63 68 61 72 20 20 2a 4f 70 74 41 72 67 28 69  .char  *OptArg(i
17a0: 6e 74 29 3b 0a 76 6f 69 64 20 20 20 4f 70 74 45  nt);.void   OptE
17b0: 72 72 28 69 6e 74 29 3b 0a 76 6f 69 64 20 20 20  rr(int);.void   
17c0: 4f 70 74 50 72 69 6e 74 28 76 6f 69 64 29 3b 0a  OptPrint(void);.
17d0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ./******** From 
17e0: 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e  the file "parse.
17f0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
1800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1820: 69 64 20 50 61 72 73 65 28 73 74 72 75 63 74 20  id Parse(struct 
1830: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 3b 0a 0a 2f  lemon *lemp);../
1840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
1850: 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 68  he file "plink.h
1860: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
1870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63  *********/.struc
1890: 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e  t plink *Plink_n
18a0: 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 50  ew(void);.void P
18b0: 6c 69 6e 6b 5f 61 64 64 28 73 74 72 75 63 74 20  link_add(struct 
18c0: 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63 74  plink **, struct
18d0: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64   config *);.void
18e0: 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74 72 75   Plink_copy(stru
18f0: 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72  ct plink **, str
1900: 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b 0a 76 6f  uct plink *);.vo
1910: 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28  id Plink_delete(
1920: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b  struct plink *);
1930: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
1940: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70  om the file "rep
1950: 6f 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ort.h" *********
1960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1980: 69 64 20 52 65 70 72 69 6e 74 28 73 74 72 75 63  id Reprint(struc
1990: 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64  t lemon *);.void
19a0: 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 73 74   ReportOutput(st
19b0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76  ruct lemon *);.v
19c0: 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28  oid ReportTable(
19d0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20  struct lemon *, 
19e0: 69 6e 74 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72  int);.void Repor
19f0: 74 48 65 61 64 65 72 28 73 74 72 75 63 74 20 6c  tHeader(struct l
1a00: 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 43 6f  emon *);.void Co
1a10: 6d 70 72 65 73 73 54 61 62 6c 65 73 28 73 74 72  mpressTables(str
1a20: 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f  uct lemon *);.vo
1a30: 69 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28  id ResortStates(
1a40: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b  struct lemon *);
1a50: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
1a60: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 65 74  om the file "set
1a70: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1aa0: 69 64 20 20 53 65 74 53 69 7a 65 28 69 6e 74 29  id  SetSize(int)
1ab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ac0: 20 41 6c 6c 20 73 65 74 73 20 77 69 6c 6c 20 62   All sets will b
1ad0: 65 20 6f 66 20 73 69 7a 65 20 4e 20 2a 2f 0a 63  e of size N */.c
1ae0: 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f 69 64  har *SetNew(void
1af0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1b00: 20 2f 2a 20 41 20 6e 65 77 20 73 65 74 20 66 6f   /* A new set fo
1b10: 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e 4e 20 2a  r element 0..N *
1b20: 2f 0a 76 6f 69 64 20 20 53 65 74 46 72 65 65 28  /.void  SetFree(
1b30: 63 68 61 72 2a 29 3b 20 20 20 20 20 20 20 20 20  char*);         
1b40: 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74      /* Deallocat
1b50: 65 20 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53  e a set */.int S
1b60: 65 74 41 64 64 28 63 68 61 72 2a 2c 69 6e 74 29  etAdd(char*,int)
1b70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b80: 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f 20 61  Add element to a
1b90: 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65 74 55   set */.int SetU
1ba0: 6e 69 6f 6e 28 63 68 61 72 20 2a 2c 63 68 61 72  nion(char *,char
1bb0: 20 2a 29 3b 20 20 20 20 2f 2a 20 41 20 3c 2d 20   *);    /* A <- 
1bc0: 41 20 55 20 42 2c 20 74 68 72 75 20 65 6c 65 6d  A U B, thru elem
1bd0: 65 6e 74 20 4e 20 2a 2f 0a 23 64 65 66 69 6e 65  ent N */.#define
1be0: 20 53 65 74 46 69 6e 64 28 58 2c 59 29 20 28 58   SetFind(X,Y) (X
1bf0: 5b 59 5d 29 20 20 20 20 20 20 20 2f 2a 20 54 72  [Y])       /* Tr
1c00: 75 65 20 69 66 20 59 20 69 73 20 69 6e 20 73 65  ue if Y is in se
1c10: 74 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  t X */../*******
1c20: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1c30: 65 20 22 73 74 72 75 63 74 2e 68 22 20 2a 2a 2a  e "struct.h" ***
1c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c60: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 63 69  **/./*.** Princi
1c70: 70 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  pal data structu
1c80: 72 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f  res for the LEMO
1c90: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
1ca0: 6f 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20  or..*/..typedef 
1cb0: 65 6e 75 6d 20 7b 4c 45 4d 4f 4e 5f 46 41 4c 53  enum {LEMON_FALS
1cc0: 45 3d 30 2c 20 4c 45 4d 4f 4e 5f 54 52 55 45 7d  E=0, LEMON_TRUE}
1cd0: 20 42 6f 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20 53 79   Boolean;../* Sy
1ce0: 6d 62 6f 6c 73 20 28 74 65 72 6d 69 6e 61 6c 73  mbols (terminals
1cf0: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
1d00: 73 29 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  s) of the gramma
1d10: 72 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20  r are stored.** 
1d20: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1d30: 3a 20 2a 2f 0a 65 6e 75 6d 20 73 79 6d 62 6f 6c  : */.enum symbol
1d40: 5f 74 79 70 65 20 7b 0a 20 20 54 45 52 4d 49 4e  _type {.  TERMIN
1d50: 41 4c 2c 0a 20 20 4e 4f 4e 54 45 52 4d 49 4e 41  AL,.  NONTERMINA
1d60: 4c 2c 0a 20 20 4d 55 4c 54 49 54 45 52 4d 49 4e  L,.  MULTITERMIN
1d70: 41 4c 0a 7d 3b 0a 65 6e 75 6d 20 65 5f 61 73 73  AL.};.enum e_ass
1d80: 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c 0a 20  oc {.    LEFT,. 
1d90: 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20 4e 4f     RIGHT,.    NO
1da0: 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 7d 3b 0a 73  NE,.    UNK.};.s
1db0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 7b 0a 20  truct symbol {. 
1dc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d   const char *nam
1dd0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  e;        /* Nam
1de0: 65 20 6f 66 20 74 68 65 20 73 79 6d 62 6f 6c 20  e of the symbol 
1df0: 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20  */.  int index; 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e10: 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f   Index number fo
1e20: 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f  r this symbol */
1e30: 0a 20 20 65 6e 75 6d 20 73 79 6d 62 6f 6c 5f 74  .  enum symbol_t
1e40: 79 70 65 20 74 79 70 65 3b 20 20 20 2f 2a 20 53  ype type;   /* S
1e50: 79 6d 62 6f 6c 73 20 61 72 65 20 61 6c 6c 20 65  ymbols are all e
1e60: 69 74 68 65 72 20 54 45 52 4d 49 4e 41 4c 53 20  ither TERMINALS 
1e70: 6f 72 20 4e 54 73 20 2a 2f 0a 20 20 73 74 72 75  or NTs */.  stru
1e80: 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20  ct rule *rule;  
1e90: 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c       /* Linked l
1ea0: 69 73 74 20 6f 66 20 72 75 6c 65 73 20 6f 66 20  ist of rules of 
1eb0: 74 68 69 73 20 28 69 66 20 61 6e 20 4e 54 29 20  this (if an NT) 
1ec0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
1ed0: 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 2f 2a  ol *fallback; /*
1ee0: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20   fallback token 
1ef0: 69 6e 20 63 61 73 65 20 74 68 69 73 20 74 6f 6b  in case this tok
1f00: 65 6e 20 64 6f 65 73 6e 27 74 20 70 61 72 73 65  en doesn't parse
1f10: 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63 3b 20   */.  int prec; 
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f30: 2a 20 50 72 65 63 65 64 65 6e 63 65 20 69 66 20  * Precedence if 
1f40: 64 65 66 69 6e 65 64 20 28 2d 31 20 6f 74 68 65  defined (-1 othe
1f50: 72 77 69 73 65 29 20 2a 2f 0a 20 20 65 6e 75 6d  rwise) */.  enum
1f60: 20 65 5f 61 73 73 6f 63 20 61 73 73 6f 63 3b 20   e_assoc assoc; 
1f70: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
1f80: 69 76 69 74 79 20 69 66 20 70 72 65 63 65 64 65  ivity if precede
1f90: 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64 20 2a  nce is defined *
1fa0: 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73 74 73  /.  char *firsts
1fb0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
1fc0: 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20 61 6c  First-set for al
1fd0: 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73 20  l rules of this 
1fe0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f 6f 6c  symbol */.  Bool
1ff0: 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20 20 20  ean lambda;     
2000: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2010: 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e 65 72  NT and can gener
2020: 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72  ate an empty str
2030: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ing */.  int use
2040: 43 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cnt;            
2050: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2060: 69 6d 65 73 20 75 73 65 64 20 2a 2f 0a 20 20 63  imes used */.  c
2070: 68 61 72 20 2a 64 65 73 74 72 75 63 74 6f 72 3b  har *destructor;
2080: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2090: 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
20a0: 68 65 6e 65 76 65 72 20 74 68 69 73 20 73 79 6d  henever this sym
20b0: 62 6f 6c 20 69 73 0a 20 20 20 20 20 20 20 20 20  bol is.         
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 2a 2a 20 70 6f 70 70 65 64 20 66 72 6f 6d    ** popped from
20e0: 20 74 68 65 20 73 74 61 63 6b 20 64 75 72 69 6e   the stack durin
20f0: 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73 73 69  g error processi
2100: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  ng */.  int dest
2110: 4c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20  Lineno;         
2120: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
2130: 66 6f 72 20 73 74 61 72 74 20 6f 66 20 64 65 73  for start of des
2140: 74 72 75 63 74 6f 72 2e 20 20 53 65 74 20 74 6f  tructor.  Set to
2150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2160: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 2d              ** -
2170: 31 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  1 for duplicate 
2180: 64 65 73 74 72 75 63 74 6f 72 73 2e 20 2a 2f 0a  destructors. */.
2190: 20 20 63 68 61 72 20 2a 64 61 74 61 74 79 70 65    char *datatype
21a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
21b0: 65 20 64 61 74 61 20 74 79 70 65 20 6f 66 20 69  e data type of i
21c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c 64 20  nformation held 
21d0: 62 79 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  by this.        
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e     ** object. On
2200: 6c 79 20 75 73 65 64 20 69 66 20 74 79 70 65 3d  ly used if type=
2210: 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a  =NONTERMINAL */.
2220: 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20 20 20    int dtnum;    
2230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2240: 65 20 64 61 74 61 20 74 79 70 65 20 6e 75 6d 62  e data type numb
2250: 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61 72 73  er.  In the pars
2260: 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a 20 20  er, the value.  
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 63           ** stac
2290: 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20 20 54  k is a union.  T
22a0: 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65 6e 74  he .yy%d element
22b0: 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20 20 20   of this.       
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69 73 20      ** union is 
22e0: 74 68 65 20 63 6f 72 72 65 63 74 20 64 61 74 61  the correct data
22f0: 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20 6f   type for this o
2300: 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a 20 54 68  bject */.  /* Th
2310: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
2320: 64 73 20 61 72 65 20 75 73 65 64 20 62 79 20 4d  ds are used by M
2330: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73 20 6f 6e  ULTITERMINALs on
2340: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 75 62  ly */.  int nsub
2350: 73 79 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sym;            
2360: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
2370: 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c  nstituent symbol
2380: 73 20 69 6e 20 74 68 65 20 4d 55 4c 54 49 20 2a  s in the MULTI *
2390: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
23a0: 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20 2f 2a 20  l **subsym;  /* 
23b0: 41 72 72 61 79 20 6f 66 20 63 6f 6e 73 74 69 74  Array of constit
23c0: 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  uent symbols */.
23d0: 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64  };../* Each prod
23e0: 75 63 74 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74  uction rule in t
23f0: 68 65 20 67 72 61 6d 6d 61 72 20 69 73 20 73 74  he grammar is st
2400: 6f 72 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ored in the foll
2410: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
2420: 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63 74 20 72  re.  */.struct r
2430: 75 6c 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ule {.  struct s
2440: 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20  ymbol *lhs;     
2450: 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69   /* Left-hand si
2460: 64 65 20 6f 66 20 74 68 65 20 72 75 6c 65 20 2a  de of the rule *
2470: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2480: 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 2f 2a 20  lhsalias;    /* 
2490: 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48  Alias for the LH
24a0: 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29  S (NULL if none)
24b0: 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73 53 74 61   */.  int lhsSta
24c0: 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rt;            /
24d0: 2a 20 54 72 75 65 20 69 66 20 6c 65 66 74 2d 68  * True if left-h
24e0: 61 6e 64 20 73 69 64 65 20 69 73 20 74 68 65 20  and side is the 
24f0: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a  start symbol */.
2500: 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20    int ruleline; 
2510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2520: 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ne number for th
2530: 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e rule */.  int 
2540: 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  nrhs;           
2550: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2560: 66 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f  f RHS symbols */
2570: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
2580: 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20 54   **rhs;     /* T
2590: 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  he RHS symbols *
25a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
25b0: 2a 72 68 73 61 6c 69 61 73 3b 20 20 20 2f 2a 20  *rhsalias;   /* 
25c0: 41 6e 20 61 6c 69 61 73 20 66 6f 72 20 65 61 63  An alias for eac
25d0: 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55  h RHS symbol (NU
25e0: 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20  LL if none) */. 
25f0: 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20 20   int line;      
2600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
2610: 65 20 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63  e number at whic
2620: 68 20 63 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f  h code begins */
2630: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  .  const char *c
2640: 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ode;        /* T
2650: 68 65 20 63 6f 64 65 20 65 78 65 63 75 74 65 64  he code executed
2660: 20 77 68 65 6e 20 74 68 69 73 20 72 75 6c 65 20   when this rule 
2670: 69 73 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20  is reduced */.  
2680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65  const char *code
2690: 50 72 65 66 69 78 3b 20 20 2f 2a 20 53 65 74 75  Prefix;  /* Setu
26a0: 70 20 63 6f 64 65 20 62 65 66 6f 72 65 20 63 6f  p code before co
26b0: 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f 0a 20 20  de[] above */.  
26c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65  const char *code
26d0: 53 75 66 66 69 78 3b 20 20 2f 2a 20 42 72 65 61  Suffix;  /* Brea
26e0: 6b 64 6f 77 6e 20 63 6f 64 65 20 61 66 74 65 72  kdown code after
26f0: 20 63 6f 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f   code[] above */
2700: 0a 20 20 69 6e 74 20 6e 6f 43 6f 64 65 3b 20 20  .  int noCode;  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2720: 72 75 65 20 69 66 20 74 68 69 73 20 72 75 6c 65  rue if this rule
2730: 20 68 61 73 20 6e 6f 20 61 73 73 6f 63 69 61 74   has no associat
2740: 65 64 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 69  ed C code */.  i
2750: 6e 74 20 63 6f 64 65 45 6d 69 74 74 65 64 3b 20  nt codeEmitted; 
2760: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2770: 69 66 20 74 68 65 20 63 6f 64 65 20 68 61 73 20  if the code has 
2780: 62 65 65 6e 20 65 6d 69 74 74 65 64 20 61 6c 72  been emitted alr
2790: 65 61 64 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  eady */.  struct
27a0: 20 73 79 6d 62 6f 6c 20 2a 70 72 65 63 73 79 6d   symbol *precsym
27b0: 3b 20 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65  ;  /* Precedence
27c0: 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 69 73   symbol for this
27d0: 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   rule */.  int i
27e0: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
27f0: 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
2800: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
2810: 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  rule */.  int iR
2820: 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ule;            
2830: 20 20 20 2f 2a 20 52 75 6c 65 20 6e 75 6d 62 65     /* Rule numbe
2840: 72 20 61 73 20 75 73 65 64 20 69 6e 20 74 68 65  r as used in the
2850: 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
2860: 73 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 63  s */.  Boolean c
2870: 61 6e 52 65 64 75 63 65 3b 20 20 20 20 20 20 20  anReduce;       
2880: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2890: 72 75 6c 65 20 69 73 20 65 76 65 72 20 72 65 64  rule is ever red
28a0: 75 63 65 64 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61  uced */.  Boolea
28b0: 6e 20 64 6f 65 73 52 65 64 75 63 65 3b 20 20 20  n doesReduce;   
28c0: 20 20 20 2f 2a 20 52 65 64 75 63 65 20 61 63 74     /* Reduce act
28d0: 69 6f 6e 73 20 6f 63 63 75 72 20 61 66 74 65 72  ions occur after
28e0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f   optimization */
28f0: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
2900: 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e  nextlhs;    /* N
2910: 65 78 74 20 72 75 6c 65 20 77 69 74 68 20 74 68  ext rule with th
2920: 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20  e same LHS */.  
2930: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78  struct rule *nex
2940: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  t;       /* Next
2950: 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f   rule in the glo
2960: 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a  bal list */.};..
2970: 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72 61 74 69  /* A configurati
2980: 6f 6e 20 69 73 20 61 20 70 72 6f 64 75 63 74 69  on is a producti
2990: 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68 65 20 67  on rule of the g
29a0: 72 61 6d 6d 61 72 20 74 6f 67 65 74 68 65 72 20  rammar together 
29b0: 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28  with.** a mark (
29c0: 64 6f 74 29 20 73 68 6f 77 69 6e 67 20 68 6f 77  dot) showing how
29d0: 20 6d 75 63 68 20 6f 66 20 74 68 61 74 20 72 75   much of that ru
29e0: 6c 65 20 68 61 73 20 62 65 65 6e 20 70 72 6f 63  le has been proc
29f0: 65 73 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a  essed so far..**
2a00: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   Configurations 
2a10: 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66  also contain a f
2a20: 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63 68 20  ollow-set which 
2a30: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 65 72  is a list of ter
2a40: 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73  minal.** symbols
2a50: 20 77 68 69 63 68 20 61 72 65 20 61 6c 6c 6f 77   which are allow
2a60: 65 64 20 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c  ed to immediatel
2a70: 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64  y follow the end
2a80: 20 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a   of the rule..**
2a90: 20 45 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61   Every configura
2aa0: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
2ab0: 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   as an instance 
2ac0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2ad0: 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67 73 74 61  : */.enum cfgsta
2ae0: 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c 45 54 45  tus {.  COMPLETE
2af0: 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54 45 0a 7d  ,.  INCOMPLETE.}
2b00: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
2b10: 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  {.  struct rule 
2b20: 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  *rp;         /* 
2b30: 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77 68  The rule upon wh
2b40: 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ich the configur
2b50: 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20 2a  ation is based *
2b60: 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20 20  /.  int dot;    
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b80: 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74 20  The parse point 
2b90: 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b 20  */.  char *fws; 
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bb0: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 20   Follow-set for 
2bc0: 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  this configurati
2bd0: 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  on only */.  str
2be0: 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b  uct plink *fplp;
2bf0: 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d        /* Follow-
2c00: 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f 70  set forward prop
2c10: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f  agation links */
2c20: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
2c30: 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46  *bplp;      /* F
2c40: 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77 61  ollow-set backwa
2c50: 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  rds propagation 
2c60: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63  links */.  struc
2c70: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20  t state *stp;   
2c80: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2c90: 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63 6f  o state which co
2ca0: 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a 20  ntains this */. 
2cb0: 20 65 6e 75 6d 20 63 66 67 73 74 61 74 75 73 20   enum cfgstatus 
2cc0: 73 74 61 74 75 73 3b 20 20 20 2f 2a 20 75 73 65  status;   /* use
2cd0: 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f 77 73  d during follows
2ce0: 65 74 20 61 6e 64 20 73 68 69 66 74 20 63 6f 6d  et and shift com
2cf0: 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  putations */.  s
2d00: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
2d10: 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  xt;     /* Next 
2d20: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e  configuration in
2d30: 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a 20 20   the state */.  
2d40: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
2d50: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
2d60: 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e 66 69  next basis confi
2d70: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a  guration */.};..
2d80: 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 7b 0a  enum e_action {.
2d90: 20 20 53 48 49 46 54 2c 0a 20 20 41 43 43 45 50    SHIFT,.  ACCEP
2da0: 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a 20 20 45  T,.  REDUCE,.  E
2db0: 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e 46 4c 49  RROR,.  SSCONFLI
2dc0: 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CT,             
2dd0: 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68 69 66   /* A shift/shif
2de0: 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  t conflict */.  
2df0: 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20  SRCONFLICT,     
2e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20           /* Was 
2e10: 61 20 72 65 64 75 63 65 2c 20 62 75 74 20 70 61  a reduce, but pa
2e20: 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63 74  rt of a conflict
2e30: 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c 49 43 54   */.  RRCONFLICT
2e40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2e50: 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c 20  * Was a reduce, 
2e60: 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  but part of a co
2e70: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 48 5f 52  nflict */.  SH_R
2e80: 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20  ESOLVED,        
2e90: 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 73 68       /* Was a sh
2ea0: 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e 63 65  ift.  Precedence
2eb0: 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69   resolved confli
2ec0: 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45 53 4f 4c  ct */.  RD_RESOL
2ed0: 56 45 44 2c 20 20 20 20 20 20 20 20 20 20 20 20  VED,            
2ee0: 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65 2e 20   /* Was reduce. 
2ef0: 20 50 72 65 63 65 64 65 6e 63 65 20 72 65 73 6f   Precedence reso
2f00: 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  lved conflict */
2f10: 0a 20 20 4e 4f 54 5f 55 53 45 44 2c 20 20 20 20  .  NOT_USED,    
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2f30: 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70 72 65  eleted by compre
2f40: 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 48 49 46 54  ssion */.  SHIFT
2f50: 52 45 44 55 43 45 20 20 20 20 20 20 20 20 20 20  REDUCE          
2f60: 20 20 20 20 2f 2a 20 53 68 69 66 74 20 66 69 72      /* Shift fir
2f70: 73 74 2c 20 74 68 65 6e 20 72 65 64 75 63 65 20  st, then reduce 
2f80: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79 20  */.};../* Every 
2f90: 73 68 69 66 74 20 6f 72 20 72 65 64 75 63 65 20  shift or reduce 
2fa0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 74 6f  operation is sto
2fb0: 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20 74 68  red as one of th
2fc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
2fd0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a 20  truct action {. 
2fe0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
2ff0: 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  sp;       /* The
3000: 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d 62   look-ahead symb
3010: 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61  ol */.  enum e_a
3020: 63 74 69 6f 6e 20 74 79 70 65 3b 0a 20 20 75 6e  ction type;.  un
3030: 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75 63 74  ion {.    struct
3040: 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 20   state *stp;    
3050: 20 2f 2a 20 54 68 65 20 6e 65 77 20 73 74 61 74   /* The new stat
3060: 65 2c 20 69 66 20 61 20 73 68 69 66 74 20 2a 2f  e, if a shift */
3070: 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65  .    struct rule
3080: 20 2a 72 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *rp;       /* T
3090: 68 65 20 72 75 6c 65 2c 20 69 66 20 61 20 72 65  he rule, if a re
30a0: 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a 20  duce */.  } x;. 
30b0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
30c0: 73 70 4f 70 74 3b 20 20 20 20 2f 2a 20 53 48 49  spOpt;    /* SHI
30d0: 46 54 52 45 44 55 43 45 20 6f 70 74 69 6d 69 7a  FTREDUCE optimiz
30e0: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 73 79  ation to this sy
30f0: 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74  mbol */.  struct
3100: 20 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20   action *next;  
3110: 20 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f     /* Next actio
3120: 6e 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  n for this state
3130: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74   */.  struct act
3140: 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f  ion *collide;  /
3150: 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69  * Next action wi
3160: 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
3170: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20   */.};../* Each 
3180: 73 74 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e  state of the gen
3190: 65 72 61 74 65 64 20 70 61 72 73 65 72 27 73 20  erated parser's 
31a0: 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63  finite state mac
31b0: 68 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64  hine.** is encod
31c0: 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63  ed as an instanc
31d0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
31e0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ng structure. */
31f0: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a  .struct state {.
3200: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
3210: 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *bp;       /* Th
3220: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
3230: 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20  ations for this 
3240: 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  state */.  struc
3250: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20  t config *cfp;  
3260: 20 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69      /* All confi
3270: 67 75 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  gurations in thi
3280: 73 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73  s set */.  int s
3290: 74 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20  tatenum;        
32a0: 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 74 69 61      /* Sequentia
32b0: 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  l number for thi
32c0: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  s state */.  str
32d0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20  uct action *ap; 
32e0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
32f0: 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69   actions for thi
3300: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  s state */.  int
3310: 20 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63 74   nTknAct, nNtAct
3320: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
3330: 6f 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74 65  of actions on te
3340: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74  rminals and nont
3350: 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e  erminals */.  in
3360: 74 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74 4f  t iTknOfst, iNtO
3370: 66 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63 74  fst;   /* yy_act
3380: 69 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f 72  ion[] offset for
3390: 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e   terminals and n
33a0: 6f 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  onterms */.  int
33b0: 20 69 44 66 6c 74 52 65 64 75 63 65 3b 20 20 20   iDfltReduce;   
33c0: 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74        /* Default
33d0: 20 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 52 45   action is to RE
33e0: 44 55 43 45 20 62 79 20 74 68 69 73 20 72 75 6c  DUCE by this rul
33f0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  e */.  struct ru
3400: 6c 65 20 2a 70 44 66 6c 74 52 65 64 75 63 65 3b  le *pDfltReduce;
3410: 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 52  /* The default R
3420: 45 44 55 43 45 20 72 75 6c 65 2e 20 2a 2f 0a 20  EDUCE rule. */. 
3430: 20 69 6e 74 20 61 75 74 6f 52 65 64 75 63 65 3b   int autoReduce;
3440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3450: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
3460: 61 75 74 6f 2d 72 65 64 75 63 65 20 73 74 61 74  auto-reduce stat
3470: 65 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20  e */.};.#define 
3480: 4e 4f 5f 4f 46 46 53 45 54 20 28 2d 32 31 34 37  NO_OFFSET (-2147
3490: 34 38 33 36 34 37 29 0a 0a 2f 2a 20 41 20 66 6f  483647)../* A fo
34a0: 6c 6c 6f 77 73 65 74 20 70 72 6f 70 61 67 61 74  llowset propagat
34b0: 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64 69 63 61 74  ion link indicat
34c0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
34d0: 65 6e 74 73 20 6f 66 20 6f 6e 65 0a 2a 2a 20 63  ents of one.** c
34e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f 6c  onfiguration fol
34f0: 6c 6f 77 73 65 74 20 73 68 6f 75 6c 64 20 62 65  lowset should be
3500: 20 70 72 6f 70 61 67 61 74 65 64 20 74 6f 20 61   propagated to a
3510: 6e 6f 74 68 65 72 20 77 68 65 6e 65 76 65 72 0a  nother whenever.
3520: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 68 61  ** the first cha
3530: 6e 67 65 73 2e 20 2a 2f 0a 73 74 72 75 63 74 20  nges. */.struct 
3540: 70 6c 69 6e 6b 20 7b 0a 20 20 73 74 72 75 63 74  plink {.  struct
3550: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 20   config *cfp;   
3560: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67     /* The config
3570: 75 72 61 74 69 6f 6e 20 74 6f 20 77 68 69 63 68  uration to which
3580: 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20 20 73 74 72   linked */.  str
3590: 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 3b  uct plink *next;
35a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
35b0: 74 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e 6b  t propagate link
35c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20 73   */.};../* The s
35d0: 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f 72 20  tate vector for 
35e0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 73 65  the entire parse
35f0: 72 20 67 65 6e 65 72 61 74 6f 72 20 69 73 20 72  r generator is r
3600: 65 63 6f 72 64 65 64 20 61 73 0a 2a 2a 20 66 6f  ecorded as.** fo
3610: 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d 4f 4e 20 75  llows.  (LEMON u
3620: 73 65 73 20 6e 6f 20 67 6c 6f 62 61 6c 20 76 61  ses no global va
3630: 72 69 61 62 6c 65 73 20 61 6e 64 20 6d 61 6b 65  riables and make
3640: 73 20 6c 69 74 74 6c 65 20 75 73 65 20 6f 66 0a  s little use of.
3650: 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69 61 62  ** static variab
3660: 6c 65 73 2e 20 20 46 69 65 6c 64 73 20 69 6e 20  les.  Fields in 
3670: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3680: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 74  ructure can be t
3690: 68 6f 75 67 68 74 0a 2a 2a 20 6f 66 20 61 73 20  hought.** of as 
36a0: 62 65 67 69 6e 20 67 6c 6f 62 61 6c 20 76 61 72  begin global var
36b0: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 72  iables in the pr
36c0: 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73 74 72 75 63  ogram.) */.struc
36d0: 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20 73 74 72 75  t lemon {.  stru
36e0: 63 74 20 73 74 61 74 65 20 2a 2a 73 6f 72 74 65  ct state **sorte
36f0: 64 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 66  d;   /* Table of
3700: 20 73 74 61 74 65 73 20 73 6f 72 74 65 64 20 62   states sorted b
3710: 79 20 73 74 61 74 65 20 6e 75 6d 62 65 72 20 2a  y state number *
3720: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
3730: 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  *rule;       /* 
3740: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 72 75 6c 65  List of all rule
3750: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  s */.  struct ru
3760: 6c 65 20 2a 73 74 61 72 74 52 75 6c 65 3b 20 20  le *startRule;  
3770: 2f 2a 20 46 69 72 73 74 20 72 75 6c 65 20 2a 2f  /* First rule */
3780: 0a 20 20 69 6e 74 20 6e 73 74 61 74 65 3b 20 20  .  int nstate;  
3790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37a0: 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 73 20  umber of states 
37b0: 2a 2f 0a 20 20 69 6e 74 20 6e 78 73 74 61 74 65  */.  int nxstate
37c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
37d0: 20 6e 73 74 61 74 65 20 77 69 74 68 20 74 61 69   nstate with tai
37e0: 6c 20 64 65 67 65 6e 65 72 61 74 65 20 73 74 61  l degenerate sta
37f0: 74 65 73 20 72 65 6d 6f 76 65 64 20 2a 2f 0a 20  tes removed */. 
3800: 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20 20   int nrule;     
3810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3820: 62 65 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a  ber of rules */.
3830: 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20    int nsymbol;  
3840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3850: 6d 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c  mber of terminal
3860: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
3870: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e   symbols */.  in
3880: 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20  t nterminal;    
3890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
38a0: 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d   of terminal sym
38b0: 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  bols */.  struct
38c0: 20 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c   symbol **symbol
38d0: 73 3b 20 2f 2a 20 53 6f 72 74 65 64 20 61 72 72  s; /* Sorted arr
38e0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  ay of pointers t
38f0: 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69  o symbols */.  i
3900: 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20  nt errorcnt;    
3910: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3920: 72 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  r of errors */. 
3930: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
3940: 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65  errsym;   /* The
3950: 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f   error symbol */
3960: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
3970: 20 2a 77 69 6c 64 63 61 72 64 3b 20 2f 2a 20 54   *wildcard; /* T
3980: 6f 6b 65 6e 20 74 68 61 74 20 6d 61 74 63 68 65  oken that matche
3990: 73 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  s anything */.  
39a0: 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20  char *name;     
39b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
39c0: 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
39d0: 64 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68  d parser */.  ch
39e0: 61 72 20 2a 61 72 67 3b 20 20 20 20 20 20 20 20  ar *arg;        
39f0: 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6c 61 72         /* Declar
3a00: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 33 74 68  ation of the 3th
3a10: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 72   argument to par
3a20: 73 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74  ser */.  char *t
3a30: 6f 6b 65 6e 74 79 70 65 3b 20 20 20 20 20 20 20  okentype;       
3a40: 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 72    /* Type of ter
3a50: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e  minal symbols in
3a60: 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61 63   the parser stac
3a70: 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 76 61 72  k */.  char *var
3a80: 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  type;           
3a90: 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 74  /* The default t
3aa0: 79 70 65 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69  ype of non-termi
3ab0: 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  nal symbols */. 
3ac0: 20 63 68 61 72 20 2a 73 74 61 72 74 3b 20 20 20   char *start;   
3ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
3ae0: 65 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 73  e of the start s
3af0: 79 6d 62 6f 6c 20 66 6f 72 20 74 68 65 20 67 72  ymbol for the gr
3b00: 61 6d 6d 61 72 20 2a 2f 0a 20 20 63 68 61 72 20  ammar */.  char 
3b10: 2a 73 74 61 63 6b 73 69 7a 65 3b 20 20 20 20 20  *stacksize;     
3b20: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
3b30: 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20  he parser stack 
3b40: 2a 2f 0a 20 20 63 68 61 72 20 2a 69 6e 63 6c 75  */.  char *inclu
3b50: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
3b60: 20 43 6f 64 65 20 74 6f 20 70 75 74 20 61 74 20   Code to put at 
3b70: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
3b80: 20 43 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61   C file */.  cha
3b90: 72 20 2a 65 72 72 6f 72 3b 20 20 20 20 20 20 20  r *error;       
3ba0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
3bb0: 20 65 78 65 63 75 74 65 20 77 68 65 6e 20 61 6e   execute when an
3bc0: 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 2a   error is seen *
3bd0: 2f 0a 20 20 63 68 61 72 20 2a 6f 76 65 72 66 6c  /.  char *overfl
3be0: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ow;          /* 
3bf0: 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20  Code to execute 
3c00: 6f 6e 20 61 20 73 74 61 63 6b 20 6f 76 65 72 66  on a stack overf
3c10: 6c 6f 77 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66  low */.  char *f
3c20: 61 69 6c 75 72 65 3b 20 20 20 20 20 20 20 20 20  ailure;         
3c30: 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65    /* Code to exe
3c40: 63 75 74 65 20 6f 6e 20 70 61 72 73 65 72 20 66  cute on parser f
3c50: 61 69 6c 75 72 65 20 2a 2f 0a 20 20 63 68 61 72  ailure */.  char
3c60: 20 2a 61 63 63 65 70 74 3b 20 20 20 20 20 20 20   *accept;       
3c70: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
3c80: 65 78 65 63 75 74 65 20 77 68 65 6e 20 74 68 65  execute when the
3c90: 20 70 61 72 73 65 72 20 65 78 63 65 70 74 73 20   parser excepts 
3ca0: 2a 2f 0a 20 20 63 68 61 72 20 2a 65 78 74 72 61  */.  char *extra
3cb0: 63 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  code;         /*
3cc0: 20 43 6f 64 65 20 61 70 70 65 6e 64 65 64 20 74   Code appended t
3cd0: 6f 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  o the generated 
3ce0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
3cf0: 74 6f 6b 65 6e 64 65 73 74 3b 20 20 20 20 20 20  tokendest;      
3d00: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
3d10: 65 63 75 74 65 20 74 6f 20 64 65 73 74 72 6f 79  ecute to destroy
3d20: 20 74 6f 6b 65 6e 20 64 61 74 61 20 2a 2f 0a 20   token data */. 
3d30: 20 63 68 61 72 20 2a 76 61 72 64 65 73 74 3b 20   char *vardest; 
3d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64            /* Cod
3d50: 65 20 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c  e for the defaul
3d60: 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64  t non-terminal d
3d70: 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63  estructor */.  c
3d80: 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20  har *filename;  
3d90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
3da0: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
3db0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74  e */.  char *out
3dc0: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
3dd0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
3de0: 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 66 69  urrent output fi
3df0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  le */.  char *to
3e00: 6b 65 6e 70 72 65 66 69 78 3b 20 20 20 20 20 20  kenprefix;      
3e10: 20 2f 2a 20 41 20 70 72 65 66 69 78 20 61 64 64   /* A prefix add
3e20: 65 64 20 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65  ed to token name
3e30: 73 20 69 6e 20 74 68 65 20 2e 68 20 66 69 6c 65  s in the .h file
3e40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c   */.  int nconfl
3e50: 69 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ict;           /
3e60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 73  * Number of pars
3e70: 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f  ing conflicts */
3e80: 0a 20 20 69 6e 74 20 6e 61 63 74 69 6f 6e 74 61  .  int nactionta
3e90: 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  b;          /* N
3ea0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3eb0: 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f   in the yy_actio
3ec0: 6e 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  n[] table */.  i
3ed0: 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b 20 20 20  nt tablesize;   
3ee0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
3ef0: 20 74 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61   table size of a
3f00: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 62 79 74  ll tables in byt
3f10: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 69  es */.  int basi
3f20: 73 66 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20  sflag;          
3f30: 20 2f 2a 20 50 72 69 6e 74 20 6f 6e 6c 79 20 62   /* Print only b
3f40: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
3f50: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 68 61 73  ons */.  int has
3f60: 5f 66 61 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  _fallback;      
3f70: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
3f80: 20 25 66 61 6c 6c 62 61 63 6b 20 69 73 20 73 65   %fallback is se
3f90: 65 6e 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  en in the gramma
3fa0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 6c 69 6e  r */.  int nolin
3fb0: 65 6e 6f 73 66 6c 61 67 3b 20 20 20 20 20 20 20  enosflag;       
3fc0: 2f 2a 20 54 72 75 65 20 69 66 20 23 6c 69 6e 65  /* True if #line
3fd0: 20 73 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75   statements shou
3fe0: 6c 64 20 6e 6f 74 20 62 65 20 70 72 69 6e 74 65  ld not be printe
3ff0: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67  d */.  char *arg
4000: 76 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  v0;             
4010: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
4020: 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64  rogram */.};..#d
4030: 65 66 69 6e 65 20 4d 65 6d 6f 72 79 43 68 65 63  efine MemoryChec
4040: 6b 28 58 29 20 69 66 28 28 58 29 3d 3d 30 29 7b  k(X) if((X)==0){
4050: 20 5c 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64   \.  extern void
4060: 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b   memory_error();
4070: 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f   \.  memory_erro
4080: 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  r(); \.}../*****
4090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
40a0: 20 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65   the file "table
40b0: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
40c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40d0: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c  *****/./*.** All
40e0: 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69   code in this fi
40f0: 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f  le has been auto
4100: 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61  matically genera
4110: 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70  ted.** from a sp
4120: 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74  ecification in t
4130: 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20  he file.**      
4140: 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71          "table.q
4150: 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f  ".** by the asso
4160: 63 69 61 74 69 76 65 20 61 72 72 61 79 20 63 6f  ciative array co
4170: 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67  de building prog
4180: 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20  ram "aagen"..** 
4190: 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73  Do not edit this
41a0: 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c   file!  Instead,
41b0: 20 65 64 69 74 20 74 68 65 20 73 70 65 63 69 66   edit the specif
41c0: 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c  ication.** file,
41d0: 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65   then rerun aage
41e0: 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  n..*/./*.** Code
41f0: 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
4200: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45  tables in the LE
4210: 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
4220: 61 74 6f 72 2e 0a 2a 2f 0a 2f 2a 20 52 6f 75 74  ator..*/./* Rout
4230: 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e  ines for handlin
4240: 67 20 61 20 73 74 72 69 6e 67 73 20 2a 2f 0a 0a  g a strings */..
4250: 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73  const char *Strs
4260: 61 66 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  afe(const char *
4270: 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73 61 66 65  );..void Strsafe
4280: 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74  _init(void);.int
4290: 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28   Strsafe_insert(
42a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 63  const char *);.c
42b0: 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61  onst char *Strsa
42c0: 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68  fe_find(const ch
42d0: 61 72 20 2a 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69  ar *);../* Routi
42e0: 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67  nes for handling
42f0: 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20   symbols of the 
4300: 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75  grammar */..stru
4310: 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
4320: 6c 5f 6e 65 77 28 63 6f 6e 73 74 20 63 68 61 72  l_new(const char
4330: 20 2a 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 63   *);.int Symbolc
4340: 6d 70 70 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  mpp(const void *
4350: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b  , const void *);
4360: 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69  .void Symbol_ini
4370: 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53 79 6d  t(void);.int Sym
4380: 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72 75 63  bol_insert(struc
4390: 74 20 73 79 6d 62 6f 6c 20 2a 2c 20 63 6f 6e 73  t symbol *, cons
43a0: 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72 75 63  t char *);.struc
43b0: 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c  t symbol *Symbol
43c0: 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72  _find(const char
43d0: 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62   *);.struct symb
43e0: 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 69  ol *Symbol_Nth(i
43f0: 6e 74 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f  nt);.int Symbol_
4400: 63 6f 75 6e 74 28 76 6f 69 64 29 3b 0a 73 74 72  count(void);.str
4410: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d  uct symbol **Sym
4420: 62 6f 6c 5f 61 72 72 61 79 6f 66 28 76 6f 69 64  bol_arrayof(void
4430: 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20  );../* Routines 
4440: 74 6f 20 6d 61 6e 61 67 65 20 74 68 65 20 73 74  to manage the st
4450: 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e  ate table */..in
4460: 74 20 43 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73  t Configcmp(cons
4470: 74 20 63 68 61 72 20 2a 2c 20 63 6f 6e 73 74 20  t char *, const 
4480: 63 68 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20  char *);.struct 
4490: 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77  state *State_new
44a0: 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 53 74 61  (void);.void Sta
44b0: 74 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69  te_init(void);.i
44c0: 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28  nt State_insert(
44d0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2c 20  struct state *, 
44e0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
44f0: 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  ;.struct state *
4500: 53 74 61 74 65 5f 66 69 6e 64 28 73 74 72 75 63  State_find(struc
4510: 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72  t config *);.str
4520: 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74  uct state **Stat
4530: 65 5f 61 72 72 61 79 6f 66 28 76 6f 69 64 29 3b  e_arrayof(void);
4540: 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75 73  ../* Routines us
4550: 65 64 20 66 6f 72 20 65 66 66 69 63 69 65 6e 63  ed for efficienc
4560: 79 20 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74 5f  y in Configlist_
4570: 61 64 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f 6e  add */..void Con
4580: 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 76 6f  figtable_init(vo
4590: 69 64 29 3b 0a 69 6e 74 20 43 6f 6e 66 69 67 74  id);.int Configt
45a0: 61 62 6c 65 5f 69 6e 73 65 72 74 28 73 74 72 75  able_insert(stru
45b0: 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74  ct config *);.st
45c0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
45d0: 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74  figtable_find(st
45e0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a  ruct config *);.
45f0: 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65  void Configtable
4600: 5f 63 6c 65 61 72 28 69 6e 74 28 2a 29 28 73 74  _clear(int(*)(st
4610: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 29 3b  ruct config *));
4620: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
4630: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
4640: 69 6c 65 20 22 61 63 74 69 6f 6e 2e 63 22 20 2a  ile "action.c" *
4650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
4670: 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70  /*.** Routines p
4680: 72 6f 63 65 73 73 69 6e 67 20 70 61 72 73 65 72  rocessing parser
4690: 20 61 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20   actions in the 
46a0: 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
46b0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 41  erator..*/../* A
46c0: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
46d0: 72 73 65 72 20 61 63 74 69 6f 6e 20 2a 2f 0a 73  rser action */.s
46e0: 74 61 74 69 63 20 73 74 72 75 63 74 20 61 63 74  tatic struct act
46f0: 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77 28  ion *Action_new(
4700: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
4710: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 66  struct action *f
4720: 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 20 20 73  reelist = 0;.  s
4730: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65  truct action *ne
4740: 77 61 63 74 69 6f 6e 3b 0a 0a 20 20 69 66 28 20  waction;..  if( 
4750: 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
4760: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
4770: 74 20 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20  t amt = 100;.   
4780: 20 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72   freelist = (str
4790: 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 63 61 6c  uct action *)cal
47a0: 6c 6f 63 28 61 6d 74 2c 20 73 69 7a 65 6f 66 28  loc(amt, sizeof(
47b0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 29 29 3b  struct action));
47c0: 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c 69 73  .    if( freelis
47d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  t==0 ){.      fp
47e0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e  rintf(stderr,"Un
47f0: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
4800: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65   memory for a ne
4810: 77 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 2e  w parser action.
4820: 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
4830: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
4840: 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69  (i=0; i<amt-1; i
4850: 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e  ++) freelist[i].
4860: 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69 73 74  next = &freelist
4870: 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c  [i+1];.    freel
4880: 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20  ist[amt-1].next 
4890: 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 61 63  = 0;.  }.  newac
48a0: 74 69 6f 6e 20 3d 20 66 72 65 65 6c 69 73 74 3b  tion = freelist;
48b0: 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72  .  freelist = fr
48c0: 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20  eelist->next;.  
48d0: 72 65 74 75 72 6e 20 6e 65 77 61 63 74 69 6f 6e  return newaction
48e0: 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
48f0: 74 77 6f 20 61 63 74 69 6f 6e 73 20 66 6f 72 20  two actions for 
4900: 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
4910: 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
4920: 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20  ve, zero, or.** 
4930: 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
4940: 66 69 72 73 74 20 61 63 74 69 6f 6e 20 69 73 20  first action is 
4950: 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
4960: 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
4970: 74 68 61 6e 0a 2a 2a 20 74 68 65 20 66 69 72 73  than.** the firs
4980: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t.*/.static int 
4990: 61 63 74 69 6f 6e 63 6d 70 28 0a 20 20 73 74 72  actioncmp(.  str
49a0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 31 2c  uct action *ap1,
49b0: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
49c0: 20 2a 61 70 32 0a 29 7b 0a 20 20 69 6e 74 20 72   *ap2.){.  int r
49d0: 63 3b 0a 20 20 72 63 20 3d 20 61 70 31 2d 3e 73  c;.  rc = ap1->s
49e0: 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e  p->index - ap2->
49f0: 73 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28  sp->index;.  if(
4a00: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   rc==0 ){.    rc
4a10: 20 3d 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70   = (int)ap1->typ
4a20: 65 20 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79  e - (int)ap2->ty
4a30: 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  pe;.  }.  if( rc
4a40: 3d 3d 30 20 26 26 20 28 61 70 31 2d 3e 74 79 70  ==0 && (ap1->typ
4a50: 65 3d 3d 52 45 44 55 43 45 20 7c 7c 20 61 70 31  e==REDUCE || ap1
4a60: 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 52 45 44  ->type==SHIFTRED
4a70: 55 43 45 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  UCE) ){.    rc =
4a80: 20 61 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65   ap1->x.rp->inde
4a90: 78 20 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69  x - ap2->x.rp->i
4aa0: 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
4ab0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  rc==0 ){.    rc 
4ac0: 3d 20 28 69 6e 74 29 20 28 61 70 32 20 2d 20 61  = (int) (ap2 - a
4ad0: 70 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  p1);.  }.  retur
4ae0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74  n rc;.}../* Sort
4af0: 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20   parser actions 
4b00: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
4b10: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
4b20: 73 6f 72 74 28 0a 20 20 73 74 72 75 63 74 20 61  sort(.  struct a
4b30: 63 74 69 6f 6e 20 2a 61 70 0a 29 7b 0a 20 20 61  ction *ap.){.  a
4b40: 70 20 3d 20 28 73 74 72 75 63 74 20 61 63 74 69  p = (struct acti
4b50: 6f 6e 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72  on *)msort((char
4b60: 20 2a 29 61 70 2c 28 63 68 61 72 20 2a 2a 29 26   *)ap,(char **)&
4b70: 61 70 2d 3e 6e 65 78 74 2c 0a 20 20 20 20 20 20  ap->next,.      
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 20 20 20 20 20 20 20 20 28 69 6e 74 28 2a 29 28          (int(*)(
4ba0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
4bb0: 74 20 63 68 61 72 2a 29 29 61 63 74 69 6f 6e 63  t char*))actionc
4bc0: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 70  mp);.  return ap
4bd0: 3b 0a 7d 0a 0a 76 6f 69 64 20 41 63 74 69 6f 6e  ;.}..void Action
4be0: 5f 61 64 64 28 0a 20 20 73 74 72 75 63 74 20 61  _add(.  struct a
4bf0: 63 74 69 6f 6e 20 2a 2a 61 70 70 2c 0a 20 20 65  ction **app,.  e
4c00: 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79 70  num e_action typ
4c10: 65 2c 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  e,.  struct symb
4c20: 6f 6c 20 2a 73 70 2c 0a 20 20 63 68 61 72 20 2a  ol *sp,.  char *
4c30: 61 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  arg.){.  struct 
4c40: 61 63 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f  action *newactio
4c50: 6e 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d  n;.  newaction =
4c60: 20 41 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a 20   Action_new();. 
4c70: 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 6e 65 78 74   newaction->next
4c80: 20 3d 20 2a 61 70 70 3b 0a 20 20 2a 61 70 70 20   = *app;.  *app 
4c90: 3d 20 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e  = newaction;.  n
4ca0: 65 77 61 63 74 69 6f 6e 2d 3e 74 79 70 65 20 3d  ewaction->type =
4cb0: 20 74 79 70 65 3b 0a 20 20 6e 65 77 61 63 74 69   type;.  newacti
4cc0: 6f 6e 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 6e  on->sp = sp;.  n
4cd0: 65 77 61 63 74 69 6f 6e 2d 3e 73 70 4f 70 74 20  ewaction->spOpt 
4ce0: 3d 20 30 3b 0a 20 20 69 66 28 20 74 79 70 65 3d  = 0;.  if( type=
4cf0: 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 6e 65  =SHIFT ){.    ne
4d00: 77 61 63 74 69 6f 6e 2d 3e 78 2e 73 74 70 20 3d  waction->x.stp =
4d10: 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
4d20: 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )arg;.  }else{. 
4d30: 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78 2e     newaction->x.
4d40: 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c  rp = (struct rul
4d50: 65 20 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f  e *)arg;.  }.}./
4d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4d70: 2a 2a 2a 2a 2a 2a 20 4e 65 77 20 63 6f 64 65 20  ****** New code 
4d80: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
4d90: 20 22 61 63 74 74 61 62 22 20 6d 6f 64 75 6c 65   "acttab" module
4da0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a   ***********/./*
4db0: 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  .** This module 
4dc0: 69 6d 70 6c 65 6d 65 6e 74 73 20 72 6f 75 74 69  implements routi
4dd0: 6e 65 73 20 75 73 65 20 74 6f 20 63 6f 6e 73 74  nes use to const
4de0: 72 75 63 74 20 74 68 65 20 79 79 5f 61 63 74 69  ruct the yy_acti
4df0: 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a  on[] table..*/..
4e00: 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 20  /*.** The state 
4e10: 6f 66 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  of the yy_action
4e20: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
4e30: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6e 20  struction is an 
4e40: 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74  instance of.** t
4e50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
4e60: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
4e70: 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c  e yy_action tabl
4e80: 65 20 6d 61 70 73 20 74 68 65 20 70 61 69 72 20  e maps the pair 
4e90: 28 73 74 61 74 65 5f 6e 75 6d 62 65 72 2c 20 6c  (state_number, l
4ea0: 6f 6f 6b 61 68 65 61 64 29 20 69 6e 74 6f 20 61  ookahead) into a
4eb0: 6e 0a 2a 2a 20 61 63 74 69 6f 6e 5f 6e 75 6d 62  n.** action_numb
4ec0: 65 72 2e 20 20 54 68 65 20 74 61 62 6c 65 20 69  er.  The table i
4ed0: 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e  s an array of in
4ee0: 74 65 67 65 72 73 20 70 61 69 72 73 2e 20 20 54  tegers pairs.  T
4ef0: 68 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 0a  he state_number.
4f00: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 61 6e  ** determines an
4f10: 20 69 6e 69 74 69 61 6c 20 6f 66 66 73 65 74 20   initial offset 
4f20: 69 6e 74 6f 20 74 68 65 20 79 79 5f 61 63 74 69  into the yy_acti
4f30: 6f 6e 20 61 72 72 61 79 2e 20 20 54 68 65 20 6c  on array.  The l
4f40: 6f 6f 6b 61 68 65 61 64 0a 2a 2a 20 76 61 6c 75  ookahead.** valu
4f50: 65 20 69 73 20 74 68 65 6e 20 61 64 64 65 64 20  e is then added 
4f60: 74 6f 20 74 68 69 73 20 69 6e 69 74 69 61 6c 20  to this initial 
4f70: 6f 66 66 73 65 74 20 74 6f 20 67 65 74 20 61 6e  offset to get an
4f80: 20 69 6e 64 65 78 20 58 20 69 6e 74 6f 20 74 68   index X into th
4f90: 65 0a 2a 2a 20 79 79 5f 61 63 74 69 6f 6e 20 61  e.** yy_action a
4fa0: 72 72 61 79 2e 20 49 66 20 74 68 65 20 61 41 63  rray. If the aAc
4fb0: 74 69 6f 6e 5b 58 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[X].lookahea
4fc0: 64 20 65 71 75 61 6c 73 20 74 68 65 20 76 61 6c  d equals the val
4fd0: 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 66 20  ue of the.** of 
4fe0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e  the lookahead in
4ff0: 70 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  put, then the va
5000: 6c 75 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f  lue of the actio
5010: 6e 5f 6e 75 6d 62 65 72 20 6f 75 74 70 75 74 20  n_number output 
5020: 69 73 0a 2a 2a 20 61 41 63 74 69 6f 6e 5b 58 5d  is.** aAction[X]
5030: 2e 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  .action.  If the
5040: 20 6c 6f 6f 6b 61 68 65 61 64 73 20 64 6f 20 6e   lookaheads do n
5050: 6f 74 20 6d 61 74 63 68 20 74 68 65 6e 20 74 68  ot match then th
5060: 65 0a 2a 2a 20 64 65 66 61 75 6c 74 20 61 63 74  e.** default act
5070: 69 6f 6e 20 66 6f 72 20 74 68 65 20 73 74 61 74  ion for the stat
5080: 65 5f 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75  e_number is retu
5090: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  rned..**.** All 
50a0: 61 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  actions associat
50b0: 65 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ed with a single
50c0: 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 61 72   state_number ar
50d0: 65 20 66 69 72 73 74 20 65 6e 74 65 72 65 64 0a  e first entered.
50e0: 2a 2a 20 69 6e 74 6f 20 61 4c 6f 6f 6b 61 68 65  ** into aLookahe
50f0: 61 64 5b 5d 20 75 73 69 6e 67 20 6d 75 6c 74 69  ad[] using multi
5100: 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20 61 63 74  ple calls to act
5110: 74 61 62 5f 61 63 74 69 6f 6e 28 29 2e 20 20 54  tab_action().  T
5120: 68 65 6e 20 74 68 65 0a 2a 2a 20 61 63 74 69 6f  hen the.** actio
5130: 6e 73 20 66 6f 72 20 74 68 61 74 20 73 69 6e 67  ns for that sing
5140: 6c 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20  le state_number 
5150: 61 72 65 20 70 6c 61 63 65 64 20 69 6e 74 6f 20  are placed into 
5160: 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 0a 2a 2a  the aAction[].**
5170: 20 61 72 72 61 79 20 77 69 74 68 20 61 20 73 69   array with a si
5180: 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 61 63 74  ngle call to act
5190: 74 61 62 5f 69 6e 73 65 72 74 28 29 2e 20 20 54  tab_insert().  T
51a0: 68 65 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74  he acttab_insert
51b0: 28 29 20 63 61 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  () call.** also 
51c0: 72 65 73 65 74 73 20 74 68 65 20 61 4c 6f 6f 6b  resets the aLook
51d0: 61 68 65 61 64 5b 5d 20 61 72 72 61 79 20 69 6e  ahead[] array in
51e0: 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72   preparation for
51f0: 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 73 74 61   the next.** sta
5200: 74 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  te number..*/.st
5210: 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61  ruct lookahead_a
5220: 63 74 69 6f 6e 20 7b 0a 20 20 69 6e 74 20 6c 6f  ction {.  int lo
5230: 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20  okahead;        
5240: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
5250: 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 74   the lookahead t
5260: 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 63  oken */.  int ac
5270: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tion;           
5280: 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20 74       /* Action t
5290: 6f 20 74 61 6b 65 20 6f 6e 20 74 68 65 20 67 69  o take on the gi
52a0: 76 65 6e 20 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f  ven lookahead */
52b0: 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  .};.typedef stru
52c0: 63 74 20 61 63 74 74 61 62 20 61 63 74 74 61 62  ct acttab acttab
52d0: 3b 0a 73 74 72 75 63 74 20 61 63 74 74 61 62 20  ;.struct acttab 
52e0: 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b  {.  int nAction;
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5300: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
5310: 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 41 63 74  ed slots in aAct
5320: 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ion[] */.  int n
5330: 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20 20 20  ActionAlloc;    
5340: 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73          /* Slots
5350: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61   allocated for a
5360: 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 73 74  Action[] */.  st
5370: 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61  ruct lookahead_a
5380: 63 74 69 6f 6e 0a 20 20 20 20 2a 61 41 63 74 69  ction.    *aActi
5390: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
53a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 79 79 5f 61       /* The yy_a
53b0: 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 75 6e  ction[] table un
53c0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
53d0: 20 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b 61 68   */.    *aLookah
53e0: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
53f0: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e     /* A single n
5400: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  ew transaction s
5410: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f  et */.  int mnLo
5420: 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20  okahead;        
5430: 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
5440: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f  aLookahead[].loo
5450: 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  kahead */.  int 
5460: 6d 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  mnAction;       
5470: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69           /* Acti
5480: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
5490: 74 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a  th mnLookahead *
54a0: 2f 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68  /.  int mxLookah
54b0: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
54c0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f   /* Maximum aLoo
54d0: 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65  kahead[].lookahe
54e0: 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ad */.  int nLoo
54f0: 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20  kahead;         
5500: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73 6c 6f       /* Used slo
5510: 74 73 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64  ts in aLookahead
5520: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  [] */.  int nLoo
5530: 6b 61 68 65 61 64 41 6c 6c 6f 63 3b 20 20 20 20  kaheadAlloc;    
5540: 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c       /* Slots al
5550: 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c 6f 6f 6b  located in aLook
5560: 61 68 65 61 64 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f  ahead[] */.};../
5570: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
5580: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
5590: 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20  n the yy_action 
55a0: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
55b0: 20 61 63 74 74 61 62 5f 73 69 7a 65 28 58 29 20   acttab_size(X) 
55c0: 28 28 58 29 2d 3e 6e 41 63 74 69 6f 6e 29 0a 0a  ((X)->nAction)..
55d0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72  /* The value for
55e0: 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20   the N-th entry 
55f0: 69 6e 20 79 79 5f 61 63 74 69 6f 6e 20 2a 2f 0a  in yy_action */.
5600: 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79  #define acttab_y
5610: 79 61 63 74 69 6f 6e 28 58 2c 4e 29 20 20 28 28  yaction(X,N)  ((
5620: 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 61  X)->aAction[N].a
5630: 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76  ction)../* The v
5640: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74  alue for the N-t
5650: 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 6c 6f  h entry in yy_lo
5660: 6f 6b 61 68 65 61 64 20 2a 2f 0a 23 64 65 66 69  okahead */.#defi
5670: 6e 65 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b  ne acttab_yylook
5680: 61 68 65 61 64 28 58 2c 4e 29 20 20 28 28 58 29  ahead(X,N)  ((X)
5690: 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c 6f 6f  ->aAction[N].loo
56a0: 6b 61 68 65 61 64 29 0a 0a 2f 2a 20 46 72 65 65  kahead)../* Free
56b0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
56c0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
56d0: 67 69 76 65 6e 20 61 63 74 74 61 62 20 2a 2f 0a  given acttab */.
56e0: 76 6f 69 64 20 61 63 74 74 61 62 5f 66 72 65 65  void acttab_free
56f0: 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 66  (acttab *p){.  f
5700: 72 65 65 28 20 70 2d 3e 61 41 63 74 69 6f 6e 20  ree( p->aAction 
5710: 29 3b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 4c  );.  free( p->aL
5720: 6f 6f 6b 61 68 65 61 64 20 29 3b 0a 20 20 66 72  ookahead );.  fr
5730: 65 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a 20 41  ee( p );.}../* A
5740: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 63  llocate a new ac
5750: 74 74 61 62 20 73 74 72 75 63 74 75 72 65 20 2a  ttab structure *
5760: 2f 0a 61 63 74 74 61 62 20 2a 61 63 74 74 61 62  /.acttab *acttab
5770: 5f 61 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a 20 20  _alloc(void){.  
5780: 61 63 74 74 61 62 20 2a 70 20 3d 20 28 61 63 74  acttab *p = (act
5790: 74 61 62 20 2a 29 20 63 61 6c 6c 6f 63 28 20 31  tab *) calloc( 1
57a0: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  , sizeof(*p) );.
57b0: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
57c0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
57d0: 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  ,"Unable to allo
57e0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
57f0: 61 20 6e 65 77 20 61 63 74 74 61 62 2e 22 29 3b  a new acttab.");
5800: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
5810: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  }.  memset(p, 0,
5820: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
5830: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 20  return p;.}../* 
5840: 41 64 64 20 61 20 6e 65 77 20 61 63 74 69 6f 6e  Add a new action
5850: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
5860: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e  transaction set.
5870: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5880: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
5890: 63 65 20 66 6f 72 20 65 61 63 68 20 6c 6f 6f 6b  ce for each look
58a0: 61 68 65 61 64 20 66 6f 72 20 61 20 70 61 72 74  ahead for a part
58b0: 69 63 75 6c 61 72 0a 2a 2a 20 73 74 61 74 65 2e  icular.** state.
58c0: 0a 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f  .*/.void acttab_
58d0: 61 63 74 69 6f 6e 28 61 63 74 74 61 62 20 2a 70  action(acttab *p
58e0: 2c 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 2c  , int lookahead,
58f0: 20 69 6e 74 20 61 63 74 69 6f 6e 29 7b 0a 20 20   int action){.  
5900: 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  if( p->nLookahea
5910: 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  d>=p->nLookahead
5920: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e  Alloc ){.    p->
5930: 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20  nLookaheadAlloc 
5940: 2b 3d 20 32 35 3b 0a 20 20 20 20 70 2d 3e 61 4c  += 25;.    p->aL
5950: 6f 6f 6b 61 68 65 61 64 20 3d 20 28 73 74 72 75  ookahead = (stru
5960: 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74  ct lookahead_act
5970: 69 6f 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28 20  ion *) realloc( 
5980: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 2c 0a 20  p->aLookahead,. 
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
59b0: 6f 66 28 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  of(p->aLookahead
59c0: 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  [0])*p->nLookahe
59d0: 61 64 41 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 69  adAlloc );.    i
59e0: 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  f( p->aLookahead
59f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
5a00: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c  intf(stderr,"mal
5a10: 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a  loc failed\n");.
5a20: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
5a30: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
5a40: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30 20  ->nLookahead==0 
5a50: 29 7b 0a 20 20 20 20 70 2d 3e 6d 78 4c 6f 6f 6b  ){.    p->mxLook
5a60: 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61  ahead = lookahea
5a70: 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b  d;.    p->mnLook
5a80: 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61  ahead = lookahea
5a90: 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69  d;.    p->mnActi
5aa0: 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 7d  on = action;.  }
5ab0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 2d  else{.    if( p-
5ac0: 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 3c 6c 6f 6f  >mxLookahead<loo
5ad0: 6b 61 68 65 61 64 20 29 20 70 2d 3e 6d 78 4c 6f  kahead ) p->mxLo
5ae0: 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68  okahead = lookah
5af0: 65 61 64 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ead;.    if( p->
5b00: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3e 6c 6f 6f 6b  mnLookahead>look
5b10: 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 70  ahead ){.      p
5b20: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20  ->mnLookahead = 
5b30: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 20  lookahead;.     
5b40: 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61   p->mnAction = a
5b50: 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  ction;.    }.  }
5b60: 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  .  p->aLookahead
5b70: 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e  [p->nLookahead].
5b80: 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b  lookahead = look
5b90: 61 68 65 61 64 3b 0a 20 20 70 2d 3e 61 4c 6f 6f  ahead;.  p->aLoo
5ba0: 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61  kahead[p->nLooka
5bb0: 68 65 61 64 5d 2e 61 63 74 69 6f 6e 20 3d 20 61  head].action = a
5bc0: 63 74 69 6f 6e 3b 0a 20 20 70 2d 3e 6e 4c 6f 6f  ction;.  p->nLoo
5bd0: 6b 61 68 65 61 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  kahead++;.}../*.
5be0: 2a 2a 20 41 64 64 20 74 68 65 20 74 72 61 6e 73  ** Add the trans
5bf0: 61 63 74 69 6f 6e 20 73 65 74 20 62 75 69 6c 74  action set built
5c00: 20 75 70 20 77 69 74 68 20 70 72 69 6f 72 20 63   up with prior c
5c10: 61 6c 6c 73 20 74 6f 20 61 63 74 74 61 62 5f 61  alls to acttab_a
5c20: 63 74 69 6f 6e 28 29 0a 2a 2a 20 69 6e 74 6f 20  ction().** into 
5c30: 74 68 65 20 63 75 72 72 65 6e 74 20 61 63 74 69  the current acti
5c40: 6f 6e 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20  on table.  Then 
5c50: 72 65 73 65 74 20 74 68 65 20 74 72 61 6e 73 61  reset the transa
5c60: 63 74 69 6f 6e 20 73 65 74 20 62 61 63 6b 0a 2a  ction set back.*
5c70: 2a 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 73 65  * to an empty se
5c80: 74 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  t in preparation
5c90: 20 66 6f 72 20 61 20 6e 65 77 20 72 6f 75 6e 64   for a new round
5ca0: 20 6f 66 20 61 63 74 74 61 62 5f 61 63 74 69 6f   of acttab_actio
5cb0: 6e 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  n() calls..**.**
5cc0: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73   Return the offs
5cd0: 65 74 20 69 6e 74 6f 20 74 68 65 20 61 63 74 69  et into the acti
5ce0: 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  on table of the 
5cf0: 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  new transaction.
5d00: 0a 2a 2f 0a 69 6e 74 20 61 63 74 74 61 62 5f 69  .*/.int acttab_i
5d10: 6e 73 65 72 74 28 61 63 74 74 61 62 20 2a 70 29  nsert(acttab *p)
5d20: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c  {.  int i, j, k,
5d30: 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   n;.  assert( p-
5d40: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 30 20 29 3b  >nLookahead>0 );
5d50: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
5d60: 20 77 65 20 68 61 76 65 20 65 6e 6f 75 67 68 20   we have enough 
5d70: 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  space to hold th
5d80: 65 20 65 78 70 61 6e 64 65 64 20 61 63 74 69 6f  e expanded actio
5d90: 6e 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  n table.  ** in 
5da0: 74 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e 20  the worst case. 
5db0: 20 54 68 65 20 77 6f 72 73 74 20 63 61 73 65 20   The worst case 
5dc0: 6f 63 63 75 72 73 20 69 66 20 74 68 65 20 74 72  occurs if the tr
5dd0: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a 20 20  ansaction set.  
5de0: 2a 2a 20 6d 75 73 74 20 62 65 20 61 70 70 65 6e  ** must be appen
5df0: 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65  ded to the curre
5e00: 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a  nt action table.
5e10: 20 20 2a 2f 0a 20 20 6e 20 3d 20 70 2d 3e 6d 78    */.  n = p->mx
5e20: 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 31 3b 0a 20  Lookahead + 1;. 
5e30: 20 69 66 28 20 70 2d 3e 6e 41 63 74 69 6f 6e 20   if( p->nAction 
5e40: 2b 20 6e 20 3e 3d 20 70 2d 3e 6e 41 63 74 69 6f  + n >= p->nActio
5e50: 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e  nAlloc ){.    in
5e60: 74 20 6f 6c 64 41 6c 6c 6f 63 20 3d 20 70 2d 3e  t oldAlloc = p->
5e70: 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 0a 20 20  nActionAlloc;.  
5e80: 20 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f    p->nActionAllo
5e90: 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b  c = p->nAction +
5ea0: 20 6e 20 2b 20 70 2d 3e 6e 41 63 74 69 6f 6e 41   n + p->nActionA
5eb0: 6c 6c 6f 63 20 2b 20 32 30 3b 0a 20 20 20 20 70  lloc + 20;.    p
5ec0: 2d 3e 61 41 63 74 69 6f 6e 20 3d 20 28 73 74 72  ->aAction = (str
5ed0: 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63  uct lookahead_ac
5ee0: 74 69 6f 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28  tion *) realloc(
5ef0: 20 70 2d 3e 61 41 63 74 69 6f 6e 2c 0a 20 20 20   p->aAction,.   
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f10: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 2d         sizeof(p-
5f20: 3e 61 41 63 74 69 6f 6e 5b 30 5d 29 2a 70 2d 3e  >aAction[0])*p->
5f30: 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 29 3b 0a 20  nActionAlloc);. 
5f40: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
5f50: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  n==0 ){.      fp
5f60: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61  rintf(stderr,"ma
5f70: 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b  lloc failed\n");
5f80: 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
5f90: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
5fa0: 6f 6c 64 41 6c 6c 6f 63 3b 20 69 3c 70 2d 3e 6e  oldAlloc; i<p->n
5fb0: 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 69 2b 2b  ActionAlloc; i++
5fc0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 41 63 74  ){.      p->aAct
5fd0: 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[i].lookahead
5fe0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e   = -1;.      p->
5ff0: 61 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f  aAction[i].actio
6000: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  n = -1;.    }.  
6010: 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65  }..  /* Scan the
6020: 20 65 78 69 73 74 69 6e 67 20 61 63 74 69 6f 6e   existing action
6030: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
6040: 6f 72 20 61 6e 20 6f 66 66 73 65 74 20 74 68 61  or an offset tha
6050: 74 20 69 73 20 61 0a 20 20 2a 2a 20 64 75 70 6c  t is a.  ** dupl
6060: 69 63 61 74 65 20 6f 66 20 74 68 65 20 63 75 72  icate of the cur
6070: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
6080: 20 73 65 74 2e 20 20 46 61 6c 6c 20 6f 75 74 20   set.  Fall out 
6090: 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2a  of the loop.  **
60a0: 20 69 66 20 61 6e 64 20 77 68 65 6e 20 74 68 65   if and when the
60b0: 20 64 75 70 6c 69 63 61 74 65 20 69 73 20 66 6f   duplicate is fo
60c0: 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69  und..  **.  ** i
60d0: 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e   is the index in
60e0: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 5d 20 77 68   p->aAction[] wh
60f0: 65 72 65 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  ere p->mnLookahe
6100: 61 64 20 69 73 20 69 6e 73 65 72 74 65 64 2e 0a  ad is inserted..
6110: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 2d 3e    */.  for(i=p->
6120: 6e 41 63 74 69 6f 6e 2d 31 3b 20 69 3e 3d 30 3b  nAction-1; i>=0;
6130: 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70   i--){.    if( p
6140: 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f  ->aAction[i].loo
6150: 6b 61 68 65 61 64 3d 3d 70 2d 3e 6d 6e 4c 6f 6f  kahead==p->mnLoo
6160: 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20  kahead ){.      
6170: 2f 2a 20 41 6c 6c 20 6c 6f 6f 6b 61 68 65 61 64  /* All lookahead
6180: 73 20 61 6e 64 20 61 63 74 69 6f 6e 73 20 69 6e  s and actions in
6190: 20 74 68 65 20 61 4c 6f 6f 6b 61 68 65 61 64 5b   the aLookahead[
61a0: 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  ] transaction.  
61b0: 20 20 20 20 2a 2a 20 6d 75 73 74 20 6d 61 74 63      ** must matc
61c0: 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 63 61  h against the ca
61d0: 6e 64 69 64 61 74 65 20 61 41 63 74 69 6f 6e 5b  ndidate aAction[
61e0: 69 5d 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 20  i] entry. */.   
61f0: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
6200: 6e 5b 69 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e  n[i].action!=p->
6210: 6d 6e 41 63 74 69 6f 6e 20 29 20 63 6f 6e 74 69  mnAction ) conti
6220: 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nue;.      for(j
6230: 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68  =0; j<p->nLookah
6240: 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ead; j++){.     
6250: 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61     k = p->aLooka
6260: 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  head[j].lookahea
6270: 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  d - p->mnLookahe
6280: 61 64 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20  ad + i;.        
6290: 69 66 28 20 6b 3c 30 20 7c 7c 20 6b 3e 3d 70 2d  if( k<0 || k>=p-
62a0: 3e 6e 41 63 74 69 6f 6e 20 29 20 62 72 65 61 6b  >nAction ) break
62b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
62c0: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c  >aLookahead[j].l
62d0: 6f 6f 6b 61 68 65 61 64 21 3d 70 2d 3e 61 41 63  ookahead!=p->aAc
62e0: 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[k].lookahea
62f0: 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
6300: 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61     if( p->aLooka
6310: 68 65 61 64 5b 6a 5d 2e 61 63 74 69 6f 6e 21 3d  head[j].action!=
6320: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 61 63  p->aAction[k].ac
6330: 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20  tion ) break;.  
6340: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
6350: 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20  j<p->nLookahead 
6360: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
6370: 20 20 20 2f 2a 20 4e 6f 20 70 6f 73 73 69 62 6c     /* No possibl
6380: 65 20 6c 6f 6f 6b 61 68 65 61 64 20 76 61 6c 75  e lookahead valu
6390: 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 69 6e  e that is not in
63a0: 20 74 68 65 20 61 4c 6f 6f 6b 61 68 65 61 64 5b   the aLookahead[
63b0: 5d 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73  ].      ** trans
63c0: 61 63 74 69 6f 6e 20 69 73 20 61 6c 6c 6f 77 65  action is allowe
63d0: 64 20 74 6f 20 6d 61 74 63 68 20 61 41 63 74 69  d to match aActi
63e0: 6f 6e 5b 69 5d 20 2a 2f 0a 20 20 20 20 20 20 6e  on[i] */.      n
63f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
6400: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f  j=0; j<p->nActio
6410: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
6420: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
6430: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29  j].lookahead<0 )
6440: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6450: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
6460: 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d  n[j].lookahead==
6470: 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  j+p->mnLookahead
6480: 2d 69 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20  -i ) n++;.      
6490: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 70  }.      if( n==p
64a0: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a  ->nLookahead ){.
64b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20          break;  
64c0: 2f 2a 20 41 6e 20 65 78 61 63 74 20 6d 61 74 63  /* An exact matc
64d0: 68 20 69 73 20 66 6f 75 6e 64 20 61 74 20 6f 66  h is found at of
64e0: 66 73 65 74 20 69 20 2a 2f 0a 20 20 20 20 20 20  fset i */.      
64f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
6500: 2a 20 49 66 20 6e 6f 20 65 78 69 73 74 69 6e 67  * If no existing
6510: 20 6f 66 66 73 65 74 73 20 65 78 61 63 74 6c 79   offsets exactly
6520: 20 6d 61 74 63 68 20 74 68 65 20 63 75 72 72 65   match the curre
6530: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
6540: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 61 6e 20  find an.  ** an 
6550: 65 6d 70 74 79 20 6f 66 66 73 65 74 20 69 6e 20  empty offset in 
6560: 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 74 61  the aAction[] ta
6570: 62 6c 65 20 69 6e 20 77 68 69 63 68 20 77 65 20  ble in which we 
6580: 63 61 6e 20 61 64 64 20 74 68 65 0a 20 20 2a 2a  can add the.  **
6590: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72   aLookahead[] tr
65a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
65b0: 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
65c0: 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 68 6f 6c   /* Look for hol
65d0: 65 73 20 69 6e 20 74 68 65 20 61 41 63 74 69 6f  es in the aActio
65e0: 6e 5b 5d 20 74 61 62 6c 65 20 74 68 61 74 20 66  n[] table that f
65f0: 69 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  it the current. 
6600: 20 20 20 2a 2a 20 61 4c 6f 6f 6b 61 68 65 61 64     ** aLookahead
6610: 5b 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  [] transaction. 
6620: 20 4c 65 61 76 65 20 69 20 73 65 74 20 74 6f 20   Leave i set to 
6630: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
6640: 65 20 68 6f 6c 65 2e 0a 20 20 20 20 2a 2a 20 49  e hole..    ** I
6650: 66 20 6e 6f 20 68 6f 6c 65 73 20 61 72 65 20 66  f no holes are f
6660: 6f 75 6e 64 2c 20 69 20 69 73 20 6c 65 66 74 20  ound, i is left 
6670: 61 74 20 70 2d 3e 6e 41 63 74 69 6f 6e 2c 20 77  at p->nAction, w
6680: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 0a 20  hich means the. 
6690: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
66a0: 6e 20 77 69 6c 6c 20 62 65 20 61 70 70 65 6e 64  n will be append
66b0: 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ed. */.    for(i
66c0: 3d 30 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e  =0; i<p->nAction
66d0: 41 6c 6c 6f 63 20 2d 20 70 2d 3e 6d 78 4c 6f 6f  Alloc - p->mxLoo
66e0: 6b 61 68 65 61 64 3b 20 69 2b 2b 29 7b 0a 20 20  kahead; i++){.  
66f0: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
6700: 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c  on[i].lookahead<
6710: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
6720: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b  (j=0; j<p->nLook
6730: 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ahead; j++){.   
6740: 20 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c         k = p->aL
6750: 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b  ookahead[j].look
6760: 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f  ahead - p->mnLoo
6770: 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20  kahead + i;.    
6780: 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20 29 20        if( k<0 ) 
6790: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
67a0: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
67b0: 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e 3d 30 20  k].lookahead>=0 
67c0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
67d0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
67e0: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  <p->nLookahead )
67f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6800: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
6810: 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a  >nAction; j++){.
6820: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
6830: 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b  >aAction[j].look
6840: 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f  ahead==j+p->mnLo
6850: 6f 6b 61 68 65 61 64 2d 69 20 29 20 62 72 65 61  okahead-i ) brea
6860: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
6870: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e       if( j==p->n
6880: 41 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Action ){.      
6890: 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 46      break;  /* F
68a0: 69 74 73 20 69 6e 20 65 6d 70 74 79 20 73 6c 6f  its in empty slo
68b0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ts */.        }.
68c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
68d0: 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 72  }.  /* Insert tr
68e0: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 61 74  ansaction set at
68f0: 20 69 6e 64 65 78 20 69 2e 20 2a 2f 0a 20 20 66   index i. */.  f
6900: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f  or(j=0; j<p->nLo
6910: 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20  okahead; j++){. 
6920: 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61     k = p->aLooka
6930: 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  head[j].lookahea
6940: 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  d - p->mnLookahe
6950: 61 64 20 2b 20 69 3b 0a 20 20 20 20 70 2d 3e 61  ad + i;.    p->a
6960: 41 63 74 69 6f 6e 5b 6b 5d 20 3d 20 70 2d 3e 61  Action[k] = p->a
6970: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 3b 0a 20 20  Lookahead[j];.  
6980: 20 20 69 66 28 20 6b 3e 3d 70 2d 3e 6e 41 63 74    if( k>=p->nAct
6990: 69 6f 6e 20 29 20 70 2d 3e 6e 41 63 74 69 6f 6e  ion ) p->nAction
69a0: 20 3d 20 6b 2b 31 3b 0a 20 20 7d 0a 20 20 70 2d   = k+1;.  }.  p-
69b0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 30 3b  >nLookahead = 0;
69c0: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  ..  /* Return th
69d0: 65 20 6f 66 66 73 65 74 20 74 68 61 74 20 69 73  e offset that is
69e0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 6f   added to the lo
69f0: 6f 6b 61 68 65 61 64 20 69 6e 20 6f 72 64 65 72  okahead in order
6a00: 20 74 6f 20 67 65 74 20 74 68 65 0a 20 20 2a 2a   to get the.  **
6a10: 20 69 6e 64 65 78 20 69 6e 74 6f 20 79 79 5f 61   index into yy_a
6a20: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 63 74  ction of the act
6a30: 69 6f 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ion */.  return 
6a40: 69 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  i - p->mnLookahe
6a50: 61 64 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ad;.}../********
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
6a70: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 62 75  rom the file "bu
6a80: 69 6c 64 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ild.c" *********
6a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6aa0: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ****/./*.** Rout
6ab0: 69 6e 65 73 20 74 6f 20 63 6f 6e 73 74 72 75 63  ines to construc
6ac0: 74 69 6f 6e 20 74 68 65 20 66 69 6e 69 74 65 20  tion the finite 
6ad0: 73 74 61 74 65 20 6d 61 63 68 69 6e 65 20 66 6f  state machine fo
6ae0: 72 20 74 68 65 20 4c 45 4d 4f 4e 0a 2a 2a 20 70  r the LEMON.** p
6af0: 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
6b00: 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61 20 70  .*/../* Find a p
6b10: 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c  recedence symbol
6b20: 20 6f 66 20 65 76 65 72 79 20 72 75 6c 65 20 69   of every rule i
6b30: 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 0a 2a  n the grammar..*
6b40: 2a 0a 2a 2a 20 54 68 6f 73 65 20 72 75 6c 65 73  *.** Those rules
6b50: 20 77 68 69 63 68 20 68 61 76 65 20 61 20 70 72   which have a pr
6b60: 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20  ecedence symbol 
6b70: 63 6f 64 65 64 20 69 6e 20 74 68 65 20 69 6e 70  coded in the inp
6b80: 75 74 0a 2a 2a 20 67 72 61 6d 6d 61 72 20 75 73  ut.** grammar us
6b90: 69 6e 67 20 74 68 65 20 22 5b 73 79 6d 62 6f 6c  ing the "[symbol
6ba0: 5d 22 20 63 6f 6e 73 74 72 75 63 74 20 77 69 6c  ]" construct wil
6bb0: 6c 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 74  l already have t
6bc0: 68 65 0a 2a 2a 20 72 70 2d 3e 70 72 65 63 73 79  he.** rp->precsy
6bd0: 6d 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 2e 20  m field filled. 
6be0: 20 4f 74 68 65 72 20 72 75 6c 65 73 20 74 61 6b   Other rules tak
6bf0: 65 20 61 73 20 74 68 65 69 72 20 70 72 65 63 65  e as their prece
6c00: 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20  dence.** symbol 
6c10: 74 68 65 20 66 69 72 73 74 20 52 48 53 20 73 79  the first RHS sy
6c20: 6d 62 6f 6c 20 77 69 74 68 20 61 20 64 65 66 69  mbol with a defi
6c30: 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65 2e 20  ned precedence. 
6c40: 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
6c50: 20 6e 6f 74 20 52 48 53 20 73 79 6d 62 6f 6c 73   not RHS symbols
6c60: 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20   with a defined 
6c70: 70 72 65 63 65 64 65 6e 63 65 2c 20 74 68 65 20  precedence, the 
6c80: 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79  precedence.** sy
6c90: 6d 62 6f 6c 20 66 69 65 6c 64 20 69 73 20 6c 65  mbol field is le
6ca0: 66 74 20 62 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69  ft blank..*/.voi
6cb0: 64 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64  d FindRulePreced
6cc0: 65 6e 63 65 73 28 73 74 72 75 63 74 20 6c 65 6d  ences(struct lem
6cd0: 6f 6e 20 2a 78 70 29 0a 7b 0a 20 20 73 74 72 75  on *xp).{.  stru
6ce0: 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 66  ct rule *rp;.  f
6cf0: 6f 72 28 72 70 3d 78 70 2d 3e 72 75 6c 65 3b 20  or(rp=xp->rule; 
6d00: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
6d10: 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72  {.    if( rp->pr
6d20: 65 63 73 79 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  ecsym==0 ){.    
6d30: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
6d40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
6d50: 3e 6e 72 68 73 20 26 26 20 72 70 2d 3e 70 72 65  >nrhs && rp->pre
6d60: 63 73 79 6d 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20  csym==0; i++){. 
6d70: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
6d80: 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72  mbol *sp = rp->r
6d90: 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hs[i];.        i
6da0: 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c  f( sp->type==MUL
6db0: 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
6dc0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
6dd0: 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20   j<sp->nsubsym; 
6de0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
6df0: 20 20 69 66 28 20 73 70 2d 3e 73 75 62 73 79 6d    if( sp->subsym
6e00: 5b 6a 5d 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a  [j]->prec>=0 ){.
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 70                rp
6e20: 2d 3e 70 72 65 63 73 79 6d 20 3d 20 73 70 2d 3e  ->precsym = sp->
6e30: 73 75 62 73 79 6d 5b 6a 5d 3b 0a 20 20 20 20 20  subsym[j];.     
6e40: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6e60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6e70: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e    }else if( sp->
6e80: 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  prec>=0 ){.     
6e90: 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d       rp->precsym
6ea0: 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
6eb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6ec0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6ed0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20  urn;.}../* Find 
6ee0: 61 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73  all nonterminals
6ef0: 20 77 68 69 63 68 20 77 69 6c 6c 20 67 65 6e 65   which will gene
6f00: 72 61 74 65 20 74 68 65 20 65 6d 70 74 79 20 73  rate the empty s
6f10: 74 72 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e 20 67  tring..** Then g
6f20: 6f 20 62 61 63 6b 20 61 6e 64 20 63 6f 6d 70 75  o back and compu
6f30: 74 65 20 74 68 65 20 66 69 72 73 74 20 73 65 74  te the first set
6f40: 73 20 6f 66 20 65 76 65 72 79 20 6e 6f 6e 74 65  s of every nonte
6f50: 72 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 66  rminal..** The f
6f60: 69 72 73 74 20 73 65 74 20 69 73 20 74 68 65 20  irst set is the 
6f70: 73 65 74 20 6f 66 20 61 6c 6c 20 74 65 72 6d 69  set of all termi
6f80: 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69 63  nal symbols whic
6f90: 68 20 63 61 6e 20 62 65 67 69 6e 0a 2a 2a 20 61  h can begin.** a
6fa0: 20 73 74 72 69 6e 67 20 67 65 6e 65 72 61 74 65   string generate
6fb0: 64 20 62 79 20 74 68 61 74 20 6e 6f 6e 74 65 72  d by that nonter
6fc0: 6d 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 46  minal..*/.void F
6fd0: 69 6e 64 46 69 72 73 74 53 65 74 73 28 73 74 72  indFirstSets(str
6fe0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
6ff0: 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .{.  int i, j;. 
7000: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
7010: 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73  ;.  int progress
7020: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
7030: 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
7040: 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73  ++){.    lemp->s
7050: 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64  ymbols[i]->lambd
7060: 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b  a = LEMON_FALSE;
7070: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6c 65 6d  .  }.  for(i=lem
7080: 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 3c  p->nterminal; i<
7090: 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
70a0: 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73  ++){.    lemp->s
70b0: 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69 72 73 74  ymbols[i]->first
70c0: 73 65 74 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a  set = SetNew();.
70d0: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20    }..  /* First 
70e0: 63 6f 6d 70 75 74 65 20 61 6c 6c 20 6c 61 6d 62  compute all lamb
70f0: 64 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20  das */.  do{.   
7100: 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20   progress = 0;. 
7110: 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e     for(rp=lemp->
7120: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
7130: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
7140: 28 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64  ( rp->lhs->lambd
7150: 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  a ) continue;.  
7160: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
7170: 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
7180: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
7190: 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72  mbol *sp = rp->r
71a0: 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 61  hs[i];.        a
71b0: 73 73 65 72 74 28 20 73 70 2d 3e 74 79 70 65 3d  ssert( sp->type=
71c0: 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20  =NONTERMINAL || 
71d0: 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f  sp->lambda==LEMO
71e0: 4e 5f 46 41 4c 53 45 20 29 3b 0a 20 20 20 20 20  N_FALSE );.     
71f0: 20 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64     if( sp->lambd
7200: 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29  a==LEMON_FALSE )
7210: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
7220: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d        if( i==rp-
7230: 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  >nrhs ){.       
7240: 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61   rp->lhs->lambda
7250: 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20   = LEMON_TRUE;. 
7260: 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20         progress 
7270: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
7280: 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f   }.  }while( pro
7290: 67 72 65 73 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e  gress );..  /* N
72a0: 6f 77 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20 66  ow compute all f
72b0: 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 64  irst sets */.  d
72c0: 6f 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79  o{.    struct sy
72d0: 6d 62 6f 6c 20 2a 73 31 2c 20 2a 73 32 3b 0a 20  mbol *s1, *s2;. 
72e0: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b     progress = 0;
72f0: 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  .    for(rp=lemp
7300: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
7310: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
7320: 73 31 20 3d 20 72 70 2d 3e 6c 68 73 3b 0a 20 20  s1 = rp->lhs;.  
7330: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
7340: 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
7350: 20 20 20 20 20 20 20 73 32 20 3d 20 72 70 2d 3e         s2 = rp->
7360: 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  rhs[i];.        
7370: 69 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d 54 45  if( s2->type==TE
7380: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
7390: 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20      progress += 
73a0: 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72 73 74  SetAdd(s1->first
73b0: 73 65 74 2c 73 32 2d 3e 69 6e 64 65 78 29 3b 0a  set,s2->index);.
73c0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
73d0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
73e0: 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d 4d 55 4c  f( s2->type==MUL
73f0: 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
7400: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
7410: 20 6a 3c 73 32 2d 3e 6e 73 75 62 73 79 6d 3b 20   j<s2->nsubsym; 
7420: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
7430: 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65    progress += Se
7440: 74 41 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65  tAdd(s1->firstse
7450: 74 2c 73 32 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d  t,s2->subsym[j]-
7460: 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20  >index);.       
7470: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
7480: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
7490: 6c 73 65 20 69 66 28 20 73 31 3d 3d 73 32 20 29  lse if( s1==s2 )
74a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
74b0: 73 31 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f  s1->lambda==LEMO
74c0: 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b  N_FALSE ) break;
74d0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
74e0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65            progre
74f0: 73 73 20 2b 3d 20 53 65 74 55 6e 69 6f 6e 28 73  ss += SetUnion(s
7500: 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e  1->firstset,s2->
7510: 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20  firstset);.     
7520: 20 20 20 20 20 69 66 28 20 73 32 2d 3e 6c 61 6d       if( s2->lam
7530: 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45  bda==LEMON_FALSE
7540: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
7550: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7560: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67  }.  }while( prog
7570: 72 65 73 73 20 29 3b 0a 20 20 72 65 74 75 72 6e  ress );.  return
7580: 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20  ;.}../* Compute 
7590: 61 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65 73  all LR(0) states
75a0: 20 66 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72   for the grammar
75b0: 2e 20 20 4c 69 6e 6b 73 0a 2a 2a 20 61 72 65 20  .  Links.** are 
75c0: 61 64 64 65 64 20 74 6f 20 62 65 74 77 65 65 6e  added to between
75d0: 20 73 6f 6d 65 20 73 74 61 74 65 73 20 73 6f 20   some states so 
75e0: 74 68 61 74 20 74 68 65 20 4c 52 28 31 29 20 66  that the LR(1) f
75f0: 6f 6c 6c 6f 77 20 73 65 74 73 0a 2a 2a 20 63 61  ollow sets.** ca
7600: 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61  n be computed la
7610: 74 65 72 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ter..*/.PRIVATE 
7620: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 67 65  struct state *ge
7630: 74 73 74 61 74 65 28 73 74 72 75 63 74 20 6c 65  tstate(struct le
7640: 6d 6f 6e 20 2a 29 3b 20 20 2f 2a 20 66 6f 72 77  mon *);  /* forw
7650: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
7660: 0a 76 6f 69 64 20 46 69 6e 64 53 74 61 74 65 73  .void FindStates
7670: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
7680: 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp).{.  struct 
7690: 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74  symbol *sp;.  st
76a0: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a  ruct rule *rp;..
76b0: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69    Configlist_ini
76c0: 74 28 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  t();..  /* Find 
76d0: 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c  the start symbol
76e0: 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
76f0: 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20  start ){.    sp 
7700: 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65  = Symbol_find(le
7710: 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20  mp->start);.    
7720: 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20  if( sp==0 ){.   
7730: 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
7740: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54  ->filename,0,."T
7750: 68 65 20 73 70 65 63 69 66 69 65 64 20 73 74 61  he specified sta
7760: 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22  rt symbol \"%s\"
7770: 20 69 73 20 6e 6f 74 20 5c 0a 69 6e 20 61 20 6e   is not \.in a n
7780: 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f 66 20 74 68  onterminal of th
7790: 65 20 67 72 61 6d 6d 61 72 2e 20 20 5c 22 25 73  e grammar.  \"%s
77a0: 5c 22 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  \" will be used 
77b0: 61 73 20 74 68 65 20 73 74 61 72 74 20 5c 0a 73  as the start \.s
77c0: 79 6d 62 6f 6c 20 69 6e 73 74 65 61 64 2e 22 2c  ymbol instead.",
77d0: 6c 65 6d 70 2d 3e 73 74 61 72 74 2c 6c 65 6d 70  lemp->start,lemp
77e0: 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73  ->startRule->lhs
77f0: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c  ->name);.      l
7800: 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
7810: 0a 20 20 20 20 20 20 73 70 20 3d 20 6c 65 6d 70  .      sp = lemp
7820: 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73  ->startRule->lhs
7830: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
7840: 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
7850: 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73 3b 0a  startRule->lhs;.
7860: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
7870: 75 72 65 20 74 68 65 20 73 74 61 72 74 20 73 79  ure the start sy
7880: 6d 62 6f 6c 20 64 6f 65 73 6e 27 74 20 6f 63 63  mbol doesn't occ
7890: 75 72 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d  ur on the right-
78a0: 68 61 6e 64 20 73 69 64 65 20 6f 66 0a 20 20 2a  hand side of.  *
78b0: 2a 20 61 6e 79 20 72 75 6c 65 2e 20 20 52 65 70  * any rule.  Rep
78c0: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
78d0: 69 74 20 64 6f 65 73 2e 20 20 28 59 41 43 43 20  it does.  (YACC 
78e0: 77 6f 75 6c 64 20 67 65 6e 65 72 61 74 65 20 61  would generate a
78f0: 20 6e 65 77 0a 20 20 2a 2a 20 73 74 61 72 74 20   new.  ** start 
7900: 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73 20 63  symbol in this c
7910: 61 73 65 2e 29 20 2a 2f 0a 20 20 66 6f 72 28 72  ase.) */.  for(r
7920: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
7930: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
7940: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
7950: 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
7960: 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
7970: 69 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d 3d 3d  if( rp->rhs[i]==
7980: 73 70 20 29 7b 20 20 20 2f 2a 20 46 49 58 20 4d  sp ){   /* FIX M
7990: 45 3a 20 20 44 65 61 6c 20 77 69 74 68 20 6d 75  E:  Deal with mu
79a0: 6c 74 69 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a  ltiterminals */.
79b0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
79c0: 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
79d0: 30 2c 0a 22 54 68 65 20 73 74 61 72 74 20 73 79  0,."The start sy
79e0: 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 6f 63 63 75  mbol \"%s\" occu
79f0: 72 73 20 6f 6e 20 74 68 65 20 5c 0a 72 69 67 68  rs on the \.righ
7a00: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61  t-hand side of a
7a10: 20 72 75 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c   rule. This will
7a20: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 70 61 72   result in a par
7a30: 73 65 72 20 77 68 69 63 68 20 5c 0a 64 6f 65 73  ser which \.does
7a40: 20 6e 6f 74 20 77 6f 72 6b 20 70 72 6f 70 65 72   not work proper
7a50: 6c 79 2e 22 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a  ly.",sp->name);.
7a60: 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72          lemp->er
7a70: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
7a80: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
7a90: 2a 20 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66  * The basis conf
7aa0: 69 67 75 72 61 74 69 6f 6e 20 73 65 74 20 66 6f  iguration set fo
7ab0: 72 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74  r the first stat
7ac0: 65 0a 20 20 2a 2a 20 69 73 20 61 6c 6c 20 72 75  e.  ** is all ru
7ad0: 6c 65 73 20 77 68 69 63 68 20 68 61 76 65 20 74  les which have t
7ae0: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
7af0: 61 73 20 74 68 65 69 72 0a 20 20 2a 2a 20 6c 65  as their.  ** le
7b00: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 2a 2f 0a  ft-hand side */.
7b10: 20 20 66 6f 72 28 72 70 3d 73 70 2d 3e 72 75 6c    for(rp=sp->rul
7b20: 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
7b30: 78 74 6c 68 73 29 7b 0a 20 20 20 20 73 74 72 75  xtlhs){.    stru
7b40: 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66  ct config *newcf
7b50: 70 3b 0a 20 20 20 20 72 70 2d 3e 6c 68 73 53 74  p;.    rp->lhsSt
7b60: 61 72 74 20 3d 20 31 3b 0a 20 20 20 20 6e 65 77  art = 1;.    new
7b70: 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74  cfp = Configlist
7b80: 5f 61 64 64 62 61 73 69 73 28 72 70 2c 30 29 3b  _addbasis(rp,0);
7b90: 0a 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63  .    SetAdd(newc
7ba0: 66 70 2d 3e 66 77 73 2c 30 29 3b 0a 20 20 7d 0a  fp->fws,0);.  }.
7bb0: 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
7bc0: 65 20 66 69 72 73 74 20 73 74 61 74 65 2e 20 20  e first state.  
7bd0: 41 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  All other states
7be0: 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 6f   will be.  ** co
7bf0: 6d 70 75 74 65 64 20 61 75 74 6f 6d 61 74 69 63  mputed automatic
7c00: 61 6c 6c 79 20 64 75 72 69 6e 67 20 74 68 65 20  ally during the 
7c10: 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 74  computation of t
7c20: 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 0a 20 20  he first one..  
7c30: 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
7c40: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66  pointer to the f
7c50: 69 72 73 74 20 73 74 61 74 65 20 69 73 20 6e 6f  irst state is no
7c60: 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 28 76 6f  t used. */.  (vo
7c70: 69 64 29 67 65 74 73 74 61 74 65 28 6c 65 6d 70  id)getstate(lemp
7c80: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
7c90: 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
7ca0: 74 65 72 20 74 6f 20 61 20 73 74 61 74 65 20 77  ter to a state w
7cb0: 68 69 63 68 20 69 73 20 64 65 73 63 72 69 62 65  hich is describe
7cc0: 64 20 62 79 20 74 68 65 20 63 6f 6e 66 69 67 75  d by the configu
7cd0: 72 61 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 77  ration.** list w
7ce0: 68 69 63 68 20 68 61 73 20 62 65 65 6e 20 62 75  hich has been bu
7cf0: 69 6c 74 20 66 72 6f 6d 20 63 61 6c 6c 73 20 74  ilt from calls t
7d00: 6f 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64  o Configlist_add
7d10: 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  ..*/.PRIVATE voi
7d20: 64 20 62 75 69 6c 64 73 68 69 66 74 73 28 73 74  d buildshifts(st
7d30: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20 73 74  ruct lemon *, st
7d40: 72 75 63 74 20 73 74 61 74 65 20 2a 29 3b 20 2f  ruct state *); /
7d50: 2a 20 46 6f 72 77 64 20 72 65 66 20 2a 2f 0a 50  * Forwd ref */.P
7d60: 52 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74  RIVATE struct st
7d70: 61 74 65 20 2a 67 65 74 73 74 61 74 65 28 73 74  ate *getstate(st
7d80: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
7d90: 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ).{.  struct con
7da0: 66 69 67 20 2a 63 66 70 2c 20 2a 62 70 3b 0a 20  fig *cfp, *bp;. 
7db0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
7dc0: 74 70 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63  tp;..  /* Extrac
7dd0: 74 20 74 68 65 20 73 6f 72 74 65 64 20 62 61 73  t the sorted bas
7de0: 69 73 20 6f 66 20 74 68 65 20 6e 65 77 20 73 74  is of the new st
7df0: 61 74 65 2e 20 20 54 68 65 20 62 61 73 69 73 20  ate.  The basis 
7e00: 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  was constructed.
7e10: 20 20 2a 2a 20 62 79 20 70 72 69 6f 72 20 63 61    ** by prior ca
7e20: 6c 6c 73 20 74 6f 20 22 43 6f 6e 66 69 67 6c 69  lls to "Configli
7e30: 73 74 5f 61 64 64 62 61 73 69 73 28 29 22 2e 20  st_addbasis()". 
7e40: 2a 2f 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  */.  Configlist_
7e50: 73 6f 72 74 62 61 73 69 73 28 29 3b 0a 20 20 62  sortbasis();.  b
7e60: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 62  p = Configlist_b
7e70: 61 73 69 73 28 29 3b 0a 0a 20 20 2f 2a 20 47 65  asis();..  /* Ge
7e80: 74 20 61 20 73 74 61 74 65 20 77 69 74 68 20 74  t a state with t
7e90: 68 65 20 73 61 6d 65 20 62 61 73 69 73 20 2a 2f  he same basis */
7ea0: 0a 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f 66  .  stp = State_f
7eb0: 69 6e 64 28 62 70 29 3b 0a 20 20 69 66 28 20 73  ind(bp);.  if( s
7ec0: 74 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 73  tp ){.    /* A s
7ed0: 74 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61  tate with the sa
7ee0: 6d 65 20 62 61 73 69 73 20 61 6c 72 65 61 64 79  me basis already
7ef0: 20 65 78 69 73 74 73 21 20 20 43 6f 70 79 20 61   exists!  Copy a
7f00: 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65  ll the follow-se
7f10: 74 0a 20 20 20 20 2a 2a 20 70 72 6f 70 61 67 61  t.    ** propaga
7f20: 74 69 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f 6d 20  tion links from 
7f30: 74 68 65 20 73 74 61 74 65 20 75 6e 64 65 72 20  the state under 
7f40: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 74  construction int
7f50: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 65  o the.    ** pre
7f60: 65 78 69 73 74 69 6e 67 20 73 74 61 74 65 2c 20  existing state, 
7f70: 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f  then return a po
7f80: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65  inter to the pre
7f90: 65 78 69 73 74 69 6e 67 20 73 74 61 74 65 20 2a  existing state *
7fa0: 2f 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e  /.    struct con
7fb0: 66 69 67 20 2a 78 2c 20 2a 79 3b 0a 20 20 20 20  fig *x, *y;.    
7fc0: 66 6f 72 28 78 3d 62 70 2c 20 79 3d 73 74 70 2d  for(x=bp, y=stp-
7fd0: 3e 62 70 3b 20 78 20 26 26 20 79 3b 20 78 3d 78  >bp; x && y; x=x
7fe0: 2d 3e 62 70 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a  ->bp, y=y->bp){.
7ff0: 20 20 20 20 20 20 50 6c 69 6e 6b 5f 63 6f 70 79        Plink_copy
8000: 28 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c  (&y->bplp,x->bpl
8010: 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f  p);.      Plink_
8020: 64 65 6c 65 74 65 28 78 2d 3e 66 70 6c 70 29 3b  delete(x->fplp);
8030: 0a 20 20 20 20 20 20 78 2d 3e 66 70 6c 70 20 3d  .      x->fplp =
8040: 20 78 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20   x->bplp = 0;.  
8050: 20 20 7d 0a 20 20 20 20 63 66 70 20 3d 20 43 6f    }.    cfp = Co
8060: 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28  nfiglist_return(
8070: 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73  );.    Configlis
8080: 74 5f 65 61 74 28 63 66 70 29 3b 0a 20 20 7d 65  t_eat(cfp);.  }e
8090: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
80a0: 20 72 65 61 6c 6c 79 20 69 73 20 61 20 6e 65 77   really is a new
80b0: 20 73 74 61 74 65 2e 20 20 43 6f 6e 73 74 72 75   state.  Constru
80c0: 63 74 20 61 6c 6c 20 74 68 65 20 64 65 74 61 69  ct all the detai
80d0: 6c 73 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67  ls */.    Config
80e0: 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d  list_closure(lem
80f0: 70 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  p);    /* Comput
8100: 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  e the configurat
8110: 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20  ion closure */. 
8120: 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f     Configlist_so
8130: 72 74 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt();           
8140: 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66  /* Sort the conf
8150: 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72  iguration closur
8160: 65 20 2a 2f 0a 20 20 20 20 63 66 70 20 3d 20 43  e */.    cfp = C
8170: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e  onfiglist_return
8180: 28 29 3b 20 20 20 2f 2a 20 47 65 74 20 61 20 70  ();   /* Get a p
8190: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f  ointer to the co
81a0: 6e 66 69 67 20 6c 69 73 74 20 2a 2f 0a 20 20 20  nfig list */.   
81b0: 20 73 74 70 20 3d 20 53 74 61 74 65 5f 6e 65 77   stp = State_new
81c0: 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ();           /*
81d0: 20 41 20 6e 65 77 20 73 74 61 74 65 20 73 74 72   A new state str
81e0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 4d 65  ucture */.    Me
81f0: 6d 6f 72 79 43 68 65 63 6b 28 73 74 70 29 3b 0a  moryCheck(stp);.
8200: 20 20 20 20 73 74 70 2d 3e 62 70 20 3d 20 62 70      stp->bp = bp
8210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8220: 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65   /* Remember the
8230: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62   configuration b
8240: 61 73 69 73 20 2a 2f 0a 20 20 20 20 73 74 70 2d  asis */.    stp-
8250: 3e 63 66 70 20 3d 20 63 66 70 3b 20 20 20 20 20  >cfp = cfp;     
8260: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65           /* Reme
8270: 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75  mber the configu
8280: 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a  ration closure *
8290: 2f 0a 20 20 20 20 73 74 70 2d 3e 73 74 61 74 65  /.    stp->state
82a0: 6e 75 6d 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  num = lemp->nsta
82b0: 74 65 2b 2b 3b 20 2f 2a 20 45 76 65 72 79 20 73  te++; /* Every s
82c0: 74 61 74 65 20 67 65 74 73 20 61 20 73 65 71 75  tate gets a sequ
82d0: 65 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ence number */. 
82e0: 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 30 3b 20     stp->ap = 0; 
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 2f 2a 20 4e 6f 20 61 63 74 69 6f 6e 73 2c 20 79  /* No actions, y
8310: 65 74 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65  et. */.    State
8320: 5f 69 6e 73 65 72 74 28 73 74 70 2c 73 74 70 2d  _insert(stp,stp-
8330: 3e 62 70 29 3b 20 20 20 2f 2a 20 41 64 64 20 74  >bp);   /* Add t
8340: 6f 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c  o the state tabl
8350: 65 20 2a 2f 0a 20 20 20 20 62 75 69 6c 64 73 68  e */.    buildsh
8360: 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 3b 20  ifts(lemp,stp); 
8370: 20 20 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69        /* Recursi
8380: 76 65 6c 79 20 63 6f 6d 70 75 74 65 20 73 75 63  vely compute suc
8390: 63 65 73 73 6f 72 20 73 74 61 74 65 73 20 2a 2f  cessor states */
83a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 74  .  }.  return st
83b0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
83c0: 72 6e 20 74 72 75 65 20 69 66 20 74 77 6f 20 73  rn true if two s
83d0: 79 6d 62 6f 6c 73 20 61 72 65 20 74 68 65 20 73  ymbols are the s
83e0: 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 61 6d 65  ame..*/.int same
83f0: 5f 73 79 6d 62 6f 6c 28 73 74 72 75 63 74 20 73  _symbol(struct s
8400: 79 6d 62 6f 6c 20 2a 61 2c 20 73 74 72 75 63 74  ymbol *a, struct
8410: 20 73 79 6d 62 6f 6c 20 2a 62 29 0a 7b 0a 20 20   symbol *b).{.  
8420: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 3d 3d  int i;.  if( a==
8430: 62 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  b ) return 1;.  
8440: 69 66 28 20 61 2d 3e 74 79 70 65 21 3d 4d 55 4c  if( a->type!=MUL
8450: 54 49 54 45 52 4d 49 4e 41 4c 20 29 20 72 65 74  TITERMINAL ) ret
8460: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 62 2d 3e  urn 0;.  if( b->
8470: 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49  type!=MULTITERMI
8480: 4e 41 4c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  NAL ) return 0;.
8490: 20 20 69 66 28 20 61 2d 3e 6e 73 75 62 73 79 6d    if( a->nsubsym
84a0: 21 3d 62 2d 3e 6e 73 75 62 73 79 6d 20 29 20 72  !=b->nsubsym ) r
84b0: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
84c0: 3d 30 3b 20 69 3c 61 2d 3e 6e 73 75 62 73 79 6d  =0; i<a->nsubsym
84d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
84e0: 61 2d 3e 73 75 62 73 79 6d 5b 69 5d 21 3d 62 2d  a->subsym[i]!=b-
84f0: 3e 73 75 62 73 79 6d 5b 69 5d 20 29 20 72 65 74  >subsym[i] ) ret
8500: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
8510: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e  urn 1;.}../* Con
8520: 73 74 72 75 63 74 20 61 6c 6c 20 73 75 63 63 65  struct all succe
8530: 73 73 6f 72 20 73 74 61 74 65 73 20 74 6f 20 74  ssor states to t
8540: 68 65 20 67 69 76 65 6e 20 73 74 61 74 65 2e 20  he given state. 
8550: 20 41 20 22 73 75 63 63 65 73 73 6f 72 22 0a 2a   A "successor".*
8560: 2a 20 73 74 61 74 65 20 69 73 20 61 6e 79 20 73  * state is any s
8570: 74 61 74 65 20 77 68 69 63 68 20 63 61 6e 20 62  tate which can b
8580: 65 20 72 65 61 63 68 65 64 20 62 79 20 61 20 73  e reached by a s
8590: 68 69 66 74 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  hift action..*/.
85a0: 50 52 49 56 41 54 45 20 76 6f 69 64 20 62 75 69  PRIVATE void bui
85b0: 6c 64 73 68 69 66 74 73 28 73 74 72 75 63 74 20  ldshifts(struct 
85c0: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72  lemon *lemp, str
85d0: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 29 0a  uct state *stp).
85e0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
85f0: 67 20 2a 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20  g *cfp;  /* For 
8600: 6c 6f 6f 70 69 6e 67 20 74 68 72 75 20 74 68 65  looping thru the
8610: 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65 20   config closure 
8620: 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20 73 74  of "stp" */.  st
8630: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 63 66  ruct config *bcf
8640: 70 3b 20 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e  p; /* For the in
8650: 6e 65 72 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66  ner loop on conf
8660: 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73  ig closure of "s
8670: 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  tp" */.  struct 
8680: 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 67 3b 20  config *newcfg; 
8690: 20 2f 2a 20 2a 2f 0a 20 20 73 74 72 75 63 74 20   /* */.  struct 
86a0: 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 2f 2a  symbol *sp;   /*
86b0: 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e   Symbol followin
86c0: 67 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e  g the dot in con
86d0: 66 69 67 75 72 61 74 69 6f 6e 20 22 63 66 70 22  figuration "cfp"
86e0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
86f0: 62 6f 6c 20 2a 62 73 70 3b 20 20 2f 2a 20 53 79  bol *bsp;  /* Sy
8700: 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  mbol following t
8710: 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67  he dot in config
8720: 75 72 61 74 69 6f 6e 20 22 62 63 66 70 22 20 2a  uration "bcfp" *
8730: 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  /.  struct state
8740: 20 2a 6e 65 77 73 74 70 3b 20 2f 2a 20 41 20 70   *newstp; /* A p
8750: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 63 63  ointer to a succ
8760: 65 73 73 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a  essor state */..
8770: 20 20 2f 2a 20 45 61 63 68 20 63 6f 6e 66 69 67    /* Each config
8780: 75 72 61 74 69 6f 6e 20 62 65 63 6f 6d 65 73 20  uration becomes 
8790: 63 6f 6d 70 6c 65 74 65 20 61 66 74 65 72 20 69  complete after i
87a0: 74 20 63 6f 6e 74 69 62 75 74 65 73 20 74 6f 20  t contibutes to 
87b0: 61 20 73 75 63 63 65 73 73 6f 72 0a 20 20 2a 2a  a successor.  **
87c0: 20 73 74 61 74 65 2e 20 20 49 6e 69 74 69 61 6c   state.  Initial
87d0: 6c 79 2c 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72  ly, all configur
87e0: 61 74 69 6f 6e 73 20 61 72 65 20 69 6e 63 6f 6d  ations are incom
87f0: 70 6c 65 74 65 20 2a 2f 0a 20 20 66 6f 72 28 63  plete */.  for(c
8800: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
8810: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
8820: 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49   cfp->status = I
8830: 4e 43 4f 4d 50 4c 45 54 45 3b 0a 0a 20 20 2f 2a  NCOMPLETE;..  /*
8840: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
8850: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  l configurations
8860: 20 6f 66 20 74 68 65 20 73 74 61 74 65 20 22 73   of the state "s
8870: 74 70 22 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70  tp" */.  for(cfp
8880: 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20  =stp->cfp; cfp; 
8890: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
88a0: 20 20 20 20 69 66 28 20 63 66 70 2d 3e 73 74 61      if( cfp->sta
88b0: 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20  tus==COMPLETE ) 
88c0: 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20  continue;    /* 
88d0: 41 6c 72 65 61 64 79 20 75 73 65 64 20 62 79 20  Already used by 
88e0: 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20  inner loop */.  
88f0: 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3e 3d    if( cfp->dot>=
8900: 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20  cfp->rp->nrhs ) 
8910: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 43 61  continue;  /* Ca
8920: 6e 27 74 20 73 68 69 66 74 20 74 68 69 73 20 63  n't shift this c
8930: 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20 43 6f 6e  onfig */.    Con
8940: 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 29 3b  figlist_reset();
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8960: 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74        /* Reset t
8970: 68 65 20 6e 65 77 20 63 6f 6e 66 69 67 20 73 65  he new config se
8980: 74 20 2a 2f 0a 20 20 20 20 73 70 20 3d 20 63 66  t */.    sp = cf
8990: 70 2d 3e 72 70 2d 3e 72 68 73 5b 63 66 70 2d 3e  p->rp->rhs[cfp->
89a0: 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20 20  dot];           
89b0: 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 61 66 74 65    /* Symbol afte
89c0: 72 20 74 68 65 20 64 6f 74 20 2a 2f 0a 0a 20 20  r the dot */..  
89d0: 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 63    /* For every c
89e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e 20  onfiguration in 
89f0: 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20  the state "stp" 
8a00: 77 68 69 63 68 20 68 61 73 20 74 68 65 20 73 79  which has the sy
8a10: 6d 62 6f 6c 20 22 73 70 22 0a 20 20 20 20 2a 2a  mbol "sp".    **
8a20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 73 20 64   following its d
8a30: 6f 74 2c 20 61 64 64 20 74 68 65 20 73 61 6d 65  ot, add the same
8a40: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74   configuration t
8a50: 6f 20 74 68 65 20 62 61 73 69 73 20 73 65 74 20  o the basis set 
8a60: 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 63 6f 6e  under.    ** con
8a70: 73 74 72 75 63 74 69 6f 6e 20 62 75 74 20 77 69  struction but wi
8a80: 74 68 20 74 68 65 20 64 6f 74 20 73 68 69 66 74  th the dot shift
8a90: 65 64 20 6f 6e 65 20 73 79 6d 62 6f 6c 20 74 6f  ed one symbol to
8aa0: 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
8ab0: 20 20 20 66 6f 72 28 62 63 66 70 3d 63 66 70 3b     for(bcfp=cfp;
8ac0: 20 62 63 66 70 3b 20 62 63 66 70 3d 62 63 66 70   bcfp; bcfp=bcfp
8ad0: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
8ae0: 66 28 20 62 63 66 70 2d 3e 73 74 61 74 75 73 3d  f( bcfp->status=
8af0: 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74  =COMPLETE ) cont
8b00: 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65  inue;    /* Alre
8b10: 61 64 79 20 75 73 65 64 20 2a 2f 0a 20 20 20 20  ady used */.    
8b20: 20 20 69 66 28 20 62 63 66 70 2d 3e 64 6f 74 3e    if( bcfp->dot>
8b30: 3d 62 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20  =bcfp->rp->nrhs 
8b40: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 43  ) continue; /* C
8b50: 61 6e 27 74 20 73 68 69 66 74 20 74 68 69 73 20  an't shift this 
8b60: 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 62 73 70  one */.      bsp
8b70: 20 3d 20 62 63 66 70 2d 3e 72 70 2d 3e 72 68 73   = bcfp->rp->rhs
8b80: 5b 62 63 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20  [bcfp->dot];    
8b90: 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 73 79         /* Get sy
8ba0: 6d 62 6f 6c 20 61 66 74 65 72 20 64 6f 74 20 2a  mbol after dot *
8bb0: 2f 0a 20 20 20 20 20 20 69 66 28 20 21 73 61 6d  /.      if( !sam
8bc0: 65 5f 73 79 6d 62 6f 6c 28 62 73 70 2c 73 70 29  e_symbol(bsp,sp)
8bd0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20   ) continue;    
8be0: 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 73 61 6d    /* Must be sam
8bf0: 65 20 61 73 20 66 6f 72 20 22 63 66 70 22 20 2a  e as for "cfp" *
8c00: 2f 0a 20 20 20 20 20 20 62 63 66 70 2d 3e 73 74  /.      bcfp->st
8c10: 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b  atus = COMPLETE;
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c30: 20 20 2f 2a 20 4d 61 72 6b 20 74 68 69 73 20 63    /* Mark this c
8c40: 6f 6e 66 69 67 20 61 73 20 75 73 65 64 20 2a 2f  onfig as used */
8c50: 0a 20 20 20 20 20 20 6e 65 77 63 66 67 20 3d 20  .      newcfg = 
8c60: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61  Configlist_addba
8c70: 73 69 73 28 62 63 66 70 2d 3e 72 70 2c 62 63 66  sis(bcfp->rp,bcf
8c80: 70 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20 20 20 20  p->dot+1);.     
8c90: 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6e 65 77 63   Plink_add(&newc
8ca0: 66 67 2d 3e 62 70 6c 70 2c 62 63 66 70 29 3b 0a  fg->bplp,bcfp);.
8cb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
8cc0: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
8cd0: 68 65 20 73 74 61 74 65 20 64 65 73 63 72 69 62  he state describ
8ce0: 65 64 20 62 79 20 74 68 65 20 62 61 73 69 73 20  ed by the basis 
8cf0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  configuration se
8d00: 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75  t.    ** constru
8d10: 63 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 63  cted in the prec
8d20: 65 64 69 6e 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20  eding loop */.  
8d30: 20 20 6e 65 77 73 74 70 20 3d 20 67 65 74 73 74    newstp = getst
8d40: 61 74 65 28 6c 65 6d 70 29 3b 0a 0a 20 20 20 20  ate(lemp);..    
8d50: 2f 2a 20 54 68 65 20 73 74 61 74 65 20 22 6e 65  /* The state "ne
8d60: 77 73 74 70 22 20 69 73 20 72 65 61 63 68 65 64  wstp" is reached
8d70: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20   from the state 
8d80: 22 73 74 70 22 20 62 79 20 61 20 73 68 69 66 74  "stp" by a shift
8d90: 20 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f   action.    ** o
8da0: 6e 20 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70  n the symbol "sp
8db0: 22 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 70 2d  " */.    if( sp-
8dc0: 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
8dd0: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e  INAL ){.      in
8de0: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
8df0: 3d 30 3b 20 69 3c 73 70 2d 3e 6e 73 75 62 73 79  =0; i<sp->nsubsy
8e00: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; i++){.       
8e10: 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70   Action_add(&stp
8e20: 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70 2d 3e 73  ->ap,SHIFT,sp->s
8e30: 75 62 73 79 6d 5b 69 5d 2c 28 63 68 61 72 2a 29  ubsym[i],(char*)
8e40: 6e 65 77 73 74 70 29 3b 0a 20 20 20 20 20 20 7d  newstp);.      }
8e50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8e60: 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74    Action_add(&st
8e70: 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70 2c 28  p->ap,SHIFT,sp,(
8e80: 63 68 61 72 20 2a 29 6e 65 77 73 74 70 29 3b 0a  char *)newstp);.
8e90: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
8ea0: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65  ** Construct the
8eb0: 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
8ec0: 6b 73 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 4c  ks.*/.void FindL
8ed0: 69 6e 6b 73 28 73 74 72 75 63 74 20 6c 65 6d 6f  inks(struct lemo
8ee0: 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74  n *lemp).{.  int
8ef0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   i;.  struct con
8f00: 66 69 67 20 2a 63 66 70 2c 20 2a 6f 74 68 65 72  fig *cfp, *other
8f10: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
8f20: 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
8f30: 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f  plink *plp;..  /
8f40: 2a 20 48 6f 75 73 65 6b 65 65 70 69 6e 67 20 64  * Housekeeping d
8f50: 65 74 61 69 6c 3a 0a 20 20 2a 2a 20 41 64 64 20  etail:.  ** Add 
8f60: 74 6f 20 65 76 65 72 79 20 70 72 6f 70 61 67 61  to every propaga
8f70: 74 65 20 6c 69 6e 6b 20 61 20 70 6f 69 6e 74 65  te link a pointe
8f80: 72 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 74  r back to the st
8f90: 61 74 65 20 74 6f 0a 20 20 2a 2a 20 77 68 69 63  ate to.  ** whic
8fa0: 68 20 74 68 65 20 6c 69 6e 6b 20 69 73 20 61 74  h the link is at
8fb0: 74 61 63 68 65 64 2e 20 2a 2f 0a 20 20 66 6f 72  tached. */.  for
8fc0: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
8fd0: 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
8fe0: 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
8ff0: 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63  ed[i];.    for(c
9000: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
9010: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
9020: 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74 70  {.      cfp->stp
9030: 20 3d 20 73 74 70 3b 0a 20 20 20 20 7d 0a 20 20   = stp;.    }.  
9040: 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  }..  /* Convert 
9050: 61 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73 20 69 6e  all backlinks in
9060: 74 6f 20 66 6f 72 77 61 72 64 20 6c 69 6e 6b 73  to forward links
9070: 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 6f 72 77  .  Only the forw
9080: 61 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b 73 20 61  ard.  ** links a
9090: 72 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 66  re used in the f
90a0: 6f 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d 70 75 74  ollow-set comput
90b0: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28  ation. */.  for(
90c0: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
90d0: 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
90e0: 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
90f0: 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66  d[i];.    for(cf
9100: 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b  p=stp->cfp; cfp;
9110: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
9120: 0a 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63  .      for(plp=c
9130: 66 70 2d 3e 62 70 6c 70 3b 20 70 6c 70 3b 20 70  fp->bplp; plp; p
9140: 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20  lp=plp->next){. 
9150: 20 20 20 20 20 20 20 6f 74 68 65 72 20 3d 20 70         other = p
9160: 6c 70 2d 3e 63 66 70 3b 0a 20 20 20 20 20 20 20  lp->cfp;.       
9170: 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6f 74 68 65   Plink_add(&othe
9180: 72 2d 3e 66 70 6c 70 2c 63 66 70 29 3b 0a 20 20  r->fplp,cfp);.  
9190: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
91a0: 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c  }../* Compute al
91b0: 6c 20 66 6f 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a  l followsets..**
91c0: 0a 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20  .** A followset 
91d0: 69 73 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c  is the set of al
91e0: 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20  l symbols which 
91f0: 63 61 6e 20 63 6f 6d 65 20 69 6d 6d 65 64 69 61  can come immedia
9200: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 61 20  tely.** after a 
9210: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a  configuration..*
9220: 2f 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f  /.void FindFollo
9230: 77 53 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d  wSets(struct lem
9240: 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e  on *lemp).{.  in
9250: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f  t i;.  struct co
9260: 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72  nfig *cfp;.  str
9270: 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a  uct plink *plp;.
9280: 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a    int progress;.
9290: 20 20 69 6e 74 20 63 68 61 6e 67 65 3b 0a 0a 20    int change;.. 
92a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
92b0: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
92c0: 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70      for(cfp=lemp
92d0: 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70  ->sorted[i]->cfp
92e0: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
92f0: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70  next){.      cfp
9300: 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d  ->status = INCOM
9310: 50 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  PLETE;.    }.  }
9320: 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67  ..  do{.    prog
9330: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ress = 0;.    fo
9340: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
9350: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
9360: 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d     for(cfp=lemp-
9370: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b  >sorted[i]->cfp;
9380: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
9390: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
93a0: 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43  ( cfp->status==C
93b0: 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e  OMPLETE ) contin
93c0: 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ue;.        for(
93d0: 70 6c 70 3d 63 66 70 2d 3e 66 70 6c 70 3b 20 70  plp=cfp->fplp; p
93e0: 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78  lp; plp=plp->nex
93f0: 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68  t){.          ch
9400: 61 6e 67 65 20 3d 20 53 65 74 55 6e 69 6f 6e 28  ange = SetUnion(
9410: 70 6c 70 2d 3e 63 66 70 2d 3e 66 77 73 2c 63 66  plp->cfp->fws,cf
9420: 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 20 20 20  p->fws);.       
9430: 20 20 20 69 66 28 20 63 68 61 6e 67 65 20 29 7b     if( change ){
9440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 70  .            plp
9450: 2d 3e 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20  ->cfp->status = 
9460: 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20  INCOMPLETE;.    
9470: 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73          progress
9480: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
9490: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
94a0: 20 20 20 20 63 66 70 2d 3e 73 74 61 74 75 73 20      cfp->status 
94b0: 3d 20 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20  = COMPLETE;.    
94c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69    }.    }.  }whi
94d0: 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a  le( progress );.
94e0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  }..static int re
94f0: 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 73  solve_conflict(s
9500: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2c 73  truct action *,s
9510: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b  truct action *);
9520: 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  ../* Compute the
9530: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c   reduce actions,
9540: 20 61 6e 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e   and resolve con
9550: 66 6c 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  flicts..*/.void 
9560: 46 69 6e 64 41 63 74 69 6f 6e 73 28 73 74 72 75  FindActions(stru
9570: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
9580: 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 73  {.  int i,j;.  s
9590: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
95a0: 70 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  p;.  struct stat
95b0: 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
95c0: 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73   symbol *sp;.  s
95d0: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
95e0: 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 6f 66  .  /* Add all of
95f0: 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69   the reduce acti
9600: 6f 6e 73 0a 20 20 2a 2a 20 41 20 72 65 64 75 63  ons.  ** A reduc
9610: 65 20 61 63 74 69 6f 6e 20 69 73 20 61 64 64 65  e action is adde
9620: 64 20 66 6f 72 20 65 61 63 68 20 65 6c 65 6d 65  d for each eleme
9630: 6e 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  nt of the follow
9640: 73 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f  set of.  ** a co
9650: 6e 66 69 67 75 72 61 74 69 6f 6e 20 77 68 69 63  nfiguration whic
9660: 68 20 68 61 73 20 69 74 73 20 64 6f 74 20 61 74  h has its dot at
9670: 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
9680: 68 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ht..  */.  for(i
9690: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
96a0: 74 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c  te; i++){   /* L
96b0: 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 74 61  oop over all sta
96c0: 74 65 73 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d  tes */.    stp =
96d0: 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
96e0: 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74  ;.    for(cfp=st
96f0: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
9700: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a  =cfp->next){  /*
9710: 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63   Loop over all c
9720: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f  onfigurations */
9730: 0a 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e  .      if( cfp->
9740: 72 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64  rp->nrhs==cfp->d
9750: 6f 74 20 29 7b 20 20 20 20 20 20 20 20 2f 2a 20  ot ){        /* 
9760: 49 73 20 64 6f 74 20 61 74 20 65 78 74 72 65 6d  Is dot at extrem
9770: 65 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20  e right? */.    
9780: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
9790: 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
97a0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
97b0: 69 66 28 20 53 65 74 46 69 6e 64 28 63 66 70 2d  if( SetFind(cfp-
97c0: 3e 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20  >fws,j) ){.     
97d0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20         /* Add a 
97e0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 74 6f  reduce action to
97f0: 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22   the state "stp"
9800: 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65 64 75   which will redu
9810: 63 65 20 62 79 20 74 68 65 0a 20 20 20 20 20 20  ce by the.      
9820: 20 20 20 20 20 20 2a 2a 20 72 75 6c 65 20 22 63        ** rule "c
9830: 66 70 2d 3e 72 70 22 20 69 66 20 74 68 65 20 6c  fp->rp" if the l
9840: 6f 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f 6c 20  ookahead symbol 
9850: 69 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  is "lemp->symbol
9860: 73 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20  s[j]" */.       
9870: 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28       Action_add(
9880: 26 73 74 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c  &stp->ap,REDUCE,
9890: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d  lemp->symbols[j]
98a0: 2c 28 63 68 61 72 20 2a 29 63 66 70 2d 3e 72 70  ,(char *)cfp->rp
98b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
98c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
98d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
98e0: 20 41 64 64 20 74 68 65 20 61 63 63 65 70 74 69   Add the accepti
98f0: 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66  ng token */.  if
9900: 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b  ( lemp->start ){
9910: 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c  .    sp = Symbol
9920: 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72  _find(lemp->star
9930: 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d  t);.    if( sp==
9940: 30 20 29 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  0 ) sp = lemp->s
9950: 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20  tartRule->lhs;. 
9960: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d   }else{.    sp =
9970: 20 6c 65 6d 70 2d 3e 73 74 61 72 74 52 75 6c 65   lemp->startRule
9980: 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ->lhs;.  }.  /* 
9990: 41 64 64 20 74 6f 20 74 68 65 20 66 69 72 73 74  Add to the first
99a0: 20 73 74 61 74 65 20 28 77 68 69 63 68 20 69 73   state (which is
99b0: 20 61 6c 77 61 79 73 20 74 68 65 20 73 74 61 72   always the star
99c0: 74 69 6e 67 20 73 74 61 74 65 20 6f 66 20 74 68  ting state of th
99d0: 65 0a 20 20 2a 2a 20 66 69 6e 69 74 65 20 73 74  e.  ** finite st
99e0: 61 74 65 20 6d 61 63 68 69 6e 65 29 20 61 6e 20  ate machine) an 
99f0: 61 63 74 69 6f 6e 20 74 6f 20 41 43 43 45 50 54  action to ACCEPT
9a00: 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   if the lookahea
9a10: 64 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 73 74  d is the.  ** st
9a20: 61 72 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e  art nonterminal.
9a30: 20 20 2a 2f 0a 20 20 41 63 74 69 6f 6e 5f 61 64    */.  Action_ad
9a40: 64 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  d(&lemp->sorted[
9a50: 30 5d 2d 3e 61 70 2c 41 43 43 45 50 54 2c 73 70  0]->ap,ACCEPT,sp
9a60: 2c 30 29 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c  ,0);..  /* Resol
9a70: 76 65 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a  ve conflicts */.
9a80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
9a90: 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
9aa0: 0a 20 20 20 20 73 74 72 75 63 74 20 61 63 74 69  .    struct acti
9ab0: 6f 6e 20 2a 61 70 2c 20 2a 6e 61 70 3b 0a 20 20  on *ap, *nap;.  
9ac0: 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
9ad0: 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 2f 2a 20  rted[i];.    /* 
9ae0: 61 73 73 65 72 74 28 20 73 74 70 2d 3e 61 70 20  assert( stp->ap 
9af0: 29 3b 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 61  ); */.    stp->a
9b00: 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28  p = Action_sort(
9b10: 73 74 70 2d 3e 61 70 29 3b 0a 20 20 20 20 66 6f  stp->ap);.    fo
9b20: 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
9b30: 20 26 26 20 61 70 2d 3e 6e 65 78 74 3b 20 61 70   && ap->next; ap
9b40: 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
9b50: 20 20 66 6f 72 28 6e 61 70 3d 61 70 2d 3e 6e 65    for(nap=ap->ne
9b60: 78 74 3b 20 6e 61 70 20 26 26 20 6e 61 70 2d 3e  xt; nap && nap->
9b70: 73 70 3d 3d 61 70 2d 3e 73 70 3b 20 6e 61 70 3d  sp==ap->sp; nap=
9b80: 6e 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  nap->next){.    
9b90: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
9ba0: 61 63 74 69 6f 6e 73 20 22 61 70 22 20 61 6e 64  actions "ap" and
9bb0: 20 22 6e 61 70 22 20 68 61 76 65 20 74 68 65 20   "nap" have the 
9bc0: 73 61 6d 65 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a  same lookahead..
9bd0: 20 20 20 20 20 20 20 20 20 2a 2a 20 46 69 67 75           ** Figu
9be0: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65  re out which one
9bf0: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
9c00: 2a 2f 0a 20 20 20 20 20 20 20 20 20 6c 65 6d 70  */.         lemp
9c10: 2d 3e 6e 63 6f 6e 66 6c 69 63 74 20 2b 3d 20 72  ->nconflict += r
9c20: 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28  esolve_conflict(
9c30: 61 70 2c 6e 61 70 29 3b 0a 20 20 20 20 20 20 7d  ap,nap);.      }
9c40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9c50: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
9c60: 20 66 6f 72 20 65 61 63 68 20 72 75 6c 65 20 74   for each rule t
9c70: 68 61 74 20 63 61 6e 20 6e 65 76 65 72 20 62 65  hat can never be
9c80: 20 72 65 64 75 63 65 64 2e 20 2a 2f 0a 20 20 66   reduced. */.  f
9c90: 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
9ca0: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
9cb0: 74 29 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65  t) rp->canReduce
9cc0: 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a   = LEMON_FALSE;.
9cd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
9ce0: 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
9cf0: 0a 20 20 20 20 73 74 72 75 63 74 20 61 63 74 69  .    struct acti
9d00: 6f 6e 20 2a 61 70 3b 0a 20 20 20 20 66 6f 72 28  on *ap;.    for(
9d10: 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  ap=lemp->sorted[
9d20: 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  i]->ap; ap; ap=a
9d30: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
9d40: 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45  if( ap->type==RE
9d50: 44 55 43 45 20 29 20 61 70 2d 3e 78 2e 72 70 2d  DUCE ) ap->x.rp-
9d60: 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d  >canReduce = LEM
9d70: 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20  ON_TRUE;.    }. 
9d80: 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70   }.  for(rp=lemp
9d90: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
9da0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66  p->next){.    if
9db0: 28 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20  ( rp->canReduce 
9dc0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
9dd0: 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
9de0: 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65  ilename,rp->rule
9df0: 6c 69 6e 65 2c 22 54 68 69 73 20 72 75 6c 65 20  line,"This rule 
9e00: 63 61 6e 20 6e 6f 74 20 62 65 20 72 65 64 75 63  can not be reduc
9e10: 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c 65 6d  ed.\n");.    lem
9e20: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
9e30: 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65   }.}../* Resolve
9e40: 20 61 20 63 6f 6e 66 6c 69 63 74 20 62 65 74 77   a conflict betw
9e50: 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65  een the two give
9e60: 6e 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74  n actions.  If t
9e70: 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 63  he.** conflict c
9e80: 61 6e 27 74 20 62 65 20 72 65 73 6f 6c 76 65 64  an't be resolved
9e90: 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  , return non-zer
9ea0: 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47  o..**.** NO LONG
9eb0: 45 52 20 54 52 55 45 3a 0a 2a 2a 20 20 20 54 6f  ER TRUE:.**   To
9ec0: 20 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c   resolve a confl
9ed0: 69 63 74 2c 20 66 69 72 73 74 20 6c 6f 6f 6b 20  ict, first look 
9ee0: 74 6f 20 73 65 65 20 69 66 20 65 69 74 68 65 72  to see if either
9ef0: 20 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20   action.**   is 
9f00: 6f 6e 20 61 6e 20 65 72 72 6f 72 20 72 75 6c 65  on an error rule
9f10: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
9f20: 20 74 61 6b 65 20 74 68 65 20 61 63 74 69 6f 6e   take the action
9f30: 20 77 68 69 63 68 0a 2a 2a 20 20 20 69 73 20 6e   which.**   is n
9f40: 6f 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ot associated wi
9f50: 74 68 20 74 68 65 20 65 72 72 6f 72 20 72 75 6c  th the error rul
9f60: 65 2e 20 20 49 66 20 6e 65 69 74 68 65 72 20 6f  e.  If neither o
9f70: 72 20 62 6f 74 68 0a 2a 2a 20 20 20 61 63 74 69  r both.**   acti
9f80: 6f 6e 73 20 61 72 65 20 61 73 73 6f 63 69 61 74  ons are associat
9f90: 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
9fa0: 20 72 75 6c 65 2c 20 74 68 65 6e 20 74 72 79 20   rule, then try 
9fb0: 74 6f 0a 2a 2a 20 20 20 75 73 65 20 70 72 65 63  to.**   use prec
9fc0: 65 64 65 6e 63 65 20 74 6f 20 72 65 73 6f 6c 76  edence to resolv
9fd0: 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2e 0a  e the conflict..
9fe0: 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
9ff0: 61 63 74 69 6f 6e 20 69 73 20 61 20 53 48 49 46  action is a SHIF
a000: 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  T, then it must 
a010: 62 65 20 61 70 78 2e 20 20 54 68 69 73 0a 2a 2a  be apx.  This.**
a020: 20 66 75 6e 63 74 69 6f 6e 20 77 6f 6e 27 74 20   function won't 
a030: 77 6f 72 6b 20 69 66 20 61 70 78 2d 3e 74 79 70  work if apx->typ
a040: 65 3d 3d 52 45 44 55 43 45 20 61 6e 64 20 61 70  e==REDUCE and ap
a050: 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 2e 0a  y->type==SHIFT..
a060: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
a070: 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 0a  solve_conflict(.
a080: 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
a090: 2a 61 70 78 2c 0a 20 20 73 74 72 75 63 74 20 61  *apx,.  struct a
a0a0: 63 74 69 6f 6e 20 2a 61 70 79 0a 29 7b 0a 20 20  ction *apy.){.  
a0b0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
a0c0: 70 78 2c 20 2a 73 70 79 3b 0a 20 20 69 6e 74 20  px, *spy;.  int 
a0d0: 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 73  errcnt = 0;.  as
a0e0: 73 65 72 74 28 20 61 70 78 2d 3e 73 70 3d 3d 61  sert( apx->sp==a
a0f0: 70 79 2d 3e 73 70 20 29 3b 20 20 2f 2a 20 4f 74  py->sp );  /* Ot
a100: 68 65 72 77 69 73 65 20 74 68 65 72 65 20 77 6f  herwise there wo
a110: 75 6c 64 20 62 65 20 6e 6f 20 63 6f 6e 66 6c 69  uld be no confli
a120: 63 74 20 2a 2f 0a 20 20 69 66 28 20 61 70 78 2d  ct */.  if( apx-
a130: 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26 20  >type==SHIFT && 
a140: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54  apy->type==SHIFT
a150: 20 29 7b 0a 20 20 20 20 61 70 79 2d 3e 74 79 70   ){.    apy->typ
a160: 65 20 3d 20 53 53 43 4f 4e 46 4c 49 43 54 3b 0a  e = SSCONFLICT;.
a170: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
a180: 7d 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79 70  }.  if( apx->typ
a190: 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79 2d  e==SHIFT && apy-
a1a0: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b  >type==REDUCE ){
a1b0: 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e  .    spx = apx->
a1c0: 73 70 3b 0a 20 20 20 20 73 70 79 20 3d 20 61 70  sp;.    spy = ap
a1d0: 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d  y->x.rp->precsym
a1e0: 3b 0a 20 20 20 20 69 66 28 20 73 70 79 3d 3d 30  ;.    if( spy==0
a1f0: 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20   || spx->prec<0 
a200: 7c 7c 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 29  || spy->prec<0 )
a210: 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 65  {.      /* Not e
a220: 6e 6f 75 67 68 20 70 72 65 63 65 64 65 6e 63 65  nough precedence
a230: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f   information. */
a240: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
a250: 20 3d 20 53 52 43 4f 4e 46 4c 49 43 54 3b 0a 20   = SRCONFLICT;. 
a260: 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20       errcnt++;. 
a270: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78     }else if( spx
a280: 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63  ->prec>spy->prec
a290: 20 29 7b 20 20 20 20 2f 2a 20 68 69 67 68 65 72   ){    /* higher
a2a0: 20 70 72 65 63 65 64 65 6e 63 65 20 77 69 6e 73   precedence wins
a2b0: 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   */.      apy->t
a2c0: 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45  ype = RD_RESOLVE
a2d0: 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  D;.    }else if(
a2e0: 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e   spx->prec<spy->
a2f0: 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70  prec ){.      ap
a300: 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52 45 53  x->type = SH_RES
a310: 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  OLVED;.    }else
a320: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d   if( spx->prec==
a330: 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78  spy->prec && spx
a340: 2d 3e 61 73 73 6f 63 3d 3d 52 49 47 48 54 20 29  ->assoc==RIGHT )
a350: 7b 20 2f 2a 20 55 73 65 20 6f 70 65 72 61 74 6f  { /* Use operato
a360: 72 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e  r */.      apy->
a370: 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56  type = RD_RESOLV
a380: 45 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ED;             
a390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3a0: 2f 2a 20 61 73 73 6f 63 69 61 74 69 76 69 74 79  /* associativity
a3b0: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
a3c0: 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  ( spx->prec==spy
a3d0: 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61  ->prec && spx->a
a3e0: 73 73 6f 63 3d 3d 4c 45 46 54 20 29 7b 20 20 2f  ssoc==LEFT ){  /
a3f0: 2a 20 74 6f 20 62 72 65 61 6b 20 74 69 65 20 2a  * to break tie *
a400: 2f 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  /.      apx->typ
a410: 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b  e = SH_RESOLVED;
a420: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a430: 20 20 61 73 73 65 72 74 28 20 73 70 78 2d 3e 70    assert( spx->p
a440: 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26  rec==spy->prec &
a450: 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f  & spx->assoc==NO
a460: 4e 45 20 29 3b 0a 20 20 20 20 20 20 61 70 78 2d  NE );.      apx-
a470: 3e 74 79 70 65 20 3d 20 45 52 52 4f 52 3b 0a 20  >type = ERROR;. 
a480: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
a490: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55   apx->type==REDU
a4a0: 43 45 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d  CE && apy->type=
a4b0: 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73  =REDUCE ){.    s
a4c0: 70 78 20 3d 20 61 70 78 2d 3e 78 2e 72 70 2d 3e  px = apx->x.rp->
a4d0: 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 73 70 79  precsym;.    spy
a4e0: 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72   = apy->x.rp->pr
a4f0: 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28 20 73  ecsym;.    if( s
a500: 70 78 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d 30 20  px==0 || spy==0 
a510: 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c  || spx->prec<0 |
a520: 7c 0a 20 20 20 20 73 70 79 2d 3e 70 72 65 63 3c  |.    spy->prec<
a530: 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3d 3d  0 || spx->prec==
a540: 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20  spy->prec ){.   
a550: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52     apy->type = R
a560: 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20  RCONFLICT;.     
a570: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d   errcnt++;.    }
a580: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
a590: 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a  ec>spy->prec ){.
a5a0: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20        apy->type 
a5b0: 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = RD_RESOLVED;. 
a5c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78     }else if( spx
a5d0: 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63  ->prec<spy->prec
a5e0: 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ){.      apx->t
a5f0: 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45  ype = RD_RESOLVE
a600: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  D;.    }.  }else
a610: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 0a 20 20  {.    assert(.  
a620: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53      apx->type==S
a630: 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20  H_RESOLVED ||.  
a640: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52      apx->type==R
a650: 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20  D_RESOLVED ||.  
a660: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53      apx->type==S
a670: 53 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20  SCONFLICT ||.   
a680: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 52     apx->type==SR
a690: 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20  CONFLICT ||.    
a6a0: 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 52 43    apx->type==RRC
a6b0: 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20  ONFLICT ||.     
a6c0: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 5f 52   apy->type==SH_R
a6d0: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
a6e0: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 44 5f 52   apy->type==RD_R
a6f0: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
a700: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 53 43 4f   apy->type==SSCO
a710: 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20  NFLICT ||.      
a720: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e  apy->type==SRCON
a730: 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61  FLICT ||.      a
a740: 70 79 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46  py->type==RRCONF
a750: 4c 49 43 54 0a 20 20 20 20 29 3b 0a 20 20 20 20  LICT.    );.    
a760: 2f 2a 20 54 68 65 20 52 45 44 55 43 45 2f 53 48  /* The REDUCE/SH
a770: 49 46 54 20 63 61 73 65 20 63 61 6e 6e 6f 74 20  IFT case cannot 
a780: 68 61 70 70 65 6e 20 62 65 63 61 75 73 65 20 53  happen because S
a790: 48 49 46 54 73 20 63 6f 6d 65 20 62 65 66 6f 72  HIFTs come befor
a7a0: 65 0a 20 20 20 20 2a 2a 20 52 45 44 55 43 45 73  e.    ** REDUCEs
a7b0: 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 20 20 49   on the list.  I
a7c0: 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
a7d0: 70 6f 69 6e 74 20 69 74 20 6d 75 73 74 20 62 65  point it must be
a7e0: 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   because.    ** 
a7f0: 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e 66 6c  the parser confl
a800: 69 63 74 20 68 61 64 20 61 6c 72 65 61 64 79 20  ict had already 
a810: 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a  been resolved. *
a820: 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  /.  }.  return e
a830: 72 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  rrcnt;.}./******
a840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
a850: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 63  From the file "c
a860: 6f 6e 66 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a  onfiglist.c" ***
a870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a880: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
a890: 75 74 69 6e 65 73 20 74 6f 20 70 72 6f 63 65 73  utines to proces
a8a0: 73 69 6e 67 20 61 20 63 6f 6e 66 69 67 75 72 61  sing a configura
a8b0: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 62 75  tion list and bu
a8c0: 69 6c 64 69 6e 67 20 61 20 73 74 61 74 65 0a 2a  ilding a state.*
a8d0: 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  * in the LEMON p
a8e0: 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
a8f0: 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 73 74 72 75  .*/..static stru
a900: 63 74 20 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c  ct config *freel
a910: 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ist = 0;      /*
a920: 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 63 6f   List of free co
a930: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a  nfigurations */.
a940: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f  static struct co
a950: 6e 66 69 67 20 2a 63 75 72 72 65 6e 74 20 3d 20  nfig *current = 
a960: 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  0;       /* Top 
a970: 6f 66 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69  of list of confi
a980: 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  gurations */.sta
a990: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
a9a0: 67 20 2a 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d  g **currentend =
a9b0: 20 30 3b 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e   0;   /* Last on
a9c0: 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 73   list of configs
a9d0: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
a9e0: 74 20 63 6f 6e 66 69 67 20 2a 62 61 73 69 73 20  t config *basis 
a9f0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
aa00: 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 62  Top of list of b
aa10: 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a  asis configs */.
aa20: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f  static struct co
aa30: 6e 66 69 67 20 2a 2a 62 61 73 69 73 65 6e 64 20  nfig **basisend 
aa40: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20  = 0;     /* End 
aa50: 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73  of list of basis
aa60: 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20   configs */../* 
aa70: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
aa80: 20 74 6f 20 61 20 6e 65 77 20 63 6f 6e 66 69 67   to a new config
aa90: 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41  uration */.PRIVA
aaa0: 54 45 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  TE struct config
aab0: 20 2a 6e 65 77 63 6f 6e 66 69 67 28 76 6f 69 64   *newconfig(void
aac0: 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  ){.  struct conf
aad0: 69 67 20 2a 6e 65 77 63 66 67 3b 0a 20 20 69 66  ig *newcfg;.  if
aae0: 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b  ( freelist==0 ){
aaf0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
ab00: 69 6e 74 20 61 6d 74 20 3d 20 33 3b 0a 20 20 20  int amt = 3;.   
ab10: 20 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72   freelist = (str
ab20: 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 63 61 6c  uct config *)cal
ab30: 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66  loc( amt, sizeof
ab40: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 29 20  (struct config) 
ab50: 29 3b 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c  );.    if( freel
ab60: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
ab70: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
ab80: 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  Unable to alloca
ab90: 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20  te memory for a 
aba0: 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  new configuratio
abb0: 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74  n.");.      exit
abc0: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  (1);.    }.    f
abd0: 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b  or(i=0; i<amt-1;
abe0: 20 69 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69   i++) freelist[i
abf0: 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69  ].next = &freeli
ac00: 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65  st[i+1];.    fre
ac10: 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78  elist[amt-1].nex
ac20: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77  t = 0;.  }.  new
ac30: 63 66 67 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a  cfg = freelist;.
ac40: 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65    freelist = fre
ac50: 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72  elist->next;.  r
ac60: 65 74 75 72 6e 20 6e 65 77 63 66 67 3b 0a 7d 0a  eturn newcfg;.}.
ac70: 0a 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67 75 72  ./* The configur
ac80: 61 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73 20 6e  ation "old" is n
ac90: 6f 20 6c 6f 6e 67 65 72 20 75 73 65 64 20 2a 2f  o longer used */
aca0: 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 64 65  .PRIVATE void de
acb0: 6c 65 74 65 63 6f 6e 66 69 67 28 73 74 72 75 63  leteconfig(struc
acc0: 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 29 0a 7b  t config *old).{
acd0: 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74 20 3d 20 66  .  old->next = f
ace0: 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c  reelist;.  freel
acf0: 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a  ist = old;.}../*
ad00: 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65   Initialized the
ad10: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
ad20: 69 73 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76  ist builder */.v
ad30: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69  oid Configlist_i
ad40: 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 63 75 72  nit(void){.  cur
ad50: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72  rent = 0;.  curr
ad60: 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e  entend = &curren
ad70: 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a  t;.  basis = 0;.
ad80: 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61    basisend = &ba
ad90: 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62  sis;.  Configtab
ada0: 6c 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72 65 74  le_init();.  ret
adb0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69  urn;.}../* Initi
adc0: 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69  alized the confi
add0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75  guration list bu
ade0: 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f  ilder */.void Co
adf0: 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 76  nfiglist_reset(v
ae00: 6f 69 64 29 7b 0a 20 20 63 75 72 72 65 6e 74 20  oid){.  current 
ae10: 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e  = 0;.  currenten
ae20: 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20  d = &current;.  
ae30: 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73  basis = 0;.  bas
ae40: 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a  isend = &basis;.
ae50: 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c    Configtable_cl
ae60: 65 61 72 28 30 29 3b 0a 20 20 72 65 74 75 72 6e  ear(0);.  return
ae70: 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f 74  ;.}../* Add anot
ae80: 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  her configuratio
ae90: 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75  n to the configu
aea0: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73  ration list */.s
aeb0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
aec0: 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 0a 20 20  nfiglist_add(.  
aed0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
aee0: 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 20      /* The rule 
aef0: 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 20 20 20 20  */.  int dot    
af00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
af10: 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53 20 6f  x into the RHS o
af20: 66 20 74 68 65 20 72 75 6c 65 20 77 68 65 72 65  f the rule where
af30: 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20 2a 2f   the dot goes */
af40: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  .){.  struct con
af50: 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b  fig *cfp, model;
af60: 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72  ..  assert( curr
af70: 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d  entend!=0 );.  m
af80: 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20  odel.rp = rp;.  
af90: 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b  model.dot = dot;
afa0: 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74  .  cfp = Configt
afb0: 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c  able_find(&model
afc0: 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20  );.  if( cfp==0 
afd0: 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77  ){.    cfp = new
afe0: 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66  config();.    cf
aff0: 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20  p->rp = rp;.    
b000: 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a  cfp->dot = dot;.
b010: 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53      cfp->fws = S
b020: 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70  etNew();.    cfp
b030: 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63  ->stp = 0;.    c
b040: 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e  fp->fplp = cfp->
b050: 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66  bplp = 0;.    cf
b060: 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20  p->next = 0;.   
b070: 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20   cfp->bp = 0;.  
b080: 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20    *currentend = 
b090: 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74  cfp;.    current
b0a0: 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74  end = &cfp->next
b0b0: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c  ;.    Configtabl
b0c0: 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20  e_insert(cfp);. 
b0d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b   }.  return cfp;
b0e0: 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62 61 73  .}../* Add a bas
b0f0: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
b100: 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72   to the configur
b110: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74  ation list */.st
b120: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
b130: 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73  figlist_addbasis
b140: 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70  (struct rule *rp
b150: 2c 20 69 6e 74 20 64 6f 74 29 0a 7b 0a 20 20 73  , int dot).{.  s
b160: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
b170: 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73  p, model;..  ass
b180: 65 72 74 28 20 62 61 73 69 73 65 6e 64 21 3d 30  ert( basisend!=0
b190: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
b1a0: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
b1b0: 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a   model.rp = rp;.
b1c0: 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f    model.dot = do
b1d0: 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  t;.  cfp = Confi
b1e0: 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64  gtable_find(&mod
b1f0: 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d  el);.  if( cfp==
b200: 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e  0 ){.    cfp = n
b210: 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20  ewconfig();.    
b220: 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20  cfp->rp = rp;.  
b230: 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74    cfp->dot = dot
b240: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d  ;.    cfp->fws =
b250: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63   SetNew();.    c
b260: 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20  fp->stp = 0;.   
b270: 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70   cfp->fplp = cfp
b280: 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20  ->bplp = 0;.    
b290: 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20  cfp->next = 0;. 
b2a0: 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a     cfp->bp = 0;.
b2b0: 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20      *currentend 
b2c0: 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65  = cfp;.    curre
b2d0: 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65  ntend = &cfp->ne
b2e0: 78 74 3b 0a 20 20 20 20 2a 62 61 73 69 73 65 6e  xt;.    *basisen
b2f0: 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 62 61 73  d = cfp;.    bas
b300: 69 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e 62 70  isend = &cfp->bp
b310: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c  ;.    Configtabl
b320: 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20  e_insert(cfp);. 
b330: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b   }.  return cfp;
b340: 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74  .}../* Compute t
b350: 68 65 20 63 6c 6f 73 75 72 65 20 6f 66 20 74 68  he closure of th
b360: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
b370: 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  list */.void Con
b380: 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28  figlist_closure(
b390: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
b3a0: 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63  mp).{.  struct c
b3b0: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6e 65 77  onfig *cfp, *new
b3c0: 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75  cfp;.  struct ru
b3d0: 6c 65 20 2a 72 70 2c 20 2a 6e 65 77 72 70 3b 0a  le *rp, *newrp;.
b3e0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
b3f0: 2a 73 70 2c 20 2a 78 73 70 3b 0a 20 20 69 6e 74  *sp, *xsp;.  int
b400: 20 69 2c 20 64 6f 74 3b 0a 0a 20 20 61 73 73 65   i, dot;..  asse
b410: 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d  rt( currentend!=
b420: 30 20 29 3b 0a 20 20 66 6f 72 28 63 66 70 3d 63  0 );.  for(cfp=c
b430: 75 72 72 65 6e 74 3b 20 63 66 70 3b 20 63 66 70  urrent; cfp; cfp
b440: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
b450: 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20   rp = cfp->rp;. 
b460: 20 20 20 64 6f 74 20 3d 20 63 66 70 2d 3e 64 6f     dot = cfp->do
b470: 74 3b 0a 20 20 20 20 69 66 28 20 64 6f 74 3e 3d  t;.    if( dot>=
b480: 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69  rp->nrhs ) conti
b490: 6e 75 65 3b 0a 20 20 20 20 73 70 20 3d 20 72 70  nue;.    sp = rp
b4a0: 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20 20 20 20  ->rhs[dot];.    
b4b0: 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f  if( sp->type==NO
b4c0: 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  NTERMINAL ){.   
b4d0: 20 20 20 69 66 28 20 73 70 2d 3e 72 75 6c 65 3d     if( sp->rule=
b4e0: 3d 30 20 26 26 20 73 70 21 3d 6c 65 6d 70 2d 3e  =0 && sp!=lemp->
b4f0: 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20  errsym ){.      
b500: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
b510: 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69  >filename,rp->li
b520: 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20  ne,"Nonterminal 
b530: 5c 22 25 73 5c 22 20 68 61 73 20 6e 6f 20 72 75  \"%s\" has no ru
b540: 6c 65 73 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  les.",.         
b550: 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
b560: 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
b570: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt++;.      }.  
b580: 20 20 20 20 66 6f 72 28 6e 65 77 72 70 3d 73 70      for(newrp=sp
b590: 2d 3e 72 75 6c 65 3b 20 6e 65 77 72 70 3b 20 6e  ->rule; newrp; n
b5a0: 65 77 72 70 3d 6e 65 77 72 70 2d 3e 6e 65 78 74  ewrp=newrp->next
b5b0: 6c 68 73 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  lhs){.        ne
b5c0: 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73  wcfp = Configlis
b5d0: 74 5f 61 64 64 28 6e 65 77 72 70 2c 30 29 3b 0a  t_add(newrp,0);.
b5e0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 64 6f          for(i=do
b5f0: 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  t+1; i<rp->nrhs;
b600: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
b610: 20 78 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   xsp = rp->rhs[i
b620: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
b630: 20 78 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d   xsp->type==TERM
b640: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
b650: 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66      SetAdd(newcf
b660: 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 69 6e 64 65  p->fws,xsp->inde
b670: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x);.            
b680: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b690: 20 7d 65 6c 73 65 20 69 66 28 20 78 73 70 2d 3e   }else if( xsp->
b6a0: 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
b6b0: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
b6c0: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
b6d0: 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
b6e0: 3c 78 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b  <xsp->nsubsym; k
b6f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
b700: 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70     SetAdd(newcfp
b710: 2d 3e 66 77 73 2c 20 78 73 70 2d 3e 73 75 62 73  ->fws, xsp->subs
b720: 79 6d 5b 6b 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20  ym[k]->index);. 
b730: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
b740: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b750: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
b760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74  .            Set
b770: 55 6e 69 6f 6e 28 6e 65 77 63 66 70 2d 3e 66 77  Union(newcfp->fw
b780: 73 2c 78 73 70 2d 3e 66 69 72 73 74 73 65 74 29  s,xsp->firstset)
b790: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
b7a0: 28 20 78 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c  ( xsp->lambda==L
b7b0: 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65  EMON_FALSE ) bre
b7c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
b7d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b7e0: 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68    if( i==rp->nrh
b7f0: 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28 26 63  s ) Plink_add(&c
b800: 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66 70 29  fp->fplp,newcfp)
b810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b820: 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a    }.  return;.}.
b830: 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e  ./* Sort the con
b840: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
b850: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
b860: 73 74 5f 73 6f 72 74 28 76 6f 69 64 29 7b 0a 20  st_sort(void){. 
b870: 20 63 75 72 72 65 6e 74 20 3d 20 28 73 74 72 75   current = (stru
b880: 63 74 20 63 6f 6e 66 69 67 2a 29 6d 73 6f 72 74  ct config*)msort
b890: 28 28 63 68 61 72 2a 29 63 75 72 72 65 6e 74 2c  ((char*)current,
b8a0: 28 63 68 61 72 2a 2a 29 26 28 63 75 72 72 65 6e  (char**)&(curren
b8b0: 74 2d 3e 6e 65 78 74 29 2c 0a 20 20 20 20 20 20  t->next),.      
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 66              Conf
b8e0: 69 67 63 6d 70 29 3b 0a 20 20 63 75 72 72 65 6e  igcmp);.  curren
b8f0: 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  tend = 0;.  retu
b900: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74  rn;.}../* Sort t
b910: 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  he basis configu
b920: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76  ration list */.v
b930: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73  oid Configlist_s
b940: 6f 72 74 62 61 73 69 73 28 76 6f 69 64 29 7b 0a  ortbasis(void){.
b950: 20 20 62 61 73 69 73 20 3d 20 28 73 74 72 75 63    basis = (struc
b960: 74 20 63 6f 6e 66 69 67 2a 29 6d 73 6f 72 74 28  t config*)msort(
b970: 28 63 68 61 72 2a 29 63 75 72 72 65 6e 74 2c 28  (char*)current,(
b980: 63 68 61 72 2a 2a 29 26 28 63 75 72 72 65 6e 74  char**)&(current
b990: 2d 3e 62 70 29 2c 0a 20 20 20 20 20 20 20 20 20  ->bp),.         
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9b0: 20 20 20 20 20 20 20 43 6f 6e 66 69 67 63 6d 70         Configcmp
b9c0: 29 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20  );.  basisend = 
b9d0: 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  0;.  return;.}..
b9e0: 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
b9f0: 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
ba00: 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  of the configura
ba10: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  tion list and.**
ba20: 20 72 65 73 65 74 20 74 68 65 20 6c 69 73 74 20   reset the list 
ba30: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
ba40: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74   *Configlist_ret
ba50: 75 72 6e 28 76 6f 69 64 29 7b 0a 20 20 73 74 72  urn(void){.  str
ba60: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b  uct config *old;
ba70: 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e 74  .  old = current
ba80: 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b  ;.  current = 0;
ba90: 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20  .  currentend = 
baa0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b  0;.  return old;
bab0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
bac0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
bad0: 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69  ead of the confi
bae0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  guration list an
baf0: 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c  d.** reset the l
bb00: 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ist */.struct co
bb10: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
bb20: 5f 62 61 73 69 73 28 76 6f 69 64 29 7b 0a 20 20  _basis(void){.  
bb30: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f  struct config *o
bb40: 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 62 61 73 69  ld;.  old = basi
bb50: 73 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a  s;.  basis = 0;.
bb60: 20 20 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a    basisend = 0;.
bb70: 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a    return old;.}.
bb80: 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 65 6c 65  ./* Free all ele
bb90: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 67 69 76  ments of the giv
bba0: 65 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  en configuration
bbb0: 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f   list */.void Co
bbc0: 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 73 74 72  nfiglist_eat(str
bbd0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 29  uct config *cfp)
bbe0: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
bbf0: 69 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66  ig *nextcfp;.  f
bc00: 6f 72 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65  or(; cfp; cfp=ne
bc10: 78 74 63 66 70 29 7b 0a 20 20 20 20 6e 65 78 74  xtcfp){.    next
bc20: 63 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b  cfp = cfp->next;
bc30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 66 70  .    assert( cfp
bc40: 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20  ->fplp==0 );.   
bc50: 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e 62 70   assert( cfp->bp
bc60: 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  lp==0 );.    if(
bc70: 20 63 66 70 2d 3e 66 77 73 20 29 20 53 65 74 46   cfp->fws ) SetF
bc80: 72 65 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20  ree(cfp->fws);. 
bc90: 20 20 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28     deleteconfig(
bca0: 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  cfp);.  }.  retu
bcb0: 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  rn;.}./*********
bcc0: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
bcd0: 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 63 22  e file "error.c"
bce0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
bcf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd00: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66  **/./*.** Code f
bd10: 6f 72 20 70 72 69 6e 74 69 6e 67 20 65 72 72 6f  or printing erro
bd20: 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 76  r message..*/..v
bd30: 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f 6e  oid ErrorMsg(con
bd40: 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  st char *filenam
bd50: 65 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63  e, int lineno, c
bd60: 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72 6d 61  onst char *forma
bd70: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
bd80: 73 74 20 61 70 3b 0a 20 20 66 70 72 69 6e 74 66  st ap;.  fprintf
bd90: 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
bda0: 20 22 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 6c 69   ", filename, li
bdb0: 6e 65 6e 6f 29 3b 0a 20 20 76 61 5f 73 74 61 72  neno);.  va_star
bdc0: 74 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20  t(ap, format);. 
bdd0: 20 76 66 70 72 69 6e 74 66 28 73 74 64 65 72 72   vfprintf(stderr
bde0: 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76  ,format,ap);.  v
bdf0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 70 72  a_end(ap);.  fpr
be00: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e  intf(stderr, "\n
be10: 22 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ");.}./*********
be20: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
be30: 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a   file "main.c" *
be40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be60: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20  ***/./*.** Main 
be70: 70 72 6f 67 72 61 6d 20 66 69 6c 65 20 66 6f 72  program file for
be80: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
be90: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
bea0: 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75  ./* Report an ou
beb0: 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64  t-of-memory cond
bec0: 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e  ition and abort.
bed0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a    This function.
bee0: 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f 73 74 6c  ** is used mostl
bef0: 79 20 62 79 20 74 68 65 20 22 4d 65 6d 6f 72 79  y by the "Memory
bf00: 43 68 65 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20  Check" macro in 
bf10: 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64  struct.h.*/.void
bf20: 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 76 6f   memory_error(vo
bf30: 69 64 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73  id){.  fprintf(s
bf40: 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65  tderr,"Out of me
bf50: 6d 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e 67 2e  mory.  Aborting.
bf60: 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28 31  ..\n");.  exit(1
bf70: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
bf80: 20 6e 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 20   nDefine = 0;   
bf90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bfa0: 2d 44 20 6f 70 74 69 6f 6e 73 20 6f 6e 20 74 68  -D options on th
bfb0: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a  e command line *
bfc0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a  /.static char **
bfd0: 61 7a 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 2f  azDefine = 0;  /
bfe0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 2d 44  * Name of the -D
bff0: 20 6d 61 63 72 6f 73 20 2a 2f 0a 0a 2f 2a 20 54   macros */../* T
c000: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
c010: 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 61  alled with the a
c020: 72 67 75 6d 65 6e 74 20 74 6f 20 65 61 63 68 20  rgument to each 
c030: 2d 44 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  -D command-line 
c040: 6f 70 74 69 6f 6e 2e 0a 2a 2a 20 41 64 64 20 74  option..** Add t
c050: 68 65 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64  he macro defined
c060: 20 74 6f 20 74 68 65 20 61 7a 44 65 66 69 6e 65   to the azDefine
c070: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
c080: 63 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f 44 5f  c void handle_D_
c090: 6f 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b  option(char *z){
c0a0: 0a 20 20 63 68 61 72 20 2a 2a 70 61 7a 3b 0a 20  .  char **paz;. 
c0b0: 20 6e 44 65 66 69 6e 65 2b 2b 3b 0a 20 20 61 7a   nDefine++;.  az
c0c0: 44 65 66 69 6e 65 20 3d 20 28 63 68 61 72 20 2a  Define = (char *
c0d0: 2a 29 20 72 65 61 6c 6c 6f 63 28 61 7a 44 65 66  *) realloc(azDef
c0e0: 69 6e 65 2c 20 73 69 7a 65 6f 66 28 61 7a 44 65  ine, sizeof(azDe
c0f0: 66 69 6e 65 5b 30 5d 29 2a 6e 44 65 66 69 6e 65  fine[0])*nDefine
c100: 29 3b 0a 20 20 69 66 28 20 61 7a 44 65 66 69 6e  );.  if( azDefin
c110: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  e==0 ){.    fpri
c120: 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20  ntf(stderr,"out 
c130: 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  of memory\n");. 
c140: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
c150: 20 20 70 61 7a 20 3d 20 26 61 7a 44 65 66 69 6e    paz = &azDefin
c160: 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 3b 0a 20 20  e[nDefine-1];.  
c170: 2a 70 61 7a 20 3d 20 28 63 68 61 72 20 2a 29 20  *paz = (char *) 
c180: 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72  malloc( lemonStr
c190: 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66  len(z)+1 );.  if
c1a0: 28 20 2a 70 61 7a 3d 3d 30 20 29 7b 0a 20 20 20  ( *paz==0 ){.   
c1b0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
c1c0: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e  "out of memory\n
c1d0: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
c1e0: 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72  .  }.  lemon_str
c1f0: 63 70 79 28 2a 70 61 7a 2c 20 7a 29 3b 0a 20 20  cpy(*paz, z);.  
c200: 66 6f 72 28 7a 3d 2a 70 61 7a 3b 20 2a 7a 20 26  for(z=*paz; *z &
c210: 26 20 2a 7a 21 3d 27 3d 27 3b 20 7a 2b 2b 29 7b  & *z!='='; z++){
c220: 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 73  }.  *z = 0;.}..s
c230: 74 61 74 69 63 20 63 68 61 72 20 2a 75 73 65 72  tatic char *user
c240: 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20 3d 20  _templatename = 
c250: 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 76 6f 69  NULL;.static voi
c260: 64 20 68 61 6e 64 6c 65 5f 54 5f 6f 70 74 69 6f  d handle_T_optio
c270: 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 73  n(char *z){.  us
c280: 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20  er_templatename 
c290: 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f  = (char *) mallo
c2a0: 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a  c( lemonStrlen(z
c2b0: 29 2b 31 20 29 3b 0a 20 20 69 66 28 20 75 73 65  )+1 );.  if( use
c2c0: 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 3d 3d  r_templatename==
c2d0: 30 20 29 7b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f  0 ){.    memory_
c2e0: 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 6c  error();.  }.  l
c2f0: 65 6d 6f 6e 5f 73 74 72 63 70 79 28 75 73 65 72  emon_strcpy(user
c300: 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 20 7a  _templatename, z
c310: 29 3b 0a 7d 0a 0a 2f 2a 20 4d 65 72 67 65 20 74  );.}../* Merge t
c320: 6f 67 65 74 68 65 72 20 74 6f 20 6c 69 73 74 73  ogether to lists
c330: 20 6f 66 20 72 75 6c 65 73 20 6f 72 64 65 72 65   of rules ordere
c340: 64 20 62 79 20 72 75 6c 65 2e 69 52 75 6c 65 20  d by rule.iRule 
c350: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
c360: 20 72 75 6c 65 20 2a 52 75 6c 65 5f 6d 65 72 67   rule *Rule_merg
c370: 65 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70  e(struct rule *p
c380: 41 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  A, struct rule *
c390: 70 42 29 7b 0a 20 20 73 74 72 75 63 74 20 72 75  pB){.  struct ru
c3a0: 6c 65 20 2a 70 46 69 72 73 74 20 3d 20 30 3b 0a  le *pFirst = 0;.
c3b0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 2a    struct rule **
c3c0: 70 70 50 72 65 76 20 3d 20 26 70 46 69 72 73 74  ppPrev = &pFirst
c3d0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26 26  ;.  while( pA &&
c3e0: 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28 20 70   pB ){.    if( p
c3f0: 41 2d 3e 69 52 75 6c 65 3c 70 42 2d 3e 69 52 75  A->iRule<pB->iRu
c400: 6c 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50  le ){.      *ppP
c410: 72 65 76 20 3d 20 70 41 3b 0a 20 20 20 20 20 20  rev = pA;.      
c420: 70 70 50 72 65 76 20 3d 20 26 70 41 2d 3e 6e 65  ppPrev = &pA->ne
c430: 78 74 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70  xt;.      pA = p
c440: 41 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  A->next;.    }el
c450: 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 72 65  se{.      *ppPre
c460: 76 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 70  v = pB;.      pp
c470: 50 72 65 76 20 3d 20 26 70 42 2d 3e 6e 65 78 74  Prev = &pB->next
c480: 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d  ;.      pB = pB-
c490: 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  >next;.    }.  }
c4a0: 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20  .  if( pA ){.   
c4b0: 20 2a 70 70 50 72 65 76 20 3d 20 70 41 3b 0a 20   *ppPrev = pA;. 
c4c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
c4d0: 72 65 76 20 3d 20 70 42 3b 0a 20 20 7d 0a 20 20  rev = pB;.  }.  
c4e0: 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d  return pFirst;.}
c4f0: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 61 20 6c  ../*.** Sort a l
c500: 69 73 74 20 6f 66 20 72 75 6c 65 73 20 69 6e 20  ist of rules in 
c510: 6f 72 64 65 72 20 6f 66 20 69 6e 63 72 65 61 73  order of increas
c520: 69 6e 67 20 69 52 75 6c 65 20 76 61 6c 75 65 0a  ing iRule value.
c530: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
c540: 20 72 75 6c 65 20 2a 52 75 6c 65 5f 73 6f 72 74   rule *Rule_sort
c550: 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70  (struct rule *rp
c560: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
c570: 72 75 63 74 20 72 75 6c 65 20 2a 70 4e 65 78 74  ruct rule *pNext
c580: 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
c590: 2a 78 5b 33 32 5d 3b 0a 20 20 6d 65 6d 73 65 74  *x[32];.  memset
c5a0: 28 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29  (x, 0, sizeof(x)
c5b0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 70 20 29  );.  while( rp )
c5c0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 72 70  {.    pNext = rp
c5d0: 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 72 70 2d 3e  ->next;.    rp->
c5e0: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  next = 0;.    fo
c5f0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
c600: 78 29 2f 73 69 7a 65 6f 66 28 78 5b 30 5d 29 20  x)/sizeof(x[0]) 
c610: 26 26 20 78 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  && x[i]; i++){. 
c620: 20 20 20 20 20 72 70 20 3d 20 52 75 6c 65 5f 6d       rp = Rule_m
c630: 65 72 67 65 28 78 5b 69 5d 2c 20 72 70 29 3b 0a  erge(x[i], rp);.
c640: 20 20 20 20 20 20 78 5b 69 5d 20 3d 20 30 3b 0a        x[i] = 0;.
c650: 20 20 20 20 7d 0a 20 20 20 20 78 5b 69 5d 20 3d      }.    x[i] =
c660: 20 72 70 3b 0a 20 20 20 20 72 70 20 3d 20 70 4e   rp;.    rp = pN
c670: 65 78 74 3b 0a 20 20 7d 0a 20 20 72 70 20 3d 20  ext;.  }.  rp = 
c680: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
c690: 73 69 7a 65 6f 66 28 78 29 2f 73 69 7a 65 6f 66  sizeof(x)/sizeof
c6a0: 28 78 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  (x[0]); i++){.  
c6b0: 20 20 72 70 20 3d 20 52 75 6c 65 5f 6d 65 72 67    rp = Rule_merg
c6c0: 65 28 78 5b 69 5d 2c 20 72 70 29 3b 0a 20 20 7d  e(x[i], rp);.  }
c6d0: 0a 20 20 72 65 74 75 72 6e 20 72 70 3b 0a 7d 0a  .  return rp;.}.
c6e0: 0a 2f 2a 20 66 6f 72 77 61 72 64 20 72 65 66 65  ./* forward refe
c6f0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
c700: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69  const char *mini
c710: 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e  mum_size_type(in
c720: 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 2c 20  t lwr, int upr, 
c730: 69 6e 74 20 2a 70 6e 42 79 74 65 29 3b 0a 0a 2f  int *pnByte);../
c740: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
c750: 20 6c 69 6e 65 20 6f 66 20 74 68 65 20 22 50 61   line of the "Pa
c760: 72 73 65 72 20 53 74 61 74 73 22 20 6f 75 74 70  rser Stats" outp
c770: 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ut.*/.static voi
c780: 64 20 73 74 61 74 73 5f 6c 69 6e 65 28 63 6f 6e  d stats_line(con
c790: 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c  st char *zLabel,
c7a0: 20 69 6e 74 20 69 56 61 6c 75 65 29 7b 0a 20 20   int iValue){.  
c7b0: 69 6e 74 20 6e 4c 61 62 65 6c 20 3d 20 6c 65 6d  int nLabel = lem
c7c0: 6f 6e 53 74 72 6c 65 6e 28 7a 4c 61 62 65 6c 29  onStrlen(zLabel)
c7d0: 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 20 25 73  ;.  printf("  %s
c7e0: 25 2e 2a 73 20 25 35 64 5c 6e 22 2c 20 7a 4c 61  %.*s %5d\n", zLa
c7f0: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 33 35  bel,.         35
c800: 2d 6e 4c 61 62 65 6c 2c 20 22 2e 2e 2e 2e 2e 2e  -nLabel, "......
c810: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
c820: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 22 2c 0a 20 20 20  ..........",.   
c830: 20 20 20 20 20 20 69 56 61 6c 75 65 29 3b 0a 7d        iValue);.}
c840: 0a 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70 72  ../* The main pr
c850: 6f 67 72 61 6d 2e 20 20 50 61 72 73 65 20 74 68  ogram.  Parse th
c860: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61  e command line a
c870: 6e 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69  nd do it... */.i
c880: 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63  nt main(int argc
c890: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 0a 7b  , char **argv).{
c8a0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 76 65  .  static int ve
c8b0: 72 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74 61  rsion = 0;.  sta
c8c0: 74 69 63 20 69 6e 74 20 72 70 66 6c 61 67 20 3d  tic int rpflag =
c8d0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
c8e0: 20 62 61 73 69 73 66 6c 61 67 20 3d 20 30 3b 0a   basisflag = 0;.
c8f0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d    static int com
c900: 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 73 74 61  press = 0;.  sta
c910: 74 69 63 20 69 6e 74 20 71 75 69 65 74 20 3d 20  tic int quiet = 
c920: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
c930: 73 74 61 74 69 73 74 69 63 73 20 3d 20 30 3b 0a  statistics = 0;.
c940: 20 20 73 74 61 74 69 63 20 69 6e 74 20 6d 68 66    static int mhf
c950: 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  lag = 0;.  stati
c960: 63 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66  c int nolinenosf
c970: 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  lag = 0;.  stati
c980: 63 20 69 6e 74 20 6e 6f 52 65 73 6f 72 74 20 3d  c int noResort =
c990: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72   0;.  static str
c9a0: 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70  uct s_options op
c9b0: 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  tions[] = {.    
c9c0: 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20  {OPT_FLAG, "b", 
c9d0: 28 63 68 61 72 2a 29 26 62 61 73 69 73 66 6c 61  (char*)&basisfla
c9e0: 67 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74  g, "Print only t
c9f0: 68 65 20 62 61 73 69 73 20 69 6e 20 72 65 70 6f  he basis in repo
ca00: 72 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  rt."},.    {OPT_
ca10: 46 4c 41 47 2c 20 22 63 22 2c 20 28 63 68 61 72  FLAG, "c", (char
ca20: 2a 29 26 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f  *)&compress, "Do
ca30: 6e 27 74 20 63 6f 6d 70 72 65 73 73 20 74 68 65  n't compress the
ca40: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d   action table."}
ca50: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c  ,.    {OPT_FSTR,
ca60: 20 22 44 22 2c 20 28 63 68 61 72 2a 29 68 61 6e   "D", (char*)han
ca70: 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22 44  dle_D_option, "D
ca80: 65 66 69 6e 65 20 61 6e 20 25 69 66 64 65 66 20  efine an %ifdef 
ca90: 6d 61 63 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b 4f  macro."},.    {O
caa0: 50 54 5f 46 53 54 52 2c 20 22 66 22 2c 20 30 2c  PT_FSTR, "f", 0,
cab0: 20 22 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61   "Ignored.  (Pla
cac0: 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 2d 66 20  ceholder for -f 
cad0: 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73  compiler options
cae0: 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  .)"},.    {OPT_F
caf0: 4c 41 47 2c 20 22 67 22 2c 20 28 63 68 61 72 2a  LAG, "g", (char*
cb00: 29 26 72 70 66 6c 61 67 2c 20 22 50 72 69 6e 74  )&rpflag, "Print
cb10: 20 67 72 61 6d 6d 61 72 20 77 69 74 68 6f 75 74   grammar without
cb20: 20 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20   actions."},.   
cb30: 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 49 22 2c   {OPT_FSTR, "I",
cb40: 20 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20 20 28   0, "Ignored.  (
cb50: 50 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20  Placeholder for 
cb60: 27 2d 49 27 20 63 6f 6d 70 69 6c 65 72 20 6f 70  '-I' compiler op
cb70: 74 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20 20 7b  tions.)"},.    {
cb80: 4f 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28  OPT_FLAG, "m", (
cb90: 63 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22  char*)&mhflag, "
cba0: 4f 75 74 70 75 74 20 61 20 6d 61 6b 65 68 65 61  Output a makehea
cbb0: 64 65 72 73 20 63 6f 6d 70 61 74 69 62 6c 65 20  ders compatible 
cbc0: 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  file."},.    {OP
cbd0: 54 5f 46 4c 41 47 2c 20 22 6c 22 2c 20 28 63 68  T_FLAG, "l", (ch
cbe0: 61 72 2a 29 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c  ar*)&nolinenosfl
cbf0: 61 67 2c 20 22 44 6f 20 6e 6f 74 20 70 72 69 6e  ag, "Do not prin
cc00: 74 20 23 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e  t #line statemen
cc10: 74 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ts."},.    {OPT_
cc20: 46 53 54 52 2c 20 22 4f 22 2c 20 30 2c 20 22 49  FSTR, "O", 0, "I
cc30: 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63 65 68  gnored.  (Placeh
cc40: 6f 6c 64 65 72 20 66 6f 72 20 27 2d 4f 27 20 63  older for '-O' c
cc50: 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e  ompiler options.
cc60: 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  )"},.    {OPT_FL
cc70: 41 47 2c 20 22 70 22 2c 20 28 63 68 61 72 2a 29  AG, "p", (char*)
cc80: 26 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43  &showPrecedenceC
cc90: 6f 6e 66 6c 69 63 74 2c 0a 20 20 20 20 20 20 20  onflict,.       
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 68               "Sh
ccb0: 6f 77 20 63 6f 6e 66 6c 69 63 74 73 20 72 65 73  ow conflicts res
ccc0: 6f 6c 76 65 64 20 62 79 20 70 72 65 63 65 64 65  olved by precede
ccd0: 6e 63 65 20 72 75 6c 65 73 22 7d 2c 0a 20 20 20  nce rules"},.   
cce0: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c   {OPT_FLAG, "q",
ccf0: 20 28 63 68 61 72 2a 29 26 71 75 69 65 74 2c 20   (char*)&quiet, 
cd00: 22 28 51 75 69 65 74 29 20 44 6f 6e 27 74 20 70  "(Quiet) Don't p
cd10: 72 69 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20  rint the report 
cd20: 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  file."},.    {OP
cd30: 54 5f 46 4c 41 47 2c 20 22 72 22 2c 20 28 63 68  T_FLAG, "r", (ch
cd40: 61 72 2a 29 26 6e 6f 52 65 73 6f 72 74 2c 20 22  ar*)&noResort, "
cd50: 44 6f 20 6e 6f 74 20 73 6f 72 74 20 6f 72 20 72  Do not sort or r
cd60: 65 6e 75 6d 62 65 72 20 73 74 61 74 65 73 22 7d  enumber states"}
cd70: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
cd80: 20 22 73 22 2c 20 28 63 68 61 72 2a 29 26 73 74   "s", (char*)&st
cd90: 61 74 69 73 74 69 63 73 2c 0a 20 20 20 20 20 20  atistics,.      
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 50 72               "Pr
cdc0: 69 6e 74 20 70 61 72 73 65 72 20 73 74 61 74 73  int parser stats
cdd0: 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74   to standard out
cde0: 70 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  put."},.    {OPT
cdf0: 5f 46 4c 41 47 2c 20 22 78 22 2c 20 28 63 68 61  _FLAG, "x", (cha
ce00: 72 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22 50 72  r*)&version, "Pr
ce10: 69 6e 74 20 74 68 65 20 76 65 72 73 69 6f 6e 20  int the version 
ce20: 6e 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b  number."},.    {
ce30: 4f 50 54 5f 46 53 54 52 2c 20 22 54 22 2c 20 28  OPT_FSTR, "T", (
ce40: 63 68 61 72 2a 29 68 61 6e 64 6c 65 5f 54 5f 6f  char*)handle_T_o
ce50: 70 74 69 6f 6e 2c 20 22 53 70 65 63 69 66 79 20  ption, "Specify 
ce60: 61 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 2e  a template file.
ce70: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54  "},.    {OPT_FST
ce80: 52 2c 20 22 57 22 2c 20 30 2c 20 22 49 67 6e 6f  R, "W", 0, "Igno
ce90: 72 65 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64  red.  (Placehold
cea0: 65 72 20 66 6f 72 20 27 2d 57 27 20 63 6f 6d 70  er for '-W' comp
ceb0: 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d  iler options.)"}
cec0: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
ced0: 30 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e  0,0,0}.  };.  in
cee0: 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 69 74 63  t i;.  int exitc
cef0: 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 6c 65  ode;.  struct le
cf00: 6d 6f 6e 20 6c 65 6d 3b 0a 20 20 73 74 72 75 63  mon lem;.  struc
cf10: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 4f  t rule *rp;..  O
cf20: 70 74 49 6e 69 74 28 61 72 67 76 2c 6f 70 74 69  ptInit(argv,opti
cf30: 6f 6e 73 2c 73 74 64 65 72 72 29 3b 0a 20 20 69  ons,stderr);.  i
cf40: 66 28 20 76 65 72 73 69 6f 6e 20 29 7b 0a 20 20  f( version ){.  
cf50: 20 20 20 70 72 69 6e 74 66 28 22 4c 65 6d 6f 6e     printf("Lemon
cf60: 20 76 65 72 73 69 6f 6e 20 31 2e 30 5c 6e 22 29   version 1.0\n")
cf70: 3b 0a 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a  ;.     exit(0);.
cf80: 20 20 7d 0a 20 20 69 66 28 20 4f 70 74 4e 41 72    }.  if( OptNAr
cf90: 67 73 28 29 21 3d 31 20 29 7b 0a 20 20 20 20 66  gs()!=1 ){.    f
cfa0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
cfb0: 78 61 63 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e  xactly one filen
cfc0: 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
cfd0: 72 65 71 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20  required.\n");. 
cfe0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
cff0: 20 20 6d 65 6d 73 65 74 28 26 6c 65 6d 2c 20 30    memset(&lem, 0
d000: 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a  , sizeof(lem));.
d010: 20 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d    lem.errorcnt =
d020: 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61   0;..  /* Initia
d030: 6c 69 7a 65 20 74 68 65 20 6d 61 63 68 69 6e 65  lize the machine
d040: 20 2a 2f 0a 20 20 53 74 72 73 61 66 65 5f 69 6e   */.  Strsafe_in
d050: 69 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69  it();.  Symbol_i
d060: 6e 69 74 28 29 3b 0a 20 20 53 74 61 74 65 5f 69  nit();.  State_i
d070: 6e 69 74 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67  nit();.  lem.arg
d080: 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20  v0 = argv[0];.  
d090: 6c 65 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f  lem.filename = O
d0a0: 70 74 41 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e  ptArg(0);.  lem.
d0b0: 62 61 73 69 73 66 6c 61 67 20 3d 20 62 61 73 69  basisflag = basi
d0c0: 73 66 6c 61 67 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c  sflag;.  lem.nol
d0d0: 69 6e 65 6e 6f 73 66 6c 61 67 20 3d 20 6e 6f 6c  inenosflag = nol
d0e0: 69 6e 65 6e 6f 73 66 6c 61 67 3b 0a 20 20 53 79  inenosflag;.  Sy
d0f0: 6d 62 6f 6c 5f 6e 65 77 28 22 24 22 29 3b 0a 20  mbol_new("$");. 
d100: 20 6c 65 6d 2e 65 72 72 73 79 6d 20 3d 20 53 79   lem.errsym = Sy
d110: 6d 62 6f 6c 5f 6e 65 77 28 22 65 72 72 6f 72 22  mbol_new("error"
d120: 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 2d  );.  lem.errsym-
d130: 3e 75 73 65 43 6e 74 20 3d 20 30 3b 0a 0a 20 20  >useCnt = 0;..  
d140: 2f 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70  /* Parse the inp
d150: 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72  ut file */.  Par
d160: 73 65 28 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20  se(&lem);.  if( 
d170: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 29 20 65  lem.errorcnt ) e
d180: 78 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74  xit(lem.errorcnt
d190: 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 72 75  );.  if( lem.nru
d1a0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  le==0 ){.    fpr
d1b0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 6d 70  intf(stderr,"Emp
d1c0: 74 79 20 67 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b  ty grammar.\n");
d1d0: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
d1e0: 7d 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 61 6e  }..  /* Count an
d1f0: 64 20 69 6e 64 65 78 20 74 68 65 20 73 79 6d 62  d index the symb
d200: 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61 6d 6d  ols of the gramm
d210: 61 72 20 2a 2f 0a 20 20 53 79 6d 62 6f 6c 5f 6e  ar */.  Symbol_n
d220: 65 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b  ew("{default}");
d230: 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d  .  lem.nsymbol =
d240: 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b   Symbol_count();
d250: 0a 20 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d  .  lem.symbols =
d260: 20 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28   Symbol_arrayof(
d270: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
d280: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  lem.nsymbol; i++
d290: 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d  ) lem.symbols[i]
d2a0: 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 71  ->index = i;.  q
d2b0: 73 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73  sort(lem.symbols
d2c0: 2c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2c 73 69 7a  ,lem.nsymbol,siz
d2d0: 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
d2e0: 6c 2a 29 2c 20 53 79 6d 62 6f 6c 63 6d 70 70 29  l*), Symbolcmpp)
d2f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
d300: 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  em.nsymbol; i++)
d310: 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d   lem.symbols[i]-
d320: 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 77 68  >index = i;.  wh
d330: 69 6c 65 28 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73  ile( lem.symbols
d340: 5b 69 2d 31 5d 2d 3e 74 79 70 65 3d 3d 4d 55 4c  [i-1]->type==MUL
d350: 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 20 69 2d  TITERMINAL ){ i-
d360: 2d 3b 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  -; }.  assert( s
d370: 74 72 63 6d 70 28 6c 65 6d 2e 73 79 6d 62 6f 6c  trcmp(lem.symbol
d380: 73 5b 69 2d 31 5d 2d 3e 6e 61 6d 65 2c 22 7b 64  s[i-1]->name,"{d
d390: 65 66 61 75 6c 74 7d 22 29 3d 3d 30 20 29 3b 0a  efault}")==0 );.
d3a0: 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20    lem.nsymbol = 
d3b0: 69 20 2d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31  i - 1;.  for(i=1
d3c0: 3b 20 49 53 55 50 50 45 52 28 6c 65 6d 2e 73 79  ; ISUPPER(lem.sy
d3d0: 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30  mbols[i]->name[0
d3e0: 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e  ]); i++);.  lem.
d3f0: 6e 74 65 72 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a  nterminal = i;..
d400: 20 20 2f 2a 20 41 73 73 69 67 6e 20 73 65 71 75    /* Assign sequ
d410: 65 6e 74 69 61 6c 20 72 75 6c 65 20 6e 75 6d 62  ential rule numb
d420: 65 72 73 2e 20 20 53 74 61 72 74 20 77 69 74 68  ers.  Start with
d430: 20 30 2e 20 20 50 75 74 20 72 75 6c 65 73 20 74   0.  Put rules t
d440: 68 61 74 20 68 61 76 65 20 6e 6f 0a 20 20 2a 2a  hat have no.  **
d450: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 43   reduce action C
d460: 2d 63 6f 64 65 20 61 73 73 6f 63 69 61 74 65 64  -code associated
d470: 20 77 69 74 68 20 74 68 65 6d 20 6c 61 73 74 2c   with them last,
d480: 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 77 69   so that the swi
d490: 74 63 68 28 29 0a 20 20 2a 2a 20 73 74 61 74 65  tch().  ** state
d4a0: 6d 65 6e 74 20 74 68 61 74 20 73 65 6c 65 63 74  ment that select
d4b0: 73 20 72 65 64 75 63 74 69 6f 6e 20 61 63 74 69  s reduction acti
d4c0: 6f 6e 73 20 77 69 6c 6c 20 68 61 76 65 20 61 20  ons will have a 
d4d0: 73 6d 61 6c 6c 65 72 20 6a 75 6d 70 20 74 61 62  smaller jump tab
d4e0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  le..  */.  for(i
d4f0: 3d 30 2c 20 72 70 3d 6c 65 6d 2e 72 75 6c 65 3b  =0, rp=lem.rule;
d500: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
d510: 29 7b 0a 20 20 20 20 72 70 2d 3e 69 52 75 6c 65  ){.    rp->iRule
d520: 20 3d 20 72 70 2d 3e 63 6f 64 65 20 3f 20 69 2b   = rp->code ? i+
d530: 2b 20 3a 20 2d 31 3b 0a 20 20 7d 0a 20 20 66 6f  + : -1;.  }.  fo
d540: 72 28 72 70 3d 6c 65 6d 2e 72 75 6c 65 3b 20 72  r(rp=lem.rule; r
d550: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
d560: 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 69 52 75  .    if( rp->iRu
d570: 6c 65 3c 30 20 29 20 72 70 2d 3e 69 52 75 6c 65  le<0 ) rp->iRule
d580: 20 3d 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6c 65   = i++;.  }.  le
d590: 6d 2e 73 74 61 72 74 52 75 6c 65 20 3d 20 6c 65  m.startRule = le
d5a0: 6d 2e 72 75 6c 65 3b 0a 20 20 6c 65 6d 2e 72 75  m.rule;.  lem.ru
d5b0: 6c 65 20 3d 20 52 75 6c 65 5f 73 6f 72 74 28 6c  le = Rule_sort(l
d5c0: 65 6d 2e 72 75 6c 65 29 3b 0a 0a 20 20 2f 2a 20  em.rule);..  /* 
d5d0: 47 65 6e 65 72 61 74 65 20 61 20 72 65 70 72 69  Generate a repri
d5e0: 6e 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  nt of the gramma
d5f0: 72 2c 20 69 66 20 72 65 71 75 65 73 74 65 64 20  r, if requested 
d600: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
d610: 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72 70 66  ine */.  if( rpf
d620: 6c 61 67 20 29 7b 0a 20 20 20 20 52 65 70 72 69  lag ){.    Repri
d630: 6e 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73  nt(&lem);.  }els
d640: 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  e{.    /* Initia
d650: 6c 69 7a 65 20 74 68 65 20 73 69 7a 65 20 66 6f  lize the size fo
d660: 72 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64  r all follow and
d670: 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20   first sets */. 
d680: 20 20 20 53 65 74 53 69 7a 65 28 6c 65 6d 2e 6e     SetSize(lem.n
d690: 74 65 72 6d 69 6e 61 6c 2b 31 29 3b 0a 0a 20 20  terminal+1);..  
d6a0: 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 70 72    /* Find the pr
d6b0: 65 63 65 64 65 6e 63 65 20 66 6f 72 20 65 76 65  ecedence for eve
d6c0: 72 79 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75  ry production ru
d6d0: 6c 65 20 28 74 68 61 74 20 68 61 73 20 6f 6e 65  le (that has one
d6e0: 29 20 2a 2f 0a 20 20 20 20 46 69 6e 64 52 75 6c  ) */.    FindRul
d6f0: 65 50 72 65 63 65 64 65 6e 63 65 73 28 26 6c 65  ePrecedences(&le
d700: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
d710: 75 74 65 20 74 68 65 20 6c 61 6d 62 64 61 2d 6e  ute the lambda-n
d720: 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20  onterminals and 
d730: 74 68 65 20 66 69 72 73 74 2d 73 65 74 73 20 66  the first-sets f
d740: 6f 72 20 65 76 65 72 79 0a 20 20 20 20 2a 2a 20  or every.    ** 
d750: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20  nonterminal */. 
d760: 20 20 20 46 69 6e 64 46 69 72 73 74 53 65 74 73     FindFirstSets
d770: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
d780: 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30  Compute all LR(0
d790: 29 20 73 74 61 74 65 73 2e 20 20 41 6c 73 6f 20  ) states.  Also 
d7a0: 72 65 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d 73 65  record follow-se
d7b0: 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 0a 20 20  t propagation.  
d7c0: 20 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20 74 68    ** links so th
d7d0: 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65  at the follow-se
d7e0: 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65  t can be compute
d7f0: 64 20 6c 61 74 65 72 20 2a 2f 0a 20 20 20 20 6c  d later */.    l
d800: 65 6d 2e 6e 73 74 61 74 65 20 3d 20 30 3b 0a 20  em.nstate = 0;. 
d810: 20 20 20 46 69 6e 64 53 74 61 74 65 73 28 26 6c     FindStates(&l
d820: 65 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e 73 6f 72  em);.    lem.sor
d830: 74 65 64 20 3d 20 53 74 61 74 65 5f 61 72 72 61  ted = State_arra
d840: 79 6f 66 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  yof();..    /* T
d850: 69 65 20 75 70 20 6c 6f 6f 73 65 20 65 6e 64 73  ie up loose ends
d860: 20 6f 6e 20 74 68 65 20 70 72 6f 70 61 67 61 74   on the propagat
d870: 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20  ion links */.   
d880: 20 46 69 6e 64 4c 69 6e 6b 73 28 26 6c 65 6d 29   FindLinks(&lem)
d890: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  ;..    /* Comput
d8a0: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 20 73 65 74  e the follow set
d8b0: 20 6f 66 20 65 76 65 72 79 20 72 65 64 75 63 69   of every reduci
d8c0: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
d8d0: 6e 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 6f 6c  n */.    FindFol
d8e0: 6c 6f 77 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a  lowSets(&lem);..
d8f0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
d900: 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73  he action tables
d910: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 41 63 74 69   */.    FindActi
d920: 6f 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ons(&lem);..    
d930: 2f 2a 20 43 6f 6d 70 72 65 73 73 20 74 68 65 20  /* Compress the 
d940: 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f  action tables */
d950: 0a 20 20 20 20 69 66 28 20 63 6f 6d 70 72 65 73  .    if( compres
d960: 73 3d 3d 30 20 29 20 43 6f 6d 70 72 65 73 73 54  s==0 ) CompressT
d970: 61 62 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  ables(&lem);..  
d980: 20 20 2f 2a 20 52 65 6f 72 64 65 72 20 61 6e 64    /* Reorder and
d990: 20 72 65 6e 75 6d 62 65 72 20 74 68 65 20 73 74   renumber the st
d9a0: 61 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61  ates so that sta
d9b0: 74 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63  tes with fewer c
d9c0: 68 6f 69 63 65 73 0a 20 20 20 20 2a 2a 20 6f 63  hoices.    ** oc
d9d0: 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20  cur at the end. 
d9e0: 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
d9f0: 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 68 65  mization that he
da00: 6c 70 73 20 6d 61 6b 65 20 74 68 65 0a 20 20 20  lps make the.   
da10: 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 70 61   ** generated pa
da20: 72 73 65 72 20 74 61 62 6c 65 73 20 73 6d 61 6c  rser tables smal
da30: 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ler. */.    if( 
da40: 6e 6f 52 65 73 6f 72 74 3d 3d 30 20 29 20 52 65  noResort==0 ) Re
da50: 73 6f 72 74 53 74 61 74 65 73 28 26 6c 65 6d 29  sortStates(&lem)
da60: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
da70: 74 65 20 61 20 72 65 70 6f 72 74 20 6f 66 20 74  te a report of t
da80: 68 65 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  he parser genera
da90: 74 65 64 2e 20 20 28 74 68 65 20 22 79 2e 6f 75  ted.  (the "y.ou
daa0: 74 70 75 74 22 20 66 69 6c 65 29 20 2a 2f 0a 20  tput" file) */. 
dab0: 20 20 20 69 66 28 20 21 71 75 69 65 74 20 29 20     if( !quiet ) 
dac0: 52 65 70 6f 72 74 4f 75 74 70 75 74 28 26 6c 65  ReportOutput(&le
dad0: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  m);..    /* Gene
dae0: 72 61 74 65 20 74 68 65 20 73 6f 75 72 63 65 20  rate the source 
daf0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61 72  code for the par
db00: 73 65 72 20 2a 2f 0a 20 20 20 20 52 65 70 6f 72  ser */.    Repor
db10: 74 54 61 62 6c 65 28 26 6c 65 6d 2c 20 6d 68 66  tTable(&lem, mhf
db20: 6c 61 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  lag);..    /* Pr
db30: 6f 64 75 63 65 20 61 20 68 65 61 64 65 72 20 66  oduce a header f
db40: 69 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 74  ile for use by t
db50: 68 65 20 73 63 61 6e 6e 65 72 2e 20 20 28 54 68  he scanner.  (Th
db60: 69 73 20 73 74 65 70 20 69 73 0a 20 20 20 20 2a  is step is.    *
db70: 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65  * omitted if the
db80: 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20 69 73 20   "-m" option is 
db90: 75 73 65 64 20 62 65 63 61 75 73 65 20 6d 61 6b  used because mak
dba0: 65 68 65 61 64 65 72 73 20 77 69 6c 6c 0a 20 20  eheaders will.  
dbb0: 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 20 74 68    ** generate th
dbc0: 65 20 66 69 6c 65 20 66 6f 72 20 75 73 2e 29 20  e file for us.) 
dbd0: 2a 2f 0a 20 20 20 20 69 66 28 20 21 6d 68 66 6c  */.    if( !mhfl
dbe0: 61 67 20 29 20 52 65 70 6f 72 74 48 65 61 64 65  ag ) ReportHeade
dbf0: 72 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 69  r(&lem);.  }.  i
dc00: 66 28 20 73 74 61 74 69 73 74 69 63 73 20 29 7b  f( statistics ){
dc10: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 61 72  .    printf("Par
dc20: 73 65 72 20 73 74 61 74 69 73 74 69 63 73 3a 5c  ser statistics:\
dc30: 6e 22 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c  n");.    stats_l
dc40: 69 6e 65 28 22 74 65 72 6d 69 6e 61 6c 20 73 79  ine("terminal sy
dc50: 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e 74 65 72  mbols", lem.nter
dc60: 6d 69 6e 61 6c 29 3b 0a 20 20 20 20 73 74 61 74  minal);.    stat
dc70: 73 5f 6c 69 6e 65 28 22 6e 6f 6e 2d 74 65 72 6d  s_line("non-term
dc80: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c  inal symbols", l
dc90: 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d  em.nsymbol - lem
dca0: 2e 6e 74 65 72 6d 69 6e 61 6c 29 3b 0a 20 20 20  .nterminal);.   
dcb0: 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 74 6f 74   stats_line("tot
dcc0: 61 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d  al symbols", lem
dcd0: 2e 6e 73 79 6d 62 6f 6c 29 3b 0a 20 20 20 20 73  .nsymbol);.    s
dce0: 74 61 74 73 5f 6c 69 6e 65 28 22 72 75 6c 65 73  tats_line("rules
dcf0: 22 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20  ", lem.nrule);. 
dd00: 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 73     stats_line("s
dd10: 74 61 74 65 73 22 2c 20 6c 65 6d 2e 6e 78 73 74  tates", lem.nxst
dd20: 61 74 65 29 3b 0a 20 20 20 20 73 74 61 74 73 5f  ate);.    stats_
dd30: 6c 69 6e 65 28 22 63 6f 6e 66 6c 69 63 74 73 22  line("conflicts"
dd40: 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29  , lem.nconflict)
dd50: 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65  ;.    stats_line
dd60: 28 22 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 65  ("action table e
dd70: 6e 74 72 69 65 73 22 2c 20 6c 65 6d 2e 6e 61 63  ntries", lem.nac
dd80: 74 69 6f 6e 74 61 62 29 3b 0a 20 20 20 20 73 74  tiontab);.    st
dd90: 61 74 73 5f 6c 69 6e 65 28 22 74 6f 74 61 6c 20  ats_line("total 
dda0: 74 61 62 6c 65 20 73 69 7a 65 20 28 62 79 74 65  table size (byte
ddb0: 73 29 22 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69  s)", lem.tablesi
ddc0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  ze);.  }.  if( l
ddd0: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e 20 30  em.nconflict > 0
dde0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
ddf0: 73 74 64 65 72 72 2c 22 25 64 20 70 61 72 73 69  stderr,"%d parsi
de00: 6e 67 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22  ng conflicts.\n"
de10: 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b  ,lem.nconflict);
de20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 72 65 74 75 72  .  }..  /* retur
de30: 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  n 0 on success, 
de40: 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 2a 2f  1 on failure. */
de50: 0a 20 20 65 78 69 74 63 6f 64 65 20 3d 20 28 28  .  exitcode = ((
de60: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3e 20 30  lem.errorcnt > 0
de70: 29 20 7c 7c 20 28 6c 65 6d 2e 6e 63 6f 6e 66 6c  ) || (lem.nconfl
de80: 69 63 74 20 3e 20 30 29 29 20 3f 20 31 20 3a 20  ict > 0)) ? 1 : 
de90: 30 3b 0a 20 20 65 78 69 74 28 65 78 69 74 63 6f  0;.  exit(exitco
dea0: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 65  de);.  return (e
deb0: 78 69 74 63 6f 64 65 29 3b 0a 7d 0a 2f 2a 2a 2a  xitcode);.}./***
dec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ded0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
dee0: 22 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  "msort.c" ******
def0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
df00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
df10: 20 41 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65   A generic merge
df20: 2d 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a  -sort program..*
df30: 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c  *.** USAGE:.** L
df40: 65 74 20 22 70 74 72 22 20 62 65 20 61 20 70 6f  et "ptr" be a po
df50: 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74  inter to some st
df60: 72 75 63 74 75 72 65 20 77 68 69 63 68 20 69 73  ructure which is
df70: 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a   at the head of.
df80: 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e  ** a null-termin
df90: 61 74 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e  ated list.  Then
dfa0: 20 74 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73   to sort the lis
dfb0: 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  t call:.**.**   
dfc0: 20 20 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74    ptr = msort(pt
dfd0: 72 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63  r,&(ptr->next),c
dfe0: 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e  mpfnc);.**.** In
dff0: 20 74 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70   the above, "cmp
e000: 66 6e 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65  fnc" is a pointe
e010: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
e020: 77 68 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a  which compares.*
e030: 2a 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20  * two instances 
e040: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
e050: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20   and returns an 
e060: 69 6e 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a  integer, as in.*
e070: 2a 20 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73  * strcmp.  The s
e080: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
e090: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
e0a0: 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  he pointer to th
e0b0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d  e.** second elem
e0c0: 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65  ent of the linke
e0d0: 64 20 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64  d list.  This ad
e0e0: 64 72 65 73 73 20 69 73 20 75 73 65 64 20 74 6f  dress is used to
e0f0: 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   compute.** the 
e100: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e  offset to the "n
e110: 65 78 74 22 20 66 69 65 6c 64 20 77 69 74 68 69  ext" field withi
e120: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  n the structure.
e130: 20 20 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a    The offset to.
e140: 2a 2a 20 74 68 65 20 22 6e 65 78 74 22 20 66 69  ** the "next" fi
e150: 65 6c 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  eld must be cons
e160: 74 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72  tant for all str
e170: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c  uctures in the l
e180: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ist..**.** The f
e190: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
e1a0: 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68  a new pointer wh
e1b0: 69 63 68 20 69 73 20 74 68 65 20 68 65 61 64 20  ich is the head 
e1c0: 6f 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61  of the list.** a
e1d0: 66 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a  fter sorting..**
e1e0: 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a  .** ALGORITHM:.*
e1f0: 2a 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f  * Merge-sort..*/
e200: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
e210: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
e220: 6e 65 78 74 20 73 74 72 75 63 74 75 72 65 20 69  next structure i
e230: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
e240: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45  t..*/.#define NE
e250: 58 54 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29  XT(A) (*(char**)
e260: 28 28 28 63 68 61 72 2a 29 41 29 2b 6f 66 66 73  (((char*)A)+offs
e270: 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75  et))../*.** Inpu
e280: 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20  ts:.**   a:     
e290: 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c    A sorted, null
e2a0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b  -terminated link
e2b0: 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62  ed list.  (May b
e2c0: 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a  e null)..**   b:
e2d0: 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c         A sorted,
e2e0: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
e2f0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28   linked list.  (
e300: 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a  May be null)..**
e310: 20 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70 6f     cmp:     A po
e320: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6d  inter to the com
e330: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
e340: 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20 20  ..**   offset:  
e350: 4f 66 66 73 65 74 20 69 6e 20 74 68 65 20 73 74  Offset in the st
e360: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 22  ructure to the "
e370: 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a  next" field..**.
e380: 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a  ** Return Value:
e390: 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20  .**   A pointer 
e3a0: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  to the head of a
e3b0: 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e   sorted list con
e3c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d  taining the elem
e3d0: 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74  ents.**   of bot
e3e0: 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a  h a and b..**.**
e3f0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a   Side effects:.*
e400: 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70  *   The "next" p
e410: 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d  ointers for elem
e420: 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ents in the list
e430: 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a  s a and b are.**
e440: 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73     changed..*/.s
e450: 74 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72 67  tatic char *merg
e460: 65 28 0a 20 20 63 68 61 72 20 2a 61 2c 0a 20 20  e(.  char *a,.  
e470: 63 68 61 72 20 2a 62 2c 0a 20 20 69 6e 74 20 28  char *b,.  int (
e480: 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72  *cmp)(const char
e490: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 0a  *,const char*),.
e4a0: 20 20 69 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a    int offset.){.
e4b0: 20 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68 65    char *ptr, *he
e4c0: 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20  ad;..  if( a==0 
e4d0: 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62 3b  ){.    head = b;
e4e0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d  .  }else if( b==
e4f0: 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20  0 ){.    head = 
e500: 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
e510: 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c  if( (*cmp)(a,b)<
e520: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20  =0 ){.      ptr 
e530: 3d 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e  = a;.      a = N
e540: 45 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73  EXT(a);.    }els
e550: 65 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62  e{.      ptr = b
e560: 3b 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54  ;.      b = NEXT
e570: 28 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  (b);.    }.    h
e580: 65 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77  ead = ptr;.    w
e590: 68 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a  hile( a && b ){.
e5a0: 20 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29        if( (*cmp)
e5b0: 28 61 2c 62 29 3c 3d 30 20 29 7b 0a 20 20 20 20  (a,b)<=0 ){.    
e5c0: 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20      NEXT(ptr) = 
e5d0: 61 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d  a;.        ptr =
e5e0: 20 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20   a;.        a = 
e5f0: 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d  NEXT(a);.      }
e600: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45  else{.        NE
e610: 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20  XT(ptr) = b;.   
e620: 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20       ptr = b;.  
e630: 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62        b = NEXT(b
e640: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e650: 0a 20 20 20 20 69 66 28 20 61 20 29 20 4e 45 58  .    if( a ) NEX
e660: 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20  T(ptr) = a;.    
e670: 65 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74 72  else    NEXT(ptr
e680: 29 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74  ) = b;.  }.  ret
e690: 75 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a  urn head;.}../*.
e6a0: 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20  ** Inputs:.**   
e6b0: 6c 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74  list:      Point
e6c0: 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c  er to a singly-l
e6d0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74  inked list of st
e6e0: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e  ructures..**   n
e6f0: 65 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65  ext:      Pointe
e700: 72 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20  r to pointer to 
e710: 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  the second eleme
e720: 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a  nt of the list..
e730: 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20  **   cmp:       
e740: 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  A comparison fun
e750: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ction..**.** Ret
e760: 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20  urn Value:.**   
e770: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
e780: 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65   head of a sorte
e790: 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  d list containin
e7a0: 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a  g the elements.*
e7b0: 2a 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e  *   orginally in
e7c0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64   list..**.** Sid
e7d0: 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20  e effects:.**   
e7e0: 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74  The "next" point
e7f0: 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73  ers for elements
e800: 20 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61   in list are cha
e810: 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  nged..*/.#define
e820: 20 4c 49 53 54 53 49 5a 45 20 33 30 0a 73 74 61   LISTSIZE 30.sta
e830: 74 69 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28  tic char *msort(
e840: 0a 20 20 63 68 61 72 20 2a 6c 69 73 74 2c 0a 20  .  char *list,. 
e850: 20 63 68 61 72 20 2a 2a 6e 65 78 74 2c 0a 20 20   char **next,.  
e860: 69 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74  int (*cmp)(const
e870: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
e880: 72 2a 29 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  r*).){.  unsigne
e890: 64 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20  d long offset;. 
e8a0: 20 63 68 61 72 20 2a 65 70 3b 0a 20 20 63 68 61   char *ep;.  cha
e8b0: 72 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d  r *set[LISTSIZE]
e8c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66  ;.  int i;.  off
e8d0: 73 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  set = (unsigned 
e8e0: 6c 6f 6e 67 29 28 28 63 68 61 72 2a 29 6e 65 78  long)((char*)nex
e8f0: 74 20 2d 20 28 63 68 61 72 2a 29 6c 69 73 74 29  t - (char*)list)
e900: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c  ;.  for(i=0; i<L
e910: 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65  ISTSIZE; i++) se
e920: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c  t[i] = 0;.  whil
e930: 65 28 20 6c 69 73 74 20 29 7b 0a 20 20 20 20 65  e( list ){.    e
e940: 70 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69  p = list;.    li
e950: 73 74 20 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b  st = NEXT(list);
e960: 0a 20 20 20 20 4e 45 58 54 28 65 70 29 20 3d 20  .    NEXT(ep) = 
e970: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
e980: 69 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26 26 20  i<LISTSIZE-1 && 
e990: 73 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b  set[i]!=0; i++){
e9a0: 0a 20 20 20 20 20 20 65 70 20 3d 20 6d 65 72 67  .      ep = merg
e9b0: 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c  e(ep,set[i],cmp,
e9c0: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  offset);.      s
e9d0: 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  et[i] = 0;.    }
e9e0: 0a 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 65 70  .    set[i] = ep
e9f0: 3b 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a  ;.  }.  ep = 0;.
ea00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53    for(i=0; i<LIS
ea10: 54 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20  TSIZE; i++) if( 
ea20: 73 65 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65  set[i] ) ep = me
ea30: 72 67 65 28 73 65 74 5b 69 5d 2c 65 70 2c 63 6d  rge(set[i],ep,cm
ea40: 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74  p,offset);.  ret
ea50: 75 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn ep;.}./*****
ea60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea70: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
ea80: 65 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a  e "option.c" ***
ea90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eaa0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20  *******/.static 
eab0: 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61  char **argv;.sta
eac0: 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74  tic struct s_opt
ead0: 69 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63  ions *op;.static
eae0: 20 46 49 4c 45 20 2a 65 72 72 73 74 72 65 61 6d   FILE *errstream
eaf0: 3b 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f 50 54  ;..#define ISOPT
eb00: 28 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27  (X) ((X)[0]=='-'
eb10: 7c 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73  ||(X)[0]=='+'||s
eb20: 74 72 63 68 72 28 28 58 29 2c 27 3d 27 29 21 3d  trchr((X),'=')!=
eb30: 30 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  0)../*.** Print 
eb40: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
eb50: 20 77 69 74 68 20 61 20 63 61 72 72 6f 74 20 70   with a carrot p
eb60: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6b  ointing to the k
eb70: 2d 74 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  -th character.**
eb80: 20 6f 66 20 74 68 65 20 6e 2d 74 68 20 66 69 65   of the n-th fie
eb90: 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ld..*/.static vo
eba0: 69 64 20 65 72 72 6c 69 6e 65 28 69 6e 74 20 6e  id errline(int n
ebb0: 2c 20 69 6e 74 20 6b 2c 20 46 49 4c 45 20 2a 65  , int k, FILE *e
ebc0: 72 72 29 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e  rr).{.  int spcn
ebd0: 74 2c 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76  t, i;.  if( argv
ebe0: 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72  [0] ) fprintf(er
ebf0: 72 2c 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b  r,"%s",argv[0]);
ec00: 0a 20 20 73 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e  .  spcnt = lemon
ec10: 53 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20  Strlen(argv[0]) 
ec20: 2b 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  + 1;.  for(i=1; 
ec30: 69 3c 6e 20 26 26 20 61 72 67 76 5b 69 5d 3b 20  i<n && argv[i]; 
ec40: 69 2b 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  i++){.    fprint
ec50: 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76  f(err," %s",argv
ec60: 5b 69 5d 29 3b 0a 20 20 20 20 73 70 63 6e 74 20  [i]);.    spcnt 
ec70: 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61  += lemonStrlen(a
ec80: 72 67 76 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20  rgv[i])+1;.  }. 
ec90: 20 73 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66   spcnt += k;.  f
eca0: 6f 72 28 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b  or(; argv[i]; i+
ecb0: 2b 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22  +) fprintf(err,"
ecc0: 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20   %s",argv[i]);. 
ecd0: 20 69 66 28 20 73 70 63 6e 74 3c 32 30 20 29 7b   if( spcnt<20 ){
ece0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
ecf0: 2c 22 5c 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c  ,"\n%*s^-- here\
ed00: 6e 22 2c 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20  n",spcnt,"");.  
ed10: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
ed20: 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72  tf(err,"\n%*sher
ed30: 65 20 2d 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37  e --^\n",spcnt-7
ed40: 2c 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ,"");.  }.}../*.
ed50: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
ed60: 64 65 78 20 6f 66 20 74 68 65 20 4e 2d 74 68 20  dex of the N-th 
ed70: 6e 6f 6e 2d 73 77 69 74 63 68 20 61 72 67 75 6d  non-switch argum
ed80: 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  ent.  Return -1.
ed90: 2a 2a 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f  ** if N is out o
eda0: 66 20 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74  f range..*/.stat
edb0: 69 63 20 69 6e 74 20 61 72 67 69 6e 64 65 78 28  ic int argindex(
edc0: 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69  int n).{.  int i
edd0: 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68  ;.  int dashdash
ede0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76   = 0;.  if( argv
edf0: 21 3d 30 20 26 26 20 2a 61 72 67 76 21 3d 30 20  !=0 && *argv!=0 
ee00: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
ee10: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
ee20: 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73       if( dashdas
ee30: 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76  h || !ISOPT(argv
ee40: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
ee50: 69 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72  if( n==0 ) retur
ee60: 6e 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d  n i;.        n--
ee70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ee80: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
ee90: 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61  i],"--")==0 ) da
eea0: 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20  shdash = 1;.    
eeb0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  }.  }.  return -
eec0: 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61  1;.}..static cha
eed0: 72 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d  r emsg[] = "Comm
eee0: 61 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20  and line syntax 
eef0: 65 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a  error: ";../*.**
ef00: 20 50 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20   Process a flag 
ef10: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67  command line arg
ef20: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
ef30: 20 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73   int handleflags
ef40: 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72  (int i, FILE *er
ef50: 72 29 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20  r).{.  int v;.  
ef60: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
ef70: 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
ef80: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
ef90: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
efa0: 74 72 6e 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b  trncmp(&argv[i][
efb0: 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c  1],op[j].label,l
efc0: 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d  emonStrlen(op[j]
efd0: 2e 6c 61 62 65 6c 29 29 3d 3d 30 20 29 20 62 72  .label))==0 ) br
efe0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61  eak;.  }.  v = a
eff0: 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f  rgv[i][0]=='-' ?
f000: 20 31 20 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70   1 : 0;.  if( op
f010: 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a  [j].label==0 ){.
f020: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
f030: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
f040: 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70  ,"%sundefined op
f050: 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  tion.\n",emsg);.
f060: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
f070: 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  1,err);.    }.  
f080: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65    errcnt++;.  }e
f090: 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 61 72  lse if( op[j].ar
f0a0: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
f0b0: 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f  gnore this optio
f0c0: 6e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  n */.  }else if(
f0d0: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
f0e0: 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a 28 28  _FLAG ){.    *((
f0f0: 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20  int*)op[j].arg) 
f100: 3d 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = v;.  }else if(
f110: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
f120: 5f 46 46 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a  _FFLAG ){.    (*
f130: 28 76 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f  (void(*)(int))(o
f140: 70 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20  p[j].arg))(v);. 
f150: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d   }else if( op[j]
f160: 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 53 54 52 20  .type==OPT_FSTR 
f170: 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a  ){.    (*(void(*
f180: 29 28 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d  )(char *))(op[j]
f190: 2e 61 72 67 29 29 28 26 61 72 67 76 5b 69 5d 5b  .arg))(&argv[i][
f1a0: 32 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  2]);.  }else{.  
f1b0: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
f1c0: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
f1d0: 25 73 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65  %smissing argume
f1e0: 6e 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c 6e 22  nt on switch.\n"
f1f0: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72  ,emsg);.      er
f200: 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a  rline(i,1,err);.
f210: 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74      }.    errcnt
f220: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
f230: 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   errcnt;.}../*.*
f240: 2a 20 50 72 6f 63 65 73 73 20 61 20 63 6f 6d 6d  * Process a comm
f250: 61 6e 64 20 6c 69 6e 65 20 73 77 69 74 63 68 20  and line switch 
f260: 77 68 69 63 68 20 68 61 73 20 61 6e 20 61 72 67  which has an arg
f270: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
f280: 20 69 6e 74 20 68 61 6e 64 6c 65 73 77 69 74 63   int handleswitc
f290: 68 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65  h(int i, FILE *e
f2a0: 72 72 29 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d  rr).{.  int lv =
f2b0: 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64 76 20   0;.  double dv 
f2c0: 3d 20 30 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73  = 0.0;.  char *s
f2d0: 76 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63  v = 0, *end;.  c
f2e0: 68 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a  har *cp;.  int j
f2f0: 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  ;.  int errcnt =
f300: 20 30 3b 0a 20 20 63 70 20 3d 20 73 74 72 63 68   0;.  cp = strch
f310: 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a  r(argv[i],'=');.
f320: 20 20 61 73 73 65 72 74 28 20 63 70 21 3d 30 20    assert( cp!=0 
f330: 29 3b 0a 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20  );.  *cp = 0;.  
f340: 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c  for(j=0; op[j].l
f350: 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  abel; j++){.    
f360: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
f370: 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d  i],op[j].label)=
f380: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
f390: 20 20 2a 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69    *cp = '=';.  i
f3a0: 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d  f( op[j].label==
f3b0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72  0 ){.    if( err
f3c0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
f3d0: 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e  f(err,"%sundefin
f3e0: 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d  ed option.\n",em
f3f0: 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69  sg);.      errli
f400: 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20  ne(i,0,err);.   
f410: 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b   }.    errcnt++;
f420: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70  .  }else{.    cp
f430: 2b 2b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  ++;.    switch( 
f440: 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[j].type ){.  
f450: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
f460: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
f470: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
f480: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
f490: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
f4a0: 72 2c 22 25 73 6f 70 74 69 6f 6e 20 72 65 71 75  r,"%soption requ
f4b0: 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
f4c0: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
f4d0: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
f4e0: 30 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  0,err);.        
f4f0: 7d 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74  }.        errcnt
f500: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
f510: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
f520: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73  T_DBL:.      cas
f530: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
f540: 20 20 20 20 64 76 20 3d 20 73 74 72 74 6f 64 28      dv = strtod(
f550: 63 70 2c 26 65 6e 64 29 3b 0a 20 20 20 20 20 20  cp,&end);.      
f560: 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20    if( *end ){.  
f570: 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20          if( err 
f580: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
f590: 70 72 69 6e 74 66 28 65 72 72 2c 0a 20 20 20 20  printf(err,.    
f5a0: 20 20 20 20 20 20 20 20 20 20 20 22 25 73 69 6c             "%sil
f5b0: 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
f5c0: 69 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  in floating-poin
f5d0: 74 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65  t argument.\n",e
f5e0: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
f5f0: 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 69 6e 74    errline(i,(int
f600: 29 28 28 63 68 61 72 2a 29 65 6e 64 2d 28 63 68  )((char*)end-(ch
f610: 61 72 2a 29 61 72 67 76 5b 69 5d 29 2c 65 72 72  ar*)argv[i]),err
f620: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
f630: 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b           errcnt+
f640: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
f650: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f660: 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a    case OPT_INT:.
f670: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
f680: 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 76 20  INT:.        lv 
f690: 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26 65 6e 64  = strtol(cp,&end
f6a0: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,0);.        if(
f6b0: 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20   *end ){.       
f6c0: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
f6d0: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
f6e0: 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c  f(err,"%sillegal
f6f0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 69 6e   character in in
f700: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 5c  teger argument.\
f710: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
f720: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
f730: 28 69 6e 74 29 28 28 63 68 61 72 2a 29 65 6e 64  (int)((char*)end
f740: 2d 28 63 68 61 72 2a 29 61 72 67 76 5b 69 5d 29  -(char*)argv[i])
f750: 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ,err);.         
f760: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72   }.          err
f770: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
f780: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
f790: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53        case OPT_S
f7a0: 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  TR:.      case O
f7b0: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
f7c0: 20 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20 20   sv = cp;.      
f7d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f7e0: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d     switch( op[j]
f7f0: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
f800: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
f810: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
f820: 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61  AG:.        brea
f830: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
f840: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a  T_DBL:.        *
f850: 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e  (double*)(op[j].
f860: 61 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20 20  arg) = dv;.     
f870: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f880: 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20  case OPT_FDBL:. 
f890: 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a         (*(void(*
f8a0: 29 28 64 6f 75 62 6c 65 29 29 28 6f 70 5b 6a 5d  )(double))(op[j]
f8b0: 2e 61 72 67 29 29 28 64 76 29 3b 0a 20 20 20 20  .arg))(dv);.    
f8c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f8d0: 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
f8e0: 20 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 28 6f         *(int*)(o
f8f0: 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 6c 76 3b 0a  p[j].arg) = lv;.
f900: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f910: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
f920: 4e 54 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76  NT:.        (*(v
f930: 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b  oid(*)(int))(op[
f940: 6a 5d 2e 61 72 67 29 29 28 28 69 6e 74 29 6c 76  j].arg))((int)lv
f950: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
f960: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
f970: 5f 53 54 52 3a 0a 20 20 20 20 20 20 20 20 2a 28  _STR:.        *(
f980: 63 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72  char**)(op[j].ar
f990: 67 29 20 3d 20 73 76 3b 0a 20 20 20 20 20 20 20  g) = sv;.       
f9a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
f9b0: 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20  se OPT_FSTR:.   
f9c0: 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28       (*(void(*)(
f9d0: 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61  char *))(op[j].a
f9e0: 72 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20 20  rg))(sv);.      
f9f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fa00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
fa10: 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e  nt;.}..int OptIn
fa20: 69 74 28 63 68 61 72 20 2a 2a 61 2c 20 73 74 72  it(char **a, str
fa30: 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f  uct s_options *o
fa40: 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20  , FILE *err).{. 
fa50: 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b   int errcnt = 0;
fa60: 0a 20 20 61 72 67 76 20 3d 20 61 3b 0a 20 20 6f  .  argv = a;.  o
fa70: 70 20 3d 20 6f 3b 0a 20 20 65 72 72 73 74 72 65  p = o;.  errstre
fa80: 61 6d 20 3d 20 65 72 72 3b 0a 20 20 69 66 28 20  am = err;.  if( 
fa90: 61 72 67 76 20 26 26 20 2a 61 72 67 76 20 26 26  argv && *argv &&
faa0: 20 6f 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69   op ){.    int i
fab0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  ;.    for(i=1; a
fac0: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
fad0: 20 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 5b      if( argv[i][
fae0: 30 5d 3d 3d 27 2b 27 20 7c 7c 20 61 72 67 76 5b  0]=='+' || argv[
faf0: 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  i][0]=='-' ){.  
fb00: 20 20 20 20 20 20 65 72 72 63 6e 74 20 2b 3d 20        errcnt += 
fb10: 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72  handleflags(i,er
fb20: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
fb30: 69 66 28 20 73 74 72 63 68 72 28 61 72 67 76 5b  if( strchr(argv[
fb40: 69 5d 2c 27 3d 27 29 20 29 7b 0a 20 20 20 20 20  i],'=') ){.     
fb50: 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e     errcnt += han
fb60: 64 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72 29  dleswitch(i,err)
fb70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
fb80: 20 20 7d 0a 20 20 69 66 28 20 65 72 72 63 6e 74    }.  if( errcnt
fb90: 3e 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  >0 ){.    fprint
fba0: 66 28 65 72 72 2c 22 56 61 6c 69 64 20 63 6f 6d  f(err,"Valid com
fbb0: 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand line option
fbc0: 73 20 66 6f 72 20 5c 22 25 73 5c 22 20 61 72 65  s for \"%s\" are
fbd0: 3a 5c 6e 22 2c 2a 61 29 3b 0a 20 20 20 20 4f 70  :\n",*a);.    Op
fbe0: 74 50 72 69 6e 74 28 29 3b 0a 20 20 20 20 65 78  tPrint();.    ex
fbf0: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  it(1);.  }.  ret
fc00: 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70  urn 0;.}..int Op
fc10: 74 4e 41 72 67 73 28 76 6f 69 64 29 7b 0a 20 20  tNArgs(void){.  
fc20: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
fc30: 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b  nt dashdash = 0;
fc40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
fc50: 61 72 67 76 21 3d 30 20 26 26 20 61 72 67 76 5b  argv!=0 && argv[
fc60: 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  0]!=0 ){.    for
fc70: 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69  (i=1; argv[i]; i
fc80: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64  ++){.      if( d
fc90: 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53 4f 50  ashdash || !ISOP
fca0: 54 28 61 72 67 76 5b 69 5d 29 20 29 20 63 6e 74  T(argv[i]) ) cnt
fcb0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ++;.      if( st
fcc0: 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d  rcmp(argv[i],"--
fcd0: 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73 68  ")==0 ) dashdash
fce0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
fcf0: 20 20 72 65 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a    return cnt;.}.
fd00: 0a 63 68 61 72 20 2a 4f 70 74 41 72 67 28 69 6e  .char *OptArg(in
fd10: 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  t n).{.  int i;.
fd20: 20 20 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e    i = argindex(n
fd30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3e 3d 30  );.  return i>=0
fd40: 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 30 3b 0a   ? argv[i] : 0;.
fd50: 7d 0a 0a 76 6f 69 64 20 4f 70 74 45 72 72 28 69  }..void OptErr(i
fd60: 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  nt n).{.  int i;
fd70: 0a 20 20 69 20 3d 20 61 72 67 69 6e 64 65 78 28  .  i = argindex(
fd80: 6e 29 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29  n);.  if( i>=0 )
fd90: 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72   errline(i,0,err
fda0: 73 74 72 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64  stream);.}..void
fdb0: 20 4f 70 74 50 72 69 6e 74 28 76 6f 69 64 29 7b   OptPrint(void){
fdc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
fdd0: 6d 61 78 2c 20 6c 65 6e 3b 0a 20 20 6d 61 78 20  max, len;.  max 
fde0: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
fdf0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b  op[i].label; i++
fe00: 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d  ){.    len = lem
fe10: 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c  onStrlen(op[i].l
fe20: 61 62 65 6c 29 20 2b 20 31 3b 0a 20 20 20 20 73  abel) + 1;.    s
fe30: 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70  witch( op[i].typ
fe40: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
fe50: 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
fe60: 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
fe70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
fe80: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e       case OPT_IN
fe90: 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  T:.      case OP
fea0: 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20  T_FINT:.        
feb0: 6c 65 6e 20 2b 3d 20 39 3b 20 20 20 20 20 20 20  len += 9;       
fec0: 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 69  /* length of "<i
fed0: 6e 74 65 67 65 72 3e 22 20 2a 2f 0a 20 20 20 20  nteger>" */.    
fee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
fef0: 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20   case OPT_DBL:. 
ff00: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44       case OPT_FD
ff10: 42 4c 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20  BL:.        len 
ff20: 2b 3d 20 36 3b 20 20 20 20 20 20 20 2f 2a 20 6c  += 6;       /* l
ff30: 65 6e 67 74 68 20 6f 66 20 22 3c 72 65 61 6c 3e  ength of "<real>
ff40: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  " */.        bre
ff50: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
ff60: 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61  PT_STR:.      ca
ff70: 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20  se OPT_FSTR:.   
ff80: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 38 3b 20 20       len += 8;  
ff90: 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
ffa0: 66 20 22 3c 73 74 72 69 6e 67 3e 22 20 2a 2f 0a  f "<string>" */.
ffb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ffc0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 65 6e     }.    if( len
ffd0: 3e 6d 61 78 20 29 20 6d 61 78 20 3d 20 6c 65 6e  >max ) max = len
ffe0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
fff0: 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b   op[i].label; i+
10000 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20  +){.    switch( 
10010 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[i].type ){.  
10020 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
10030 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
10040 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
10050 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65   fprintf(errstre
10060 61 6d 2c 22 20 20 2d 25 2d 2a 73 20 20 25 73 5c  am,"  -%-*s  %s\
10070 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c 61 62  n",max,op[i].lab
10080 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  el,op[i].message
10090 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
100a0 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
100b0 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65  _INT:.      case
100c0 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20   OPT_FINT:.     
100d0 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74     fprintf(errst
100e0 72 65 61 6d 2c 22 20 20 2d 25 73 3c 69 6e 74 65  ream,"  -%s<inte
100f0 67 65 72 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f  ger>%*s  %s\n",o
10100 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20  p[i].label,.    
10110 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d        (int)(max-
10120 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69  lemonStrlen(op[i
10130 5d 2e 6c 61 62 65 6c 29 2d 39 29 2c 22 22 2c 6f  ].label)-9),"",o
10140 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20  p[i].message);. 
10150 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10160 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
10170 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
10180 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 66  _FDBL:.        f
10190 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d  printf(errstream
101a0 2c 22 20 20 2d 25 73 3c 72 65 61 6c 3e 25 2a 73  ,"  -%s<real>%*s
101b0 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61    %s\n",op[i].la
101c0 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  bel,.          (
101d0 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74  int)(max-lemonSt
101e0 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c  rlen(op[i].label
101f0 29 2d 36 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65  )-6),"",op[i].me
10200 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
10210 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
10220 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20  e OPT_STR:.     
10230 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a   case OPT_FSTR:.
10240 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
10250 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 73  errstream,"  -%s
10260 3c 73 74 72 69 6e 67 3e 25 2a 73 20 20 25 73 5c  <string>%*s  %s\
10270 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a  n",op[i].label,.
10280 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
10290 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  max-lemonStrlen(
102a0 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38 29 2c  op[i].label)-8),
102b0 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  "",op[i].message
102c0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
102d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
102e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102f0 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
10300 66 69 6c 65 20 22 70 61 72 73 65 2e 63 22 20 2a  file "parse.c" *
10310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
10330 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65 20 70 61  ** Input file pa
10340 72 73 65 72 20 66 6f 72 20 74 68 65 20 4c 45 4d  rser for the LEM
10350 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
10360 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68 65 20  tor..*/../* The 
10370 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72  state of the par
10380 73 65 72 20 2a 2f 0a 65 6e 75 6d 20 65 5f 73 74  ser */.enum e_st
10390 61 74 65 20 7b 0a 20 20 49 4e 49 54 49 41 4c 49  ate {.  INITIALI
103a0 5a 45 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  ZE,.  WAITING_FO
103b0 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a  R_DECL_OR_RULE,.
103c0 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45    WAITING_FOR_DE
103d0 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20 20 57 41  CL_KEYWORD,.  WA
103e0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
103f0 52 47 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  RG,.  WAITING_FO
10400 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
10410 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  BOL,.  WAITING_F
10420 4f 52 5f 41 52 52 4f 57 2c 0a 20 20 49 4e 5f 52  OR_ARROW,.  IN_R
10430 48 53 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f  HS,.  LHS_ALIAS_
10440 31 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32  1,.  LHS_ALIAS_2
10450 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c  ,.  LHS_ALIAS_3,
10460 0a 20 20 52 48 53 5f 41 4c 49 41 53 5f 31 2c 0a  .  RHS_ALIAS_1,.
10470 20 20 52 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20    RHS_ALIAS_2,. 
10480 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
10490 5f 31 2c 0a 20 20 50 52 45 43 45 44 45 4e 43 45  _1,.  PRECEDENCE
104a0 5f 4d 41 52 4b 5f 32 2c 0a 20 20 52 45 53 59 4e  _MARK_2,.  RESYN
104b0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
104c0 4f 52 2c 0a 20 20 52 45 53 59 4e 43 5f 41 46 54  OR,.  RESYNC_AFT
104d0 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 2c 0a 20  ER_DECL_ERROR,. 
104e0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53   WAITING_FOR_DES
104f0 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a  TRUCTOR_SYMBOL,.
10500 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41    WAITING_FOR_DA
10510 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a 20  TATYPE_SYMBOL,. 
10520 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c   WAITING_FOR_FAL
10530 4c 42 41 43 4b 5f 49 44 2c 0a 20 20 57 41 49 54  LBACK_ID,.  WAIT
10540 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44  ING_FOR_WILDCARD
10550 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  _ID,.  WAITING_F
10560 4f 52 5f 43 4c 41 53 53 5f 49 44 2c 0a 20 20 57  OR_CLASS_ID,.  W
10570 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53  AITING_FOR_CLASS
10580 5f 54 4f 4b 45 4e 2c 0a 20 20 57 41 49 54 49 4e  _TOKEN,.  WAITIN
10590 47 5f 46 4f 52 5f 54 4f 4b 45 4e 5f 4e 41 4d 45  G_FOR_TOKEN_NAME
105a0 0a 7d 3b 0a 73 74 72 75 63 74 20 70 73 74 61 74  .};.struct pstat
105b0 65 20 7b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65  e {.  char *file
105c0 6e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e  name;       /* N
105d0 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ame of the input
105e0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74   file */.  int t
105f0 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20  okenlineno;     
10600 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61   /* Linenumber a
10610 74 20 77 68 69 63 68 20 63 75 72 72 65 6e 74 20  t which current 
10620 74 6f 6b 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a  token starts */.
10630 20 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20    int errorcnt; 
10640 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10650 72 20 6f 66 20 65 72 72 6f 72 73 20 73 6f 20 66  r of errors so f
10660 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  ar */.  char *to
10670 6b 65 6e 73 74 61 72 74 3b 20 20 20 20 20 2f 2a  kenstart;     /*
10680 20 54 65 78 74 20 6f 66 20 63 75 72 72 65 6e 74   Text of current
10690 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75   token */.  stru
106a0 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20  ct lemon *gp;   
106b0 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74    /* Global stat
106c0 65 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e  e vector */.  en
106d0 75 6d 20 65 5f 73 74 61 74 65 20 73 74 61 74 65  um e_state state
106e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
106f0 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72  state of the par
10700 73 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ser */.  struct 
10710 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b  symbol *fallback
10720 3b 20 20 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62  ;   /* The fallb
10730 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73  ack token */.  s
10740 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 74 6b  truct symbol *tk
10750 63 6c 61 73 73 3b 20 20 20 20 2f 2a 20 54 6f 6b  class;    /* Tok
10760 65 6e 20 63 6c 61 73 73 20 73 79 6d 62 6f 6c 20  en class symbol 
10770 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
10780 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 20 20  ol *lhs;        
10790 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64  /* Left-hand sid
107a0 65 20 6f 66 20 63 75 72 72 65 6e 74 20 72 75 6c  e of current rul
107b0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
107c0 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20  r *lhsalias;    
107d0 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74    /* Alias for t
107e0 68 65 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he LHS */.  int 
107f0 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  nrhs;           
10800 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10810 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 73   of right-hand s
10820 69 64 65 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e  ide symbols seen
10830 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
10840 62 6f 6c 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d  bol *rhs[MAXRHS]
10850 3b 20 20 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c  ;  /* RHS symbol
10860 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
10870 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d  r *alias[MAXRHS]
10880 3b 20 2f 2a 20 41 6c 69 61 73 65 73 20 66 6f 72  ; /* Aliases for
10890 20 65 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c   each RHS symbol
108a0 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
108b0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 72 65  struct rule *pre
108c0 76 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72  vrule;     /* Pr
108d0 65 76 69 6f 75 73 20 72 75 6c 65 20 70 61 72 73  evious rule pars
108e0 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
108f0 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b  ar *declkeyword;
10900 20 20 20 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66     /* Keyword of
10910 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a   a declaration *
10920 2f 0a 20 20 63 68 61 72 20 2a 2a 64 65 63 6c 61  /.  char **decla
10930 72 67 73 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f  rgslot;        /
10940 2a 20 57 68 65 72 65 20 74 68 65 20 64 65 63 6c  * Where the decl
10950 61 72 61 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  aration argument
10960 20 73 68 6f 75 6c 64 20 62 65 20 70 75 74 20 2a   should be put *
10970 2f 0a 20 20 69 6e 74 20 69 6e 73 65 72 74 4c 69  /.  int insertLi
10980 6e 65 4d 61 63 72 6f 3b 20 20 20 20 20 20 20 2f  neMacro;       /
10990 2a 20 41 64 64 20 23 6c 69 6e 65 20 62 65 66 6f  * Add #line befo
109a0 72 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69  re declaration i
109b0 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  nsert */.  int *
109c0 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20  decllinenoslot; 
109d0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
109e0 6f 20 77 72 69 74 65 20 64 65 63 6c 61 72 61 74  o write declarat
109f0 69 6f 6e 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ion line number 
10a00 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f  */.  enum e_asso
10a10 63 20 64 65 63 6c 61 73 73 6f 63 3b 20 20 20 20  c declassoc;    
10a20 2f 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20 61  /* Assign this a
10a30 73 73 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64 65  ssociation to de
10a40 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  cl arguments */.
10a50 20 20 69 6e 74 20 70 72 65 63 63 6f 75 6e 74 65    int preccounte
10a60 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
10a70 41 73 73 69 67 6e 20 74 68 69 73 20 70 72 65 63  Assign this prec
10a80 65 64 65 6e 63 65 20 74 6f 20 64 65 63 6c 20 61  edence to decl a
10a90 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74  rguments */.  st
10aa0 72 75 63 74 20 72 75 6c 65 20 2a 66 69 72 73 74  ruct rule *first
10ab0 72 75 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e  rule;    /* Poin
10ac0 74 65 72 20 74 6f 20 66 69 72 73 74 20 72 75 6c  ter to first rul
10ad0 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72  e in the grammar
10ae0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
10af0 65 20 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20 20  e *lastrule;    
10b00 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
10b10 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
10b20 20 70 61 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a   parsed rule */.
10b30 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20 73  };../* Parse a s
10b40 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73  ingle token */.s
10b50 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73 65  tatic void parse
10b60 6f 6e 65 74 6f 6b 65 6e 28 73 74 72 75 63 74 20  onetoken(struct 
10b70 70 73 74 61 74 65 20 2a 70 73 70 29 0a 7b 0a 20  pstate *psp).{. 
10b80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 3b 0a   const char *x;.
10b90 20 20 78 20 3d 20 53 74 72 73 61 66 65 28 70 73    x = Strsafe(ps
10ba0 70 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20  p->tokenstart); 
10bb0 20 20 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20      /* Save the 
10bc0 74 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c  token permanentl
10bd0 79 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72 69  y */.#if 0.  pri
10be0 6e 74 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65  ntf("%s:%d: Toke
10bf0 6e 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25 64 5c  n=[%s] state=%d\
10c00 6e 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  n",psp->filename
10c10 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
10c20 6f 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73 74  o,.    x,psp->st
10c30 61 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ate);.#endif.  s
10c40 77 69 74 63 68 28 20 70 73 70 2d 3e 73 74 61 74  witch( psp->stat
10c50 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 49 4e  e ){.    case IN
10c60 49 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20  ITIALIZE:.      
10c70 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20  psp->prevrule = 
10c80 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72  0;.      psp->pr
10c90 65 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20  eccounter = 0;. 
10ca0 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72       psp->firstr
10cb0 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72  ule = psp->lastr
10cc0 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ule = 0;.      p
10cd0 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20  sp->gp->nrule = 
10ce0 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  0;.      /* Fall
10cf0 20 74 68 72 75 20 74 6f 20 6e 65 78 74 20 63 61   thru to next ca
10d00 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 57  se */.    case W
10d10 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
10d20 4f 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20 69  OR_RULE:.      i
10d30 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a  f( x[0]=='%' ){.
10d40 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
10d50 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
10d60 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20  _DECL_KEYWORD;. 
10d70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49       }else if( I
10d80 53 4c 4f 57 45 52 28 78 5b 30 5d 29 20 29 7b 0a  SLOWER(x[0]) ){.
10d90 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
10da0 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
10db0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e  ;.        psp->n
10dc0 72 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rhs = 0;.       
10dd0 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d   psp->lhsalias =
10de0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
10df0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
10e00 5f 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20  _FOR_ARROW;.    
10e10 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
10e20 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='{' ){.       
10e30 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75   if( psp->prevru
10e40 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
10e50 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
10e60 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
10e70 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65  okenlineno,."The
10e80 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72  re is no prior r
10e90 75 6c 65 20 75 70 6f 6e 20 77 68 69 63 68 20 74  ule upon which t
10ea0 6f 20 61 74 74 61 63 68 20 74 68 65 20 63 6f 64  o attach the cod
10eb0 65 20 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68 69  e \.fragment whi
10ec0 63 68 20 62 65 67 69 6e 73 20 6f 6e 20 74 68 69  ch begins on thi
10ed0 73 20 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20  s line.");.     
10ee0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
10ef0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  nt++;.        }e
10f00 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65  lse if( psp->pre
10f10 76 72 75 6c 65 2d 3e 63 6f 64 65 21 3d 30 20 29  vrule->code!=0 )
10f20 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
10f30 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
10f40 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
10f50 65 6e 6f 2c 0a 22 43 6f 64 65 20 66 72 61 67 6d  eno,."Code fragm
10f60 65 6e 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f 6e  ent beginning on
10f70 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
10f80 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f  t the first \.to
10f90 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76   follow the prev
10fa0 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20  ious rule.");.  
10fb0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
10fc0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
10fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10fe0 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d    psp->prevrule-
10ff0 3e 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b  >line = psp->tok
11000 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  enlineno;.      
11010 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c      psp->prevrul
11020 65 2d 3e 63 6f 64 65 20 3d 20 26 78 5b 31 5d 3b  e->code = &x[1];
11030 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11040 70 72 65 76 72 75 6c 65 2d 3e 6e 6f 43 6f 64 65  prevrule->noCode
11050 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
11060 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11070 78 5b 30 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20  x[0]=='[' ){.   
11080 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11090 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52  = PRECEDENCE_MAR
110a0 4b 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  K_1;.      }else
110b0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
110c0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
110d0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
110e0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54 6f  o,.          "To
110f0 6b 65 6e 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c  ken \"%s\" shoul
11100 64 20 62 65 20 65 69 74 68 65 72 20 5c 22 25 25  d be either \"%%
11110 5c 22 20 6f 72 20 61 20 6e 6f 6e 74 65 72 6d 69  \" or a nontermi
11120 6e 61 6c 20 6e 61 6d 65 2e 22 2c 0a 20 20 20 20  nal name.",.    
11130 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20        x);.      
11140 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11150 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
11160 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
11170 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
11180 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 21 49  _1:.      if( !I
11190 53 55 50 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a  SUPPER(x[0]) ){.
111a0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
111b0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
111c0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
111d0 0a 20 20 20 20 20 20 20 20 20 20 22 54 68 65 20  .          "The 
111e0 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f  precedence symbo
111f0 6c 20 6d 75 73 74 20 62 65 20 61 20 74 65 72 6d  l must be a term
11200 69 6e 61 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20  inal.");.       
11210 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
11220 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11230 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d  ( psp->prevrule=
11240 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  =0 ){.        Er
11250 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
11260 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
11270 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
11280 20 22 54 68 65 72 65 20 69 73 20 6e 6f 20 70 72   "There is no pr
11290 69 6f 72 20 72 75 6c 65 20 74 6f 20 61 73 73 69  ior rule to assi
112a0 67 6e 20 70 72 65 63 65 64 65 6e 63 65 20 5c 22  gn precedence \"
112b0 5b 25 73 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20 20  [%s]\".",x);.   
112c0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
112d0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
112e0 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72  e if( psp->prevr
112f0 75 6c 65 2d 3e 70 72 65 63 73 79 6d 21 3d 30 20  ule->precsym!=0 
11300 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
11310 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
11320 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
11330 6e 6f 2c 0a 22 50 72 65 63 65 64 65 6e 63 65 20  no,."Precedence 
11340 6d 61 72 6b 20 6f 6e 20 74 68 69 73 20 6c 69 6e  mark on this lin
11350 65 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72  e is not the fir
11360 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74  st \.to follow t
11370 68 65 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65  he previous rule
11380 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  .");.        psp
11390 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
113a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
113b0 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
113c0 2d 3e 70 72 65 63 73 79 6d 20 3d 20 53 79 6d 62  ->precsym = Symb
113d0 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
113e0 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74   }.      psp->st
113f0 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e 43 45  ate = PRECEDENCE
11400 5f 4d 41 52 4b 5f 32 3b 0a 20 20 20 20 20 20 62  _MARK_2;.      b
11410 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50  reak;.    case P
11420 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32  RECEDENCE_MARK_2
11430 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
11440 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  !=']' ){.       
11450 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
11460 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
11470 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
11480 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 5d      "Missing \"]
11490 5c 22 20 6f 6e 20 70 72 65 63 65 64 65 6e 63 65  \" on precedence
114a0 20 6d 61 72 6b 2e 22 29 3b 0a 20 20 20 20 20 20   mark.");.      
114b0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
114c0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
114d0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
114e0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
114f0 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 62 72  R_RULE;.      br
11500 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
11510 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3a  ITING_FOR_ARROW:
11520 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
11530 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a  =':' && x[1]==':
11540 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29  ' && x[2]=='=' )
11550 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
11560 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20  tate = IN_RHS;. 
11570 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
11580 5b 30 5d 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20  [0]=='(' ){.    
11590 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
115a0 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20   LHS_ALIAS_1;.  
115b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
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 20 20 20 20  okenlineno,.    
115f0 20 20 20 20 20 20 22 45 78 70 65 63 74 65 64 20        "Expected 
11600 74 6f 20 73 65 65 20 61 20 5c 22 3a 5c 22 20 66  to see a \":\" f
11610 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4c 48 53  ollowing the LHS
11620 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e 22   symbol \"%s\"."
11630 2c 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ,.          psp-
11640 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  >lhs->name);.   
11650 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11660 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
11670 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11680 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
11690 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
116a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
116b0 65 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20  e LHS_ALIAS_1:. 
116c0 20 20 20 20 20 69 66 28 20 49 53 41 4c 50 48 41       if( ISALPHA
116d0 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
116e0 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20    psp->lhsalias 
116f0 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = x;.        psp
11700 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c  ->state = LHS_AL
11710 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_2;.      }el
11720 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
11730 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
11740 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
11750 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
11760 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20  \"%s\" is not a 
11770 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72 20  valid alias for 
11780 74 68 65 20 4c 48 53 20 5c 22 25 73 5c 22 5c 6e  the LHS \"%s\"\n
11790 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70  ",.          x,p
117a0 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a  sp->lhs->name);.
117b0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
117c0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
117d0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
117e0 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
117f0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
11800 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11810 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 32  case LHS_ALIAS_2
11820 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
11830 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20  ==')' ){.       
11840 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48   psp->state = LH
11850 53 5f 41 4c 49 41 53 5f 33 3b 0a 20 20 20 20 20  S_ALIAS_3;.     
11860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11870 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
11880 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
11890 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
118a0 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c     "Missing \")\
118b0 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20  " following LHS 
118c0 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c  alias name \"%s\
118d0 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61  ".",psp->lhsalia
118e0 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  s);.        psp-
118f0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11900 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11910 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
11920 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
11930 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
11940 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49      case LHS_ALI
11950 41 53 5f 33 3a 0a 20 20 20 20 20 20 69 66 28 20  AS_3:.      if( 
11960 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31  x[0]==':' && x[1
11970 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d  ]==':' && x[2]==
11980 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '=' ){.        p
11990 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52  sp->state = IN_R
119a0 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  HS;.      }else{
119b0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
119c0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
119d0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
119e0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
119f0 73 69 6e 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c  sing \"->\" foll
11a00 6f 77 69 6e 67 3a 20 5c 22 25 73 28 25 73 29 5c  owing: \"%s(%s)\
11a10 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ".",.           
11a20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70  psp->lhs->name,p
11a30 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20  sp->lhsalias);. 
11a40 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
11a50 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
11a60 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
11a70 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
11a80 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
11a90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
11aa0 61 73 65 20 49 4e 5f 52 48 53 3a 0a 20 20 20 20  ase IN_RHS:.    
11ab0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
11ac0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
11ad0 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 20 20  t rule *rp;.    
11ae0 20 20 20 20 72 70 20 3d 20 28 73 74 72 75 63 74      rp = (struct
11af0 20 72 75 6c 65 20 2a 29 63 61 6c 6c 6f 63 28 20   rule *)calloc( 
11b00 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 72 75  sizeof(struct ru
11b10 6c 65 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20  le) +.          
11b20 20 20 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74     sizeof(struct
11b30 20 73 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e   symbol*)*psp->n
11b40 72 68 73 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  rhs + sizeof(cha
11b50 72 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 2c 20 31  r*)*psp->nrhs, 1
11b60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
11b70 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p==0 ){.        
11b80 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11b90 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11ba0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11bb0 20 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 6c         "Can't al
11bc0 6c 6f 63 61 74 65 20 65 6e 6f 75 67 68 20 6d 65  locate enough me
11bd0 6d 6f 72 79 20 66 6f 72 20 74 68 69 73 20 72 75  mory for this ru
11be0 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  le.");.         
11bf0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
11c00 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
11c10 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20  >prevrule = 0;. 
11c20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
11c30 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
11c40 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 75 6c           rp->rul
11c50 65 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b  eline = psp->tok
11c60 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  enlineno;.      
11c70 20 20 20 20 72 70 2d 3e 72 68 73 20 3d 20 28 73      rp->rhs = (s
11c80 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 2a 29 26  truct symbol**)&
11c90 72 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  rp[1];.         
11ca0 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 20 3d 20   rp->rhsalias = 
11cb0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 28  (const char**)&(
11cc0 72 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68  rp->rhs[psp->nrh
11cd0 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  s]);.          f
11ce0 6f 72 28 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e  or(i=0; i<psp->n
11cf0 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
11d00 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69         rp->rhs[i
11d10 5d 20 3d 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b  ] = psp->rhs[i];
11d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d  .            rp-
11d30 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70  >rhsalias[i] = p
11d40 73 70 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a 20 20  sp->alias[i];.  
11d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11d60 20 20 20 20 72 70 2d 3e 6c 68 73 20 3d 20 70 73      rp->lhs = ps
11d70 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 20 20  p->lhs;.        
11d80 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d    rp->lhsalias =
11d90 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a   psp->lhsalias;.
11da0 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 72            rp->nr
11db0 68 73 20 3d 20 70 73 70 2d 3e 6e 72 68 73 3b 0a  hs = psp->nrhs;.
11dc0 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 63 6f            rp->co
11dd0 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
11de0 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 31    rp->noCode = 1
11df0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
11e00 70 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20  precsym = 0;.   
11e10 20 20 20 20 20 20 20 72 70 2d 3e 69 6e 64 65 78         rp->index
11e20 20 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c   = psp->gp->nrul
11e30 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e++;.          r
11e40 70 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d  p->nextlhs = rp-
11e50 3e 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20  >lhs->rule;.    
11e60 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72        rp->lhs->r
11e70 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20  ule = rp;.      
11e80 20 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30      rp->next = 0
11e90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
11ea0 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d  psp->firstrule==
11eb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
11ec0 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20   psp->firstrule 
11ed0 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20  = psp->lastrule 
11ee0 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20  = rp;.          
11ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
11f00 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65     psp->lastrule
11f10 2d 3e 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20 20  ->next = rp;.   
11f20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61           psp->la
11f30 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20  strule = rp;.   
11f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11f50 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
11f60 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 7d   = rp;.        }
11f70 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
11f80 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
11f90 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
11fa0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11fb0 49 53 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b  ISALPHA(x[0]) ){
11fc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70  .        if( psp
11fd0 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20 29  ->nrhs>=MAXRHS )
11fe0 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
11ff0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
12000 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
12010 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
12020 20 22 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62 6f   "Too many symbo
12030 6c 73 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c  ls on RHS of rul
12040 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 5c  e beginning at \
12050 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20  "%s\".",.       
12060 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20       x);.       
12070 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
12080 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
12090 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
120a0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
120b0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OR;.        }els
120c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  e{.          psp
120d0 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  ->rhs[psp->nrhs]
120e0 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
120f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12100 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73  >alias[psp->nrhs
12110 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
12120 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 20 20   psp->nrhs++;.  
12130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
12140 6c 73 65 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27  lse if( (x[0]=='
12150 7c 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29  |' || x[0]=='/')
12160 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20   && psp->nrhs>0 
12170 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
12180 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20  t symbol *msp = 
12190 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72  psp->rhs[psp->nr
121a0 68 73 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  hs-1];.        i
121b0 66 28 20 6d 73 70 2d 3e 74 79 70 65 21 3d 4d 55  f( msp->type!=MU
121c0 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
121d0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
121e0 73 79 6d 62 6f 6c 20 2a 6f 72 69 67 73 70 20 3d  symbol *origsp =
121f0 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20   msp;.          
12200 6d 73 70 20 3d 20 28 73 74 72 75 63 74 20 73 79  msp = (struct sy
12210 6d 62 6f 6c 20 2a 29 20 63 61 6c 6c 6f 63 28 31  mbol *) calloc(1
12220 2c 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a  ,sizeof(*msp));.
12230 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
12240 28 6d 73 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (msp, 0, sizeof(
12250 2a 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20  *msp));.        
12260 20 20 6d 73 70 2d 3e 74 79 70 65 20 3d 20 4d 55    msp->type = MU
12270 4c 54 49 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20  LTITERMINAL;.   
12280 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62         msp->nsub
12290 73 79 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sym = 1;.       
122a0 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d     msp->subsym =
122b0 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20   (struct symbol 
122c0 2a 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a  **) calloc(1,siz
122d0 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
122e0 6c 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l*));.          
122f0 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 20 3d  msp->subsym[0] =
12300 20 6f 72 69 67 73 70 3b 0a 20 20 20 20 20 20 20   origsp;.       
12310 20 20 20 6d 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f     msp->name = o
12320 72 69 67 73 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20  rigsp->name;.   
12330 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b         psp->rhs[
12340 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d  psp->nrhs-1] = m
12350 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sp;.        }.  
12360 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73        msp->nsubs
12370 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73  ym++;.        ms
12380 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74 72  p->subsym = (str
12390 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72  uct symbol **) r
123a0 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73  ealloc(msp->subs
123b0 79 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 73 69  ym,.          si
123c0 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
123d0 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79  ol*)*msp->nsubsy
123e0 6d 29 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d  m);.        msp-
123f0 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75  >subsym[msp->nsu
12400 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c  bsym-1] = Symbol
12410 5f 6e 65 77 28 26 78 5b 31 5d 29 3b 0a 20 20 20  _new(&x[1]);.   
12420 20 20 20 20 20 69 66 28 20 49 53 4c 4f 57 45 52       if( ISLOWER
12430 28 78 5b 31 5d 29 20 7c 7c 20 49 53 4c 4f 57 45  (x[1]) || ISLOWE
12440 52 28 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d  R(msp->subsym[0]
12450 2d 3e 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20  ->name[0]) ){.  
12460 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
12470 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
12480 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
12490 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61  .            "Ca
124a0 6e 6e 6f 74 20 66 6f 72 6d 20 61 20 63 6f 6d 70  nnot form a comp
124b0 6f 75 6e 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ound containing 
124c0 61 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 22 29  a non-terminal")
124d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
124e0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
124f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
12500 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27  se if( x[0]=='('
12510 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20   && psp->nrhs>0 
12520 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
12530 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41  state = RHS_ALIA
12540 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_1;.      }else
12550 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
12560 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
12570 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
12580 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c  o,.          "Il
12590 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
125a0 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 3a 20  on RHS of rule: 
125b0 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20  \"%s\".",x);.   
125c0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
125d0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
125e0 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
125f0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
12600 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
12610 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
12620 65 20 52 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20  e RHS_ALIAS_1:. 
12630 20 20 20 20 20 69 66 28 20 49 53 41 4c 50 48 41       if( ISALPHA
12640 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
12650 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70    psp->alias[psp
12660 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20  ->nrhs-1] = x;. 
12670 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12680 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b  e = RHS_ALIAS_2;
12690 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
126a0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
126b0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
126c0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
126d0 20 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22           "\"%s\"
126e0 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
126f0 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 48  alias for the RH
12700 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c  S symbol \"%s\"\
12710 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c  n",.          x,
12720 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72  psp->rhs[psp->nr
12730 68 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  hs-1]->name);.  
12740 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
12750 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
12760 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
12770 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
12780 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
12790 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
127a0 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a  se RHS_ALIAS_2:.
127b0 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
127c0 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ')' ){.        p
127d0 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52  sp->state = IN_R
127e0 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  HS;.      }else{
127f0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
12800 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
12810 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
12820 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
12830 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f  sing \")\" follo
12840 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e  wing LHS alias n
12850 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70  ame \"%s\".",psp
12860 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
12870 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
12880 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
12890 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
128a0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
128b0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
128c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
128d0 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  e WAITING_FOR_DE
128e0 43 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20  CL_KEYWORD:.    
128f0 20 20 69 66 28 20 49 53 41 4c 50 48 41 28 78 5b    if( ISALPHA(x[
12900 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
12910 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20  sp->declkeyword 
12920 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = x;.        psp
12930 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
12940 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
12950 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d  decllinenoslot =
12960 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
12970 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
12980 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73   = 1;.        ps
12990 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
129a0 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b  NG_FOR_DECL_ARG;
129b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
129c0 63 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30  cmp(x,"name")==0
129d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
129e0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
129f0 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65   &(psp->gp->name
12a00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
12a10 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
12a20 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  o = 0;.        }
12a30 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
12a40 78 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20  x,"include")==0 
12a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
12a60 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
12a70 26 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75  &(psp->gp->inclu
12a80 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  de);.        }el
12a90 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
12aa0 22 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20  "code")==0 ){.  
12ab0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
12ac0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
12ad0 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 29  ->gp->extracode)
12ae0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
12af0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f  if( strcmp(x,"to
12b00 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72 22 29  ken_destructor")
12b10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12b20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
12b30 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f  t = &psp->gp->to
12b40 6b 65 6e 64 65 73 74 3b 0a 20 20 20 20 20 20 20  kendest;.       
12b50 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12b60 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 64 65 73  p(x,"default_des
12b70 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a  tructor")==0 ){.
12b80 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
12b90 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73  eclargslot = &ps
12ba0 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b 0a  p->gp->vardest;.
12bb0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
12bc0 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
12bd0 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30 20 29 7b  n_prefix")==0 ){
12be0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12bf0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70  declargslot = &p
12c00 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65  sp->gp->tokenpre
12c10 66 69 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70  fix;.          p
12c20 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
12c30 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
12c40 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12c50 70 28 78 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f  p(x,"syntax_erro
12c60 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
12c70 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
12c80 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
12c90 2d 3e 65 72 72 6f 72 29 3b 0a 20 20 20 20 20 20  ->error);.      
12ca0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
12cb0 6d 70 28 78 2c 22 70 61 72 73 65 5f 61 63 63 65  mp(x,"parse_acce
12cc0 70 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pt")==0 ){.     
12cd0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
12ce0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
12cf0 70 2d 3e 61 63 63 65 70 74 29 3b 0a 20 20 20 20  p->accept);.    
12d00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
12d10 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 66 61  rcmp(x,"parse_fa
12d20 69 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ilure")==0 ){.  
12d30 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
12d40 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
12d50 2d 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a  ->gp->failure);.
12d60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
12d70 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63  ( strcmp(x,"stac
12d80 6b 5f 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20  k_overflow")==0 
12d90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
12da0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
12db0 26 28 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66  &(psp->gp->overf
12dc0 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  low);.        }e
12dd0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
12de0 2c 22 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74  ,"extra_argument
12df0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
12e00 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
12e10 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
12e20 3e 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20  >arg);.         
12e30 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
12e40 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Macro = 0;.     
12e50 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
12e60 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70  cmp(x,"token_typ
12e70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
12e80 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
12e90 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
12ea0 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20  ->tokentype);.  
12eb0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
12ec0 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30  ertLineMacro = 0
12ed0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
12ee0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65  if( strcmp(x,"de
12ef0 66 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20  fault_type")==0 
12f00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
12f10 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
12f20 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79  &(psp->gp->varty
12f30 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pe);.          p
12f40 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
12f50 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
12f60 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12f70 70 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22  p(x,"stack_size"
12f80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12f90 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
12fa0 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
12fb0 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20  stacksize);.    
12fc0 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
12fd0 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a  tLineMacro = 0;.
12fe0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
12ff0 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 72  ( strcmp(x,"star
13000 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b  t_symbol")==0 ){
13010 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13020 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
13030 70 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b  psp->gp->start);
13040 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13050 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
13060 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
13070 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
13080 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20  "left")==0 ){.  
13090 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
130a0 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
130b0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
130c0 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20  ssoc = LEFT;.   
130d0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
130e0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
130f0 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
13100 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
13110 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 72   if( strcmp(x,"r
13120 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ight")==0 ){.   
13130 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63         psp->prec
13140 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20  counter++;.     
13150 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73       psp->declas
13160 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20 20 20  soc = RIGHT;.   
13170 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13180 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
13190 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
131a0 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
131b0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e   if( strcmp(x,"n
131c0 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a  onassoc")==0 ){.
131d0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
131e0 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  reccounter++;.  
131f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
13200 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20  lassoc = NONE;. 
13210 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
13220 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
13230 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
13240 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  BOL;.        }el
13250 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
13260 22 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30  "destructor")==0
13270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
13280 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
13290 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f  NG_FOR_DESTRUCTO
132a0 52 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20  R_SYMBOL;.      
132b0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
132c0 6d 70 28 78 2c 22 74 79 70 65 22 29 3d 3d 30 20  mp(x,"type")==0 
132d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
132e0 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
132f0 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
13300 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
13310 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13320 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30  x,"fallback")==0
13330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
13340 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  p->fallback = 0;
13350 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13360 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
13370 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b  FOR_FALLBACK_ID;
13380 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
13390 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b  f( strcmp(x,"tok
133a0 65 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  en")==0 ){.     
133b0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
133c0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 54 4f  = WAITING_FOR_TO
133d0 4b 45 4e 5f 4e 41 4d 45 3b 0a 20 20 20 20 20 20  KEN_NAME;.      
133e0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
133f0 6d 70 28 78 2c 22 77 69 6c 64 63 61 72 64 22 29  mp(x,"wildcard")
13400 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13410 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
13420 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41  ITING_FOR_WILDCA
13430 52 44 5f 49 44 3b 0a 20 20 20 20 20 20 20 20 7d  RD_ID;.        }
13440 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13450 78 2c 22 74 6f 6b 65 6e 5f 63 6c 61 73 73 22 29  x,"token_class")
13460 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13470 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
13480 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f  ITING_FOR_CLASS_
13490 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ID;.        }els
134a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  e{.          Err
134b0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
134c0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
134d0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
134e0 20 20 22 55 6e 6b 6e 6f 77 6e 20 64 65 63 6c 61    "Unknown decla
134f0 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20  ration keyword: 
13500 5c 22 25 25 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  \"%%%s\".",x);. 
13510 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
13520 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
13530 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
13540 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
13550 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
13560 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
13570 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
13580 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
13590 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
135a0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c  ,.          "Ill
135b0 65 67 61 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e  egal declaration
135c0 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22   keyword: \"%s\"
135d0 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  .",x);.        p
135e0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
135f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
13600 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
13610 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
13620 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
13630 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
13640 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54  ING_FOR_DESTRUCT
13650 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20  OR_SYMBOL:.     
13660 20 69 66 28 20 21 49 53 41 4c 50 48 41 28 78 5b   if( !ISALPHA(x[
13670 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
13680 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
13690 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
136a0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
136b0 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d    "Symbol name m
136c0 69 73 73 69 6e 67 20 61 66 74 65 72 20 25 25 64  issing after %%d
136d0 65 73 74 72 75 63 74 6f 72 20 6b 65 79 77 6f 72  estructor keywor
136e0 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  d");.        psp
136f0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
13700 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
13710 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
13720 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20  DECL_ERROR;.    
13730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13740 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
13750 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
13760 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
13770 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
13780 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a  sp->destructor;.
13790 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
137a0 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20 26 73  llinenoslot = &s
137b0 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 3b 0a 20  p->destLineno;. 
137c0 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
137d0 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 31 3b  rtLineMacro = 1;
137e0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
137f0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
13800 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20  R_DECL_ARG;.    
13810 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
13820 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
13830 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
13840 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28  YMBOL:.      if(
13850 20 21 49 53 41 4c 50 48 41 28 78 5b 30 5d 29 20   !ISALPHA(x[0]) 
13860 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
13870 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
13880 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
13890 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53  no,.          "S
138a0 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69  ymbol name missi
138b0 6e 67 20 61 66 74 65 72 20 25 25 74 79 70 65 20  ng after %%type 
138c0 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20 20  keyword");.     
138d0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
138e0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
138f0 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
13900 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
13910 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13920 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
13930 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f  mbol *sp = Symbo
13940 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20 20 20 20  l_find(x);.     
13950 20 20 20 69 66 28 28 73 70 29 20 26 26 20 28 73     if((sp) && (s
13960 70 2d 3e 64 61 74 61 74 79 70 65 29 29 7b 0a 20  p->datatype)){. 
13970 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
13980 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
13990 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
139a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53  ,.            "S
139b0 79 6d 62 6f 6c 20 25 25 74 79 70 65 20 5c 22 25  ymbol %%type \"%
139c0 73 5c 22 20 61 6c 72 65 61 64 79 20 64 65 66 69  s\" already defi
139d0 6e 65 64 22 2c 20 78 29 3b 0a 20 20 20 20 20 20  ned", x);.      
139e0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
139f0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t++;.          p
13a00 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
13a10 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
13a20 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ROR;.        }el
13a30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
13a40 20 28 21 73 70 29 7b 0a 20 20 20 20 20 20 20 20   (!sp){.        
13a50 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f      sp = Symbol_
13a60 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
13a70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 73    }.          ps
13a80 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
13a90 20 26 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a   &sp->datatype;.
13aa0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69            psp->i
13ab0 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
13ac0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73   0;.          ps
13ad0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
13ae0 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b  NG_FOR_DECL_ARG;
13af0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13b00 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
13b10 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
13b20 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f  _FOR_PRECEDENCE_
13b30 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66  SYMBOL:.      if
13b40 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
13b50 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13b60 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
13b70 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
13b80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53      }else if( IS
13b90 55 50 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20  UPPER(x[0]) ){. 
13ba0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
13bb0 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 20 20 20 20  mbol *sp;.      
13bc0 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65    sp = Symbol_ne
13bd0 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  w(x);.        if
13be0 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b  ( sp->prec>=0 ){
13bf0 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
13c00 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
13c10 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
13c20 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
13c30 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 68  "Symbol \"%s\" h
13c40 61 73 20 61 6c 72 65 61 64 79 20 62 65 20 67 69  as already be gi
13c50 76 65 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65  ven a precedence
13c60 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20  .",x);.         
13c70 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
13c80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
13c90 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 70  .          sp->p
13ca0 72 65 63 20 3d 20 70 73 70 2d 3e 70 72 65 63 63  rec = psp->precc
13cb0 6f 75 6e 74 65 72 3b 0a 20 20 20 20 20 20 20 20  ounter;.        
13cc0 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73    sp->assoc = ps
13cd0 70 2d 3e 64 65 63 6c 61 73 73 6f 63 3b 0a 20 20  p->declassoc;.  
13ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
13cf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
13d00 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
13d10 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
13d20 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
13d30 22 43 61 6e 27 74 20 61 73 73 69 67 6e 20 61 20  "Can't assign a 
13d40 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20 5c 22  precedence to \"
13d50 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  %s\".",x);.     
13d60 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
13d70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
13d80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
13d90 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  e WAITING_FOR_DE
13da0 43 4c 5f 41 52 47 3a 0a 20 20 20 20 20 20 69 66  CL_ARG:.      if
13db0 28 20 78 5b 30 5d 3d 3d 27 7b 27 20 7c 7c 20 78  ( x[0]=='{' || x
13dc0 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20 49 53 41  [0]=='\"' || ISA
13dd0 4c 4e 55 4d 28 78 5b 30 5d 29 20 29 7b 0a 20 20  LNUM(x[0]) ){.  
13de0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
13df0 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e 65 77 3b 0a 20   *zOld, *zNew;. 
13e00 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75         char *zBu
13e10 66 2c 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 69  f, *z;.        i
13e20 6e 74 20 6e 4f 6c 64 2c 20 6e 2c 20 6e 4c 69 6e  nt nOld, n, nLin
13e30 65 20 3d 20 30 2c 20 6e 4e 65 77 2c 20 6e 42 61  e = 0, nNew, nBa
13e40 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ck;.        int 
13e50 61 64 64 4c 69 6e 65 4d 61 63 72 6f 3b 0a 20 20  addLineMacro;.  
13e60 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65        char zLine
13e70 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4e  [50];.        zN
13e80 65 77 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  ew = x;.        
13e90 69 66 28 20 7a 4e 65 77 5b 30 5d 3d 3d 27 22 27  if( zNew[0]=='"'
13ea0 20 7c 7c 20 7a 4e 65 77 5b 30 5d 3d 3d 27 7b 27   || zNew[0]=='{'
13eb0 20 29 20 7a 4e 65 77 2b 2b 3b 0a 20 20 20 20 20   ) zNew++;.     
13ec0 20 20 20 6e 4e 65 77 20 3d 20 6c 65 6d 6f 6e 53     nNew = lemonS
13ed0 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a 20 20 20  trlen(zNew);.   
13ee0 20 20 20 20 20 69 66 28 20 2a 70 73 70 2d 3e 64       if( *psp->d
13ef0 65 63 6c 61 72 67 73 6c 6f 74 20 29 7b 0a 20 20  eclargslot ){.  
13f00 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20 2a          zOld = *
13f10 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
13f20 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
13f30 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20  .          zOld 
13f40 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = "";.        }.
13f50 20 20 20 20 20 20 20 20 6e 4f 6c 64 20 3d 20 6c          nOld = l
13f60 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f 6c 64 29  emonStrlen(zOld)
13f70 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 4f  ;.        n = nO
13f80 6c 64 20 2b 20 6e 4e 65 77 20 2b 20 32 30 3b 0a  ld + nNew + 20;.
13f90 20 20 20 20 20 20 20 20 61 64 64 4c 69 6e 65 4d          addLineM
13fa0 61 63 72 6f 20 3d 20 21 70 73 70 2d 3e 67 70 2d  acro = !psp->gp-
13fb0 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 26  >nolinenosflag &
13fc0 26 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e  & psp->insertLin
13fd0 65 4d 61 63 72 6f 20 26 26 0a 20 20 20 20 20 20  eMacro &&.      
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ff0 20 20 28 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65    (psp->declline
14000 6e 6f 73 6c 6f 74 3d 3d 30 20 7c 7c 20 70 73 70  noslot==0 || psp
14010 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74  ->decllinenoslot
14020 5b 30 5d 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  [0]!=0);.       
14030 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61 63 72   if( addLineMacr
14040 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  o ){.          f
14050 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e 61  or(z=psp->filena
14060 6d 65 2c 20 6e 42 61 63 6b 3d 30 3b 20 2a 7a 3b  me, nBack=0; *z;
14070 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   z++){.         
14080 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20     if( *z=='\\' 
14090 29 20 6e 42 61 63 6b 2b 2b 3b 0a 20 20 20 20 20  ) nBack++;.     
140a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
140b0 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a   lemon_sprintf(z
140c0 4c 69 6e 65 2c 20 22 23 6c 69 6e 65 20 25 64 20  Line, "#line %d 
140d0 22 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  ", psp->tokenlin
140e0 65 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eno);.          
140f0 6e 4c 69 6e 65 20 3d 20 6c 65 6d 6f 6e 53 74 72  nLine = lemonStr
14100 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  len(zLine);.    
14110 20 20 20 20 20 20 6e 20 2b 3d 20 6e 4c 69 6e 65        n += nLine
14120 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70   + lemonStrlen(p
14130 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b 20  sp->filename) + 
14140 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nBack;.        }
14150 0a 20 20 20 20 20 20 20 20 2a 70 73 70 2d 3e 64  .        *psp->d
14160 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 28 63 68  eclargslot = (ch
14170 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63 28 2a 70  ar *) realloc(*p
14180 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 2c  sp->declargslot,
14190 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75   n);.        zBu
141a0 66 20 3d 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72  f = *psp->declar
141b0 67 73 6c 6f 74 20 2b 20 6e 4f 6c 64 3b 0a 20 20  gslot + nOld;.  
141c0 20 20 20 20 20 20 69 66 28 20 61 64 64 4c 69 6e        if( addLin
141d0 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20 20 20  eMacro ){.      
141e0 20 20 20 20 69 66 28 20 6e 4f 6c 64 20 26 26 20      if( nOld && 
141f0 7a 42 75 66 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29  zBuf[-1]!='\n' )
14200 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 28  {.            *(
14210 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a  zBuf++) = '\n';.
14220 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14230 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
14240 66 2c 20 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  f, zLine, nLine)
14250 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 42 75 66  ;.          zBuf
14260 20 2b 3d 20 6e 4c 69 6e 65 3b 0a 20 20 20 20 20   += nLine;.     
14270 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
14280 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '"';.          
14290 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e  for(z=psp->filen
142a0 61 6d 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ame; *z; z++){. 
142b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a             if( *
142c0 7a 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  z=='\\' ){.     
142d0 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b           *(zBuf+
142e0 2b 29 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20  +) = '\\';.     
142f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14300 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
14310 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   *z;.          }
14320 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75  .          *(zBu
14330 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20 20  f++) = '"';.    
14340 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20        *(zBuf++) 
14350 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
14360 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  }.        if( ps
14370 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f  p->decllinenoslo
14380 74 20 26 26 20 70 73 70 2d 3e 64 65 63 6c 6c 69  t && psp->declli
14390 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 3d 3d 30 20 29  nenoslot[0]==0 )
143a0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
143b0 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b  >decllinenoslot[
143c0 30 5d 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  0] = psp->tokenl
143d0 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d  ineno;.        }
143e0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
143f0 7a 42 75 66 2c 20 7a 4e 65 77 2c 20 6e 4e 65 77  zBuf, zNew, nNew
14400 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 20  );.        zBuf 
14410 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20  += nNew;.       
14420 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20 20 20 20   *zBuf = 0;.    
14430 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
14440 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
14450 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
14460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14470 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
14480 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
14490 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
144a0 20 20 20 22 49 6c 6c 65 67 61 6c 20 61 72 67 75     "Illegal argu
144b0 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a 20 25 73  ment to %%%s: %s
144c0 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f  ",psp->declkeywo
144d0 72 64 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  rd,x);.        p
144e0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
144f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
14500 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
14510 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
14520 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
14530 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
14540 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b  ING_FOR_FALLBACK
14550 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78  _ID:.      if( x
14560 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
14570 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
14580 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
14590 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
145a0 20 7d 65 6c 73 65 20 69 66 28 20 21 49 53 55 50   }else if( !ISUP
145b0 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  PER(x[0]) ){.   
145c0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
145d0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70  p->filename, psp
145e0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
145f0 20 20 20 20 20 20 20 20 20 22 25 25 66 61 6c 6c           "%%fall
14600 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 5c 22  back argument \"
14610 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61  %s\" should be a
14620 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20   token", x);.   
14630 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
14640 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
14650 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
14660 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53  t symbol *sp = S
14670 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
14680 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 66        if( psp->f
14690 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20  allback==0 ){.  
146a0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c          psp->fal
146b0 6c 62 61 63 6b 20 3d 20 73 70 3b 0a 20 20 20 20  lback = sp;.    
146c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
146d0 2d 3e 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ->fallback ){.  
146e0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
146f0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
14700 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
14710 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 4d  ,.            "M
14720 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 66 61 6c  ore than one fal
14730 6c 62 61 63 6b 20 61 73 73 69 67 6e 65 64 20 74  lback assigned t
14740 6f 20 74 6f 6b 65 6e 20 25 73 22 2c 20 78 29 3b  o token %s", x);
14750 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
14760 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
14770 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14780 20 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63       sp->fallbac
14790 6b 20 3d 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63  k = psp->fallbac
147a0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  k;.          psp
147b0 2d 3e 67 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61  ->gp->has_fallba
147c0 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ck = 1;.        
147d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
147e0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
147f0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 54 4f 4b 45  WAITING_FOR_TOKE
14800 4e 5f 4e 41 4d 45 3a 0a 20 20 20 20 20 20 2f 2a  N_NAME:.      /*
14810 20 54 6f 6b 65 6e 73 20 64 6f 20 6e 6f 74 20 68   Tokens do not h
14820 61 76 65 20 74 6f 20 62 65 20 64 65 63 6c 61 72  ave to be declar
14830 65 64 20 62 65 66 6f 72 65 20 75 73 65 2e 20 20  ed before use.  
14840 42 75 74 20 74 68 65 79 20 63 61 6e 20 62 65 0a  But they can be.
14850 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f 72 64 65        ** in orde
14860 72 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  r to control the
14870 69 72 20 61 73 73 69 67 6e 65 64 20 69 6e 74 65  ir assigned inte
14880 67 65 72 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ger number.  The
14890 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 20 20   number for.    
148a0 20 20 2a 2a 20 65 61 63 68 20 74 6f 6b 65 6e 20    ** each token 
148b0 69 73 20 61 73 73 69 67 6e 65 64 20 77 68 65 6e  is assigned when
148c0 20 69 74 20 69 73 20 66 69 72 73 74 20 73 65 65   it is first see
148d0 6e 2e 20 20 53 6f 20 62 79 20 69 6e 63 6c 75 64  n.  So by includ
148e0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ing.      **.   
148f0 20 20 20 2a 2a 20 20 20 20 20 25 74 6f 6b 65 6e     **     %token
14900 20 4f 4e 45 20 54 57 4f 20 54 48 52 45 45 0a 20   ONE TWO THREE. 
14910 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
14920 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 67 72   early in the gr
14930 61 6d 6d 61 72 20 66 69 6c 65 2c 20 74 68 61 74  ammar file, that
14940 20 61 73 73 69 67 6e 73 20 73 6d 61 6c 6c 20 63   assigns small c
14950 6f 6e 73 65 63 75 74 69 76 65 20 76 61 6c 75 65  onsecutive value
14960 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 61  s.      ** to ea
14970 63 68 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 73  ch of the tokens
14980 20 4f 4e 45 20 54 57 4f 20 61 6e 64 20 54 48 52   ONE TWO and THR
14990 45 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  EE..      */.   
149a0 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
149b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
149c0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
149d0 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
149e0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
149f0 66 28 20 21 49 53 55 50 50 45 52 28 78 5b 30 5d  f( !ISUPPER(x[0]
14a00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ) ){.        Err
14a10 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
14a20 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ame, psp->tokenl
14a30 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
14a40 20 22 25 25 74 6f 6b 65 6e 20 61 72 67 75 6d 65   "%%token argume
14a50 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64  nt \"%s\" should
14a60 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29   be a token", x)
14a70 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
14a80 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
14a90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14aa0 28 76 6f 69 64 29 53 79 6d 62 6f 6c 5f 6e 65 77  (void)Symbol_new
14ab0 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (x);.      }.   
14ac0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
14ad0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57  se WAITING_FOR_W
14ae0 49 4c 44 43 41 52 44 5f 49 44 3a 0a 20 20 20 20  ILDCARD_ID:.    
14af0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
14b00 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
14b10 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
14b20 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
14b30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
14b40 28 20 21 49 53 55 50 50 45 52 28 78 5b 30 5d 29  ( !ISUPPER(x[0])
14b50 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
14b60 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
14b70 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
14b80 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
14b90 22 25 25 77 69 6c 64 63 61 72 64 20 61 72 67 75  "%%wildcard argu
14ba0 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75  ment \"%s\" shou
14bb0 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20  ld be a token", 
14bc0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
14bd0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
14be0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14bf0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
14c00 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
14c10 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
14c20 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61   psp->gp->wildca
14c30 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rd==0 ){.       
14c40 20 20 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64     psp->gp->wild
14c50 63 61 72 64 20 3d 20 73 70 3b 0a 20 20 20 20 20  card = sp;.     
14c60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14c70 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
14c80 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
14c90 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
14ca0 20 20 20 20 20 20 20 20 20 20 22 45 78 74 72 61            "Extra
14cb0 20 77 69 6c 64 63 61 72 64 20 74 6f 20 74 6f 6b   wildcard to tok
14cc0 65 6e 3a 20 25 73 22 2c 20 78 29 3b 0a 20 20 20  en: %s", x);.   
14cd0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
14ce0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
14cf0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
14d00 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
14d10 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53  WAITING_FOR_CLAS
14d20 53 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20  S_ID:.      if( 
14d30 21 49 53 4c 4f 57 45 52 28 78 5b 30 5d 29 20 29  !ISLOWER(x[0]) )
14d40 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
14d50 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
14d60 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  , psp->tokenline
14d70 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25  no,.          "%
14d80 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 6d 75 73  %token_class mus
14d90 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79  t be followed by
14da0 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 3a 20   an identifier: 
14db0 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ", x);.        p
14dc0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
14dd0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
14de0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
14df0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
14e00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 79 6d     }else if( Sym
14e10 62 6f 6c 5f 66 69 6e 64 28 78 29 20 29 7b 0a 20  bol_find(x) ){. 
14e20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
14e30 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70  psp->filename, p
14e40 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
14e50 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62  .          "Symb
14e60 6f 6c 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64  ol \"%s\" alread
14e70 79 20 75 73 65 64 22 2c 20 78 29 3b 0a 20 20 20  y used", x);.   
14e80 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
14e90 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
14ea0 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
14eb0 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
14ec0 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
14ed0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 74 6b  .        psp->tk
14ee0 63 6c 61 73 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e  class = Symbol_n
14ef0 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ew(x);.        p
14f00 73 70 2d 3e 74 6b 63 6c 61 73 73 2d 3e 74 79 70  sp->tkclass->typ
14f10 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41  e = MULTITERMINA
14f20 4c 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  L;.        psp->
14f30 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
14f40 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 3b  FOR_CLASS_TOKEN;
14f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
14f60 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
14f70 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53  AITING_FOR_CLASS
14f80 5f 54 4f 4b 45 4e 3a 0a 20 20 20 20 20 20 69 66  _TOKEN:.      if
14f90 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
14fa0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
14fb0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
14fc0 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
14fd0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53      }else if( IS
14fe0 55 50 50 45 52 28 78 5b 30 5d 29 20 7c 7c 20 28  UPPER(x[0]) || (
14ff0 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78 5b  (x[0]=='|' || x[
15000 30 5d 3d 3d 27 2f 27 29 20 26 26 20 49 53 55 50  0]=='/') && ISUP
15010 50 45 52 28 78 5b 31 5d 29 29 20 29 7b 0a 20 20  PER(x[1])) ){.  
15020 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
15030 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d 3e  bol *msp = psp->
15040 74 6b 63 6c 61 73 73 3b 0a 20 20 20 20 20 20 20  tkclass;.       
15050 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b 3b   msp->nsubsym++;
15060 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75  .        msp->su
15070 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20 73  bsym = (struct s
15080 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c 6c 6f  ymbol **) reallo
15090 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c 0a 20  c(msp->subsym,. 
150a0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
150b0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a  struct symbol*)*
150c0 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a 20  msp->nsubsym);. 
150d0 20 20 20 20 20 20 20 69 66 28 20 21 49 53 55 50         if( !ISUP
150e0 50 45 52 28 78 5b 30 5d 29 20 29 20 78 2b 2b 3b  PER(x[0]) ) x++;
150f0 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75  .        msp->su
15100 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79  bsym[msp->nsubsy
15110 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  m-1] = Symbol_ne
15120 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  w(x);.      }els
15130 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
15140 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
15150 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
15160 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
15170 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 61 72  %%token_class ar
15180 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68  gument \"%s\" sh
15190 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22  ould be a token"
151a0 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  , x);.        ps
151b0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
151c0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
151d0 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
151e0 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
151f0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
15200 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 59 4e  ;.    case RESYN
15210 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
15220 4f 52 3a 0a 2f 2a 20 20 20 20 20 20 69 66 28 20  OR:./*      if( 
15230 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d  x[0]=='.' ) psp-
15240 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
15250 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
15260 45 3b 0a 2a 2a 20 20 20 20 20 20 62 72 65 61 6b  E;.**      break
15270 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 52 45  ; */.    case RE
15280 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
15290 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 69 66 28  ERROR:.      if(
152a0 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70   x[0]=='.' ) psp
152b0 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
152c0 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
152d0 4c 45 3b 0a 20 20 20 20 20 20 69 66 28 20 78 5b  LE;.      if( x[
152e0 30 5d 3d 3d 27 25 27 20 29 20 70 73 70 2d 3e 73  0]=='%' ) psp->s
152f0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
15300 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b  OR_DECL_KEYWORD;
15310 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15320 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 74 68 65 20  }.}../* Run the 
15330 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6f 76 65  preprocessor ove
15340 72 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  r the input file
15350 20 74 65 78 74 2e 20 20 54 68 65 20 67 6c 6f 62   text.  The glob
15360 61 6c 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  al variables.** 
15370 61 7a 44 65 66 69 6e 65 5b 30 5d 20 74 68 72 6f  azDefine[0] thro
15380 75 67 68 20 61 7a 44 65 66 69 6e 65 5b 6e 44 65  ugh azDefine[nDe
15390 66 69 6e 65 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  fine-1] contains
153a0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
153b0 6c 20 64 65 66 69 6e 65 64 0a 2a 2a 20 6d 61 63  l defined.** mac
153c0 72 6f 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ros.  This routi
153d0 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20 22 25 69  ne looks for "%i
153e0 66 64 65 66 22 20 61 6e 64 20 22 25 69 66 6e 64  fdef" and "%ifnd
153f0 65 66 22 20 61 6e 64 20 22 25 65 6e 64 69 66 22  ef" and "%endif"
15400 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73   and.** comments
15410 20 74 68 65 6d 20 6f 75 74 2e 20 20 54 65 78 74   them out.  Text
15420 20 69 6e 20 62 65 74 77 65 65 6e 20 69 73 20 61   in between is a
15430 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  lso commented ou
15440 74 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  t as appropriate
15450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15460 20 70 72 65 70 72 6f 63 65 73 73 5f 69 6e 70 75   preprocess_inpu
15470 74 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t(char *z){.  in
15480 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20  t i, j, k, n;.  
15490 69 6e 74 20 65 78 63 6c 75 64 65 20 3d 20 30 3b  int exclude = 0;
154a0 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30  .  int start = 0
154b0 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d  ;.  int lineno =
154c0 20 31 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 5f   1;.  int start_
154d0 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f  lineno = 1;.  fo
154e0 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
154f0 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
15500 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
15510 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 21 3d  ;.    if( z[i]!=
15520 27 25 27 20 7c 7c 20 28 69 3e 30 20 26 26 20 7a  '%' || (i>0 && z
15530 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29 20 29 20 63  [i-1]!='\n') ) c
15540 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
15550 20 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22   strncmp(&z[i],"
15560 25 65 6e 64 69 66 22 2c 36 29 3d 3d 30 20 26 26  %endif",6)==0 &&
15570 20 49 53 53 50 41 43 45 28 7a 5b 69 2b 36 5d 29   ISSPACE(z[i+6])
15580 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78   ){.      if( ex
15590 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20  clude ){.       
155a0 20 65 78 63 6c 75 64 65 2d 2d 3b 0a 20 20 20 20   exclude--;.    
155b0 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 3d      if( exclude=
155c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
155d0 66 6f 72 28 6a 3d 73 74 61 72 74 3b 20 6a 3c 69  for(j=start; j<i
155e0 3b 20 6a 2b 2b 29 20 69 66 28 20 7a 5b 6a 5d 21  ; j++) if( z[j]!
155f0 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d 20 3d 20 27  ='\n' ) z[j] = '
15600 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
15610 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
15620 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a  j=i; z[j] && z[j
15630 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b  ]!='\n'; j++) z[
15640 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 65  j] = ' ';.    }e
15650 6c 73 65 20 69 66 28 20 28 73 74 72 6e 63 6d 70  lse if( (strncmp
15660 28 26 7a 5b 69 5d 2c 22 25 69 66 64 65 66 22 2c  (&z[i],"%ifdef",
15670 36 29 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45  6)==0 && ISSPACE
15680 28 7a 5b 69 2b 36 5d 29 29 0a 20 20 20 20 20 20  (z[i+6])).      
15690 20 20 20 20 7c 7c 20 28 73 74 72 6e 63 6d 70 28      || (strncmp(
156a0 26 7a 5b 69 5d 2c 22 25 69 66 6e 64 65 66 22 2c  &z[i],"%ifndef",
156b0 37 29 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45  7)==0 && ISSPACE
156c0 28 7a 5b 69 2b 37 5d 29 29 20 29 7b 0a 20 20 20  (z[i+7])) ){.   
156d0 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29     if( exclude )
156e0 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64  {.        exclud
156f0 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e++;.      }else
15700 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
15710 69 2b 37 3b 20 49 53 53 50 41 43 45 28 7a 5b 6a  i+7; ISSPACE(z[j
15720 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); j++){}.     
15730 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b     for(n=0; z[j+
15740 6e 5d 20 26 26 20 21 49 53 53 50 41 43 45 28 7a  n] && !ISSPACE(z
15750 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20  [j+n]); n++){}. 
15760 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d         exclude =
15770 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   1;.        for(
15780 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69 6e 65 3b 20  k=0; k<nDefine; 
15790 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
157a0 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 44 65  if( strncmp(azDe
157b0 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29  fine[k],&z[j],n)
157c0 3d 3d 30 20 26 26 20 6c 65 6d 6f 6e 53 74 72 6c  ==0 && lemonStrl
157d0 65 6e 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 29 3d  en(azDefine[k])=
157e0 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =n ){.          
157f0 20 20 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20    exclude = 0;. 
15800 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
15810 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15830 69 66 28 20 7a 5b 69 2b 33 5d 3d 3d 27 6e 27 20  if( z[i+3]=='n' 
15840 29 20 65 78 63 6c 75 64 65 20 3d 20 21 65 78 63  ) exclude = !exc
15850 6c 75 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66  lude;.        if
15860 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20  ( exclude ){.   
15870 20 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 69         start = i
15880 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72  ;.          star
15890 74 5f 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e  t_lineno = linen
158a0 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  o;.        }.   
158b0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
158c0 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d  =i; z[j] && z[j]
158d0 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a  !='\n'; j++) z[j
158e0 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20  ] = ' ';.    }. 
158f0 20 7d 0a 20 20 69 66 28 20 65 78 63 6c 75 64 65   }.  if( exclude
15900 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
15910 73 74 64 65 72 72 2c 22 75 6e 74 65 72 6d 69 6e  stderr,"untermin
15920 61 74 65 64 20 25 25 69 66 64 65 66 20 73 74 61  ated %%ifdef sta
15930 72 74 69 6e 67 20 6f 6e 20 6c 69 6e 65 20 25 64  rting on line %d
15940 5c 6e 22 2c 20 73 74 61 72 74 5f 6c 69 6e 65 6e  \n", start_linen
15950 6f 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  o);.    exit(1);
15960 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70  .  }.}../* In sp
15970 69 74 65 20 6f 66 20 69 74 73 20 6e 61 6d 65 2c  ite of its name,
15980 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
15990 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6e 6e  s really a scann
159a0 65 72 2e 20 20 49 74 20 72 65 61 64 0a 2a 2a 20  er.  It read.** 
159b0 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e  in the entire in
159c0 70 75 74 20 66 69 6c 65 20 28 61 6c 6c 20 61 74  put file (all at
159d0 20 6f 6e 63 65 29 20 74 68 65 6e 20 74 6f 6b 65   once) then toke
159e0 6e 69 7a 65 73 20 69 74 2e 20 20 45 61 63 68 0a  nizes it.  Each.
159f0 2a 2a 20 74 6f 6b 65 6e 20 69 73 20 70 61 73 73  ** token is pass
15a00 65 64 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ed to the functi
15a10 6f 6e 20 22 70 61 72 73 65 6f 6e 65 74 6f 6b 65  on "parseonetoke
15a20 6e 22 20 77 68 69 63 68 20 62 75 69 6c 64 73 20  n" which builds 
15a30 61 6c 6c 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f  all.** the appro
15a40 70 72 69 61 74 65 20 64 61 74 61 20 73 74 72 75  priate data stru
15a50 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 67 6c  ctures in the gl
15a60 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f  obal state vecto
15a70 72 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20  r "gp"..*/.void 
15a80 50 61 72 73 65 28 73 74 72 75 63 74 20 6c 65 6d  Parse(struct lem
15a90 6f 6e 20 2a 67 70 29 0a 7b 0a 20 20 73 74 72 75  on *gp).{.  stru
15aa0 63 74 20 70 73 74 61 74 65 20 70 73 3b 0a 20 20  ct pstate ps;.  
15ab0 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63 68 61 72  FILE *fp;.  char
15ac0 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20 75 6e 73   *filebuf;.  uns
15ad0 69 67 6e 65 64 20 69 6e 74 20 66 69 6c 65 73 69  igned int filesi
15ae0 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f  ze;.  int lineno
15af0 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61  ;.  int c;.  cha
15b00 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70 3b 0a  r *cp, *nextcp;.
15b10 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e 65 20    int startline 
15b20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  = 0;..  memset(&
15b30 70 73 2c 20 27 5c 30 27 2c 20 73 69 7a 65 6f 66  ps, '\0', sizeof
15b40 28 70 73 29 29 3b 0a 20 20 70 73 2e 67 70 20 3d  (ps));.  ps.gp =
15b50 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65 6e 61   gp;.  ps.filena
15b60 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e 61 6d  me = gp->filenam
15b70 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63 6e 74  e;.  ps.errorcnt
15b80 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61 74 65   = 0;.  ps.state
15b90 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a   = INITIALIZE;..
15ba0 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 65    /* Begin by re
15bb0 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20  ading the input 
15bc0 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d 20 66  file */.  fp = f
15bd0 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61 6d 65  open(ps.filename
15be0 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"rb");.  if( fp
15bf0 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
15c00 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
15c10 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68  0,"Can't open th
15c20 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  is file for read
15c30 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70 2d 3e  ing.");.    gp->
15c40 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
15c50 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 73  return;.  }.  fs
15c60 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20 20 66  eek(fp,0,2);.  f
15c70 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c 6c 28  ilesize = ftell(
15c80 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 70  fp);.  rewind(fp
15c90 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d 20 28  );.  filebuf = (
15ca0 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 66  char *)malloc( f
15cb0 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20 20 69  ilesize+1 );.  i
15cc0 66 28 20 66 69 6c 65 73 69 7a 65 3e 31 30 30 30  f( filesize>1000
15cd0 30 30 30 30 30 20 7c 7c 20 66 69 6c 65 62 75 66  00000 || filebuf
15ce0 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
15cf0 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
15d00 30 2c 22 49 6e 70 75 74 20 66 69 6c 65 20 74 6f  0,"Input file to
15d10 6f 20 6c 61 72 67 65 2e 22 29 3b 0a 20 20 20 20  o large.");.    
15d20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  gp->errorcnt++;.
15d30 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a      fclose(fp);.
15d40 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
15d50 20 20 69 66 28 20 66 72 65 61 64 28 66 69 6c 65    if( fread(file
15d60 62 75 66 2c 31 2c 66 69 6c 65 73 69 7a 65 2c 66  buf,1,filesize,f
15d70 70 29 21 3d 66 69 6c 65 73 69 7a 65 20 29 7b 0a  p)!=filesize ){.
15d80 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e      ErrorMsg(ps.
15d90 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27  filename,0,"Can'
15da0 74 20 72 65 61 64 20 69 6e 20 61 6c 6c 20 25 64  t read in all %d
15db0 20 62 79 74 65 73 20 6f 66 20 74 68 69 73 20 66   bytes of this f
15dc0 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66 69 6c  ile.",.      fil
15dd0 65 73 69 7a 65 29 3b 0a 20 20 20 20 66 72 65 65  esize);.    free
15de0 28 66 69 6c 65 62 75 66 29 3b 0a 20 20 20 20 67  (filebuf);.    g
15df0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
15e00 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20     fclose(fp);. 
15e10 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
15e20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 66   fclose(fp);.  f
15e30 69 6c 65 62 75 66 5b 66 69 6c 65 73 69 7a 65 5d  ilebuf[filesize]
15e40 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65   = 0;..  /* Make
15e50 20 61 6e 20 69 6e 69 74 69 61 6c 20 70 61 73 73   an initial pass
15e60 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
15e70 65 20 74 6f 20 68 61 6e 64 6c 65 20 25 69 66 64  e to handle %ifd
15e80 65 66 20 61 6e 64 20 25 69 66 6e 64 65 66 20 2a  ef and %ifndef *
15e90 2f 0a 20 20 70 72 65 70 72 6f 63 65 73 73 5f 69  /.  preprocess_i
15ea0 6e 70 75 74 28 66 69 6c 65 62 75 66 29 3b 0a 0a  nput(filebuf);..
15eb0 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e 20 74 68    /* Now scan th
15ec0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 69 6e  e text of the in
15ed0 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 6c 69  put file */.  li
15ee0 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28  neno = 1;.  for(
15ef0 63 70 3d 66 69 6c 65 62 75 66 3b 20 28 63 3d 20  cp=filebuf; (c= 
15f00 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20 20 20 20  *cp)!=0; ){.    
15f10 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
15f20 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20 20 20 20  neno++;         
15f30 20 20 20 20 20 2f 2a 20 4b 65 65 70 20 74 72 61       /* Keep tra
15f40 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e  ck of the line n
15f50 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  umber */.    if(
15f60 20 49 53 53 50 41 43 45 28 63 29 20 29 7b 20 63   ISSPACE(c) ){ c
15f70 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  p++; continue; }
15f80 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c 20 77 68    /* Skip all wh
15f90 69 74 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ite space */.   
15fa0 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
15fb0 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 20 20  p[1]=='/' ){    
15fc0 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 2b        /* Skip C+
15fd0 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73  + style comments
15fe0 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b   */.      cp+=2;
15ff0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
16000 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d  = *cp)!=0 && c!=
16010 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20  '\n' ) cp++;.   
16020 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
16030 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f   }.    if( c=='/
16040 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20  ' && cp[1]=='*' 
16050 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ){          /* S
16060 6b 69 70 20 43 20 73 74 79 6c 65 20 63 6f 6d 6d  kip C style comm
16070 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70  ents */.      cp
16080 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  +=2;.      while
16090 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ( (c= *cp)!=0 &&
160a0 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63 70 5b 2d   (c!='/' || cp[-
160b0 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20  1]!='*') ){.    
160c0 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
160d0 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
160e0 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
160f0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 20  }.      if( c ) 
16100 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74  cp++;.      cont
16110 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
16120 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74 20 3d 20  ps.tokenstart = 
16130 63 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  cp;             
16140 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 62     /* Mark the b
16150 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
16160 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 73 2e  token */.    ps.
16170 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20 6c 69  tokenlineno = li
16180 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  neno;           
16190 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 6f 6e  /* Linenumber on
161a0 20 77 68 69 63 68 20 74 6f 6b 65 6e 20 62 65 67   which token beg
161b0 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 63  ins */.    if( c
161c0 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 20 20 20  =='\"' ){       
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
161e0 20 53 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73   String literals
161f0 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a   */.      cp++;.
16200 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
16210 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27   *cp)!=0 && c!='
16220 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  \"' ){.        i
16230 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
16240 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63  eno++;.        c
16250 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p++;.      }.   
16260 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
16270 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
16280 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73 74 61 72  ps.filename,star
16290 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e 67 20 73  tline,."String s
162a0 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20  tarting on this 
162b0 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d  line is not term
162c0 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74 68  inated before th
162d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
162e0 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  e.");.        ps
162f0 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  .errorcnt++;.   
16300 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
16310 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16320 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20         nextcp = 
16330 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cp+1;.      }.  
16340 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
16350 7b 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  {' ){           
16360 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20 6f      /* A block o
16370 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  f C code */.    
16380 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a 20 20 20    int level;.   
16390 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 66     cp++;.      f
163a0 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28 63 3d 20  or(level=1; (c= 
163b0 2a 63 70 29 21 3d 30 20 26 26 20 28 6c 65 76 65  *cp)!=0 && (leve
163c0 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27 29 3b 20  l>1 || c!='}'); 
163d0 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  cp++){.        i
163e0 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
163f0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65  eno++;.        e
16400 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29  lse if( c=='{' )
16410 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20   level++;.      
16420 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7d    else if( c=='}
16430 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20 20 20  ' ) level--;.   
16440 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d       else if( c=
16450 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
16460 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 63  *' ){  /* Skip c
16470 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  omments */.     
16480 20 20 20 20 20 69 6e 74 20 70 72 65 76 63 3b 0a       int prevc;.
16490 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26            cp = &
164a0 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20  cp[2];.         
164b0 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20   prevc = 0;.    
164c0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
164d0 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d   *cp)!=0 && (c!=
164e0 27 2f 27 20 7c 7c 20 70 72 65 76 63 21 3d 27 2a  '/' || prevc!='*
164f0 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
16500 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
16510 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
16520 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b        prevc = c;
16530 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 70 2b  .            cp+
16540 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
16550 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
16560 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
16570 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20 53 6b 69  =='/' ){  /* Ski
16580 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d  p C++ style comm
16590 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20 20 20 20  ents too */.    
165a0 20 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32        cp = &cp[2
165b0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ];.          whi
165c0 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
165d0 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b  && c!='\n' ) cp+
165e0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  +;.          if(
165f0 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20   c ) lineno++;. 
16600 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
16610 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27   c=='\'' || c=='
16620 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20 53 74 72  \"' ){    /* Str
16630 69 6e 67 20 61 20 63 68 61 72 61 63 74 65 72 20  ing a character 
16640 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20  literals */.    
16650 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 63        int startc
16660 68 61 72 2c 20 70 72 65 76 63 3b 0a 20 20 20 20  har, prevc;.    
16670 20 20 20 20 20 20 73 74 61 72 74 63 68 61 72 20        startchar 
16680 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = c;.          p
16690 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  revc = 0;.      
166a0 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b 20 28 63      for(cp++; (c
166b0 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21  = *cp)!=0 && (c!
166c0 3d 73 74 61 72 74 63 68 61 72 20 7c 7c 20 70 72  =startchar || pr
166d0 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63 70 2b 2b  evc=='\\'); cp++
166e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
166f0 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
16700 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  eno++;.         
16710 20 20 20 69 66 28 20 70 72 65 76 63 3d 3d 27 5c     if( prevc=='\
16720 5c 27 20 29 20 70 72 65 76 63 20 3d 20 30 3b 0a  \' ) prevc = 0;.
16730 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
16750 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  evc = c;.       
16760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
16770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16780 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
16790 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c   ErrorMsg(ps.fil
167a0 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b 65 6e 6c 69  ename,ps.tokenli
167b0 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64 65 20 73 74  neno,."C code st
167c0 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c  arting on this l
167d0 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69  ine is not termi
167e0 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74 68 65  nated before the
167f0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
16800 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e  .");.        ps.
16810 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
16820 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
16830 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16840 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
16850 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p+1;.      }.   
16860 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 4c 4e   }else if( ISALN
16870 55 4d 28 63 29 20 29 7b 20 20 20 20 20 20 20 20  UM(c) ){        
16880 20 20 2f 2a 20 49 64 65 6e 74 69 66 69 65 72 73    /* Identifiers
16890 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
168a0 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
168b0 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c 7c 20 63  (ISALNUM(c) || c
168c0 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20  =='_') ) cp++;. 
168d0 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
168e0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
168f0 63 3d 3d 27 3a 27 20 26 26 20 63 70 5b 31 5d 3d  c==':' && cp[1]=
16900 3d 27 3a 27 20 26 26 20 63 70 5b 32 5d 3d 3d 27  =':' && cp[2]=='
16910 3d 27 20 29 7b 20 2f 2a 20 54 68 65 20 6f 70 65  =' ){ /* The ope
16920 72 61 74 6f 72 20 22 3a 3a 3d 22 20 2a 2f 0a 20  rator "::=" */. 
16930 20 20 20 20 20 63 70 20 2b 3d 20 33 3b 0a 20 20       cp += 3;.  
16940 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
16950 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
16960 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27 7c 27  c=='/' || c=='|'
16970 29 20 26 26 20 49 53 41 4c 50 48 41 28 63 70 5b  ) && ISALPHA(cp[
16980 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 63 70 20  1]) ){.      cp 
16990 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c  += 2;.      whil
169a0 65 28 20 28 63 20 3d 20 2a 63 70 29 21 3d 30 20  e( (c = *cp)!=0 
169b0 26 26 20 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c  && (ISALNUM(c) |
169c0 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b  | c=='_') ) cp++
169d0 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
169e0 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20   cp;.    }else{ 
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
16a10 6f 74 68 65 72 20 28 6f 6e 65 20 63 68 61 72 61  other (one chara
16a20 63 74 65 72 29 20 6f 70 65 72 61 74 6f 72 73 20  cter) operators 
16a30 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  */.      cp++;. 
16a40 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
16a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 20 3d 20  ;.    }.    c = 
16a60 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30  *cp;.    *cp = 0
16a70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16a80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 6c           /* Null
16a90 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 74   terminate the t
16aa0 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 61 72 73  oken */.    pars
16ab0 65 6f 6e 65 74 6f 6b 65 6e 28 26 70 73 29 3b 20  eonetoken(&ps); 
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
16ad0 61 72 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a  arse the token *
16ae0 2f 0a 20 20 20 20 2a 63 70 20 3d 20 28 63 68 61  /.    *cp = (cha
16af0 72 29 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  r)c;            
16b00 20 20 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65        /* Restore
16b10 20 74 68 65 20 62 75 66 66 65 72 20 2a 2f 0a 20   the buffer */. 
16b20 20 20 20 63 70 20 3d 20 6e 65 78 74 63 70 3b 0a     cp = nextcp;.
16b30 20 20 7d 0a 20 20 66 72 65 65 28 66 69 6c 65 62    }.  free(fileb
16b40 75 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  uf);            
16b50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61          /* Relea
16b60 73 65 20 74 68 65 20 62 75 66 66 65 72 20 61 66  se the buffer af
16b70 74 65 72 20 70 61 72 73 69 6e 67 20 2a 2f 0a 20  ter parsing */. 
16b80 20 67 70 2d 3e 72 75 6c 65 20 3d 20 70 73 2e 66   gp->rule = ps.f
16b90 69 72 73 74 72 75 6c 65 3b 0a 20 20 67 70 2d 3e  irstrule;.  gp->
16ba0 65 72 72 6f 72 63 6e 74 20 3d 20 70 73 2e 65 72  errorcnt = ps.er
16bb0 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  rorcnt;.}./*****
16bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16bd0 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
16be0 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 63 22 20 2a  file "plink.c" *
16bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16c00 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ****/./*.** Rout
16c10 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20  ines processing 
16c20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f  configuration fo
16c30 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
16c40 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a 20 69 6e  tion links.** in
16c50 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
16c60 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
16c70 73 74 61 74 69 63 20 73 74 72 75 63 74 20 70 6c  static struct pl
16c80 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72 65 65 6c  ink *plink_freel
16c90 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20 41 6c 6c  ist = 0;../* All
16ca0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 6c 69 6e  ocate a new plin
16cb0 6b 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e  k */.struct plin
16cc0 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28 76 6f 69  k *Plink_new(voi
16cd0 64 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  d){.  struct pli
16ce0 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 0a 20 20  nk *newlink;..  
16cf0 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  if( plink_freeli
16d00 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  st==0 ){.    int
16d10 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   i;.    int amt 
16d20 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b  = 100;.    plink
16d30 5f 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72  _freelist = (str
16d40 75 63 74 20 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c  uct plink *)call
16d50 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28  oc( amt, sizeof(
16d60 73 74 72 75 63 74 20 70 6c 69 6e 6b 29 20 29 3b  struct plink) );
16d70 0a 20 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66  .    if( plink_f
16d80 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reelist==0 ){.  
16d90 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
16da0 72 72 2c 0a 20 20 20 20 20 20 22 55 6e 61 62 6c  rr,.      "Unabl
16db0 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
16dc0 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 66  mory for a new f
16dd0 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67  ollow-set propag
16de0 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b  ation link.\n");
16df0 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
16e00 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
16e10 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29  0; i<amt-1; i++)
16e20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b   plink_freelist[
16e30 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e 6b  i].next = &plink
16e40 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a  _freelist[i+1];.
16e50 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69      plink_freeli
16e60 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d  st[amt-1].next =
16e70 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 6c 69 6e   0;.  }.  newlin
16e80 6b 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  k = plink_freeli
16e90 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66 72 65 65  st;.  plink_free
16ea0 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65  list = plink_fre
16eb0 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72  elist->next;.  r
16ec0 65 74 75 72 6e 20 6e 65 77 6c 69 6e 6b 3b 0a 7d  eturn newlink;.}
16ed0 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c 69 6e 6b  ../* Add a plink
16ee0 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c 69 73 74   to a plink list
16ef0 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 61   */.void Plink_a
16f00 64 64 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  dd(struct plink 
16f10 2a 2a 70 6c 70 70 2c 20 73 74 72 75 63 74 20 63  **plpp, struct c
16f20 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20  onfig *cfp).{.  
16f30 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
16f40 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b  wlink;.  newlink
16f50 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b 0a   = Plink_new();.
16f60 20 20 6e 65 77 6c 69 6e 6b 2d 3e 6e 65 78 74 20    newlink->next 
16f70 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70 70  = *plpp;.  *plpp
16f80 20 3d 20 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65   = newlink;.  ne
16f90 77 6c 69 6e 6b 2d 3e 63 66 70 20 3d 20 63 66 70  wlink->cfp = cfp
16fa0 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66 65 72  ;.}../* Transfer
16fb0 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20   every plink on 
16fc0 74 68 65 20 6c 69 73 74 20 22 66 72 6f 6d 22 20  the list "from" 
16fd0 74 6f 20 74 68 65 20 6c 69 73 74 20 22 74 6f 22  to the list "to"
16fe0 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63   */.void Plink_c
16ff0 6f 70 79 28 73 74 72 75 63 74 20 70 6c 69 6e 6b  opy(struct plink
17000 20 2a 2a 74 6f 2c 20 73 74 72 75 63 74 20 70 6c   **to, struct pl
17010 69 6e 6b 20 2a 66 72 6f 6d 29 0a 7b 0a 20 20 73  ink *from).{.  s
17020 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78  truct plink *nex
17030 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66 72  tpl;.  while( fr
17040 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c  om ){.    nextpl
17050 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a 20   = from->next;. 
17060 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d 20     from->next = 
17070 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20 66  *to;.    *to = f
17080 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d 20  rom;.    from = 
17090 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  nextpl;.  }.}../
170a0 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 20 70  * Delete every p
170b0 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74  link on the list
170c0 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64   */.void Plink_d
170d0 65 6c 65 74 65 28 73 74 72 75 63 74 20 70 6c 69  elete(struct pli
170e0 6e 6b 20 2a 70 6c 70 29 0a 7b 0a 20 20 73 74 72  nk *plp).{.  str
170f0 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70  uct plink *nextp
17100 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 6c 70  l;..  while( plp
17110 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d   ){.    nextpl =
17120 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20   plp->next;.    
17130 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70 6c 69 6e  plp->next = plin
17140 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 20 20  k_freelist;.    
17150 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d  plink_freelist =
17160 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70 20 3d 20   plp;.    plp = 
17170 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a  nextpl;.  }.}./*
17180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17190 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
171a0 66 69 6c 65 20 22 72 65 70 6f 72 74 2e 63 22 20  file "report.c" 
171b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
171c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
171d0 2a 20 50 72 6f 63 65 64 75 72 65 73 20 66 6f 72  * Procedures for
171e0 20 67 65 6e 65 72 61 74 69 6e 67 20 72 65 70 6f   generating repo
171f0 72 74 73 20 61 6e 64 20 74 61 62 6c 65 73 20 69  rts and tables i
17200 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
17210 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
17220 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20  ../* Generate a 
17230 66 69 6c 65 6e 61 6d 65 20 77 69 74 68 20 74 68  filename with th
17240 65 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e 20  e given suffix. 
17250 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
17260 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65 73  he.** name comes
17270 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61   from malloc() a
17280 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
17290 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
172a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ** function..*/.
172b0 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 66 69  PRIVATE char *fi
172c0 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 73 74 72 75  le_makename(stru
172d0 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20  ct lemon *lemp, 
172e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66 66  const char *suff
172f0 69 78 29 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61  ix).{.  char *na
17300 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a  me;.  char *cp;.
17310 0a 20 20 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  .  name = (char*
17320 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74  )malloc( lemonSt
17330 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rlen(lemp->filen
17340 61 6d 65 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c  ame) + lemonStrl
17350 65 6e 28 73 75 66 66 69 78 29 20 2b 20 35 20 29  en(suffix) + 5 )
17360 3b 0a 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20  ;.  if( name==0 
17370 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
17380 74 64 65 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c  tderr,"Can't all
17390 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
173a0 61 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b  a filename.\n");
173b0 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
173c0 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79  }.  lemon_strcpy
173d0 28 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65  (name,lemp->file
173e0 6e 61 6d 65 29 3b 0a 20 20 63 70 20 3d 20 73 74  name);.  cp = st
173f0 72 72 63 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b  rrchr(name,'.');
17400 0a 20 20 69 66 28 20 63 70 20 29 20 2a 63 70 20  .  if( cp ) *cp 
17410 3d 20 30 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72  = 0;.  lemon_str
17420 63 61 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29  cat(name,suffix)
17430 3b 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b  ;.  return name;
17440 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69  .}../* Open a fi
17450 6c 65 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62  le with a name b
17460 61 73 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65  ased on the name
17470 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69   of the input fi
17480 6c 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20  le,.** but with 
17490 61 20 64 69 66 66 65 72 65 6e 74 20 28 73 70 65  a different (spe
174a0 63 69 66 69 65 64 29 20 73 75 66 66 69 78 2c 20  cified) suffix, 
174b0 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
174c0 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  nter.** to the s
174d0 74 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45  tream */.PRIVATE
174e0 20 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e   FILE *file_open
174f0 28 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  (.  struct lemon
17500 20 2a 6c 65 6d 70 2c 0a 20 20 63 6f 6e 73 74 20   *lemp,.  const 
17510 63 68 61 72 20 2a 73 75 66 66 69 78 2c 0a 20 20  char *suffix,.  
17520 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65  const char *mode
17530 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a  .){.  FILE *fp;.
17540 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74  .  if( lemp->out
17550 6e 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d 70  name ) free(lemp
17560 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65  ->outname);.  le
17570 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69  mp->outname = fi
17580 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70  le_makename(lemp
17590 2c 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70 20  , suffix);.  fp 
175a0 3d 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75  = fopen(lemp->ou
175b0 74 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69  tname,mode);.  i
175c0 66 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64  f( fp==0 && *mod
175d0 65 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66 70  e=='w' ){.    fp
175e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61  rintf(stderr,"Ca
175f0 6e 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22  n't open file \"
17600 25 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f  %s\".\n",lemp->o
17610 75 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d  utname);.    lem
17620 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
17630 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
17640 0a 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a  .  return fp;.}.
17650 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68  ./* Duplicate th
17660 65 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69 74  e input file wit
17670 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e  hout comments an
17680 64 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e  d without action
17690 73 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f  s.** on rules */
176a0 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73 74  .void Reprint(st
176b0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
176c0 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ).{.  struct rul
176d0 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20  e *rp;.  struct 
176e0 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e  symbol *sp;.  in
176f0 74 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20  t i, j, maxlen, 
17700 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73  len, ncolumns, s
17710 6b 69 70 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f  kip;.  printf("/
17720 2f 20 52 65 70 72 69 6e 74 20 6f 66 20 69 6e 70  / Reprint of inp
17730 75 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c  ut file \"%s\".\
17740 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c  n// Symbols:\n",
17750 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
17760 0a 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a  .  maxlen = 10;.
17770 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
17780 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
17790 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d  {.    sp = lemp-
177a0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
177b0 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c   len = lemonStrl
177c0 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  en(sp->name);.  
177d0 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e    if( len>maxlen
177e0 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b   ) maxlen = len;
177f0 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20  .  }.  ncolumns 
17800 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b  = 76/(maxlen+5);
17810 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c  .  if( ncolumns<
17820 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31  1 ) ncolumns = 1
17830 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70  ;.  skip = (lemp
17840 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c  ->nsymbol + ncol
17850 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d  umns - 1)/ncolum
17860 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ns;.  for(i=0; i
17870 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  <skip; i++){.   
17880 20 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20   printf("//");. 
17890 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65     for(j=i; j<le
178a0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d  mp->nsymbol; j+=
178b0 73 6b 69 70 29 7b 0a 20 20 20 20 20 20 73 70 20  skip){.      sp 
178c0 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
178d0 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  j];.      assert
178e0 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29  ( sp->index==j )
178f0 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  ;.      printf("
17900 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d   %3d %-*.*s",j,m
17910 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d  axlen,maxlen,sp-
17920 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  >name);.    }.  
17930 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a    printf("\n");.
17940 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d    }.  for(rp=lem
17950 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
17960 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 70  rp->next){.    p
17970 72 69 6e 74 66 28 22 25 73 22 2c 72 70 2d 3e 6c  rintf("%s",rp->l
17980 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f  hs->name);.    /
17990 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73  *    if( rp->lhs
179a0 61 6c 69 61 73 20 29 20 70 72 69 6e 74 66 28 22  alias ) printf("
179b0 28 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69  (%s)",rp->lhsali
179c0 61 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e  as); */.    prin
179d0 74 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20  tf(" ::=");.    
179e0 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
179f0 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
17a00 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d   sp = rp->rhs[i]
17a10 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e  ;.      if( sp->
17a20 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
17a30 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  NAL ){.        p
17a40 72 69 6e 74 66 28 22 20 25 73 22 2c 20 73 70 2d  rintf(" %s", sp-
17a50 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65  >subsym[0]->name
17a60 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  );.        for(j
17a70 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79  =1; j<sp->nsubsy
17a80 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; j++){.       
17a90 20 20 20 70 72 69 6e 74 66 28 22 7c 25 73 22 2c     printf("|%s",
17aa0 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e   sp->subsym[j]->
17ab0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
17ac0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17ad0 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25        printf(" %
17ae0 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  s", sp->name);. 
17af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
17b00 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
17b10 5b 69 5d 20 29 20 70 72 69 6e 74 66 28 22 28 25  [i] ) printf("(%
17b20 73 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  s)",rp->rhsalias
17b30 5b 69 5d 29 3b 20 2a 2f 0a 20 20 20 20 7d 0a 20  [i]); */.    }. 
17b40 20 20 20 70 72 69 6e 74 66 28 22 2e 22 29 3b 0a     printf(".");.
17b50 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63      if( rp->prec
17b60 73 79 6d 20 29 20 70 72 69 6e 74 66 28 22 20 5b  sym ) printf(" [
17b70 25 73 5d 22 2c 72 70 2d 3e 70 72 65 63 73 79 6d  %s]",rp->precsym
17b80 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20  ->name);.    /* 
17b90 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 20 70  if( rp->code ) p
17ba0 72 69 6e 74 66 28 22 5c 6e 20 20 20 20 25 73 22  rintf("\n    %s"
17bb0 2c 72 70 2d 3e 63 6f 64 65 29 3b 20 2a 2f 0a 20  ,rp->code); */. 
17bc0 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
17bd0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74  .  }.}../* Print
17be0 20 61 20 73 69 6e 67 6c 65 20 72 75 6c 65 2e 0a   a single rule..
17bf0 2a 2f 0a 76 6f 69 64 20 52 75 6c 65 50 72 69 6e  */.void RulePrin
17c00 74 28 46 49 4c 45 20 2a 66 70 2c 20 73 74 72 75  t(FILE *fp, stru
17c10 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 69 6e 74  ct rule *rp, int
17c20 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 73 74 72   iCursor){.  str
17c30 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
17c40 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 70    int i, j;.  fp
17c50 72 69 6e 74 66 28 66 70 2c 22 25 73 20 3a 3a 3d  rintf(fp,"%s ::=
17c60 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29  ",rp->lhs->name)
17c70 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
17c80 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
17c90 20 20 20 20 69 66 28 20 69 3d 3d 69 43 75 72 73      if( i==iCurs
17ca0 6f 72 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c  or ) fprintf(fp,
17cb0 22 20 2a 22 29 3b 0a 20 20 20 20 69 66 28 20 69  " *");.    if( i
17cc0 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 62 72 65  ==rp->nrhs ) bre
17cd0 61 6b 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d  ak;.    sp = rp-
17ce0 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >rhs[i];.    if(
17cf0 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
17d00 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
17d10 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25    fprintf(fp," %
17d20 73 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30  s", sp->subsym[0
17d30 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
17d40 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e  for(j=1; j<sp->n
17d50 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20  subsym; j++){.  
17d60 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
17d70 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62 73 79  ,"|%s",sp->subsy
17d80 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  m[j]->name);.   
17d90 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
17da0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
17db0 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65  ," %s", sp->name
17dc0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
17dd0 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 72 75 6c  /* Print the rul
17de0 65 20 66 6f 72 20 61 20 63 6f 6e 66 69 67 75 72  e for a configur
17df0 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 43  ation..*/.void C
17e00 6f 6e 66 69 67 50 72 69 6e 74 28 46 49 4c 45 20  onfigPrint(FILE 
17e10 2a 66 70 2c 20 73 74 72 75 63 74 20 63 6f 6e 66  *fp, struct conf
17e20 69 67 20 2a 63 66 70 29 7b 0a 20 20 52 75 6c 65  ig *cfp){.  Rule
17e30 50 72 69 6e 74 28 66 70 2c 20 63 66 70 2d 3e 72  Print(fp, cfp->r
17e40 70 2c 20 63 66 70 2d 3e 64 6f 74 29 3b 0a 7d 0a  p, cfp->dot);.}.
17e50 0a 2f 2a 20 23 64 65 66 69 6e 65 20 54 45 53 54  ./* #define TEST
17e60 20 2a 2f 0a 23 69 66 20 30 0a 2f 2a 20 50 72 69   */.#if 0./* Pri
17e70 6e 74 20 61 20 73 65 74 20 2a 2f 0a 50 52 49 56  nt a set */.PRIV
17e80 41 54 45 20 76 6f 69 64 20 53 65 74 50 72 69 6e  ATE void SetPrin
17e90 74 28 6f 75 74 2c 73 65 74 2c 6c 65 6d 70 29 0a  t(out,set,lemp).
17ea0 46 49 4c 45 20 2a 6f 75 74 3b 0a 63 68 61 72 20  FILE *out;.char 
17eb0 2a 73 65 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d  *set;.struct lem
17ec0 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
17ed0 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 73 70 61  t i;.  char *spa
17ee0 63 65 72 3b 0a 20 20 73 70 61 63 65 72 20 3d 20  cer;.  spacer = 
17ef0 22 22 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  "";.  fprintf(ou
17f00 74 2c 22 25 31 32 73 5b 22 2c 22 22 29 3b 0a 20  t,"%12s[","");. 
17f10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
17f20 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b  ->nterminal; i++
17f30 29 7b 0a 20 20 20 20 69 66 28 20 53 65 74 46 69  ){.    if( SetFi
17f40 6e 64 28 73 65 74 2c 69 29 20 29 7b 0a 20 20 20  nd(set,i) ){.   
17f50 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
17f60 25 73 25 73 22 2c 73 70 61 63 65 72 2c 6c 65 6d  %s%s",spacer,lem
17f70 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
17f80 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 70 61 63  ame);.      spac
17f90 65 72 20 3d 20 22 20 22 3b 0a 20 20 20 20 7d 0a  er = " ";.    }.
17fa0 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
17fb0 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20  t,"]\n");.}../* 
17fc0 50 72 69 6e 74 20 61 20 70 6c 69 6e 6b 20 63 68  Print a plink ch
17fd0 61 69 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  ain */.PRIVATE v
17fe0 6f 69 64 20 50 6c 69 6e 6b 50 72 69 6e 74 28 6f  oid PlinkPrint(o
17ff0 75 74 2c 70 6c 70 2c 74 61 67 29 0a 46 49 4c 45  ut,plp,tag).FILE
18000 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 70 6c   *out;.struct pl
18010 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61 72 20 2a  ink *plp;.char *
18020 74 61 67 3b 0a 7b 0a 20 20 77 68 69 6c 65 28 20  tag;.{.  while( 
18030 70 6c 70 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  plp ){.    fprin
18040 74 66 28 6f 75 74 2c 22 25 31 32 73 25 73 20 28  tf(out,"%12s%s (
18050 73 74 61 74 65 20 25 32 64 29 20 22 2c 22 22 2c  state %2d) ","",
18060 74 61 67 2c 70 6c 70 2d 3e 63 66 70 2d 3e 73 74  tag,plp->cfp->st
18070 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20  p->statenum);.  
18080 20 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 6f 75    ConfigPrint(ou
18090 74 2c 70 6c 70 2d 3e 63 66 70 29 3b 0a 20 20 20  t,plp->cfp);.   
180a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e   fprintf(out,"\n
180b0 22 29 3b 0a 20 20 20 20 70 6c 70 20 3d 20 70 6c  ");.    plp = pl
180c0 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23  p->next;.  }.}.#
180d0 65 6e 64 69 66 0a 0a 2f 2a 20 50 72 69 6e 74 20  endif../* Print 
180e0 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65  an action to the
180f0 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
18100 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
18110 46 41 4c 53 45 20 69 66 0a 2a 2a 20 6e 6f 74 68  FALSE if.** noth
18120 69 6e 67 20 77 61 73 20 61 63 74 75 61 6c 6c 79  ing was actually
18130 20 70 72 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74   printed..*/.int
18140 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 0a 20 20   PrintAction(.  
18150 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
18160 70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  p,          /* T
18170 68 65 20 61 63 74 69 6f 6e 20 74 6f 20 70 72 69  he action to pri
18180 6e 74 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 66 70  nt */.  FILE *fp
18190 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
181a0 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 74 68 65      /* Print the
181b0 20 61 63 74 69 6f 6e 20 68 65 72 65 20 2a 2f 0a   action here */.
181c0 20 20 69 6e 74 20 69 6e 64 65 6e 74 20 20 20 20    int indent    
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
181e0 20 49 6e 64 65 6e 74 20 62 79 20 74 68 69 73 20   Indent by this 
181f0 61 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  amount */.){.  i
18200 6e 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20  nt result = 1;. 
18210 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70   switch( ap->typ
18220 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48  e ){.    case SH
18230 49 46 54 3a 20 7b 0a 20 20 20 20 20 20 73 74 72  IFT: {.      str
18240 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 20 3d  uct state *stp =
18250 20 61 70 2d 3e 78 2e 73 74 70 3b 0a 20 20 20 20   ap->x.stp;.    
18260 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
18270 73 20 73 68 69 66 74 20 20 20 20 20 20 20 20 25  s shift        %
18280 2d 37 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  -7d",indent,ap->
18290 73 70 2d 3e 6e 61 6d 65 2c 73 74 70 2d 3e 73 74  sp->name,stp->st
182a0 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62  atenum);.      b
182b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
182c0 63 61 73 65 20 52 45 44 55 43 45 3a 20 7b 0a 20  case REDUCE: {. 
182d0 20 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65       struct rule
182e0 20 2a 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b   *rp = ap->x.rp;
182f0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
18300 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 20 20  p,"%*s reduce   
18310 20 20 20 20 25 2d 37 64 22 2c 69 6e 64 65 6e 74      %-7d",indent
18320 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 72 70  ,ap->sp->name,rp
18330 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20  ->iRule);.      
18340 52 75 6c 65 50 72 69 6e 74 28 66 70 2c 20 72 70  RulePrint(fp, rp
18350 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , -1);.      bre
18360 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
18370 73 65 20 53 48 49 46 54 52 45 44 55 43 45 3a 20  se SHIFTREDUCE: 
18380 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 72  {.      struct r
18390 75 6c 65 20 2a 72 70 20 3d 20 61 70 2d 3e 78 2e  ule *rp = ap->x.
183a0 72 70 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  rp;.      fprint
183b0 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 2d  f(fp,"%*s shift-
183c0 72 65 64 75 63 65 20 25 2d 37 64 22 2c 69 6e 64  reduce %-7d",ind
183d0 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
183e0 2c 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20  ,rp->iRule);.   
183f0 20 20 20 52 75 6c 65 50 72 69 6e 74 28 66 70 2c     RulePrint(fp,
18400 20 72 70 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20   rp, -1);.      
18410 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
18420 20 63 61 73 65 20 41 43 43 45 50 54 3a 0a 20 20   case ACCEPT:.  
18430 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
18440 25 2a 73 20 61 63 63 65 70 74 22 2c 69 6e 64 65  %*s accept",inde
18450 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29  nt,ap->sp->name)
18460 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18470 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a 0a 20     case ERROR:. 
18480 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
18490 22 25 2a 73 20 65 72 72 6f 72 22 2c 69 6e 64 65  "%*s error",inde
184a0 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29  nt,ap->sp->name)
184b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
184c0 20 20 20 63 61 73 65 20 53 52 43 4f 4e 46 4c 49     case SRCONFLI
184d0 43 54 3a 0a 20 20 20 20 63 61 73 65 20 52 52 43  CT:.    case RRC
184e0 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20 66  ONFLICT:.      f
184f0 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 72  printf(fp,"%*s r
18500 65 64 75 63 65 20 20 20 20 20 20 20 25 2d 37 64  educe       %-7d
18510 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66   ** Parsing conf
18520 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20  lict **",.      
18530 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d    indent,ap->sp-
18540 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e  >name,ap->x.rp->
18550 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  iRule);.      br
18560 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53  eak;.    case SS
18570 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20  CONFLICT:.      
18580 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
18590 73 68 69 66 74 20 20 20 20 20 20 20 20 25 2d 37  shift        %-7
185a0 64 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e  d ** Parsing con
185b0 66 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20  flict **",.     
185c0 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70     indent,ap->sp
185d0 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70  ->name,ap->x.stp
185e0 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20  ->statenum);.   
185f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
18600 73 65 20 53 48 5f 52 45 53 4f 4c 56 45 44 3a 0a  se SH_RESOLVED:.
18610 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 50 72        if( showPr
18620 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63 74  ecedenceConflict
18630 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
18640 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66  ntf(fp,"%*s shif
18650 74 20 20 20 20 20 20 20 20 25 2d 37 64 20 2d 2d  t        %-7d --
18660 20 64 72 6f 70 70 65 64 20 62 79 20 70 72 65 63   dropped by prec
18670 65 64 65 6e 63 65 22 2c 0a 20 20 20 20 20 20 20  edence",.       
18680 20 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74 2c           indent,
18690 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d  ap->sp->name,ap-
186a0 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d  >x.stp->statenum
186b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
186c0 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d          result =
186d0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
186e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
186f0 65 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20  e RD_RESOLVED:. 
18700 20 20 20 20 20 69 66 28 20 73 68 6f 77 50 72 65       if( showPre
18710 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63 74 20  cedenceConflict 
18720 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
18730 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75 63  tf(fp,"%*s reduc
18740 65 20 25 2d 37 64 20 2d 2d 20 64 72 6f 70 70 65  e %-7d -- droppe
18750 64 20 62 79 20 70 72 65 63 65 64 65 6e 63 65 22  d by precedence"
18760 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18770 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d    indent,ap->sp-
18780 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e  >name,ap->x.rp->
18790 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20 7d 65  iRule);.      }e
187a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73  lse{.        res
187b0 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ult = 0;.      }
187c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
187d0 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44 3a    case NOT_USED:
187e0 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20  .      result = 
187f0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
18800 20 20 7d 0a 20 20 69 66 28 20 72 65 73 75 6c 74    }.  if( result
18810 20 26 26 20 61 70 2d 3e 73 70 4f 70 74 20 29 7b   && ap->spOpt ){
18820 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
18830 22 20 20 2f 2a 20 62 65 63 61 75 73 65 20 25 73  "  /* because %s
18840 3d 3d 25 73 20 2a 2f 22 2c 20 61 70 2d 3e 73 70  ==%s */", ap->sp
18850 2d 3e 6e 61 6d 65 2c 20 61 70 2d 3e 73 70 4f 70  ->name, ap->spOp
18860 74 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  t->name);.  }.  
18870 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d  return result;.}
18880 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68  ../* Generate th
18890 65 20 22 2a 2e 6f 75 74 22 20 6c 6f 67 20 66 69  e "*.out" log fi
188a0 6c 65 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72  le */.void Repor
188b0 74 4f 75 74 70 75 74 28 73 74 72 75 63 74 20 6c  tOutput(struct l
188c0 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
188d0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
188e0 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
188f0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
18900 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
18910 6e 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66  n *ap;.  FILE *f
18920 70 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f  p;..  fp = file_
18930 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22  open(lemp,".out"
18940 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"wb");.  if( fp
18950 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
18960 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
18970 3e 6e 78 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  >nxstate; i++){.
18980 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
18990 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66  sorted[i];.    f
189a0 70 72 69 6e 74 66 28 66 70 2c 22 53 74 61 74 65  printf(fp,"State
189b0 20 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74 61   %d:\n",stp->sta
189c0 74 65 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  tenum);.    if( 
189d0 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20  lemp->basisflag 
189e0 29 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20  ) cfp=stp->bp;. 
189f0 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
18a00 20 20 20 20 20 20 20 20 20 63 66 70 3d 73 74 70           cfp=stp
18a10 2d 3e 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65  ->cfp;.    while
18a20 28 20 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63  ( cfp ){.      c
18a30 68 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20  har buf[20];.   
18a40 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d     if( cfp->dot=
18a50 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29  =cfp->rp->nrhs )
18a60 7b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f  {.        lemon_
18a70 73 70 72 69 6e 74 66 28 62 75 66 2c 22 28 25 64  sprintf(buf,"(%d
18a80 29 22 2c 63 66 70 2d 3e 72 70 2d 3e 69 52 75 6c  )",cfp->rp->iRul
18a90 65 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69  e);.        fpri
18aa0 6e 74 66 28 66 70 2c 22 20 20 20 20 25 35 73 20  ntf(fp,"    %5s 
18ab0 22 2c 62 75 66 29 3b 0a 20 20 20 20 20 20 7d 65  ",buf);.      }e
18ac0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72  lse{.        fpr
18ad0 69 6e 74 66 28 66 70 2c 22 20 20 20 20 20 20 20  intf(fp,"       
18ae0 20 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20     ");.      }. 
18af0 20 20 20 20 20 43 6f 6e 66 69 67 50 72 69 6e 74       ConfigPrint
18b00 28 66 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20  (fp,cfp);.      
18b10 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29  fprintf(fp,"\n")
18b20 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 53 65  ;.#if 0.      Se
18b30 74 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66  tPrint(fp,cfp->f
18b40 77 73 2c 6c 65 6d 70 29 3b 0a 20 20 20 20 20 20  ws,lemp);.      
18b50 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66  PlinkPrint(fp,cf
18b60 70 2d 3e 66 70 6c 70 2c 22 54 6f 20 20 22 29 3b  p->fplp,"To  ");
18b70 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e  .      PlinkPrin
18b80 74 28 66 70 2c 63 66 70 2d 3e 62 70 6c 70 2c 22  t(fp,cfp->bplp,"
18b90 46 72 6f 6d 22 29 3b 0a 23 65 6e 64 69 66 0a 20  From");.#endif. 
18ba0 20 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62       if( lemp->b
18bb0 61 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d 63  asisflag ) cfp=c
18bc0 66 70 2d 3e 62 70 3b 0a 20 20 20 20 20 20 65 6c  fp->bp;.      el
18bd0 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
18be0 20 20 20 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78      cfp=cfp->nex
18bf0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  t;.    }.    fpr
18c00 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20  intf(fp,"\n");. 
18c10 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
18c20 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
18c30 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50  xt){.      if( P
18c40 72 69 6e 74 41 63 74 69 6f 6e 28 61 70 2c 66 70  rintAction(ap,fp
18c50 2c 33 30 29 20 29 20 66 70 72 69 6e 74 66 28 66  ,30) ) fprintf(f
18c60 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  p,"\n");.    }. 
18c70 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c     fprintf(fp,"\
18c80 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  n");.  }.  fprin
18c90 74 66 28 66 70 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d  tf(fp, "--------
18ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29  ------------\n")
18cd0 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20  ;.  fprintf(fp, 
18ce0 22 53 79 6d 62 6f 6c 73 3a 5c 6e 22 29 3b 0a 20  "Symbols:\n");. 
18cf0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
18d00 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
18d10 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
18d20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
18d30 70 3b 0a 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d  p;..    sp = lem
18d40 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
18d50 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
18d60 20 20 25 33 64 3a 20 25 73 22 2c 20 69 2c 20 73    %3d: %s", i, s
18d70 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  p->name);.    if
18d80 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54  ( sp->type==NONT
18d90 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
18da0 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 3a 22   fprintf(fp, ":"
18db0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d  );.      if( sp-
18dc0 3e 6c 61 6d 62 64 61 20 29 7b 0a 20 20 20 20 20  >lambda ){.     
18dd0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
18de0 20 3c 6c 61 6d 62 64 61 3e 22 29 3b 0a 20 20 20   <lambda>");.   
18df0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
18e00 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =0; j<lemp->nter
18e10 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  minal; j++){.   
18e20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 66 69 72       if( sp->fir
18e30 73 74 73 65 74 20 26 26 20 53 65 74 46 69 6e 64  stset && SetFind
18e40 28 73 70 2d 3e 66 69 72 73 74 73 65 74 2c 20 6a  (sp->firstset, j
18e50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ) ){.          f
18e60 70 72 69 6e 74 66 28 66 70 2c 20 22 20 25 73 22  printf(fp, " %s"
18e70 2c 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  , lemp->symbols[
18e80 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  j]->name);.     
18e90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18ea0 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66   }.    fprintf(f
18eb0 70 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  p, "\n");.  }.  
18ec0 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 72 65  fclose(fp);.  re
18ed0 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 61 72  turn;.}../* Sear
18ee0 63 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  ch for the file 
18ef0 22 6e 61 6d 65 22 20 77 68 69 63 68 20 69 73 20  "name" which is 
18f00 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
18f10 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65 20  ctory as.** the 
18f20 65 78 61 63 75 74 61 62 6c 65 20 2a 2f 0a 50 52  exacutable */.PR
18f30 49 56 41 54 45 20 63 68 61 72 20 2a 70 61 74 68  IVATE char *path
18f40 73 65 61 72 63 68 28 63 68 61 72 20 2a 61 72 67  search(char *arg
18f50 76 30 2c 20 63 68 61 72 20 2a 6e 61 6d 65 2c 20  v0, char *name, 
18f60 69 6e 74 20 6d 6f 64 65 6d 61 73 6b 29 0a 7b 0a  int modemask).{.
18f70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
18f80 74 68 6c 69 73 74 3b 0a 20 20 63 68 61 72 20 2a  thlist;.  char *
18f90 70 61 74 68 62 75 66 70 74 72 3b 0a 20 20 63 68  pathbufptr;.  ch
18fa0 61 72 20 2a 70 61 74 68 62 75 66 3b 0a 20 20 63  ar *pathbuf;.  c
18fb0 68 61 72 20 2a 70 61 74 68 2c 2a 63 70 3b 0a 20  har *path,*cp;. 
18fc0 20 63 68 61 72 20 63 3b 0a 0a 23 69 66 64 65 66   char c;..#ifdef
18fd0 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20 63 70 20   __WIN32__.  cp 
18fe0 3d 20 73 74 72 72 63 68 72 28 61 72 67 76 30 2c  = strrchr(argv0,
18ff0 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a 20 20 63  '\\');.#else.  c
19000 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67 76  p = strrchr(argv
19010 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69 66 0a 20  0,'/');.#endif. 
19020 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20 63   if( cp ){.    c
19030 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20   = *cp;.    *cp 
19040 3d 20 30 3b 0a 20 20 20 20 70 61 74 68 20 3d 20  = 0;.    path = 
19050 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20  (char *)malloc( 
19060 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76  lemonStrlen(argv
19070 30 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  0) + lemonStrlen
19080 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a 20 20  (name) + 2 );.  
19090 20 20 69 66 28 20 70 61 74 68 20 29 20 6c 65 6d    if( path ) lem
190a0 6f 6e 5f 73 70 72 69 6e 74 66 28 70 61 74 68 2c  on_sprintf(path,
190b0 22 25 73 2f 25 73 22 2c 61 72 67 76 30 2c 6e 61  "%s/%s",argv0,na
190c0 6d 65 29 3b 0a 20 20 20 20 2a 63 70 20 3d 20 63  me);.    *cp = c
190d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
190e0 61 74 68 6c 69 73 74 20 3d 20 67 65 74 65 6e 76  athlist = getenv
190f0 28 22 50 41 54 48 22 29 3b 0a 20 20 20 20 69 66  ("PATH");.    if
19100 28 20 70 61 74 68 6c 69 73 74 3d 3d 30 20 29 20  ( pathlist==0 ) 
19110 70 61 74 68 6c 69 73 74 20 3d 20 22 2e 3a 2f 62  pathlist = ".:/b
19120 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20 20  in:/usr/bin";.  
19130 20 20 70 61 74 68 62 75 66 20 3d 20 28 63 68 61    pathbuf = (cha
19140 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d  r *) malloc( lem
19150 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c 69 73  onStrlen(pathlis
19160 74 29 20 2b 20 31 20 29 3b 0a 20 20 20 20 70 61  t) + 1 );.    pa
19170 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c  th = (char *)mal
19180 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  loc( lemonStrlen
19190 28 70 61 74 68 6c 69 73 74 29 2b 6c 65 6d 6f 6e  (pathlist)+lemon
191a0 53 74 72 6c 65 6e 28 6e 61 6d 65 29 2b 32 20 29  Strlen(name)+2 )
191b0 3b 0a 20 20 20 20 69 66 28 20 28 70 61 74 68 62  ;.    if( (pathb
191c0 75 66 20 21 3d 20 30 29 20 26 26 20 28 70 61 74  uf != 0) && (pat
191d0 68 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 70  h!=0) ){.      p
191e0 61 74 68 62 75 66 70 74 72 20 3d 20 70 61 74 68  athbufptr = path
191f0 62 75 66 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e  buf;.      lemon
19200 5f 73 74 72 63 70 79 28 70 61 74 68 62 75 66 2c  _strcpy(pathbuf,
19210 20 70 61 74 68 6c 69 73 74 29 3b 0a 20 20 20 20   pathlist);.    
19220 20 20 77 68 69 6c 65 28 20 2a 70 61 74 68 62 75    while( *pathbu
19230 66 20 29 7b 0a 20 20 20 20 20 20 20 20 63 70 20  f ){.        cp 
19240 3d 20 73 74 72 63 68 72 28 70 61 74 68 62 75 66  = strchr(pathbuf
19250 2c 27 3a 27 29 3b 0a 20 20 20 20 20 20 20 20 69  ,':');.        i
19260 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20  f( cp==0 ) cp = 
19270 26 70 61 74 68 62 75 66 5b 6c 65 6d 6f 6e 53 74  &pathbuf[lemonSt
19280 72 6c 65 6e 28 70 61 74 68 62 75 66 29 5d 3b 0a  rlen(pathbuf)];.
19290 20 20 20 20 20 20 20 20 63 20 3d 20 2a 63 70 3b          c = *cp;
192a0 0a 20 20 20 20 20 20 20 20 2a 63 70 20 3d 20 30  .        *cp = 0
192b0 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f  ;.        lemon_
192c0 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73  sprintf(path,"%s
192d0 2f 25 73 22 2c 70 61 74 68 62 75 66 2c 6e 61 6d  /%s",pathbuf,nam
192e0 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 63 70 20  e);.        *cp 
192f0 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = c;.        if(
19300 20 63 3d 3d 30 20 29 20 70 61 74 68 62 75 66 5b   c==0 ) pathbuf[
19310 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  0] = 0;.        
19320 65 6c 73 65 20 70 61 74 68 62 75 66 20 3d 20 26  else pathbuf = &
19330 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  cp[1];.        i
19340 66 28 20 61 63 63 65 73 73 28 70 61 74 68 2c 6d  f( access(path,m
19350 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29 20 62 72  odemask)==0 ) br
19360 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
19370 20 20 20 66 72 65 65 28 70 61 74 68 62 75 66 70     free(pathbufp
19380 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  tr);.    }.  }. 
19390 20 72 65 74 75 72 6e 20 70 61 74 68 3b 0a 7d 0a   return path;.}.
193a0 0a 2f 2a 20 47 69 76 65 6e 20 61 6e 20 61 63 74  ./* Given an act
193b0 69 6f 6e 2c 20 63 6f 6d 70 75 74 65 20 74 68 65  ion, compute the
193c0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
193d0 6f 72 20 74 68 61 74 20 61 63 74 69 6f 6e 0a 2a  or that action.*
193e0 2a 20 77 68 69 63 68 20 69 73 20 74 6f 20 62 65  * which is to be
193f0 20 70 75 74 20 69 6e 20 74 68 65 20 61 63 74 69   put in the acti
19400 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  on table of the 
19410 67 65 6e 65 72 61 74 65 64 20 6d 61 63 68 69 6e  generated machin
19420 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67  e..** Return neg
19430 61 74 69 76 65 20 69 66 20 6e 6f 20 61 63 74 69  ative if no acti
19440 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 67 65 6e  on should be gen
19450 65 72 61 74 65 64 2e 0a 2a 2f 0a 50 52 49 56 41  erated..*/.PRIVA
19460 54 45 20 69 6e 74 20 63 6f 6d 70 75 74 65 5f 61  TE int compute_a
19470 63 74 69 6f 6e 28 73 74 72 75 63 74 20 6c 65 6d  ction(struct lem
19480 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74  on *lemp, struct
19490 20 61 63 74 69 6f 6e 20 2a 61 70 29 0a 7b 0a 20   action *ap).{. 
194a0 20 69 6e 74 20 61 63 74 3b 0a 20 20 73 77 69 74   int act;.  swit
194b0 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a  ch( ap->type ){.
194c0 20 20 20 20 63 61 73 65 20 53 48 49 46 54 3a 20      case SHIFT: 
194d0 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 73 74 70   act = ap->x.stp
194e0 2d 3e 73 74 61 74 65 6e 75 6d 3b 20 20 20 20 20  ->statenum;     
194f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19500 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
19510 73 65 20 53 48 49 46 54 52 45 44 55 43 45 3a 20  se SHIFTREDUCE: 
19520 7b 0a 20 20 20 20 20 20 61 63 74 20 3d 20 61 70  {.      act = ap
19530 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 20 2b 20  ->x.rp->iRule + 
19540 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20  lemp->nstate;.  
19550 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 61 20 53      /* Since a S
19560 48 49 46 54 20 69 73 20 69 6e 68 65 72 69 65 6e  HIFT is inherien
19570 74 20 61 66 74 65 72 20 61 20 70 72 69 6f 72 20  t after a prior 
19580 52 45 44 55 43 45 2c 20 63 6f 6e 76 65 72 74 20  REDUCE, convert 
19590 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 53 48 49  any.      ** SHI
195a0 46 54 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20  FTREDUCE action 
195b0 77 69 74 68 20 61 20 6e 6f 6e 74 65 72 6d 69 6e  with a nontermin
195c0 61 6c 20 6f 6e 20 74 68 65 20 4c 48 53 20 69 6e  al on the LHS in
195d0 74 6f 20 61 20 73 69 6d 70 6c 65 0a 20 20 20 20  to a simple.    
195e0 20 20 2a 2a 20 52 45 44 55 43 45 20 61 63 74 69    ** REDUCE acti
195f0 6f 6e 3a 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  on: */.      if(
19600 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d   ap->sp->index>=
19610 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
19620 29 20 61 63 74 20 2b 3d 20 6c 65 6d 70 2d 3e 6e  ) act += lemp->n
19630 72 75 6c 65 3b 0a 20 20 20 20 20 20 62 72 65 61  rule;.      brea
19640 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
19650 65 20 52 45 44 55 43 45 3a 20 61 63 74 20 3d 20  e REDUCE: act = 
19660 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 20  ap->x.rp->iRule 
19670 2b 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 6c  + lemp->nstate+l
19680 65 6d 70 2d 3e 6e 72 75 6c 65 3b 20 62 72 65 61  emp->nrule; brea
19690 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f  k;.    case ERRO
196a0 52 3a 20 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e  R:  act = lemp->
196b0 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e  nstate + lemp->n
196c0 72 75 6c 65 2a 32 3b 20 20 20 20 20 20 20 20 20  rule*2;         
196d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
196e0 20 63 61 73 65 20 41 43 43 45 50 54 3a 20 61 63   case ACCEPT: ac
196f0 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  t = lemp->nstate
19700 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2a 32   + lemp->nrule*2
19710 20 2b 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   + 1;           
19720 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
19730 6c 74 3a 20 20 20 20 20 61 63 74 20 3d 20 2d 31  lt:     act = -1
19740 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ; break;.  }.  r
19750 65 74 75 72 6e 20 61 63 74 3b 0a 7d 0a 0a 23 64  eturn act;.}..#d
19760 65 66 69 6e 65 20 4c 49 4e 45 53 49 5a 45 20 31  efine LINESIZE 1
19770 30 30 30 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20  000./* The next 
19780 63 6c 75 73 74 65 72 20 6f 66 20 72 6f 75 74 69  cluster of routi
19790 6e 65 73 20 61 72 65 20 66 6f 72 20 72 65 61 64  nes are for read
197a0 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65  ing the template
197b0 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 77 72 69   file.** and wri
197c0 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ting the results
197d0 20 74 6f 20 74 68 65 20 67 65 6e 65 72 61 74 65   to the generate
197e0 64 20 70 61 72 73 65 72 20 2a 2f 0a 2f 2a 20 54  d parser */./* T
197f0 68 65 20 66 69 72 73 74 20 66 75 6e 63 74 69 6f  he first functio
19800 6e 20 74 72 61 6e 73 66 65 72 73 20 64 61 74 61  n transfers data
19810 20 66 72 6f 6d 20 22 69 6e 22 20 74 6f 20 22 6f   from "in" to "o
19820 75 74 22 20 75 6e 74 69 6c 0a 2a 2a 20 61 20 6c  ut" until.** a l
19830 69 6e 65 20 69 73 20 73 65 65 6e 20 77 68 69 63  ine is seen whic
19840 68 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 25  h begins with "%
19850 25 22 2e 20 20 54 68 65 20 6c 69 6e 65 20 6e 75  %".  The line nu
19860 6d 62 65 72 20 69 73 0a 2a 2a 20 74 72 61 63 6b  mber is.** track
19870 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6e 61 6d  ed..**.** if nam
19880 65 21 3d 30 2c 20 74 68 65 6e 20 61 6e 79 20 77  e!=0, then any w
19890 6f 72 64 20 74 68 61 74 20 62 65 67 69 6e 20 77  ord that begin w
198a0 69 74 68 20 22 50 61 72 73 65 22 20 69 73 20 63  ith "Parse" is c
198b0 68 61 6e 67 65 64 20 74 6f 0a 2a 2a 20 62 65 67  hanged to.** beg
198c0 69 6e 20 77 69 74 68 20 2a 6e 61 6d 65 20 69 6e  in with *name in
198d0 73 74 65 61 64 2e 0a 2a 2f 0a 50 52 49 56 41 54  stead..*/.PRIVAT
198e0 45 20 76 6f 69 64 20 74 70 6c 74 5f 78 66 65 72  E void tplt_xfer
198f0 28 63 68 61 72 20 2a 6e 61 6d 65 2c 20 46 49 4c  (char *name, FIL
19900 45 20 2a 69 6e 2c 20 46 49 4c 45 20 2a 6f 75 74  E *in, FILE *out
19910 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29 0a 7b  , int *lineno).{
19920 0a 20 20 69 6e 74 20 69 2c 20 69 53 74 61 72 74  .  int i, iStart
19930 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49  ;.  char line[LI
19940 4e 45 53 49 5a 45 5d 3b 0a 20 20 77 68 69 6c 65  NESIZE];.  while
19950 28 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e  ( fgets(line,LIN
19960 45 53 49 5a 45 2c 69 6e 29 20 26 26 20 28 6c 69  ESIZE,in) && (li
19970 6e 65 5b 30 5d 21 3d 27 25 27 20 7c 7c 20 6c 69  ne[0]!='%' || li
19980 6e 65 5b 31 5d 21 3d 27 25 27 29 20 29 7b 0a 20  ne[1]!='%') ){. 
19990 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a     (*lineno)++;.
199a0 20 20 20 20 69 53 74 61 72 74 20 3d 20 30 3b 0a      iStart = 0;.
199b0 20 20 20 20 69 66 28 20 6e 61 6d 65 20 29 7b 0a      if( name ){.
199c0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6c        for(i=0; l
199d0 69 6e 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ine[i]; i++){.  
199e0 20 20 20 20 20 20 69 66 28 20 6c 69 6e 65 5b 69        if( line[i
199f0 5d 3d 3d 27 50 27 20 26 26 20 73 74 72 6e 63 6d  ]=='P' && strncm
19a00 70 28 26 6c 69 6e 65 5b 69 5d 2c 22 50 61 72 73  p(&line[i],"Pars
19a10 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20 20 20 20  e",5)==0.       
19a20 20 20 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20 21     && (i==0 || !
19a30 49 53 41 4c 50 48 41 28 6c 69 6e 65 5b 69 2d 31  ISALPHA(line[i-1
19a40 5d 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ])).        ){. 
19a50 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 69           if( i>i
19a60 53 74 61 72 74 20 29 20 66 70 72 69 6e 74 66 28  Start ) fprintf(
19a70 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2d 69 53 74  out,"%.*s",i-iSt
19a80 61 72 74 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74  art,&line[iStart
19a90 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70  ]);.          fp
19aa0 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 6e  rintf(out,"%s",n
19ab0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
19ac0 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
19ad0 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a    iStart = i+1;.
19ae0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19af0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  }.    }.    fpri
19b00 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 26 6c 69  ntf(out,"%s",&li
19b10 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 7d  ne[iStart]);.  }
19b20 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20  .}../* The next 
19b30 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
19b40 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
19b50 20 61 6e 64 20 6f 70 65 6e 73 20 69 74 2c 20 72   and opens it, r
19b60 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 20 70 6f  eturning.** a po
19b70 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 70 65  inter to the ope
19b80 6e 65 64 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49  ned file. */.PRI
19b90 56 41 54 45 20 46 49 4c 45 20 2a 74 70 6c 74 5f  VATE FILE *tplt_
19ba0 6f 70 65 6e 28 73 74 72 75 63 74 20 6c 65 6d 6f  open(struct lemo
19bb0 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 61  n *lemp).{.  sta
19bc0 74 69 63 20 63 68 61 72 20 74 65 6d 70 6c 61 74  tic char templat
19bd0 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70 61  ename[] = "lempa
19be0 72 2e 63 22 3b 0a 20 20 63 68 61 72 20 62 75 66  r.c";.  char buf
19bf0 5b 31 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20 2a  [1000];.  FILE *
19c00 69 6e 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c 74  in;.  char *tplt
19c10 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70  name;.  char *cp
19c20 3b 0a 0a 20 20 2f 2a 20 66 69 72 73 74 2c 20 73  ;..  /* first, s
19c30 65 65 20 69 66 20 75 73 65 72 20 73 70 65 63 69  ee if user speci
19c40 66 69 65 64 20 61 20 74 65 6d 70 6c 61 74 65 20  fied a template 
19c50 66 69 6c 65 6e 61 6d 65 20 6f 6e 20 74 68 65 20  filename on the 
19c60 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 2a 2f  command line. */
19c70 0a 20 20 69 66 20 28 75 73 65 72 5f 74 65 6d 70  .  if (user_temp
19c80 6c 61 74 65 6e 61 6d 65 20 21 3d 20 30 29 20 7b  latename != 0) {
19c90 0a 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28  .    if( access(
19ca0 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
19cb0 65 2c 30 30 34 29 3d 3d 2d 31 20 29 7b 0a 20 20  e,004)==-1 ){.  
19cc0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
19cd0 72 72 2c 22 43 61 6e 27 74 20 66 69 6e 64 20 74  rr,"Can't find t
19ce0 68 65 20 70 61 72 73 65 72 20 64 72 69 76 65 72  he parser driver
19cf0 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c   template file \
19d00 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20  "%s\".\n",.     
19d10 20 20 20 75 73 65 72 5f 74 65 6d 70 6c 61 74 65     user_template
19d20 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d  name);.      lem
19d30 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
19d40 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
19d50 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f     }.    in = fo
19d60 70 65 6e 28 75 73 65 72 5f 74 65 6d 70 6c 61 74  pen(user_templat
19d70 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 20  ename,"rb");.   
19d80 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
19d90 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
19da0 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74  rr,"Can't open t
19db0 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
19dc0 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20   \"%s\".\n",.   
19dd0 20 20 20 20 20 20 20 20 20 20 20 75 73 65 72 5f             user_
19de0 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20  templatename);. 
19df0 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
19e00 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  cnt++;.      ret
19e10 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
19e20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 20 20 7d 0a   return in;.  }.
19e30 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28  .  cp = strrchr(
19e40 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 27  lemp->filename,'
19e50 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29 7b  .');.  if( cp ){
19e60 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e  .    lemon_sprin
19e70 74 66 28 62 75 66 2c 22 25 2e 2a 73 2e 6c 74 22  tf(buf,"%.*s.lt"
19e80 2c 28 69 6e 74 29 28 63 70 2d 6c 65 6d 70 2d 3e  ,(int)(cp-lemp->
19e90 66 69 6c 65 6e 61 6d 65 29 2c 6c 65 6d 70 2d 3e  filename),lemp->
19ea0 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c  filename);.  }el
19eb0 73 65 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70  se{.    lemon_sp
19ec0 72 69 6e 74 66 28 62 75 66 2c 22 25 73 2e 6c 74  rintf(buf,"%s.lt
19ed0 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  ",lemp->filename
19ee0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 63 63  );.  }.  if( acc
19ef0 65 73 73 28 62 75 66 2c 30 30 34 29 3d 3d 30 20  ess(buf,004)==0 
19f00 29 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20  ){.    tpltname 
19f10 3d 20 62 75 66 3b 0a 20 20 7d 65 6c 73 65 20 69  = buf;.  }else i
19f20 66 28 20 61 63 63 65 73 73 28 74 65 6d 70 6c 61  f( access(templa
19f30 74 65 6e 61 6d 65 2c 30 30 34 29 3d 3d 30 20 29  tename,004)==0 )
19f40 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d  {.    tpltname =
19f50 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 3b 0a 20   templatename;. 
19f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 70 6c 74   }else{.    tplt
19f70 6e 61 6d 65 20 3d 20 70 61 74 68 73 65 61 72 63  name = pathsearc
19f80 68 28 6c 65 6d 70 2d 3e 61 72 67 76 30 2c 74 65  h(lemp->argv0,te
19f90 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 29 3b 0a 20  mplatename,0);. 
19fa0 20 7d 0a 20 20 69 66 28 20 74 70 6c 74 6e 61 6d   }.  if( tpltnam
19fb0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  e==0 ){.    fpri
19fc0 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27  ntf(stderr,"Can'
19fd0 74 20 66 69 6e 64 20 74 68 65 20 70 61 72 73 65  t find the parse
19fe0 72 20 64 72 69 76 65 72 20 74 65 6d 70 6c 61 74  r driver templat
19ff0 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e  e file \"%s\".\n
1a000 22 2c 0a 20 20 20 20 74 65 6d 70 6c 61 74 65 6e  ",.    templaten
1a010 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e  ame);.    lemp->
1a020 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
1a030 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1a040 69 6e 20 3d 20 66 6f 70 65 6e 28 74 70 6c 74 6e  in = fopen(tpltn
1a050 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28  ame,"rb");.  if(
1a060 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70   in==0 ){.    fp
1a070 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61  rintf(stderr,"Ca
1a080 6e 27 74 20 6f 70 65 6e 20 74 68 65 20 74 65 6d  n't open the tem
1a090 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c  plate file \"%s\
1a0a0 22 2e 5c 6e 22 2c 74 65 6d 70 6c 61 74 65 6e 61  ".\n",templatena
1a0b0 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65  me);.    lemp->e
1a0c0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72  rrorcnt++;.    r
1a0d0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
1a0e0 65 74 75 72 6e 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20  eturn in;.}../* 
1a0f0 50 72 69 6e 74 20 61 20 23 6c 69 6e 65 20 64 69  Print a #line di
1a100 72 65 63 74 69 76 65 20 6c 69 6e 65 20 74 6f 20  rective line to 
1a110 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65 2e  the output file.
1a120 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64   */.PRIVATE void
1a130 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 46 49   tplt_linedir(FI
1a140 4c 45 20 2a 6f 75 74 2c 20 69 6e 74 20 6c 69 6e  LE *out, int lin
1a150 65 6e 6f 2c 20 63 68 61 72 20 2a 66 69 6c 65 6e  eno, char *filen
1a160 61 6d 65 29 0a 7b 0a 20 20 66 70 72 69 6e 74 66  ame).{.  fprintf
1a170 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c  (out,"#line %d \
1a180 22 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 77 68  "",lineno);.  wh
1a190 69 6c 65 28 20 2a 66 69 6c 65 6e 61 6d 65 20 29  ile( *filename )
1a1a0 7b 0a 20 20 20 20 69 66 28 20 2a 66 69 6c 65 6e  {.    if( *filen
1a1b0 61 6d 65 20 3d 3d 20 27 5c 5c 27 20 29 20 70 75  ame == '\\' ) pu
1a1c0 74 63 28 27 5c 5c 27 2c 6f 75 74 29 3b 0a 20 20  tc('\\',out);.  
1a1d0 20 20 70 75 74 63 28 2a 66 69 6c 65 6e 61 6d 65    putc(*filename
1a1e0 2c 6f 75 74 29 3b 0a 20 20 20 20 66 69 6c 65 6e  ,out);.    filen
1a1f0 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72  ame++;.  }.  fpr
1a200 69 6e 74 66 28 6f 75 74 2c 22 5c 22 5c 6e 22 29  intf(out,"\"\n")
1a210 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20  ;.}../* Print a 
1a220 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20 66 69  string to the fi
1a230 6c 65 20 61 6e 64 20 6b 65 65 70 20 74 68 65 20  le and keep the 
1a240 6c 69 6e 65 6e 75 6d 62 65 72 20 75 70 20 74 6f  linenumber up to
1a250 20 64 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45   date */.PRIVATE
1a260 20 76 6f 69 64 20 74 70 6c 74 5f 70 72 69 6e 74   void tplt_print
1a270 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75  (FILE *out, stru
1a280 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20  ct lemon *lemp, 
1a290 63 68 61 72 20 2a 73 74 72 2c 20 69 6e 74 20 2a  char *str, int *
1a2a0 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20 69 66 28 20  lineno).{.  if( 
1a2b0 73 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  str==0 ) return;
1a2c0 0a 20 20 77 68 69 6c 65 28 20 2a 73 74 72 20 29  .  while( *str )
1a2d0 7b 0a 20 20 20 20 70 75 74 63 28 2a 73 74 72 2c  {.    putc(*str,
1a2e0 6f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 73  out);.    if( *s
1a2f0 74 72 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e  tr=='\n' ) (*lin
1a300 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 73 74 72 2b  eno)++;.    str+
1a310 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72  +;.  }.  if( str
1a320 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  [-1]!='\n' ){.  
1a330 20 20 70 75 74 63 28 27 5c 6e 27 2c 6f 75 74 29    putc('\n',out)
1a340 3b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b  ;.    (*lineno)+
1a350 2b 3b 0a 20 20 7d 0a 20 20 69 66 20 28 21 6c 65  +;.  }.  if (!le
1a360 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  mp->nolinenosfla
1a370 67 29 20 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e  g) {.    (*linen
1a380 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64  o)++; tplt_lined
1a390 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c  ir(out,*lineno,l
1a3a0 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20  emp->outname);. 
1a3b0 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
1a3c0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1a3d0 69 6e 67 20 72 6f 75 74 69 6e 65 20 65 6d 69 74  ing routine emit
1a3e0 73 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 64  s code for the d
1a3f0 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  estructor for th
1a400 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73 70 0a 2a  e.** symbol sp.*
1a410 2f 0a 76 6f 69 64 20 65 6d 69 74 5f 64 65 73 74  /.void emit_dest
1a420 72 75 63 74 6f 72 5f 63 6f 64 65 28 0a 20 20 46  ructor_code(.  F
1a430 49 4c 45 20 2a 6f 75 74 2c 0a 20 20 73 74 72 75  ILE *out,.  stru
1a440 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a 20  ct symbol *sp,. 
1a450 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c   struct lemon *l
1a460 65 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e 65  emp,.  int *line
1a470 6e 6f 0a 29 7b 0a 20 63 68 61 72 20 2a 63 70 20  no.){. char *cp 
1a480 3d 20 30 3b 0a 0a 20 69 66 28 20 73 70 2d 3e 74  = 0;.. if( sp->t
1a490 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b  ype==TERMINAL ){
1a4a0 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 74  .   cp = lemp->t
1a4b0 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20 69 66 28  okendest;.   if(
1a4c0 20 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   cp==0 ) return;
1a4d0 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
1a4e0 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f  "{\n"); (*lineno
1a4f0 29 2b 2b 3b 0a 20 7d 65 6c 73 65 20 69 66 28 20  )++;. }else if( 
1a500 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 29  sp->destructor )
1a510 7b 0a 20 20 20 63 70 20 3d 20 73 70 2d 3e 64 65  {.   cp = sp->de
1a520 73 74 72 75 63 74 6f 72 3b 0a 20 20 20 66 70 72  structor;.   fpr
1a530 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b  intf(out,"{\n");
1a540 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
1a550 20 69 66 28 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69   if( !lemp->noli
1a560 6e 65 6e 6f 73 66 6c 61 67 20 29 7b 0a 20 20 20  nenosflag ){.   
1a570 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20    (*lineno)++;. 
1a580 20 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72      tplt_linedir
1a590 28 6f 75 74 2c 73 70 2d 3e 64 65 73 74 4c 69 6e  (out,sp->destLin
1a5a0 65 6e 6f 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  eno,lemp->filena
1a5b0 6d 65 29 3b 0a 20 20 20 7d 0a 20 7d 65 6c 73 65  me);.   }. }else
1a5c0 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65   if( lemp->varde
1a5d0 73 74 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65  st ){.   cp = le
1a5e0 6d 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20  mp->vardest;.   
1a5f0 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75  if( cp==0 ) retu
1a600 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  rn;.   fprintf(o
1a610 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e  ut,"{\n"); (*lin
1a620 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 7b 0a  eno)++;. }else{.
1a630 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20     assert( 0 ); 
1a640 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65   /* Cannot happe
1a650 6e 20 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a  n */. }. for(; *
1a660 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66  cp; cp++){.   if
1a670 28 20 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70  ( *cp=='$' && cp
1a680 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20  [1]=='$' ){.    
1a690 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79   fprintf(out,"(y
1a6a0 79 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c  ypminor->yy%d)",
1a6b0 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20  sp->dtnum);.    
1a6c0 20 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74   cp++;.     cont
1a6d0 69 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66  inue;.   }.   if
1a6e0 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a  ( *cp=='\n' ) (*
1a6f0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 66 70  lineno)++;.   fp
1a700 75 74 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d  utc(*cp,out);. }
1a710 0a 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c  . fprintf(out,"\
1a720 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n"); (*lineno)++
1a730 3b 0a 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f  ;. if (!lemp->no
1a740 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 0a 20  linenosflag) {. 
1a750 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74    (*lineno)++; t
1a760 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c  plt_linedir(out,
1a770 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75  *lineno,lemp->ou
1a780 74 6e 61 6d 65 29 3b 0a 20 7d 0a 20 66 70 72 69  tname);. }. fpri
1a790 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20  ntf(out,"}\n"); 
1a7a0 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 72 65  (*lineno)++;. re
1a7b0 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  turn;.}../*.** R
1a7c0 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d  eturn TRUE (non-
1a7d0 7a 65 72 6f 29 20 69 66 20 74 68 65 20 67 69 76  zero) if the giv
1a7e0 65 6e 20 73 79 6d 62 6f 6c 20 68 61 73 20 61 20  en symbol has a 
1a7f0 64 65 73 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69  destructor..*/.i
1a800 6e 74 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f  nt has_destructo
1a810 72 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  r(struct symbol 
1a820 2a 73 70 2c 20 73 74 72 75 63 74 20 6c 65 6d 6f  *sp, struct lemo
1a830 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74  n *lemp).{.  int
1a840 20 72 65 74 3b 0a 20 20 69 66 28 20 73 70 2d 3e   ret;.  if( sp->
1a850 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29  type==TERMINAL )
1a860 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70  {.    ret = lemp
1a870 2d 3e 74 6f 6b 65 6e 64 65 73 74 21 3d 30 3b 0a  ->tokendest!=0;.
1a880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1a890 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74   = lemp->vardest
1a8a0 21 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72  !=0 || sp->destr
1a8b0 75 63 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a 20 20  uctor!=0;.  }.  
1a8c0 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
1a8d0 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74  *.** Append text
1a8e0 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
1a8f0 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69  y allocated stri
1a900 6e 67 2e 20 20 49 66 20 7a 54 65 78 74 20 69 73  ng.  If zText is
1a910 20 30 20 74 68 65 6e 0a 2a 2a 20 72 65 73 65 74   0 then.** reset
1a920 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20 62   the string to b
1a930 65 20 65 6d 70 74 79 20 61 67 61 69 6e 2e 20 20  e empty again.  
1a940 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
1a950 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 0a  e complete text.
1a960 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  ** of the string
1a970 20 28 77 68 69 63 68 20 69 73 20 6f 76 65 72 77   (which is overw
1a980 72 69 74 74 65 6e 20 77 69 74 68 20 65 61 63 68  ritten with each
1a990 20 63 61 6c 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20   call)..**.** n 
1a9a0 62 79 74 65 73 20 6f 66 20 7a 54 65 78 74 20 61  bytes of zText a
1a9b0 72 65 20 73 74 6f 72 65 64 2e 20 20 49 66 20 6e  re stored.  If n
1a9c0 3d 3d 30 20 74 68 65 6e 20 61 6c 6c 20 6f 66 20  ==0 then all of 
1a9d0 7a 54 65 78 74 20 75 70 20 74 6f 20 74 68 65 20  zText up to the 
1a9e0 66 69 72 73 74 0a 2a 2a 20 5c 30 30 30 20 74 65  first.** \000 te
1a9f0 72 6d 69 6e 61 74 6f 72 20 69 73 20 73 74 6f 72  rminator is stor
1aa00 65 64 2e 20 20 7a 54 65 78 74 20 63 61 6e 20 63  ed.  zText can c
1aa10 6f 6e 74 61 69 6e 20 75 70 20 74 6f 20 74 77 6f  ontain up to two
1aa20 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 0a 2a 2a   instances of.**
1aa30 20 25 64 2e 20 20 54 68 65 20 76 61 6c 75 65 73   %d.  The values
1aa40 20 6f 66 20 70 31 20 61 6e 64 20 70 32 20 61 72   of p1 and p2 ar
1aa50 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1aa60 68 65 20 66 69 72 73 74 20 61 6e 64 20 73 65 63  he first and sec
1aa70 6f 6e 64 0a 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a  ond.** %d..**.**
1aa80 20 49 66 20 6e 3d 3d 2d 31 2c 20 74 68 65 6e 20   If n==-1, then 
1aa90 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 68 61  the previous cha
1aaa0 72 61 63 74 65 72 20 69 73 20 6f 76 65 72 77 72  racter is overwr
1aab0 69 74 74 65 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54  itten..*/.PRIVAT
1aac0 45 20 63 68 61 72 20 2a 61 70 70 65 6e 64 5f 73  E char *append_s
1aad0 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  tr(const char *z
1aae0 54 65 78 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74  Text, int n, int
1aaf0 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20   p1, int p2){.  
1ab00 73 74 61 74 69 63 20 63 68 61 72 20 65 6d 70 74  static char empt
1ab10 79 5b 31 5d 20 3d 20 7b 20 30 20 7d 3b 0a 20 20  y[1] = { 0 };.  
1ab20 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 20 3d  static char *z =
1ab30 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
1ab40 20 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20   alloced = 0;.  
1ab50 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 20  static int used 
1ab60 3d 20 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  = 0;.  int c;.  
1ab70 63 68 61 72 20 7a 49 6e 74 5b 34 30 5d 3b 0a 20  char zInt[40];. 
1ab80 20 69 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b   if( zText==0 ){
1ab90 0a 20 20 20 20 69 66 28 20 75 73 65 64 3d 3d 30  .    if( used==0
1aba0 20 26 26 20 7a 21 3d 30 20 29 20 7a 5b 30 5d 20   && z!=0 ) z[0] 
1abb0 3d 20 30 3b 0a 20 20 20 20 75 73 65 64 20 3d 20  = 0;.    used = 
1abc0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 3b  0;.    return z;
1abd0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 3d 30 20  .  }.  if( n<=0 
1abe0 29 7b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29  ){.    if( n<0 )
1abf0 7b 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20  {.      used += 
1ac00 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
1ac10 20 75 73 65 64 3e 3d 30 20 29 3b 0a 20 20 20 20   used>=0 );.    
1ac20 7d 0a 20 20 20 20 6e 20 3d 20 6c 65 6d 6f 6e 53  }.    n = lemonS
1ac30 74 72 6c 65 6e 28 7a 54 65 78 74 29 3b 0a 20 20  trlen(zText);.  
1ac40 7d 0a 20 20 69 66 28 20 28 69 6e 74 29 20 28 6e  }.  if( (int) (n
1ac50 2b 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 2b  +sizeof(zInt)*2+
1ac60 75 73 65 64 29 20 3e 3d 20 61 6c 6c 6f 63 65 64  used) >= alloced
1ac70 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 65 64 20   ){.    alloced 
1ac80 3d 20 6e 20 2b 20 73 69 7a 65 6f 66 28 7a 49 6e  = n + sizeof(zIn
1ac90 74 29 2a 32 20 2b 20 75 73 65 64 20 2b 20 32 30  t)*2 + used + 20
1aca0 30 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72  0;.    z = (char
1acb0 20 2a 29 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20   *) realloc(z,  
1acc0 61 6c 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20  alloced);.  }.  
1acd0 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
1ace0 6e 20 65 6d 70 74 79 3b 0a 20 20 77 68 69 6c 65  n empty;.  while
1acf0 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
1ad00 20 63 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b   c = *(zText++);
1ad10 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20  .    if( c=='%' 
1ad20 26 26 20 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b  && n>0 && zText[
1ad30 30 5d 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20  0]=='d' ){.     
1ad40 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a   lemon_sprintf(z
1ad50 49 6e 74 2c 20 22 25 64 22 2c 20 70 31 29 3b 0a  Int, "%d", p1);.
1ad60 20 20 20 20 20 20 70 31 20 3d 20 70 32 3b 0a 20        p1 = p2;. 
1ad70 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70       lemon_strcp
1ad80 79 28 26 7a 5b 75 73 65 64 5d 2c 20 7a 49 6e 74  y(&z[used], zInt
1ad90 29 3b 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d  );.      used +=
1ada0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 26 7a 5b   lemonStrlen(&z[
1adb0 75 73 65 64 5d 29 3b 0a 20 20 20 20 20 20 7a 54  used]);.      zT
1adc0 65 78 74 2b 2b 3b 0a 20 20 20 20 20 20 6e 2d 2d  ext++;.      n--
1add0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ade0 20 20 20 7a 5b 75 73 65 64 2b 2b 5d 20 3d 20 28     z[used++] = (
1adf0 63 68 61 72 29 63 3b 0a 20 20 20 20 7d 0a 20 20  char)c;.    }.  
1ae00 7d 0a 20 20 7a 5b 75 73 65 64 5d 20 3d 20 30 3b  }.  z[used] = 0;
1ae10 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
1ae20 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 64 20  /*.** Write and 
1ae30 74 72 61 6e 73 66 6f 72 6d 20 74 68 65 20 72 70  transform the rp
1ae40 2d 3e 63 6f 64 65 20 73 74 72 69 6e 67 20 73 6f  ->code string so
1ae50 20 74 68 61 74 20 73 79 6d 62 6f 6c 73 20 61 72   that symbols ar
1ae60 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 50  e expanded..** P
1ae70 6f 70 75 6c 61 74 65 20 74 68 65 20 72 70 2d 3e  opulate the rp->
1ae80 63 6f 64 65 50 72 65 66 69 78 20 61 6e 64 20 72  codePrefix and r
1ae90 70 2d 3e 63 6f 64 65 53 75 66 66 69 78 20 73 74  p->codeSuffix st
1aea0 72 69 6e 67 73 2c 20 61 73 20 61 70 70 72 6f 70  rings, as approp
1aeb0 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  riate..**.** Ret
1aec0 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70  urn 1 if the exp
1aed0 61 6e 64 65 64 20 63 6f 64 65 20 72 65 71 75 69  anded code requi
1aee0 72 65 73 20 74 68 61 74 20 22 79 79 6c 68 73 6d  res that "yylhsm
1aef0 69 6e 6f 72 22 20 6c 6f 63 61 6c 20 76 61 72 69  inor" local vari
1af00 61 62 6c 65 0a 2a 2a 20 74 6f 20 62 65 20 64 65  able.** to be de
1af10 66 69 6e 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54  fined..*/.PRIVAT
1af20 45 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 5f  E int translate_
1af30 63 6f 64 65 28 73 74 72 75 63 74 20 6c 65 6d 6f  code(struct lemo
1af40 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20  n *lemp, struct 
1af50 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20 63 68 61  rule *rp){.  cha
1af60 72 20 2a 63 70 2c 20 2a 78 70 3b 0a 20 20 69 6e  r *cp, *xp;.  in
1af70 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
1af80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
1af90 20 54 72 75 65 20 69 66 20 79 79 6c 68 73 6d 69   True if yylhsmi
1afa0 6e 6f 72 20 69 73 20 75 73 65 64 20 2a 2f 0a 20  nor is used */. 
1afb0 20 69 6e 74 20 64 6f 6e 74 55 73 65 52 68 73 30   int dontUseRhs0
1afc0 20 3d 20 30 3b 20 20 20 2f 2a 20 49 66 20 74 72   = 0;   /* If tr
1afd0 75 65 2c 20 75 73 65 20 6f 66 20 6c 65 66 74 2d  ue, use of left-
1afe0 6d 6f 73 74 20 52 48 53 20 6c 61 62 65 6c 20 69  most RHS label i
1aff0 73 20 69 6c 6c 65 67 61 6c 20 2a 2f 0a 20 20 63  s illegal */.  c
1b000 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 6b 69 70  onst char *zSkip
1b010 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 7a 4f 76   = 0; /* The zOv
1b020 77 72 74 20 63 6f 6d 6d 65 6e 74 20 77 69 74 68  wrt comment with
1b030 69 6e 20 72 70 2d 3e 63 6f 64 65 2c 20 6f 72 20  in rp->code, or 
1b040 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 6c  NULL */.  char l
1b050 68 73 75 73 65 64 20 3d 20 30 3b 20 20 20 20 20  hsused = 0;     
1b060 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1b070 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68 61 73 20  LHS element has 
1b080 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 63  been used */.  c
1b090 68 61 72 20 6c 68 73 64 69 72 65 63 74 3b 20 20  har lhsdirect;  
1b0a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1b0b0 20 4c 48 53 20 77 72 69 74 65 73 20 64 69 72 65   LHS writes dire
1b0c0 63 74 6c 79 20 69 6e 74 6f 20 73 74 61 63 6b 20  ctly into stack 
1b0d0 2a 2f 0a 20 20 63 68 61 72 20 75 73 65 64 5b 4d  */.  char used[M
1b0e0 41 58 52 48 53 5d 3b 20 20 20 20 20 2f 2a 20 54  AXRHS];     /* T
1b0f0 72 75 65 20 66 6f 72 20 65 61 63 68 20 52 48 53  rue for each RHS
1b100 20 65 6c 65 6d 65 6e 74 20 77 68 69 63 68 20 69   element which i
1b110 73 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72  s used */.  char
1b120 20 7a 4c 68 73 5b 35 30 5d 3b 20 20 20 20 20 20   zLhs[50];      
1b130 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
1b140 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20 69 6e 74  e LHS symbol int
1b150 6f 20 74 68 69 73 20 73 74 72 69 6e 67 20 2a 2f  o this string */
1b160 0a 20 20 63 68 61 72 20 7a 4f 76 77 72 74 5b 39  .  char zOvwrt[9
1b170 30 30 5d 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6d  00];      /* Com
1b180 6d 65 6e 74 20 74 68 61 74 20 74 6f 20 61 6c 6c  ment that to all
1b190 6f 77 20 4c 48 53 20 74 6f 20 6f 76 65 72 77 72  ow LHS to overwr
1b1a0 69 74 65 20 52 48 53 20 2a 2f 0a 0a 20 20 66 6f  ite RHS */..  fo
1b1b0 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
1b1c0 73 3b 20 69 2b 2b 29 20 75 73 65 64 5b 69 5d 20  s; i++) used[i] 
1b1d0 3d 20 30 3b 0a 20 20 6c 68 73 75 73 65 64 20 3d  = 0;.  lhsused =
1b1e0 20 30 3b 0a 0a 20 20 69 66 28 20 72 70 2d 3e 63   0;..  if( rp->c
1b1f0 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ode==0 ){.    st
1b200 61 74 69 63 20 63 68 61 72 20 6e 65 77 6c 69 6e  atic char newlin
1b210 65 73 74 72 5b 32 5d 20 3d 20 7b 20 27 5c 6e 27  estr[2] = { '\n'
1b220 2c 20 27 5c 30 27 20 7d 3b 0a 20 20 20 20 72 70  , '\0' };.    rp
1b230 2d 3e 63 6f 64 65 20 3d 20 6e 65 77 6c 69 6e 65  ->code = newline
1b240 73 74 72 3b 0a 20 20 20 20 72 70 2d 3e 6c 69 6e  str;.    rp->lin
1b250 65 20 3d 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65  e = rp->ruleline
1b260 3b 0a 20 20 20 20 72 70 2d 3e 6e 6f 43 6f 64 65  ;.    rp->noCode
1b270 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
1b280 20 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20     rp->noCode = 
1b290 30 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72  0;.  }...  if( r
1b2a0 70 2d 3e 6e 72 68 73 3d 3d 30 20 29 7b 0a 20 20  p->nrhs==0 ){.  
1b2b0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1b2c0 65 20 6e 6f 20 52 48 53 20 73 79 6d 62 6f 6c 73  e no RHS symbols
1b2d0 2c 20 74 68 65 6e 20 77 72 69 74 69 6e 67 20 64  , then writing d
1b2e0 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 4c  irectly to the L
1b2f0 48 53 20 69 73 20 6f 6b 20 2a 2f 0a 20 20 20 20  HS is ok */.    
1b300 6c 68 73 64 69 72 65 63 74 20 3d 20 31 3b 0a 20  lhsdirect = 1;. 
1b310 20 7d 65 6c 73 65 20 69 66 28 20 72 70 2d 3e 72   }else if( rp->r
1b320 68 73 61 6c 69 61 73 5b 30 5d 3d 3d 30 20 29 7b  hsalias[0]==0 ){
1b330 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74  .    /* The left
1b340 2d 6d 6f 73 74 20 52 48 53 20 73 79 6d 62 6f 6c  -most RHS symbol
1b350 20 68 61 73 20 6e 6f 20 76 61 6c 75 65 2e 20 20   has no value.  
1b360 4c 48 53 20 64 69 72 65 63 74 20 69 73 20 6f 6b  LHS direct is ok
1b370 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 65  .  But.    ** we
1b380 20 68 61 76 65 20 74 6f 20 63 61 6c 6c 20 74 68   have to call th
1b390 65 20 64 69 73 74 72 75 63 74 6f 72 20 6f 6e 20  e distructor on 
1b3a0 74 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 20 66  the RHS symbol f
1b3b0 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 6c 68 73  irst. */.    lhs
1b3c0 64 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 20 20  direct = 1;.    
1b3d0 69 66 28 20 68 61 73 5f 64 65 73 74 72 75 63 74  if( has_destruct
1b3e0 6f 72 28 72 70 2d 3e 72 68 73 5b 30 5d 2c 6c 65  or(rp->rhs[0],le
1b3f0 6d 70 29 20 29 7b 0a 20 20 20 20 20 20 61 70 70  mp) ){.      app
1b400 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29  end_str(0,0,0,0)
1b410 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73  ;.      append_s
1b420 74 72 28 22 20 20 79 79 5f 64 65 73 74 72 75 63  tr("  yy_destruc
1b430 74 6f 72 28 79 79 70 50 61 72 73 65 72 2c 25 64  tor(yypParser,%d
1b440 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f  ,&yymsp[%d].mino
1b450 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20  r);\n", 0,.     
1b460 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e              rp->
1b470 72 68 73 5b 30 5d 2d 3e 69 6e 64 65 78 2c 31 2d  rhs[0]->index,1-
1b480 72 70 2d 3e 6e 72 68 73 29 3b 0a 20 20 20 20 20  rp->nrhs);.     
1b490 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 20   rp->codePrefix 
1b4a0 3d 20 53 74 72 73 61 66 65 28 61 70 70 65 6e 64  = Strsafe(append
1b4b0 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 29 3b 0a  _str(0,0,0,0));.
1b4c0 20 20 20 20 20 20 72 70 2d 3e 6e 6f 43 6f 64 65        rp->noCode
1b4d0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
1b4e0 6c 73 65 20 69 66 28 20 72 70 2d 3e 6c 68 73 61  lse if( rp->lhsa
1b4f0 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  lias==0 ){.    /
1b500 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4c 48  * There is no LH
1b510 53 20 76 61 6c 75 65 20 73 79 6d 62 6f 6c 2e 20  S value symbol. 
1b520 2a 2f 0a 20 20 20 20 6c 68 73 64 69 72 65 63 74  */.    lhsdirect
1b530 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
1b540 28 20 73 74 72 63 6d 70 28 72 70 2d 3e 6c 68 73  ( strcmp(rp->lhs
1b550 61 6c 69 61 73 2c 72 70 2d 3e 72 68 73 61 6c 69  alias,rp->rhsali
1b560 61 73 5b 30 5d 29 3d 3d 30 20 29 7b 0a 20 20 20  as[0])==0 ){.   
1b570 20 2f 2a 20 54 68 65 20 4c 48 53 20 73 79 6d 62   /* The LHS symb
1b580 6f 6c 20 61 6e 64 20 74 68 65 20 6c 65 66 74 2d  ol and the left-
1b590 6d 6f 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20  most RHS symbol 
1b5a0 61 72 65 20 74 68 65 20 73 61 6d 65 2c 20 73 6f  are the same, so
1b5b0 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20 77  .    ** direct w
1b5c0 72 69 74 69 6e 67 20 69 73 20 61 6c 6c 6f 77 65  riting is allowe
1b5d0 64 20 2a 2f 0a 20 20 20 20 6c 68 73 64 69 72 65  d */.    lhsdire
1b5e0 63 74 20 3d 20 31 3b 0a 20 20 20 20 6c 68 73 75  ct = 1;.    lhsu
1b5f0 73 65 64 20 3d 20 31 3b 0a 20 20 20 20 75 73 65  sed = 1;.    use
1b600 64 5b 30 5d 20 3d 20 31 3b 0a 20 20 20 20 69 66  d[0] = 1;.    if
1b610 28 20 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d  ( rp->lhs->dtnum
1b620 21 3d 72 70 2d 3e 72 68 73 5b 30 5d 2d 3e 64 74  !=rp->rhs[0]->dt
1b630 6e 75 6d 20 29 7b 0a 20 20 20 20 20 20 45 72 72  num ){.      Err
1b640 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
1b650 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e  name,rp->rulelin
1b660 65 2c 0a 20 20 20 20 20 20 20 20 22 25 73 28 25  e,.        "%s(%
1b670 73 29 20 61 6e 64 20 25 73 28 25 73 29 20 73 68  s) and %s(%s) sh
1b680 61 72 65 20 74 68 65 20 73 61 6d 65 20 6c 61 62  are the same lab
1b690 65 6c 20 62 75 74 20 68 61 76 65 20 22 0a 20 20  el but have ".  
1b6a0 20 20 20 20 20 20 22 64 69 66 66 65 72 65 6e 74        "different
1b6b0 20 64 61 74 61 74 79 70 65 73 2e 22 2c 0a 20 20   datatypes.",.  
1b6c0 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6e        rp->lhs->n
1b6d0 61 6d 65 2c 20 72 70 2d 3e 6c 68 73 61 6c 69 61  ame, rp->lhsalia
1b6e0 73 2c 20 72 70 2d 3e 72 68 73 5b 30 5d 2d 3e 6e  s, rp->rhs[0]->n
1b6f0 61 6d 65 2c 20 72 70 2d 3e 72 68 73 61 6c 69 61  ame, rp->rhsalia
1b700 73 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6c 65 6d  s[0]);.      lem
1b710 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
1b720 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1b730 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28    lemon_sprintf(
1b740 7a 4f 76 77 72 74 2c 20 22 2f 2a 25 73 2d 6f 76  zOvwrt, "/*%s-ov
1b750 65 72 77 72 69 74 65 73 2d 25 73 2a 2f 22 2c 0a  erwrites-%s*/",.
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b770 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 20    rp->lhsalias, 
1b780 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d 29  rp->rhsalias[0])
1b790 3b 0a 20 20 20 20 7a 53 6b 69 70 20 3d 20 73 74  ;.    zSkip = st
1b7a0 72 73 74 72 28 72 70 2d 3e 63 6f 64 65 2c 20 7a  rstr(rp->code, z
1b7b0 4f 76 77 72 74 29 3b 0a 20 20 20 20 69 66 28 20  Ovwrt);.    if( 
1b7c0 7a 53 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20 20  zSkip!=0 ){.    
1b7d0 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 63 6f    /* The code co
1b7e0 6e 74 61 69 6e 73 20 61 20 73 70 65 63 69 61 6c  ntains a special
1b7f0 20 63 6f 6d 6d 65 6e 74 20 74 68 61 74 20 69 6e   comment that in
1b800 64 69 63 61 74 65 73 20 74 68 61 74 20 69 74 20  dicates that it 
1b810 69 73 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a  is safe.      **
1b820 20 66 6f 72 20 74 68 65 20 4c 48 53 20 6c 61 62   for the LHS lab
1b830 65 6c 20 74 6f 20 6f 76 65 72 77 72 69 74 65 20  el to overwrite 
1b840 6c 65 66 74 2d 6d 6f 73 74 20 52 48 53 20 6c 61  left-most RHS la
1b850 62 65 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 6c 68  bel. */.      lh
1b860 73 64 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 20  sdirect = 1;.   
1b870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 68   }else{.      lh
1b880 73 64 69 72 65 63 74 20 3d 20 30 3b 0a 20 20 20  sdirect = 0;.   
1b890 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 68 73   }.  }.  if( lhs
1b8a0 64 69 72 65 63 74 20 29 7b 0a 20 20 20 20 73 70  direct ){.    sp
1b8b0 72 69 6e 74 66 28 7a 4c 68 73 2c 20 22 79 79 6d  rintf(zLhs, "yym
1b8c0 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25  sp[%d].minor.yy%
1b8d0 64 22 2c 31 2d 72 70 2d 3e 6e 72 68 73 2c 72 70  d",1-rp->nrhs,rp
1b8e0 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20  ->lhs->dtnum);. 
1b8f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1b900 20 31 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   1;.    sprintf(
1b910 7a 4c 68 73 2c 20 22 79 79 6c 68 73 6d 69 6e 6f  zLhs, "yylhsmino
1b920 72 2e 79 79 25 64 22 2c 72 70 2d 3e 6c 68 73 2d  r.yy%d",rp->lhs-
1b930 3e 64 74 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20  >dtnum);.  }..  
1b940 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30  append_str(0,0,0
1b950 2c 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  ,0);..  /* This 
1b960 63 6f 6e 73 74 20 63 61 73 74 20 69 73 20 77 72  const cast is wr
1b970 6f 6e 67 20 62 75 74 20 68 61 72 6d 6c 65 73 73  ong but harmless
1b980 2c 20 69 66 20 77 65 27 72 65 20 63 61 72 65 66  , if we're caref
1b990 75 6c 2e 20 2a 2f 0a 20 20 66 6f 72 28 63 70 3d  ul. */.  for(cp=
1b9a0 28 63 68 61 72 20 2a 29 72 70 2d 3e 63 6f 64 65  (char *)rp->code
1b9b0 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20  ; *cp; cp++){.  
1b9c0 20 20 69 66 28 20 63 70 3d 3d 7a 53 6b 69 70 20    if( cp==zSkip 
1b9d0 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 5f  ){.      append_
1b9e0 73 74 72 28 7a 4f 76 77 72 74 2c 30 2c 30 2c 30  str(zOvwrt,0,0,0
1b9f0 29 3b 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 6c  );.      cp += l
1ba00 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f 76 77 72  emonStrlen(zOvwr
1ba10 74 29 2d 31 3b 0a 20 20 20 20 20 20 64 6f 6e 74  t)-1;.      dont
1ba20 55 73 65 52 68 73 30 20 3d 20 31 3b 0a 20 20 20  UseRhs0 = 1;.   
1ba30 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1ba40 20 7d 0a 20 20 20 20 69 66 28 20 49 53 41 4c 50   }.    if( ISALP
1ba50 48 41 28 2a 63 70 29 20 26 26 20 28 63 70 3d 3d  HA(*cp) && (cp==
1ba60 72 70 2d 3e 63 6f 64 65 20 7c 7c 20 28 21 49 53  rp->code || (!IS
1ba70 41 4c 4e 55 4d 28 63 70 5b 2d 31 5d 29 20 26 26  ALNUM(cp[-1]) &&
1ba80 20 63 70 5b 2d 31 5d 21 3d 27 5f 27 29 29 20 29   cp[-1]!='_')) )
1ba90 7b 0a 20 20 20 20 20 20 63 68 61 72 20 73 61 76  {.      char sav
1baa0 65 64 3b 0a 20 20 20 20 20 20 66 6f 72 28 78 70  ed;.      for(xp
1bab0 3d 20 26 63 70 5b 31 5d 3b 20 49 53 41 4c 4e 55  = &cp[1]; ISALNU
1bac0 4d 28 2a 78 70 29 20 7c 7c 20 2a 78 70 3d 3d 27  M(*xp) || *xp=='
1bad0 5f 27 3b 20 78 70 2b 2b 29 3b 0a 20 20 20 20 20  _'; xp++);.     
1bae0 20 73 61 76 65 64 20 3d 20 2a 78 70 3b 0a 20 20   saved = *xp;.  
1baf0 20 20 20 20 2a 78 70 20 3d 20 30 3b 0a 20 20 20      *xp = 0;.   
1bb00 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c     if( rp->lhsal
1bb10 69 61 73 20 26 26 20 73 74 72 63 6d 70 28 63 70  ias && strcmp(cp
1bb20 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3d 3d  ,rp->lhsalias)==
1bb30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  0 ){.        app
1bb40 65 6e 64 5f 73 74 72 28 7a 4c 68 73 2c 30 2c 30  end_str(zLhs,0,0
1bb50 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 63 70 20  ,0);.        cp 
1bb60 3d 20 78 70 3b 0a 20 20 20 20 20 20 20 20 6c 68  = xp;.        lh
1bb70 73 75 73 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  sused = 1;.     
1bb80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bb90 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
1bba0 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
1bbb0 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73       if( rp->rhs
1bbc0 61 6c 69 61 73 5b 69 5d 20 26 26 20 73 74 72 63  alias[i] && strc
1bbd0 6d 70 28 63 70 2c 72 70 2d 3e 72 68 73 61 6c 69  mp(cp,rp->rhsali
1bbe0 61 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20  as[i])==0 ){.   
1bbf0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d           if( i==
1bc00 30 20 26 26 20 64 6f 6e 74 55 73 65 52 68 73 30  0 && dontUseRhs0
1bc10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1bc20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
1bc30 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
1bc40 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20  leline,.        
1bc50 20 20 20 20 20 20 20 20 20 22 4c 61 62 65 6c 20           "Label 
1bc60 25 73 20 75 73 65 64 20 61 66 74 65 72 20 27 25  %s used after '%
1bc70 73 27 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s'.",.          
1bc80 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c         rp->rhsal
1bc90 69 61 73 5b 30 5d 2c 20 7a 4f 76 77 72 74 29 3b  ias[0], zOvwrt);
1bca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
1bcb0 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
1bcc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
1bcd0 73 65 20 69 66 28 20 63 70 21 3d 72 70 2d 3e 63  se if( cp!=rp->c
1bce0 6f 64 65 20 26 26 20 63 70 5b 2d 31 5d 3d 3d 27  ode && cp[-1]=='
1bcf0 40 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  @' ){.          
1bd00 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 72      /* If the ar
1bd10 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65  gument is of the
1bd20 20 66 6f 72 6d 20 40 58 20 74 68 65 6e 20 73 75   form @X then su
1bd30 62 73 74 69 74 75 74 65 64 0a 20 20 20 20 20 20  bstituted.      
1bd40 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74          ** the t
1bd50 6f 6b 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58  oken number of X
1bd60 2c 20 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20  , not the value 
1bd70 6f 66 20 58 20 2a 2f 0a 20 20 20 20 20 20 20 20  of X */.        
1bd80 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
1bd90 28 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f  ("yymsp[%d].majo
1bda0 72 22 2c 2d 31 2c 69 2d 72 70 2d 3e 6e 72 68 73  r",-1,i-rp->nrhs
1bdb0 2b 31 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20  +1,0);.         
1bdc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bdd0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
1bde0 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e  ymbol *sp = rp->
1bdf0 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  rhs[i];.        
1be00 20 20 20 20 20 20 69 6e 74 20 64 74 6e 75 6d 3b        int dtnum;
1be10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1be20 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c  f( sp->type==MUL
1be30 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
1be40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 74                dt
1be50 6e 75 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d  num = sp->subsym
1be60 5b 30 5d 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20  [0]->dtnum;.    
1be70 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1be80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1be90 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e 64 74 6e   dtnum = sp->dtn
1bea0 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  um;.            
1beb0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1bec0 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79    append_str("yy
1bed0 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79  msp[%d].minor.yy
1bee0 25 64 22 2c 30 2c 69 2d 72 70 2d 3e 6e 72 68 73  %d",0,i-rp->nrhs
1bef0 2b 31 2c 20 64 74 6e 75 6d 29 3b 0a 20 20 20 20  +1, dtnum);.    
1bf00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bf10 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20        cp = xp;. 
1bf20 20 20 20 20 20 20 20 20 20 20 20 75 73 65 64 5b             used[
1bf30 69 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i] = 1;.        
1bf40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1bf50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1bf60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
1bf70 78 70 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20  xp = saved;.    
1bf80 7d 0a 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72  }.    append_str
1bf90 28 63 70 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20  (cp, 1, 0, 0);. 
1bfa0 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a   } /* End loop *
1bfb0 2f 0a 0a 20 20 2f 2a 20 4d 61 69 6e 20 63 6f 64  /..  /* Main cod
1bfc0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 6d  e generation com
1bfd0 70 6c 65 74 65 64 20 2a 2f 0a 20 20 63 70 20 3d  pleted */.  cp =
1bfe0 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c   append_str(0,0,
1bff0 30 2c 30 29 3b 0a 20 20 69 66 28 20 63 70 20 26  0,0);.  if( cp &
1c000 26 20 63 70 5b 30 5d 20 29 20 72 70 2d 3e 63 6f  & cp[0] ) rp->co
1c010 64 65 20 3d 20 53 74 72 73 61 66 65 28 63 70 29  de = Strsafe(cp)
1c020 3b 0a 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30  ;.  append_str(0
1c030 2c 30 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a 20 43  ,0,0,0);..  /* C
1c040 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
1c050 65 20 74 68 65 20 4c 48 53 20 68 61 73 20 62 65  e the LHS has be
1c060 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 69 66 28  en used */.  if(
1c070 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26   rp->lhsalias &&
1c080 20 21 6c 68 73 75 73 65 64 20 29 7b 0a 20 20 20   !lhsused ){.   
1c090 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
1c0a0 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c  filename,rp->rul
1c0b0 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 22 4c 61  eline,.      "La
1c0c0 62 65 6c 20 5c 22 25 73 5c 22 20 66 6f 72 20 5c  bel \"%s\" for \
1c0d0 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76  "%s(%s)\" is nev
1c0e0 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20  er used.",.     
1c0f0 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c     rp->lhsalias,
1c100 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 72 70  rp->lhs->name,rp
1c110 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
1c120 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
1c130 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  +;.  }..  /* Gen
1c140 65 72 61 74 65 20 64 65 73 74 72 75 63 74 6f 72  erate destructor
1c150 20 63 6f 64 65 20 66 6f 72 20 52 48 53 20 6d 69   code for RHS mi
1c160 6e 6f 72 20 76 61 6c 75 65 73 20 77 68 69 63 68  nor values which
1c170 20 61 72 65 20 6e 6f 74 20 72 65 66 65 72 65 6e   are not referen
1c180 63 65 64 2e 0a 20 20 2a 2a 20 47 65 6e 65 72 61  ced..  ** Genera
1c190 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
1c1a0 73 20 66 6f 72 20 75 6e 75 73 65 64 20 6c 61 62  s for unused lab
1c1b0 65 6c 73 20 61 6e 64 20 64 75 70 6c 69 63 61 74  els and duplicat
1c1c0 65 20 6c 61 62 65 6c 73 2e 0a 20 20 2a 2f 0a 20  e labels..  */. 
1c1d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
1c1e0 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
1c1f0 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
1c200 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28  [i] ){.      if(
1c210 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i>0 ){.        
1c220 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 69  int j;.        i
1c230 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20  f( rp->lhsalias 
1c240 26 26 20 73 74 72 63 6d 70 28 72 70 2d 3e 6c 68  && strcmp(rp->lh
1c250 73 61 6c 69 61 73 2c 72 70 2d 3e 72 68 73 61 6c  salias,rp->rhsal
1c260 69 61 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20  ias[i])==0 ){.  
1c270 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
1c280 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
1c290 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20  rp->ruleline,.  
1c2a0 20 20 20 20 20 20 20 20 20 20 22 25 73 28 25 73            "%s(%s
1c2b0 29 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6c  ) has the same l
1c2c0 61 62 65 6c 20 61 73 20 74 68 65 20 4c 48 53 20  abel as the LHS 
1c2d0 62 75 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  but is not the l
1c2e0 65 66 74 2d 6d 6f 73 74 20 22 0a 20 20 20 20 20  eft-most ".     
1c2f0 20 20 20 20 20 20 20 22 73 79 6d 62 6f 6c 20 6f         "symbol o
1c300 6e 20 74 68 65 20 52 48 53 2e 22 2c 0a 20 20 20  n the RHS.",.   
1c310 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73           rp->rhs
1c320 5b 69 5d 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 72  [i]->name, rp->r
1c330 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  hsalias);.      
1c340 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
1c350 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nt++;.        }.
1c360 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1c370 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
1c380 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68        if( rp->rh
1c390 73 61 6c 69 61 73 5b 6a 5d 20 26 26 20 73 74 72  salias[j] && str
1c3a0 63 6d 70 28 72 70 2d 3e 72 68 73 61 6c 69 61 73  cmp(rp->rhsalias
1c3b0 5b 6a 5d 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  [j],rp->rhsalias
1c3c0 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  [i])==0 ){.     
1c3d0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
1c3e0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72  lemp->filename,r
1c3f0 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20  p->ruleline,.   
1c400 20 20 20 20 20 20 20 20 20 20 20 22 4c 61 62 65             "Labe
1c410 6c 20 25 73 20 75 73 65 64 20 66 6f 72 20 6d 75  l %s used for mu
1c420 6c 74 69 70 6c 65 20 73 79 6d 62 6f 6c 73 20 6f  ltiple symbols o
1c430 6e 20 74 68 65 20 52 48 53 20 6f 66 20 61 20 72  n the RHS of a r
1c440 75 6c 65 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  ule.",.         
1c450 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61       rp->rhsalia
1c460 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  s[i]);.         
1c470 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
1c480 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
1c490 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1c4a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1c4b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c4c0 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20  !used[i] ){.    
1c4d0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
1c4e0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
1c4f0 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20  ruleline,.      
1c500 20 20 20 20 22 4c 61 62 65 6c 20 25 73 20 66 6f      "Label %s fo
1c510 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20  r \"%s(%s)\" is 
1c520 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20  never used.",.  
1c530 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61          rp->rhsa
1c540 6c 69 61 73 5b 69 5d 2c 72 70 2d 3e 72 68 73 5b  lias[i],rp->rhs[
1c550 69 5d 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68 73  i]->name,rp->rhs
1c560 61 6c 69 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20  alias[i]);.     
1c570 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
1c580 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
1c590 20 7d 65 6c 73 65 20 69 66 28 20 69 3e 30 20 26   }else if( i>0 &
1c5a0 26 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72  & has_destructor
1c5b0 28 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70  (rp->rhs[i],lemp
1c5c0 29 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e  ) ){.      appen
1c5d0 64 5f 73 74 72 28 22 20 20 79 79 5f 64 65 73 74  d_str("  yy_dest
1c5e0 72 75 63 74 6f 72 28 79 79 70 50 61 72 73 65 72  ructor(yypParser
1c5f0 2c 25 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d  ,%d,&yymsp[%d].m
1c600 69 6e 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20  inor);\n", 0,.  
1c610 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69         rp->rhs[i
1c620 5d 2d 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e  ]->index,i-rp->n
1c630 72 68 73 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  rhs+1);.    }.  
1c640 7d 0a 0a 20 20 2f 2a 20 49 66 20 75 6e 61 62 6c  }..  /* If unabl
1c650 65 20 74 6f 20 77 72 69 74 65 20 4c 48 53 20 76  e to write LHS v
1c660 61 6c 75 65 73 20 64 69 72 65 63 74 6c 79 20 69  alues directly i
1c670 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2c 20 77  nto the stack, w
1c680 72 69 74 65 20 74 68 65 0a 20 20 2a 2a 20 73 61  rite the.  ** sa
1c690 76 65 64 20 4c 48 53 20 76 61 6c 75 65 20 6e 6f  ved LHS value no
1c6a0 77 2e 20 2a 2f 0a 20 20 69 66 28 20 6c 68 73 64  w. */.  if( lhsd
1c6b0 69 72 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  irect==0 ){.    
1c6c0 61 70 70 65 6e 64 5f 73 74 72 28 22 20 20 79 79  append_str("  yy
1c6d0 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79  msp[%d].minor.yy
1c6e0 25 64 20 3d 20 22 2c 20 30 2c 20 31 2d 72 70 2d  %d = ", 0, 1-rp-
1c6f0 3e 6e 72 68 73 2c 20 72 70 2d 3e 6c 68 73 2d 3e  >nrhs, rp->lhs->
1c700 64 74 6e 75 6d 29 3b 0a 20 20 20 20 61 70 70 65  dtnum);.    appe
1c710 6e 64 5f 73 74 72 28 7a 4c 68 73 2c 20 30 2c 20  nd_str(zLhs, 0, 
1c720 30 2c 20 30 29 3b 0a 20 20 20 20 61 70 70 65 6e  0, 0);.    appen
1c730 64 5f 73 74 72 28 22 3b 5c 6e 22 2c 20 30 2c 20  d_str(";\n", 0, 
1c740 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  0, 0);.  }..  /*
1c750 20 53 75 66 66 69 78 20 63 6f 64 65 20 67 65 6e   Suffix code gen
1c760 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65  eration complete
1c770 20 2a 2f 0a 20 20 63 70 20 3d 20 61 70 70 65 6e   */.  cp = appen
1c780 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a  d_str(0,0,0,0);.
1c790 20 20 69 66 28 20 63 70 20 26 26 20 63 70 5b 30    if( cp && cp[0
1c7a0 5d 20 29 7b 0a 20 20 20 20 72 70 2d 3e 63 6f 64  ] ){.    rp->cod
1c7b0 65 53 75 66 66 69 78 20 3d 20 53 74 72 73 61 66  eSuffix = Strsaf
1c7c0 65 28 63 70 29 3b 0a 20 20 20 20 72 70 2d 3e 6e  e(cp);.    rp->n
1c7d0 6f 43 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  oCode = 0;.  }..
1c7e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c7f0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1c800 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
1c810 65 73 20 77 68 65 6e 20 74 68 65 20 72 75 6c 65  es when the rule
1c820 20 22 72 70 22 20 69 73 20 72 65 64 75 63 65 64   "rp" is reduced
1c830 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20  .  Write.** the 
1c840 63 6f 64 65 20 74 6f 20 22 6f 75 74 22 2e 20 20  code to "out".  
1c850 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e 65 6e 6f  Make sure lineno
1c860 20 73 74 61 79 73 20 75 70 2d 74 6f 2d 64 61 74   stays up-to-dat
1c870 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  e..*/.PRIVATE vo
1c880 69 64 20 65 6d 69 74 5f 63 6f 64 65 28 0a 20 20  id emit_code(.  
1c890 46 49 4c 45 20 2a 6f 75 74 2c 0a 20 20 73 74 72  FILE *out,.  str
1c8a0 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 0a 20 20  uct rule *rp,.  
1c8b0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
1c8c0 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e  mp,.  int *linen
1c8d0 6f 0a 29 7b 0a 20 63 6f 6e 73 74 20 63 68 61 72  o.){. const char
1c8e0 20 2a 63 70 3b 0a 0a 20 2f 2a 20 53 65 74 75 70   *cp;.. /* Setup
1c8f0 20 63 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 74   code prior to t
1c900 68 65 20 23 6c 69 6e 65 20 64 69 72 65 63 74 69  he #line directi
1c910 76 65 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63  ve */. if( rp->c
1c920 6f 64 65 50 72 65 66 69 78 20 26 26 20 72 70 2d  odePrefix && rp-
1c930 3e 63 6f 64 65 50 72 65 66 69 78 5b 30 5d 20 29  >codePrefix[0] )
1c940 7b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  {.   fprintf(out
1c950 2c 20 22 7b 25 73 22 2c 20 72 70 2d 3e 63 6f 64  , "{%s", rp->cod
1c960 65 50 72 65 66 69 78 29 3b 0a 20 20 20 66 6f 72  ePrefix);.   for
1c970 28 63 70 3d 72 70 2d 3e 63 6f 64 65 50 72 65 66  (cp=rp->codePref
1c980 69 78 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 20  ix; *cp; cp++){ 
1c990 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20  if( *cp=='\n' ) 
1c9a0 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 7d 0a 20  (*lineno)++; }. 
1c9b0 7d 0a 0a 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  }.. /* Generate 
1c9c0 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 72  code to do the r
1c9d0 65 64 75 63 65 20 61 63 74 69 6f 6e 20 2a 2f 0a  educe action */.
1c9e0 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 7b   if( rp->code ){
1c9f0 0a 20 20 20 69 66 28 20 21 6c 65 6d 70 2d 3e 6e  .   if( !lemp->n
1ca00 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 29 7b 0a  olinenosflag ){.
1ca10 20 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b       (*lineno)++
1ca20 3b 0a 20 20 20 20 20 74 70 6c 74 5f 6c 69 6e 65  ;.     tplt_line
1ca30 64 69 72 28 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65  dir(out,rp->line
1ca40 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
1ca50 3b 0a 20 20 20 7d 0a 20 20 20 66 70 72 69 6e 74  ;.   }.   fprint
1ca60 66 28 6f 75 74 2c 22 7b 25 73 22 2c 72 70 2d 3e  f(out,"{%s",rp->
1ca70 63 6f 64 65 29 3b 0a 20 20 20 66 6f 72 28 63 70  code);.   for(cp
1ca80 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20  =rp->code; *cp; 
1ca90 63 70 2b 2b 29 7b 20 69 66 28 20 2a 63 70 3d 3d  cp++){ if( *cp==
1caa0 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29  '\n' ) (*lineno)
1cab0 2b 2b 3b 20 7d 0a 20 20 20 66 70 72 69 6e 74 66  ++; }.   fprintf
1cac0 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c  (out,"}\n"); (*l
1cad0 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 28  ineno)++;.   if(
1cae0 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f   !lemp->nolineno
1caf0 73 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 28 2a  sflag ){.     (*
1cb00 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  lineno)++;.     
1cb10 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74  tplt_linedir(out
1cb20 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f  ,*lineno,lemp->o
1cb30 75 74 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a 20 7d  utname);.   }. }
1cb40 0a 0a 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 62  .. /* Generate b
1cb50 72 65 61 6b 64 6f 77 6e 20 63 6f 64 65 20 74 68  reakdown code th
1cb60 61 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  at occurs after 
1cb70 74 68 65 20 23 6c 69 6e 65 20 64 69 72 65 63 74  the #line direct
1cb80 69 76 65 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e  ive */. if( rp->
1cb90 63 6f 64 65 53 75 66 66 69 78 20 26 26 20 72 70  codeSuffix && rp
1cba0 2d 3e 63 6f 64 65 53 75 66 66 69 78 5b 30 5d 20  ->codeSuffix[0] 
1cbb0 29 7b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ){.   fprintf(ou
1cbc0 74 2c 20 22 25 73 22 2c 20 72 70 2d 3e 63 6f 64  t, "%s", rp->cod
1cbd0 65 53 75 66 66 69 78 29 3b 0a 20 20 20 66 6f 72  eSuffix);.   for
1cbe0 28 63 70 3d 72 70 2d 3e 63 6f 64 65 53 75 66 66  (cp=rp->codeSuff
1cbf0 69 78 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 20  ix; *cp; cp++){ 
1cc00 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20  if( *cp=='\n' ) 
1cc10 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 7d 0a 20  (*lineno)++; }. 
1cc20 7d 0a 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65  }.. if( rp->code
1cc30 50 72 65 66 69 78 20 29 7b 0a 20 20 20 66 70 72  Prefix ){.   fpr
1cc40 69 6e 74 66 28 6f 75 74 2c 20 22 7d 5c 6e 22 29  intf(out, "}\n")
1cc50 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20  ; (*lineno)++;. 
1cc60 7d 0a 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.. return;.}../
1cc70 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 64  *.** Print the d
1cc80 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65  efinition of the
1cc90 20 75 6e 69 6f 6e 20 75 73 65 64 20 66 6f 72 20   union used for 
1cca0 74 68 65 20 70 61 72 73 65 72 27 73 20 64 61 74  the parser's dat
1ccb0 61 20 73 74 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  a stack..** This
1ccc0 20 75 6e 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20   union contains 
1ccd0 66 69 65 6c 64 73 20 66 6f 72 20 65 76 65 72 79  fields for every
1cce0 20 70 6f 73 73 69 62 6c 65 20 64 61 74 61 20 74   possible data t
1ccf0 79 70 65 20 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a  ype for tokens.*
1cd00 2a 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61  * and nontermina
1cd10 6c 73 2e 20 20 49 6e 20 74 68 65 20 70 72 6f 63  ls.  In the proc
1cd20 65 73 73 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67  ess of computing
1cd30 20 61 6e 64 20 70 72 69 6e 74 69 6e 67 20 74 68   and printing th
1cd40 69 73 0a 2a 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73  is.** union, als
1cd50 6f 20 73 65 74 20 74 68 65 20 22 2e 64 74 6e 75  o set the ".dtnu
1cd60 6d 22 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72  m" field of ever
1cd70 79 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e  y terminal and n
1cd80 6f 6e 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79  onterminal.** sy
1cd90 6d 62 6f 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72  mbol..*/.void pr
1cda0 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28  int_stack_union(
1cdb0 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 20 20  .  FILE *out,   
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cdd0 2a 20 54 68 65 20 6f 75 74 70 75 74 20 73 74 72  * The output str
1cde0 65 61 6d 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eam */.  struct 
1cdf0 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 20 20 20  lemon *lemp,    
1ce00 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
1ce10 20 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20   info structure 
1ce20 66 6f 72 20 74 68 69 73 20 70 61 72 73 65 72 20  for this parser 
1ce30 2a 2f 0a 20 20 69 6e 74 20 2a 70 6c 69 6e 65 6e  */.  int *plinen
1ce40 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1ce50 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
1ce60 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a  he line number *
1ce70 2f 0a 20 20 69 6e 74 20 6d 68 66 6c 61 67 20 20  /.  int mhflag  
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce90 2f 2a 20 54 72 75 65 20 69 66 20 67 65 6e 65 72  /* True if gener
1cea0 61 74 69 6e 67 20 6d 61 6b 65 68 65 61 64 65 72  ating makeheader
1ceb0 73 20 6f 75 74 70 75 74 20 2a 2f 0a 29 7b 0a 20  s output */.){. 
1cec0 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70   int lineno = *p
1ced0 6c 69 6e 65 6e 6f 3b 20 20 20 20 2f 2a 20 54 68  lineno;    /* Th
1cee0 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66  e line number of
1cef0 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20   the output */. 
1cf00 20 63 68 61 72 20 2a 2a 74 79 70 65 73 3b 20 20   char **types;  
1cf10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1cf20 68 61 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61  hash table of da
1cf30 74 61 74 79 70 65 73 20 2a 2f 0a 20 20 69 6e 74  tatypes */.  int
1cf40 20 61 72 72 61 79 73 69 7a 65 3b 20 20 20 20 20   arraysize;     
1cf50 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1cf60 66 20 74 68 65 20 22 74 79 70 65 73 22 20 61 72  f the "types" ar
1cf70 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78  ray */.  int max
1cf80 64 74 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20  dtlength;       
1cf90 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65     /* Maximum le
1cfa0 6e 67 74 68 20 6f 66 20 61 6e 79 20 22 2e 64 61  ngth of any ".da
1cfb0 74 61 74 79 70 65 22 20 66 69 65 6c 64 2e 20 2a  tatype" field. *
1cfc0 2f 0a 20 20 63 68 61 72 20 2a 73 74 64 64 74 3b  /.  char *stddt;
1cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cfe0 20 53 74 61 6e 64 61 72 64 69 7a 65 64 20 6e 61   Standardized na
1cff0 6d 65 20 66 6f 72 20 61 20 64 61 74 61 74 79 70  me for a datatyp
1d000 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 6a 3b 20  e */.  int i,j; 
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d020 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
1d030 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
1d040 68 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20  hash;           
1d050 20 2f 2a 20 46 6f 72 20 68 61 73 68 69 6e 67 20   /* For hashing 
1d060 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 79  the name of a ty
1d070 70 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  pe */.  const ch
1d080 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20  ar *name;       
1d090 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1d0a0 20 70 61 72 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a   parser */..  /*
1d0b0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
1d0c0 69 74 69 61 6c 69 7a 65 20 74 79 70 65 73 5b 5d  itialize types[]
1d0d0 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 74   and allocate st
1d0e0 64 64 74 5b 5d 20 2a 2f 0a 20 20 61 72 72 61 79  ddt[] */.  array
1d0f0 73 69 7a 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79  size = lemp->nsy
1d100 6d 62 6f 6c 20 2a 20 32 3b 0a 20 20 74 79 70 65  mbol * 2;.  type
1d110 73 20 3d 20 28 63 68 61 72 2a 2a 29 63 61 6c 6c  s = (char**)call
1d120 6f 63 28 20 61 72 72 61 79 73 69 7a 65 2c 20 73  oc( arraysize, s
1d130 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a  izeof(char*) );.
1d140 20 20 69 66 28 20 74 79 70 65 73 3d 3d 30 20 29    if( types==0 )
1d150 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
1d160 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d  derr,"Out of mem
1d170 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78  ory.\n");.    ex
1d180 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  it(1);.  }.  for
1d190 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a  (i=0; i<arraysiz
1d1a0 65 3b 20 69 2b 2b 29 20 74 79 70 65 73 5b 69 5d  e; i++) types[i]
1d1b0 20 3d 20 30 3b 0a 20 20 6d 61 78 64 74 6c 65 6e   = 0;.  maxdtlen
1d1c0 67 74 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 6c  gth = 0;.  if( l
1d1d0 65 6d 70 2d 3e 76 61 72 74 79 70 65 20 29 7b 0a  emp->vartype ){.
1d1e0 20 20 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20      maxdtlength 
1d1f0 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65  = lemonStrlen(le
1d200 6d 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20 20  mp->vartype);.  
1d210 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  }.  for(i=0; i<l
1d220 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
1d230 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b  +){.    int len;
1d240 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62  .    struct symb
1d250 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  ol *sp = lemp->s
1d260 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 69  ymbols[i];.    i
1d270 66 28 20 73 70 2d 3e 64 61 74 61 74 79 70 65 3d  f( sp->datatype=
1d280 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1d290 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74     len = lemonSt
1d2a0 72 6c 65 6e 28 73 70 2d 3e 64 61 74 61 74 79 70  rlen(sp->datatyp
1d2b0 65 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e  e);.    if( len>
1d2c0 6d 61 78 64 74 6c 65 6e 67 74 68 20 29 20 6d 61  maxdtlength ) ma
1d2d0 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 3b  xdtlength = len;
1d2e0 0a 20 20 7d 0a 20 20 73 74 64 64 74 20 3d 20 28  .  }.  stddt = (
1d2f0 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6d 61  char*)malloc( ma
1d300 78 64 74 6c 65 6e 67 74 68 2a 32 20 2b 20 31 20  xdtlength*2 + 1 
1d310 29 3b 0a 20 20 69 66 28 20 73 74 64 64 74 3d 3d  );.  if( stddt==
1d320 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
1d330 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20  (stderr,"Out of 
1d340 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20  memory.\n");.   
1d350 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20   exit(1);.  }.. 
1d360 20 2f 2a 20 42 75 69 6c 64 20 61 20 68 61 73 68   /* Build a hash
1d370 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79   table of dataty
1d380 70 65 73 2e 20 54 68 65 20 22 2e 64 74 6e 75 6d  pes. The ".dtnum
1d390 22 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68 20  " field of each 
1d3a0 73 79 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73 20 66  symbol.  ** is f
1d3b0 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68  illed in with th
1d3c0 65 20 68 61 73 68 20 69 6e 64 65 78 20 70 6c 75  e hash index plu
1d3d0 73 20 31 2e 20 20 41 20 22 2e 64 74 6e 75 6d 22  s 1.  A ".dtnum"
1d3e0 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 0a 20   value of 0 is. 
1d3f0 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 65 72   ** used for ter
1d400 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 20 20  minal symbols.  
1d410 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 25  If there is no %
1d420 64 65 66 61 75 6c 74 5f 74 79 70 65 20 64 65 66  default_type def
1d430 69 6e 65 64 20 74 68 65 6e 0a 20 20 2a 2a 20 30  ined then.  ** 0
1d440 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 61 73   is also used as
1d450 20 74 68 65 20 2e 64 74 6e 75 6d 20 76 61 6c 75   the .dtnum valu
1d460 65 20 66 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61  e for nontermina
1d470 6c 73 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20  ls which do not 
1d480 73 70 65 63 69 66 79 0a 20 20 2a 2a 20 61 20 64  specify.  ** a d
1d490 61 74 61 74 79 70 65 20 75 73 69 6e 67 20 74 68  atatype using th
1d4a0 65 20 25 74 79 70 65 20 64 69 72 65 63 74 69 76  e %type directiv
1d4b0 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
1d4c0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
1d4d0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  ol; i++){.    st
1d4e0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
1d4f0 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
1d500 69 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70  i];.    char *cp
1d510 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 6c 65  ;.    if( sp==le
1d520 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20  mp->errsym ){.  
1d530 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
1d540 61 72 72 61 79 73 69 7a 65 2b 31 3b 0a 20 20 20  arraysize+1;.   
1d550 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1d560 20 7d 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74   }.    if( sp->t
1d570 79 70 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c  ype!=NONTERMINAL
1d580 20 7c 7c 20 28 73 70 2d 3e 64 61 74 61 74 79 70   || (sp->datatyp
1d590 65 3d 3d 30 20 26 26 20 6c 65 6d 70 2d 3e 76 61  e==0 && lemp->va
1d5a0 72 74 79 70 65 3d 3d 30 29 20 29 7b 0a 20 20 20  rtype==0) ){.   
1d5b0 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30     sp->dtnum = 0
1d5c0 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
1d5d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 70 20 3d  ;.    }.    cp =
1d5e0 20 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20   sp->datatype;. 
1d5f0 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63     if( cp==0 ) c
1d600 70 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70  p = lemp->vartyp
1d610 65 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  e;.    j = 0;.  
1d620 20 20 77 68 69 6c 65 28 20 49 53 53 50 41 43 45    while( ISSPACE
1d630 28 2a 63 70 29 20 29 20 63 70 2b 2b 3b 0a 20 20  (*cp) ) cp++;.  
1d640 20 20 77 68 69 6c 65 28 20 2a 63 70 20 29 20 73    while( *cp ) s
1d650 74 64 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b  tddt[j++] = *cp+
1d660 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3e  +;.    while( j>
1d670 30 20 26 26 20 49 53 53 50 41 43 45 28 73 74 64  0 && ISSPACE(std
1d680 64 74 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a  dt[j-1]) ) j--;.
1d690 20 20 20 20 73 74 64 64 74 5b 6a 5d 20 3d 20 30      stddt[j] = 0
1d6a0 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ;.    if( lemp->
1d6b0 74 6f 6b 65 6e 74 79 70 65 20 26 26 20 73 74 72  tokentype && str
1d6c0 63 6d 70 28 73 74 64 64 74 2c 20 6c 65 6d 70 2d  cmp(stddt, lemp-
1d6d0 3e 74 6f 6b 65 6e 74 79 70 65 29 3d 3d 30 20 29  >tokentype)==0 )
1d6e0 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75  {.      sp->dtnu
1d6f0 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  m = 0;.      con
1d700 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1d710 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 66   hash = 0;.    f
1d720 6f 72 28 6a 3d 30 3b 20 73 74 64 64 74 5b 6a 5d  or(j=0; stddt[j]
1d730 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 68 61  ; j++){.      ha
1d740 73 68 20 3d 20 68 61 73 68 2a 35 33 20 2b 20 73  sh = hash*53 + s
1d750 74 64 64 74 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20  tddt[j];.    }. 
1d760 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 20     hash = (hash 
1d770 26 20 30 78 37 66 66 66 66 66 66 66 29 25 61 72  & 0x7fffffff)%ar
1d780 72 61 79 73 69 7a 65 3b 0a 20 20 20 20 77 68 69  raysize;.    whi
1d790 6c 65 28 20 74 79 70 65 73 5b 68 61 73 68 5d 20  le( types[hash] 
1d7a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
1d7b0 63 6d 70 28 74 79 70 65 73 5b 68 61 73 68 5d 2c  cmp(types[hash],
1d7c0 73 74 64 64 74 29 3d 3d 30 20 29 7b 0a 20 20 20  stddt)==0 ){.   
1d7d0 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d       sp->dtnum =
1d7e0 20 68 61 73 68 20 2b 20 31 3b 0a 20 20 20 20 20   hash + 1;.     
1d7f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1d800 7d 0a 20 20 20 20 20 20 68 61 73 68 2b 2b 3b 0a  }.      hash++;.
1d810 20 20 20 20 20 20 69 66 28 20 68 61 73 68 3e 3d        if( hash>=
1d820 28 75 6e 73 69 67 6e 65 64 29 61 72 72 61 79 73  (unsigned)arrays
1d830 69 7a 65 20 29 20 68 61 73 68 20 3d 20 30 3b 0a  ize ) hash = 0;.
1d840 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 79      }.    if( ty
1d850 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a  pes[hash]==0 ){.
1d860 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20        sp->dtnum 
1d870 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20 20 20  = hash + 1;.    
1d880 20 20 74 79 70 65 73 5b 68 61 73 68 5d 20 3d 20    types[hash] = 
1d890 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6c  (char*)malloc( l
1d8a0 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 74 64 64 74  emonStrlen(stddt
1d8b0 29 2b 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  )+1 );.      if(
1d8c0 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20   types[hash]==0 
1d8d0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1d8e0 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f  tf(stderr,"Out o
1d8f0 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20  f memory.\n");. 
1d900 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a         exit(1);.
1d910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 65        }.      le
1d920 6d 6f 6e 5f 73 74 72 63 70 79 28 74 79 70 65 73  mon_strcpy(types
1d930 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3b 0a 20  [hash],stddt);. 
1d940 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
1d950 72 69 6e 74 20 6f 75 74 20 74 68 65 20 64 65 66  rint out the def
1d960 69 6e 69 74 69 6f 6e 20 6f 66 20 59 59 54 4f 4b  inition of YYTOK
1d970 45 4e 54 59 50 45 20 61 6e 64 20 59 59 4d 49 4e  ENTYPE and YYMIN
1d980 4f 52 54 59 50 45 20 2a 2f 0a 20 20 6e 61 6d 65  ORTYPE */.  name
1d990 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20   = lemp->name ? 
1d9a0 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61  lemp->name : "Pa
1d9b0 72 73 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d  rse";.  lineno =
1d9c0 20 2a 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66 28   *plineno;.  if(
1d9d0 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e   mhflag ){ fprin
1d9e0 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45  tf(out,"#if INTE
1d9f0 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e  RFACE\n"); linen
1da00 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66  o++; }.  fprintf
1da10 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1da20 54 4f 4b 45 4e 54 59 50 45 20 25 73 5c 6e 22 2c  TOKENTYPE %s\n",
1da30 6e 61 6d 65 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e  name,.    lemp->
1da40 74 6f 6b 65 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e  tokentype?lemp->
1da50 74 6f 6b 65 6e 74 79 70 65 3a 22 76 6f 69 64 2a  tokentype:"void*
1da60 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ");  lineno++;. 
1da70 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66   if( mhflag ){ f
1da80 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64  printf(out,"#end
1da90 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  if\n"); lineno++
1daa0 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ; }.  fprintf(ou
1dab0 74 2c 22 74 79 70 65 64 65 66 20 75 6e 69 6f 6e  t,"typedef union
1dac0 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   {\n"); lineno++
1dad0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1dae0 22 20 20 69 6e 74 20 79 79 69 6e 69 74 3b 5c 6e  "  int yyinit;\n
1daf0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1db00 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25  fprintf(out,"  %
1db10 73 54 4f 4b 45 4e 54 59 50 45 20 79 79 30 3b 5c  sTOKENTYPE yy0;\
1db20 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  n",name); lineno
1db30 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ++;.  for(i=0; i
1db40 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29  <arraysize; i++)
1db50 7b 0a 20 20 20 20 69 66 28 20 74 79 70 65 73 5b  {.    if( types[
1db60 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  i]==0 ) continue
1db70 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1db80 74 2c 22 20 20 25 73 20 79 79 25 64 3b 5c 6e 22  t,"  %s yy%d;\n"
1db90 2c 74 79 70 65 73 5b 69 5d 2c 69 2b 31 29 3b 20  ,types[i],i+1); 
1dba0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72  lineno++;.    fr
1dbb0 65 65 28 74 79 70 65 73 5b 69 5d 29 3b 0a 20 20  ee(types[i]);.  
1dbc0 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 65 72  }.  if( lemp->er
1dbd0 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20 29 7b 0a  rsym->useCnt ){.
1dbe0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1dbf0 22 20 20 69 6e 74 20 79 79 25 64 3b 5c 6e 22 2c  "  int yy%d;\n",
1dc00 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74  lemp->errsym->dt
1dc10 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  num); lineno++;.
1dc20 20 20 7d 0a 20 20 66 72 65 65 28 73 74 64 64 74    }.  free(stddt
1dc30 29 3b 0a 20 20 66 72 65 65 28 74 79 70 65 73 29  );.  free(types)
1dc40 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1dc50 22 7d 20 59 59 4d 49 4e 4f 52 54 59 50 45 3b 5c  "} YYMINORTYPE;\
1dc60 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1dc70 20 2a 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65   *plineno = line
1dc80 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  no;.}../*.** Ret
1dc90 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
1dca0 61 20 43 20 64 61 74 61 74 79 70 65 20 61 62 6c  a C datatype abl
1dcb0 65 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 76  e to represent v
1dcc0 61 6c 75 65 73 20 62 65 74 77 65 65 6e 0a 2a 2a  alues between.**
1dcd0 20 6c 77 72 20 61 6e 64 20 75 70 72 2c 20 69 6e   lwr and upr, in
1dce0 63 6c 75 73 69 76 65 2e 20 20 49 66 20 70 6e 42  clusive.  If pnB
1dcf0 79 74 65 21 3d 4e 55 4c 4c 20 74 68 65 6e 20 61  yte!=NULL then a
1dd00 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 73 69  lso write the si
1dd10 7a 65 6f 66 0a 2a 2a 20 66 6f 72 20 74 68 61 74  zeof.** for that
1dd20 20 74 79 70 65 20 28 31 2c 20 32 2c 20 6f 72 20   type (1, 2, or 
1dd30 34 29 20 69 6e 74 6f 20 2a 70 6e 42 79 74 65 2e  4) into *pnByte.
1dd40 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1dd50 20 63 68 61 72 20 2a 6d 69 6e 69 6d 75 6d 5f 73   char *minimum_s
1dd60 69 7a 65 5f 74 79 70 65 28 69 6e 74 20 6c 77 72  ize_type(int lwr
1dd70 2c 20 69 6e 74 20 75 70 72 2c 20 69 6e 74 20 2a  , int upr, int *
1dd80 70 6e 42 79 74 65 29 7b 0a 20 20 63 6f 6e 73 74  pnByte){.  const
1dd90 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 22   char *zType = "
1dda0 69 6e 74 22 3b 0a 20 20 69 6e 74 20 6e 42 79 74  int";.  int nByt
1ddb0 65 20 3d 20 34 3b 0a 20 20 69 66 28 20 6c 77 72  e = 4;.  if( lwr
1ddc0 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 75  >=0 ){.    if( u
1ddd0 70 72 3c 3d 32 35 35 20 29 7b 0a 20 20 20 20 20  pr<=255 ){.     
1dde0 20 7a 54 79 70 65 20 3d 20 22 75 6e 73 69 67 6e   zType = "unsign
1ddf0 65 64 20 63 68 61 72 22 3b 0a 20 20 20 20 20 20  ed char";.      
1de00 6e 42 79 74 65 20 3d 20 31 3b 0a 20 20 20 20 7d  nByte = 1;.    }
1de10 65 6c 73 65 20 69 66 28 20 75 70 72 3c 36 35 35  else if( upr<655
1de20 33 35 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  35 ){.      zTyp
1de30 65 20 3d 20 22 75 6e 73 69 67 6e 65 64 20 73 68  e = "unsigned sh
1de40 6f 72 74 20 69 6e 74 22 3b 0a 20 20 20 20 20 20  ort int";.      
1de50 6e 42 79 74 65 20 3d 20 32 3b 0a 20 20 20 20 7d  nByte = 2;.    }
1de60 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54 79 70  else{.      zTyp
1de70 65 20 3d 20 22 75 6e 73 69 67 6e 65 64 20 69 6e  e = "unsigned in
1de80 74 22 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  t";.      nByte 
1de90 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 4;.    }.  }el
1dea0 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d 31 32 37  se if( lwr>=-127
1deb0 20 26 26 20 75 70 72 3c 3d 31 32 37 20 29 7b 0a   && upr<=127 ){.
1dec0 20 20 20 20 7a 54 79 70 65 20 3d 20 22 73 69 67      zType = "sig
1ded0 6e 65 64 20 63 68 61 72 22 3b 0a 20 20 20 20 6e  ned char";.    n
1dee0 42 79 74 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  Byte = 1;.  }els
1def0 65 20 69 66 28 20 6c 77 72 3e 3d 2d 33 32 37 36  e if( lwr>=-3276
1df00 37 20 26 26 20 75 70 72 3c 33 32 37 36 37 20 29  7 && upr<32767 )
1df10 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 73  {.    zType = "s
1df20 68 6f 72 74 22 3b 0a 20 20 20 20 6e 42 79 74 65  hort";.    nByte
1df30 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 2;.  }.  if( 
1df40 70 6e 42 79 74 65 20 29 20 2a 70 6e 42 79 74 65  pnByte ) *pnByte
1df50 20 3d 20 6e 42 79 74 65 3b 0a 20 20 72 65 74 75   = nByte;.  retu
1df60 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zType;.}../*.
1df70 2a 2a 20 45 61 63 68 20 73 74 61 74 65 20 63 6f  ** Each state co
1df80 6e 74 61 69 6e 73 20 61 20 73 65 74 20 6f 66 20  ntains a set of 
1df90 74 6f 6b 65 6e 20 74 72 61 6e 73 61 63 74 69 6f  token transactio
1dfa0 6e 20 61 6e 64 20 61 20 73 65 74 20 6f 66 0a 2a  n and a set of.*
1dfb0 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74 72  * nonterminal tr
1dfc0 61 6e 73 61 63 74 69 6f 6e 73 2e 20 20 45 61 63  ansactions.  Eac
1dfd0 68 20 6f 66 20 74 68 65 73 65 20 73 65 74 73 20  h of these sets 
1dfe0 6d 61 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e 63  makes an instanc
1dff0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
1e000 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1e010 20 20 41 6e 20 61 72 72 61 79 20 6f 66 20 74 68    An array of th
1e020 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20 69  ese structures i
1e030 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72 64  s used.** to ord
1e040 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  er the creation 
1e050 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
1e060 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61  e yy_action[] ta
1e070 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 61  ble..*/.struct a
1e080 78 73 65 74 20 7b 0a 20 20 73 74 72 75 63 74 20  xset {.  struct 
1e090 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 2f 2a  state *stp;   /*
1e0a0 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   A pointer to a 
1e0b0 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  state */.  int i
1e0c0 73 54 6b 6e 3b 20 20 20 20 20 20 20 20 20 20 20  sTkn;           
1e0d0 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 74  /* True to use t
1e0e0 6f 6b 65 6e 73 2e 20 20 46 61 6c 73 65 20 66 6f  okens.  False fo
1e0f0 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20  r non-terminals 
1e100 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e  */.  int nAction
1e110 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1e120 62 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 2a  ber of actions *
1e130 2f 0a 20 20 69 6e 74 20 69 4f 72 64 65 72 3b 20  /.  int iOrder; 
1e140 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
1e150 69 6e 61 6c 20 6f 72 64 65 72 20 6f 66 20 61 63  inal order of ac
1e160 74 69 6f 6e 20 73 65 74 73 20 2a 2f 0a 7d 3b 0a  tion sets */.};.
1e170 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1e180 6f 20 61 78 73 65 74 20 73 74 72 75 63 74 75 72  o axset structur
1e190 65 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70  es for sorting p
1e1a0 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69  urposes.*/.stati
1e1b0 63 20 69 6e 74 20 61 78 73 65 74 5f 63 6f 6d 70  c int axset_comp
1e1c0 61 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  are(const void *
1e1d0 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62  a, const void *b
1e1e0 29 7b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65  ){.  struct axse
1e1f0 74 20 2a 70 31 20 3d 20 28 73 74 72 75 63 74 20  t *p1 = (struct 
1e200 61 78 73 65 74 2a 29 61 3b 0a 20 20 73 74 72 75  axset*)a;.  stru
1e210 63 74 20 61 78 73 65 74 20 2a 70 32 20 3d 20 28  ct axset *p2 = (
1e220 73 74 72 75 63 74 20 61 78 73 65 74 2a 29 62 3b  struct axset*)b;
1e230 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20  .  int c;.  c = 
1e240 70 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31  p2->nAction - p1
1e250 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 20 20 69 66 28  ->nAction;.  if(
1e260 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d   c==0 ){.    c =
1e270 20 70 31 2d 3e 69 4f 72 64 65 72 20 2d 20 70 32   p1->iOrder - p2
1e280 2d 3e 69 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20  ->iOrder;.  }.  
1e290 61 73 73 65 72 74 28 20 63 21 3d 30 20 7c 7c 20  assert( c!=0 || 
1e2a0 70 31 3d 3d 70 32 20 29 3b 0a 20 20 72 65 74 75  p1==p2 );.  retu
1e2b0 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  rn c;.}../*.** W
1e2c0 72 69 74 65 20 74 65 78 74 20 6f 6e 20 22 6f 75  rite text on "ou
1e2d0 74 22 20 74 68 61 74 20 64 65 73 63 72 69 62 65  t" that describe
1e2e0 73 20 74 68 65 20 72 75 6c 65 20 22 72 70 22 2e  s the rule "rp".
1e2f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e300 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 46 49  writeRuleText(FI
1e310 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20  LE *out, struct 
1e320 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e 74  rule *rp){.  int
1e330 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   j;.  fprintf(ou
1e340 74 2c 22 25 73 20 3a 3a 3d 22 2c 20 72 70 2d 3e  t,"%s ::=", rp->
1e350 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f  lhs->name);.  fo
1e360 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68  r(j=0; j<rp->nrh
1e370 73 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72  s; j++){.    str
1e380 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
1e390 20 72 70 2d 3e 72 68 73 5b 6a 5d 3b 0a 20 20 20   rp->rhs[j];.   
1e3a0 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21 3d 4d   if( sp->type!=M
1e3b0 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
1e3c0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1e3d0 74 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d  t," %s", sp->nam
1e3e0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
1e3f0 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
1e400 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1e410 25 73 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b  %s", sp->subsym[
1e420 30 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  0]->name);.     
1e430 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 73 70 2d 3e   for(k=1; k<sp->
1e440 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20  nsubsym; k++){. 
1e450 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1e460 75 74 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62  ut,"|%s",sp->sub
1e470 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  sym[k]->name);. 
1e480 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e490 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  .}.../* Generate
1e4a0 20 43 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66   C source code f
1e4b0 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  or the parser */
1e4c0 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c  .void ReportTabl
1e4d0 65 28 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  e(.  struct lemo
1e4e0 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 6d  n *lemp,.  int m
1e4f0 68 66 6c 61 67 20 20 20 20 20 2f 2a 20 4f 75 74  hflag     /* Out
1e500 70 75 74 20 69 6e 20 6d 61 6b 65 68 65 61 64 65  put in makeheade
1e510 72 73 20 66 6f 72 6d 61 74 20 69 66 20 74 72 75  rs format if tru
1e520 65 20 2a 2f 0a 29 7b 0a 20 20 46 49 4c 45 20 2a  e */.){.  FILE *
1e530 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72  out, *in;.  char
1e540 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b   line[LINESIZE];
1e550 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e 6f 3b 0a  .  int  lineno;.
1e560 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
1e570 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63  stp;.  struct ac
1e580 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74 72 75  tion *ap;.  stru
1e590 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73  ct rule *rp;.  s
1e5a0 74 72 75 63 74 20 61 63 74 74 61 62 20 2a 70 41  truct acttab *pA
1e5b0 63 74 74 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  cttab;.  int i, 
1e5c0 6a 2c 20 6e 2c 20 73 7a 3b 0a 20 20 69 6e 74 20  j, n, sz;.  int 
1e5d0 73 7a 41 63 74 69 6f 6e 54 79 70 65 3b 20 20 20  szActionType;   
1e5e0 20 20 2f 2a 20 73 69 7a 65 6f 66 28 59 59 41 43    /* sizeof(YYAC
1e5f0 54 49 4f 4e 54 59 50 45 29 20 2a 2f 0a 20 20 69  TIONTYPE) */.  i
1e600 6e 74 20 73 7a 43 6f 64 65 54 79 70 65 3b 20 20  nt szCodeType;  
1e610 20 20 20 20 20 2f 2a 20 73 69 7a 65 6f 66 28 59       /* sizeof(Y
1e620 59 43 4f 44 45 54 59 50 45 29 20 20 20 2a 2f 0a  YCODETYPE)   */.
1e630 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61    const char *na
1e640 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b 6e 4f  me;.  int mnTknO
1e650 66 73 74 2c 20 6d 78 54 6b 6e 4f 66 73 74 3b 0a  fst, mxTknOfst;.
1e660 20 20 69 6e 74 20 6d 6e 4e 74 4f 66 73 74 2c 20    int mnNtOfst, 
1e670 6d 78 4e 74 4f 66 73 74 3b 0a 20 20 73 74 72 75  mxNtOfst;.  stru
1e680 63 74 20 61 78 73 65 74 20 2a 61 78 3b 0a 0a 20  ct axset *ax;.. 
1e690 20 69 6e 20 3d 20 74 70 6c 74 5f 6f 70 65 6e 28   in = tplt_open(
1e6a0 6c 65 6d 70 29 3b 0a 20 20 69 66 28 20 69 6e 3d  lemp);.  if( in=
1e6b0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f  =0 ) return;.  o
1e6c0 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c  ut = file_open(l
1e6d0 65 6d 70 2c 22 2e 63 22 2c 22 77 62 22 29 3b 0a  emp,".c","wb");.
1e6e0 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a    if( out==0 ){.
1e6f0 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
1e700 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1e710 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20    lineno = 1;.  
1e720 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1e730 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1e740 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1e750 72 61 74 65 20 74 68 65 20 69 6e 63 6c 75 64 65  rate the include
1e760 20 63 6f 64 65 2c 20 69 66 20 61 6e 79 20 2a 2f   code, if any */
1e770 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
1e780 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63  t,lemp,lemp->inc
1e790 6c 75 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lude,&lineno);. 
1e7a0 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
1e7b0 20 20 20 63 68 61 72 20 2a 69 6e 63 4e 61 6d 65     char *incName
1e7c0 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65   = file_makename
1e7d0 28 6c 65 6d 70 2c 20 22 2e 68 22 29 3b 0a 20 20  (lemp, ".h");.  
1e7e0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1e7f0 69 6e 63 6c 75 64 65 20 5c 22 25 73 5c 22 5c 6e  include \"%s\"\n
1e800 22 2c 20 69 6e 63 4e 61 6d 65 29 3b 20 6c 69 6e  ", incName); lin
1e810 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28  eno++;.    free(
1e820 69 6e 63 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  incName);.  }.  
1e830 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1e840 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1e850 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1e860 72 61 74 65 20 23 64 65 66 69 6e 65 73 20 66 6f  rate #defines fo
1e870 72 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 2a 2f 0a  r all tokens */.
1e880 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a    if( mhflag ){.
1e890 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1e8a0 70 72 65 66 69 78 3b 0a 20 20 20 20 66 70 72 69  prefix;.    fpri
1e8b0 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54  ntf(out,"#if INT
1e8c0 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65  ERFACE\n"); line
1e8d0 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6c 65  no++;.    if( le
1e8e0 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20  mp->tokenprefix 
1e8f0 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d  ) prefix = lemp-
1e900 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20  >tokenprefix;.  
1e910 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
1e920 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
1e930 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69   = "";.    for(i
1e940 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =1; i<lemp->nter
1e950 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  minal; i++){.   
1e960 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1e970 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20  #define %s%-30s 
1e980 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65  %2d\n",prefix,le
1e990 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
1e9a0 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 6c  name,i);.      l
1e9b0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ineno++;.    }. 
1e9c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1e9d0 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65  #endif\n"); line
1e9e0 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  no++;.  }.  tplt
1e9f0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1ea00 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1ea10 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1ea20 20 74 68 65 20 64 65 66 69 6e 65 73 20 2a 2f 0a   the defines */.
1ea30 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1ea40 64 65 66 69 6e 65 20 59 59 43 4f 44 45 54 59 50  define YYCODETYP
1ea50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e  E %s\n",.    min
1ea60 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30  imum_size_type(0
1ea70 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b  , lemp->nsymbol+
1ea80 31 2c 20 26 73 7a 43 6f 64 65 54 79 70 65 29 29  1, &szCodeType))
1ea90 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1eaa0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1eab0 6e 65 20 59 59 4e 4f 43 4f 44 45 20 25 64 5c 6e  ne YYNOCODE %d\n
1eac0 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b  ",lemp->nsymbol+
1ead0 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  1);  lineno++;. 
1eae0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1eaf0 65 66 69 6e 65 20 59 59 41 43 54 49 4f 4e 54 59  efine YYACTIONTY
1eb00 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69  PE %s\n",.    mi
1eb10 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28  nimum_size_type(
1eb20 30 2c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 6c  0,lemp->nstate+l
1eb30 65 6d 70 2d 3e 6e 72 75 6c 65 2a 32 2b 35 2c 26  emp->nrule*2+5,&
1eb40 73 7a 41 63 74 69 6f 6e 54 79 70 65 29 29 3b 20  szActionType)); 
1eb50 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20  lineno++;.  if( 
1eb60 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 20 29  lemp->wildcard )
1eb70 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1eb80 74 2c 22 23 64 65 66 69 6e 65 20 59 59 57 49 4c  t,"#define YYWIL
1eb90 44 43 41 52 44 20 25 64 5c 6e 22 2c 0a 20 20 20  DCARD %d\n",.   
1eba0 20 20 20 20 6c 65 6d 70 2d 3e 77 69 6c 64 63 61      lemp->wildca
1ebb0 72 64 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65  rd->index); line
1ebc0 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 70 72 69 6e  no++;.  }.  prin
1ebd0 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75  t_stack_union(ou
1ebe0 74 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 2c 6d  t,lemp,&lineno,m
1ebf0 68 66 6c 61 67 29 3b 0a 20 20 66 70 72 69 6e 74  hflag);.  fprint
1ec00 66 28 6f 75 74 2c 20 22 23 69 66 6e 64 65 66 20  f(out, "#ifndef 
1ec10 59 59 53 54 41 43 4b 44 45 50 54 48 5c 6e 22 29  YYSTACKDEPTH\n")
1ec20 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66  ; lineno++;.  if
1ec30 28 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a  ( lemp->stacksiz
1ec40 65 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  e ){.    fprintf
1ec50 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1ec60 53 54 41 43 4b 44 45 50 54 48 20 25 73 5c 6e 22  STACKDEPTH %s\n"
1ec70 2c 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65  ,lemp->stacksize
1ec80 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1ec90 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
1eca0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1ecb0 59 59 53 54 41 43 4b 44 45 50 54 48 20 31 30 30  YYSTACKDEPTH 100
1ecc0 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  \n");  lineno++;
1ecd0 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
1ece0 75 74 2c 20 22 23 65 6e 64 69 66 5c 6e 22 29 3b  ut, "#endif\n");
1ecf0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28   lineno++;.  if(
1ed00 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 66   mhflag ){.    f
1ed10 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20  printf(out,"#if 
1ed20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c  INTERFACE\n"); l
1ed30 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 6e  ineno++;.  }.  n
1ed40 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65  ame = lemp->name
1ed50 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20   ? lemp->name : 
1ed60 22 50 61 72 73 65 22 3b 0a 20 20 69 66 28 20 6c  "Parse";.  if( l
1ed70 65 6d 70 2d 3e 61 72 67 20 26 26 20 6c 65 6d 70  emp->arg && lemp
1ed80 2d 3e 61 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20  ->arg[0] ){.    
1ed90 69 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  i = lemonStrlen(
1eda0 6c 65 6d 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20  lemp->arg);.    
1edb0 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 49  while( i>=1 && I
1edc0 53 53 50 41 43 45 28 6c 65 6d 70 2d 3e 61 72 67  SSPACE(lemp->arg
1edd0 5b 69 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20 20  [i-1]) ) i--;.  
1ede0 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26    while( i>=1 &&
1edf0 20 28 49 53 41 4c 4e 55 4d 28 6c 65 6d 70 2d 3e   (ISALNUM(lemp->
1ee00 61 72 67 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d  arg[i-1]) || lem
1ee10 70 2d 3e 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27  p->arg[i-1]=='_'
1ee20 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70 72  ) ) i--;.    fpr
1ee30 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1ee40 65 20 25 73 41 52 47 5f 53 44 45 43 4c 20 25 73  e %sARG_SDECL %s
1ee50 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e  ;\n",name,lemp->
1ee60 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  arg);  lineno++;
1ee70 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1ee80 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1ee90 50 44 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d  PDECL ,%s\n",nam
1eea0 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c  e,lemp->arg);  l
1eeb0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
1eec0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1eed0 65 20 25 73 41 52 47 5f 46 45 54 43 48 20 25 73  e %sARG_FETCH %s
1eee0 20 3d 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73   = yypParser->%s
1eef0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ef00 20 20 20 20 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d        name,lemp-
1ef10 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b  >arg,&lemp->arg[
1ef20 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i]);  lineno++;.
1ef30 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1ef40 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53  "#define %sARG_S
1ef50 54 4f 52 45 20 79 79 70 50 61 72 73 65 72 2d 3e  TORE yypParser->
1ef60 25 73 20 3d 20 25 73 5c 6e 22 2c 0a 20 20 20 20  %s = %s\n",.    
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d               nam
1ef80 65 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c  e,&lemp->arg[i],
1ef90 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20  &lemp->arg[i]); 
1efa0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c   lineno++;.  }el
1efb0 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
1efc0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1efd0 52 47 5f 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65  RG_SDECL\n",name
1efe0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1eff0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1f000 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45  define %sARG_PDE
1f010 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69  CL\n",name);  li
1f020 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1f030 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1f040 20 25 73 41 52 47 5f 46 45 54 43 48 5c 6e 22 2c   %sARG_FETCH\n",
1f050 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
1f060 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1f070 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1f080 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20  STORE\n",name); 
1f090 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1f0a0 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20  if( mhflag ){.  
1f0b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1f0c0 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e  endif\n"); linen
1f0d0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  o++;.  }.  if( l
1f0e0 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65  emp->errsym->use
1f0f0 43 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  Cnt ){.    fprin
1f100 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1f110 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20 25 64  YYERRORSYMBOL %d
1f120 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  \n",lemp->errsym
1f130 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f  ->index); lineno
1f140 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1f150 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45  out,"#define YYE
1f160 52 52 53 59 4d 44 54 20 79 79 25 64 5c 6e 22 2c  RRSYMDT yy%d\n",
1f170 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74  lemp->errsym->dt
1f180 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  num); lineno++;.
1f190 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e    }.  if( lemp->
1f1a0 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a  has_fallback ){.
1f1b0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1f1c0 22 23 64 65 66 69 6e 65 20 59 59 46 41 4c 4c 42  "#define YYFALLB
1f1d0 41 43 4b 20 31 5c 6e 22 29 3b 20 20 6c 69 6e 65  ACK 1\n");  line
1f1e0 6e 6f 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  no++;.  }..  /* 
1f1f0 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74 69  Compute the acti
1f200 6f 6e 20 74 61 62 6c 65 2c 20 62 75 74 20 64 6f  on table, but do
1f210 20 6e 6f 74 20 6f 75 74 70 75 74 20 69 74 20 79   not output it y
1f220 65 74 2e 20 20 54 68 65 20 61 63 74 69 6f 6e 0a  et.  The action.
1f230 20 20 2a 2a 20 74 61 62 6c 65 20 6d 75 73 74 20    ** table must 
1f240 62 65 20 63 6f 6d 70 75 74 65 64 20 62 65 66 6f  be computed befo
1f250 72 65 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  re generating th
1f260 65 20 59 59 4e 53 54 41 54 45 20 6d 61 63 72 6f  e YYNSTATE macro
1f270 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 77 65   because.  ** we
1f280 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 68 6f   need to know ho
1f290 77 20 6d 61 6e 79 20 73 74 61 74 65 73 20 63 61  w many states ca
1f2a0 6e 20 62 65 20 65 6c 69 6d 69 6e 61 74 65 64 2e  n be eliminated.
1f2b0 0a 20 20 2a 2f 0a 20 20 61 78 20 3d 20 28 73 74  .  */.  ax = (st
1f2c0 72 75 63 74 20 61 78 73 65 74 20 2a 29 20 63 61  ruct axset *) ca
1f2d0 6c 6c 6f 63 28 6c 65 6d 70 2d 3e 6e 78 73 74 61  lloc(lemp->nxsta
1f2e0 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b  te*2, sizeof(ax[
1f2f0 30 5d 29 29 3b 0a 20 20 69 66 28 20 61 78 3d 3d  0]));.  if( ax==
1f300 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
1f310 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20  (stderr,"malloc 
1f320 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20  failed\n");.    
1f330 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66  exit(1);.  }.  f
1f340 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1f350 6e 78 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  nxstate; i++){. 
1f360 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
1f370 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 61 78  orted[i];.    ax
1f380 5b 69 2a 32 5d 2e 73 74 70 20 3d 20 73 74 70 3b  [i*2].stp = stp;
1f390 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 69 73 54  .    ax[i*2].isT
1f3a0 6b 6e 20 3d 20 31 3b 0a 20 20 20 20 61 78 5b 69  kn = 1;.    ax[i
1f3b0 2a 32 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74  *2].nAction = st
1f3c0 70 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20  p->nTknAct;.    
1f3d0 61 78 5b 69 2a 32 2b 31 5d 2e 73 74 70 20 3d 20  ax[i*2+1].stp = 
1f3e0 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b  stp;.    ax[i*2+
1f3f0 31 5d 2e 69 73 54 6b 6e 20 3d 20 30 3b 0a 20 20  1].isTkn = 0;.  
1f400 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74    ax[i*2+1].nAct
1f410 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63  ion = stp->nNtAc
1f420 74 3b 0a 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66  t;.  }.  mxTknOf
1f430 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d  st = mnTknOfst =
1f440 20 30 3b 0a 20 20 6d 78 4e 74 4f 66 73 74 20 3d   0;.  mxNtOfst =
1f450 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 30 3b 0a 20   mnNtOfst = 0;. 
1f460 20 2f 2a 20 49 6e 20 61 6e 20 65 66 66 6f 72 74   /* In an effort
1f470 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
1f480 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 73 69   action table si
1f490 7a 65 2c 20 75 73 65 20 74 68 65 20 68 65 75 72  ze, use the heur
1f4a0 69 73 74 69 63 0a 20 20 2a 2a 20 6f 66 20 70 6c  istic.  ** of pl
1f4b0 61 63 69 6e 67 20 74 68 65 20 6c 61 72 67 65 73  acing the larges
1f4c0 74 20 61 63 74 69 6f 6e 20 73 65 74 73 20 66 69  t action sets fi
1f4d0 72 73 74 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  rst */.  for(i=0
1f4e0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  ; i<lemp->nxstat
1f4f0 65 2a 32 3b 20 69 2b 2b 29 20 61 78 5b 69 5d 2e  e*2; i++) ax[i].
1f500 69 4f 72 64 65 72 20 3d 20 69 3b 0a 20 20 71 73  iOrder = i;.  qs
1f510 6f 72 74 28 61 78 2c 20 6c 65 6d 70 2d 3e 6e 78  ort(ax, lemp->nx
1f520 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28  state*2, sizeof(
1f530 61 78 5b 30 5d 29 2c 20 61 78 73 65 74 5f 63 6f  ax[0]), axset_co
1f540 6d 70 61 72 65 29 3b 0a 20 20 70 41 63 74 74 61  mpare);.  pActta
1f550 62 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c 6f 63  b = acttab_alloc
1f560 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ();.  for(i=0; i
1f570 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2a 32  <lemp->nxstate*2
1f580 20 26 26 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f   && ax[i].nActio
1f590 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  n>0; i++){.    s
1f5a0 74 70 20 3d 20 61 78 5b 69 5d 2e 73 74 70 3b 0a  tp = ax[i].stp;.
1f5b0 20 20 20 20 69 66 28 20 61 78 5b 69 5d 2e 69 73      if( ax[i].is
1f5c0 54 6b 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  Tkn ){.      for
1f5d0 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
1f5e0 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
1f5f0 20 20 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f         int actio
1f600 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  n;.        if( a
1f610 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65  p->sp->index>=le
1f620 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20  mp->nterminal ) 
1f630 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1f640 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75    action = compu
1f650 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20  te_action(lemp, 
1f660 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ap);.        if(
1f670 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74   action<0 ) cont
1f680 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63  inue;.        ac
1f690 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74  ttab_action(pAct
1f6a0 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64  tab, ap->sp->ind
1f6b0 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20  ex, action);.   
1f6c0 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e     }.      stp->
1f6d0 69 54 6b 6e 4f 66 73 74 20 3d 20 61 63 74 74 61  iTknOfst = actta
1f6e0 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61 62  b_insert(pActtab
1f6f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  );.      if( stp
1f700 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b 6e  ->iTknOfst<mnTkn
1f710 4f 66 73 74 20 29 20 6d 6e 54 6b 6e 4f 66 73 74  Ofst ) mnTknOfst
1f720 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74   = stp->iTknOfst
1f730 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d  ;.      if( stp-
1f740 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78 54 6b 6e 4f  >iTknOfst>mxTknO
1f750 66 73 74 20 29 20 6d 78 54 6b 6e 4f 66 73 74 20  fst ) mxTknOfst 
1f760 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b  = stp->iTknOfst;
1f770 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f780 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1f790 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1f7a0 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
1f7b0 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  action;.        
1f7c0 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
1f7d0 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  x<lemp->ntermina
1f7e0 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
1f7f0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70        if( ap->sp
1f800 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e  ->index==lemp->n
1f810 73 79 6d 62 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  symbol ) continu
1f820 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f  e;.        actio
1f830 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69  n = compute_acti
1f840 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20  on(lemp, ap);.  
1f850 20 20 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e        if( action
1f860 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
1f870 20 20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63         acttab_ac
1f880 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70  tion(pActtab, ap
1f890 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74  ->sp->index, act
1f8a0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ion);.      }.  
1f8b0 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74      stp->iNtOfst
1f8c0 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74   = acttab_insert
1f8d0 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20  (pActtab);.     
1f8e0 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73   if( stp->iNtOfs
1f8f0 74 3c 6d 6e 4e 74 4f 66 73 74 20 29 20 6d 6e 4e  t<mnNtOfst ) mnN
1f900 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74  tOfst = stp->iNt
1f910 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Ofst;.      if( 
1f920 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3e 6d 78 4e  stp->iNtOfst>mxN
1f930 74 4f 66 73 74 20 29 20 6d 78 4e 74 4f 66 73 74  tOfst ) mxNtOfst
1f940 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b   = stp->iNtOfst;
1f950 0a 20 20 20 20 7d 0a 23 69 66 20 30 20 20 2f 2a  .    }.#if 0  /*
1f960 20 55 6e 63 6f 6d 6d 65 6e 74 20 66 6f 72 20 61   Uncomment for a
1f970 20 74 72 61 63 65 20 6f 66 20 68 6f 77 20 74 68   trace of how th
1f980 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61  e yy_action[] ta
1f990 62 6c 65 20 66 69 6c 6c 73 20 6f 75 74 20 2a 2f  ble fills out */
1f9a0 0a 20 20 20 20 7b 20 69 6e 74 20 6a 6a 2c 20 6e  .    { int jj, n
1f9b0 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  n;.      for(jj=
1f9c0 6e 6e 3d 30 3b 20 6a 6a 3c 70 41 63 74 74 61 62  nn=0; jj<pActtab
1f9d0 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 6a 2b 2b 29  ->nAction; jj++)
1f9e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  {.        if( pA
1f9f0 63 74 74 61 62 2d 3e 61 41 63 74 69 6f 6e 5b 6a  cttab->aAction[j
1fa00 6a 5d 2e 61 63 74 69 6f 6e 3c 30 20 29 20 6e 6e  j].action<0 ) nn
1fa10 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1fa20 20 20 70 72 69 6e 74 66 28 22 25 34 64 3a 20 53    printf("%4d: S
1fa30 74 61 74 65 20 25 33 64 20 25 73 20 6e 3a 20 25  tate %3d %s n: %
1fa40 32 64 20 73 69 7a 65 3a 20 25 35 64 20 66 72 65  2d size: %5d fre
1fa50 65 73 70 61 63 65 3a 20 25 64 5c 6e 22 2c 0a 20  espace: %d\n",. 
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 69 2c 20 73              i, s
1fa70 74 70 2d 3e 73 74 61 74 65 6e 75 6d 2c 20 61 78  tp->statenum, ax
1fa80 5b 69 5d 2e 69 73 54 6b 6e 20 3f 20 22 54 6f 6b  [i].isTkn ? "Tok
1fa90 65 6e 22 20 3a 20 22 56 61 72 20 20 22 2c 0a 20  en" : "Var  ",. 
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 61 78 5b 69              ax[i
1fab0 5d 2e 6e 41 63 74 69 6f 6e 2c 20 70 41 63 74 74  ].nAction, pActt
1fac0 61 62 2d 3e 6e 41 63 74 69 6f 6e 2c 20 6e 6e 29  ab->nAction, nn)
1fad0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1fae0 20 7d 0a 20 20 66 72 65 65 28 61 78 29 3b 0a 0a   }.  free(ax);..
1faf0 20 20 2f 2a 20 4d 61 72 6b 20 72 75 6c 65 73 20    /* Mark rules 
1fb00 74 68 61 74 20 61 72 65 20 61 63 74 75 61 6c 6c  that are actuall
1fb10 79 20 75 73 65 64 20 66 6f 72 20 72 65 64 75 63  y used for reduc
1fb20 65 20 61 63 74 69 6f 6e 73 20 61 66 74 65 72 20  e actions after 
1fb30 61 6c 6c 0a 20 20 2a 2a 20 6f 70 74 69 6d 69 7a  all.  ** optimiz
1fb40 61 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ations have been
1fb50 20 61 70 70 6c 69 65 64 0a 20 20 2a 2f 0a 20 20   applied.  */.  
1fb60 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
1fb70 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
1fb80 78 74 29 20 72 70 2d 3e 64 6f 65 73 52 65 64 75  xt) rp->doesRedu
1fb90 63 65 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45  ce = LEMON_FALSE
1fba0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
1fbb0 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 20 69 2b  emp->nxstate; i+
1fbc0 2b 29 7b 0a 20 20 20 20 66 6f 72 28 61 70 3d 6c  +){.    for(ap=l
1fbd0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e  emp->sorted[i]->
1fbe0 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
1fbf0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1fc00 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  ap->type==REDUCE
1fc10 20 7c 7c 20 61 70 2d 3e 74 79 70 65 3d 3d 53 48   || ap->type==SH
1fc20 49 46 54 52 45 44 55 43 45 20 29 7b 0a 20 20 20  IFTREDUCE ){.   
1fc30 20 20 20 20 20 61 70 2d 3e 78 2e 72 70 2d 3e 64       ap->x.rp->d
1fc40 6f 65 73 52 65 64 75 63 65 20 3d 20 31 3b 0a 20  oesReduce = 1;. 
1fc50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1fc60 0a 0a 20 20 2f 2a 20 46 69 6e 69 73 68 20 72 65  ..  /* Finish re
1fc70 6e 64 65 72 69 6e 67 20 74 68 65 20 63 6f 6e 73  ndering the cons
1fc80 74 61 6e 74 73 20 6e 6f 77 20 74 68 61 74 20 74  tants now that t
1fc90 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  he action table 
1fca0 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f  has.  ** been co
1fcb0 6d 70 75 74 65 64 20 2a 2f 0a 20 20 66 70 72 69  mputed */.  fpri
1fcc0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1fcd0 20 59 59 4e 53 54 41 54 45 20 20 20 20 20 20 20   YYNSTATE       
1fce0 20 20 20 20 20 20 25 64 5c 6e 22 2c 6c 65 6d 70        %d\n",lemp
1fcf0 2d 3e 6e 78 73 74 61 74 65 29 3b 20 20 6c 69 6e  ->nxstate);  lin
1fd00 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1fd10 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1fd20 4e 52 55 4c 45 20 20 20 20 20 20 20 20 20 20 20  NRULE           
1fd30 20 20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e     %d\n",lemp->n
1fd40 72 75 6c 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  rule);  lineno++
1fd50 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1fd60 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 41 58 5f  "#define YY_MAX_
1fd70 53 48 49 46 54 20 20 20 20 20 20 20 20 20 25 64  SHIFT         %d
1fd80 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  \n",lemp->nxstat
1fd90 65 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  e-1); lineno++;.
1fda0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1fdb0 64 65 66 69 6e 65 20 59 59 5f 4d 49 4e 5f 53 48  define YY_MIN_SH
1fdc0 49 46 54 52 45 44 55 43 45 20 20 20 25 64 5c 6e  IFTREDUCE   %d\n
1fdd0 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 29 3b  ",lemp->nstate);
1fde0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 20 3d   lineno++;.  i =
1fdf0 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20   lemp->nstate + 
1fe00 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 66  lemp->nrule;.  f
1fe10 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1fe20 69 6e 65 20 59 59 5f 4d 41 58 5f 53 48 49 46 54  ine YY_MAX_SHIFT
1fe30 52 45 44 55 43 45 20 20 20 25 64 5c 6e 22 2c 20  REDUCE   %d\n", 
1fe40 69 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i-1); lineno++;.
1fe50 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1fe60 64 65 66 69 6e 65 20 59 59 5f 4d 49 4e 5f 52 45  define YY_MIN_RE
1fe70 44 55 43 45 20 20 20 20 20 20 20 20 25 64 5c 6e  DUCE        %d\n
1fe80 22 2c 20 69 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ", i); lineno++;
1fe90 0a 20 20 69 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74  .  i = lemp->nst
1fea0 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  ate + lemp->nrul
1feb0 65 2a 32 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  e*2;.  fprintf(o
1fec0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d  ut,"#define YY_M
1fed0 41 58 5f 52 45 44 55 43 45 20 20 20 20 20 20 20  AX_REDUCE       
1fee0 20 25 64 5c 6e 22 2c 20 69 2d 31 29 3b 20 6c 69   %d\n", i-1); li
1fef0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1ff00 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1ff10 59 5f 45 52 52 4f 52 5f 41 43 54 49 4f 4e 20 20  Y_ERROR_ACTION  
1ff20 20 20 20 20 25 64 5c 6e 22 2c 20 69 29 3b 20 6c      %d\n", i); l
1ff30 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1ff40 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1ff50 59 59 5f 41 43 43 45 50 54 5f 41 43 54 49 4f 4e  YY_ACCEPT_ACTION
1ff60 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 2b 31 29       %d\n", i+1)
1ff70 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1ff80 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1ff90 6e 65 20 59 59 5f 4e 4f 5f 41 43 54 49 4f 4e 20  ne YY_NO_ACTION 
1ffa0 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
1ffb0 2b 32 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  +2); lineno++;. 
1ffc0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1ffd0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1ffe0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77  neno);..  /* Now
1fff0 20 6f 75 74 70 75 74 20 74 68 65 20 61 63 74 69   output the acti
20000 6f 6e 20 74 61 62 6c 65 20 61 6e 64 20 69 74 73  on table and its
20010 20 61 73 73 6f 63 69 61 74 65 73 3a 0a 20 20 2a   associates:.  *
20020 2a 0a 20 20 2a 2a 20 20 79 79 5f 61 63 74 69 6f  *.  **  yy_actio
20030 6e 5b 5d 20 20 20 20 20 20 20 20 41 20 73 69 6e  n[]        A sin
20040 67 6c 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  gle table contai
20050 6e 69 6e 67 20 61 6c 6c 20 61 63 74 69 6f 6e 73  ning all actions
20060 2e 0a 20 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61  ..  **  yy_looka
20070 68 65 61 64 5b 5d 20 20 20 20 20 41 20 74 61 62  head[]     A tab
20080 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
20090 65 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20  e lookahead for 
200a0 65 61 63 68 20 65 6e 74 72 79 20 69 6e 0a 20 20  each entry in.  
200b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
200c0 20 20 20 20 20 20 20 79 79 5f 61 63 74 69 6f 6e         yy_action
200d0 2e 20 20 55 73 65 64 20 74 6f 20 64 65 74 65 63  .  Used to detec
200e0 74 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  t hash collision
200f0 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 73 68 69 66  s..  **  yy_shif
20100 74 5f 6f 66 73 74 5b 5d 20 20 20 20 46 6f 72 20  t_ofst[]    For 
20110 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65 20  each state, the 
20120 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61  offset into yy_a
20130 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20  ction for.  **  
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20150 20 20 20 73 68 69 66 74 69 6e 67 20 74 65 72 6d     shifting term
20160 69 6e 61 6c 73 2e 0a 20 20 2a 2a 20 20 79 79 5f  inals..  **  yy_
20170 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 20 20  reduce_ofst[]   
20180 46 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c 20  For each state, 
20190 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
201a0 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20  yy_action for.  
201b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
201c0 20 20 20 20 20 20 20 73 68 69 66 74 69 6e 67 20         shifting 
201d0 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 61 66  non-terminals af
201e0 74 65 72 20 61 20 72 65 64 75 63 65 2e 0a 20 20  ter a reduce..  
201f0 2a 2a 20 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d  **  yy_default[]
20200 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 20 61         Default a
20210 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 73  ction for each s
20220 74 61 74 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  tate..  */..  /*
20230 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 61   Output the yy_a
20240 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20  ction table */. 
20250 20 6c 65 6d 70 2d 3e 6e 61 63 74 69 6f 6e 74 61   lemp->nactionta
20260 62 20 3d 20 6e 20 3d 20 61 63 74 74 61 62 5f 73  b = n = acttab_s
20270 69 7a 65 28 70 41 63 74 74 61 62 29 3b 0a 20 20  ize(pActtab);.  
20280 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20  lemp->tablesize 
20290 2b 3d 20 6e 2a 73 7a 41 63 74 69 6f 6e 54 79 70  += n*szActionTyp
202a0 65 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  e;.  fprintf(out
202b0 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 41 43 54  ,"#define YY_ACT
202c0 54 41 42 5f 43 4f 55 4e 54 20 28 25 64 29 5c 6e  TAB_COUNT (%d)\n
202d0 22 2c 20 6e 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ", n); lineno++;
202e0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
202f0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59 41  static const YYA
20300 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 61 63 74  CTIONTYPE yy_act
20310 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c  ion[] = {\n"); l
20320 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69  ineno++;.  for(i
20330 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
20340 0a 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 20  .    int action 
20350 3d 20 61 63 74 74 61 62 5f 79 79 61 63 74 69 6f  = acttab_yyactio
20360 6e 28 70 41 63 74 74 61 62 2c 20 69 29 3b 0a 20  n(pActtab, i);. 
20370 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20     if( action<0 
20380 29 20 61 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d  ) action = lemp-
20390 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e  >nstate + lemp->
203a0 6e 72 75 6c 65 20 2b 20 32 3b 0a 20 20 20 20 69  nrule + 2;.    i
203b0 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74  f( j==0 ) fprint
203c0 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a  f(out," /* %5d *
203d0 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72  / ", i);.    fpr
203e0 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c  intf(out, " %4d,
203f0 22 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20  ", action);.    
20400 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
20410 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
20420 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
20430 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
20440 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
20450 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
20460 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
20470 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
20480 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f  ineno++;..  /* O
20490 75 74 70 75 74 20 74 68 65 20 79 79 5f 6c 6f 6f  utput the yy_loo
204a0 6b 61 68 65 61 64 20 74 61 62 6c 65 20 2a 2f 0a  kahead table */.
204b0 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a    lemp->tablesiz
204c0 65 20 2b 3d 20 6e 2a 73 7a 43 6f 64 65 54 79 70  e += n*szCodeTyp
204d0 65 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  e;.  fprintf(out
204e0 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59  ,"static const Y
204f0 59 43 4f 44 45 54 59 50 45 20 79 79 5f 6c 6f 6f  YCODETYPE yy_loo
20500 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e 22 29  kahead[] = {\n")
20510 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
20520 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
20530 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61 20 3d  +){.    int la =
20540 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61 68   acttab_yylookah
20550 65 61 64 28 70 41 63 74 74 61 62 2c 20 69 29 3b  ead(pActtab, i);
20560 0a 20 20 20 20 69 66 28 20 6c 61 3c 30 20 29 20  .    if( la<0 ) 
20570 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  la = lemp->nsymb
20580 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30  ol;.    if( j==0
20590 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
205a0 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
205b0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
205c0 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61 29 3b  t, " %4d,", la);
205d0 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
205e0 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
205f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
20600 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
20610 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
20620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
20630 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
20640 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
20650 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
20660 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79   /* Output the y
20670 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 74  y_shift_ofst[] t
20680 61 62 6c 65 20 2a 2f 0a 20 20 6e 20 3d 20 6c 65  able */.  n = le
20690 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 0a 20 20 77  mp->nxstate;.  w
206a0 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d  hile( n>0 && lem
206b0 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e  p->sorted[n-1]->
206c0 69 54 6b 6e 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46  iTknOfst==NO_OFF
206d0 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72  SET ) n--;.  fpr
206e0 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
206f0 6e 65 20 59 59 5f 53 48 49 46 54 5f 55 53 45 5f  ne YY_SHIFT_USE_
20700 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6c 65  DFLT (%d)\n", le
20710 6d 70 2d 3e 6e 61 63 74 69 6f 6e 74 61 62 29 3b  mp->nactiontab);
20720 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
20730 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
20740 6e 65 20 59 59 5f 53 48 49 46 54 5f 43 4f 55 4e  ne YY_SHIFT_COUN
20750 54 20 20 20 20 28 25 64 29 5c 6e 22 2c 20 6e 2d  T    (%d)\n", n-
20760 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  1); lineno++;.  
20770 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
20780 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d  efine YY_SHIFT_M
20790 49 4e 20 20 20 20 20 20 28 25 64 29 5c 6e 22 2c  IN      (%d)\n",
207a0 20 6d 6e 54 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e   mnTknOfst); lin
207b0 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
207c0 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
207d0 59 5f 53 48 49 46 54 5f 4d 41 58 20 20 20 20 20  Y_SHIFT_MAX     
207e0 20 28 25 64 29 5c 6e 22 2c 20 6d 78 54 6b 6e 4f   (%d)\n", mxTknO
207f0 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  fst); lineno++;.
20800 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
20810 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73 20  static const %s 
20820 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20  yy_shift_ofst[] 
20830 3d 20 7b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6d  = {\n",.       m
20840 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65  inimum_size_type
20850 28 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6c 65 6d 70  (mnTknOfst, lemp
20860 2d 3e 6e 74 65 72 6d 69 6e 61 6c 2b 6c 65 6d 70  ->nterminal+lemp
20870 2d 3e 6e 61 63 74 69 6f 6e 74 61 62 2c 20 26 73  ->nactiontab, &s
20880 7a 29 29 3b 0a 20 20 20 20 20 20 20 6c 69 6e 65  z));.       line
20890 6e 6f 2b 2b 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61  no++;.  lemp->ta
208a0 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 3b  blesize += n*sz;
208b0 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
208c0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
208d0 20 6f 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d   ofst;.    stp =
208e0 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
208f0 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70  ;.    ofst = stp
20900 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20  ->iTknOfst;.    
20910 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46  if( ofst==NO_OFF
20920 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6c 65 6d  SET ) ofst = lem
20930 70 2d 3e 6e 61 63 74 69 6f 6e 74 61 62 3b 0a 20  p->nactiontab;. 
20940 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70     if( j==0 ) fp
20950 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
20960 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20  5d */ ", i);.   
20970 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
20980 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20  %4d,", ofst);.  
20990 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d    if( j==9 || i=
209a0 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70  =n-1 ){.      fp
209b0 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
209c0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
209d0 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c    j = 0;.    }el
209e0 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  se{.      j++;. 
209f0 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e     }.  }.  fprin
20a00 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b  tf(out, "};\n");
20a10 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a   lineno++;..  /*
20a20 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 72   Output the yy_r
20a30 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 74 61 62  educe_ofst[] tab
20a40 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  le */.  fprintf(
20a50 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
20a60 5f 52 45 44 55 43 45 5f 55 53 45 5f 44 46 4c 54  _REDUCE_USE_DFLT
20a70 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66   (%d)\n", mnNtOf
20a80 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  st-1); lineno++;
20a90 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73  .  n = lemp->nxs
20aa0 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e  tate;.  while( n
20ab0 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74  >0 && lemp->sort
20ac0 65 64 5b 6e 2d 31 5d 2d 3e 69 4e 74 4f 66 73 74  ed[n-1]->iNtOfst
20ad0 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e 2d  ==NO_OFFSET ) n-
20ae0 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  -;.  fprintf(out
20af0 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45  , "#define YY_RE
20b00 44 55 43 45 5f 43 4f 55 4e 54 20 28 25 64 29 5c  DUCE_COUNT (%d)\
20b10 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f  n", n-1); lineno
20b20 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
20b30 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52  t, "#define YY_R
20b40 45 44 55 43 45 5f 4d 49 4e 20 20 20 28 25 64 29  EDUCE_MIN   (%d)
20b50 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74 29 3b 20  \n", mnNtOfst); 
20b60 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
20b70 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
20b80 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 41 58 20  e YY_REDUCE_MAX 
20b90 20 20 28 25 64 29 5c 6e 22 2c 20 6d 78 4e 74 4f    (%d)\n", mxNtO
20ba0 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  fst); lineno++;.
20bb0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
20bc0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73 20  static const %s 
20bd0 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d  yy_reduce_ofst[]
20be0 20 3d 20 7b 5c 6e 22 2c 0a 20 20 20 20 20 20 20   = {\n",.       
20bf0 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f     minimum_size_
20c00 74 79 70 65 28 6d 6e 4e 74 4f 66 73 74 2d 31 2c  type(mnNtOfst-1,
20c10 20 6d 78 4e 74 4f 66 73 74 2c 20 26 73 7a 29 29   mxNtOfst, &sz))
20c20 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6c 65  ; lineno++;.  le
20c30 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d  mp->tablesize +=
20c40 20 6e 2a 73 7a 3b 0a 20 20 66 6f 72 28 69 3d 6a   n*sz;.  for(i=j
20c50 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
20c60 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20     int ofst;.   
20c70 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
20c80 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74  ted[i];.    ofst
20c90 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b   = stp->iNtOfst;
20ca0 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e  .    if( ofst==N
20cb0 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20  O_OFFSET ) ofst 
20cc0 3d 20 6d 6e 4e 74 4f 66 73 74 20 2d 20 31 3b 0a  = mnNtOfst - 1;.
20cd0 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
20ce0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
20cf0 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
20d00 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
20d10 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20   %4d,", ofst);. 
20d20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69     if( j==9 || i
20d30 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  ==n-1 ){.      f
20d40 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
20d50 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
20d60 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65     j = 0;.    }e
20d70 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  lse{.      j++;.
20d80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69      }.  }.  fpri
20d90 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29  ntf(out, "};\n")
20da0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f  ; lineno++;..  /
20db0 2a 20 4f 75 74 70 75 74 20 74 68 65 20 64 65 66  * Output the def
20dc0 61 75 6c 74 20 61 63 74 69 6f 6e 20 74 61 62 6c  ault action tabl
20dd0 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  e */.  fprintf(o
20de0 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73  ut, "static cons
20df0 74 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79  t YYACTIONTYPE y
20e00 79 5f 64 65 66 61 75 6c 74 5b 5d 20 3d 20 7b 5c  y_default[] = {\
20e10 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
20e20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74 61   n = lemp->nxsta
20e30 74 65 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c  te;.  lemp->tabl
20e40 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 41 63 74  esize += n*szAct
20e50 69 6f 6e 54 79 70 65 3b 0a 20 20 66 6f 72 28 69  ionType;.  for(i
20e60 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
20e70 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
20e80 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
20e90 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e  if( j==0 ) fprin
20ea0 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20  tf(out," /* %5d 
20eb0 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70  */ ", i);.    fp
20ec0 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64  rintf(out, " %4d
20ed0 2c 22 2c 20 73 74 70 2d 3e 69 44 66 6c 74 52 65  ,", stp->iDfltRe
20ee0 64 75 63 65 2b 6c 65 6d 70 2d 3e 6e 73 74 61 74  duce+lemp->nstat
20ef0 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 0a  e+lemp->nrule);.
20f00 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
20f10 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
20f20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
20f30 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
20f40 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
20f50 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
20f60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
20f70 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
20f80 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74  ); lineno++;.  t
20f90 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
20fa0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
20fb0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
20fc0 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f 66  ate the table of
20fd0 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 73   fallback tokens
20fe0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d  ..  */.  if( lem
20ff0 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20  p->has_fallback 
21000 29 7b 0a 20 20 20 20 69 6e 74 20 6d 78 20 3d 20  ){.    int mx = 
21010 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
21020 2d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  - 1;.    while( 
21030 6d 78 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 79  mx>0 && lemp->sy
21040 6d 62 6f 6c 73 5b 6d 78 5d 2d 3e 66 61 6c 6c 62  mbols[mx]->fallb
21050 61 63 6b 3d 3d 30 20 29 7b 20 6d 78 2d 2d 3b 20  ack==0 ){ mx--; 
21060 7d 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 61 62 6c  }.    lemp->tabl
21070 65 73 69 7a 65 20 2b 3d 20 28 6d 78 2b 31 29 2a  esize += (mx+1)*
21080 73 7a 43 6f 64 65 54 79 70 65 3b 0a 20 20 20 20  szCodeType;.    
21090 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 3b 20  for(i=0; i<=mx; 
210a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
210b0 63 74 20 73 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c  ct symbol *p = l
210c0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
210d0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 61  .      if( p->fa
210e0 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  llback==0 ){.   
210f0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
21100 2c 20 22 20 20 20 20 30 2c 20 20 2f 2a 20 25 31  , "    0,  /* %1
21110 30 73 20 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f  0s => nothing */
21120 5c 6e 22 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20  \n", p->name);. 
21130 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21140 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
21150 20 22 20 20 25 33 64 2c 20 20 2f 2a 20 25 31 30   "  %3d,  /* %10
21160 73 20 3d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20 70  s => %s */\n", p
21170 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65  ->fallback->inde
21180 78 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  x,.          p->
21190 6e 61 6d 65 2c 20 70 2d 3e 66 61 6c 6c 62 61 63  name, p->fallbac
211a0 6b 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  k->name);.      
211b0 7d 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b  }.      lineno++
211c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70  ;.    }.  }.  tp
211d0 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
211e0 6d 65 2c 20 69 6e 2c 20 6f 75 74 2c 20 26 6c 69  me, in, out, &li
211f0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
21200 65 72 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f  erate a table co
21210 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 79 6d  ntaining the sym
21220 62 6f 6c 69 63 20 6e 61 6d 65 20 6f 66 20 65 76  bolic name of ev
21230 65 72 79 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a  ery symbol.  */.
21240 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
21250 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
21260 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69  {.    lemon_spri
21270 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25 73 5c 22  ntf(line,"\"%s\"
21280 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ,",lemp->symbols
21290 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [i]->name);.    
212a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25  fprintf(out,"  %
212b0 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a 20 20 20  -15s",line);.   
212c0 20 69 66 28 20 28 69 26 33 29 3d 3d 33 20 29 7b   if( (i&3)==3 ){
212d0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e   fprintf(out,"\n
212e0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a  "); lineno++; }.
212f0 20 20 7d 0a 20 20 69 66 28 20 28 69 26 33 29 21    }.  if( (i&3)!
21300 3d 30 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75  =0 ){ fprintf(ou
21310 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  t,"\n"); lineno+
21320 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  +; }.  tplt_xfer
21330 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
21340 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
21350 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74 61  /* Generate a ta
21360 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ble containing a
21370 20 74 65 78 74 20 73 74 72 69 6e 67 20 74 68 61   text string tha
21380 74 20 64 65 73 63 72 69 62 65 73 20 65 76 65 72  t describes ever
21390 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69 6e 20 74  y.  ** rule in t
213a0 68 65 20 72 75 6c 65 20 73 65 74 20 6f 66 20 74  he rule set of t
213b0 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 54 68 69  he grammar.  Thi
213c0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
213d0 20 75 73 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20   used.  ** when 
213e0 74 72 61 63 69 6e 67 20 52 45 44 55 43 45 20 61  tracing REDUCE a
213f0 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  ctions..  */.  f
21400 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d  or(i=0, rp=lemp-
21410 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
21420 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  ->next, i++){.  
21430 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e 69 52    assert( rp->iR
21440 75 6c 65 3d 3d 69 20 29 3b 0a 20 20 20 20 66 70  ule==i );.    fp
21450 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
21460 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29 3b 0a 20  3d */ \"", i);. 
21470 20 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74     writeRuleText
21480 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66  (out, rp);.    f
21490 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 2c 5c  printf(out,"\",\
214a0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
214b0 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
214c0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
214d0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
214e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
214f0 68 69 63 68 20 65 78 65 63 75 74 65 73 20 65 76  hich executes ev
21500 65 72 79 20 74 69 6d 65 20 61 20 73 79 6d 62 6f  ery time a symbo
21510 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d  l is popped from
21520 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 20  .  ** the stack 
21530 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
21540 20 65 72 72 6f 72 73 20 6f 72 20 77 68 69 6c 65   errors or while
21550 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68 65 20   destroying the 
21560 70 61 72 73 65 72 2e 0a 20 20 2a 2a 20 28 49 6e  parser..  ** (In
21570 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 67 65   other words, ge
21580 6e 65 72 61 74 65 20 74 68 65 20 25 64 65 73 74  nerate the %dest
21590 72 75 63 74 6f 72 20 61 63 74 69 6f 6e 73 29 0a  ructor actions).
215a0 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d    */.  if( lemp-
215b0 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a 20 20  >tokendest ){.  
215c0 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a    int once = 1;.
215d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c      for(i=0; i<l
215e0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
215f0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
21600 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65   symbol *sp = le
21610 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
21620 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20        if( sp==0 
21630 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54 45 52  || sp->type!=TER
21640 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65  MINAL ) continue
21650 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
21660 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
21670 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 20 20  ntf(out, "      
21680 2f 2a 20 54 45 52 4d 49 4e 41 4c 20 44 65 73 74  /* TERMINAL Dest
21690 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20 6c  ructor */\n"); l
216a0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
216b0 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20   once = 0;.     
216c0 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
216d0 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25  (out,"    case %
216e0 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20  d: /* %s */\n", 
216f0 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e  sp->index, sp->n
21700 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
21710 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
21720 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
21730 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62  ol && lemp->symb
21740 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21 3d 54 45  ols[i]->type!=TE
21750 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20  RMINAL; i++);.  
21760 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73    if( i<lemp->ns
21770 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 65  ymbol ){.      e
21780 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  mit_destructor_c
21790 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79  ode(out,lemp->sy
217a0 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c  mbols[i],lemp,&l
217b0 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70  ineno);.      fp
217c0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
217d0 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
217e0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  eno++;.    }.  }
217f0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72  .  if( lemp->var
21800 64 65 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  dest ){.    stru
21810 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66 6c 74 5f  ct symbol *dflt_
21820 73 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  sp = 0;.    int 
21830 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 66 6f  once = 1;.    fo
21840 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
21850 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
21860 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
21870 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  l *sp = lemp->sy
21880 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20  mbols[i];.      
21890 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d  if( sp==0 || sp-
218a0 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20  >type==TERMINAL 
218b0 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d  ||.          sp-
218c0 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73 70 2d  >index<=0 || sp-
218d0 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30 20 29  >destructor!=0 )
218e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
218f0 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
21900 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
21910 2c 20 22 20 20 20 20 20 20 2f 2a 20 44 65 66 61  , "      /* Defa
21920 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49 4e 41 4c  ult NON-TERMINAL
21930 20 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e   Destructor */\n
21940 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
21950 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a        once = 0;.
21960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
21970 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63  rintf(out,"    c
21980 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f  ase %d: /* %s */
21990 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20  \n", sp->index, 
219a0 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  sp->name); linen
219b0 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f  o++;.      dflt_
219c0 73 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20  sp = sp;.    }. 
219d0 20 20 20 69 66 28 20 64 66 6c 74 5f 73 70 21 3d     if( dflt_sp!=
219e0 30 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f  0 ){.      emit_
219f0 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28  destructor_code(
21a00 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70  out,dflt_sp,lemp
21a10 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 7d  ,&lineno);.    }
21a20 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
21a30 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e  ,"      break;\n
21a40 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
21a50 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  }.  for(i=0; i<l
21a60 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
21a70 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73  +){.    struct s
21a80 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
21a90 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
21aa0 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73    if( sp==0 || s
21ab0 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
21ac0 4c 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63  L || sp->destruc
21ad0 74 6f 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  tor==0 ) continu
21ae0 65 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 64  e;.    if( sp->d
21af0 65 73 74 4c 69 6e 65 6e 6f 3c 30 20 29 20 63 6f  estLineno<0 ) co
21b00 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 41 6c 72 65  ntinue;  /* Alre
21b10 61 64 79 20 65 6d 69 74 74 65 64 20 2a 2f 0a 20  ady emitted */. 
21b20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
21b30 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20      case %d: /* 
21b40 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e  %s */\n", sp->in
21b50 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20  dex, sp->name); 
21b60 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 20 20 2f  lineno++;..    /
21b70 2a 20 43 6f 6d 62 69 6e 65 20 64 75 70 6c 69 63  * Combine duplic
21b80 61 74 65 20 64 65 73 74 72 75 63 74 6f 72 73 20  ate destructors 
21b90 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 63 61  into a single ca
21ba0 73 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d  se */.    for(j=
21bb0 69 2b 31 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79  i+1; j<lemp->nsy
21bc0 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  mbol; j++){.    
21bd0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
21be0 2a 73 70 32 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d  *sp2 = lemp->sym
21bf0 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  bols[j];.      i
21c00 66 28 20 73 70 32 20 26 26 20 73 70 32 2d 3e 74  f( sp2 && sp2->t
21c10 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 26 26  ype!=TERMINAL &&
21c20 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72   sp2->destructor
21c30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 70  .          && sp
21c40 32 2d 3e 64 74 6e 75 6d 3d 3d 73 70 2d 3e 64 74  2->dtnum==sp->dt
21c50 6e 75 6d 0a 20 20 20 20 20 20 20 20 20 20 26 26  num.          &&
21c60 20 73 74 72 63 6d 70 28 73 70 2d 3e 64 65 73 74   strcmp(sp->dest
21c70 72 75 63 74 6f 72 2c 73 70 32 2d 3e 64 65 73 74  ructor,sp2->dest
21c80 72 75 63 74 6f 72 29 3d 3d 30 20 29 7b 0a 20 20  ructor)==0 ){.  
21c90 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
21ca0 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a  ut,"    case %d:
21cb0 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20   /* %s */\n",.  
21cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
21cd0 70 32 2d 3e 69 6e 64 65 78 2c 20 73 70 32 2d 3e  p2->index, sp2->
21ce0 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
21cf0 0a 20 20 20 20 20 20 20 20 20 73 70 32 2d 3e 64  .         sp2->d
21d00 65 73 74 4c 69 6e 65 6e 6f 20 3d 20 2d 31 3b 20  estLineno = -1; 
21d10 20 2f 2a 20 41 76 6f 69 64 20 65 6d 69 74 74 69   /* Avoid emitti
21d20 6e 67 20 74 68 69 73 20 64 65 73 74 72 75 63 74  ng this destruct
21d30 6f 72 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  or again */.    
21d40 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65    }.    }..    e
21d50 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  mit_destructor_c
21d60 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79  ode(out,lemp->sy
21d70 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c  mbols[i],lemp,&l
21d80 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69  ineno);.    fpri
21d90 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62  ntf(out,"      b
21da0 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
21db0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
21dc0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
21dd0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
21de0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
21df0 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
21e00 74 65 73 20 77 68 65 6e 65 76 65 72 20 74 68 65  tes whenever the
21e10 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 6f 76   parser stack ov
21e20 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 74 70 6c  erflows */.  tpl
21e30 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
21e40 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 2c  ,lemp->overflow,
21e50 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74  &lineno);.  tplt
21e60 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
21e70 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
21e80 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
21e90 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 72 75   the table of ru
21ea0 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20  le information. 
21eb0 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54   **.  ** Note: T
21ec0 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
21ed0 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
21ee0 74 20 72 75 6c 65 73 20 61 72 65 20 6e 75 6d 62  t rules are numb
21ef0 65 72 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74 75  er.  ** sequentu
21f00 61 6c 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20 77  ally beginning w
21f10 69 74 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ith 0..  */.  fo
21f20 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
21f30 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
21f40 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
21f50 75 74 2c 22 20 20 7b 20 25 64 2c 20 25 64 20 7d  ut,"  { %d, %d }
21f60 2c 5c 6e 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e  ,\n",rp->lhs->in
21f70 64 65 78 2c 2d 72 70 2d 3e 6e 72 68 73 29 3b 20  dex,-rp->nrhs); 
21f80 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
21f90 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
21fa0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
21fb0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
21fc0 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
21fd0 65 78 65 63 75 74 69 6f 6e 20 64 75 72 69 6e 67  execution during
21fe0 20 65 61 63 68 20 52 45 44 55 43 45 20 61 63 74   each REDUCE act
21ff0 69 6f 6e 20 2a 2f 0a 20 20 69 20 3d 20 30 3b 0a  ion */.  i = 0;.
22000 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
22010 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
22020 6e 65 78 74 29 7b 0a 20 20 20 20 69 20 2b 3d 20  next){.    i += 
22030 74 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28 6c  translate_code(l
22040 65 6d 70 2c 20 72 70 29 3b 0a 20 20 7d 0a 20 20  emp, rp);.  }.  
22050 69 66 28 20 69 20 29 7b 0a 20 20 20 20 66 70 72  if( i ){.    fpr
22060 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
22070 20 20 59 59 4d 49 4e 4f 52 54 59 50 45 20 79 79    YYMINORTYPE yy
22080 6c 68 73 6d 69 6e 6f 72 3b 5c 6e 22 29 3b 20 6c  lhsminor;\n"); l
22090 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 2f  ineno++;.  }.  /
220a0 2a 20 46 69 72 73 74 20 6f 75 74 70 75 74 20 72  * First output r
220b0 75 6c 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ules other than 
220c0 74 68 65 20 64 65 66 61 75 6c 74 3a 20 72 75 6c  the default: rul
220d0 65 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65  e */.  for(rp=le
220e0 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
220f0 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
22100 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 32  struct rule *rp2
22110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22120 2f 2a 20 4f 74 68 65 72 20 72 75 6c 65 73 20 77  /* Other rules w
22130 69 74 68 20 74 68 65 20 73 61 6d 65 20 61 63 74  ith the same act
22140 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ion */.    if( r
22150 70 2d 3e 63 6f 64 65 45 6d 69 74 74 65 64 20 29  p->codeEmitted )
22160 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
22170 66 28 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 29 7b  f( rp->noCode ){
22180 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 43 20 63  .      /* No C c
22190 6f 64 65 20 61 63 74 69 6f 6e 73 2c 20 73 6f 20  ode actions, so 
221a0 74 68 69 73 20 77 69 6c 6c 20 62 65 20 70 61 72  this will be par
221b0 74 20 6f 66 20 74 68 65 20 22 64 65 66 61 75 6c  t of the "defaul
221c0 74 3a 22 20 72 75 6c 65 20 2a 2f 0a 20 20 20 20  t:" rule */.    
221d0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
221e0 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
221f0 74 2c 22 20 20 20 20 20 20 63 61 73 65 20 25 64  t,"      case %d
22200 3a 20 2f 2a 20 22 2c 20 72 70 2d 3e 69 52 75 6c  : /* ", rp->iRul
22210 65 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c  e);.    writeRul
22220 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a  eText(out, rp);.
22230 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
22240 20 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e   " */\n"); linen
22250 6f 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 72 70 32  o++;.    for(rp2
22260 3d 72 70 2d 3e 6e 65 78 74 3b 20 72 70 32 3b 20  =rp->next; rp2; 
22270 72 70 32 3d 72 70 32 2d 3e 6e 65 78 74 29 7b 0a  rp2=rp2->next){.
22280 20 20 20 20 20 20 69 66 28 20 72 70 32 2d 3e 63        if( rp2->c
22290 6f 64 65 3d 3d 72 70 2d 3e 63 6f 64 65 20 26 26  ode==rp->code &&
222a0 20 72 70 32 2d 3e 63 6f 64 65 50 72 65 66 69 78   rp2->codePrefix
222b0 3d 3d 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78  ==rp->codePrefix
222c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
222d0 20 72 70 32 2d 3e 63 6f 64 65 53 75 66 66 69 78   rp2->codeSuffix
222e0 3d 3d 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78  ==rp->codeSuffix
222f0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
22300 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63  ntf(out,"      c
22310 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70  ase %d: /* ", rp
22320 32 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 20  2->iRule);.     
22330 20 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74     writeRuleText
22340 28 6f 75 74 2c 20 72 70 32 29 3b 0a 20 20 20 20  (out, rp2);.    
22350 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
22360 22 20 2a 2f 20 79 79 74 65 73 74 63 61 73 65 28  " */ yytestcase(
22370 79 79 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e  yyruleno==%d);\n
22380 22 2c 20 72 70 32 2d 3e 69 52 75 6c 65 29 3b 20  ", rp2->iRule); 
22390 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
223a0 20 20 72 70 32 2d 3e 63 6f 64 65 45 6d 69 74 74    rp2->codeEmitt
223b0 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ed = 1;.      }.
223c0 20 20 20 20 7d 0a 20 20 20 20 65 6d 69 74 5f 63      }.    emit_c
223d0 6f 64 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c  ode(out,rp,lemp,
223e0 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70  &lineno);.    fp
223f0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
22400 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c     break;\n"); l
22410 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 72 70 2d  ineno++;.    rp-
22420 3e 63 6f 64 65 45 6d 69 74 74 65 64 20 3d 20 31  >codeEmitted = 1
22430 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 6e 61 6c  ;.  }.  /* Final
22440 6c 79 2c 20 6f 75 74 70 75 74 20 74 68 65 20 64  ly, output the d
22450 65 66 61 75 6c 74 3a 20 72 75 6c 65 2e 20 20 57  efault: rule.  W
22460 65 20 63 68 6f 6f 73 65 20 61 73 20 74 68 65 20  e choose as the 
22470 64 65 66 61 75 6c 74 3a 20 61 6c 6c 0a 20 20 2a  default: all.  *
22480 2a 20 65 6d 70 74 79 20 61 63 74 69 6f 6e 73 2e  * empty actions.
22490 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
224a0 74 2c 22 20 20 20 20 20 20 64 65 66 61 75 6c 74  t,"      default
224b0 3a 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  :\n"); lineno++;
224c0 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
224d0 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
224e0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
224f0 72 70 2d 3e 63 6f 64 65 45 6d 69 74 74 65 64 20  rp->codeEmitted 
22500 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22510 61 73 73 65 72 74 28 20 72 70 2d 3e 6e 6f 43 6f  assert( rp->noCo
22520 64 65 20 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  de );.    fprint
22530 66 28 6f 75 74 2c 22 20 20 20 20 20 20 2f 2a 20  f(out,"      /* 
22540 28 25 64 29 20 22 2c 20 72 70 2d 3e 69 52 75 6c  (%d) ", rp->iRul
22550 65 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c  e);.    writeRul
22560 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a  eText(out, rp);.
22570 20 20 20 20 69 66 28 20 72 70 2d 3e 64 6f 65 73      if( rp->does
22580 52 65 64 75 63 65 20 29 7b 0a 20 20 20 20 20 20  Reduce ){.      
22590 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a  fprintf(out, " *
225a0 2f 20 79 79 74 65 73 74 63 61 73 65 28 79 79 72  / yytestcase(yyr
225b0 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20  uleno==%d);\n", 
225c0 72 70 2d 3e 69 52 75 6c 65 29 3b 20 6c 69 6e 65  rp->iRule); line
225d0 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no++;.    }else{
225e0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
225f0 75 74 2c 20 22 20 28 4f 50 54 49 4d 49 5a 45 44  ut, " (OPTIMIZED
22600 20 4f 55 54 29 20 2a 2f 20 61 73 73 65 72 74 28   OUT) */ assert(
22610 79 79 72 75 6c 65 6e 6f 21 3d 25 64 29 3b 5c 6e  yyruleno!=%d);\n
22620 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22630 20 72 70 2d 3e 69 52 75 6c 65 29 3b 20 6c 69 6e   rp->iRule); lin
22640 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  eno++;.    }.  }
22650 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
22660 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e          break;\n
22670 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
22680 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
22690 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
226a0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
226b0 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
226c0 65 78 65 63 75 74 65 73 20 69 66 20 61 20 70 61  executes if a pa
226d0 72 73 65 20 66 61 69 6c 73 20 2a 2f 0a 20 20 74  rse fails */.  t
226e0 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
226f0 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65  mp,lemp->failure
22700 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c  ,&lineno);.  tpl
22710 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
22720 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
22730 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
22740 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
22750 63 75 74 65 73 20 77 68 65 6e 20 61 20 73 79 6e  cutes when a syn
22760 74 61 78 20 65 72 72 6f 72 20 6f 63 63 75 72 73  tax error occurs
22770 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
22780 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
22790 65 72 72 6f 72 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  error,&lineno);.
227a0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
227b0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
227c0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
227d0 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
227e0 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20  h executes when 
227f0 74 68 65 20 70 61 72 73 65 72 20 61 63 63 65 70  the parser accep
22800 74 73 20 69 74 73 20 69 6e 70 75 74 20 2a 2f 0a  ts its input */.
22810 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
22820 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61 63 63 65  ,lemp,lemp->acce
22830 70 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74  pt,&lineno);.  t
22840 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
22850 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
22860 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  no);..  /* Appen
22870 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e 20 63  d any addition c
22880 6f 64 65 20 74 68 65 20 75 73 65 72 20 64 65 73  ode the user des
22890 69 72 65 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  ires */.  tplt_p
228a0 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
228b0 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65 2c 26 6c  mp->extracode,&l
228c0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73  ineno);..  fclos
228d0 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28  e(in);.  fclose(
228e0 6f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  out);.  return;.
228f0 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  }../* Generate a
22900 20 68 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72   header file for
22910 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76   the parser */.v
22920 6f 69 64 20 52 65 70 6f 72 74 48 65 61 64 65 72  oid ReportHeader
22930 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
22940 65 6d 70 29 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f  emp).{.  FILE *o
22950 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 6f 6e 73 74  ut, *in;.  const
22960 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20   char *prefix;. 
22970 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53   char line[LINES
22980 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70 61 74  IZE];.  char pat
22990 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a  tern[LINESIZE];.
229a0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
229b0 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
229c0 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d  x ) prefix = lem
229d0 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a  p->tokenprefix;.
229e0 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
229f0 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
22a00 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d 20 66 69   = "";.  in = fi
22a10 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68  le_open(lemp,".h
22a20 22 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  ","rb");.  if( i
22a30 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78  n ){.    int nex
22a40 74 43 68 61 72 3b 0a 20 20 20 20 66 6f 72 28 69  tChar;.    for(i
22a50 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =1; i<lemp->nter
22a60 6d 69 6e 61 6c 20 26 26 20 66 67 65 74 73 28 6c  minal && fgets(l
22a70 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29  ine,LINESIZE,in)
22a80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6c 65  ; i++){.      le
22a90 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 70 61 74 74  mon_sprintf(patt
22aa0 65 72 6e 2c 22 23 64 65 66 69 6e 65 20 25 73 25  ern,"#define %s%
22ab0 2d 33 30 73 20 25 33 64 5c 6e 22 2c 0a 20 20 20  -30s %3d\n",.   
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ad0 20 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79   prefix,lemp->sy
22ae0 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69  mbols[i]->name,i
22af0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
22b00 63 6d 70 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e  cmp(line,pattern
22b10 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
22b20 0a 20 20 20 20 6e 65 78 74 43 68 61 72 20 3d 20  .    nextChar = 
22b30 66 67 65 74 63 28 69 6e 29 3b 0a 20 20 20 20 66  fgetc(in);.    f
22b40 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 69  close(in);.    i
22b50 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72  f( i==lemp->nter
22b60 6d 69 6e 61 6c 20 26 26 20 6e 65 78 74 43 68 61  minal && nextCha
22b70 72 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20  r==EOF ){.      
22b80 2f 2a 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20  /* No change in 
22b90 74 68 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74  the file.  Don't
22ba0 20 72 65 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a   rewrite it. */.
22bb0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
22bc0 20 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20    }.  }.  out = 
22bd0 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22  file_open(lemp,"
22be0 2e 68 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28  .h","wb");.  if(
22bf0 20 6f 75 74 20 29 7b 0a 20 20 20 20 66 6f 72 28   out ){.    for(
22c00 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=1; i<lemp->nte
22c10 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  rminal; i++){.  
22c20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
22c30 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73  "#define %s%-30s
22c40 20 25 33 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c   %3d\n",prefix,l
22c50 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
22c60 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a  >name,i);.    }.
22c70 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
22c80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
22c90 0a 0a 2f 2a 20 52 65 64 75 63 65 20 74 68 65 20  ../* Reduce the 
22ca0 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63 74 69  size of the acti
22cb0 6f 6e 20 74 61 62 6c 65 73 2c 20 69 66 20 70 6f  on tables, if po
22cc0 73 73 69 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e  ssible, by makin
22cd0 67 20 75 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61  g use.** of defa
22ce0 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ults..**.** In t
22cf0 68 69 73 20 76 65 72 73 69 6f 6e 2c 20 77 65 20  his version, we 
22d00 74 61 6b 65 20 74 68 65 20 6d 6f 73 74 20 66 72  take the most fr
22d10 65 71 75 65 6e 74 20 52 45 44 55 43 45 20 61 63  equent REDUCE ac
22d20 74 69 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a  tion and make.**
22d30 20 69 74 20 74 68 65 20 64 65 66 61 75 6c 74 2e   it the default.
22d40 20 20 45 78 63 65 70 74 2c 20 74 68 65 72 65 20    Except, there 
22d50 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 69 66  is no default if
22d60 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f   the wildcard to
22d70 6b 65 6e 0a 2a 2a 20 69 73 20 61 20 70 6f 73 73  ken.** is a poss
22d80 69 62 6c 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 2e  ible look-ahead.
22d90 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73  .*/.void Compres
22da0 73 54 61 62 6c 65 73 28 73 74 72 75 63 74 20 6c  sTables(struct l
22db0 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
22dc0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
22dd0 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p;.  struct acti
22de0 6f 6e 20 2a 61 70 2c 20 2a 61 70 32 2c 20 2a 6e  on *ap, *ap2, *n
22df0 65 78 74 61 70 3b 0a 20 20 73 74 72 75 63 74 20  extap;.  struct 
22e00 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c 20  rule *rp, *rp2, 
22e10 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e 62  *rbest;.  int nb
22e20 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 3b  est, n;.  int i;
22e30 0a 20 20 69 6e 74 20 75 73 65 73 57 69 6c 64 63  .  int usesWildc
22e40 61 72 64 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ard;..  for(i=0;
22e50 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
22e60 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
22e70 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
22e80 3b 0a 20 20 20 20 6e 62 65 73 74 20 3d 20 30 3b  ;.    nbest = 0;
22e90 0a 20 20 20 20 72 62 65 73 74 20 3d 20 30 3b 0a  .    rbest = 0;.
22ea0 20 20 20 20 75 73 65 73 57 69 6c 64 63 61 72 64      usesWildcard
22eb0 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28 61   = 0;..    for(a
22ec0 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
22ed0 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
22ee0 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
22ef0 3d 53 48 49 46 54 20 26 26 20 61 70 2d 3e 73 70  =SHIFT && ap->sp
22f00 3d 3d 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64  ==lemp->wildcard
22f10 20 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65 73   ){.        uses
22f20 57 69 6c 64 63 61 72 64 20 3d 20 31 3b 0a 20 20  Wildcard = 1;.  
22f30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22f40 61 70 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45  ap->type!=REDUCE
22f50 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22f60 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70     rp = ap->x.rp
22f70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e  ;.      if( rp->
22f80 6c 68 73 53 74 61 72 74 20 29 20 63 6f 6e 74 69  lhsStart ) conti
22f90 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nue;.      if( r
22fa0 70 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69  p==rbest ) conti
22fb0 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 31  nue;.      n = 1
22fc0 3b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 32 3d  ;.      for(ap2=
22fd0 61 70 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20 61  ap->next; ap2; a
22fe0 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a 20  p2=ap2->next){. 
22ff0 20 20 20 20 20 20 20 69 66 28 20 61 70 32 2d 3e         if( ap2->
23000 74 79 70 65 21 3d 52 45 44 55 43 45 20 29 20 63  type!=REDUCE ) c
23010 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
23020 20 72 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72 70   rp2 = ap2->x.rp
23030 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70  ;.        if( rp
23040 32 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69  2==rbest ) conti
23050 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
23060 20 72 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a   rp2==rp ) n++;.
23070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
23080 28 20 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20 20  ( n>nbest ){.   
23090 20 20 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b 0a       nbest = n;.
230a0 20 20 20 20 20 20 20 20 72 62 65 73 74 20 3d 20          rbest = 
230b0 72 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rp;.      }.    
230c0 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  }..    /* Do not
230d0 20 6d 61 6b 65 20 61 20 64 65 66 61 75 6c 74 20   make a default 
230e0 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  if the number of
230f0 20 72 75 6c 65 73 20 74 6f 20 64 65 66 61 75 6c   rules to defaul
23100 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  t.    ** is not 
23110 61 74 20 6c 65 61 73 74 20 31 20 6f 72 20 69 66  at least 1 or if
23120 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f   the wildcard to
23130 6b 65 6e 20 69 73 20 61 20 70 6f 73 73 69 62 6c  ken is a possibl
23140 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 6b 61 68 65  e.    ** lookahe
23150 61 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ad..    */.    i
23160 66 28 20 6e 62 65 73 74 3c 31 20 7c 7c 20 75 73  f( nbest<1 || us
23170 65 73 57 69 6c 64 63 61 72 64 20 29 20 63 6f 6e  esWildcard ) con
23180 74 69 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a 20  tinue;...    /* 
23190 43 6f 6d 62 69 6e 65 20 6d 61 74 63 68 69 6e 67  Combine matching
231a0 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73 20   REDUCE actions 
231b0 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 64 65  into a single de
231c0 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f 72  fault */.    for
231d0 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
231e0 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
231f0 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
23200 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d  e==REDUCE && ap-
23210 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 62  >x.rp==rbest ) b
23220 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
23230 61 73 73 65 72 74 28 20 61 70 20 29 3b 0a 20 20  assert( ap );.  
23240 20 20 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62 6f    ap->sp = Symbo
23250 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74 7d  l_new("{default}
23260 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 61  ");.    for(ap=a
23270 70 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70 3d  p->next; ap; ap=
23280 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
23290 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52   if( ap->type==R
232a0 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72  EDUCE && ap->x.r
232b0 70 3d 3d 72 62 65 73 74 20 29 20 61 70 2d 3e 74  p==rbest ) ap->t
232c0 79 70 65 20 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a  ype = NOT_USED;.
232d0 20 20 20 20 7d 0a 20 20 20 20 73 74 70 2d 3e 61      }.    stp->a
232e0 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28  p = Action_sort(
232f0 73 74 70 2d 3e 61 70 29 3b 0a 0a 20 20 20 20 66  stp->ap);..    f
23300 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
23310 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
23320 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
23330 79 70 65 3d 3d 53 48 49 46 54 20 29 20 62 72 65  ype==SHIFT ) bre
23340 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61 70  ak;.      if( ap
23350 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26  ->type==REDUCE &
23360 26 20 61 70 2d 3e 78 2e 72 70 21 3d 72 62 65 73  & ap->x.rp!=rbes
23370 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t ) break;.    }
23380 0a 20 20 20 20 69 66 28 20 61 70 3d 3d 30 20 29  .    if( ap==0 )
23390 7b 0a 20 20 20 20 20 20 73 74 70 2d 3e 61 75 74  {.      stp->aut
233a0 6f 52 65 64 75 63 65 20 3d 20 31 3b 0a 20 20 20  oReduce = 1;.   
233b0 20 20 20 73 74 70 2d 3e 70 44 66 6c 74 52 65 64     stp->pDfltRed
233c0 75 63 65 20 3d 20 72 62 65 73 74 3b 0a 20 20 20  uce = rbest;.   
233d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
233e0 65 20 61 20 73 65 63 6f 6e 64 20 70 61 73 73 20  e a second pass 
233f0 6f 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73 20  over all states 
23400 61 6e 64 20 61 63 74 69 6f 6e 73 2e 20 20 43 6f  and actions.  Co
23410 6e 76 65 72 74 0a 20 20 2a 2a 20 65 76 65 72 79  nvert.  ** every
23420 20 61 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20   action that is 
23430 61 20 53 48 49 46 54 20 74 6f 20 61 6e 20 61 75  a SHIFT to an au
23440 74 6f 52 65 64 75 63 65 20 73 74 61 74 65 20 69  toReduce state i
23450 6e 74 6f 0a 20 20 2a 2a 20 61 20 53 48 49 46 54  nto.  ** a SHIFT
23460 52 45 44 55 43 45 20 61 63 74 69 6f 6e 2e 0a 20  REDUCE action.. 
23470 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
23480 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
23490 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
234a0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
234b0 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
234c0 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
234d0 65 78 74 29 7b 0a 20 20 20 20 20 20 73 74 72 75  ext){.      stru
234e0 63 74 20 73 74 61 74 65 20 2a 70 4e 65 78 74 53  ct state *pNextS
234f0 74 61 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20  tate;.      if( 
23500 61 70 2d 3e 74 79 70 65 21 3d 53 48 49 46 54 20  ap->type!=SHIFT 
23510 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
23520 20 20 70 4e 65 78 74 53 74 61 74 65 20 3d 20 61    pNextState = a
23530 70 2d 3e 78 2e 73 74 70 3b 0a 20 20 20 20 20 20  p->x.stp;.      
23540 69 66 28 20 70 4e 65 78 74 53 74 61 74 65 2d 3e  if( pNextState->
23550 61 75 74 6f 52 65 64 75 63 65 20 26 26 20 70 4e  autoReduce && pN
23560 65 78 74 53 74 61 74 65 2d 3e 70 44 66 6c 74 52  extState->pDfltR
23570 65 64 75 63 65 21 3d 30 20 29 7b 0a 20 20 20 20  educe!=0 ){.    
23580 20 20 20 20 61 70 2d 3e 74 79 70 65 20 3d 20 53      ap->type = S
23590 48 49 46 54 52 45 44 55 43 45 3b 0a 20 20 20 20  HIFTREDUCE;.    
235a0 20 20 20 20 61 70 2d 3e 78 2e 72 70 20 3d 20 70      ap->x.rp = p
235b0 4e 65 78 74 53 74 61 74 65 2d 3e 70 44 66 6c 74  NextState->pDflt
235c0 52 65 64 75 63 65 3b 0a 20 20 20 20 20 20 7d 0a  Reduce;.      }.
235d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
235e0 49 66 20 61 20 53 48 49 46 54 52 45 44 55 43 45  If a SHIFTREDUCE
235f0 20 61 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65   action specifie
23600 73 20 61 20 72 75 6c 65 20 74 68 61 74 20 68 61  s a rule that ha
23610 73 20 61 20 73 69 6e 67 6c 65 20 52 48 53 20 74  s a single RHS t
23620 65 72 6d 0a 20 20 2a 2a 20 28 6d 65 61 6e 69 6e  erm.  ** (meanin
23630 67 20 74 68 61 74 20 74 68 65 20 53 48 49 46 54  g that the SHIFT
23640 52 45 44 55 43 45 20 77 69 6c 6c 20 6c 61 6e 64  REDUCE will land
23650 20 62 61 63 6b 20 69 6e 20 74 68 65 20 73 74 61   back in the sta
23660 74 65 20 77 68 65 72 65 20 69 74 0a 20 20 2a 2a  te where it.  **
23670 20 73 74 61 72 74 65 64 29 20 61 6e 64 20 69 66   started) and if
23680 20 74 68 65 72 65 20 69 73 20 6e 6f 20 43 2d 63   there is no C-c
23690 6f 64 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ode associated w
236a0 69 74 68 20 74 68 65 20 72 65 64 75 63 65 20 61  ith the reduce a
236b0 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 6e  ction,.  ** then
236c0 20 77 65 20 63 61 6e 20 67 6f 20 61 68 65 61 64   we can go ahead
236d0 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65   and convert the
236e0 20 61 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68   action to be th
236f0 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 20 20  e same as the.  
23700 2a 2a 20 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ** action for th
23710 65 20 52 48 53 20 6f 66 20 74 68 65 20 72 75 6c  e RHS of the rul
23720 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
23730 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
23740 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
23750 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
23760 69 5d 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73  i];.    for(ap=s
23770 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 6e  tp->ap; ap; ap=n
23780 65 78 74 61 70 29 7b 0a 20 20 20 20 20 20 6e 65  extap){.      ne
23790 78 74 61 70 20 3d 20 61 70 2d 3e 6e 65 78 74 3b  xtap = ap->next;
237a0 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
237b0 79 70 65 21 3d 53 48 49 46 54 52 45 44 55 43 45  ype!=SHIFTREDUCE
237c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
237d0 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70     rp = ap->x.rp
237e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e  ;.      if( rp->
237f0 6e 6f 43 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74  noCode==0 ) cont
23800 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
23810 72 70 2d 3e 6e 72 68 73 21 3d 31 20 29 20 63 6f  rp->nrhs!=1 ) co
23820 6e 74 69 6e 75 65 3b 0a 23 69 66 20 31 0a 20 20  ntinue;.#if 1.  
23830 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 70 70 6c      /* Only appl
23840 79 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  y this optimizat
23850 69 6f 6e 20 74 6f 20 6e 6f 6e 2d 74 65 72 6d 69  ion to non-termi
23860 6e 61 6c 73 2e 20 20 49 74 20 77 6f 75 6c 64 20  nals.  It would 
23870 62 65 20 4f 4b 20 74 6f 0a 20 20 20 20 20 20 2a  be OK to.      *
23880 2a 20 61 70 70 6c 79 20 69 74 20 74 6f 20 74 65  * apply it to te
23890 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 74  rminal symbols t
238a0 6f 6f 2c 20 62 75 74 20 74 68 61 74 20 6d 61 6b  oo, but that mak
238b0 65 73 20 74 68 65 20 70 61 72 73 65 72 20 74 61  es the parser ta
238c0 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61  bles.      ** la
238d0 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69  rger. */.      i
238e0 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
238f0 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
23900 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6e   ) continue;.#en
23910 64 69 66 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  dif.      /* If 
23920 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
23930 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  int, it means th
23940 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
23950 61 6e 20 62 65 20 61 70 70 6c 69 65 64 20 2a 2f  an be applied */
23960 0a 20 20 20 20 20 20 6e 65 78 74 61 70 20 3d 20  .      nextap = 
23970 61 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 61 70  ap;.      for(ap
23980 32 3d 73 74 70 2d 3e 61 70 3b 20 61 70 32 20 26  2=stp->ap; ap2 &
23990 26 20 28 61 70 32 3d 3d 61 70 20 7c 7c 20 61 70  & (ap2==ap || ap
239a0 32 2d 3e 73 70 21 3d 72 70 2d 3e 6c 68 73 29 3b  2->sp!=rp->lhs);
239b0 20 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b   ap2=ap2->next){
239c0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
239d0 61 70 32 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ap2!=0 );.      
239e0 61 70 2d 3e 73 70 4f 70 74 20 3d 20 61 70 32 2d  ap->spOpt = ap2-
239f0 3e 73 70 3b 0a 20 20 20 20 20 20 61 70 2d 3e 74  >sp;.      ap->t
23a00 79 70 65 20 3d 20 61 70 32 2d 3e 74 79 70 65 3b  ype = ap2->type;
23a10 0a 20 20 20 20 20 20 61 70 2d 3e 78 20 3d 20 61  .      ap->x = a
23a20 70 32 2d 3e 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  p2->x;.    }.  }
23a30 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  .}.../*.** Compa
23a40 72 65 20 74 77 6f 20 73 74 61 74 65 73 20 66 6f  re two states fo
23a50 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73  r sorting purpos
23a60 65 73 2e 20 20 54 68 65 20 73 6d 61 6c 6c 65 72  es.  The smaller
23a70 20 73 74 61 74 65 20 69 73 20 74 68 65 0a 2a 2a   state is the.**
23a80 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f   one with the mo
23a90 73 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  st non-terminal 
23aa0 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65  actions.  If the
23ab0 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
23ac0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f 6e  number.** of non
23ad0 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e  -terminal action
23ae0 73 2c 20 74 68 65 6e 20 74 68 65 20 73 6d 61 6c  s, then the smal
23af0 6c 65 72 20 69 73 20 74 68 65 20 6f 6e 65 20 77  ler is the one w
23b00 69 74 68 20 74 68 65 20 6d 6f 73 74 0a 2a 2a 20  ith the most.** 
23b10 74 6f 6b 65 6e 20 61 63 74 69 6f 6e 73 2e 0a 2a  token actions..*
23b20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 61  /.static int sta
23b30 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 28  teResortCompare(
23b40 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63  const void *a, c
23b50 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20  onst void *b){. 
23b60 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74   const struct st
23b70 61 74 65 20 2a 70 41 20 3d 20 2a 28 63 6f 6e 73  ate *pA = *(cons
23b80 74 20 73 74 72 75 63 74 20 73 74 61 74 65 2a 2a  t struct state**
23b90 29 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  )a;.  const stru
23ba0 63 74 20 73 74 61 74 65 20 2a 70 42 20 3d 20 2a  ct state *pB = *
23bb0 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74  (const struct st
23bc0 61 74 65 2a 2a 29 62 3b 0a 20 20 69 6e 74 20 6e  ate**)b;.  int n
23bd0 3b 0a 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e 74  ;..  n = pB->nNt
23be0 41 63 74 20 2d 20 70 41 2d 3e 6e 4e 74 41 63 74  Act - pA->nNtAct
23bf0 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a  ;.  if( n==0 ){.
23c00 20 20 20 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b 6e      n = pB->nTkn
23c10 41 63 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41 63  Act - pA->nTknAc
23c20 74 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  t;.    if( n==0 
23c30 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 42 2d  ){.      n = pB-
23c40 3e 73 74 61 74 65 6e 75 6d 20 2d 20 70 41 2d 3e  >statenum - pA->
23c50 73 74 61 74 65 6e 75 6d 3b 0a 20 20 20 20 7d 0a  statenum;.    }.
23c60 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 21    }.  assert( n!
23c70 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  =0 );.  return n
23c80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 75  ;.}.../*.** Renu
23c90 6d 62 65 72 20 61 6e 64 20 72 65 73 6f 72 74 20  mber and resort 
23ca0 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 73  states so that s
23cb0 74 61 74 65 73 20 77 69 74 68 20 66 65 77 65 72  tates with fewer
23cc0 20 63 68 6f 69 63 65 73 0a 2a 2a 20 6f 63 63 75   choices.** occu
23cd0 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 45  r at the end.  E
23ce0 78 63 65 70 74 2c 20 6b 65 65 70 20 73 74 61 74  xcept, keep stat
23cf0 65 20 30 20 61 73 20 74 68 65 20 66 69 72 73 74  e 0 as the first
23d00 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20   state..*/.void 
23d10 52 65 73 6f 72 74 53 74 61 74 65 73 28 73 74 72  ResortStates(str
23d20 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
23d30 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  .{.  int i;.  st
23d40 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
23d50 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
23d60 20 2a 61 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   *ap;..  for(i=0
23d70 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
23d80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
23d90 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
23da0 5d 3b 0a 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e  ];.    stp->nTkn
23db0 41 63 74 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63  Act = stp->nNtAc
23dc0 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 70 2d 3e  t = 0;.    stp->
23dd0 69 44 66 6c 74 52 65 64 75 63 65 20 3d 20 6c 65  iDfltReduce = le
23de0 6d 70 2d 3e 6e 72 75 6c 65 3b 20 20 2f 2a 20 49  mp->nrule;  /* I
23df0 6e 69 74 20 64 66 6c 74 20 61 63 74 69 6f 6e 20  nit dflt action 
23e00 74 6f 20 22 73 79 6e 74 61 78 20 65 72 72 6f 72  to "syntax error
23e10 22 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 69 54  " */.    stp->iT
23e20 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53  knOfst = NO_OFFS
23e30 45 54 3b 0a 20 20 20 20 73 74 70 2d 3e 69 4e 74  ET;.    stp->iNt
23e40 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54  Ofst = NO_OFFSET
23e50 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  ;.    for(ap=stp
23e60 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
23e70 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  >next){.      in
23e80 74 20 69 41 63 74 69 6f 6e 20 3d 20 63 6f 6d 70  t iAction = comp
23e90 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c  ute_action(lemp,
23ea0 61 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ap);.      if( i
23eb0 41 63 74 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20  Action>=0 ){.   
23ec0 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d       if( ap->sp-
23ed0 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65  >index<lemp->nte
23ee0 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  rminal ){.      
23ef0 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74      stp->nTknAct
23f00 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
23f10 65 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e  e if( ap->sp->in
23f20 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  dex<lemp->nsymbo
23f30 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  l ){.          s
23f40 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b 3b 0a 20 20  tp->nNtAct++;.  
23f50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23f60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
23f70 74 70 2d 3e 61 75 74 6f 52 65 64 75 63 65 3d 3d  tp->autoReduce==
23f80 30 20 7c 7c 20 73 74 70 2d 3e 70 44 66 6c 74 52  0 || stp->pDfltR
23f90 65 64 75 63 65 3d 3d 61 70 2d 3e 78 2e 72 70 20  educe==ap->x.rp 
23fa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70  );.          stp
23fb0 2d 3e 69 44 66 6c 74 52 65 64 75 63 65 20 3d 20  ->iDfltReduce = 
23fc0 69 41 63 74 69 6f 6e 20 2d 20 6c 65 6d 70 2d 3e  iAction - lemp->
23fd0 6e 73 74 61 74 65 20 2d 20 6c 65 6d 70 2d 3e 6e  nstate - lemp->n
23fe0 72 75 6c 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rule;.        }.
23ff0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24000 7d 0a 20 20 71 73 6f 72 74 28 26 6c 65 6d 70 2d  }.  qsort(&lemp-
24010 3e 73 6f 72 74 65 64 5b 31 5d 2c 20 6c 65 6d 70  >sorted[1], lemp
24020 2d 3e 6e 73 74 61 74 65 2d 31 2c 20 73 69 7a 65  ->nstate-1, size
24030 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  of(lemp->sorted[
24040 30 5d 29 2c 0a 20 20 20 20 20 20 20 20 73 74 61  0]),.        sta
24050 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 29  teResortCompare)
24060 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
24070 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
24080 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 6f 72  ){.    lemp->sor
24090 74 65 64 5b 69 5d 2d 3e 73 74 61 74 65 6e 75 6d  ted[i]->statenum
240a0 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 6c 65 6d 70   = i;.  }.  lemp
240b0 2d 3e 6e 78 73 74 61 74 65 20 3d 20 6c 65 6d 70  ->nxstate = lemp
240c0 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68 69 6c  ->nstate;.  whil
240d0 65 28 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65  e( lemp->nxstate
240e0 3e 31 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74  >1 && lemp->sort
240f0 65 64 5b 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65  ed[lemp->nxstate
24100 2d 31 5d 2d 3e 61 75 74 6f 52 65 64 75 63 65 20  -1]->autoReduce 
24110 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 6e 78 73  ){.    lemp->nxs
24120 74 61 74 65 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 0a  tate--;.  }.}...
24130 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
24140 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
24150 20 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a   "set.c" *******
24160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
24180 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75 6c  *.** Set manipul
24190 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 66  ation routines f
241a0 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  or the LEMON par
241b0 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
241c0 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69  /..static int si
241d0 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74 20  ze = 0;../* Set 
241e0 74 68 65 20 73 65 74 20 73 69 7a 65 20 2a 2f 0a  the set size */.
241f0 76 6f 69 64 20 53 65 74 53 69 7a 65 28 69 6e 74  void SetSize(int
24200 20 6e 29 0a 7b 0a 20 20 73 69 7a 65 20 3d 20 6e   n).{.  size = n
24210 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  +1;.}../* Alloca
24220 74 65 20 61 20 6e 65 77 20 73 65 74 20 2a 2f 0a  te a new set */.
24230 63 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f 69  char *SetNew(voi
24240 64 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b 0a 20  d){.  char *s;. 
24250 20 73 20 3d 20 28 63 68 61 72 2a 29 63 61 6c 6c   s = (char*)call
24260 6f 63 28 20 73 69 7a 65 2c 20 31 29 3b 0a 20 20  oc( size, 1);.  
24270 69 66 28 20 73 3d 3d 30 20 29 7b 0a 20 20 20 20  if( s==0 ){.    
24280 65 78 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f  extern void memo
24290 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20  ry_error();.    
242a0 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a  memory_error();.
242b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a    }.  return s;.
242c0 7d 0a 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65  }../* Deallocate
242d0 20 61 20 73 65 74 20 2a 2f 0a 76 6f 69 64 20 53   a set */.void S
242e0 65 74 46 72 65 65 28 63 68 61 72 20 2a 73 29 0a  etFree(char *s).
242f0 7b 0a 20 20 66 72 65 65 28 73 29 3b 0a 7d 0a 0a  {.  free(s);.}..
24300 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  /* Add a new ele
24310 6d 65 6e 74 20 74 6f 20 74 68 65 20 73 65 74 2e  ment to the set.
24320 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
24330 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 77 61 73   the element was
24340 20 61 64 64 65 64 0a 2a 2a 20 61 6e 64 20 46 41   added.** and FA
24350 4c 53 45 20 69 66 20 69 74 20 77 61 73 20 61 6c  LSE if it was al
24360 72 65 61 64 79 20 74 68 65 72 65 2e 20 2a 2f 0a  ready there. */.
24370 69 6e 74 20 53 65 74 41 64 64 28 63 68 61 72 20  int SetAdd(char 
24380 2a 73 2c 20 69 6e 74 20 65 29 0a 7b 0a 20 20 69  *s, int e).{.  i
24390 6e 74 20 72 76 3b 0a 20 20 61 73 73 65 72 74 28  nt rv;.  assert(
243a0 20 65 3e 3d 30 20 26 26 20 65 3c 73 69 7a 65 20   e>=0 && e<size 
243b0 29 3b 0a 20 20 72 76 20 3d 20 73 5b 65 5d 3b 0a  );.  rv = s[e];.
243c0 20 20 73 5b 65 5d 20 3d 20 31 3b 0a 20 20 72 65    s[e] = 1;.  re
243d0 74 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f 2a 20  turn !rv;.}../* 
243e0 41 64 64 20 65 76 65 72 79 20 65 6c 65 6d 65 6e  Add every elemen
243f0 74 20 6f 66 20 73 32 20 74 6f 20 73 31 2e 20 20  t of s2 to s1.  
24400 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
24410 31 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 69 6e  1 changes. */.in
24420 74 20 53 65 74 55 6e 69 6f 6e 28 63 68 61 72 20  t SetUnion(char 
24430 2a 73 31 2c 20 63 68 61 72 20 2a 73 32 29 0a 7b  *s1, char *s2).{
24440 0a 20 20 69 6e 74 20 69 2c 20 70 72 6f 67 72 65  .  int i, progre
24450 73 73 3b 0a 20 20 70 72 6f 67 72 65 73 73 20 3d  ss;.  progress =
24460 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
24470 3c 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  <size; i++){.   
24480 20 69 66 28 20 73 32 5b 69 5d 3d 3d 30 20 29 20   if( s2[i]==0 ) 
24490 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
244a0 28 20 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  ( s1[i]==0 ){.  
244b0 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31      progress = 1
244c0 3b 0a 20 20 20 20 20 20 73 31 5b 69 5d 20 3d 20  ;.      s1[i] = 
244d0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
244e0 65 74 75 72 6e 20 70 72 6f 67 72 65 73 73 3b 0a  eturn progress;.
244f0 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
24500 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
24510 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 63  he file "table.c
24520 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
24530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
24540 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69  /*.** All code i
24550 6e 20 74 68 69 73 20 66 69 6c 65 20 68 61 73 20  n this file has 
24560 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c  been automatical
24570 6c 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  ly generated.** 
24580 66 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63 61  from a specifica
24590 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65  tion in the file
245a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
245b0 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79   "table.q".** by
245c0 20 74 68 65 20 61 73 73 6f 63 69 61 74 69 76 65   the associative
245d0 20 61 72 72 61 79 20 63 6f 64 65 20 62 75 69 6c   array code buil
245e0 64 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61 61  ding program "aa
245f0 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  gen"..** Do not 
24600 65 64 69 74 20 74 68 69 73 20 66 69 6c 65 21 20  edit this file! 
24610 20 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20 74   Instead, edit t
24620 68 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e  he specification
24630 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 72  .** file, then r
24640 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f  erun aagen..*/./
24650 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72  *.** Code for pr
24660 6f 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73 20  ocessing tables 
24670 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  in the LEMON par
24680 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
24690 2f 0a 0a 50 52 49 56 41 54 45 20 75 6e 73 69 67  /..PRIVATE unsig
246a0 6e 65 64 20 73 74 72 68 61 73 68 28 63 6f 6e 73  ned strhash(cons
246b0 74 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20 75  t char *x).{.  u
246c0 6e 73 69 67 6e 65 64 20 68 20 3d 20 30 3b 0a 20  nsigned h = 0;. 
246d0 20 77 68 69 6c 65 28 20 2a 78 20 29 20 68 20 3d   while( *x ) h =
246e0 20 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a   h*13 + *(x++);.
246f0 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f    return h;.}../
24700 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74 72  * Works like str
24710 64 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20 53  dup, sort of.  S
24720 61 76 65 20 61 20 73 74 72 69 6e 67 20 69 6e 20  ave a string in 
24730 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 2c  malloced memory,
24740 20 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74 72   but.** keep str
24750 69 6e 67 73 20 69 6e 20 61 20 74 61 62 6c 65 20  ings in a table 
24760 73 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  so that the same
24770 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 69   string is not i
24780 6e 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f  n more.** than o
24790 6e 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 6f 6e  ne place..*/.con
247a0 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65  st char *Strsafe
247b0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 79 29 0a  (const char *y).
247c0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
247d0 7a 3b 0a 20 20 63 68 61 72 20 2a 63 70 79 3b 0a  z;.  char *cpy;.
247e0 0a 20 20 69 66 28 20 79 3d 3d 30 20 29 20 72 65  .  if( y==0 ) re
247f0 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 53 74  turn 0;.  z = St
24800 72 73 61 66 65 5f 66 69 6e 64 28 79 29 3b 0a 20  rsafe_find(y);. 
24810 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 28 63 70   if( z==0 && (cp
24820 79 3d 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63  y=(char *)malloc
24830 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 79 29  ( lemonStrlen(y)
24840 2b 31 20 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  +1 ))!=0 ){.    
24850 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63 70 79  lemon_strcpy(cpy
24860 2c 79 29 3b 0a 20 20 20 20 7a 20 3d 20 63 70 79  ,y);.    z = cpy
24870 3b 0a 20 20 20 20 53 74 72 73 61 66 65 5f 69 6e  ;.    Strsafe_in
24880 73 65 72 74 28 7a 29 3b 0a 20 20 7d 0a 20 20 4d  sert(z);.  }.  M
24890 65 6d 6f 72 79 43 68 65 63 6b 28 7a 29 3b 0a 20  emoryCheck(z);. 
248a0 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
248b0 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
248c0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
248d0 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
248e0 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73  e for each.** as
248f0 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
24900 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f  of type "x1"..*/
24910 0a 73 74 72 75 63 74 20 73 5f 78 31 20 7b 0a 20  .struct s_x1 {. 
24920 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
24930 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24940 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
24950 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20  ble slots. */.  
24960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24970 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73          /*   Mus
24980 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
24990 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  2 greater than o
249a0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  r */.           
249b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
249c0 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a  *   equal to 1 *
249d0 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20  /.  int count;  
249e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
249f0 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74  umber of current
24a00 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20  ly slots filled 
24a10 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31  */.  struct s_x1
24a20 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54  node *tbl;  /* T
24a30 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68  he data stored h
24a40 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ere */.  struct 
24a50 73 5f 78 31 6e 6f 64 65 20 2a 2a 68 74 3b 20 20  s_x1node **ht;  
24a60 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f  /* Hash table fo
24a70 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a  r lookups */.};.
24a80 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
24a90 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
24aa0 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  s structure for 
24ab0 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65  every data eleme
24ac0 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f  nt.** in an asso
24ad0 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
24ae0 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 74   type "x1"..*/.t
24af0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f  ypedef struct s_
24b00 78 31 6e 6f 64 65 20 7b 0a 20 20 63 6f 6e 73 74  x1node {.  const
24b10 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
24b20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
24b30 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31  */.  struct s_x1
24b40 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a  node *next;   /*
24b50 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68   Next entry with
24b60 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
24b70 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e  /.  struct s_x1n
24b80 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20  ode **from;  /* 
24b90 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f  Previous link */
24ba0 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54  .} x1node;../* T
24bb0 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65  here is only one
24bc0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
24bd0 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73   array, which is
24be0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
24bf0 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
24c00 73 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41  s_x1 *x1a;../* A
24c10 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73  llocate a new as
24c20 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
24c30 2a 2f 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f  */.void Strsafe_
24c40 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 69 66  init(void){.  if
24c50 28 20 78 31 61 20 29 20 72 65 74 75 72 6e 3b 0a  ( x1a ) return;.
24c60 20 20 78 31 61 20 3d 20 28 73 74 72 75 63 74 20    x1a = (struct 
24c70 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  s_x1*)malloc( si
24c80 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 31  zeof(struct s_x1
24c90 29 20 29 3b 0a 20 20 69 66 28 20 78 31 61 20 29  ) );.  if( x1a )
24ca0 7b 0a 20 20 20 20 78 31 61 2d 3e 73 69 7a 65 20  {.    x1a->size 
24cb0 3d 20 31 30 32 34 3b 0a 20 20 20 20 78 31 61 2d  = 1024;.    x1a-
24cc0 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  >count = 0;.    
24cd0 78 31 61 2d 3e 74 62 6c 20 3d 20 28 78 31 6e 6f  x1a->tbl = (x1no
24ce0 64 65 2a 29 63 61 6c 6c 6f 63 28 31 30 32 34 2c  de*)calloc(1024,
24cf0 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20   sizeof(x1node) 
24d00 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a  + sizeof(x1node*
24d10 29 29 3b 0a 20 20 20 20 69 66 28 20 78 31 61 2d  ));.    if( x1a-
24d20 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >tbl==0 ){.     
24d30 20 66 72 65 65 28 78 31 61 29 3b 0a 20 20 20 20   free(x1a);.    
24d40 20 20 78 31 61 20 3d 20 30 3b 0a 20 20 20 20 7d    x1a = 0;.    }
24d50 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
24d60 69 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e 68 74  i;.      x1a->ht
24d70 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 78   = (x1node**)&(x
24d80 31 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29 3b 0a  1a->tbl[1024]);.
24d90 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
24da0 3c 31 30 32 34 3b 20 69 2b 2b 29 20 78 31 61 2d  <1024; i++) x1a-
24db0 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
24dc0 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
24dd0 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
24de0 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
24df0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
24e00 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
24e10 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
24e20 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
24e30 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
24e40 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73  .int Strsafe_ins
24e50 65 72 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ert(const char *
24e60 64 61 74 61 29 0a 7b 0a 20 20 78 31 6e 6f 64 65  data).{.  x1node
24e70 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64   *np;.  unsigned
24e80 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   h;.  unsigned p
24e90 68 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30  h;..  if( x1a==0
24ea0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
24eb0 68 20 3d 20 73 74 72 68 61 73 68 28 64 61 74 61  h = strhash(data
24ec0 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
24ed0 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  1a->size-1);.  n
24ee0 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x1a->ht[h];.
24ef0 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
24f00 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70     if( strcmp(np
24f10 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d 30 20  ->data,data)==0 
24f20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ){.      /* An e
24f30 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69  xisting entry wi
24f40 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
24f50 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20  is found. */.   
24f60 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75     /* Fail becau
24f70 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20  se overwrite is 
24f80 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20  not allows. */. 
24f90 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
24fa0 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70     }.    np = np
24fb0 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  ->next;.  }.  if
24fc0 28 20 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d 78 31  ( x1a->count>=x1
24fd0 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f  a->size ){.    /
24fe0 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74  * Need to make t
24ff0 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69  he hash table bi
25000 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  gger */.    int 
25010 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20 20 73  i,arrSize;.    s
25020 74 72 75 63 74 20 73 5f 78 31 20 61 72 72 61 79  truct s_x1 array
25030 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65  ;.    array.size
25040 20 3d 20 61 72 72 53 69 7a 65 20 3d 20 78 31 61   = arrSize = x1a
25050 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72  ->size*2;.    ar
25060 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31 61 2d  ray.count = x1a-
25070 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61  >count;.    arra
25080 79 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a  y.tbl = (x1node*
25090 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c  )calloc(arrSize,
250a0 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20   sizeof(x1node) 
250b0 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a  + sizeof(x1node*
250c0 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61  ));.    if( arra
250d0 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72  y.tbl==0 ) retur
250e0 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75  n 0;  /* Fail du
250f0 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e to malloc fail
25100 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79  ure */.    array
25110 2e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29  .ht = (x1node**)
25120 26 28 61 72 72 61 79 2e 74 62 6c 5b 61 72 72 53  &(array.tbl[arrS
25130 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  ize]);.    for(i
25140 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69  =0; i<arrSize; i
25150 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20  ++) array.ht[i] 
25160 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
25170 3b 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x1a->count; 
25180 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31 6e 6f  i++){.      x1no
25190 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e  de *oldnp, *newn
251a0 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d  p;.      oldnp =
251b0 20 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d 29 3b   &(x1a->tbl[i]);
251c0 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72 68 61  .      h = strha
251d0 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20  sh(oldnp->data) 
251e0 26 20 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20  & (arrSize-1);. 
251f0 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61       newnp = &(a
25200 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20  rray.tbl[i]);.  
25210 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74      if( array.ht
25220 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68  [h] ) array.ht[h
25230 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e  ]->from = &(newn
25240 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20  p->next);.      
25250 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72  newnp->next = ar
25260 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20  ray.ht[h];.     
25270 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f   newnp->data = o
25280 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20  ldnp->data;.    
25290 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20    newnp->from = 
252a0 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a  &(array.ht[h]);.
252b0 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68        array.ht[h
252c0 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d  ] = newnp;.    }
252d0 0a 20 20 20 20 66 72 65 65 28 78 31 61 2d 3e 74  .    free(x1a->t
252e0 62 6c 29 3b 0a 20 20 20 20 2a 78 31 61 20 3d 20  bl);.    *x1a = 
252f0 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20  array;.  }.  /* 
25300 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64  Insert the new d
25310 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20  ata */.  h = ph 
25320 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x1a->size-1);
25330 0a 20 20 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74  .  np = &(x1a->t
25340 62 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74 2b 2b 5d  bl[x1a->count++]
25350 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20  );.  np->data = 
25360 64 61 74 61 3b 0a 20 20 69 66 28 20 78 31 61 2d  data;.  if( x1a-
25370 3e 68 74 5b 68 5d 20 29 20 78 31 61 2d 3e 68 74  >ht[h] ) x1a->ht
25380 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70  [h]->from = &(np
25390 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e  ->next);.  np->n
253a0 65 78 74 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d  ext = x1a->ht[h]
253b0 3b 0a 20 20 78 31 61 2d 3e 68 74 5b 68 5d 20 3d  ;.  x1a->ht[h] =
253c0 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20   np;.  np->from 
253d0 3d 20 26 28 78 31 61 2d 3e 68 74 5b 68 5d 29 3b  = &(x1a->ht[h]);
253e0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
253f0 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
25400 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69  ter to data assi
25410 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65  gned to the give
25420 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e  n key.  Return N
25430 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63  ULL.** if no suc
25440 68 20 6b 65 79 2e 20 2a 2f 0a 63 6f 6e 73 74 20  h key. */.const 
25450 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f 66 69  char *Strsafe_fi
25460 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b  nd(const char *k
25470 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ey).{.  unsigned
25480 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70   h;.  x1node *np
25490 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20  ;..  if( x1a==0 
254a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
254b0 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26  = strhash(key) &
254c0 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x1a->size-1);.
254d0 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68    np = x1a->ht[h
254e0 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
254f0 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
25500 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d  (np->data,key)==
25510 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e  0 ) break;.    n
25520 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
25530 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20  }.  return np ? 
25540 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a  np->data : 0;.}.
25550 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
25560 6e 74 65 72 20 74 6f 20 74 68 65 20 28 74 65 72  nter to the (ter
25570 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65 72 6d  minal or nonterm
25580 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20 22 78 22  inal) symbol "x"
25590 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  ..** Create a ne
255a0 77 20 73 79 6d 62 6f 6c 20 69 66 20 74 68 69 73  w symbol if this
255b0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 69   is the first ti
255c0 6d 65 20 22 78 22 20 68 61 73 20 62 65 65 6e 20  me "x" has been 
255d0 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  seen..*/.struct 
255e0 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e  symbol *Symbol_n
255f0 65 77 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 78  ew(const char *x
25600 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  ).{.  struct sym
25610 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73 70 20 3d  bol *sp;..  sp =
25620 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b   Symbol_find(x);
25630 0a 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a  .  if( sp==0 ){.
25640 20 20 20 20 73 70 20 3d 20 28 73 74 72 75 63 74      sp = (struct
25650 20 73 79 6d 62 6f 6c 20 2a 29 63 61 6c 6c 6f 63   symbol *)calloc
25660 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63  (1, sizeof(struc
25670 74 20 73 79 6d 62 6f 6c 29 20 29 3b 0a 20 20 20  t symbol) );.   
25680 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 70 29   MemoryCheck(sp)
25690 3b 0a 20 20 20 20 73 70 2d 3e 6e 61 6d 65 20 3d  ;.    sp->name =
256a0 20 53 74 72 73 61 66 65 28 78 29 3b 0a 20 20 20   Strsafe(x);.   
256b0 20 73 70 2d 3e 74 79 70 65 20 3d 20 49 53 55 50   sp->type = ISUP
256c0 50 45 52 28 2a 78 29 20 3f 20 54 45 52 4d 49 4e  PER(*x) ? TERMIN
256d0 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c  AL : NONTERMINAL
256e0 3b 0a 20 20 20 20 73 70 2d 3e 72 75 6c 65 20 3d  ;.    sp->rule =
256f0 20 30 3b 0a 20 20 20 20 73 70 2d 3e 66 61 6c 6c   0;.    sp->fall
25700 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73 70  back = 0;.    sp
25710 2d 3e 70 72 65 63 20 3d 20 2d 31 3b 0a 20 20 20  ->prec = -1;.   
25720 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 55 4e 4b   sp->assoc = UNK
25730 3b 0a 20 20 20 20 73 70 2d 3e 66 69 72 73 74 73  ;.    sp->firsts
25740 65 74 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  et = 0;.    sp->
25750 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46  lambda = LEMON_F
25760 41 4c 53 45 3b 0a 20 20 20 20 73 70 2d 3e 64 65  ALSE;.    sp->de
25770 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20  structor = 0;.  
25780 20 20 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f    sp->destLineno
25790 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 61   = 0;.    sp->da
257a0 74 61 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  tatype = 0;.    
257b0 73 70 2d 3e 75 73 65 43 6e 74 20 3d 20 30 3b 0a  sp->useCnt = 0;.
257c0 20 20 20 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72      Symbol_inser
257d0 74 28 73 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a  t(sp,sp->name);.
257e0 20 20 7d 0a 20 20 73 70 2d 3e 75 73 65 43 6e 74    }.  sp->useCnt
257f0 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 70 3b  ++;.  return sp;
25800 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74  .}../* Compare t
25810 77 6f 20 73 79 6d 62 6f 6c 73 20 66 6f 72 20 73  wo symbols for s
25820 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  orting purposes.
25830 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76    Return negativ
25840 65 2c 0a 2a 2a 20 7a 65 72 6f 2c 20 6f 72 20 70  e,.** zero, or p
25850 6f 73 69 74 69 76 65 20 69 66 20 61 20 69 73 20  ositive if a is 
25860 6c 65 73 73 20 74 68 65 6e 2c 20 65 71 75 61 6c  less then, equal
25870 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a   to, or greater.
25880 2a 2a 20 74 68 61 6e 20 62 2e 0a 2a 2a 0a 2a 2a  ** than b..**.**
25890 20 53 79 6d 62 6f 6c 73 20 74 68 61 74 20 62 65   Symbols that be
258a0 67 69 6e 20 77 69 74 68 20 75 70 70 65 72 20 63  gin with upper c
258b0 61 73 65 20 6c 65 74 74 65 72 73 20 28 74 65 72  ase letters (ter
258c0 6d 69 6e 61 6c 73 20 6f 72 20 74 6f 6b 65 6e 73  minals or tokens
258d0 29 0a 2a 2a 20 6d 75 73 74 20 73 6f 72 74 20 62  ).** must sort b
258e0 65 66 6f 72 65 20 73 79 6d 62 6f 6c 73 20 74 68  efore symbols th
258f0 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 6c 6f  at begin with lo
25900 77 65 72 20 63 61 73 65 20 6c 65 74 74 65 72 73  wer case letters
25910 0a 2a 2a 20 28 6e 6f 6e 2d 74 65 72 6d 69 6e 61  .** (non-termina
25920 6c 73 29 2e 20 20 41 6e 64 20 4d 55 4c 54 49 54  ls).  And MULTIT
25930 45 52 4d 49 4e 41 4c 20 73 79 6d 62 6f 6c 73 20  ERMINAL symbols 
25940 28 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74  (created using t
25950 68 65 0a 2a 2a 20 25 74 6f 6b 65 6e 5f 63 6c 61  he.** %token_cla
25960 73 73 20 64 69 72 65 63 74 69 76 65 29 20 6d 75  ss directive) mu
25970 73 74 20 73 6f 72 74 20 61 74 20 74 68 65 20 76  st sort at the v
25980 65 72 79 20 65 6e 64 2e 20 4f 74 68 65 72 20 74  ery end. Other t
25990 68 61 6e 0a 2a 2a 20 74 68 61 74 2c 20 74 68 65  han.** that, the
259a0 20 6f 72 64 65 72 20 64 6f 65 73 20 6e 6f 74 20   order does not 
259b0 6d 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 65  matter..**.** We
259c0 20 66 69 6e 64 20 65 78 70 65 72 69 6d 65 6e 74   find experiment
259d0 61 6c 6c 79 20 74 68 61 74 20 6c 65 61 76 69 6e  ally that leavin
259e0 67 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 69 6e  g the symbols in
259f0 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 0a   their original.
25a00 2a 2a 20 6f 72 64 65 72 20 28 74 68 65 20 6f 72  ** order (the or
25a10 64 65 72 20 74 68 65 79 20 61 70 70 65 61 72 65  der they appeare
25a20 64 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72  d in the grammar
25a30 20 66 69 6c 65 29 20 67 69 76 65 73 20 74 68 65   file) gives the
25a40 0a 2a 2a 20 73 6d 61 6c 6c 65 73 74 20 70 61 72  .** smallest par
25a50 73 65 72 20 74 61 62 6c 65 73 20 69 6e 20 53 51  ser tables in SQ
25a60 4c 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20 53 79 6d  Lite..*/.int Sym
25a70 62 6f 6c 63 6d 70 70 28 63 6f 6e 73 74 20 76 6f  bolcmpp(const vo
25a80 69 64 20 2a 5f 61 2c 20 63 6f 6e 73 74 20 76 6f  id *_a, const vo
25a90 69 64 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e 73  id *_b).{.  cons
25aa0 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  t struct symbol 
25ab0 2a 61 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72  *a = *(const str
25ac0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 5f  uct symbol **) _
25ad0 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  a;.  const struc
25ae0 74 20 73 79 6d 62 6f 6c 20 2a 62 20 3d 20 2a 28  t symbol *b = *(
25af0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d  const struct sym
25b00 62 6f 6c 20 2a 2a 29 20 5f 62 3b 0a 20 20 69 6e  bol **) _b;.  in
25b10 74 20 69 31 20 3d 20 61 2d 3e 74 79 70 65 3d 3d  t i1 = a->type==
25b20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 3f 20  MULTITERMINAL ? 
25b30 33 20 3a 20 61 2d 3e 6e 61 6d 65 5b 30 5d 3e 27  3 : a->name[0]>'
25b40 5a 27 20 3f 20 32 20 3a 20 31 3b 0a 20 20 69 6e  Z' ? 2 : 1;.  in
25b50 74 20 69 32 20 3d 20 62 2d 3e 74 79 70 65 3d 3d  t i2 = b->type==
25b60 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 3f 20  MULTITERMINAL ? 
25b70 33 20 3a 20 62 2d 3e 6e 61 6d 65 5b 30 5d 3e 27  3 : b->name[0]>'
25b80 5a 27 20 3f 20 32 20 3a 20 31 3b 0a 20 20 72 65  Z' ? 2 : 1;.  re
25b90 74 75 72 6e 20 69 31 3d 3d 69 32 20 3f 20 61 2d  turn i1==i2 ? a-
25ba0 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 69 6e 64 65  >index - b->inde
25bb0 78 20 3a 20 69 31 20 2d 20 69 32 3b 0a 7d 0a 0a  x : i1 - i2;.}..
25bc0 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
25bd0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
25be0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
25bf0 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  ure for each.** 
25c00 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
25c10 79 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e 0a  y of type "x2"..
25c20 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 32 20 7b  */.struct s_x2 {
25c30 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
25c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25c50 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
25c60 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a  lable slots. */.
25c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d            /*   M
25c90 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
25ca0 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e  f 2 greater than
25cb0 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   or */.         
25cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cd0 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31   /*   equal to 1
25ce0 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b   */.  int count;
25cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d00 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65   Number of curre
25d10 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65  ntly slots fille
25d20 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  d */.  struct s_
25d30 78 32 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a  x2node *tbl;  /*
25d40 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   The data stored
25d50 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
25d60 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 68 74 3b  t s_x2node **ht;
25d70 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
25d80 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d  for lookups */.}
25d90 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
25da0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
25db0 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f  his structure fo
25dc0 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65  r every data ele
25dd0 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73  ment.** in an as
25de0 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
25df0 6f 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f  of type "x2"..*/
25e00 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25e10 73 5f 78 32 6e 6f 64 65 20 7b 0a 20 20 73 74 72  s_x2node {.  str
25e20 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61  uct symbol *data
25e30 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ;     /* The dat
25e40 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  a */.  const cha
25e50 72 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20  r *key;         
25e60 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
25e70 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20  struct s_x2node 
25e80 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74  *next;   /* Next
25e90 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
25ea0 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73  same hash */.  s
25eb0 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a  truct s_x2node *
25ec0 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69  *from;  /* Previ
25ed0 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 32  ous link */.} x2
25ee0 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  node;../* There 
25ef0 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74  is only one inst
25f00 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61  ance of the arra
25f10 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  y, which is the 
25f20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61  following */.sta
25f30 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 32 20  tic struct s_x2 
25f40 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  *x2a;../* Alloca
25f50 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61  te a new associa
25f60 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f  tive array */.vo
25f70 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 76  id Symbol_init(v
25f80 6f 69 64 29 7b 0a 20 20 69 66 28 20 78 32 61 20  oid){.  if( x2a 
25f90 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 32 61 20  ) return;.  x2a 
25fa0 3d 20 28 73 74 72 75 63 74 20 73 5f 78 32 2a 29  = (struct s_x2*)
25fb0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
25fc0 74 72 75 63 74 20 73 5f 78 32 29 20 29 3b 0a 20  truct s_x2) );. 
25fd0 20 69 66 28 20 78 32 61 20 29 7b 0a 20 20 20 20   if( x2a ){.    
25fe0 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b  x2a->size = 128;
25ff0 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e 74 20  .    x2a->count 
26000 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e 74 62  = 0;.    x2a->tb
26010 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 63 61 6c  l = (x2node*)cal
26020 6c 6f 63 28 31 32 38 2c 20 73 69 7a 65 6f 66 28  loc(128, sizeof(
26030 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x2node) + sizeof
26040 28 78 32 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20  (x2node*));.    
26050 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d 30 20  if( x2a->tbl==0 
26060 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 32  ){.      free(x2
26070 61 29 3b 0a 20 20 20 20 20 20 78 32 61 20 3d 20  a);.      x2a = 
26080 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
26090 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
260a0 20 78 32 61 2d 3e 68 74 20 3d 20 28 78 32 6e 6f   x2a->ht = (x2no
260b0 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62 6c 5b  de**)&(x2a->tbl[
260c0 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  128]);.      for
260d0 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b  (i=0; i<128; i++
260e0 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x2a->ht[i] = 0
260f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
26100 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
26110 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
26120 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
26130 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
26140 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
26150 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
26160 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
26170 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f  ten */.int Symbo
26180 6c 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20  l_insert(struct 
26190 73 79 6d 62 6f 6c 20 2a 64 61 74 61 2c 20 63 6f  symbol *data, co
261a0 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b  nst char *key).{
261b0 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 20  .  x2node *np;. 
261c0 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75   unsigned h;.  u
261d0 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69  nsigned ph;..  i
261e0 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75  f( x2a==0 ) retu
261f0 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72  rn 0;.  ph = str
26200 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d  hash(key);.  h =
26210 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65   ph & (x2a->size
26220 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d  -1);.  np = x2a-
26230 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
26240 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
26250 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65  trcmp(np->key,ke
26260 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  y)==0 ){.      /
26270 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  * An existing en
26280 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
26290 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20  e key is found. 
262a0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  */.      /* Fail
262b0 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69   because overwri
262c0 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73  te is not allows
262d0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
262e0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
262f0 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
26300 7d 0a 20 20 69 66 28 20 78 32 61 2d 3e 63 6f 75  }.  if( x2a->cou
26310 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a 65 20 29 7b  nt>=x2a->size ){
26320 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
26330 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
26340 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20  ble bigger */.  
26350 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b    int i,arrSize;
26360 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 32  .    struct s_x2
26370 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61   array;.    arra
26380 79 2e 73 69 7a 65 20 3d 20 61 72 72 53 69 7a 65  y.size = arrSize
26390 20 3d 20 78 32 61 2d 3e 73 69 7a 65 2a 32 3b 0a   = x2a->size*2;.
263a0 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20      array.count 
263b0 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x2a->count;.  
263c0 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78    array.tbl = (x
263d0 32 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61 72  2node*)calloc(ar
263e0 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78 32  rSize, sizeof(x2
263f0 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
26400 32 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66  2node*));.    if
26410 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29  ( array.tbl==0 )
26420 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46   return 0;  /* F
26430 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f  ail due to mallo
26440 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20  c failure */.   
26450 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 32 6e   array.ht = (x2n
26460 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62  ode**)&(array.tb
26470 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20 20  l[arrSize]);.   
26480 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53   for(i=0; i<arrS
26490 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e  ize; i++) array.
264a0 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66  ht[i] = 0;.    f
264b0 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d 3e 63  or(i=0; i<x2a->c
264c0 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
264d0 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c    x2node *oldnp,
264e0 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f   *newnp;.      o
264f0 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62  ldnp = &(x2a->tb
26500 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d  l[i]);.      h =
26510 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e   strhash(oldnp->
26520 6b 65 79 29 20 26 20 28 61 72 72 53 69 7a 65 2d  key) & (arrSize-
26530 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20  1);.      newnp 
26540 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d  = &(array.tbl[i]
26550 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72  );.      if( arr
26560 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79  ay.ht[h] ) array
26570 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  .ht[h]->from = &
26580 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  (newnp->next);. 
26590 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74       newnp->next
265a0 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a   = array.ht[h];.
265b0 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79        newnp->key
265c0 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20   = oldnp->key;. 
265d0 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61       newnp->data
265e0 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a   = oldnp->data;.
265f0 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f        newnp->fro
26600 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68  m = &(array.ht[h
26610 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e  ]);.      array.
26620 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20  ht[h] = newnp;. 
26630 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 32     }.    free(x2
26640 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 32  a->tbl);.    *x2
26650 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20  a = array;.  }. 
26660 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
26670 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d  ew data */.  h =
26680 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65   ph & (x2a->size
26690 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 32  -1);.  np = &(x2
266a0 61 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f 75 6e  a->tbl[x2a->coun
266b0 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79  t++]);.  np->key
266c0 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61   = key;.  np->da
266d0 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28  ta = data;.  if(
266e0 20 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20 78 32   x2a->ht[h] ) x2
266f0 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  a->ht[h]->from =
26700 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20   &(np->next);.  
26710 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61 2d 3e  np->next = x2a->
26720 68 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e 68 74  ht[h];.  x2a->ht
26730 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e  [h] = np;.  np->
26740 66 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e 68 74  from = &(x2a->ht
26750 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  [h]);.  return 1
26760 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
26770 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
26780 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
26790 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74   given key.  Ret
267a0 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e  urn NULL.** if n
267b0 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73  o such key. */.s
267c0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
267d0 6d 62 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20  mbol_find(const 
267e0 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 75  char *key).{.  u
267f0 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 78 32 6e  nsigned h;.  x2n
26800 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20  ode *np;..  if( 
26810 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x2a==0 ) return 
26820 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68  0;.  h = strhash
26830 28 6b 65 79 29 20 26 20 28 78 32 61 2d 3e 73 69  (key) & (x2a->si
26840 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32  ze-1);.  np = x2
26850 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
26860 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
26870 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c   strcmp(np->key,
26880 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  key)==0 ) break;
26890 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
268a0 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
268b0 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a   np ? np->data :
268c0 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   0;.}../* Return
268d0 20 74 68 65 20 6e 2d 74 68 20 64 61 74 61 2e 20   the n-th data. 
268e0 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
268f0 6e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  n is out of rang
26900 65 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d  e. */.struct sym
26910 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28  bol *Symbol_Nth(
26920 69 6e 74 20 6e 29 0a 7b 0a 20 20 73 74 72 75 63  int n).{.  struc
26930 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a  t symbol *data;.
26940 20 20 69 66 28 20 78 32 61 20 26 26 20 6e 3e 30    if( x2a && n>0
26950 20 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e   && n<=x2a->coun
26960 74 20 29 7b 0a 20 20 20 20 64 61 74 61 20 3d 20  t ){.    data = 
26970 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61  x2a->tbl[n-1].da
26980 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ta;.  }else{.   
26990 20 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20   data = 0;.  }. 
269a0 20 72 65 74 75 72 6e 20 64 61 74 61 3b 0a 7d 0a   return data;.}.
269b0 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  ./* Return the s
269c0 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
269d0 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63   */.int Symbol_c
269e0 6f 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74 75 72  ount().{.  retur
269f0 6e 20 78 32 61 20 3f 20 78 32 61 2d 3e 63 6f 75  n x2a ? x2a->cou
26a00 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  nt : 0;.}../* Re
26a10 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  turn an array of
26a20 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
26a30 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 61 62   data in the tab
26a40 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79  le..** The array
26a50 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
26a60 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72  m malloc.  Retur
26a70 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79  n NULL if memory
26a80 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70   allocation.** p
26a90 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74  roblems, or if t
26aa0 68 65 20 61 72 72 61 79 20 69 73 20 65 6d 70 74  he array is empt
26ab0 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d  y. */.struct sym
26ac0 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72  bol **Symbol_arr
26ad0 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75 63  ayof().{.  struc
26ae0 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72 61 79  t symbol **array
26af0 3b 0a 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a  ;.  int i,arrSiz
26b00 65 3b 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20  e;.  if( x2a==0 
26b10 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 72  ) return 0;.  ar
26b20 72 53 69 7a 65 20 3d 20 78 32 61 2d 3e 63 6f 75  rSize = x2a->cou
26b30 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73  nt;.  array = (s
26b40 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29  truct symbol **)
26b50 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20  calloc(arrSize, 
26b60 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79  sizeof(struct sy
26b70 6d 62 6f 6c 20 2a 29 29 3b 0a 20 20 69 66 28 20  mbol *));.  if( 
26b80 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72  array ){.    for
26b90 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b  (i=0; i<arrSize;
26ba0 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d   i++) array[i] =
26bb0 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74   x2a->tbl[i].dat
26bc0 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  a;.  }.  return 
26bd0 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  array;.}../* Com
26be0 70 61 72 65 20 74 77 6f 20 63 6f 6e 66 69 67 75  pare two configu
26bf0 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43  rations */.int C
26c00 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73 74 20 63  onfigcmp(const c
26c10 68 61 72 20 2a 5f 61 2c 63 6f 6e 73 74 20 63 68  har *_a,const ch
26c20 61 72 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e 73  ar *_b).{.  cons
26c30 74 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  t struct config 
26c40 2a 61 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e  *a = (struct con
26c50 66 69 67 20 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e  fig *) _a;.  con
26c60 73 74 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  st struct config
26c70 20 2a 62 20 3d 20 28 73 74 72 75 63 74 20 63 6f   *b = (struct co
26c80 6e 66 69 67 20 2a 29 20 5f 62 3b 0a 20 20 69 6e  nfig *) _b;.  in
26c90 74 20 78 3b 0a 20 20 78 20 3d 20 61 2d 3e 72 70  t x;.  x = a->rp
26ca0 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d  ->index - b->rp-
26cb0 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 78 3d  >index;.  if( x=
26cc0 3d 30 20 29 20 78 20 3d 20 61 2d 3e 64 6f 74 20  =0 ) x = a->dot 
26cd0 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75  - b->dot;.  retu
26ce0 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70  rn x;.}../* Comp
26cf0 61 72 65 20 74 77 6f 20 73 74 61 74 65 73 20 2a  are two states *
26d00 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73 74  /.PRIVATE int st
26d10 61 74 65 63 6d 70 28 73 74 72 75 63 74 20 63 6f  atecmp(struct co
26d20 6e 66 69 67 20 2a 61 2c 20 73 74 72 75 63 74 20  nfig *a, struct 
26d30 63 6f 6e 66 69 67 20 2a 62 29 0a 7b 0a 20 20 69  config *b).{.  i
26d40 6e 74 20 72 63 3b 0a 20 20 66 6f 72 28 72 63 3d  nt rc;.  for(rc=
26d50 30 3b 20 72 63 3d 3d 30 20 26 26 20 61 20 26 26  0; rc==0 && a &&
26d60 20 62 3b 20 20 61 3d 61 2d 3e 62 70 2c 20 62 3d   b;  a=a->bp, b=
26d70 62 2d 3e 62 70 29 7b 0a 20 20 20 20 72 63 20 3d  b->bp){.    rc =
26d80 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20   a->rp->index - 
26d90 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20  b->rp->index;.  
26da0 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
26db0 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64   = a->dot - b->d
26dc0 6f 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ot;.  }.  if( rc
26dd0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 61  ==0 ){.    if( a
26de0 20 29 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 69   ) rc = 1;.    i
26df0 66 28 20 62 20 29 20 72 63 20 3d 20 2d 31 3b 0a  f( b ) rc = -1;.
26e00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
26e10 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 73 74  .}../* Hash a st
26e20 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 75  ate */.PRIVATE u
26e30 6e 73 69 67 6e 65 64 20 73 74 61 74 65 68 61 73  nsigned statehas
26e40 68 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  h(struct config 
26e50 2a 61 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  *a).{.  unsigned
26e60 20 68 3d 30 3b 0a 20 20 77 68 69 6c 65 28 20 61   h=0;.  while( a
26e70 20 29 7b 0a 20 20 20 20 68 20 3d 20 68 2a 35 37   ){.    h = h*57
26e80 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78  1 + a->rp->index
26e90 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20  *37 + a->dot;.  
26ea0 20 20 61 20 3d 20 61 2d 3e 62 70 3b 0a 20 20 7d    a = a->bp;.  }
26eb0 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a  .  return h;.}..
26ec0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
26ed0 77 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72  w state structur
26ee0 65 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74  e */.struct stat
26ef0 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 29 0a 7b  e *State_new().{
26f00 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
26f10 2a 6e 65 77 73 74 61 74 65 3b 0a 20 20 6e 65 77  *newstate;.  new
26f20 73 74 61 74 65 20 3d 20 28 73 74 72 75 63 74 20  state = (struct 
26f30 73 74 61 74 65 20 2a 29 63 61 6c 6c 6f 63 28 31  state *)calloc(1
26f40 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  , sizeof(struct 
26f50 73 74 61 74 65 29 20 29 3b 0a 20 20 4d 65 6d 6f  state) );.  Memo
26f60 72 79 43 68 65 63 6b 28 6e 65 77 73 74 61 74 65  ryCheck(newstate
26f70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 73  );.  return news
26f80 74 61 74 65 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72  tate;.}../* Ther
26f90 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
26fa0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
26fb0 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  ng structure for
26fc0 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61   each.** associa
26fd0 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
26fe0 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73 74 72 75  pe "x3"..*/.stru
26ff0 63 74 20 73 5f 78 33 20 7b 0a 20 20 69 6e 74 20  ct s_x3 {.  int 
27000 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
27010 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
27020 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73  r of available s
27030 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lots. */.       
27040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27050 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20     /*   Must be 
27060 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65  a power of 2 gre
27070 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a  ater than or */.
27080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65            /*   e
270a0 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69  qual to 1 */.  i
270b0 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20  nt count;       
270c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
270d0 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c   of currently sl
270e0 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ots filled */.  
270f0 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
27100 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61  *tbl;  /* The da
27110 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a  ta stored here *
27120 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
27130 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61  ode **ht;  /* Ha
27140 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f  sh table for loo
27150 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  kups */.};../* T
27160 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
27170 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
27180 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79  ucture for every
27190 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a   data element.**
271a0 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69   in an associati
271b0 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
271c0 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70 65 64 65   "x3"..*/.typede
271d0 66 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64  f struct s_x3nod
271e0 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  e {.  struct sta
271f0 74 65 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  te *data;       
27200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
27210 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75  e data */.  stru
27220 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 20  ct config *key; 
27230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27240 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
27250 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
27260 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65  e *next;   /* Ne
27270 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  xt entry with th
27280 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20  e same hash */. 
27290 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65   struct s_x3node
272a0 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65   **from;  /* Pre
272b0 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20  vious link */.} 
272c0 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72  x3node;../* Ther
272d0 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e  e is only one in
272e0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72  stance of the ar
272f0 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68  ray, which is th
27300 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
27310 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78  tatic struct s_x
27320 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f  3 *x3a;../* Allo
27330 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63  cate a new assoc
27340 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a  iative array */.
27350 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28  void State_init(
27360 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 78 33 61  void){.  if( x3a
27370 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 33 61   ) return;.  x3a
27380 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 33 2a   = (struct s_x3*
27390 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
273a0 73 74 72 75 63 74 20 73 5f 78 33 29 20 29 3b 0a  struct s_x3) );.
273b0 20 20 69 66 28 20 78 33 61 20 29 7b 0a 20 20 20    if( x3a ){.   
273c0 20 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38   x3a->size = 128
273d0 3b 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e 74  ;.    x3a->count
273e0 20 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e 74   = 0;.    x3a->t
273f0 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 63 61  bl = (x3node*)ca
27400 6c 6c 6f 63 28 31 32 38 2c 20 73 69 7a 65 6f 66  lloc(128, sizeof
27410 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x3node) + sizeo
27420 66 28 78 33 6e 6f 64 65 2a 29 29 3b 0a 20 20 20  f(x3node*));.   
27430 20 69 66 28 20 78 33 61 2d 3e 74 62 6c 3d 3d 30   if( x3a->tbl==0
27440 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78   ){.      free(x
27450 33 61 29 3b 0a 20 20 20 20 20 20 78 33 61 20 3d  3a);.      x3a =
27460 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
27470 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
27480 20 20 78 33 61 2d 3e 68 74 20 3d 20 28 78 33 6e    x3a->ht = (x3n
27490 6f 64 65 2a 2a 29 26 28 78 33 61 2d 3e 74 62 6c  ode**)&(x3a->tbl
274a0 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f  [128]);.      fo
274b0 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b  r(i=0; i<128; i+
274c0 2b 29 20 78 33 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x3a->ht[i] = 
274d0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f  0;.    }.  }.}./
274e0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
274f0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61  ecord into the a
27500 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52  rray.  Return TR
27510 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  UE if successful
27520 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20  ..** Prior data 
27530 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
27540 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69  y is NOT overwri
27550 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 61 74  tten */.int Stat
27560 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20  e_insert(struct 
27570 73 74 61 74 65 20 2a 64 61 74 61 2c 20 73 74 72  state *data, str
27580 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29  uct config *key)
27590 0a 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b  .{.  x3node *np;
275a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20  .  unsigned h;. 
275b0 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20   unsigned ph;.. 
275c0 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65   if( x3a==0 ) re
275d0 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73  turn 0;.  ph = s
275e0 74 61 74 65 68 61 73 68 28 6b 65 79 29 3b 0a 20  tatehash(key);. 
275f0 20 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e   h = ph & (x3a->
27600 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
27610 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x3a->ht[h];.  wh
27620 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
27630 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e  f( statecmp(np->
27640 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20  key,key)==0 ){. 
27650 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
27660 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74  ing entry with t
27670 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66  he same key is f
27680 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  ound. */.      /
27690 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f  * Fail because o
276a0 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20  verwrite is not 
276b0 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  allows. */.     
276c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
276d0 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
276e0 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 33  xt;.  }.  if( x3
276f0 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d 3e 73  a->count>=x3a->s
27700 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ize ){.    /* Ne
27710 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68  ed to make the h
27720 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72  ash table bigger
27730 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61 72   */.    int i,ar
27740 72 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63  rSize;.    struc
27750 74 20 73 5f 78 33 20 61 72 72 61 79 3b 0a 20 20  t s_x3 array;.  
27760 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 61    array.size = a
27770 72 72 53 69 7a 65 20 3d 20 78 33 61 2d 3e 73 69  rrSize = x3a->si
27780 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e  ze*2;.    array.
27790 63 6f 75 6e 74 20 3d 20 78 33 61 2d 3e 63 6f 75  count = x3a->cou
277a0 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62  nt;.    array.tb
277b0 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 63 61 6c  l = (x3node*)cal
277c0 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a  loc(arrSize, siz
277d0 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69  eof(x3node) + si
277e0 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 3b 0a  zeof(x3node*));.
277f0 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62      if( array.tb
27800 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
27810 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f    /* Fail due to
27820 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
27830 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20  */.    array.ht 
27840 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 61 72  = (x3node**)&(ar
27850 72 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d  ray.tbl[arrSize]
27860 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
27870 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20  i<arrSize; i++) 
27880 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b  array.ht[i] = 0;
27890 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
278a0 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x3a->count; i++)
278b0 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64 65 20 2a  {.      x3node *
278c0 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20  oldnp, *newnp;. 
278d0 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78       oldnp = &(x
278e0 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  3a->tbl[i]);.   
278f0 20 20 20 68 20 3d 20 73 74 61 74 65 68 61 73 68     h = statehash
27900 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28  (oldnp->key) & (
27910 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20  arrSize-1);.    
27920 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61    newnp = &(arra
27930 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  y.tbl[i]);.     
27940 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d   if( array.ht[h]
27950 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e   ) array.ht[h]->
27960 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e  from = &(newnp->
27970 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77  next);.      new
27980 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79  np->next = array
27990 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65  .ht[h];.      ne
279a0 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70  wnp->key = oldnp
279b0 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77  ->key;.      new
279c0 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70  np->data = oldnp
279d0 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65  ->data;.      ne
279e0 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72  wnp->from = &(ar
279f0 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20  ray.ht[h]);.    
27a00 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20    array.ht[h] = 
27a10 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20  newnp;.    }.   
27a20 20 66 72 65 65 28 78 33 61 2d 3e 74 62 6c 29 3b   free(x3a->tbl);
27a30 0a 20 20 20 20 2a 78 33 61 20 3d 20 61 72 72 61  .    *x3a = arra
27a40 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65  y;.  }.  /* Inse
27a50 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20  rt the new data 
27a60 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  */.  h = ph & (x
27a70 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  3a->size-1);.  n
27a80 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 78  p = &(x3a->tbl[x
27a90 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20  3a->count++]);. 
27aa0 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a   np->key = key;.
27ab0 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74    np->data = dat
27ac0 61 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e 68 74  a;.  if( x3a->ht
27ad0 5b 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b 68 5d  [h] ) x3a->ht[h]
27ae0 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e  ->from = &(np->n
27af0 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74  ext);.  np->next
27b00 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x3a->ht[h];. 
27b10 20 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70   x3a->ht[h] = np
27b20 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26  ;.  np->from = &
27b30 28 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20  (x3a->ht[h]);.  
27b40 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20  return 1;.}../* 
27b50 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
27b60 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65   to data assigne
27b70 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b  d to the given k
27b80 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ey.  Return NULL
27b90 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b  .** if no such k
27ba0 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74  ey. */.struct st
27bb0 61 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28  ate *State_find(
27bc0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b  struct config *k
27bd0 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ey).{.  unsigned
27be0 20 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70   h;.  x3node *np
27bf0 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20  ;..  if( x3a==0 
27c00 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
27c10 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29  = statehash(key)
27c20 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29   & (x3a->size-1)
27c30 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74  ;.  np = x3a->ht
27c40 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
27c50 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74   ){.    if( stat
27c60 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79  ecmp(np->key,key
27c70 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
27c80 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
27c90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
27ca0 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
27cb0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e  .}../* Return an
27cc0 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
27cd0 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69  rs to all data i
27ce0 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  n the table..** 
27cf0 54 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74  The array is obt
27d00 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
27d10 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  c.  Return NULL 
27d20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  if memory alloca
27d30 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73  tion.** problems
27d40 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61  , or if the arra
27d50 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73  y is empty. */.s
27d60 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74  truct state **St
27d70 61 74 65 5f 61 72 72 61 79 6f 66 28 76 6f 69 64  ate_arrayof(void
27d80 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  ).{.  struct sta
27d90 74 65 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e  te **array;.  in
27da0 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 69  t i,arrSize;.  i
27db0 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75  f( x3a==0 ) retu
27dc0 72 6e 20 30 3b 0a 20 20 61 72 72 53 69 7a 65 20  rn 0;.  arrSize 
27dd0 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x3a->count;.  
27de0 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20  array = (struct 
27df0 73 74 61 74 65 20 2a 2a 29 63 61 6c 6c 6f 63 28  state **)calloc(
27e00 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28  arrSize, sizeof(
27e10 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 29  struct state *))
27e20 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b  ;.  if( array ){
27e30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
27e40 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72  arrSize; i++) ar
27e50 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e 74 62  ray[i] = x3a->tb
27e60 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20  l[i].data;.  }. 
27e70 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d   return array;.}
27e80 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f 6e 66  ../* Hash a conf
27e90 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49  iguration */.PRI
27ea0 56 41 54 45 20 75 6e 73 69 67 6e 65 64 20 63 6f  VATE unsigned co
27eb0 6e 66 69 67 68 61 73 68 28 73 74 72 75 63 74 20  nfighash(struct 
27ec0 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20 20 75  config *a).{.  u
27ed0 6e 73 69 67 6e 65 64 20 68 3d 30 3b 0a 20 20 68  nsigned h=0;.  h
27ee0 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70   = h*571 + a->rp
27ef0 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e  ->index*37 + a->
27f00 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b  dot;.  return h;
27f10 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  .}../* There is 
27f20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
27f30 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
27f40 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
27f50 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20  .** associative 
27f60 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
27f70 34 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f  4"..*/.struct s_
27f80 78 34 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  x4 {.  int size;
27f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27fa0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
27fb0 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e  available slots.
27fc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
27fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27fe0 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77     Must be a pow
27ff0 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20  er of 2 greater 
28000 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20  than or */.     
28010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28020 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20       /*   equal 
28030 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  to 1 */.  int co
28040 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  unt;            
28050 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
28060 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66  urrently slots f
28070 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  illed */.  struc
28080 74 20 73 5f 78 34 6e 6f 64 65 20 2a 74 62 6c 3b  t s_x4node *tbl;
28090 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74    /* The data st
280a0 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73  ored here */.  s
280b0 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a  truct s_x4node *
280c0 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61  *ht;  /* Hash ta
280d0 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20  ble for lookups 
280e0 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  */.};../* There 
280f0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
28100 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
28110 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  e for every data
28120 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61   element.** in a
28130 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  n associative ar
28140 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 34 22  ray of type "x4"
28150 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
28160 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 7b 0a 20  uct s_x4node {. 
28170 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
28180 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  data;           
28190 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
281a0 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ta */.  struct s
281b0 5f 78 34 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20  _x4node *next;  
281c0 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77   /* Next entry w
281d0 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73  ith the same has
281e0 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  h */.  struct s_
281f0 78 34 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20  x4node **from;  
28200 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b  /* Previous link
28210 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a 2f   */.} x4node;../
28220 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  * There is only 
28230 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
28240 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68  the array, which
28250 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   is the followin
28260 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  g */.static stru
28270 63 74 20 73 5f 78 34 20 2a 78 34 61 3b 0a 0a 2f  ct s_x4 *x4a;../
28280 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
28290 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
282a0 61 79 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  ay */.void Confi
282b0 67 74 61 62 6c 65 5f 69 6e 69 74 28 76 6f 69 64  gtable_init(void
282c0 29 7b 0a 20 20 69 66 28 20 78 34 61 20 29 20 72  ){.  if( x4a ) r
282d0 65 74 75 72 6e 3b 0a 20 20 78 34 61 20 3d 20 28  eturn;.  x4a = (
282e0 73 74 72 75 63 74 20 73 5f 78 34 2a 29 6d 61 6c  struct s_x4*)mal
282f0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
28300 63 74 20 73 5f 78 34 29 20 29 3b 0a 20 20 69 66  ct s_x4) );.  if
28310 28 20 78 34 61 20 29 7b 0a 20 20 20 20 78 34 61  ( x4a ){.    x4a
28320 2d 3e 73 69 7a 65 20 3d 20 36 34 3b 0a 20 20 20  ->size = 64;.   
28330 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b   x4a->count = 0;
28340 0a 20 20 20 20 78 34 61 2d 3e 74 62 6c 20 3d 20  .    x4a->tbl = 
28350 28 78 34 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28  (x4node*)calloc(
28360 36 34 2c 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64  64, sizeof(x4nod
28370 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f  e) + sizeof(x4no
28380 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 78  de*));.    if( x
28390 34 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20  4a->tbl==0 ){.  
283a0 20 20 20 20 66 72 65 65 28 78 34 61 29 3b 0a 20      free(x4a);. 
283b0 20 20 20 20 20 78 34 61 20 3d 20 30 3b 0a 20 20       x4a = 0;.  
283c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
283d0 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 34 61 2d  nt i;.      x4a-
283e0 3e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29  >ht = (x4node**)
283f0 26 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d 29 3b  &(x4a->tbl[64]);
28400 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
28410 69 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61 2d 3e  i<64; i++) x4a->
28420 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ht[i] = 0;.    }
28430 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74  .  }.}./* Insert
28440 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
28450 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52  to the array.  R
28460 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75  eturn TRUE if su
28470 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69  ccessful..** Pri
28480 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65  or data with the
28490 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54   same key is NOT
284a0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a   overwritten */.
284b0 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  int Configtable_
284c0 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 63 6f  insert(struct co
284d0 6e 66 69 67 20 2a 64 61 74 61 29 0a 7b 0a 20 20  nfig *data).{.  
284e0 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75 6e  x4node *np;.  un
284f0 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73 69  signed h;.  unsi
28500 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66 28 20  gned ph;..  if( 
28510 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x4a==0 ) return 
28520 30 3b 0a 20 20 70 68 20 3d 20 63 6f 6e 66 69 67  0;.  ph = config
28530 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20  hash(data);.  h 
28540 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a  = ph & (x4a->siz
28550 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61  e-1);.  np = x4a
28560 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
28570 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
28580 43 6f 6e 66 69 67 63 6d 70 28 28 63 6f 6e 73 74  Configcmp((const
28590 20 63 68 61 72 20 2a 29 20 6e 70 2d 3e 64 61 74   char *) np->dat
285a0 61 2c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  a,(const char *)
285b0 20 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20   data)==0 ){.   
285c0 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
285d0 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  g entry with the
285e0 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75   same key is fou
285f0 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  nd. */.      /* 
28600 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65  Fail because ove
28610 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c  rwrite is not al
28620 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lows. */.      r
28630 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
28640 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
28650 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 34 61 2d  ;.  }.  if( x4a-
28660 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a  >count>=x4a->siz
28670 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  e ){.    /* Need
28680 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
28690 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a  h table bigger *
286a0 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61 72 72 53  /.    int i,arrS
286b0 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ize;.    struct 
286c0 73 5f 78 34 20 61 72 72 61 79 3b 0a 20 20 20 20  s_x4 array;.    
286d0 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 61 72 72  array.size = arr
286e0 53 69 7a 65 20 3d 20 78 34 61 2d 3e 73 69 7a 65  Size = x4a->size
286f0 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f  *2;.    array.co
28700 75 6e 74 20 3d 20 78 34 61 2d 3e 63 6f 75 6e 74  unt = x4a->count
28710 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20  ;.    array.tbl 
28720 3d 20 28 78 34 6e 6f 64 65 2a 29 63 61 6c 6c 6f  = (x4node*)callo
28730 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f  c(arrSize, sizeo
28740 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x4node) + size
28750 6f 66 28 78 34 6e 6f 64 65 2a 29 29 3b 0a 20 20  of(x4node*));.  
28760 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d    if( array.tbl=
28770 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
28780 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d  /* Fail due to m
28790 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f  alloc failure */
287a0 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20  .    array.ht = 
287b0 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61  (x4node**)&(arra
287c0 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d 29 3b  y.tbl[arrSize]);
287d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
287e0 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72  arrSize; i++) ar
287f0 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  ray.ht[i] = 0;. 
28800 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34     for(i=0; i<x4
28810 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a  a->count; i++){.
28820 20 20 20 20 20 20 78 34 6e 6f 64 65 20 2a 6f 6c        x4node *ol
28830 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20  dnp, *newnp;.   
28840 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 34 61     oldnp = &(x4a
28850 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  ->tbl[i]);.     
28860 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28   h = confighash(
28870 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20 28  oldnp->data) & (
28880 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20  arrSize-1);.    
28890 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61    newnp = &(arra
288a0 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  y.tbl[i]);.     
288b0 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d   if( array.ht[h]
288c0 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e   ) array.ht[h]->
288d0 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e  from = &(newnp->
288e0 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77  next);.      new
288f0 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79  np->next = array
28900 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65  .ht[h];.      ne
28910 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e  wnp->data = oldn
28920 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e  p->data;.      n
28930 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61  ewnp->from = &(a
28940 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20  rray.ht[h]);.   
28950 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d     array.ht[h] =
28960 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20   newnp;.    }.  
28970 20 20 66 72 65 65 28 78 34 61 2d 3e 74 62 6c 29    free(x4a->tbl)
28980 3b 0a 20 20 20 20 2a 78 34 61 20 3d 20 61 72 72  ;.    *x4a = arr
28990 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73  ay;.  }.  /* Ins
289a0 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61  ert the new data
289b0 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28   */.  h = ph & (
289c0 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x4a->size-1);.  
289d0 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b  np = &(x4a->tbl[
289e0 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a  x4a->count++]);.
289f0 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74    np->data = dat
28a00 61 3b 0a 20 20 69 66 28 20 78 34 61 2d 3e 68 74  a;.  if( x4a->ht
28a10 5b 68 5d 20 29 20 78 34 61 2d 3e 68 74 5b 68 5d  [h] ) x4a->ht[h]
28a20 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e  ->from = &(np->n
28a30 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74  ext);.  np->next
28a40 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x4a->ht[h];. 
28a50 20 78 34 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70   x4a->ht[h] = np
28a60 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26  ;.  np->from = &
28a70 28 78 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20  (x4a->ht[h]);.  
28a80 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20  return 1;.}../* 
28a90 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
28aa0 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65   to data assigne
28ab0 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b  d to the given k
28ac0 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ey.  Return NULL
28ad0 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b  .** if no such k
28ae0 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ey. */.struct co
28af0 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c  nfig *Configtabl
28b00 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f  e_find(struct co
28b10 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 69  nfig *key).{.  i
28b20 6e 74 20 68 3b 0a 20 20 78 34 6e 6f 64 65 20 2a  nt h;.  x4node *
28b30 6e 70 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d  np;..  if( x4a==
28b40 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
28b50 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6b  h = confighash(k
28b60 65 79 29 20 26 20 28 78 34 61 2d 3e 73 69 7a 65  ey) & (x4a->size
28b70 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d  -1);.  np = x4a-
28b80 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
28b90 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43   np ){.    if( C
28ba0 6f 6e 66 69 67 63 6d 70 28 28 63 6f 6e 73 74 20  onfigcmp((const 
28bb0 63 68 61 72 20 2a 29 20 6e 70 2d 3e 64 61 74 61  char *) np->data
28bc0 2c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20  ,(const char *) 
28bd0 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  key)==0 ) break;
28be0 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
28bf0 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
28c00 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a   np ? np->data :
28c10 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f 76 65   0;.}../* Remove
28c20 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74   all data from t
28c30 68 65 20 74 61 62 6c 65 2e 20 20 50 61 73 73 20  he table.  Pass 
28c40 65 61 63 68 20 64 61 74 61 20 74 6f 20 74 68 65  each data to the
28c50 20 66 75 6e 63 74 69 6f 6e 20 22 66 22 0a 2a 2a   function "f".**
28c60 20 61 73 20 69 74 20 69 73 20 72 65 6d 6f 76 65   as it is remove
28c70 64 2e 20 20 28 22 66 22 20 6d 61 79 20 62 65 20  d.  ("f" may be 
28c80 6e 75 6c 6c 20 74 6f 20 61 76 6f 69 64 20 74 68  null to avoid th
28c90 69 73 20 73 74 65 70 2e 29 20 2a 2f 0a 76 6f 69  is step.) */.voi
28ca0 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c  d Configtable_cl
28cb0 65 61 72 28 69 6e 74 28 2a 66 29 28 73 74 72 75  ear(int(*f)(stru
28cc0 63 74 20 63 6f 6e 66 69 67 20 2a 29 29 0a 7b 0a  ct config *)).{.
28cd0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 78    int i;.  if( x
28ce0 34 61 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e 63 6f  4a==0 || x4a->co
28cf0 75 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  unt==0 ) return;
28d00 0a 20 20 69 66 28 20 66 20 29 20 66 6f 72 28 69  .  if( f ) for(i
28d10 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74  =0; i<x4a->count
28d20 3b 20 69 2b 2b 29 20 28 2a 66 29 28 78 34 61 2d  ; i++) (*f)(x4a-
28d30 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 29 3b 0a 20  >tbl[i].data);. 
28d40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d   for(i=0; i<x4a-
28d50 3e 73 69 7a 65 3b 20 69 2b 2b 29 20 78 34 61 2d  >size; i++) x4a-
28d60 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 78 34  >ht[i] = 0;.  x4
28d70 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
28d80 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.