/ Hex Artifact Content
Login

Artifact b622032dd14dc1315fedb81d73f4658354329fca:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0190: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
01a0: 0a 23 64 65 66 69 6e 65 20 49 53 53 50 41 43 45  .#define ISSPACE
01b0: 28 58 29 20 69 73 73 70 61 63 65 28 28 75 6e 73  (X) isspace((uns
01c0: 69 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a  igned char)(X)).
01d0: 23 64 65 66 69 6e 65 20 49 53 44 49 47 49 54 28  #define ISDIGIT(
01e0: 58 29 20 69 73 64 69 67 69 74 28 28 75 6e 73 69  X) isdigit((unsi
01f0: 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23  gned char)(X)).#
0200: 64 65 66 69 6e 65 20 49 53 41 4c 4e 55 4d 28 58  define ISALNUM(X
0210: 29 20 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67  ) isalnum((unsig
0220: 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64  ned char)(X)).#d
0230: 65 66 69 6e 65 20 49 53 41 4c 50 48 41 28 58 29  efine ISALPHA(X)
0240: 20 69 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e   isalpha((unsign
0250: 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65  ed char)(X)).#de
0260: 66 69 6e 65 20 49 53 55 50 50 45 52 28 58 29 20  fine ISUPPER(X) 
0270: 69 73 75 70 70 65 72 28 28 75 6e 73 69 67 6e 65  isupper((unsigne
0280: 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65 66  d char)(X)).#def
0290: 69 6e 65 20 49 53 4c 4f 57 45 52 28 58 29 20 69  ine ISLOWER(X) i
02a0: 73 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65 64  slower((unsigned
02b0: 20 63 68 61 72 29 28 58 29 29 0a 0a 0a 23 69 66   char)(X))...#if
02c0: 6e 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  ndef __WIN32__.#
02d0: 20 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 57     if defined(_W
02e0: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
02f0: 28 57 49 4e 33 32 29 0a 23 20 20 20 20 20 20 20  (WIN32).#       
0300: 64 65 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f  define __WIN32__
0310: 0a 23 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  .#   endif.#endi
0320: 66 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33  f..#ifdef __WIN3
0330: 32 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c  2__.#ifdef __cpl
0340: 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20 22 43  usplus.extern "C
0350: 22 20 7b 0a 23 65 6e 64 69 66 0a 65 78 74 65 72  " {.#endif.exter
0360: 6e 20 69 6e 74 20 61 63 63 65 73 73 28 63 6f 6e  n int access(con
0370: 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 69  st char *path, i
0380: 6e 74 20 6d 6f 64 65 29 3b 0a 23 69 66 64 65 66  nt mode);.#ifdef
0390: 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 7d 0a 23   __cplusplus.}.#
03a0: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 6e 63  endif.#else.#inc
03b0: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
03c0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66 69  #endif../* #defi
03d0: 6e 65 20 50 52 49 56 41 54 45 20 73 74 61 74 69  ne PRIVATE stati
03e0: 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 49  c */.#define PRI
03f0: 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54 45 53  VATE..#ifdef TES
0400: 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48 53  T.#define MAXRHS
0410: 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20   5       /* Set 
0420: 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73 65 20  low to exercise 
0430: 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65 20 2a  exception code *
0440: 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  /.#else.#define 
0450: 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65 6e 64  MAXRHS 1000.#end
0460: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  if..static int s
0470: 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e  howPrecedenceCon
0480: 66 6c 69 63 74 20 3d 20 30 3b 0a 73 74 61 74 69  flict = 0;.stati
0490: 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 63 68  c char *msort(ch
04a0: 61 72 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 28 2a  ar*,char**,int(*
04b0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
04c0: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a  nst char*));../*
04d0: 0a 2a 2a 20 43 6f 6d 70 69 6c 65 72 73 20 61 72  .** Compilers ar
04e0: 65 20 67 65 74 74 69 6e 67 20 69 6e 63 72 65 61  e getting increa
04f0: 73 69 6e 67 6c 79 20 70 65 64 61 6e 74 69 63 20  singly pedantic 
0500: 61 62 6f 75 74 20 74 79 70 65 20 63 6f 6e 76 65  about type conve
0510: 72 73 69 6f 6e 73 0a 2a 2a 20 61 73 20 43 20 65  rsions.** as C e
0520: 76 6f 6c 76 65 73 20 65 76 65 72 20 63 6c 6f 73  volves ever clos
0530: 65 72 20 74 6f 20 41 64 61 2e 2e 2e 2e 20 20 54  er to Ada....  T
0540: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
0550: 65 20 6c 61 74 65 73 74 20 70 72 6f 62 6c 65 6d  e latest problem
0560: 73 0a 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20  s.** we have to 
0570: 64 65 66 69 6e 65 20 74 68 65 20 66 6f 6c 6c 6f  define the follo
0580: 77 69 6e 67 20 76 61 72 69 61 6e 74 20 6f 66 20  wing variant of 
0590: 73 74 72 6c 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65  strlen()..*/.#de
05a0: 66 69 6e 65 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  fine lemonStrlen
05b0: 28 58 29 20 20 20 28 28 69 6e 74 29 73 74 72 6c  (X)   ((int)strl
05c0: 65 6e 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f  en(X))../*.** Co
05d0: 6d 70 69 6c 65 72 73 20 61 72 65 20 73 74 61 72  mpilers are star
05e0: 74 69 6e 67 20 74 6f 20 63 6f 6d 70 6c 61 69 6e  ting to complain
05f0: 20 61 62 6f 75 74 20 74 68 65 20 75 73 65 20 6f   about the use o
0600: 66 20 73 70 72 69 6e 74 66 28 29 20 61 6e 64 20  f sprintf() and 
0610: 73 74 72 63 70 79 28 29 2c 0a 2a 2a 20 73 61 79  strcpy(),.** say
0620: 69 6e 67 20 74 68 65 79 20 61 72 65 20 75 6e 73  ing they are uns
0630: 61 66 65 2e 20 20 53 6f 20 77 65 20 64 65 66 69  afe.  So we defi
0640: 6e 65 20 6f 75 72 20 6f 77 6e 20 76 65 72 73 69  ne our own versi
0650: 6f 6e 73 20 6f 66 20 74 68 6f 73 65 20 72 6f 75  ons of those rou
0660: 74 69 6e 65 73 20 74 6f 6f 2e 0a 2a 2a 0a 2a 2a  tines too..**.**
0670: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
0680: 20 72 6f 75 74 69 6e 65 73 20 68 65 72 65 3a 20   routines here: 
0690: 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 29   lemon_sprintf()
06a0: 2c 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74 66  , lemon_vsprintf
06b0: 28 29 2c 20 61 6e 64 0a 2a 2a 20 6c 65 6d 6f 6e  (), and.** lemon
06c0: 5f 61 64 64 74 65 78 74 28 29 2e 20 54 68 65 20  _addtext(). The 
06d0: 66 69 72 73 74 20 74 77 6f 20 61 72 65 20 72 65  first two are re
06e0: 70 6c 61 63 65 6d 65 6e 74 73 20 66 6f 72 20 73  placements for s
06f0: 70 72 69 6e 74 66 28 29 20 61 6e 64 20 76 73 70  printf() and vsp
0700: 72 69 6e 74 66 28 29 2e 0a 2a 2a 20 54 68 65 20  rintf()..** The 
0710: 74 68 69 72 64 20 69 73 20 61 20 68 65 6c 70 65  third is a helpe
0720: 72 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 76 73  r routine for vs
0730: 6e 70 72 69 6e 74 66 28 29 20 74 68 61 74 20 61  nprintf() that a
0740: 64 64 73 20 74 65 78 74 73 20 74 6f 20 74 68 65  dds texts to the
0750: 20 65 6e 64 20 6f 66 20 61 0a 2a 2a 20 62 75 66   end of a.** buf
0760: 66 65 72 2c 20 6d 61 6b 69 6e 67 20 73 75 72 65  fer, making sure
0770: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 61   the buffer is a
0780: 6c 77 61 79 73 20 7a 65 72 6f 2d 74 65 72 6d 69  lways zero-termi
0790: 6e 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nated..**.** The
07a0: 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 65   string formatte
07b0: 72 20 69 73 20 61 20 6d 69 6e 69 6d 61 6c 20 73  r is a minimal s
07c0: 75 62 73 65 74 20 6f 66 20 73 74 64 6c 69 62 20  ubset of stdlib 
07d0: 73 70 72 69 6e 74 66 28 29 20 73 75 70 70 6f 72  sprintf() suppor
07e0: 74 69 6e 67 20 6f 6e 6c 79 0a 2a 2a 20 61 20 66  ting only.** a f
07f0: 65 77 20 73 69 6d 70 6c 79 20 63 6f 6e 76 65 72  ew simply conver
0800: 73 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 25  sions:.**.**   %
0810: 64 0a 2a 2a 20 20 20 25 73 0a 2a 2a 20 20 20 25  d.**   %s.**   %
0820: 2e 2a 73 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  .*s.**.*/.static
0830: 20 76 6f 69 64 20 6c 65 6d 6f 6e 5f 61 64 64 74   void lemon_addt
0840: 65 78 74 28 0a 20 20 63 68 61 72 20 2a 7a 42 75  ext(.  char *zBu
0850: 66 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  f,           /* 
0860: 54 68 65 20 62 75 66 66 65 72 20 74 6f 20 77 68  The buffer to wh
0870: 69 63 68 20 74 65 78 74 20 69 73 20 61 64 64 65  ich text is adde
0880: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 55 73  d */.  int *pnUs
0890: 65 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed,          /* 
08a0: 53 6c 6f 74 73 20 6f 66 20 74 68 65 20 62 75 66  Slots of the buf
08b0: 66 65 72 20 75 73 65 64 20 73 6f 20 66 61 72 20  fer used so far 
08c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
08d0: 2a 7a 49 6e 2c 20 20 20 20 20 20 2f 2a 20 54 65  *zIn,      /* Te
08e0: 78 74 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69  xt to add */.  i
08f0: 6e 74 20 6e 49 6e 2c 20 20 20 20 20 20 20 20 20  nt nIn,         
0900: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
0910: 20 74 65 78 74 20 74 6f 20 61 64 64 2e 20 20 2d   text to add.  -
0920: 31 20 74 6f 20 75 73 65 20 73 74 72 6c 65 6e 28  1 to use strlen(
0930: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 57 69 64 74  ) */.  int iWidt
0940: 68 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h            /* 
0950: 46 69 65 6c 64 20 77 69 64 74 68 2e 20 20 4e 65  Field width.  Ne
0960: 67 61 74 69 76 65 20 74 6f 20 6c 65 66 74 20 6a  gative to left j
0970: 75 73 74 69 66 79 20 2a 2f 0a 29 7b 0a 20 20 69  ustify */.){.  i
0980: 66 28 20 6e 49 6e 3c 30 20 29 20 66 6f 72 28 6e  f( nIn<0 ) for(n
0990: 49 6e 3d 30 3b 20 7a 49 6e 5b 6e 49 6e 5d 3b 20  In=0; zIn[nIn]; 
09a0: 6e 49 6e 2b 2b 29 7b 7d 0a 20 20 77 68 69 6c 65  nIn++){}.  while
09b0: 28 20 69 57 69 64 74 68 3e 6e 49 6e 20 29 7b 20  ( iWidth>nIn ){ 
09c0: 7a 42 75 66 5b 28 2a 70 6e 55 73 65 64 29 2b 2b  zBuf[(*pnUsed)++
09d0: 5d 20 3d 20 27 20 27 3b 20 69 57 69 64 74 68 2d  ] = ' '; iWidth-
09e0: 2d 3b 20 7d 0a 20 20 69 66 28 20 6e 49 6e 3d 3d  -; }.  if( nIn==
09f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  0 ) return;.  me
0a00: 6d 63 70 79 28 26 7a 42 75 66 5b 2a 70 6e 55 73  mcpy(&zBuf[*pnUs
0a10: 65 64 5d 2c 20 7a 49 6e 2c 20 6e 49 6e 29 3b 0a  ed], zIn, nIn);.
0a20: 20 20 2a 70 6e 55 73 65 64 20 2b 3d 20 6e 49 6e    *pnUsed += nIn
0a30: 3b 0a 20 20 77 68 69 6c 65 28 20 28 2d 69 57 69  ;.  while( (-iWi
0a40: 64 74 68 29 3e 6e 49 6e 20 29 7b 20 7a 42 75 66  dth)>nIn ){ zBuf
0a50: 5b 28 2a 70 6e 55 73 65 64 29 2b 2b 5d 20 3d 20  [(*pnUsed)++] = 
0a60: 27 20 27 3b 20 69 57 69 64 74 68 2b 2b 3b 20 7d  ' '; iWidth++; }
0a70: 0a 20 20 7a 42 75 66 5b 2a 70 6e 55 73 65 64 5d  .  zBuf[*pnUsed]
0a80: 20 3d 20 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69   = 0;.}.static i
0a90: 6e 74 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74  nt lemon_vsprint
0aa0: 66 28 63 68 61 72 20 2a 73 74 72 2c 20 63 6f 6e  f(char *str, con
0ab0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
0ac0: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
0ad0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 63 3b   int i, j, k, c;
0ae0: 0a 20 20 69 6e 74 20 6e 55 73 65 64 20 3d 20 30  .  int nUsed = 0
0af0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
0b00: 7a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  z;.  char zTemp[
0b10: 35 30 5d 3b 0a 20 20 73 74 72 5b 30 5d 20 3d 20  50];.  str[0] = 
0b20: 30 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  0;.  for(i=j=0; 
0b30: 28 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 69 5d 29  (c = zFormat[i])
0b40: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  !=0; i++){.    i
0b50: 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a 20 20 20  f( c=='%' ){.   
0b60: 20 20 20 69 6e 74 20 69 57 69 64 74 68 20 3d 20     int iWidth = 
0b70: 30 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  0;.      lemon_a
0b80: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0b90: 65 64 2c 20 26 7a 46 6f 72 6d 61 74 5b 6a 5d 2c  ed, &zFormat[j],
0ba0: 20 69 2d 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20   i-j, 0);.      
0bb0: 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 2b 2b 69 5d  c = zFormat[++i]
0bc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 44 49  ;.      if( ISDI
0bd0: 47 49 54 28 63 29 20 7c 7c 20 28 63 3d 3d 27 2d  GIT(c) || (c=='-
0be0: 27 20 26 26 20 49 53 44 49 47 49 54 28 7a 46 6f  ' && ISDIGIT(zFo
0bf0: 72 6d 61 74 5b 69 2b 31 5d 29 29 20 29 7b 0a 20  rmat[i+1])) ){. 
0c00: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2d         if( c=='-
0c10: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) i++;.       
0c20: 20 77 68 69 6c 65 28 20 49 53 44 49 47 49 54 28   while( ISDIGIT(
0c30: 7a 46 6f 72 6d 61 74 5b 69 5d 29 20 29 20 69 57  zFormat[i]) ) iW
0c40: 69 64 74 68 20 3d 20 69 57 69 64 74 68 2a 31 30  idth = iWidth*10
0c50: 20 2b 20 7a 46 6f 72 6d 61 74 5b 69 2b 2b 5d 20   + zFormat[i++] 
0c60: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69  - '0';.        i
0c70: 66 28 20 63 3d 3d 27 2d 27 20 29 20 69 57 69 64  f( c=='-' ) iWid
0c80: 74 68 20 3d 20 2d 69 57 69 64 74 68 3b 0a 20 20  th = -iWidth;.  
0c90: 20 20 20 20 20 20 63 20 3d 20 7a 46 6f 72 6d 61        c = zForma
0ca0: 74 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t[i];.      }.  
0cb0: 20 20 20 20 69 66 28 20 63 3d 3d 27 64 27 20 29      if( c=='d' )
0cc0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76 20  {.        int v 
0cd0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
0ce0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
0cf0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
0d00: 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74  lemon_addtext(st
0d10: 72 2c 20 26 6e 55 73 65 64 2c 20 22 2d 22 2c 20  r, &nUsed, "-", 
0d20: 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20 20 20  1, iWidth);.    
0d30: 20 20 20 20 20 20 76 20 3d 20 2d 76 3b 0a 20 20        v = -v;.  
0d40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
0d50: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  v==0 ){.        
0d60: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0d70: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 22 30 22  str, &nUsed, "0"
0d80: 2c 20 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20  , 1, iWidth);.  
0d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0da0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77  k = 0;.        w
0db0: 68 69 6c 65 28 20 76 3e 30 20 29 7b 0a 20 20 20  hile( v>0 ){.   
0dc0: 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20         k++;.    
0dd0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 73 69 7a 65        zTemp[size
0de0: 6f 66 28 7a 54 65 6d 70 29 2d 6b 5d 20 3d 20 28  of(zTemp)-k] = (
0df0: 76 25 31 30 29 20 2b 20 27 30 27 3b 0a 20 20 20  v%10) + '0';.   
0e00: 20 20 20 20 20 20 20 76 20 2f 3d 20 31 30 3b 0a         v /= 10;.
0e10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0e20: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0e30: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 26 7a 54  str, &nUsed, &zT
0e40: 65 6d 70 5b 73 69 7a 65 6f 66 28 7a 54 65 6d 70  emp[sizeof(zTemp
0e50: 29 2d 6b 5d 2c 20 6b 2c 20 69 57 69 64 74 68 29  )-k], k, iWidth)
0e60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
0e70: 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20  ( c=='s' ){.    
0e80: 20 20 20 20 7a 20 3d 20 76 61 5f 61 72 67 28 61      z = va_arg(a
0e90: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
0ea0: 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  .        lemon_a
0eb0: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0ec0: 65 64 2c 20 7a 2c 20 2d 31 2c 20 69 57 69 64 74  ed, z, -1, iWidt
0ed0: 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  h);.      }else 
0ee0: 69 66 28 20 63 3d 3d 27 2e 27 20 26 26 20 6d 65  if( c=='.' && me
0ef0: 6d 63 6d 70 28 26 7a 46 6f 72 6d 61 74 5b 69 5d  mcmp(&zFormat[i]
0f00: 2c 20 22 2e 2a 73 22 2c 20 33 29 3d 3d 30 20 29  , ".*s", 3)==0 )
0f10: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  {.        i += 2
0f20: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 76 61  ;.        k = va
0f30: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
0f40: 20 20 20 20 20 20 20 7a 20 3d 20 76 61 5f 61 72         z = va_ar
0f50: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
0f60: 2a 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f  *);.        lemo
0f70: 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20 26  n_addtext(str, &
0f80: 6e 55 73 65 64 2c 20 7a 2c 20 6b 2c 20 69 57 69  nUsed, z, k, iWi
0f90: 64 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dth);.      }els
0fa0: 65 20 69 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a  e if( c=='%' ){.
0fb0: 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64          lemon_ad
0fc0: 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65  dtext(str, &nUse
0fd0: 64 2c 20 22 25 22 2c 20 31 2c 20 30 29 3b 0a 20  d, "%", 1, 0);. 
0fe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
0ff0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1000: 72 72 2c 20 22 69 6c 6c 65 67 61 6c 20 66 6f 72  rr, "illegal for
1010: 6d 61 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  mat\n");.       
1020: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
1030: 7d 0a 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b  }.      j = i+1;
1040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 65 6d  .    }.  }.  lem
1050: 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20  on_addtext(str, 
1060: 26 6e 55 73 65 64 2c 20 26 7a 46 6f 72 6d 61 74  &nUsed, &zFormat
1070: 5b 6a 5d 2c 20 69 2d 6a 2c 20 30 29 3b 0a 20 20  [j], i-j, 0);.  
1080: 72 65 74 75 72 6e 20 6e 55 73 65 64 3b 0a 7d 0a  return nUsed;.}.
1090: 73 74 61 74 69 63 20 69 6e 74 20 6c 65 6d 6f 6e  static int lemon
10a0: 5f 73 70 72 69 6e 74 66 28 63 68 61 72 20 2a 73  _sprintf(char *s
10b0: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
10c0: 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  format, ...){.  
10d0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
10e0: 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  t rc;.  va_start
10f0: 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20  (ap, format);.  
1100: 72 63 20 3d 20 6c 65 6d 6f 6e 5f 76 73 70 72 69  rc = lemon_vspri
1110: 6e 74 66 28 73 74 72 2c 20 66 6f 72 6d 61 74 2c  ntf(str, format,
1120: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1130: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1140: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
1150: 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63 68 61 72  emon_strcpy(char
1160: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
1170: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
1180: 65 28 20 28 2a 28 64 65 73 74 2b 2b 29 20 3d 20  e( (*(dest++) = 
1190: 2a 28 73 72 63 2b 2b 29 29 21 3d 30 20 29 7b 7d  *(src++))!=0 ){}
11a0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
11b0: 65 6d 6f 6e 5f 73 74 72 63 61 74 28 63 68 61 72  emon_strcat(char
11c0: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
11d0: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
11e0: 65 28 20 2a 64 65 73 74 20 29 20 64 65 73 74 2b  e( *dest ) dest+
11f0: 2b 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70  +;.  lemon_strcp
1200: 79 28 64 65 73 74 2c 20 73 72 63 29 3b 0a 7d 0a  y(dest, src);.}.
1210: 0a 0a 2f 2a 20 61 20 66 65 77 20 66 6f 72 77 61  ../* a few forwa
1220: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e  rd declarations.
1230: 2e 2e 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c  .. */.struct rul
1240: 65 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 3b  e;.struct lemon;
1250: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 3b 0a  .struct action;.
1260: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
1270: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65  ction *Action_ne
1280: 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63 20  w(void);.static 
1290: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
12a0: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72 75 63  ction_sort(struc
12b0: 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a  t action *);../*
12c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
12d0: 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 68  he file "build.h
12e0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
12f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1300: 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e  ******/.void Fin
1310: 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73  dRulePrecedences
1320: 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 69 72  ();.void FindFir
1330: 73 74 53 65 74 73 28 29 3b 0a 76 6f 69 64 20 46  stSets();.void F
1340: 69 6e 64 53 74 61 74 65 73 28 29 3b 0a 76 6f 69  indStates();.voi
1350: 64 20 46 69 6e 64 4c 69 6e 6b 73 28 29 3b 0a 76  d FindLinks();.v
1360: 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65  oid FindFollowSe
1370: 74 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 41  ts();.void FindA
1380: 63 74 69 6f 6e 73 28 29 3b 0a 0a 2f 2a 2a 2a 2a  ctions();../****
1390: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
13a0: 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e  ile "configlist.
13b0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
13c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d0: 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  ****/.void Confi
13e0: 67 6c 69 73 74 5f 69 6e 69 74 28 76 6f 69 64 29  glist_init(void)
13f0: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
1400: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28  *Configlist_add(
1410: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69  struct rule *, i
1420: 6e 74 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  nt);.struct conf
1430: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61  ig *Configlist_a
1440: 64 64 62 61 73 69 73 28 73 74 72 75 63 74 20 72  ddbasis(struct r
1450: 75 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69  ule *, int);.voi
1460: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f  d Configlist_clo
1470: 73 75 72 65 28 73 74 72 75 63 74 20 6c 65 6d 6f  sure(struct lemo
1480: 6e 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  n *);.void Confi
1490: 67 6c 69 73 74 5f 73 6f 72 74 28 76 6f 69 64 29  glist_sort(void)
14a0: 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  ;.void Configlis
14b0: 74 5f 73 6f 72 74 62 61 73 69 73 28 76 6f 69 64  t_sortbasis(void
14c0: 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  );.struct config
14d0: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74   *Configlist_ret
14e0: 75 72 6e 28 76 6f 69 64 29 3b 0a 73 74 72 75 63  urn(void);.struc
14f0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
1500: 6c 69 73 74 5f 62 61 73 69 73 28 76 6f 69 64 29  list_basis(void)
1510: 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  ;.void Configlis
1520: 74 5f 65 61 74 28 73 74 72 75 63 74 20 63 6f 6e  t_eat(struct con
1530: 66 69 67 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e  fig *);.void Con
1540: 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 76 6f  figlist_reset(vo
1550: 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  id);../*********
1560: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
1570: 65 72 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  error.h" *******
1580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a0: 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28  /.void ErrorMsg(
15b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e  const char *, in
15c0: 74 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20  t,const char *, 
15d0: 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 20 46  ...);../****** F
15e0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70  rom the file "op
15f0: 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  tion.h" ********
1600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1620: 2a 2a 2f 0a 65 6e 75 6d 20 6f 70 74 69 6f 6e 5f  **/.enum option_
1630: 74 79 70 65 20 7b 20 4f 50 54 5f 46 4c 41 47 3d  type { OPT_FLAG=
1640: 31 2c 20 20 4f 50 54 5f 49 4e 54 2c 20 20 4f 50  1,  OPT_INT,  OP
1650: 54 5f 44 42 4c 2c 20 20 4f 50 54 5f 53 54 52 2c  T_DBL,  OPT_STR,
1660: 0a 20 20 20 20 20 20 20 20 20 4f 50 54 5f 46 46  .         OPT_FF
1670: 4c 41 47 2c 20 4f 50 54 5f 46 49 4e 54 2c 20 4f  LAG, OPT_FINT, O
1680: 50 54 5f 46 44 42 4c 2c 20 4f 50 54 5f 46 53 54  PT_FDBL, OPT_FST
1690: 52 7d 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70 74  R};.struct s_opt
16a0: 69 6f 6e 73 20 7b 0a 20 20 65 6e 75 6d 20 6f 70  ions {.  enum op
16b0: 74 69 6f 6e 5f 74 79 70 65 20 74 79 70 65 3b 0a  tion_type type;.
16c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 61    const char *la
16d0: 62 65 6c 3b 0a 20 20 63 68 61 72 20 2a 61 72 67  bel;.  char *arg
16e0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
16f0: 6d 65 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e 74 20  message;.};.int 
1700: 20 20 20 4f 70 74 49 6e 69 74 28 63 68 61 72 2a     OptInit(char*
1710: 2a 2c 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  *,struct s_optio
1720: 6e 73 2a 2c 46 49 4c 45 2a 29 3b 0a 69 6e 74 20  ns*,FILE*);.int 
1730: 20 20 20 4f 70 74 4e 41 72 67 73 28 76 6f 69 64     OptNArgs(void
1740: 29 3b 0a 63 68 61 72 20 20 2a 4f 70 74 41 72 67  );.char  *OptArg
1750: 28 69 6e 74 29 3b 0a 76 6f 69 64 20 20 20 4f 70  (int);.void   Op
1760: 74 45 72 72 28 69 6e 74 29 3b 0a 76 6f 69 64 20  tErr(int);.void 
1770: 20 20 4f 70 74 50 72 69 6e 74 28 76 6f 69 64 29    OptPrint(void)
1780: 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ;../******** Fro
1790: 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61 72 73  m the file "pars
17a0: 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.h" ***********
17b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
17d0: 76 6f 69 64 20 50 61 72 73 65 28 73 74 72 75 63  void Parse(struc
17e0: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 3b 0a  t lemon *lemp);.
17f0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  ./********* From
1800: 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b   the file "plink
1810: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
1820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72  ***********/.str
1840: 75 63 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b  uct plink *Plink
1850: 5f 6e 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64  _new(void);.void
1860: 20 50 6c 69 6e 6b 5f 61 64 64 28 73 74 72 75 63   Plink_add(struc
1870: 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75  t plink **, stru
1880: 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f  ct config *);.vo
1890: 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74  id Plink_copy(st
18a0: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73  ruct plink **, s
18b0: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b 0a  truct plink *);.
18c0: 76 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74  void Plink_delet
18d0: 65 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  e(struct plink *
18e0: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  );../********** 
18f0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72  From the file "r
1900: 65 70 6f 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  eport.h" *******
1910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1930: 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73 74 72  void Reprint(str
1940: 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f  uct lemon *);.vo
1950: 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28  id ReportOutput(
1960: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b  struct lemon *);
1970: 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c  .void ReportTabl
1980: 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  e(struct lemon *
1990: 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20 52 65 70  , int);.void Rep
19a0: 6f 72 74 48 65 61 64 65 72 28 73 74 72 75 63 74  ortHeader(struct
19b0: 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20   lemon *);.void 
19c0: 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28 73  CompressTables(s
19d0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a  truct lemon *);.
19e0: 76 6f 69 64 20 52 65 73 6f 72 74 53 74 61 74 65  void ResortState
19f0: 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
1a00: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  );../********** 
1a10: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73  From the file "s
1a20: 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  et.h" **********
1a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1a50: 76 6f 69 64 20 20 53 65 74 53 69 7a 65 28 69 6e  void  SetSize(in
1a60: 74 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  t);             
1a70: 2f 2a 20 41 6c 6c 20 73 65 74 73 20 77 69 6c 6c  /* All sets will
1a80: 20 62 65 20 6f 66 20 73 69 7a 65 20 4e 20 2a 2f   be of size N */
1a90: 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f  .char *SetNew(vo
1aa0: 69 64 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  id);            
1ab0: 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 65 74 20     /* A new set 
1ac0: 66 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e 4e  for element 0..N
1ad0: 20 2a 2f 0a 76 6f 69 64 20 20 53 65 74 46 72 65   */.void  SetFre
1ae0: 65 28 63 68 61 72 2a 29 3b 20 20 20 20 20 20 20  e(char*);       
1af0: 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63        /* Dealloc
1b00: 61 74 65 20 61 20 73 65 74 20 2a 2f 0a 69 6e 74  ate a set */.int
1b10: 20 53 65 74 41 64 64 28 63 68 61 72 2a 2c 69 6e   SetAdd(char*,in
1b20: 74 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  t);            /
1b30: 2a 20 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f  * Add element to
1b40: 20 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65   a set */.int Se
1b50: 74 55 6e 69 6f 6e 28 63 68 61 72 20 2a 2c 63 68  tUnion(char *,ch
1b60: 61 72 20 2a 29 3b 20 20 20 20 2f 2a 20 41 20 3c  ar *);    /* A <
1b70: 2d 20 41 20 55 20 42 2c 20 74 68 72 75 20 65 6c  - A U B, thru el
1b80: 65 6d 65 6e 74 20 4e 20 2a 2f 0a 23 64 65 66 69  ement N */.#defi
1b90: 6e 65 20 53 65 74 46 69 6e 64 28 58 2c 59 29 20  ne SetFind(X,Y) 
1ba0: 28 58 5b 59 5d 29 20 20 20 20 20 20 20 2f 2a 20  (X[Y])       /* 
1bb0: 54 72 75 65 20 69 66 20 59 20 69 73 20 69 6e 20  True if Y is in 
1bc0: 73 65 74 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  set X */../*****
1bd0: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
1be0: 69 6c 65 20 22 73 74 72 75 63 74 2e 68 22 20 2a  ile "struct.h" *
1bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c10: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ****/./*.** Prin
1c20: 63 69 70 61 6c 20 64 61 74 61 20 73 74 72 75 63  cipal data struc
1c30: 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 4c 45  tures for the LE
1c40: 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
1c50: 61 74 6f 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65  ator..*/..typede
1c60: 66 20 65 6e 75 6d 20 7b 4c 45 4d 4f 4e 5f 46 41  f enum {LEMON_FA
1c70: 4c 53 45 3d 30 2c 20 4c 45 4d 4f 4e 5f 54 52 55  LSE=0, LEMON_TRU
1c80: 45 7d 20 42 6f 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20  E} Boolean;../* 
1c90: 53 79 6d 62 6f 6c 73 20 28 74 65 72 6d 69 6e 61  Symbols (termina
1ca0: 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e  ls and nontermin
1cb0: 61 6c 73 29 20 6f 66 20 74 68 65 20 67 72 61 6d  als) of the gram
1cc0: 6d 61 72 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  mar are stored.*
1cd0: 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * in the followi
1ce0: 6e 67 3a 20 2a 2f 0a 65 6e 75 6d 20 73 79 6d 62  ng: */.enum symb
1cf0: 6f 6c 5f 74 79 70 65 20 7b 0a 20 20 54 45 52 4d  ol_type {.  TERM
1d00: 49 4e 41 4c 2c 0a 20 20 4e 4f 4e 54 45 52 4d 49  INAL,.  NONTERMI
1d10: 4e 41 4c 2c 0a 20 20 4d 55 4c 54 49 54 45 52 4d  NAL,.  MULTITERM
1d20: 49 4e 41 4c 0a 7d 3b 0a 65 6e 75 6d 20 65 5f 61  INAL.};.enum e_a
1d30: 73 73 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c  ssoc {.    LEFT,
1d40: 0a 20 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20  .    RIGHT,.    
1d50: 4e 4f 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 7d 3b  NONE,.    UNK.};
1d60: 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 7b  .struct symbol {
1d70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e  .  const char *n
1d80: 61 6d 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ame;        /* N
1d90: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 6d 62 6f  ame of the symbo
1da0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78  l */.  int index
1db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dc0: 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20  /* Index number 
1dd0: 66 6f 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20  for this symbol 
1de0: 2a 2f 0a 20 20 65 6e 75 6d 20 73 79 6d 62 6f 6c  */.  enum symbol
1df0: 5f 74 79 70 65 20 74 79 70 65 3b 20 20 20 2f 2a  _type type;   /*
1e00: 20 53 79 6d 62 6f 6c 73 20 61 72 65 20 61 6c 6c   Symbols are all
1e10: 20 65 69 74 68 65 72 20 54 45 52 4d 49 4e 41 4c   either TERMINAL
1e20: 53 20 6f 72 20 4e 54 73 20 2a 2f 0a 20 20 73 74  S or NTs */.  st
1e30: 72 75 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b  ruct rule *rule;
1e40: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64         /* Linked
1e50: 20 6c 69 73 74 20 6f 66 20 72 75 6c 65 73 20 6f   list of rules o
1e60: 66 20 74 68 69 73 20 28 69 66 20 61 6e 20 4e 54  f this (if an NT
1e70: 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  ) */.  struct sy
1e80: 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20  mbol *fallback; 
1e90: 2f 2a 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65  /* fallback toke
1ea0: 6e 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 74  n in case this t
1eb0: 6f 6b 65 6e 20 64 6f 65 73 6e 27 74 20 70 61 72  oken doesn't par
1ec0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63  se */.  int prec
1ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ee0: 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65 20 69   /* Precedence i
1ef0: 66 20 64 65 66 69 6e 65 64 20 28 2d 31 20 6f 74  f defined (-1 ot
1f00: 68 65 72 77 69 73 65 29 20 2a 2f 0a 20 20 65 6e  herwise) */.  en
1f10: 75 6d 20 65 5f 61 73 73 6f 63 20 61 73 73 6f 63  um e_assoc assoc
1f20: 3b 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69  ;      /* Associ
1f30: 61 74 69 76 69 74 79 20 69 66 20 70 72 65 63 65  ativity if prece
1f40: 64 65 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64  dence is defined
1f50: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73   */.  char *firs
1f60: 74 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  tset;          /
1f70: 2a 20 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20  * First-set for 
1f80: 61 6c 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69  all rules of thi
1f90: 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f  s symbol */.  Bo
1fa0: 6f 6c 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20  olean lambda;   
1fb0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1fc0: 66 20 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e  f NT and can gen
1fd0: 65 72 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73  erate an empty s
1fe0: 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 75  tring */.  int u
1ff0: 73 65 43 6e 74 3b 20 20 20 20 20 20 20 20 20 20  seCnt;          
2000: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2010: 20 74 69 6d 65 73 20 75 73 65 64 20 2a 2f 0a 20   times used */. 
2020: 20 63 68 61 72 20 2a 64 65 73 74 72 75 63 74 6f   char *destructo
2030: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64  r;        /* Cod
2040: 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
2050: 20 77 68 65 6e 65 76 65 72 20 74 68 69 73 20 73   whenever this s
2060: 79 6d 62 6f 6c 20 69 73 0a 20 20 20 20 20 20 20  ymbol is.       
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 20 20 2a 2a 20 70 6f 70 70 65 64 20 66 72      ** popped fr
2090: 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 64 75 72  om the stack dur
20a0: 69 6e 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73  ing error proces
20b0: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sing */.  int de
20c0: 73 74 4c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20  stLineno;       
20d0: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
20e0: 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 64  r for start of d
20f0: 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63  estructor */.  c
2100: 68 61 72 20 2a 64 61 74 61 74 79 70 65 3b 20 20  har *datatype;  
2110: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
2120: 61 74 61 20 74 79 70 65 20 6f 66 20 69 6e 66 6f  ata type of info
2130: 72 6d 61 74 69 6f 6e 20 68 65 6c 64 20 62 79 20  rmation held by 
2140: 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  this.           
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e 6c 79 20  ** object. Only 
2170: 75 73 65 64 20 69 66 20 74 79 70 65 3d 3d 4e 4f  used if type==NO
2180: 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a 20 20 69  NTERMINAL */.  i
2190: 6e 74 20 64 74 6e 75 6d 3b 20 20 20 20 20 20 20  nt dtnum;       
21a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
21b0: 61 74 61 20 74 79 70 65 20 6e 75 6d 62 65 72 2e  ata type number.
21c0: 20 20 49 6e 20 74 68 65 20 70 61 72 73 65 72 2c    In the parser,
21d0: 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 20 20 20 2a 2a 20 73 74 61 63 6b 20 69        ** stack i
2200: 73 20 61 20 75 6e 69 6f 6e 2e 20 20 54 68 65 20  s a union.  The 
2210: 2e 79 79 25 64 20 65 6c 65 6d 65 6e 74 20 6f 66  .yy%d element of
2220: 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 2a 2a 20 75 6e 69 6f 6e 20 69 73 20 74 68 65   ** union is the
2250: 20 63 6f 72 72 65 63 74 20 64 61 74 61 20 74 79   correct data ty
2260: 70 65 20 66 6f 72 20 74 68 69 73 20 6f 62 6a 65  pe for this obje
2270: 63 74 20 2a 2f 0a 20 20 2f 2a 20 54 68 65 20 66  ct */.  /* The f
2280: 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
2290: 61 72 65 20 75 73 65 64 20 62 79 20 4d 55 4c 54  are used by MULT
22a0: 49 54 45 52 4d 49 4e 41 4c 73 20 6f 6e 6c 79 20  ITERMINALs only 
22b0: 2a 2f 0a 20 20 69 6e 74 20 6e 73 75 62 73 79 6d  */.  int nsubsym
22c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
22d0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
22e0: 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 69  ituent symbols i
22f0: 6e 20 74 68 65 20 4d 55 4c 54 49 20 2a 2f 0a 20  n the MULTI */. 
2300: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
2310: 2a 73 75 62 73 79 6d 3b 20 20 2f 2a 20 41 72 72  *subsym;  /* Arr
2320: 61 79 20 6f 66 20 63 6f 6e 73 74 69 74 75 65 6e  ay of constituen
2330: 74 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 7d 3b 0a  t symbols */.};.
2340: 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64 75 63 74  ./* Each product
2350: 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74 68 65 20  ion rule in the 
2360: 67 72 61 6d 6d 61 72 20 69 73 20 73 74 6f 72 65  grammar is store
2370: 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d in the followi
2380: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
2390: 20 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c 65    */.struct rule
23a0: 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62   {.  struct symb
23b0: 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 2f 2a  ol *lhs;      /*
23c0: 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   Left-hand side 
23d0: 6f 66 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20  of the rule */. 
23e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 68 73   const char *lhs
23f0: 61 6c 69 61 73 3b 20 20 20 20 2f 2a 20 41 6c 69  alias;    /* Ali
2400: 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 28  as for the LHS (
2410: 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f  NULL if none) */
2420: 0a 20 20 69 6e 74 20 6c 68 73 53 74 61 72 74 3b  .  int lhsStart;
2430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2440: 72 75 65 20 69 66 20 6c 65 66 74 2d 68 61 6e 64  rue if left-hand
2450: 20 73 69 64 65 20 69 73 20 74 68 65 20 73 74 61   side is the sta
2460: 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69  rt symbol */.  i
2470: 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20 20 20 20  nt ruleline;    
2480: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
2490: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72  number for the r
24a0: 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68  ule */.  int nrh
24b0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
24c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
24d0: 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  HS symbols */.  
24e0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
24f0: 72 68 73 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rhs;     /* The 
2500: 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  RHS symbols */. 
2510: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 72 68   const char **rh
2520: 73 61 6c 69 61 73 3b 20 20 20 2f 2a 20 41 6e 20  salias;   /* An 
2530: 61 6c 69 61 73 20 66 6f 72 20 65 61 63 68 20 52  alias for each R
2540: 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55 4c 4c 20  HS symbol (NULL 
2550: 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e  if none) */.  in
2560: 74 20 6c 69 6e 65 3b 20 20 20 20 20 20 20 20 20  t line;         
2570: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
2580: 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20 63  umber at which c
2590: 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20  ode begins */.  
25a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65  const char *code
25b0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
25c0: 63 6f 64 65 20 65 78 65 63 75 74 65 64 20 77 68  code executed wh
25d0: 65 6e 20 74 68 69 73 20 72 75 6c 65 20 69 73 20  en this rule is 
25e0: 72 65 64 75 63 65 64 20 2a 2f 0a 20 20 63 6f 6e  reduced */.  con
25f0: 73 74 20 63 68 61 72 20 2a 63 6f 64 65 50 72 65  st char *codePre
2600: 66 69 78 3b 20 20 2f 2a 20 53 65 74 75 70 20 63  fix;  /* Setup c
2610: 6f 64 65 20 62 65 66 6f 72 65 20 63 6f 64 65 5b  ode before code[
2620: 5d 20 61 62 6f 76 65 20 2a 2f 0a 20 20 63 6f 6e  ] above */.  con
2630: 73 74 20 63 68 61 72 20 2a 63 6f 64 65 53 75 66  st char *codeSuf
2640: 66 69 78 3b 20 20 2f 2a 20 42 72 65 61 6b 64 6f  fix;  /* Breakdo
2650: 77 6e 20 63 6f 64 65 20 61 66 74 65 72 20 63 6f  wn code after co
2660: 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f 0a 20 20  de[] above */.  
2670: 69 6e 74 20 6e 6f 43 6f 64 65 3b 20 20 20 20 20  int noCode;     
2680: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2690: 20 69 66 20 74 68 69 73 20 72 75 6c 65 20 68 61   if this rule ha
26a0: 73 20 6e 6f 20 61 73 73 6f 63 69 61 74 65 64 20  s no associated 
26b0: 43 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  C code */.  int 
26c0: 63 6f 64 65 45 6d 69 74 74 65 64 3b 20 20 20 20  codeEmitted;    
26d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
26e0: 74 68 65 20 63 6f 64 65 20 68 61 73 20 62 65 65  the code has bee
26f0: 6e 20 65 6d 69 74 74 65 64 20 61 6c 72 65 61 64  n emitted alread
2700: 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  y */.  struct sy
2710: 6d 62 6f 6c 20 2a 70 72 65 63 73 79 6d 3b 20 20  mbol *precsym;  
2720: 2f 2a 20 50 72 65 63 65 64 65 6e 63 65 20 73 79  /* Precedence sy
2730: 6d 62 6f 6c 20 66 6f 72 20 74 68 69 73 20 72 75  mbol for this ru
2740: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65  le */.  int inde
2750: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
2760: 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6e 75 6d   /* An index num
2770: 62 65 72 20 66 6f 72 20 74 68 69 73 20 72 75 6c  ber for this rul
2780: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 75 6c 65  e */.  int iRule
2790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27a0: 2f 2a 20 52 75 6c 65 20 6e 75 6d 62 65 72 20 61  /* Rule number a
27b0: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 67 65  s used in the ge
27c0: 6e 65 72 61 74 65 64 20 74 61 62 6c 65 73 20 2a  nerated tables *
27d0: 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 63 61 6e 52  /.  Boolean canR
27e0: 65 64 75 63 65 3b 20 20 20 20 20 20 20 2f 2a 20  educe;       /* 
27f0: 54 72 75 65 20 69 66 20 74 68 69 73 20 72 75 6c  True if this rul
2800: 65 20 69 73 20 65 76 65 72 20 72 65 64 75 63 65  e is ever reduce
2810: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  d */.  struct ru
2820: 6c 65 20 2a 6e 65 78 74 6c 68 73 3b 20 20 20 20  le *nextlhs;    
2830: 2f 2a 20 4e 65 78 74 20 72 75 6c 65 20 77 69 74  /* Next rule wit
2840: 68 20 74 68 65 20 73 61 6d 65 20 4c 48 53 20 2a  h the same LHS *
2850: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
2860: 2a 6e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20  *next;       /* 
2870: 4e 65 78 74 20 72 75 6c 65 20 69 6e 20 74 68 65  Next rule in the
2880: 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 2a 2f 0a   global list */.
2890: 7d 3b 0a 0a 2f 2a 20 41 20 63 6f 6e 66 69 67 75  };../* A configu
28a0: 72 61 74 69 6f 6e 20 69 73 20 61 20 70 72 6f 64  ration is a prod
28b0: 75 63 74 69 6f 6e 20 72 75 6c 65 20 6f 66 20 74  uction rule of t
28c0: 68 65 20 67 72 61 6d 6d 61 72 20 74 6f 67 65 74  he grammar toget
28d0: 68 65 72 20 77 69 74 68 0a 2a 2a 20 61 20 6d 61  her with.** a ma
28e0: 72 6b 20 28 64 6f 74 29 20 73 68 6f 77 69 6e 67  rk (dot) showing
28f0: 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 61   how much of tha
2900: 74 20 72 75 6c 65 20 68 61 73 20 62 65 65 6e 20  t rule has been 
2910: 70 72 6f 63 65 73 73 65 64 20 73 6f 20 66 61 72  processed so far
2920: 2e 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69  ..** Configurati
2930: 6f 6e 73 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  ons also contain
2940: 20 61 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 77 68   a follow-set wh
2950: 69 63 68 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ich is a list of
2960: 20 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d   terminal.** sym
2970: 62 6f 6c 73 20 77 68 69 63 68 20 61 72 65 20 61  bols which are a
2980: 6c 6c 6f 77 65 64 20 74 6f 20 69 6d 6d 65 64 69  llowed to immedi
2990: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65  ately follow the
29a0: 20 65 6e 64 20 6f 66 20 74 68 65 20 72 75 6c 65   end of the rule
29b0: 2e 0a 2a 2a 20 45 76 65 72 79 20 63 6f 6e 66 69  ..** Every confi
29c0: 67 75 72 61 74 69 6f 6e 20 69 73 20 72 65 63 6f  guration is reco
29d0: 72 64 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61  rded as an insta
29e0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
29f0: 77 69 6e 67 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66  wing: */.enum cf
2a00: 67 73 74 61 74 75 73 20 7b 0a 20 20 43 4f 4d 50  gstatus {.  COMP
2a10: 4c 45 54 45 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45  LETE,.  INCOMPLE
2a20: 54 45 0a 7d 3b 0a 73 74 72 75 63 74 20 63 6f 6e  TE.};.struct con
2a30: 66 69 67 20 7b 0a 20 20 73 74 72 75 63 74 20 72  fig {.  struct r
2a40: 75 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20 20  ule *rp;        
2a50: 20 2f 2a 20 54 68 65 20 72 75 6c 65 20 75 70 6f   /* The rule upo
2a60: 6e 20 77 68 69 63 68 20 74 68 65 20 63 6f 6e 66  n which the conf
2a70: 69 67 75 72 61 74 69 6f 6e 20 69 73 20 62 61 73  iguration is bas
2a80: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b  ed */.  int dot;
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20 70 6f   /* The parse po
2ab0: 69 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66  int */.  char *f
2ac0: 77 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ws;             
2ad0: 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20    /* Follow-set 
2ae0: 66 6f 72 20 74 68 69 73 20 63 6f 6e 66 69 67 75  for this configu
2af0: 72 61 74 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20  ration only */. 
2b00: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66   struct plink *f
2b10: 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c  plp;      /* Fol
2b20: 6c 6f 77 2d 73 65 74 20 66 6f 72 77 61 72 64 20  low-set forward 
2b30: 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
2b40: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c  s */.  struct pl
2b50: 69 6e 6b 20 2a 62 70 6c 70 3b 20 20 20 20 20 20  ink *bplp;      
2b60: 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61  /* Follow-set ba
2b70: 63 6b 77 61 72 64 73 20 70 72 6f 70 61 67 61 74  ckwards propagat
2b80: 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73  ion links */.  s
2b90: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
2ba0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
2bb0: 65 72 20 74 6f 20 73 74 61 74 65 20 77 68 69 63  er to state whic
2bc0: 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20  h contains this 
2bd0: 2a 2f 0a 20 20 65 6e 75 6d 20 63 66 67 73 74 61  */.  enum cfgsta
2be0: 74 75 73 20 73 74 61 74 75 73 3b 20 20 20 2f 2a  tus status;   /*
2bf0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 66 6f 6c   used during fol
2c00: 6c 6f 77 73 65 74 20 61 6e 64 20 73 68 69 66 74  lowset and shift
2c10: 20 63 6f 6d 70 75 74 61 74 69 6f 6e 73 20 2a 2f   computations */
2c20: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
2c30: 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e   *next;     /* N
2c40: 65 78 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ext configuratio
2c50: 6e 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 2a  n in the state *
2c60: 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  /.  struct confi
2c70: 67 20 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20  g *bp;       /* 
2c80: 54 68 65 20 6e 65 78 74 20 62 61 73 69 73 20 63  The next basis c
2c90: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a  onfiguration */.
2ca0: 7d 3b 0a 0a 65 6e 75 6d 20 65 5f 61 63 74 69 6f  };..enum e_actio
2cb0: 6e 20 7b 0a 20 20 53 48 49 46 54 2c 0a 20 20 41  n {.  SHIFT,.  A
2cc0: 43 43 45 50 54 2c 0a 20 20 52 45 44 55 43 45 2c  CCEPT,.  REDUCE,
2cd0: 0a 20 20 45 52 52 4f 52 2c 0a 20 20 53 53 43 4f  .  ERROR,.  SSCO
2ce0: 4e 46 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20  NFLICT,         
2cf0: 20 20 20 20 20 2f 2a 20 41 20 73 68 69 66 74 2f       /* A shift/
2d00: 73 68 69 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a  shift conflict *
2d10: 2f 0a 20 20 53 52 43 4f 4e 46 4c 49 43 54 2c 20  /.  SRCONFLICT, 
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d30: 57 61 73 20 61 20 72 65 64 75 63 65 2c 20 62 75  Was a reduce, bu
2d40: 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66  t part of a conf
2d50: 6c 69 63 74 20 2a 2f 0a 20 20 52 52 43 4f 4e 46  lict */.  RRCONF
2d60: 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20  LICT,           
2d70: 20 20 20 2f 2a 20 57 61 73 20 61 20 72 65 64 75     /* Was a redu
2d80: 63 65 2c 20 62 75 74 20 70 61 72 74 20 6f 66 20  ce, but part of 
2d90: 61 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  a conflict */.  
2da0: 53 48 5f 52 45 53 4f 4c 56 45 44 2c 20 20 20 20  SH_RESOLVED,    
2db0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20           /* Was 
2dc0: 61 20 73 68 69 66 74 2e 20 20 50 72 65 63 65 64  a shift.  Preced
2dd0: 65 6e 63 65 20 72 65 73 6f 6c 76 65 64 20 63 6f  ence resolved co
2de0: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 52 44 5f 52  nflict */.  RD_R
2df0: 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20  ESOLVED,        
2e00: 20 20 20 20 20 2f 2a 20 57 61 73 20 72 65 64 75       /* Was redu
2e10: 63 65 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20  ce.  Precedence 
2e20: 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63  resolved conflic
2e30: 74 20 2a 2f 0a 20 20 4e 4f 54 5f 55 53 45 44 2c  t */.  NOT_USED,
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 2f 2a 20 44 65 6c 65 74 65 64 20 62 79 20 63 6f  /* Deleted by co
2e60: 6d 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53  mpression */.  S
2e70: 48 49 46 54 52 45 44 55 43 45 20 20 20 20 20 20  HIFTREDUCE      
2e80: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 69 66 74          /* Shift
2e90: 20 66 69 72 73 74 2c 20 74 68 65 6e 20 72 65 64   first, then red
2ea0: 75 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76  uce */.};../* Ev
2eb0: 65 72 79 20 73 68 69 66 74 20 6f 72 20 72 65 64  ery shift or red
2ec0: 75 63 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  uce operation is
2ed0: 20 73 74 6f 72 65 64 20 61 73 20 6f 6e 65 20 6f   stored as one o
2ee0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2ef0: 2a 2f 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e  */.struct action
2f00: 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62   {.  struct symb
2f10: 6f 6c 20 2a 73 70 3b 20 20 20 20 20 20 20 2f 2a  ol *sp;       /*
2f20: 20 54 68 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 20   The look-ahead 
2f30: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d  symbol */.  enum
2f40: 20 65 5f 61 63 74 69 6f 6e 20 74 79 70 65 3b 0a   e_action type;.
2f50: 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74    union {.    st
2f60: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
2f70: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
2f80: 73 74 61 74 65 2c 20 69 66 20 61 20 73 68 69 66  state, if a shif
2f90: 74 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  t */.    struct 
2fa0: 72 75 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20  rule *rp;       
2fb0: 2f 2a 20 54 68 65 20 72 75 6c 65 2c 20 69 66 20  /* The rule, if 
2fc0: 61 20 72 65 64 75 63 65 20 2a 2f 0a 20 20 7d 20  a reduce */.  } 
2fd0: 78 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  x;.  struct acti
2fe0: 6f 6e 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a  on *next;     /*
2ff0: 20 4e 65 78 74 20 61 63 74 69 6f 6e 20 66 6f 72   Next action for
3000: 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20   this state */. 
3010: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
3020: 63 6f 6c 6c 69 64 65 3b 20 20 2f 2a 20 4e 65 78  collide;  /* Nex
3030: 74 20 61 63 74 69 6f 6e 20 77 69 74 68 20 74 68  t action with th
3040: 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 7d  e same hash */.}
3050: 3b 0a 0a 2f 2a 20 45 61 63 68 20 73 74 61 74 65  ;../* Each state
3060: 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
3070: 64 20 70 61 72 73 65 72 27 73 20 66 69 6e 69 74  d parser's finit
3080: 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 0a  e state machine.
3090: 2a 2a 20 69 73 20 65 6e 63 6f 64 65 64 20 61 73  ** is encoded as
30a0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
30b0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
30c0: 72 75 63 74 75 72 65 2e 20 2a 2f 0a 73 74 72 75  ructure. */.stru
30d0: 63 74 20 73 74 61 74 65 20 7b 0a 20 20 73 74 72  ct state {.  str
30e0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 70 3b 20  uct config *bp; 
30f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 61 73        /* The bas
3100: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
3110: 73 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  s for this state
3120: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
3130: 66 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f  fig *cfp;      /
3140: 2a 20 41 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74  * All configurat
3150: 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 73 65 74  ions in this set
3160: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 61 74 65 6e   */.  int staten
3170: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  um;            /
3180: 2a 20 53 65 71 75 65 6e 74 69 61 6c 20 6e 75 6d  * Sequential num
3190: 62 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61  ber for this sta
31a0: 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61  te */.  struct a
31b0: 63 74 69 6f 6e 20 2a 61 70 3b 20 20 20 20 20 20  ction *ap;      
31c0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 63 74 69   /* List of acti
31d0: 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74 61  ons for this sta
31e0: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6b 6e  te */.  int nTkn
31f0: 41 63 74 2c 20 6e 4e 74 41 63 74 3b 20 20 20 20  Act, nNtAct;    
3200: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63   /* Number of ac
3210: 74 69 6f 6e 73 20 6f 6e 20 74 65 72 6d 69 6e 61  tions on termina
3220: 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e  ls and nontermin
3230: 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6b  als */.  int iTk
3240: 6e 4f 66 73 74 2c 20 69 4e 74 4f 66 73 74 3b 20  nOfst, iNtOfst; 
3250: 20 20 2f 2a 20 79 79 5f 61 63 74 69 6f 6e 5b 5d    /* yy_action[]
3260: 20 6f 66 66 73 65 74 20 66 6f 72 20 74 65 72 6d   offset for term
3270: 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72  inals and nonter
3280: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 69 44 66 6c  ms */.  int iDfl
3290: 74 52 65 64 75 63 65 3b 20 20 20 20 20 20 20 20  tReduce;        
32a0: 20 2f 2a 20 44 65 66 61 75 6c 74 20 61 63 74 69   /* Default acti
32b0: 6f 6e 20 69 73 20 74 6f 20 52 45 44 55 43 45 20  on is to REDUCE 
32c0: 62 79 20 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a  by this rule */.
32d0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70    struct rule *p
32e0: 44 66 6c 74 52 65 64 75 63 65 3b 2f 2a 20 54 68  DfltReduce;/* Th
32f0: 65 20 64 65 66 61 75 6c 74 20 52 45 44 55 43 45  e default REDUCE
3300: 20 72 75 6c 65 2e 20 2a 2f 0a 20 20 69 6e 74 20   rule. */.  int 
3310: 61 75 74 6f 52 65 64 75 63 65 3b 20 20 20 20 20  autoReduce;     
3320: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3330: 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
3340: 72 65 64 75 63 65 20 73 74 61 74 65 20 2a 2f 0a  reduce state */.
3350: 7d 3b 0a 23 64 65 66 69 6e 65 20 4e 4f 5f 4f 46  };.#define NO_OF
3360: 46 53 45 54 20 28 2d 32 31 34 37 34 38 33 36 34  FSET (-214748364
3370: 37 29 0a 0a 2f 2a 20 41 20 66 6f 6c 6c 6f 77 73  7)../* A follows
3380: 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  et propagation l
3390: 69 6e 6b 20 69 6e 64 69 63 61 74 65 73 20 74 68  ink indicates th
33a0: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
33b0: 6f 66 20 6f 6e 65 0a 2a 2a 20 63 6f 6e 66 69 67  of one.** config
33c0: 75 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 73 65  uration followse
33d0: 74 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f 70  t should be prop
33e0: 61 67 61 74 65 64 20 74 6f 20 61 6e 6f 74 68 65  agated to anothe
33f0: 72 20 77 68 65 6e 65 76 65 72 0a 2a 2a 20 74 68  r whenever.** th
3400: 65 20 66 69 72 73 74 20 63 68 61 6e 67 65 73 2e  e first changes.
3410: 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b   */.struct plink
3420: 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66   {.  struct conf
3430: 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a  ig *cfp;      /*
3440: 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   The configurati
3450: 6f 6e 20 74 6f 20 77 68 69 63 68 20 6c 69 6e 6b  on to which link
3460: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70  ed */.  struct p
3470: 6c 69 6e 6b 20 2a 6e 65 78 74 3b 20 20 20 20 20  link *next;     
3480: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 72 6f   /* The next pro
3490: 70 61 67 61 74 65 20 6c 69 6e 6b 20 2a 2f 0a 7d  pagate link */.}
34a0: 3b 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20  ;../* The state 
34b0: 76 65 63 74 6f 72 20 66 6f 72 20 74 68 65 20 65  vector for the e
34c0: 6e 74 69 72 65 20 70 61 72 73 65 72 20 67 65 6e  ntire parser gen
34d0: 65 72 61 74 6f 72 20 69 73 20 72 65 63 6f 72 64  erator is record
34e0: 65 64 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73  ed as.** follows
34f0: 2e 20 20 28 4c 45 4d 4f 4e 20 75 73 65 73 20 6e  .  (LEMON uses n
3500: 6f 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  o global variabl
3510: 65 73 20 61 6e 64 20 6d 61 6b 65 73 20 6c 69 74  es and makes lit
3520: 74 6c 65 20 75 73 65 20 6f 66 0a 2a 2a 20 73 74  tle use of.** st
3530: 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 2e 20  atic variables. 
3540: 20 46 69 65 6c 64 73 20 69 6e 20 74 68 65 20 66   Fields in the f
3550: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
3560: 72 65 20 63 61 6e 20 62 65 20 74 68 6f 75 67 68  re can be though
3570: 74 0a 2a 2a 20 6f 66 20 61 73 20 62 65 67 69 6e  t.** of as begin
3580: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
3590: 73 20 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d  s in the program
35a0: 2e 29 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d  .) */.struct lem
35b0: 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74  on {.  struct st
35c0: 61 74 65 20 2a 2a 73 6f 72 74 65 64 3b 20 20 20  ate **sorted;   
35d0: 2f 2a 20 54 61 62 6c 65 20 6f 66 20 73 74 61 74  /* Table of stat
35e0: 65 73 20 73 6f 72 74 65 64 20 62 79 20 73 74 61  es sorted by sta
35f0: 74 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  te number */.  s
3600: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 75 6c 65  truct rule *rule
3610: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
3620: 6f 66 20 61 6c 6c 20 72 75 6c 65 73 20 2a 2f 0a  of all rules */.
3630: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 73    struct rule *s
3640: 74 61 72 74 52 75 6c 65 3b 20 20 2f 2a 20 46 69  tartRule;  /* Fi
3650: 72 73 74 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e  rst rule */.  in
3660: 74 20 6e 73 74 61 74 65 3b 20 20 20 20 20 20 20  t nstate;       
3670: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3680: 20 6f 66 20 73 74 61 74 65 73 20 2a 2f 0a 20 20   of states */.  
3690: 69 6e 74 20 6e 78 73 74 61 74 65 3b 20 20 20 20  int nxstate;    
36a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 73 74 61           /* nsta
36b0: 74 65 20 77 69 74 68 20 74 61 69 6c 20 64 65 67  te with tail deg
36c0: 65 6e 65 72 61 74 65 20 73 74 61 74 65 73 20 72  enerate states r
36d0: 65 6d 6f 76 65 64 20 2a 2f 0a 20 20 69 6e 74 20  emoved */.  int 
36e0: 6e 72 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20  nrule;          
36f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3700: 66 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74  f rules */.  int
3710: 20 6e 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20 20   nsymbol;       
3720: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3730: 6f 66 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20  of terminal and 
3740: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  nonterminal symb
3750: 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 74 65  ols */.  int nte
3760: 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  rminal;         
3770: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
3780: 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20  erminal symbols 
3790: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
37a0: 6f 6c 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20 2f 2a  ol **symbols; /*
37b0: 20 53 6f 72 74 65 64 20 61 72 72 61 79 20 6f 66   Sorted array of
37c0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 79 6d   pointers to sym
37d0: 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72  bols */.  int er
37e0: 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20  rorcnt;         
37f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3800: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 74 72 75  errors */.  stru
3810: 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79  ct symbol *errsy
3820: 6d 3b 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f  m;   /* The erro
3830: 72 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74  r symbol */.  st
3840: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 77 69 6c  ruct symbol *wil
3850: 64 63 61 72 64 3b 20 2f 2a 20 54 6f 6b 65 6e 20  dcard; /* Token 
3860: 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 6e 79  that matches any
3870: 74 68 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  thing */.  char 
3880: 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  *name;          
3890: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
38a0: 68 65 20 67 65 6e 65 72 61 74 65 64 20 70 61 72  he generated par
38b0: 73 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ser */.  char *a
38c0: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
38d0: 20 20 2f 2a 20 44 65 63 6c 61 72 61 74 69 6f 6e    /* Declaration
38e0: 20 6f 66 20 74 68 65 20 33 74 68 20 61 72 67 75   of the 3th argu
38f0: 6d 65 6e 74 20 74 6f 20 70 61 72 73 65 72 20 2a  ment to parser *
3900: 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 74  /.  char *tokent
3910: 79 70 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ype;         /* 
3920: 54 79 70 65 20 6f 66 20 74 65 72 6d 69 6e 61 6c  Type of terminal
3930: 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20   symbols in the 
3940: 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a  parser stack */.
3950: 20 20 63 68 61 72 20 2a 76 61 72 74 79 70 65 3b    char *vartype;
3960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
3970: 65 20 64 65 66 61 75 6c 74 20 74 79 70 65 20 6f  e default type o
3980: 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 73  f non-terminal s
3990: 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72  ymbols */.  char
39a0: 20 2a 73 74 61 72 74 3b 20 20 20 20 20 20 20 20   *start;        
39b0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
39c0: 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c  the start symbol
39d0: 20 66 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72   for the grammar
39e0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 63   */.  char *stac
39f0: 6b 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f  ksize;         /
3a00: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61  * Size of the pa
3a10: 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20  rser stack */.  
3a20: 63 68 61 72 20 2a 69 6e 63 6c 75 64 65 3b 20 20  char *include;  
3a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
3a40: 20 74 6f 20 70 75 74 20 61 74 20 74 68 65 20 73   to put at the s
3a50: 74 61 72 74 20 6f 66 20 74 68 65 20 43 20 66 69  tart of the C fi
3a60: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 72  le */.  char *er
3a70: 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ror;            
3a80: 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63   /* Code to exec
3a90: 75 74 65 20 77 68 65 6e 20 61 6e 20 65 72 72 6f  ute when an erro
3aa0: 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 63  r is seen */.  c
3ab0: 68 61 72 20 2a 6f 76 65 72 66 6c 6f 77 3b 20 20  har *overflow;  
3ac0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
3ad0: 74 6f 20 65 78 65 63 75 74 65 20 6f 6e 20 61 20  to execute on a 
3ae0: 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 20 2a  stack overflow *
3af0: 2f 0a 20 20 63 68 61 72 20 2a 66 61 69 6c 75 72  /.  char *failur
3b00: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3b10: 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20  Code to execute 
3b20: 6f 6e 20 70 61 72 73 65 72 20 66 61 69 6c 75 72  on parser failur
3b30: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 63 63  e */.  char *acc
3b40: 65 70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ept;            
3b50: 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75  /* Code to execu
3b60: 74 65 20 77 68 65 6e 20 74 68 65 20 70 61 72 73  te when the pars
3b70: 65 72 20 65 78 63 65 70 74 73 20 2a 2f 0a 20 20  er excepts */.  
3b80: 63 68 61 72 20 2a 65 78 74 72 61 63 6f 64 65 3b  char *extracode;
3b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
3ba0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
3bb0: 20 67 65 6e 65 72 61 74 65 64 20 66 69 6c 65 20   generated file 
3bc0: 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e  */.  char *token
3bd0: 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  dest;         /*
3be0: 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65   Code to execute
3bf0: 20 74 6f 20 64 65 73 74 72 6f 79 20 74 6f 6b 65   to destroy toke
3c00: 6e 20 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72  n data */.  char
3c10: 20 2a 76 61 72 64 65 73 74 3b 20 20 20 20 20 20   *vardest;      
3c20: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 66 6f 72       /* Code for
3c30: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6e 6f 6e   the default non
3c40: 2d 74 65 72 6d 69 6e 61 6c 20 64 65 73 74 72 75  -terminal destru
3c50: 63 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ctor */.  char *
3c60: 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  filename;       
3c70: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3c80: 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
3c90: 20 20 63 68 61 72 20 2a 6f 75 74 6e 61 6d 65 3b    char *outname;
3ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
3cb0: 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  me of the curren
3cc0: 74 20 6f 75 74 70 75 74 20 66 69 6c 65 20 2a 2f  t output file */
3cd0: 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 70 72  .  char *tokenpr
3ce0: 65 66 69 78 3b 20 20 20 20 20 20 20 2f 2a 20 41  efix;       /* A
3cf0: 20 70 72 65 66 69 78 20 61 64 64 65 64 20 74 6f   prefix added to
3d00: 20 74 6f 6b 65 6e 20 6e 61 6d 65 73 20 69 6e 20   token names in 
3d10: 74 68 65 20 2e 68 20 66 69 6c 65 20 2a 2f 0a 20  the .h file */. 
3d20: 20 69 6e 74 20 6e 63 6f 6e 66 6c 69 63 74 3b 20   int nconflict; 
3d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3d40: 62 65 72 20 6f 66 20 70 61 72 73 69 6e 67 20 63  ber of parsing c
3d50: 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20 69 6e  onflicts */.  in
3d60: 74 20 6e 61 63 74 69 6f 6e 74 61 62 3b 20 20 20  t nactiontab;   
3d70: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3d80: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
3d90: 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74  he yy_action[] t
3da0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74 61  able */.  int ta
3db0: 62 6c 65 73 69 7a 65 3b 20 20 20 20 20 20 20 20  blesize;        
3dc0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 74 61 62 6c     /* Total tabl
3dd0: 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 74 61  e size of all ta
3de0: 62 6c 65 73 20 69 6e 20 62 79 74 65 73 20 2a 2f  bles in bytes */
3df0: 0a 20 20 69 6e 74 20 62 61 73 69 73 66 6c 61 67  .  int basisflag
3e00: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
3e10: 72 69 6e 74 20 6f 6e 6c 79 20 62 61 73 69 73 20  rint only basis 
3e20: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a  configurations *
3e30: 2f 0a 20 20 69 6e 74 20 68 61 73 5f 66 61 6c 6c  /.  int has_fall
3e40: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20  back;        /* 
3e50: 54 72 75 65 20 69 66 20 61 6e 79 20 25 66 61 6c  True if any %fal
3e60: 6c 62 61 63 6b 20 69 73 20 73 65 65 6e 20 69 6e  lback is seen in
3e70: 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a   the grammar */.
3e80: 20 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66    int nolinenosf
3e90: 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  lag;       /* Tr
3ea0: 75 65 20 69 66 20 23 6c 69 6e 65 20 73 74 61 74  ue if #line stat
3eb0: 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 6e 6f  ements should no
3ec0: 74 20 62 65 20 70 72 69 6e 74 65 64 20 2a 2f 0a  t be printed */.
3ed0: 20 20 63 68 61 72 20 2a 61 72 67 76 30 3b 20 20    char *argv0;  
3ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
3ef0: 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  me of the progra
3f00: 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65  m */.};..#define
3f10: 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 58 29 20   MemoryCheck(X) 
3f20: 69 66 28 28 58 29 3d 3d 30 29 7b 20 5c 0a 20 20  if((X)==0){ \.  
3f30: 65 78 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f  extern void memo
3f40: 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c 0a 20 20  ry_error(); \.  
3f50: 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20  memory_error(); 
3f60: 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  \.}../**********
3f70: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
3f80: 66 69 6c 65 20 22 74 61 62 6c 65 2e 68 22 20 2a  file "table.h" *
3f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3fb0: 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65  /./*.** All code
3fc0: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68 61   in this file ha
3fd0: 73 20 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63  s been automatic
3fe0: 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 0a 2a  ally generated.*
3ff0: 2a 20 66 72 6f 6d 20 61 20 73 70 65 63 69 66 69  * from a specifi
4000: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69  cation in the fi
4010: 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  le.**           
4020: 20 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20     "table.q".** 
4030: 62 79 20 74 68 65 20 61 73 73 6f 63 69 61 74 69  by the associati
4040: 76 65 20 61 72 72 61 79 20 63 6f 64 65 20 62 75  ve array code bu
4050: 69 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d 20 22  ilding program "
4060: 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f  aagen"..** Do no
4070: 74 20 65 64 69 74 20 74 68 69 73 20 66 69 6c 65  t edit this file
4080: 21 20 20 49 6e 73 74 65 61 64 2c 20 65 64 69 74  !  Instead, edit
4090: 20 74 68 65 20 73 70 65 63 69 66 69 63 61 74 69   the specificati
40a0: 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  on.** file, then
40b0: 20 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f   rerun aagen..*/
40c0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20  ./*.** Code for 
40d0: 70 72 6f 63 65 73 73 69 6e 67 20 74 61 62 6c 65  processing table
40e0: 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  s in the LEMON p
40f0: 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
4100: 0a 2a 2f 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20  .*/./* Routines 
4110: 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 61 20 73  for handling a s
4120: 74 72 69 6e 67 73 20 2a 2f 0a 0a 63 6f 6e 73 74  trings */..const
4130: 20 63 68 61 72 20 2a 53 74 72 73 61 66 65 28 63   char *Strsafe(c
4140: 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 76  onst char *);..v
4150: 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e 69 74  oid Strsafe_init
4160: 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53 74 72 73  (void);.int Strs
4170: 61 66 65 5f 69 6e 73 65 72 74 28 63 6f 6e 73 74  afe_insert(const
4180: 20 63 68 61 72 20 2a 29 3b 0a 63 6f 6e 73 74 20   char *);.const 
4190: 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f 66 69  char *Strsafe_fi
41a0: 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  nd(const char *)
41b0: 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66  ;../* Routines f
41c0: 6f 72 20 68 61 6e 64 6c 69 6e 67 20 73 79 6d 62  or handling symb
41d0: 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61 6d 6d  ols of the gramm
41e0: 61 72 20 2a 2f 0a 0a 73 74 72 75 63 74 20 73 79  ar */..struct sy
41f0: 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77  mbol *Symbol_new
4200: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a  (const char *);.
4210: 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63  int Symbolcmpp(c
4220: 6f 6e 73 74 20 76 6f 69 64 20 2a 2c 20 63 6f 6e  onst void *, con
4230: 73 74 20 76 6f 69 64 20 2a 29 3b 0a 76 6f 69 64  st void *);.void
4240: 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 76 6f 69   Symbol_init(voi
4250: 64 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69  d);.int Symbol_i
4260: 6e 73 65 72 74 28 73 74 72 75 63 74 20 73 79 6d  nsert(struct sym
4270: 62 6f 6c 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61  bol *, const cha
4280: 72 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 79 6d  r *);.struct sym
4290: 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64  bol *Symbol_find
42a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a  (const char *);.
42b0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
42c0: 79 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74 29 3b 0a  ymbol_Nth(int);.
42d0: 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74  int Symbol_count
42e0: 28 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20 73  (void);.struct s
42f0: 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61  ymbol **Symbol_a
4300: 72 72 61 79 6f 66 28 76 6f 69 64 29 3b 0a 0a 2f  rrayof(void);../
4310: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 6d 61  * Routines to ma
4320: 6e 61 67 65 20 74 68 65 20 73 74 61 74 65 20 74  nage the state t
4330: 61 62 6c 65 20 2a 2f 0a 0a 69 6e 74 20 43 6f 6e  able */..int Con
4340: 66 69 67 63 6d 70 28 63 6f 6e 73 74 20 63 68 61  figcmp(const cha
4350: 72 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  r *, const char 
4360: 2a 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65  *);.struct state
4370: 20 2a 53 74 61 74 65 5f 6e 65 77 28 76 6f 69 64   *State_new(void
4380: 29 3b 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e  );.void State_in
4390: 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53 74  it(void);.int St
43a0: 61 74 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63  ate_insert(struc
43b0: 74 20 73 74 61 74 65 20 2a 2c 20 73 74 72 75 63  t state *, struc
43c0: 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72  t config *);.str
43d0: 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65  uct state *State
43e0: 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e  _find(struct con
43f0: 66 69 67 20 2a 29 3b 0a 73 74 72 75 63 74 20 73  fig *);.struct s
4400: 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72  tate **State_arr
4410: 61 79 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f  ayof(/*  */);../
4420: 2a 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20  * Routines used 
4430: 66 6f 72 20 65 66 66 69 63 69 65 6e 63 79 20 69  for efficiency i
4440: 6e 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64  n Configlist_add
4450: 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67   */..void Config
4460: 74 61 62 6c 65 5f 69 6e 69 74 28 76 6f 69 64 29  table_init(void)
4470: 3b 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c  ;.int Configtabl
4480: 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20  e_insert(struct 
4490: 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75 63  config *);.struc
44a0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
44b0: 74 61 62 6c 65 5f 66 69 6e 64 28 73 74 72 75 63  table_find(struc
44c0: 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69  t config *);.voi
44d0: 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c  d Configtable_cl
44e0: 65 61 72 28 69 6e 74 28 2a 29 28 73 74 72 75 63  ear(int(*)(struc
44f0: 74 20 63 6f 6e 66 69 67 20 2a 29 29 3b 0a 0a 2f  t config *));../
4500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4510: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
4520: 20 22 61 63 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a   "action.c" ****
4530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
4550: 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63  ** Routines proc
4560: 65 73 73 69 6e 67 20 70 61 72 73 65 72 20 61 63  essing parser ac
4570: 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 45 4d  tions in the LEM
4580: 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
4590: 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f  tor..*/../* Allo
45a0: 63 61 74 65 20 61 20 6e 65 77 20 70 61 72 73 65  cate a new parse
45b0: 72 20 61 63 74 69 6f 6e 20 2a 2f 0a 73 74 61 74  r action */.stat
45c0: 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  ic struct action
45d0: 20 2a 41 63 74 69 6f 6e 5f 6e 65 77 28 76 6f 69   *Action_new(voi
45e0: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  d){.  static str
45f0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 66 72 65 65  uct action *free
4600: 6c 69 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75  list = 0;.  stru
4610: 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 61 63  ct action *newac
4620: 74 69 6f 6e 3b 0a 0a 20 20 69 66 28 20 66 72 65  tion;..  if( fre
4630: 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
4640: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61  int i;.    int a
4650: 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 66 72  mt = 100;.    fr
4660: 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74  eelist = (struct
4670: 20 61 63 74 69 6f 6e 20 2a 29 63 61 6c 6c 6f 63   action *)calloc
4680: 28 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72  (amt, sizeof(str
4690: 75 63 74 20 61 63 74 69 6f 6e 29 29 3b 0a 20 20  uct action));.  
46a0: 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d    if( freelist==
46b0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
46c0: 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c  tf(stderr,"Unabl
46d0: 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
46e0: 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 70  mory for a new p
46f0: 61 72 73 65 72 20 61 63 74 69 6f 6e 2e 22 29 3b  arser action.");
4700: 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
4710: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
4720: 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29  0; i<amt-1; i++)
4730: 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78   freelist[i].nex
4740: 74 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b  t = &freelist[i+
4750: 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74  1];.    freelist
4760: 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30  [amt-1].next = 0
4770: 3b 0a 20 20 7d 0a 20 20 6e 65 77 61 63 74 69 6f  ;.  }.  newactio
4780: 6e 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20  n = freelist;.  
4790: 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65 65 6c  freelist = freel
47a0: 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74  ist->next;.  ret
47b0: 75 72 6e 20 6e 65 77 61 63 74 69 6f 6e 3b 0a 7d  urn newaction;.}
47c0: 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  ../* Compare two
47d0: 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 73 6f 72   actions for sor
47e0: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20  ting purposes.  
47f0: 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c  Return negative,
4800: 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20 70 6f 73   zero, or.** pos
4810: 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72  itive if the fir
4820: 73 74 20 61 63 74 69 6f 6e 20 69 73 20 6c 65 73  st action is les
4830: 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
4840: 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
4850: 6e 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 0a 2a  n.** the first.*
4860: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 74  /.static int act
4870: 69 6f 6e 63 6d 70 28 0a 20 20 73 74 72 75 63 74  ioncmp(.  struct
4880: 20 61 63 74 69 6f 6e 20 2a 61 70 31 2c 0a 20 20   action *ap1,.  
4890: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
48a0: 70 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  p2.){.  int rc;.
48b0: 20 20 72 63 20 3d 20 61 70 31 2d 3e 73 70 2d 3e    rc = ap1->sp->
48c0: 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e 73 70 2d  index - ap2->sp-
48d0: 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 72 63  >index;.  if( rc
48e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
48f0: 28 69 6e 74 29 61 70 31 2d 3e 74 79 70 65 20 2d  (int)ap1->type -
4900: 20 28 69 6e 74 29 61 70 32 2d 3e 74 79 70 65 3b   (int)ap2->type;
4910: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30  .  }.  if( rc==0
4920: 20 26 26 20 28 61 70 31 2d 3e 74 79 70 65 3d 3d   && (ap1->type==
4930: 52 45 44 55 43 45 20 7c 7c 20 61 70 31 2d 3e 74  REDUCE || ap1->t
4940: 79 70 65 3d 3d 53 48 49 46 54 52 45 44 55 43 45  ype==SHIFTREDUCE
4950: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 70  ) ){.    rc = ap
4960: 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2d  1->x.rp->index -
4970: 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65   ap2->x.rp->inde
4980: 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  x;.  }.  if( rc=
4990: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 28  =0 ){.    rc = (
49a0: 69 6e 74 29 20 28 61 70 32 20 2d 20 61 70 31 29  int) (ap2 - ap1)
49b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
49c0: 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 70 61  c;.}../* Sort pa
49d0: 72 73 65 72 20 61 63 74 69 6f 6e 73 20 2a 2f 0a  rser actions */.
49e0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61 63  static struct ac
49f0: 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72  tion *Action_sor
4a00: 74 28 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  t(.  struct acti
4a10: 6f 6e 20 2a 61 70 0a 29 7b 0a 20 20 61 70 20 3d  on *ap.){.  ap =
4a20: 20 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20   (struct action 
4a30: 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a 29  *)msort((char *)
4a40: 61 70 2c 28 63 68 61 72 20 2a 2a 29 26 61 70 2d  ap,(char **)&ap-
4a50: 3e 6e 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  >next,.         
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 20 20 20 20 20 28 69 6e 74 28 2a 29 28 63 6f 6e       (int(*)(con
4a80: 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63  st char*,const c
4a90: 68 61 72 2a 29 29 61 63 74 69 6f 6e 63 6d 70 29  har*))actioncmp)
4aa0: 3b 0a 20 20 72 65 74 75 72 6e 20 61 70 3b 0a 7d  ;.  return ap;.}
4ab0: 0a 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61 64  ..void Action_ad
4ac0: 64 28 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  d(.  struct acti
4ad0: 6f 6e 20 2a 2a 61 70 70 2c 0a 20 20 65 6e 75 6d  on **app,.  enum
4ae0: 20 65 5f 61 63 74 69 6f 6e 20 74 79 70 65 2c 0a   e_action type,.
4af0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
4b00: 2a 73 70 2c 0a 20 20 63 68 61 72 20 2a 61 72 67  *sp,.  char *arg
4b10: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 61 63 74  .){.  struct act
4b20: 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f 6e 3b 0a  ion *newaction;.
4b30: 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d 20 41 63    newaction = Ac
4b40: 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a 20 20 6e 65  tion_new();.  ne
4b50: 77 61 63 74 69 6f 6e 2d 3e 6e 65 78 74 20 3d 20  waction->next = 
4b60: 2a 61 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20 6e  *app;.  *app = n
4b70: 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e 65 77 61  ewaction;.  newa
4b80: 63 74 69 6f 6e 2d 3e 74 79 70 65 20 3d 20 74 79  ction->type = ty
4b90: 70 65 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e 2d  pe;.  newaction-
4ba0: 3e 73 70 20 3d 20 73 70 3b 0a 20 20 69 66 28 20  >sp = sp;.  if( 
4bb0: 74 79 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20  type==SHIFT ){. 
4bc0: 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78 2e     newaction->x.
4bd0: 73 74 70 20 3d 20 28 73 74 72 75 63 74 20 73 74  stp = (struct st
4be0: 61 74 65 20 2a 29 61 72 67 3b 0a 20 20 7d 65 6c  ate *)arg;.  }el
4bf0: 73 65 7b 0a 20 20 20 20 6e 65 77 61 63 74 69 6f  se{.    newactio
4c00: 6e 2d 3e 78 2e 72 70 20 3d 20 28 73 74 72 75 63  n->x.rp = (struc
4c10: 74 20 72 75 6c 65 20 2a 29 61 72 67 3b 0a 20 20  t rule *)arg;.  
4c20: 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}./***********
4c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 65 77 20  *********** New 
4c40: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
4c50: 74 20 74 68 65 20 22 61 63 74 74 61 62 22 20 6d  t the "acttab" m
4c60: 6f 64 75 6c 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  odule **********
4c70: 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f  */./*.** This mo
4c80: 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  dule implements 
4c90: 72 6f 75 74 69 6e 65 73 20 75 73 65 20 74 6f 20  routines use to 
4ca0: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 79 79  construct the yy
4cb0: 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e  _action[] table.
4cc0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .*/../*.** The s
4cd0: 74 61 74 65 20 6f 66 20 74 68 65 20 79 79 5f 61  tate of the yy_a
4ce0: 63 74 69 6f 6e 20 74 61 62 6c 65 20 75 6e 64 65  ction table unde
4cf0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
4d00: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
4d10: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
4d20: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  g structure..**.
4d30: 2a 2a 20 54 68 65 20 79 79 5f 61 63 74 69 6f 6e  ** The yy_action
4d40: 20 74 61 62 6c 65 20 6d 61 70 73 20 74 68 65 20   table maps the 
4d50: 70 61 69 72 20 28 73 74 61 74 65 5f 6e 75 6d 62  pair (state_numb
4d60: 65 72 2c 20 6c 6f 6f 6b 61 68 65 61 64 29 20 69  er, lookahead) i
4d70: 6e 74 6f 20 61 6e 0a 2a 2a 20 61 63 74 69 6f 6e  nto an.** action
4d80: 5f 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 74 61  _number.  The ta
4d90: 62 6c 65 20 69 73 20 61 6e 20 61 72 72 61 79 20  ble is an array 
4da0: 6f 66 20 69 6e 74 65 67 65 72 73 20 70 61 69 72  of integers pair
4db0: 73 2e 20 20 54 68 65 20 73 74 61 74 65 5f 6e 75  s.  The state_nu
4dc0: 6d 62 65 72 0a 2a 2a 20 64 65 74 65 72 6d 69 6e  mber.** determin
4dd0: 65 73 20 61 6e 20 69 6e 69 74 69 61 6c 20 6f 66  es an initial of
4de0: 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 79 79  fset into the yy
4df0: 5f 61 63 74 69 6f 6e 20 61 72 72 61 79 2e 20 20  _action array.  
4e00: 54 68 65 20 6c 6f 6f 6b 61 68 65 61 64 0a 2a 2a  The lookahead.**
4e10: 20 76 61 6c 75 65 20 69 73 20 74 68 65 6e 20 61   value is then a
4e20: 64 64 65 64 20 74 6f 20 74 68 69 73 20 69 6e 69  dded to this ini
4e30: 74 69 61 6c 20 6f 66 66 73 65 74 20 74 6f 20 67  tial offset to g
4e40: 65 74 20 61 6e 20 69 6e 64 65 78 20 58 20 69 6e  et an index X in
4e50: 74 6f 20 74 68 65 0a 2a 2a 20 79 79 5f 61 63 74  to the.** yy_act
4e60: 69 6f 6e 20 61 72 72 61 79 2e 20 49 66 20 74 68  ion array. If th
4e70: 65 20 61 41 63 74 69 6f 6e 5b 58 5d 2e 6c 6f 6f  e aAction[X].loo
4e80: 6b 61 68 65 61 64 20 65 71 75 61 6c 73 20 74 68  kahead equals th
4e90: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a  e value of the.*
4ea0: 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65  * of the lookahe
4eb0: 61 64 20 69 6e 70 75 74 2c 20 74 68 65 6e 20 74  ad input, then t
4ec0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
4ed0: 61 63 74 69 6f 6e 5f 6e 75 6d 62 65 72 20 6f 75  action_number ou
4ee0: 74 70 75 74 20 69 73 0a 2a 2a 20 61 41 63 74 69  tput is.** aActi
4ef0: 6f 6e 5b 58 5d 2e 61 63 74 69 6f 6e 2e 20 20 49  on[X].action.  I
4f00: 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 73  f the lookaheads
4f10: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68   do not match th
4f20: 65 6e 20 74 68 65 0a 2a 2a 20 64 65 66 61 75 6c  en the.** defaul
4f30: 74 20 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 65  t action for the
4f40: 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 69 73   state_number is
4f50: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
4f60: 20 41 6c 6c 20 61 63 74 69 6f 6e 73 20 61 73 73   All actions ass
4f70: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 73  ociated with a s
4f80: 69 6e 67 6c 65 20 73 74 61 74 65 5f 6e 75 6d 62  ingle state_numb
4f90: 65 72 20 61 72 65 20 66 69 72 73 74 20 65 6e 74  er are first ent
4fa0: 65 72 65 64 0a 2a 2a 20 69 6e 74 6f 20 61 4c 6f  ered.** into aLo
4fb0: 6f 6b 61 68 65 61 64 5b 5d 20 75 73 69 6e 67 20  okahead[] using 
4fc0: 6d 75 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20 74  multiple calls t
4fd0: 6f 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28  o acttab_action(
4fe0: 29 2e 20 20 54 68 65 6e 20 74 68 65 20 0a 2a 2a  ).  Then the .**
4ff0: 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 61   actions for tha
5000: 74 20 73 69 6e 67 6c 65 20 73 74 61 74 65 5f 6e  t single state_n
5010: 75 6d 62 65 72 20 61 72 65 20 70 6c 61 63 65 64  umber are placed
5020: 20 69 6e 74 6f 20 74 68 65 20 61 41 63 74 69 6f   into the aActio
5030: 6e 5b 5d 20 0a 2a 2a 20 61 72 72 61 79 20 77 69  n[] .** array wi
5040: 74 68 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c  th a single call
5050: 20 74 6f 20 61 63 74 74 61 62 5f 69 6e 73 65 72   to acttab_inser
5060: 74 28 29 2e 20 20 54 68 65 20 61 63 74 74 61 62  t().  The acttab
5070: 5f 69 6e 73 65 72 74 28 29 20 63 61 6c 6c 0a 2a  _insert() call.*
5080: 2a 20 61 6c 73 6f 20 72 65 73 65 74 73 20 74 68  * also resets th
5090: 65 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 61  e aLookahead[] a
50a0: 72 72 61 79 20 69 6e 20 70 72 65 70 61 72 61 74  rray in preparat
50b0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ion for the next
50c0: 0a 2a 2a 20 73 74 61 74 65 20 6e 75 6d 62 65 72  .** state number
50d0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 6f 6b  ..*/.struct look
50e0: 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 7b 0a 20  ahead_action {. 
50f0: 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 3b 20   int lookahead; 
5100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
5110: 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 6b  alue of the look
5120: 61 68 65 61 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20  ahead token */. 
5130: 20 69 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20 20   int action;    
5140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
5150: 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 6f 6e  ction to take on
5160: 20 74 68 65 20 67 69 76 65 6e 20 6c 6f 6f 6b 61   the given looka
5170: 68 65 61 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64  head */.};.typed
5180: 65 66 20 73 74 72 75 63 74 20 61 63 74 74 61 62  ef struct acttab
5190: 20 61 63 74 74 61 62 3b 0a 73 74 72 75 63 74 20   acttab;.struct 
51a0: 61 63 74 74 61 62 20 7b 0a 20 20 69 6e 74 20 6e  acttab {.  int n
51b0: 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Action;         
51c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
51d0: 72 20 6f 66 20 75 73 65 64 20 73 6c 6f 74 73 20  r of used slots 
51e0: 69 6e 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a  in aAction[] */.
51f0: 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 41 6c 6c    int nActionAll
5200: 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  oc;            /
5210: 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65  * Slots allocate
5220: 64 20 66 6f 72 20 61 41 63 74 69 6f 6e 5b 5d 20  d for aAction[] 
5230: 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 6f 6b  */.  struct look
5240: 61 68 65 61 64 5f 61 63 74 69 6f 6e 0a 20 20 20  ahead_action.   
5250: 20 2a 61 41 63 74 69 6f 6e 2c 20 20 20 20 20 20   *aAction,      
5260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5270: 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74  he yy_action[] t
5280: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
5290: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 2a  ruction */.    *
52a0: 61 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20  aLookahead;     
52b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
52c0: 69 6e 67 6c 65 20 6e 65 77 20 74 72 61 6e 73 61  ingle new transa
52d0: 63 74 69 6f 6e 20 73 65 74 20 2a 2f 0a 20 20 69  ction set */.  i
52e0: 6e 74 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  nt mnLookahead; 
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
5300: 69 6e 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65 61  inimum aLookahea
5310: 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f  d[].lookahead */
5320: 0a 20 20 69 6e 74 20 6d 6e 41 63 74 69 6f 6e 3b  .  int mnAction;
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5340: 2f 2a 20 41 63 74 69 6f 6e 20 61 73 73 6f 63 69  /* Action associ
5350: 61 74 65 64 20 77 69 74 68 20 6d 6e 4c 6f 6f 6b  ated with mnLook
5360: 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6d  ahead */.  int m
5370: 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20  xLookahead;     
5380: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
5390: 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e  um aLookahead[].
53a0: 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69  lookahead */.  i
53b0: 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 20  nt nLookahead;  
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
53d0: 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 4c 6f  sed slots in aLo
53e0: 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 20 20 69  okahead[] */.  i
53f0: 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c  nt nLookaheadAll
5400: 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  oc;         /* S
5410: 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 69  lots allocated i
5420: 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a  n aLookahead[] *
5430: 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  /.};../* Return 
5440: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
5450: 74 72 69 65 73 20 69 6e 20 74 68 65 20 79 79 5f  tries in the yy_
5460: 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a  action table */.
5470: 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 73  #define acttab_s
5480: 69 7a 65 28 58 29 20 28 28 58 29 2d 3e 6e 41 63  ize(X) ((X)->nAc
5490: 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61  tion)../* The va
54a0: 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74 68  lue for the N-th
54b0: 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 61 63 74   entry in yy_act
54c0: 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61  ion */.#define a
54d0: 63 74 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 58  cttab_yyaction(X
54e0: 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69  ,N)  ((X)->aActi
54f0: 6f 6e 5b 4e 5d 2e 61 63 74 69 6f 6e 29 0a 0a 2f  on[N].action)../
5500: 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72 20  * The value for 
5510: 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20 69  the N-th entry i
5520: 6e 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 2a  n yy_lookahead *
5530: 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62  /.#define acttab
5540: 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 58 2c 4e  _yylookahead(X,N
5550: 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e  )  ((X)->aAction
5560: 5b 4e 5d 2e 6c 6f 6f 6b 61 68 65 61 64 29 0a 0a  [N].lookahead)..
5570: 2f 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  /* Free all memo
5580: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
5590: 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 63 74  th the given act
55a0: 74 61 62 20 2a 2f 0a 76 6f 69 64 20 61 63 74 74  tab */.void actt
55b0: 61 62 5f 66 72 65 65 28 61 63 74 74 61 62 20 2a  ab_free(acttab *
55c0: 70 29 7b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61  p){.  free( p->a
55d0: 41 63 74 69 6f 6e 20 29 3b 0a 20 20 66 72 65 65  Action );.  free
55e0: 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20  ( p->aLookahead 
55f0: 29 3b 0a 20 20 66 72 65 65 28 20 70 20 29 3b 0a  );.  free( p );.
5600: 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  }../* Allocate a
5610: 20 6e 65 77 20 61 63 74 74 61 62 20 73 74 72 75   new acttab stru
5620: 63 74 75 72 65 20 2a 2f 0a 61 63 74 74 61 62 20  cture */.acttab 
5630: 2a 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28 76 6f  *acttab_alloc(vo
5640: 69 64 29 7b 0a 20 20 61 63 74 74 61 62 20 2a 70  id){.  acttab *p
5650: 20 3d 20 28 61 63 74 74 61 62 20 2a 29 20 63 61   = (acttab *) ca
5660: 6c 6c 6f 63 28 20 31 2c 20 73 69 7a 65 6f 66 28  lloc( 1, sizeof(
5670: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
5680: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
5690: 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20  (stderr,"Unable 
56a0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
56b0: 72 79 20 66 6f 72 20 61 20 6e 65 77 20 61 63 74  ry for a new act
56c0: 74 61 62 2e 22 29 3b 0a 20 20 20 20 65 78 69 74  tab.");.    exit
56d0: 28 31 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  (1);.  }.  memse
56e0: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
56f0: 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  p));.  return p;
5700: 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77  .}../* Add a new
5710: 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 63   action to the c
5720: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
5730: 6f 6e 20 73 65 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  on set.  .**.** 
5740: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5750: 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
5760: 65 61 63 68 20 6c 6f 6f 6b 61 68 65 61 64 20 66  each lookahead f
5770: 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 0a  or a particular.
5780: 2a 2a 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69  ** state..*/.voi
5790: 64 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28  d acttab_action(
57a0: 61 63 74 74 61 62 20 2a 70 2c 20 69 6e 74 20 6c  acttab *p, int l
57b0: 6f 6f 6b 61 68 65 61 64 2c 20 69 6e 74 20 61 63  ookahead, int ac
57c0: 74 69 6f 6e 29 7b 0a 20 20 69 66 28 20 70 2d 3e  tion){.  if( p->
57d0: 6e 4c 6f 6f 6b 61 68 65 61 64 3e 3d 70 2d 3e 6e  nLookahead>=p->n
57e0: 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29  LookaheadAlloc )
57f0: 7b 0a 20 20 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68  {.    p->nLookah
5800: 65 61 64 41 6c 6c 6f 63 20 2b 3d 20 32 35 3b 0a  eadAlloc += 25;.
5810: 20 20 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61      p->aLookahea
5820: 64 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 6f 6b  d = (struct look
5830: 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a 29 20  ahead_action *) 
5840: 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c 6f 6f  realloc( p->aLoo
5850: 6b 61 68 65 61 64 2c 0a 20 20 20 20 20 20 20 20  kahead,.        
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 20 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61       sizeof(p->a
5880: 4c 6f 6f 6b 61 68 65 61 64 5b 30 5d 29 2a 70 2d  Lookahead[0])*p-
5890: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63  >nLookaheadAlloc
58a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61   );.    if( p->a
58b0: 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29 7b 0a  Lookahead==0 ){.
58c0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
58d0: 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69  derr,"malloc fai
58e0: 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65  led\n");.      e
58f0: 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
5900: 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b  }.  if( p->nLook
5910: 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ahead==0 ){.    
5920: 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d  p->mxLookahead =
5930: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20   lookahead;.    
5940: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d  p->mnLookahead =
5950: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20   lookahead;.    
5960: 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63  p->mnAction = ac
5970: 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tion;.  }else{. 
5980: 20 20 20 69 66 28 20 70 2d 3e 6d 78 4c 6f 6f 6b     if( p->mxLook
5990: 61 68 65 61 64 3c 6c 6f 6f 6b 61 68 65 61 64 20  ahead<lookahead 
59a0: 29 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64  ) p->mxLookahead
59b0: 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20   = lookahead;.  
59c0: 20 20 69 66 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61    if( p->mnLooka
59d0: 68 65 61 64 3e 6c 6f 6f 6b 61 68 65 61 64 20 29  head>lookahead )
59e0: 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f  {.      p->mnLoo
59f0: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
5a00: 61 64 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 41  ad;.      p->mnA
5a10: 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a  ction = action;.
5a20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61      }.  }.  p->a
5a30: 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f  Lookahead[p->nLo
5a40: 6f 6b 61 68 65 61 64 5d 2e 6c 6f 6f 6b 61 68 65  okahead].lookahe
5a50: 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a  ad = lookahead;.
5a60: 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b    p->aLookahead[
5a70: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 61  p->nLookahead].a
5a80: 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a  ction = action;.
5a90: 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 2b    p->nLookahead+
5aa0: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  +;.}../*.** Add 
5ab0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
5ac0: 73 65 74 20 62 75 69 6c 74 20 75 70 20 77 69 74  set built up wit
5ad0: 68 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f  h prior calls to
5ae0: 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29   acttab_action()
5af0: 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 63 75 72  .** into the cur
5b00: 72 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c  rent action tabl
5b10: 65 2e 20 20 54 68 65 6e 20 72 65 73 65 74 20 74  e.  Then reset t
5b20: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
5b30: 65 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 61 6e  et back.** to an
5b40: 20 65 6d 70 74 79 20 73 65 74 20 69 6e 20 70 72   empty set in pr
5b50: 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 61 20  eparation for a 
5b60: 6e 65 77 20 72 6f 75 6e 64 20 6f 66 20 61 63 74  new round of act
5b70: 74 61 62 5f 61 63 74 69 6f 6e 28 29 20 63 61 6c  tab_action() cal
5b80: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ls..**.** Return
5b90: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f   the offset into
5ba0: 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
5bb0: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 72 61  e of the new tra
5bc0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
5bd0: 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 61   acttab_insert(a
5be0: 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 69 6e 74  cttab *p){.  int
5bf0: 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 61   i, j, k, n;.  a
5c00: 73 73 65 72 74 28 20 70 2d 3e 6e 4c 6f 6f 6b 61  ssert( p->nLooka
5c10: 68 65 61 64 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  head>0 );..  /* 
5c20: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
5c30: 65 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  e enough space t
5c40: 6f 20 68 6f 6c 64 20 74 68 65 20 65 78 70 61 6e  o hold the expan
5c50: 64 65 64 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ded action table
5c60: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 77 6f 72  .  ** in the wor
5c70: 73 74 20 63 61 73 65 2e 20 20 54 68 65 20 77 6f  st case.  The wo
5c80: 72 73 74 20 63 61 73 65 20 6f 63 63 75 72 73 20  rst case occurs 
5c90: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
5ca0: 6f 6e 20 73 65 74 0a 20 20 2a 2a 20 6d 75 73 74  on set.  ** must
5cb0: 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20   be appended to 
5cc0: 74 68 65 20 63 75 72 72 65 6e 74 20 61 63 74 69  the current acti
5cd0: 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20  on table.  */.  
5ce0: 6e 20 3d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65  n = p->mxLookahe
5cf0: 61 64 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 2d  ad + 1;.  if( p-
5d00: 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20  >nAction + n >= 
5d10: 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20  p->nActionAlloc 
5d20: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64 41 6c  ){.    int oldAl
5d30: 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e  loc = p->nAction
5d40: 41 6c 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e 41  Alloc;.    p->nA
5d50: 63 74 69 6f 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ctionAlloc = p->
5d60: 6e 41 63 74 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d  nAction + n + p-
5d70: 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20  >nActionAlloc + 
5d80: 32 30 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69  20;.    p->aActi
5d90: 6f 6e 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 6f  on = (struct loo
5da0: 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a 29  kahead_action *)
5db0: 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 41 63   realloc( p->aAc
5dc0: 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5de0: 73 69 7a 65 6f 66 28 70 2d 3e 61 41 63 74 69 6f  sizeof(p->aActio
5df0: 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e  n[0])*p->nAction
5e00: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20  Alloc);.    if( 
5e10: 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d 30 20 29 7b  p->aAction==0 ){
5e20: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
5e30: 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61  tderr,"malloc fa
5e40: 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20  iled\n");.      
5e50: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20  exit(1);.    }. 
5e60: 20 20 20 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f     for(i=oldAllo
5e70: 63 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41  c; i<p->nActionA
5e80: 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lloc; i++){.    
5e90: 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e    p->aAction[i].
5ea0: 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b 0a  lookahead = -1;.
5eb0: 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e        p->aAction
5ec0: 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31 3b  [i].action = -1;
5ed0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
5ee0: 20 53 63 61 6e 20 74 68 65 20 65 78 69 73 74 69   Scan the existi
5ef0: 6e 67 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  ng action table 
5f00: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20 6f  looking for an o
5f10: 66 66 73 65 74 20 74 68 61 74 20 69 73 20 61 20  ffset that is a 
5f20: 0a 20 20 2a 2a 20 64 75 70 6c 69 63 61 74 65 20  .  ** duplicate 
5f30: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
5f40: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 20  ransaction set. 
5f50: 20 46 61 6c 6c 20 6f 75 74 20 6f 66 20 74 68 65   Fall out of the
5f60: 20 6c 6f 6f 70 0a 20 20 2a 2a 20 69 66 20 61 6e   loop.  ** if an
5f70: 64 20 77 68 65 6e 20 74 68 65 20 64 75 70 6c 69  d when the dupli
5f80: 63 61 74 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  cate is found.. 
5f90: 20 2a 2a 0a 20 20 2a 2a 20 69 20 69 73 20 74 68   **.  ** i is th
5fa0: 65 20 69 6e 64 65 78 20 69 6e 20 70 2d 3e 61 41  e index in p->aA
5fb0: 63 74 69 6f 6e 5b 5d 20 77 68 65 72 65 20 70 2d  ction[] where p-
5fc0: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 69 73 20  >mnLookahead is 
5fd0: 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20  inserted..  */. 
5fe0: 20 66 6f 72 28 69 3d 70 2d 3e 6e 41 63 74 69 6f   for(i=p->nActio
5ff0: 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  n-1; i>=0; i--){
6000: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74  .    if( p->aAct
6010: 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[i].lookahead
6020: 3d 3d 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  ==p->mnLookahead
6030: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c   ){.      /* All
6040: 20 6c 6f 6f 6b 61 68 65 61 64 73 20 61 6e 64 20   lookaheads and 
6050: 61 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 61  actions in the a
6060: 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e  Lookahead[] tran
6070: 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  saction.      **
6080: 20 6d 75 73 74 20 6d 61 74 63 68 20 61 67 61 69   must match agai
6090: 6e 73 74 20 74 68 65 20 63 61 6e 64 69 64 61 74  nst the candidat
60a0: 65 20 61 41 63 74 69 6f 6e 5b 69 5d 20 65 6e 74  e aAction[i] ent
60b0: 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ry. */.      if(
60c0: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 61   p->aAction[i].a
60d0: 63 74 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63 74 69  ction!=p->mnActi
60e0: 6f 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  on ) continue;. 
60f0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
6100: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a  p->nLookahead; j
6110: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d  ++){.        k =
6120: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a   p->aLookahead[j
6130: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d  ].lookahead - p-
6140: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69  >mnLookahead + i
6150: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3c  ;.        if( k<
6160: 30 20 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69  0 || k>=p->nActi
6170: 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  on ) break;.    
6180: 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b      if( p->aLook
6190: 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65  ahead[j].lookahe
61a0: 61 64 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b  ad!=p->aAction[k
61b0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 29 20 62 72  ].lookahead ) br
61c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eak;.        if(
61d0: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a   p->aLookahead[j
61e0: 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 61 41 63  ].action!=p->aAc
61f0: 74 69 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e 20 29  tion[k].action )
6200: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6210: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e        if( j<p->n
6220: 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74  Lookahead ) cont
6230: 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  inue;..      /* 
6240: 4e 6f 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b  No possible look
6250: 61 68 65 61 64 20 76 61 6c 75 65 20 74 68 61 74  ahead value that
6260: 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 61   is not in the a
6270: 4c 6f 6f 6b 61 68 65 61 64 5b 5d 0a 20 20 20 20  Lookahead[].    
6280: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
6290: 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d   is allowed to m
62a0: 61 74 63 68 20 61 41 63 74 69 6f 6e 5b 69 5d 20  atch aAction[i] 
62b0: 2a 2f 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a  */.      n = 0;.
62c0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
62d0: 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b  <p->nAction; j++
62e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
62f0: 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f  ->aAction[j].loo
6300: 6b 61 68 65 61 64 3c 30 20 29 20 63 6f 6e 74 69  kahead<0 ) conti
6310: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
6320: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c   p->aAction[j].l
6330: 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d  ookahead==j+p->m
6340: 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69 20 29 20 6e  nLookahead-i ) n
6350: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
6360: 20 20 69 66 28 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f    if( n==p->nLoo
6370: 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20  kahead ){.      
6380: 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 41 6e 20    break;  /* An 
6390: 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 66  exact match is f
63a0: 6f 75 6e 64 20 61 74 20 6f 66 66 73 65 74 20 69  ound at offset i
63b0: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
63c0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  }.  }..  /* If n
63d0: 6f 20 65 78 69 73 74 69 6e 67 20 6f 66 66 73 65  o existing offse
63e0: 74 73 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68  ts exactly match
63f0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
6400: 6e 73 61 63 74 69 6f 6e 2c 20 66 69 6e 64 20 61  nsaction, find a
6410: 6e 0a 20 20 2a 2a 20 61 6e 20 65 6d 70 74 79 20  n.  ** an empty 
6420: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 61 41  offset in the aA
6430: 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 69 6e  ction[] table in
6440: 20 77 68 69 63 68 20 77 65 20 63 61 6e 20 61 64   which we can ad
6450: 64 20 74 68 65 0a 20 20 2a 2a 20 61 4c 6f 6f 6b  d the.  ** aLook
6460: 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74  ahead[] transact
6470: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ion..  */.  if( 
6480: 69 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 6f  i<0 ){.    /* Lo
6490: 6f 6b 20 66 6f 72 20 68 6f 6c 65 73 20 69 6e 20  ok for holes in 
64a0: 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 74 61  the aAction[] ta
64b0: 62 6c 65 20 74 68 61 74 20 66 69 74 20 74 68 65  ble that fit the
64c0: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
64d0: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61  aLookahead[] tra
64e0: 6e 73 61 63 74 69 6f 6e 2e 20 20 4c 65 61 76 65  nsaction.  Leave
64f0: 20 69 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66   i set to the of
6500: 66 73 65 74 20 6f 66 20 74 68 65 20 68 6f 6c 65  fset of the hole
6510: 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 20 68  ..    ** If no h
6520: 6f 6c 65 73 20 61 72 65 20 66 6f 75 6e 64 2c 20  oles are found, 
6530: 69 20 69 73 20 6c 65 66 74 20 61 74 20 70 2d 3e  i is left at p->
6540: 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63 68 20 6d  nAction, which m
6550: 65 61 6e 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  eans the.    ** 
6560: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
6570: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 2a 2f   be appended. */
6580: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6590: 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20  p->nActionAlloc 
65a0: 2d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64  - p->mxLookahead
65b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
65c0: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e  ( p->aAction[i].
65d0: 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b 0a 20  lookahead<0 ){. 
65e0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
65f0: 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b  j<p->nLookahead;
6600: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
6610: 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65   k = p->aLookahe
6620: 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  ad[j].lookahead 
6630: 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  - p->mnLookahead
6640: 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   + i;.          
6650: 69 66 28 20 6b 3c 30 20 29 20 62 72 65 61 6b 3b  if( k<0 ) break;
6660: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
6670: 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f  ->aAction[k].loo
6680: 6b 61 68 65 61 64 3e 3d 30 20 29 20 62 72 65 61  kahead>=0 ) brea
6690: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
66a0: 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c       if( j<p->nL
66b0: 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74 69  ookahead ) conti
66c0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  nue;.        for
66d0: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69  (j=0; j<p->nActi
66e0: 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  on; j++){.      
66f0: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
6700: 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d  on[j].lookahead=
6710: 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61  =j+p->mnLookahea
6720: 64 2d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  d-i ) break;.   
6730: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
6740: 66 28 20 6a 3d 3d 70 2d 3e 6e 41 63 74 69 6f 6e  f( j==p->nAction
6750: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
6760: 65 61 6b 3b 20 20 2f 2a 20 46 69 74 73 20 69 6e  eak;  /* Fits in
6770: 20 65 6d 70 74 79 20 73 6c 6f 74 73 20 2a 2f 0a   empty slots */.
6780: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6790: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
67a0: 20 49 6e 73 65 72 74 20 74 72 61 6e 73 61 63 74   Insert transact
67b0: 69 6f 6e 20 73 65 74 20 61 74 20 69 6e 64 65 78  ion set at index
67c0: 20 69 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30   i. */.  for(j=0
67d0: 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ; j<p->nLookahea
67e0: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d  d; j++){.    k =
67f0: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a   p->aLookahead[j
6800: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d  ].lookahead - p-
6810: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69  >mnLookahead + i
6820: 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e  ;.    p->aAction
6830: 5b 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68  [k] = p->aLookah
6840: 65 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  ead[j];.    if( 
6850: 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20  k>=p->nAction ) 
6860: 70 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b 31  p->nAction = k+1
6870: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b  ;.  }.  p->nLook
6880: 61 68 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ahead = 0;..  /*
6890: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73   Return the offs
68a0: 65 74 20 74 68 61 74 20 69 73 20 61 64 64 65 64  et that is added
68b0: 20 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   to the lookahea
68c0: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  d in order to ge
68d0: 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  t the.  ** index
68e0: 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20   into yy_action 
68f0: 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20 2a 2f  of the action */
6900: 0a 20 20 72 65 74 75 72 6e 20 69 20 2d 20 70 2d  .  return i - p-
6910: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a  >mnLookahead;.}.
6920: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
6930: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
6940: 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 63 22  e file "build.c"
6950: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
6960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
6970: 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74  /*.** Routines t
6980: 6f 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74  o construction t
6990: 68 65 20 66 69 6e 69 74 65 20 73 74 61 74 65 20  he finite state 
69a0: 6d 61 63 68 69 6e 65 20 66 6f 72 20 74 68 65 20  machine for the 
69b0: 4c 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65 72 20  LEMON.** parser 
69c0: 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f  generator..*/../
69d0: 2a 20 46 69 6e 64 20 61 20 70 72 65 63 65 64 65  * Find a precede
69e0: 6e 63 65 20 73 79 6d 62 6f 6c 20 6f 66 20 65 76  nce symbol of ev
69f0: 65 72 79 20 72 75 6c 65 20 69 6e 20 74 68 65 20  ery rule in the 
6a00: 67 72 61 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a 20  grammar..** .** 
6a10: 54 68 6f 73 65 20 72 75 6c 65 73 20 77 68 69 63  Those rules whic
6a20: 68 20 68 61 76 65 20 61 20 70 72 65 63 65 64 65  h have a precede
6a30: 6e 63 65 20 73 79 6d 62 6f 6c 20 63 6f 64 65 64  nce symbol coded
6a40: 20 69 6e 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a   in the input.**
6a50: 20 67 72 61 6d 6d 61 72 20 75 73 69 6e 67 20 74   grammar using t
6a60: 68 65 20 22 5b 73 79 6d 62 6f 6c 5d 22 20 63 6f  he "[symbol]" co
6a70: 6e 73 74 72 75 63 74 20 77 69 6c 6c 20 61 6c 72  nstruct will alr
6a80: 65 61 64 79 20 68 61 76 65 20 74 68 65 0a 2a 2a  eady have the.**
6a90: 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 66 69 65   rp->precsym fie
6aa0: 6c 64 20 66 69 6c 6c 65 64 2e 20 20 4f 74 68 65  ld filled.  Othe
6ab0: 72 20 72 75 6c 65 73 20 74 61 6b 65 20 61 73 20  r rules take as 
6ac0: 74 68 65 69 72 20 70 72 65 63 65 64 65 6e 63 65  their precedence
6ad0: 0a 2a 2a 20 73 79 6d 62 6f 6c 20 74 68 65 20 66  .** symbol the f
6ae0: 69 72 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20  irst RHS symbol 
6af0: 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 70  with a defined p
6b00: 72 65 63 65 64 65 6e 63 65 2e 20 20 49 66 20 74  recedence.  If t
6b10: 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  here.** are not 
6b20: 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 69 74 68  RHS symbols with
6b30: 20 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65   a defined prece
6b40: 64 65 6e 63 65 2c 20 74 68 65 20 70 72 65 63 65  dence, the prece
6b50: 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20  dence.** symbol 
6b60: 66 69 65 6c 64 20 69 73 20 6c 65 66 74 20 62 6c  field is left bl
6b70: 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e  ank..*/.void Fin
6b80: 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73  dRulePrecedences
6b90: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 78  (struct lemon *x
6ba0: 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75  p).{.  struct ru
6bb0: 6c 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72 70  le *rp;.  for(rp
6bc0: 3d 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  =xp->rule; rp; r
6bd0: 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
6be0: 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d   if( rp->precsym
6bf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
6c00: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72   i, j;.      for
6c10: 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
6c20: 20 26 26 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d   && rp->precsym=
6c30: 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
6c40: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
6c50: 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d  *sp = rp->rhs[i]
6c60: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 70  ;.        if( sp
6c70: 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
6c80: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
6c90: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 70     for(j=0; j<sp
6ca0: 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b  ->nsubsym; j++){
6cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6cc0: 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e   sp->subsym[j]->
6cd0: 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  prec>=0 ){.     
6ce0: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65           rp->pre
6cf0: 63 73 79 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79  csym = sp->subsy
6d00: 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  m[j];.          
6d10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
6d20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6d30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
6d40: 73 65 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e  se if( sp->prec>
6d50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6d60: 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 72 70  rp->precsym = rp
6d70: 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
6d80: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6d90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  }.  }.  return;.
6da0: 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61 6c 6c 20 6e  }../* Find all n
6db0: 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69 63  onterminals whic
6dc0: 68 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  h will generate 
6dd0: 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67  the empty string
6de0: 2e 0a 2a 2a 20 54 68 65 6e 20 67 6f 20 62 61 63  ..** Then go bac
6df0: 6b 20 61 6e 64 20 63 6f 6d 70 75 74 65 20 74 68  k and compute th
6e00: 65 20 66 69 72 73 74 20 73 65 74 73 20 6f 66 20  e first sets of 
6e10: 65 76 65 72 79 20 6e 6f 6e 74 65 72 6d 69 6e 61  every nontermina
6e20: 6c 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  l..** The first 
6e30: 73 65 74 20 69 73 20 74 68 65 20 73 65 74 20 6f  set is the set o
6e40: 66 20 61 6c 6c 20 74 65 72 6d 69 6e 61 6c 20 73  f all terminal s
6e50: 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e  ymbols which can
6e60: 20 62 65 67 69 6e 0a 2a 2a 20 61 20 73 74 72 69   begin.** a stri
6e70: 6e 67 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  ng generated by 
6e80: 74 68 61 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  that nonterminal
6e90: 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 69  ..*/.void FindFi
6ea0: 72 73 74 53 65 74 73 28 73 74 72 75 63 74 20 6c  rstSets(struct l
6eb0: 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
6ec0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75  int i, j;.  stru
6ed0: 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69  ct rule *rp;.  i
6ee0: 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20  nt progress;..  
6ef0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
6f00: 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
6f10: 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c      lemp->symbol
6f20: 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c  s[i]->lambda = L
6f30: 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 7d 0a  EMON_FALSE;.  }.
6f40: 20 20 66 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74    for(i=lemp->nt
6f50: 65 72 6d 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d  erminal; i<lemp-
6f60: 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
6f70: 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c      lemp->symbol
6f80: 73 5b 69 5d 2d 3e 66 69 72 73 74 73 65 74 20 3d  s[i]->firstset =
6f90: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a   SetNew();.  }..
6fa0: 20 20 2f 2a 20 46 69 72 73 74 20 63 6f 6d 70 75    /* First compu
6fb0: 74 65 20 61 6c 6c 20 6c 61 6d 62 64 61 73 20 2a  te all lambdas *
6fc0: 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67  /.  do{.    prog
6fd0: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ress = 0;.    fo
6fe0: 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
6ff0: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
7000: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d  ){.      if( rp-
7010: 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 29 20 63  >lhs->lambda ) c
7020: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
7030: 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
7040: 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
7050: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
7060: 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d  *sp = rp->rhs[i]
7070: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
7080: 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54  ( sp->type==NONT
7090: 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 6c  ERMINAL || sp->l
70a0: 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c  ambda==LEMON_FAL
70b0: 53 45 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  SE );.        if
70c0: 28 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45  ( sp->lambda==LE
70d0: 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61  MON_FALSE ) brea
70e0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
70f0: 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73   if( i==rp->nrhs
7100: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 70 2d 3e   ){.        rp->
7110: 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45  lhs->lambda = LE
7120: 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 20 20  MON_TRUE;.      
7130: 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a    progress = 1;.
7140: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7150: 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73  }while( progress
7160: 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 6f   );..  /* Now co
7170: 6d 70 75 74 65 20 61 6c 6c 20 66 69 72 73 74 20  mpute all first 
7180: 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20  sets */.  do{.  
7190: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
71a0: 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70 72  *s1, *s2;.    pr
71b0: 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
71c0: 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
71d0: 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
71e0: 78 74 29 7b 0a 20 20 20 20 20 20 73 31 20 3d 20  xt){.      s1 = 
71f0: 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 66  rp->lhs;.      f
7200: 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
7210: 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
7220: 20 20 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b 69    s2 = rp->rhs[i
7230: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ];.        if( s
7240: 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  2->type==TERMINA
7250: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  L ){.          p
7260: 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64  rogress += SetAd
7270: 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73  d(s1->firstset,s
7280: 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  2->index);.     
7290: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
72a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 32      }else if( s2
72b0: 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
72c0: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
72d0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 32     for(j=0; j<s2
72e0: 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b  ->nsubsym; j++){
72f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f  .            pro
7300: 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64 64 28  gress += SetAdd(
7310: 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d  s1->firstset,s2-
7320: 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 69 6e 64 65  >subsym[j]->inde
7330: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  x);.          }.
7340: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
7350: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
7360: 66 28 20 73 31 3d 3d 73 32 20 29 7b 0a 20 20 20  f( s1==s2 ){.   
7370: 20 20 20 20 20 20 20 69 66 28 20 73 31 2d 3e 6c         if( s1->l
7380: 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c  ambda==LEMON_FAL
7390: 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SE ) break;.    
73a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
73b0: 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d       progress +=
73c0: 20 53 65 74 55 6e 69 6f 6e 28 73 31 2d 3e 66 69   SetUnion(s1->fi
73d0: 72 73 74 73 65 74 2c 73 32 2d 3e 66 69 72 73 74  rstset,s2->first
73e0: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  set);.          
73f0: 69 66 28 20 73 32 2d 3e 6c 61 6d 62 64 61 3d 3d  if( s2->lambda==
7400: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72  LEMON_FALSE ) br
7410: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
7420: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7430: 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20  while( progress 
7440: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
7450: 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c  /* Compute all L
7460: 52 28 30 29 20 73 74 61 74 65 73 20 66 6f 72 20  R(0) states for 
7470: 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 4c 69  the grammar.  Li
7480: 6e 6b 73 0a 2a 2a 20 61 72 65 20 61 64 64 65 64  nks.** are added
7490: 20 74 6f 20 62 65 74 77 65 65 6e 20 73 6f 6d 65   to between some
74a0: 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20   states so that 
74b0: 74 68 65 20 4c 52 28 31 29 20 66 6f 6c 6c 6f 77  the LR(1) follow
74c0: 20 73 65 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20   sets.** can be 
74d0: 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 2e 0a  computed later..
74e0: 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75 63  */.PRIVATE struc
74f0: 74 20 73 74 61 74 65 20 2a 67 65 74 73 74 61 74  t state *getstat
7500: 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  e(struct lemon *
7510: 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64 20 72  );  /* forward r
7520: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f 69 64  eference */.void
7530: 20 46 69 6e 64 53 74 61 74 65 73 28 73 74 72 75   FindStates(stru
7540: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
7550: 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
7560: 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20  l *sp;.  struct 
7570: 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 43 6f 6e  rule *rp;..  Con
7580: 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 3b 0a  figlist_init();.
7590: 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73  .  /* Find the s
75a0: 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20  tart symbol */. 
75b0: 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74   if( lemp->start
75c0: 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d   ){.    sp = Sym
75d0: 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73  bol_find(lemp->s
75e0: 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73  tart);.    if( s
75f0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 72  p==0 ){.      Er
7600: 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
7610: 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 70  ename,0,."The sp
7620: 65 63 69 66 69 65 64 20 73 74 61 72 74 20 73 79  ecified start sy
7630: 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 69 73 20 6e  mbol \"%s\" is n
7640: 6f 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e 74 65 72  ot \.in a nonter
7650: 6d 69 6e 61 6c 20 6f 66 20 74 68 65 20 67 72 61  minal of the gra
7660: 6d 6d 61 72 2e 20 20 5c 22 25 73 5c 22 20 77 69  mmar.  \"%s\" wi
7670: 6c 6c 20 62 65 20 75 73 65 64 20 61 73 20 74 68  ll be used as th
7680: 65 20 73 74 61 72 74 20 5c 0a 73 79 6d 62 6f 6c  e start \.symbol
7690: 20 69 6e 73 74 65 61 64 2e 22 2c 6c 65 6d 70 2d   instead.",lemp-
76a0: 3e 73 74 61 72 74 2c 6c 65 6d 70 2d 3e 73 74 61  >start,lemp->sta
76b0: 72 74 52 75 6c 65 2d 3e 6c 68 73 2d 3e 6e 61 6d  rtRule->lhs->nam
76c0: 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e  e);.      lemp->
76d0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
76e0: 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 74 61    sp = lemp->sta
76f0: 72 74 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 20  rtRule->lhs;.   
7700: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
7710: 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 74 61 72 74  sp = lemp->start
7720: 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 0a  Rule->lhs;.  }..
7730: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
7740: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
7750: 64 6f 65 73 6e 27 74 20 6f 63 63 75 72 20 6f 6e  doesn't occur on
7760: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
7770: 73 69 64 65 20 6f 66 0a 20 20 2a 2a 20 61 6e 79  side of.  ** any
7780: 20 72 75 6c 65 2e 20 20 52 65 70 6f 72 74 20 61   rule.  Report a
7790: 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20 64 6f  n error if it do
77a0: 65 73 2e 20 20 28 59 41 43 43 20 77 6f 75 6c 64  es.  (YACC would
77b0: 20 67 65 6e 65 72 61 74 65 20 61 20 6e 65 77 0a   generate a new.
77c0: 20 20 2a 2a 20 73 74 61 72 74 20 73 79 6d 62 6f    ** start symbo
77d0: 6c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 29  l in this case.)
77e0: 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d   */.  for(rp=lem
77f0: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
7800: 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69  rp->next){.    i
7810: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
7820: 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
7830: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  ++){.      if( r
7840: 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73 70 20 29 7b  p->rhs[i]==sp ){
7850: 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 44     /* FIX ME:  D
7860: 65 61 6c 20 77 69 74 68 20 6d 75 6c 74 69 74 65  eal with multite
7870: 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 20 20 20  rminals */.     
7880: 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
7890: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54  ->filename,0,."T
78a0: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
78b0: 5c 22 25 73 5c 22 20 6f 63 63 75 72 73 20 6f 6e  \"%s\" occurs on
78c0: 20 74 68 65 20 5c 0a 72 69 67 68 74 2d 68 61 6e   the \.right-han
78d0: 64 20 73 69 64 65 20 6f 66 20 61 20 72 75 6c 65  d side of a rule
78e0: 2e 20 54 68 69 73 20 77 69 6c 6c 20 72 65 73 75  . This will resu
78f0: 6c 74 20 69 6e 20 61 20 70 61 72 73 65 72 20 77  lt in a parser w
7900: 68 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f 74 20  hich \.does not 
7910: 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e 22 2c  work properly.",
7920: 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
7930: 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
7940: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
7950: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
7960: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
7970: 74 69 6f 6e 20 73 65 74 20 66 6f 72 20 74 68 65  tion set for the
7980: 20 66 69 72 73 74 20 73 74 61 74 65 0a 20 20 2a   first state.  *
7990: 2a 20 69 73 20 61 6c 6c 20 72 75 6c 65 73 20 77  * is all rules w
79a0: 68 69 63 68 20 68 61 76 65 20 74 68 65 20 73 74  hich have the st
79b0: 61 72 74 20 73 79 6d 62 6f 6c 20 61 73 20 74 68  art symbol as th
79c0: 65 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d 68 61  eir.  ** left-ha
79d0: 6e 64 20 73 69 64 65 20 2a 2f 0a 20 20 66 6f 72  nd side */.  for
79e0: 28 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 72 70  (rp=sp->rule; rp
79f0: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c 68 73  ; rp=rp->nextlhs
7a00: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f  ){.    struct co
7a10: 6e 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a 20 20  nfig *newcfp;.  
7a20: 20 20 72 70 2d 3e 6c 68 73 53 74 61 72 74 20 3d    rp->lhsStart =
7a30: 20 31 3b 0a 20 20 20 20 6e 65 77 63 66 70 20 3d   1;.    newcfp =
7a40: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62   Configlist_addb
7a50: 61 73 69 73 28 72 70 2c 30 29 3b 0a 20 20 20 20  asis(rp,0);.    
7a60: 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66  SetAdd(newcfp->f
7a70: 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ws,0);.  }..  /*
7a80: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72   Compute the fir
7a90: 73 74 20 73 74 61 74 65 2e 20 20 41 6c 6c 20 6f  st state.  All o
7aa0: 74 68 65 72 20 73 74 61 74 65 73 20 77 69 6c 6c  ther states will
7ab0: 20 62 65 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65   be.  ** compute
7ac0: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
7ad0: 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 70 75  during the compu
7ae0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  tation of the fi
7af0: 72 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54 68  rst one..  ** Th
7b00: 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
7b10: 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
7b20: 73 74 61 74 65 20 69 73 20 6e 6f 74 20 75 73 65  state is not use
7b30: 64 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  d. */.  (void)ge
7b40: 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 20 20  tstate(lemp);.  
7b50: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65  return;.}../* Re
7b60: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
7b70: 6f 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  o a state which 
7b80: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
7b90: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
7ba0: 6e 0a 2a 2a 20 6c 69 73 74 20 77 68 69 63 68 20  n.** list which 
7bb0: 68 61 73 20 62 65 65 6e 20 62 75 69 6c 74 20 66  has been built f
7bc0: 72 6f 6d 20 63 61 6c 6c 73 20 74 6f 20 43 6f 6e  rom calls to Con
7bd0: 66 69 67 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f 0a  figlist_add..*/.
7be0: 50 52 49 56 41 54 45 20 76 6f 69 64 20 62 75 69  PRIVATE void bui
7bf0: 6c 64 73 68 69 66 74 73 28 73 74 72 75 63 74 20  ldshifts(struct 
7c00: 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72 75 63 74 20  lemon *, struct 
7c10: 73 74 61 74 65 20 2a 29 3b 20 2f 2a 20 46 6f 72  state *); /* For
7c20: 77 64 20 72 65 66 20 2a 2f 0a 50 52 49 56 41 54  wd ref */.PRIVAT
7c30: 45 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  E struct state *
7c40: 67 65 74 73 74 61 74 65 28 73 74 72 75 63 74 20  getstate(struct 
7c50: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
7c60: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
7c70: 63 66 70 2c 20 2a 62 70 3b 0a 20 20 73 74 72 75  cfp, *bp;.  stru
7c80: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 0a  ct state *stp;..
7c90: 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
7ca0: 20 73 6f 72 74 65 64 20 62 61 73 69 73 20 6f 66   sorted basis of
7cb0: 20 74 68 65 20 6e 65 77 20 73 74 61 74 65 2e 20   the new state. 
7cc0: 20 54 68 65 20 62 61 73 69 73 20 77 61 73 20 63   The basis was c
7cd0: 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20  onstructed.  ** 
7ce0: 62 79 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74  by prior calls t
7cf0: 6f 20 22 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  o "Configlist_ad
7d00: 64 62 61 73 69 73 28 29 22 2e 20 2a 2f 0a 20 20  dbasis()". */.  
7d10: 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62  Configlist_sortb
7d20: 61 73 69 73 28 29 3b 0a 20 20 62 70 20 3d 20 43  asis();.  bp = C
7d30: 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28  onfiglist_basis(
7d40: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 73  );..  /* Get a s
7d50: 74 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61  tate with the sa
7d60: 6d 65 20 62 61 73 69 73 20 2a 2f 0a 20 20 73 74  me basis */.  st
7d70: 70 20 3d 20 53 74 61 74 65 5f 66 69 6e 64 28 62  p = State_find(b
7d80: 70 29 3b 0a 20 20 69 66 28 20 73 74 70 20 29 7b  p);.  if( stp ){
7d90: 0a 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65 20  .    /* A state 
7da0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 62 61  with the same ba
7db0: 73 69 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  sis already exis
7dc0: 74 73 21 20 20 43 6f 70 79 20 61 6c 6c 20 74 68  ts!  Copy all th
7dd0: 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20 20  e follow-set.   
7de0: 20 2a 2a 20 70 72 6f 70 61 67 61 74 69 6f 6e 20   ** propagation 
7df0: 6c 69 6e 6b 73 20 66 72 6f 6d 20 74 68 65 20 73  links from the s
7e00: 74 61 74 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  tate under const
7e10: 72 75 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  ruction into the
7e20: 0a 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74  .    ** preexist
7e30: 69 6e 67 20 73 74 61 74 65 2c 20 74 68 65 6e 20  ing state, then 
7e40: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
7e50: 20 74 6f 20 74 68 65 20 70 72 65 65 78 69 73 74   to the preexist
7e60: 69 6e 67 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  ing state */.   
7e70: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
7e80: 78 2c 20 2a 79 3b 0a 20 20 20 20 66 6f 72 28 78  x, *y;.    for(x
7e90: 3d 62 70 2c 20 79 3d 73 74 70 2d 3e 62 70 3b 20  =bp, y=stp->bp; 
7ea0: 78 20 26 26 20 79 3b 20 78 3d 78 2d 3e 62 70 2c  x && y; x=x->bp,
7eb0: 20 79 3d 79 2d 3e 62 70 29 7b 0a 20 20 20 20 20   y=y->bp){.     
7ec0: 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 26 79 2d 3e   Plink_copy(&y->
7ed0: 62 70 6c 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a 20  bplp,x->bplp);. 
7ee0: 20 20 20 20 20 50 6c 69 6e 6b 5f 64 65 6c 65 74       Plink_delet
7ef0: 65 28 78 2d 3e 66 70 6c 70 29 3b 0a 20 20 20 20  e(x->fplp);.    
7f00: 20 20 78 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e 62    x->fplp = x->b
7f10: 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  plp = 0;.    }. 
7f20: 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c     cfp = Configl
7f30: 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 0a 20 20  ist_return();.  
7f40: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74    Configlist_eat
7f50: 28 63 66 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (cfp);.  }else{.
7f60: 20 20 20 20 2f 2a 20 54 68 69 73 20 72 65 61 6c      /* This real
7f70: 6c 79 20 69 73 20 61 20 6e 65 77 20 73 74 61 74  ly is a new stat
7f80: 65 2e 20 20 43 6f 6e 73 74 72 75 63 74 20 61 6c  e.  Construct al
7f90: 6c 20 74 68 65 20 64 65 74 61 69 6c 73 20 2a 2f  l the details */
7fa0: 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  .    Configlist_
7fb0: 63 6c 6f 73 75 72 65 28 6c 65 6d 70 29 3b 20 20  closure(lemp);  
7fc0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
7fd0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
7fe0: 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 43 6f  losure */.    Co
7ff0: 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29 3b  nfiglist_sort();
8000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
8010: 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  rt the configura
8020: 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a  tion closure */.
8030: 20 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67      cfp = Config
8040: 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 20 20  list_return();  
8050: 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65   /* Get a pointe
8060: 72 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 20  r to the config 
8070: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 70 20  list */.    stp 
8080: 3d 20 53 74 61 74 65 5f 6e 65 77 28 29 3b 20 20  = State_new();  
8090: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65           /* A ne
80a0: 77 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72  w state structur
80b0: 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 6f 72 79 43  e */.    MemoryC
80c0: 68 65 63 6b 28 73 74 70 29 3b 0a 20 20 20 20 73  heck(stp);.    s
80d0: 74 70 2d 3e 62 70 20 3d 20 62 70 3b 20 20 20 20  tp->bp = bp;    
80e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
80f0: 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66  emember the conf
8100: 69 67 75 72 61 74 69 6f 6e 20 62 61 73 69 73 20  iguration basis 
8110: 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 63 66 70 20  */.    stp->cfp 
8120: 3d 20 63 66 70 3b 20 20 20 20 20 20 20 20 20 20  = cfp;          
8130: 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20      /* Remember 
8140: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
8150: 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20  n closure */.   
8160: 20 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 20 3d   stp->statenum =
8170: 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b   lemp->nstate++;
8180: 20 2f 2a 20 45 76 65 72 79 20 73 74 61 74 65 20   /* Every state 
8190: 67 65 74 73 20 61 20 73 65 71 75 65 6e 63 65 20  gets a sequence 
81a0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 73 74  number */.    st
81b0: 70 2d 3e 61 70 20 3d 20 30 3b 20 20 20 20 20 20  p->ap = 0;      
81c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
81d0: 20 61 63 74 69 6f 6e 73 2c 20 79 65 74 2e 20 2a   actions, yet. *
81e0: 2f 0a 20 20 20 20 53 74 61 74 65 5f 69 6e 73 65  /.    State_inse
81f0: 72 74 28 73 74 70 2c 73 74 70 2d 3e 62 70 29 3b  rt(stp,stp->bp);
8200: 20 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65     /* Add to the
8210: 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a   state table */.
8220: 20 20 20 20 62 75 69 6c 64 73 68 69 66 74 73 28      buildshifts(
8230: 6c 65 6d 70 2c 73 74 70 29 3b 20 20 20 20 20 20  lemp,stp);      
8240: 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20   /* Recursively 
8250: 63 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 6f  compute successo
8260: 72 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 7d 0a  r states */.  }.
8270: 20 20 72 65 74 75 72 6e 20 73 74 70 3b 0a 7d 0a    return stp;.}.
8280: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
8290: 75 65 20 69 66 20 74 77 6f 20 73 79 6d 62 6f 6c  ue if two symbol
82a0: 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 0a  s are the same..
82b0: 2a 2f 0a 69 6e 74 20 73 61 6d 65 5f 73 79 6d 62  */.int same_symb
82c0: 6f 6c 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  ol(struct symbol
82d0: 20 2a 61 2c 20 73 74 72 75 63 74 20 73 79 6d 62   *a, struct symb
82e0: 6f 6c 20 2a 62 29 0a 7b 0a 20 20 69 6e 74 20 69  ol *b).{.  int i
82f0: 3b 0a 20 20 69 66 28 20 61 3d 3d 62 20 29 20 72  ;.  if( a==b ) r
8300: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 61  eturn 1;.  if( a
8310: 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52  ->type!=MULTITER
8320: 4d 49 4e 41 4c 20 29 20 72 65 74 75 72 6e 20 30  MINAL ) return 0
8330: 3b 0a 20 20 69 66 28 20 62 2d 3e 74 79 70 65 21  ;.  if( b->type!
8340: 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
8350: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
8360: 20 61 2d 3e 6e 73 75 62 73 79 6d 21 3d 62 2d 3e   a->nsubsym!=b->
8370: 6e 73 75 62 73 79 6d 20 29 20 72 65 74 75 72 6e  nsubsym ) return
8380: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
8390: 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b  <a->nsubsym; i++
83a0: 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 73 75  ){.    if( a->su
83b0: 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e 73 75 62 73  bsym[i]!=b->subs
83c0: 79 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30  ym[i] ) return 0
83d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
83e0: 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63  ;.}../* Construc
83f0: 74 20 61 6c 6c 20 73 75 63 63 65 73 73 6f 72 20  t all successor 
8400: 73 74 61 74 65 73 20 74 6f 20 74 68 65 20 67 69  states to the gi
8410: 76 65 6e 20 73 74 61 74 65 2e 20 20 41 20 22 73  ven state.  A "s
8420: 75 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74 61  uccessor".** sta
8430: 74 65 20 69 73 20 61 6e 79 20 73 74 61 74 65 20  te is any state 
8440: 77 68 69 63 68 20 63 61 6e 20 62 65 20 72 65 61  which can be rea
8450: 63 68 65 64 20 62 79 20 61 20 73 68 69 66 74 20  ched by a shift 
8460: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41  action..*/.PRIVA
8470: 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69  TE void buildshi
8480: 66 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  fts(struct lemon
8490: 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 73   *lemp, struct s
84a0: 74 61 74 65 20 2a 73 74 70 29 0a 7b 0a 20 20 73  tate *stp).{.  s
84b0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
84c0: 70 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  p;  /* For loopi
84d0: 6e 67 20 74 68 72 75 20 74 68 65 20 63 6f 6e 66  ng thru the conf
84e0: 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73  ig closure of "s
84f0: 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  tp" */.  struct 
8500: 63 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20 2f 2a  config *bcfp; /*
8510: 20 46 6f 72 20 74 68 65 20 69 6e 6e 65 72 20 6c   For the inner l
8520: 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20 63 6c  oop on config cl
8530: 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a  osure of "stp" *
8540: 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  /.  struct confi
8550: 67 20 2a 6e 65 77 63 66 67 3b 20 20 2f 2a 20 2a  g *newcfg;  /* *
8560: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
8570: 6c 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62  l *sp;   /* Symb
8580: 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ol following the
8590: 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72   dot in configur
85a0: 61 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20  ation "cfp" */. 
85b0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
85c0: 62 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20  bsp;  /* Symbol 
85d0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f  following the do
85e0: 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69  t in configurati
85f0: 6f 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20 20 73  on "bcfp" */.  s
8600: 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77  truct state *new
8610: 73 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65  stp; /* A pointe
8620: 72 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72  r to a successor
8630: 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20   state */..  /* 
8640: 45 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69  Each configurati
8650: 6f 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c  on becomes compl
8660: 65 74 65 20 61 66 74 65 72 20 69 74 20 63 6f 6e  ete after it con
8670: 74 69 62 75 74 65 73 20 74 6f 20 61 20 73 75 63  tibutes to a suc
8680: 63 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74  cessor.  ** stat
8690: 65 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61  e.  Initially, a
86a0: 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ll configuration
86b0: 73 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65  s are incomplete
86c0: 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74   */.  for(cfp=st
86d0: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
86e0: 3d 63 66 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d  =cfp->next) cfp-
86f0: 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50  >status = INCOMP
8700: 4c 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  LETE;..  /* Loop
8710: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e   through all con
8720: 66 69 67 75 72 61 74 69 6f 6e 73 20 6f 66 20 74  figurations of t
8730: 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20 2a  he state "stp" *
8740: 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d  /.  for(cfp=stp-
8750: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
8760: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69  fp->next){.    i
8770: 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d  f( cfp->status==
8780: 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69  COMPLETE ) conti
8790: 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61  nue;    /* Alrea
87a0: 64 79 20 75 73 65 64 20 62 79 20 69 6e 6e 65 72  dy used by inner
87b0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28   loop */.    if(
87c0: 20 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e   cfp->dot>=cfp->
87d0: 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69  rp->nrhs ) conti
87e0: 6e 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73  nue;  /* Can't s
87f0: 68 69 66 74 20 74 68 69 73 20 63 6f 6e 66 69 67  hift this config
8800: 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69   */.    Configli
8810: 73 74 5f 72 65 73 65 74 28 29 3b 20 20 20 20 20  st_reset();     
8820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8830: 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6e 65   /* Reset the ne
8840: 77 20 63 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a  w config set */.
8850: 20 20 20 20 73 70 20 3d 20 63 66 70 2d 3e 72 70      sp = cfp->rp
8860: 2d 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b  ->rhs[cfp->dot];
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8880: 53 79 6d 62 6f 6c 20 61 66 74 65 72 20 74 68 65  Symbol after the
8890: 20 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   dot */..    /* 
88a0: 46 6f 72 20 65 76 65 72 79 20 63 6f 6e 66 69 67  For every config
88b0: 75 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  uration in the s
88c0: 74 61 74 65 20 22 73 74 70 22 20 77 68 69 63 68  tate "stp" which
88d0: 20 68 61 73 20 74 68 65 20 73 79 6d 62 6f 6c 20   has the symbol 
88e0: 22 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c  "sp".    ** foll
88f0: 6f 77 69 6e 67 20 69 74 73 20 64 6f 74 2c 20 61  owing its dot, a
8900: 64 64 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 66  dd the same conf
8910: 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65  iguration to the
8920: 20 62 61 73 69 73 20 73 65 74 20 75 6e 64 65 72   basis set under
8930: 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63  .    ** construc
8940: 74 69 6f 6e 20 62 75 74 20 77 69 74 68 20 74 68  tion but with th
8950: 65 20 64 6f 74 20 73 68 69 66 74 65 64 20 6f 6e  e dot shifted on
8960: 65 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20  e symbol to the 
8970: 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f  right. */.    fo
8980: 72 28 62 63 66 70 3d 63 66 70 3b 20 62 63 66 70  r(bcfp=cfp; bcfp
8990: 3b 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78  ; bcfp=bcfp->nex
89a0: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 63  t){.      if( bc
89b0: 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50  fp->status==COMP
89c0: 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LETE ) continue;
89d0: 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75      /* Already u
89e0: 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  sed */.      if(
89f0: 20 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70   bcfp->dot>=bcfp
8a00: 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e  ->rp->nrhs ) con
8a10: 74 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20  tinue; /* Can't 
8a20: 73 68 69 66 74 20 74 68 69 73 20 6f 6e 65 20 2a  shift this one *
8a30: 2f 0a 20 20 20 20 20 20 62 73 70 20 3d 20 62 63  /.      bsp = bc
8a40: 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70  fp->rp->rhs[bcfp
8a50: 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20  ->dot];         
8a60: 20 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20    /* Get symbol 
8a70: 61 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20  after dot */.   
8a80: 20 20 20 69 66 28 20 21 73 61 6d 65 5f 73 79 6d     if( !same_sym
8a90: 62 6f 6c 28 62 73 70 2c 73 70 29 20 29 20 63 6f  bol(bsp,sp) ) co
8aa0: 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 2f 2a 20  ntinue;      /* 
8ab0: 4d 75 73 74 20 62 65 20 73 61 6d 65 20 61 73 20  Must be same as 
8ac0: 66 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20 20 20  for "cfp" */.   
8ad0: 20 20 20 62 63 66 70 2d 3e 73 74 61 74 75 73 20     bcfp->status 
8ae0: 3d 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20  = COMPLETE;     
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8b00: 4d 61 72 6b 20 74 68 69 73 20 63 6f 6e 66 69 67  Mark this config
8b10: 20 61 73 20 75 73 65 64 20 2a 2f 0a 20 20 20 20   as used */.    
8b20: 20 20 6e 65 77 63 66 67 20 3d 20 43 6f 6e 66 69    newcfg = Confi
8b30: 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 62  glist_addbasis(b
8b40: 63 66 70 2d 3e 72 70 2c 62 63 66 70 2d 3e 64 6f  cfp->rp,bcfp->do
8b50: 74 2b 31 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e  t+1);.      Plin
8b60: 6b 5f 61 64 64 28 26 6e 65 77 63 66 67 2d 3e 62  k_add(&newcfg->b
8b70: 70 6c 70 2c 62 63 66 70 29 3b 0a 20 20 20 20 7d  plp,bcfp);.    }
8b80: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 20 70  ..    /* Get a p
8b90: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74  ointer to the st
8ba0: 61 74 65 20 64 65 73 63 72 69 62 65 64 20 62 79  ate described by
8bb0: 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69   the basis confi
8bc0: 67 75 72 61 74 69 6f 6e 20 73 65 74 0a 20 20 20  guration set.   
8bd0: 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20   ** constructed 
8be0: 69 6e 20 74 68 65 20 70 72 65 63 65 64 69 6e 67  in the preceding
8bf0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 6e 65 77   loop */.    new
8c00: 73 74 70 20 3d 20 67 65 74 73 74 61 74 65 28 6c  stp = getstate(l
8c10: 65 6d 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  emp);..    /* Th
8c20: 65 20 73 74 61 74 65 20 22 6e 65 77 73 74 70 22  e state "newstp"
8c30: 20 69 73 20 72 65 61 63 68 65 64 20 66 72 6f 6d   is reached from
8c40: 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22   the state "stp"
8c50: 20 62 79 20 61 20 73 68 69 66 74 20 61 63 74 69   by a shift acti
8c60: 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  on.    ** on the
8c70: 20 73 79 6d 62 6f 6c 20 22 73 70 22 20 2a 2f 0a   symbol "sp" */.
8c80: 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
8c90: 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
8ca0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
8cb0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8cc0: 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b  <sp->nsubsym; i+
8cd0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 41 63 74 69  +){.        Acti
8ce0: 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c  on_add(&stp->ap,
8cf0: 53 48 49 46 54 2c 73 70 2d 3e 73 75 62 73 79 6d  SHIFT,sp->subsym
8d00: 5b 69 5d 2c 28 63 68 61 72 2a 29 6e 65 77 73 74  [i],(char*)newst
8d10: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
8d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 41 63 74  }else{.      Act
8d30: 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70  ion_add(&stp->ap
8d40: 2c 53 48 49 46 54 2c 73 70 2c 28 63 68 61 72 20  ,SHIFT,sp,(char 
8d50: 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20 20 7d  *)newstp);.    }
8d60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
8d70: 6e 73 74 72 75 63 74 20 74 68 65 20 70 72 6f 70  nstruct the prop
8d80: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f  agation links.*/
8d90: 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28  .void FindLinks(
8da0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
8db0: 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp).{.  int i;. 
8dc0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
8dd0: 63 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20 20 73  cfp, *other;.  s
8de0: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
8df0: 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  ;.  struct plink
8e00: 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f 75   *plp;..  /* Hou
8e10: 73 65 6b 65 65 70 69 6e 67 20 64 65 74 61 69 6c  sekeeping detail
8e20: 3a 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20 65 76  :.  ** Add to ev
8e30: 65 72 79 20 70 72 6f 70 61 67 61 74 65 20 6c 69  ery propagate li
8e40: 6e 6b 20 61 20 70 6f 69 6e 74 65 72 20 62 61 63  nk a pointer bac
8e50: 6b 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74  k to the state t
8e60: 6f 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65  o.  ** which the
8e70: 20 6c 69 6e 6b 20 69 73 20 61 74 74 61 63 68 65   link is attache
8e80: 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  d. */.  for(i=0;
8e90: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
8ea0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
8eb0: 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
8ec0: 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74  ;.    for(cfp=st
8ed0: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
8ee0: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
8ef0: 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 73 74     cfp->stp = st
8f00: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  p;.    }.  }..  
8f10: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 62  /* Convert all b
8f20: 61 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20 66 6f  acklinks into fo
8f30: 72 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20 4f 6e  rward links.  On
8f40: 6c 79 20 74 68 65 20 66 6f 72 77 61 72 64 0a 20  ly the forward. 
8f50: 20 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20 75 73   ** links are us
8f60: 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ed in the follow
8f70: 2d 73 65 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e  -set computation
8f80: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
8f90: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
8fa0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
8fb0: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
8fc0: 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70  .    for(cfp=stp
8fd0: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
8fe0: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
8ff0: 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 62    for(plp=cfp->b
9000: 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c  plp; plp; plp=pl
9010: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
9020: 20 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d 3e 63    other = plp->c
9030: 66 70 3b 0a 20 20 20 20 20 20 20 20 50 6c 69 6e  fp;.        Plin
9040: 6b 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e 66 70  k_add(&other->fp
9050: 6c 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20 7d  lp,cfp);.      }
9060: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9070: 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66 6f 6c   Compute all fol
9080: 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 41  lowsets..**.** A
9090: 20 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20 74 68   followset is th
90a0: 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 73 79 6d  e set of all sym
90b0: 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20 63  bols which can c
90c0: 6f 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  ome immediately.
90d0: 2a 2a 20 61 66 74 65 72 20 61 20 63 6f 6e 66 69  ** after a confi
90e0: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  guration..*/.voi
90f0: 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73  d FindFollowSets
9100: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
9110: 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp).{.  int i;.
9120: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
9130: 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 70  *cfp;.  struct p
9140: 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e 74  link *plp;.  int
9150: 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 69 6e 74   progress;.  int
9160: 20 63 68 61 6e 67 65 3b 0a 0a 20 20 66 6f 72 28   change;..  for(
9170: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
9180: 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66  ate; i++){.    f
9190: 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72  or(cfp=lemp->sor
91a0: 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70  ted[i]->cfp; cfp
91b0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
91c0: 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61  {.      cfp->sta
91d0: 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45  tus = INCOMPLETE
91e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
91f0: 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73   do{.    progres
9200: 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  s = 0;.    for(i
9210: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
9220: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
9230: 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f  for(cfp=lemp->so
9240: 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66  rted[i]->cfp; cf
9250: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
9260: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
9270: 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50  fp->status==COMP
9280: 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LETE ) continue;
9290: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 6c 70  .        for(plp
92a0: 3d 63 66 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b  =cfp->fplp; plp;
92b0: 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b   plp=plp->next){
92c0: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 67  .          chang
92d0: 65 20 3d 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70  e = SetUnion(plp
92e0: 2d 3e 63 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e  ->cfp->fws,cfp->
92f0: 66 77 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  fws);.          
9300: 69 66 28 20 63 68 61 6e 67 65 20 29 7b 0a 20 20  if( change ){.  
9310: 20 20 20 20 20 20 20 20 20 20 70 6c 70 2d 3e 63            plp->c
9320: 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43  fp->status = INC
9330: 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 20  OMPLETE;.       
9340: 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20       progress = 
9350: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
9360: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9370: 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43   cfp->status = C
9380: 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  OMPLETE;.      }
9390: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
93a0: 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a   progress );.}..
93b0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
93c0: 76 65 5f 63 6f 6e 66 6c 69 63 74 28 73 74 72 75  ve_conflict(stru
93d0: 63 74 20 61 63 74 69 6f 6e 20 2a 2c 73 74 72 75  ct action *,stru
93e0: 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f  ct action *);../
93f0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72 65  * Compute the re
9400: 64 75 63 65 20 61 63 74 69 6f 6e 73 2c 20 61 6e  duce actions, an
9410: 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69  d resolve confli
9420: 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e  cts..*/.void Fin
9430: 64 41 63 74 69 6f 6e 73 28 73 74 72 75 63 74 20  dActions(struct 
9440: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
9450: 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74 72 75   int i,j;.  stru
9460: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a  ct config *cfp;.
9470: 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
9480: 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79  stp;.  struct sy
9490: 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75  mbol *sp;.  stru
94a0: 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20  ct rule *rp;..  
94b0: 2f 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20 74 68  /* Add all of th
94c0: 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73  e reduce actions
94d0: 20 0a 20 20 2a 2a 20 41 20 72 65 64 75 63 65 20   .  ** A reduce 
94e0: 61 63 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20  action is added 
94f0: 66 6f 72 20 65 61 63 68 20 65 6c 65 6d 65 6e 74  for each element
9500: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 73 65   of the followse
9510: 74 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f 6e 66  t of.  ** a conf
9520: 69 67 75 72 61 74 69 6f 6e 20 77 68 69 63 68 20  iguration which 
9530: 68 61 73 20 69 74 73 20 64 6f 74 20 61 74 20 74  has its dot at t
9540: 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  he extreme right
9550: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
9560: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
9570: 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f  ; i++){   /* Loo
9580: 70 20 6f 76 65 72 20 61 6c 6c 20 73 74 61 74 65  p over all state
9590: 73 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c  s */.    stp = l
95a0: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
95b0: 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d      for(cfp=stp-
95c0: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
95d0: 66 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a 20 4c  fp->next){  /* L
95e0: 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63 6f 6e  oop over all con
95f0: 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20  figurations */. 
9600: 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e 72 70       if( cfp->rp
9610: 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64 6f 74  ->nrhs==cfp->dot
9620: 20 29 7b 20 20 20 20 20 20 20 20 2f 2a 20 49 73   ){        /* Is
9630: 20 64 6f 74 20 61 74 20 65 78 74 72 65 6d 65 20   dot at extreme 
9640: 72 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20 20 20  right? */.      
9650: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d    for(j=0; j<lem
9660: 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b  p->nterminal; j+
9670: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
9680: 28 20 53 65 74 46 69 6e 64 28 63 66 70 2d 3e 66  ( SetFind(cfp->f
9690: 77 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20 20 20  ws,j) ){.       
96a0: 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 72 65       /* Add a re
96b0: 64 75 63 65 20 61 63 74 69 6f 6e 20 74 6f 20 74  duce action to t
96c0: 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20 77  he state "stp" w
96d0: 68 69 63 68 20 77 69 6c 6c 20 72 65 64 75 63 65  hich will reduce
96e0: 20 62 79 20 74 68 65 0a 20 20 20 20 20 20 20 20   by the.        
96f0: 20 20 20 20 2a 2a 20 72 75 6c 65 20 22 63 66 70      ** rule "cfp
9700: 2d 3e 72 70 22 20 69 66 20 74 68 65 20 6c 6f 6f  ->rp" if the loo
9710: 6b 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 69 73  kahead symbol is
9720: 20 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b   "lemp->symbols[
9730: 6a 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  j]" */.         
9740: 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73     Action_add(&s
9750: 74 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c 6c 65  tp->ap,REDUCE,le
9760: 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 28  mp->symbols[j],(
9770: 63 68 61 72 20 2a 29 63 66 70 2d 3e 72 70 29 3b  char *)cfp->rp);
9780: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9790: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
97a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
97b0: 64 64 20 74 68 65 20 61 63 63 65 70 74 69 6e 67  dd the accepting
97c0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66 28 20   token */.  if( 
97d0: 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20  lemp->start ){. 
97e0: 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66     sp = Symbol_f
97f0: 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29  ind(lemp->start)
9800: 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20  ;.    if( sp==0 
9810: 29 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 74 61  ) sp = lemp->sta
9820: 72 74 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d  rtRule->lhs;.  }
9830: 65 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c  else{.    sp = l
9840: 65 6d 70 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e  emp->startRule->
9850: 6c 68 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 64  lhs;.  }.  /* Ad
9860: 64 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 73  d to the first s
9870: 74 61 74 65 20 28 77 68 69 63 68 20 69 73 20 61  tate (which is a
9880: 6c 77 61 79 73 20 74 68 65 20 73 74 61 72 74 69  lways the starti
9890: 6e 67 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  ng state of the.
98a0: 20 20 2a 2a 20 66 69 6e 69 74 65 20 73 74 61 74    ** finite stat
98b0: 65 20 6d 61 63 68 69 6e 65 29 20 61 6e 20 61 63  e machine) an ac
98c0: 74 69 6f 6e 20 74 6f 20 41 43 43 45 50 54 20 69  tion to ACCEPT i
98d0: 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  f the lookahead 
98e0: 69 73 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72  is the.  ** star
98f0: 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 20  t nonterminal.  
9900: 2a 2f 0a 20 20 41 63 74 69 6f 6e 5f 61 64 64 28  */.  Action_add(
9910: 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d  &lemp->sorted[0]
9920: 2d 3e 61 70 2c 41 43 43 45 50 54 2c 73 70 2c 30  ->ap,ACCEPT,sp,0
9930: 29 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  );..  /* Resolve
9940: 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20   conflicts */.  
9950: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
9960: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
9970: 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e     struct action
9980: 20 2a 61 70 2c 20 2a 6e 61 70 3b 0a 20 20 20 20   *ap, *nap;.    
9990: 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
99a0: 65 64 5b 69 5d 3b 0a 20 20 20 20 2f 2a 20 61 73  ed[i];.    /* as
99b0: 73 65 72 74 28 20 73 74 70 2d 3e 61 70 20 29 3b  sert( stp->ap );
99c0: 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 61 70 20   */.    stp->ap 
99d0: 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74  = Action_sort(st
99e0: 70 2d 3e 61 70 29 3b 0a 20 20 20 20 66 6f 72 28  p->ap);.    for(
99f0: 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 20 26  ap=stp->ap; ap &
9a00: 26 20 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61  & ap->next; ap=a
9a10: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
9a20: 66 6f 72 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74  for(nap=ap->next
9a30: 3b 20 6e 61 70 20 26 26 20 6e 61 70 2d 3e 73 70  ; nap && nap->sp
9a40: 3d 3d 61 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61  ==ap->sp; nap=na
9a50: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
9a60: 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 61 63     /* The two ac
9a70: 74 69 6f 6e 73 20 22 61 70 22 20 61 6e 64 20 22  tions "ap" and "
9a80: 6e 61 70 22 20 68 61 76 65 20 74 68 65 20 73 61  nap" have the sa
9a90: 6d 65 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20  me lookahead..  
9aa0: 20 20 20 20 20 20 20 2a 2a 20 46 69 67 75 72 65         ** Figure
9ab0: 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 73   out which one s
9ac0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 2a 2f  hould be used */
9ad0: 0a 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e  .         lemp->
9ae0: 6e 63 6f 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73  nconflict += res
9af0: 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70  olve_conflict(ap
9b00: 2c 6e 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ,nap);.      }. 
9b10: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
9b20: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 66  eport an error f
9b30: 6f 72 20 65 61 63 68 20 72 75 6c 65 20 74 68 61  or each rule tha
9b40: 74 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 72  t can never be r
9b50: 65 64 75 63 65 64 2e 20 2a 2f 0a 20 20 66 6f 72  educed. */.  for
9b60: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
9b70: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
9b80: 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d   rp->canReduce =
9b90: 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20   LEMON_FALSE;.  
9ba0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
9bb0: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
9bc0: 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e     struct action
9bd0: 20 2a 61 70 3b 0a 20 20 20 20 66 6f 72 28 61 70   *ap;.    for(ap
9be0: 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d  =lemp->sorted[i]
9bf0: 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
9c00: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
9c10: 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55  ( ap->type==REDU
9c20: 43 45 20 29 20 61 70 2d 3e 78 2e 72 70 2d 3e 63  CE ) ap->x.rp->c
9c30: 61 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e  anReduce = LEMON
9c40: 5f 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _TRUE;.    }.  }
9c50: 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
9c60: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
9c70: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
9c80: 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 29 20  rp->canReduce ) 
9c90: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 45 72  continue;.    Er
9ca0: 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
9cb0: 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69  ename,rp->ruleli
9cc0: 6e 65 2c 22 54 68 69 73 20 72 75 6c 65 20 63 61  ne,"This rule ca
9cd0: 6e 20 6e 6f 74 20 62 65 20 72 65 64 75 63 65 64  n not be reduced
9ce0: 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c 65 6d 70 2d  .\n");.    lemp-
9cf0: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d  >errorcnt++;.  }
9d00: 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61  .}../* Resolve a
9d10: 20 63 6f 6e 66 6c 69 63 74 20 62 65 74 77 65 65   conflict betwee
9d20: 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20  n the two given 
9d30: 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65  actions.  If the
9d40: 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 63 61 6e  .** conflict can
9d50: 27 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2c 20  't be resolved, 
9d60: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
9d70: 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47 45 52  .**.** NO LONGER
9d80: 20 54 52 55 45 3a 0a 2a 2a 20 20 20 54 6f 20 72   TRUE:.**   To r
9d90: 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63  esolve a conflic
9da0: 74 2c 20 66 69 72 73 74 20 6c 6f 6f 6b 20 74 6f  t, first look to
9db0: 20 73 65 65 20 69 66 20 65 69 74 68 65 72 20 61   see if either a
9dc0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20 6f 6e  ction.**   is on
9dd0: 20 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2e 20   an error rule. 
9de0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
9df0: 61 6b 65 20 74 68 65 20 61 63 74 69 6f 6e 20 77  ake the action w
9e00: 68 69 63 68 0a 2a 2a 20 20 20 69 73 20 6e 6f 74  hich.**   is not
9e10: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9e20: 20 74 68 65 20 65 72 72 6f 72 20 72 75 6c 65 2e   the error rule.
9e30: 20 20 49 66 20 6e 65 69 74 68 65 72 20 6f 72 20    If neither or 
9e40: 62 6f 74 68 0a 2a 2a 20 20 20 61 63 74 69 6f 6e  both.**   action
9e50: 73 20 61 72 65 20 61 73 73 6f 63 69 61 74 65 64  s are associated
9e60: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 72   with an error r
9e70: 75 6c 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  ule, then try to
9e80: 0a 2a 2a 20 20 20 75 73 65 20 70 72 65 63 65 64  .**   use preced
9e90: 65 6e 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  ence to resolve 
9ea0: 74 68 65 20 63 6f 6e 66 6c 69 63 74 2e 0a 2a 2a  the conflict..**
9eb0: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 61 63  .** If either ac
9ec0: 74 69 6f 6e 20 69 73 20 61 20 53 48 49 46 54 2c  tion is a SHIFT,
9ed0: 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65   then it must be
9ee0: 20 61 70 78 2e 20 20 54 68 69 73 0a 2a 2a 20 66   apx.  This.** f
9ef0: 75 6e 63 74 69 6f 6e 20 77 6f 6e 27 74 20 77 6f  unction won't wo
9f00: 72 6b 20 69 66 20 61 70 78 2d 3e 74 79 70 65 3d  rk if apx->type=
9f10: 3d 52 45 44 55 43 45 20 61 6e 64 20 61 70 79 2d  =REDUCE and apy-
9f20: 3e 74 79 70 65 3d 3d 53 48 49 46 54 2e 0a 2a 2f  >type==SHIFT..*/
9f30: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f  .static int reso
9f40: 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 0a 20 20  lve_conflict(.  
9f50: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
9f60: 70 78 2c 0a 20 20 73 74 72 75 63 74 20 61 63 74  px,.  struct act
9f70: 69 6f 6e 20 2a 61 70 79 0a 29 7b 0a 20 20 73 74  ion *apy.){.  st
9f80: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 78  ruct symbol *spx
9f90: 2c 20 2a 73 70 79 3b 0a 20 20 69 6e 74 20 65 72  , *spy;.  int er
9fa0: 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 73 73 65  rcnt = 0;.  asse
9fb0: 72 74 28 20 61 70 78 2d 3e 73 70 3d 3d 61 70 79  rt( apx->sp==apy
9fc0: 2d 3e 73 70 20 29 3b 20 20 2f 2a 20 4f 74 68 65  ->sp );  /* Othe
9fd0: 72 77 69 73 65 20 74 68 65 72 65 20 77 6f 75 6c  rwise there woul
9fe0: 64 20 62 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74  d be no conflict
9ff0: 20 2a 2f 0a 20 20 69 66 28 20 61 70 78 2d 3e 74   */.  if( apx->t
a000: 79 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70  ype==SHIFT && ap
a010: 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 29  y->type==SHIFT )
a020: 7b 0a 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20  {.    apy->type 
a030: 3d 20 53 53 43 4f 4e 46 4c 49 43 54 3b 0a 20 20  = SSCONFLICT;.  
a040: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a    errcnt++;.  }.
a050: 20 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d    if( apx->type=
a060: 3d 53 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74  =SHIFT && apy->t
a070: 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20  ype==REDUCE ){. 
a080: 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 73 70     spx = apx->sp
a090: 3b 0a 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d  ;.    spy = apy-
a0a0: 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a  >x.rp->precsym;.
a0b0: 20 20 20 20 69 66 28 20 73 70 79 3d 3d 30 20 7c      if( spy==0 |
a0c0: 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c  | spx->prec<0 ||
a0d0: 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 29 7b 0a   spy->prec<0 ){.
a0e0: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f        /* Not eno
a0f0: 75 67 68 20 70 72 65 63 65 64 65 6e 63 65 20 69  ugh precedence i
a100: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20  nformation. */. 
a110: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
a120: 20 53 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20   SRCONFLICT;.   
a130: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
a140: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
a150: 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29  prec>spy->prec )
a160: 7b 20 20 20 20 2f 2a 20 68 69 67 68 65 72 20 70  {    /* higher p
a170: 72 65 63 65 64 65 6e 63 65 20 77 69 6e 73 20 2a  recedence wins *
a180: 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  /.      apy->typ
a190: 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b  e = RD_RESOLVED;
a1a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
a1b0: 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72  px->prec<spy->pr
a1c0: 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d  ec ){.      apx-
a1d0: 3e 74 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c  >type = SH_RESOL
a1e0: 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  VED;.    }else i
a1f0: 66 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70  f( spx->prec==sp
a200: 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e  y->prec && spx->
a210: 61 73 73 6f 63 3d 3d 52 49 47 48 54 20 29 7b 20  assoc==RIGHT ){ 
a220: 2f 2a 20 55 73 65 20 6f 70 65 72 61 74 6f 72 20  /* Use operator 
a230: 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  */.      apy->ty
a240: 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44  pe = RD_RESOLVED
a250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a270: 20 61 73 73 6f 63 69 61 74 69 76 69 74 79 20 2a   associativity *
a280: 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
a290: 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e  spx->prec==spy->
a2a0: 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73  prec && spx->ass
a2b0: 6f 63 3d 3d 4c 45 46 54 20 29 7b 20 20 2f 2a 20  oc==LEFT ){  /* 
a2c0: 74 6f 20 62 72 65 61 6b 20 74 69 65 20 2a 2f 0a  to break tie */.
a2d0: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20        apx->type 
a2e0: 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = SH_RESOLVED;. 
a2f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a300: 61 73 73 65 72 74 28 20 73 70 78 2d 3e 70 72 65  assert( spx->pre
a310: 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20  c==spy->prec && 
a320: 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45  spx->assoc==NONE
a330: 20 29 3b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   );.      apx->t
a340: 79 70 65 20 3d 20 45 52 52 4f 52 3b 0a 20 20 20  ype = ERROR;.   
a350: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61   }.  }else if( a
a360: 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  px->type==REDUCE
a370: 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52   && apy->type==R
a380: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78  EDUCE ){.    spx
a390: 20 3d 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72   = apx->x.rp->pr
a3a0: 65 63 73 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d  ecsym;.    spy =
a3b0: 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63   apy->x.rp->prec
a3c0: 73 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 78  sym;.    if( spx
a3d0: 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c  ==0 || spy==0 ||
a3e0: 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a   spx->prec<0 ||.
a3f0: 20 20 20 20 73 70 79 2d 3e 70 72 65 63 3c 30 20      spy->prec<0 
a400: 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70  || spx->prec==sp
a410: 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20  y->prec ){.     
a420: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 52 43   apy->type = RRC
a430: 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65  ONFLICT;.      e
a440: 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c  rrcnt++;.    }el
a450: 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63  se if( spx->prec
a460: 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20  >spy->prec ){.  
a470: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
a480: 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20  RD_RESOLVED;.   
a490: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
a4a0: 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29  prec<spy->prec )
a4b0: 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  {.      apx->typ
a4c0: 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b  e = RD_RESOLVED;
a4d0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
a4e0: 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20      assert( .   
a4f0: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48     apx->type==SH
a500: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
a510: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44     apx->type==RD
a520: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
a530: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 53     apx->type==SS
a540: 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20  CONFLICT ||.    
a550: 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 52 43    apx->type==SRC
a560: 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20  ONFLICT ||.     
a570: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 52 43 4f   apx->type==RRCO
a580: 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20  NFLICT ||.      
a590: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45  apy->type==SH_RE
a5a0: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
a5b0: 61 70 79 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45  apy->type==RD_RE
a5c0: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
a5d0: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e  apy->type==SSCON
a5e0: 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61  FLICT ||.      a
a5f0: 70 79 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46  py->type==SRCONF
a600: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
a610: 79 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c  y->type==RRCONFL
a620: 49 43 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f  ICT.    );.    /
a630: 2a 20 54 68 65 20 52 45 44 55 43 45 2f 53 48 49  * The REDUCE/SHI
a640: 46 54 20 63 61 73 65 20 63 61 6e 6e 6f 74 20 68  FT case cannot h
a650: 61 70 70 65 6e 20 62 65 63 61 75 73 65 20 53 48  appen because SH
a660: 49 46 54 73 20 63 6f 6d 65 20 62 65 66 6f 72 65  IFTs come before
a670: 0a 20 20 20 20 2a 2a 20 52 45 44 55 43 45 73 20  .    ** REDUCEs 
a680: 6f 6e 20 74 68 65 20 6c 69 73 74 2e 20 20 49 66  on the list.  If
a690: 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
a6a0: 6f 69 6e 74 20 69 74 20 6d 75 73 74 20 62 65 20  oint it must be 
a6b0: 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74  because.    ** t
a6c0: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 66 6c 69  he parser confli
a6d0: 63 74 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  ct had already b
a6e0: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f  een resolved. */
a6f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72  .  }.  return er
a700: 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  rcnt;.}./*******
a710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
a720: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 63 6f  rom the file "co
a730: 6e 66 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a  nfiglist.c" ****
a740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a750: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75  *****/./*.** Rou
a760: 74 69 6e 65 73 20 74 6f 20 70 72 6f 63 65 73 73  tines to process
a770: 69 6e 67 20 61 20 63 6f 6e 66 69 67 75 72 61 74  ing a configurat
a780: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 62 75 69  ion list and bui
a790: 6c 64 69 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a  lding a state.**
a7a0: 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
a7b0: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
a7c0: 2a 2f 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63  */..static struc
a7d0: 74 20 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69  t config *freeli
a7e0: 73 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  st = 0;      /* 
a7f0: 4c 69 73 74 20 6f 66 20 66 72 65 65 20 63 6f 6e  List of free con
a800: 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  figurations */.s
a810: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
a820: 66 69 67 20 2a 63 75 72 72 65 6e 74 20 3d 20 30  fig *current = 0
a830: 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f  ;       /* Top o
a840: 66 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67  f list of config
a850: 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  urations */.stat
a860: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
a870: 20 2a 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20   **currentend = 
a880: 30 3b 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20  0;   /* Last on 
a890: 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 73 20  list of configs 
a8a0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
a8b0: 20 63 6f 6e 66 69 67 20 2a 62 61 73 69 73 20 3d   config *basis =
a8c0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
a8d0: 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61  op of list of ba
a8e0: 73 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73  sis configs */.s
a8f0: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
a900: 66 69 67 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d  fig **basisend =
a910: 20 30 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f   0;     /* End o
a920: 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20  f list of basis 
a930: 63 6f 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52  configs */../* R
a940: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
a950: 74 6f 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75  to a new configu
a960: 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54  ration */.PRIVAT
a970: 45 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  E struct config 
a980: 2a 6e 65 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20  *newconfig(){.  
a990: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
a9a0: 65 77 63 66 67 3b 0a 20 20 69 66 28 20 66 72 65  ewcfg;.  if( fre
a9b0: 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
a9c0: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61  int i;.    int a
a9d0: 6d 74 20 3d 20 33 3b 0a 20 20 20 20 66 72 65 65  mt = 3;.    free
a9e0: 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20 63  list = (struct c
a9f0: 6f 6e 66 69 67 20 2a 29 63 61 6c 6c 6f 63 28 20  onfig *)calloc( 
aa00: 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  amt, sizeof(stru
aa10: 63 74 20 63 6f 6e 66 69 67 29 20 29 3b 0a 20 20  ct config) );.  
aa20: 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d    if( freelist==
aa30: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
aa40: 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c  tf(stderr,"Unabl
aa50: 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
aa60: 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 63  mory for a new c
aa70: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 22 29 3b  onfiguration.");
aa80: 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
aa90: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
aaa0: 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29  0; i<amt-1; i++)
aab0: 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78   freelist[i].nex
aac0: 74 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b  t = &freelist[i+
aad0: 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74  1];.    freelist
aae0: 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30  [amt-1].next = 0
aaf0: 3b 0a 20 20 7d 0a 20 20 6e 65 77 63 66 67 20 3d  ;.  }.  newcfg =
ab00: 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65   freelist;.  fre
ab10: 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69 73 74  elist = freelist
ab20: 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e  ->next;.  return
ab30: 20 6e 65 77 63 66 67 3b 0a 7d 0a 0a 2f 2a 20 54   newcfg;.}../* T
ab40: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
ab50: 20 22 6f 6c 64 22 20 69 73 20 6e 6f 20 6c 6f 6e   "old" is no lon
ab60: 67 65 72 20 75 73 65 64 20 2a 2f 0a 50 52 49 56  ger used */.PRIV
ab70: 41 54 45 20 76 6f 69 64 20 64 65 6c 65 74 65 63  ATE void deletec
ab80: 6f 6e 66 69 67 28 73 74 72 75 63 74 20 63 6f 6e  onfig(struct con
ab90: 66 69 67 20 2a 6f 6c 64 29 0a 7b 0a 20 20 6f 6c  fig *old).{.  ol
aba0: 64 2d 3e 6e 65 78 74 20 3d 20 66 72 65 65 6c 69  d->next = freeli
abb0: 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d  st;.  freelist =
abc0: 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74   old;.}../* Init
abd0: 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66  ialized the conf
abe0: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62  iguration list b
abf0: 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43  uilder */.void C
ac00: 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29  onfiglist_init()
ac10: 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b  {.  current = 0;
ac20: 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20  .  currentend = 
ac30: 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69  &current;.  basi
ac40: 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e  s = 0;.  basisen
ac50: 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f  d = &basis;.  Co
ac60: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 29  nfigtable_init()
ac70: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
ac80: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 74 68  * Initialized th
ac90: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
aca0: 6c 69 73 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a  list builder */.
acb0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
acc0: 72 65 73 65 74 28 29 7b 0a 20 20 63 75 72 72 65  reset(){.  curre
acd0: 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e  nt = 0;.  curren
ace0: 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74 3b  tend = &current;
acf0: 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20  .  basis = 0;.  
ad00: 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73 69  basisend = &basi
ad10: 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c 65  s;.  Configtable
ad20: 5f 63 6c 65 61 72 28 30 29 3b 0a 20 20 72 65 74  _clear(0);.  ret
ad30: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61  urn;.}../* Add a
ad40: 6e 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61  nother configura
ad50: 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66  tion to the conf
ad60: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a  iguration list *
ad70: 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  /.struct config 
ad80: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28  *Configlist_add(
ad90: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
ada0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 72 75  rp,    /* The ru
adb0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 20  le */.  int dot 
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
add0: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 52 48  ndex into the RH
ade0: 53 20 6f 66 20 74 68 65 20 72 75 6c 65 20 77 68  S of the rule wh
adf0: 65 72 65 20 74 68 65 20 64 6f 74 20 67 6f 65 73  ere the dot goes
ae00: 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
ae10: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64  config *cfp, mod
ae20: 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  el;..  assert( c
ae30: 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a  urrentend!=0 );.
ae40: 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b    model.rp = rp;
ae50: 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64  .  model.dot = d
ae60: 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66  ot;.  cfp = Conf
ae70: 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f  igtable_find(&mo
ae80: 64 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d  del);.  if( cfp=
ae90: 3d 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20  =0 ){.    cfp = 
aea0: 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20  newconfig();.   
aeb0: 20 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20   cfp->rp = rp;. 
aec0: 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f     cfp->dot = do
aed0: 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20  t;.    cfp->fws 
aee0: 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20  = SetNew();.    
aef0: 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20  cfp->stp = 0;.  
af00: 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66    cfp->fplp = cf
af10: 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20  p->bplp = 0;.   
af20: 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a   cfp->next = 0;.
af30: 20 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b      cfp->bp = 0;
af40: 0a 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64  .    *currentend
af50: 20 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72   = cfp;.    curr
af60: 65 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e  entend = &cfp->n
af70: 65 78 74 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74  ext;.    Configt
af80: 61 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29  able_insert(cfp)
af90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
afa0: 66 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20  fp;.}../* Add a 
afb0: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
afc0: 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69  ion to the confi
afd0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  guration list */
afe0: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
aff0: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61  Configlist_addba
b000: 73 69 73 28 73 74 72 75 63 74 20 72 75 6c 65 20  sis(struct rule 
b010: 2a 72 70 2c 20 69 6e 74 20 64 6f 74 29 0a 7b 0a  *rp, int dot).{.
b020: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
b030: 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20  *cfp, model;..  
b040: 61 73 73 65 72 74 28 20 62 61 73 69 73 65 6e 64  assert( basisend
b050: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b060: 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29   currentend!=0 )
b070: 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72  ;.  model.rp = r
b080: 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d  p;.  model.dot =
b090: 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f   dot;.  cfp = Co
b0a0: 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 26  nfigtable_find(&
b0b0: 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20 63 66  model);.  if( cf
b0c0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66 70 20  p==0 ){.    cfp 
b0d0: 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20  = newconfig();. 
b0e0: 20 20 20 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b     cfp->rp = rp;
b0f0: 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20  .    cfp->dot = 
b100: 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77  dot;.    cfp->fw
b110: 73 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20  s = SetNew();.  
b120: 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a    cfp->stp = 0;.
b130: 20 20 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20      cfp->fplp = 
b140: 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20  cfp->bplp = 0;. 
b150: 20 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30     cfp->next = 0
b160: 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70 20 3d 20  ;.    cfp->bp = 
b170: 30 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e 74 65  0;.    *currente
b180: 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 63 75  nd = cfp;.    cu
b190: 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d  rrentend = &cfp-
b1a0: 3e 6e 65 78 74 3b 0a 20 20 20 20 2a 62 61 73 69  >next;.    *basi
b1b0: 73 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20  send = cfp;.    
b1c0: 62 61 73 69 73 65 6e 64 20 3d 20 26 63 66 70 2d  basisend = &cfp-
b1d0: 3e 62 70 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74  >bp;.    Configt
b1e0: 61 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29  able_insert(cfp)
b1f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
b200: 66 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74  fp;.}../* Comput
b210: 65 20 74 68 65 20 63 6c 6f 73 75 72 65 20 6f 66  e the closure of
b220: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
b230: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20  on list */.void 
b240: 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75  Configlist_closu
b250: 72 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  re(struct lemon 
b260: 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63  *lemp).{.  struc
b270: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a  t config *cfp, *
b280: 6e 65 77 63 66 70 3b 0a 20 20 73 74 72 75 63 74  newcfp;.  struct
b290: 20 72 75 6c 65 20 2a 72 70 2c 20 2a 6e 65 77 72   rule *rp, *newr
b2a0: 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  p;.  struct symb
b2b0: 6f 6c 20 2a 73 70 2c 20 2a 78 73 70 3b 0a 20 20  ol *sp, *xsp;.  
b2c0: 69 6e 74 20 69 2c 20 64 6f 74 3b 0a 0a 20 20 61  int i, dot;..  a
b2d0: 73 73 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e  ssert( currenten
b2e0: 64 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 63 66  d!=0 );.  for(cf
b2f0: 70 3d 63 75 72 72 65 6e 74 3b 20 63 66 70 3b 20  p=current; cfp; 
b300: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
b310: 20 20 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70      rp = cfp->rp
b320: 3b 0a 20 20 20 20 64 6f 74 20 3d 20 63 66 70 2d  ;.    dot = cfp-
b330: 3e 64 6f 74 3b 0a 20 20 20 20 69 66 28 20 64 6f  >dot;.    if( do
b340: 74 3e 3d 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f  t>=rp->nrhs ) co
b350: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 70 20 3d  ntinue;.    sp =
b360: 20 72 70 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20   rp->rhs[dot];. 
b370: 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d     if( sp->type=
b380: 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  =NONTERMINAL ){.
b390: 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 72 75        if( sp->ru
b3a0: 6c 65 3d 3d 30 20 26 26 20 73 70 21 3d 6c 65 6d  le==0 && sp!=lem
b3b0: 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20  p->errsym ){.   
b3c0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
b3d0: 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
b3e0: 3e 6c 69 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e  >line,"Nontermin
b3f0: 61 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 6e 6f  al \"%s\" has no
b400: 20 72 75 6c 65 73 2e 22 2c 0a 20 20 20 20 20 20   rules.",.      
b410: 20 20 20 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20      sp->name);. 
b420: 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72         lemp->err
b430: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
b440: 0a 20 20 20 20 20 20 66 6f 72 28 6e 65 77 72 70  .      for(newrp
b450: 3d 73 70 2d 3e 72 75 6c 65 3b 20 6e 65 77 72 70  =sp->rule; newrp
b460: 3b 20 6e 65 77 72 70 3d 6e 65 77 72 70 2d 3e 6e  ; newrp=newrp->n
b470: 65 78 74 6c 68 73 29 7b 0a 20 20 20 20 20 20 20  extlhs){.       
b480: 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67   newcfp = Config
b490: 6c 69 73 74 5f 61 64 64 28 6e 65 77 72 70 2c 30  list_add(newrp,0
b4a0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
b4b0: 3d 64 6f 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72  =dot+1; i<rp->nr
b4c0: 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
b4d0: 20 20 20 20 78 73 70 20 3d 20 72 70 2d 3e 72 68      xsp = rp->rh
b4e0: 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  s[i];.          
b4f0: 69 66 28 20 78 73 70 2d 3e 74 79 70 65 3d 3d 54  if( xsp->type==T
b500: 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
b510: 20 20 20 20 20 20 20 53 65 74 41 64 64 28 6e 65         SetAdd(ne
b520: 77 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 69  wcfp->fws,xsp->i
b530: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  ndex);.         
b540: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b550: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 73      }else if( xs
b560: 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
b570: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
b580: 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
b590: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
b5a0: 3b 20 6b 3c 78 73 70 2d 3e 6e 73 75 62 73 79 6d  ; k<xsp->nsubsym
b5b0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
b5c0: 20 20 20 20 20 20 53 65 74 41 64 64 28 6e 65 77        SetAdd(new
b5d0: 63 66 70 2d 3e 66 77 73 2c 20 78 73 70 2d 3e 73  cfp->fws, xsp->s
b5e0: 75 62 73 79 6d 5b 6b 5d 2d 3e 69 6e 64 65 78 29  ubsym[k]->index)
b5f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
b600: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b610: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  k;.          }el
b620: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
b630: 53 65 74 55 6e 69 6f 6e 28 6e 65 77 63 66 70 2d  SetUnion(newcfp-
b640: 3e 66 77 73 2c 78 73 70 2d 3e 66 69 72 73 74 73  >fws,xsp->firsts
b650: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  et);.           
b660: 20 69 66 28 20 78 73 70 2d 3e 6c 61 6d 62 64 61   if( xsp->lambda
b670: 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20  ==LEMON_FALSE ) 
b680: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b690: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
b6a0: 20 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e       if( i==rp->
b6b0: 6e 72 68 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64  nrhs ) Plink_add
b6c0: 28 26 63 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63  (&cfp->fplp,newc
b6d0: 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  fp);.      }.   
b6e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b   }.  }.  return;
b6f0: 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20  .}../* Sort the 
b700: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
b710: 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  st */.void Confi
b720: 67 6c 69 73 74 5f 73 6f 72 74 28 29 7b 0a 20 20  glist_sort(){.  
b730: 63 75 72 72 65 6e 74 20 3d 20 28 73 74 72 75 63  current = (struc
b740: 74 20 63 6f 6e 66 69 67 2a 29 6d 73 6f 72 74 28  t config*)msort(
b750: 28 63 68 61 72 2a 29 63 75 72 72 65 6e 74 2c 28  (char*)current,(
b760: 63 68 61 72 2a 2a 29 26 28 63 75 72 72 65 6e 74  char**)&(current
b770: 2d 3e 6e 65 78 74 29 2c 0a 20 20 20 20 20 20 20  ->next),.       
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b790: 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 66 69             Confi
b7a0: 67 63 6d 70 29 3b 0a 20 20 63 75 72 72 65 6e 74  gcmp);.  current
b7b0: 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  end = 0;.  retur
b7c0: 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68  n;.}../* Sort th
b7d0: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
b7e0: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f  ation list */.vo
b7f0: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f  id Configlist_so
b800: 72 74 62 61 73 69 73 28 29 7b 0a 20 20 62 61 73  rtbasis(){.  bas
b810: 69 73 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e  is = (struct con
b820: 66 69 67 2a 29 6d 73 6f 72 74 28 28 63 68 61 72  fig*)msort((char
b830: 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72 2a  *)current,(char*
b840: 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 62 70 29  *)&(current->bp)
b850: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b870: 20 20 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20    Configcmp);.  
b880: 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20  basisend = 0;.  
b890: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65  return;.}../* Re
b8a0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
b8b0: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
b8c0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
b8d0: 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65  list and.** rese
b8e0: 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74  t the list */.st
b8f0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
b900: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29  figlist_return()
b910: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
b920: 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20  g *old;.  old = 
b930: 63 75 72 72 65 6e 74 3b 0a 20 20 63 75 72 72 65  current;.  curre
b940: 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e  nt = 0;.  curren
b950: 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  tend = 0;.  retu
b960: 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 52 65  rn old;.}../* Re
b970: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
b980: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
b990: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
b9a0: 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65  list and.** rese
b9b0: 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74  t the list */.st
b9c0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
b9d0: 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29 7b  figlist_basis(){
b9e0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
b9f0: 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 62   *old;.  old = b
ba00: 61 73 69 73 3b 0a 20 20 62 61 73 69 73 20 3d 20  asis;.  basis = 
ba10: 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20  0;.  basisend = 
ba20: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b  0;.  return old;
ba30: 0a 7d 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20  .}../* Free all 
ba40: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
ba50: 67 69 76 65 6e 20 63 6f 6e 66 69 67 75 72 61 74  given configurat
ba60: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ion list */.void
ba70: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28   Configlist_eat(
ba80: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
ba90: 66 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63  fp).{.  struct c
baa0: 6f 6e 66 69 67 20 2a 6e 65 78 74 63 66 70 3b 0a  onfig *nextcfp;.
bab0: 20 20 66 6f 72 28 3b 20 63 66 70 3b 20 63 66 70    for(; cfp; cfp
bac0: 3d 6e 65 78 74 63 66 70 29 7b 0a 20 20 20 20 6e  =nextcfp){.    n
bad0: 65 78 74 63 66 70 20 3d 20 63 66 70 2d 3e 6e 65  extcfp = cfp->ne
bae0: 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  xt;.    assert( 
baf0: 63 66 70 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a  cfp->fplp==0 );.
bb00: 20 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d      assert( cfp-
bb10: 3e 62 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20  >bplp==0 );.    
bb20: 69 66 28 20 63 66 70 2d 3e 66 77 73 20 29 20 53  if( cfp->fws ) S
bb30: 65 74 46 72 65 65 28 63 66 70 2d 3e 66 77 73 29  etFree(cfp->fws)
bb40: 3b 0a 20 20 20 20 64 65 6c 65 74 65 63 6f 6e 66  ;.    deleteconf
bb50: 69 67 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72  ig(cfp);.  }.  r
bb60: 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  eturn;.}./******
bb70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
bb80: 20 74 68 65 20 66 69 6c 65 20 22 65 72 72 6f 72   the file "error
bb90: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
bba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bbb0: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64  *****/./*.** Cod
bbc0: 65 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 65  e for printing e
bbd0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
bbe0: 0a 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28  ..void ErrorMsg(
bbf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
bc00: 6e 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  name, int lineno
bc10: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f  , const char *fo
bc20: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
bc30: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 66 70 72 69  _list ap;.  fpri
bc40: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
bc50: 25 64 3a 20 22 2c 20 66 69 6c 65 6e 61 6d 65 2c  %d: ", filename,
bc60: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 76 61 5f 73   lineno);.  va_s
bc70: 74 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29  tart(ap, format)
bc80: 3b 0a 20 20 76 66 70 72 69 6e 74 66 28 73 74 64  ;.  vfprintf(std
bc90: 65 72 72 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a  err,format,ap);.
bca0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
bcb0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
bcc0: 22 5c 6e 22 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  "\n");.}./******
bcd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
bce0: 74 68 65 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63  the file "main.c
bcf0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
bd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd10: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61  ******/./*.** Ma
bd20: 69 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c 65 20  in program file 
bd30: 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
bd40: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
bd50: 2a 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e  */../* Report an
bd60: 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63   out-of-memory c
bd70: 6f 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f  ondition and abo
bd80: 72 74 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  rt.  This functi
bd90: 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f  on.** is used mo
bda0: 73 74 6c 79 20 62 79 20 74 68 65 20 22 4d 65 6d  stly by the "Mem
bdb0: 6f 72 79 43 68 65 63 6b 22 20 6d 61 63 72 6f 20  oryCheck" macro 
bdc0: 69 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76  in struct.h.*/.v
bdd0: 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72  oid memory_error
bde0: 28 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  (){.  fprintf(st
bdf0: 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d  derr,"Out of mem
be00: 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e  ory.  Aborting..
be10: 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29  .\n");.  exit(1)
be20: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
be30: 6e 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 20 20  nDefine = 0;    
be40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 2d    /* Number of -
be50: 44 20 6f 70 74 69 6f 6e 73 20 6f 6e 20 74 68 65  D options on the
be60: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f   command line */
be70: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 61  .static char **a
be80: 7a 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 2f 2a  zDefine = 0;  /*
be90: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 2d 44 20   Name of the -D 
bea0: 6d 61 63 72 6f 73 20 2a 2f 0a 0a 2f 2a 20 54 68  macros */../* Th
beb0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
bec0: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 61 72  lled with the ar
bed0: 67 75 6d 65 6e 74 20 74 6f 20 65 61 63 68 20 2d  gument to each -
bee0: 44 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  D command-line o
bef0: 70 74 69 6f 6e 2e 0a 2a 2a 20 41 64 64 20 74 68  ption..** Add th
bf00: 65 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 20  e macro defined 
bf10: 74 6f 20 74 68 65 20 61 7a 44 65 66 69 6e 65 20  to the azDefine 
bf20: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
bf30: 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f 44 5f 6f   void handle_D_o
bf40: 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a  ption(char *z){.
bf50: 20 20 63 68 61 72 20 2a 2a 70 61 7a 3b 0a 20 20    char **paz;.  
bf60: 6e 44 65 66 69 6e 65 2b 2b 3b 0a 20 20 61 7a 44  nDefine++;.  azD
bf70: 65 66 69 6e 65 20 3d 20 28 63 68 61 72 20 2a 2a  efine = (char **
bf80: 29 20 72 65 61 6c 6c 6f 63 28 61 7a 44 65 66 69  ) realloc(azDefi
bf90: 6e 65 2c 20 73 69 7a 65 6f 66 28 61 7a 44 65 66  ne, sizeof(azDef
bfa0: 69 6e 65 5b 30 5d 29 2a 6e 44 65 66 69 6e 65 29  ine[0])*nDefine)
bfb0: 3b 0a 20 20 69 66 28 20 61 7a 44 65 66 69 6e 65  ;.  if( azDefine
bfc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
bfd0: 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20 6f  tf(stderr,"out o
bfe0: 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
bff0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
c000: 20 70 61 7a 20 3d 20 26 61 7a 44 65 66 69 6e 65   paz = &azDefine
c010: 5b 6e 44 65 66 69 6e 65 2d 31 5d 3b 0a 20 20 2a  [nDefine-1];.  *
c020: 70 61 7a 20 3d 20 28 63 68 61 72 20 2a 29 20 6d  paz = (char *) m
c030: 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
c040: 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28  en(z)+1 );.  if(
c050: 20 2a 70 61 7a 3d 3d 30 20 29 7b 0a 20 20 20 20   *paz==0 ){.    
c060: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
c070: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
c080: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
c090: 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63    }.  lemon_strc
c0a0: 70 79 28 2a 70 61 7a 2c 20 7a 29 3b 0a 20 20 66  py(*paz, z);.  f
c0b0: 6f 72 28 7a 3d 2a 70 61 7a 3b 20 2a 7a 20 26 26  or(z=*paz; *z &&
c0c0: 20 2a 7a 21 3d 27 3d 27 3b 20 7a 2b 2b 29 7b 7d   *z!='='; z++){}
c0d0: 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 73 74  .  *z = 0;.}..st
c0e0: 61 74 69 63 20 63 68 61 72 20 2a 75 73 65 72 5f  atic char *user_
c0f0: 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20 3d 20 4e  templatename = N
c100: 55 4c 4c 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  ULL;.static void
c110: 20 68 61 6e 64 6c 65 5f 54 5f 6f 70 74 69 6f 6e   handle_T_option
c120: 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 73 65  (char *z){.  use
c130: 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20 3d  r_templatename =
c140: 20 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63   (char *) malloc
c150: 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29  ( lemonStrlen(z)
c160: 2b 31 20 29 3b 0a 20 20 69 66 28 20 75 73 65 72  +1 );.  if( user
c170: 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 3d 3d 30  _templatename==0
c180: 20 29 7b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65   ){.    memory_e
c190: 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 6c 65  rror();.  }.  le
c1a0: 6d 6f 6e 5f 73 74 72 63 70 79 28 75 73 65 72 5f  mon_strcpy(user_
c1b0: 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 20 7a 29  templatename, z)
c1c0: 3b 0a 7d 0a 0a 2f 2a 20 4d 65 72 67 65 20 74 6f  ;.}../* Merge to
c1d0: 67 65 74 68 65 72 20 74 6f 20 6c 69 73 74 73 20  gether to lists 
c1e0: 6f 66 20 72 75 6c 65 73 20 6f 72 64 65 72 65 64  of rules ordered
c1f0: 20 62 79 20 72 75 6c 65 2e 69 52 75 6c 65 20 2a   by rule.iRule *
c200: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
c210: 72 75 6c 65 20 2a 52 75 6c 65 5f 6d 65 72 67 65  rule *Rule_merge
c220: 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 41  (struct rule *pA
c230: 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70  , struct rule *p
c240: 42 29 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  B){.  struct rul
c250: 65 20 2a 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  e *pFirst = 0;. 
c260: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 2a 70   struct rule **p
c270: 70 50 72 65 76 20 3d 20 26 70 46 69 72 73 74 3b  pPrev = &pFirst;
c280: 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26 26 20  .  while( pA && 
c290: 70 42 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  pB ){.    if( pA
c2a0: 2d 3e 69 52 75 6c 65 3c 70 42 2d 3e 69 52 75 6c  ->iRule<pB->iRul
c2b0: 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 72  e ){.      *ppPr
c2c0: 65 76 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  ev = pA;.      p
c2d0: 70 50 72 65 76 20 3d 20 26 70 41 2d 3e 6e 65 78  pPrev = &pA->nex
c2e0: 74 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41  t;.      pA = pA
c2f0: 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  ->next;.    }els
c300: 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 76  e{.      *ppPrev
c310: 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 70 50   = pB;.      ppP
c320: 72 65 76 20 3d 20 26 70 42 2d 3e 6e 65 78 74 3b  rev = &pB->next;
c330: 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e  .      pB = pB->
c340: 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  next;.    }.  }.
c350: 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20 20    if( pA ){.    
c360: 2a 70 70 50 72 65 76 20 3d 20 70 41 3b 0a 20 20  *ppPrev = pA;.  
c370: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 72  }else{.    *ppPr
c380: 65 76 20 3d 20 70 42 3b 0a 20 20 7d 0a 20 20 72  ev = pB;.  }.  r
c390: 65 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a  eturn pFirst;.}.
c3a0: 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 61 20 6c 69  ./*.** Sort a li
c3b0: 73 74 20 6f 66 20 72 75 6c 65 73 20 69 6e 20 6f  st of rules in o
c3c0: 72 64 65 72 20 6f 66 20 69 6e 63 72 65 61 73 69  rder of increasi
c3d0: 6e 67 20 69 52 75 6c 65 20 76 61 6c 75 65 0a 2a  ng iRule value.*
c3e0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
c3f0: 72 75 6c 65 20 2a 52 75 6c 65 5f 73 6f 72 74 28  rule *Rule_sort(
c400: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29  struct rule *rp)
c410: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
c420: 75 63 74 20 72 75 6c 65 20 2a 70 4e 65 78 74 3b  uct rule *pNext;
c430: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
c440: 78 5b 33 32 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  x[32];.  memset(
c450: 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29  x, 0, sizeof(x))
c460: 3b 0a 20 20 77 68 69 6c 65 28 20 72 70 20 29 7b  ;.  while( rp ){
c470: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 72 70 2d  .    pNext = rp-
c480: 3e 6e 65 78 74 3b 0a 20 20 20 20 72 70 2d 3e 6e  >next;.    rp->n
c490: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ext = 0;.    for
c4a0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 78  (i=0; i<sizeof(x
c4b0: 29 2f 73 69 7a 65 6f 66 28 78 5b 30 5d 29 20 26  )/sizeof(x[0]) &
c4c0: 26 20 78 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  & x[i]; i++){.  
c4d0: 20 20 20 20 72 70 20 3d 20 52 75 6c 65 5f 6d 65      rp = Rule_me
c4e0: 72 67 65 28 78 5b 69 5d 2c 20 72 70 29 3b 0a 20  rge(x[i], rp);. 
c4f0: 20 20 20 20 20 78 5b 69 5d 20 3d 20 30 3b 0a 20       x[i] = 0;. 
c500: 20 20 20 7d 0a 20 20 20 20 78 5b 69 5d 20 3d 20     }.    x[i] = 
c510: 72 70 3b 0a 20 20 20 20 72 70 20 3d 20 70 4e 65  rp;.    rp = pNe
c520: 78 74 3b 0a 20 20 7d 0a 20 20 72 70 20 3d 20 30  xt;.  }.  rp = 0
c530: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
c540: 69 7a 65 6f 66 28 78 29 2f 73 69 7a 65 6f 66 28  izeof(x)/sizeof(
c550: 78 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  x[0]); i++){.   
c560: 20 72 70 20 3d 20 52 75 6c 65 5f 6d 65 72 67 65   rp = Rule_merge
c570: 28 78 5b 69 5d 2c 20 72 70 29 3b 0a 20 20 7d 0a  (x[i], rp);.  }.
c580: 20 20 72 65 74 75 72 6e 20 72 70 3b 0a 7d 0a 0a    return rp;.}..
c590: 2f 2a 20 66 6f 72 77 61 72 64 20 72 65 66 65 72  /* forward refer
c5a0: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 63  ence */.static c
c5b0: 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d  onst char *minim
c5c0: 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74  um_size_type(int
c5d0: 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 2c 20 69   lwr, int upr, i
c5e0: 6e 74 20 2a 70 6e 42 79 74 65 29 3b 0a 0a 2f 2a  nt *pnByte);../*
c5f0: 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20   Print a single 
c600: 6c 69 6e 65 20 6f 66 20 74 68 65 20 22 50 61 72  line of the "Par
c610: 73 65 72 20 53 74 61 74 73 22 20 6f 75 74 70 75  ser Stats" outpu
c620: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
c630: 20 73 74 61 74 73 5f 6c 69 6e 65 28 63 6f 6e 73   stats_line(cons
c640: 74 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20  t char *zLabel, 
c650: 69 6e 74 20 69 56 61 6c 75 65 29 7b 0a 20 20 69  int iValue){.  i
c660: 6e 74 20 6e 4c 61 62 65 6c 20 3d 20 6c 65 6d 6f  nt nLabel = lemo
c670: 6e 53 74 72 6c 65 6e 28 7a 4c 61 62 65 6c 29 3b  nStrlen(zLabel);
c680: 0a 20 20 70 72 69 6e 74 66 28 22 20 20 25 73 25  .  printf("  %s%
c690: 2e 2a 73 20 25 35 64 5c 6e 22 2c 20 7a 4c 61 62  .*s %5d\n", zLab
c6a0: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 33 35 2d  el,.         35-
c6b0: 6e 4c 61 62 65 6c 2c 20 22 2e 2e 2e 2e 2e 2e 2e  nLabel, ".......
c6c0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
c6d0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 22 2c 0a 20 20 20 20  .........",.    
c6e0: 20 20 20 20 20 69 56 61 6c 75 65 29 3b 0a 7d 0a       iValue);.}.
c6f0: 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70 72 6f  ./* The main pro
c700: 67 72 61 6d 2e 20 20 50 61 72 73 65 20 74 68 65  gram.  Parse the
c710: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e   command line an
c720: 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69 6e  d do it... */.in
c730: 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c  t main(int argc,
c740: 20 63 68 61 72 20 2a 2a 61 72 67 76 29 0a 7b 0a   char **argv).{.
c750: 20 20 73 74 61 74 69 63 20 69 6e 74 20 76 65 72    static int ver
c760: 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74  sion = 0;.  stat
c770: 69 63 20 69 6e 74 20 72 70 66 6c 61 67 20 3d 20  ic int rpflag = 
c780: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
c790: 62 61 73 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20  basisflag = 0;. 
c7a0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d 70   static int comp
c7b0: 72 65 73 73 20 3d 20 30 3b 0a 20 20 73 74 61 74  ress = 0;.  stat
c7c0: 69 63 20 69 6e 74 20 71 75 69 65 74 20 3d 20 30  ic int quiet = 0
c7d0: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 73  ;.  static int s
c7e0: 74 61 74 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  tatistics = 0;. 
c7f0: 20 73 74 61 74 69 63 20 69 6e 74 20 6d 68 66 6c   static int mhfl
c800: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
c810: 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c   int nolinenosfl
c820: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
c830: 20 69 6e 74 20 6e 6f 52 65 73 6f 72 74 20 3d 20   int noResort = 
c840: 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  0;.  static stru
c850: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70 74  ct s_options opt
c860: 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  ions[] = {.    {
c870: 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20 28  OPT_FLAG, "b", (
c880: 63 68 61 72 2a 29 26 62 61 73 69 73 66 6c 61 67  char*)&basisflag
c890: 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74 68  , "Print only th
c8a0: 65 20 62 61 73 69 73 20 69 6e 20 72 65 70 6f 72  e basis in repor
c8b0: 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  t."},.    {OPT_F
c8c0: 4c 41 47 2c 20 22 63 22 2c 20 28 63 68 61 72 2a  LAG, "c", (char*
c8d0: 29 26 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f 6e  )&compress, "Don
c8e0: 27 74 20 63 6f 6d 70 72 65 73 73 20 74 68 65 20  't compress the 
c8f0: 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c  action table."},
c900: 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20  .    {OPT_FSTR, 
c910: 22 44 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64  "D", (char*)hand
c920: 6c 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22 44 65  le_D_option, "De
c930: 66 69 6e 65 20 61 6e 20 25 69 66 64 65 66 20 6d  fine an %ifdef m
c940: 61 63 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  acro."},.    {OP
c950: 54 5f 46 53 54 52 2c 20 22 66 22 2c 20 30 2c 20  T_FSTR, "f", 0, 
c960: 22 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63  "Ignored.  (Plac
c970: 65 68 6f 6c 64 65 72 20 66 6f 72 20 2d 66 20 63  eholder for -f c
c980: 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e  ompiler options.
c990: 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  )"},.    {OPT_FL
c9a0: 41 47 2c 20 22 67 22 2c 20 28 63 68 61 72 2a 29  AG, "g", (char*)
c9b0: 26 72 70 66 6c 61 67 2c 20 22 50 72 69 6e 74 20  &rpflag, "Print 
c9c0: 67 72 61 6d 6d 61 72 20 77 69 74 68 6f 75 74 20  grammar without 
c9d0: 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20  actions."},.    
c9e0: 7b 4f 50 54 5f 46 53 54 52 2c 20 22 49 22 2c 20  {OPT_FSTR, "I", 
c9f0: 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20 20 28 50  0, "Ignored.  (P
ca00: 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 27  laceholder for '
ca10: 2d 49 27 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  -I' compiler opt
ca20: 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f  ions.)"},.    {O
ca30: 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63  PT_FLAG, "m", (c
ca40: 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f  har*)&mhflag, "O
ca50: 75 74 70 75 74 20 61 20 6d 61 6b 65 68 65 61 64  utput a makehead
ca60: 65 72 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 66  ers compatible f
ca70: 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ile."},.    {OPT
ca80: 5f 46 4c 41 47 2c 20 22 6c 22 2c 20 28 63 68 61  _FLAG, "l", (cha
ca90: 72 2a 29 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  r*)&nolinenosfla
caa0: 67 2c 20 22 44 6f 20 6e 6f 74 20 70 72 69 6e 74  g, "Do not print
cab0: 20 23 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e 74   #line statement
cac0: 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  s."},.    {OPT_F
cad0: 53 54 52 2c 20 22 4f 22 2c 20 30 2c 20 22 49 67  STR, "O", 0, "Ig
cae0: 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63 65 68 6f  nored.  (Placeho
caf0: 6c 64 65 72 20 66 6f 72 20 27 2d 4f 27 20 63 6f  lder for '-O' co
cb00: 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29  mpiler options.)
cb10: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
cb20: 47 2c 20 22 70 22 2c 20 28 63 68 61 72 2a 29 26  G, "p", (char*)&
cb30: 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f  showPrecedenceCo
cb40: 6e 66 6c 69 63 74 2c 0a 20 20 20 20 20 20 20 20  nflict,.        
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 68 6f              "Sho
cb60: 77 20 63 6f 6e 66 6c 69 63 74 73 20 72 65 73 6f  w conflicts reso
cb70: 6c 76 65 64 20 62 79 20 70 72 65 63 65 64 65 6e  lved by preceden
cb80: 63 65 20 72 75 6c 65 73 22 7d 2c 0a 20 20 20 20  ce rules"},.    
cb90: 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20  {OPT_FLAG, "q", 
cba0: 28 63 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22  (char*)&quiet, "
cbb0: 28 51 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72  (Quiet) Don't pr
cbc0: 69 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20 66  int the report f
cbd0: 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ile."},.    {OPT
cbe0: 5f 46 4c 41 47 2c 20 22 72 22 2c 20 28 63 68 61  _FLAG, "r", (cha
cbf0: 72 2a 29 26 6e 6f 52 65 73 6f 72 74 2c 20 22 44  r*)&noResort, "D
cc00: 6f 20 6e 6f 74 20 73 6f 72 74 20 6f 72 20 72 65  o not sort or re
cc10: 6e 75 6d 62 65 72 20 73 74 61 74 65 73 22 7d 2c  number states"},
cc20: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
cc30: 22 73 22 2c 20 28 63 68 61 72 2a 29 26 73 74 61  "s", (char*)&sta
cc40: 74 69 73 74 69 63 73 2c 0a 20 20 20 20 20 20 20  tistics,.       
cc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc60: 20 20 20 20 20 20 20 20 20 20 20 20 22 50 72 69              "Pri
cc70: 6e 74 20 70 61 72 73 65 72 20 73 74 61 74 73 20  nt parser stats 
cc80: 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70  to standard outp
cc90: 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ut."},.    {OPT_
cca0: 46 4c 41 47 2c 20 22 78 22 2c 20 28 63 68 61 72  FLAG, "x", (char
ccb0: 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22 50 72 69  *)&version, "Pri
ccc0: 6e 74 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  nt the version n
ccd0: 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f  umber."},.    {O
cce0: 50 54 5f 46 53 54 52 2c 20 22 54 22 2c 20 28 63  PT_FSTR, "T", (c
ccf0: 68 61 72 2a 29 68 61 6e 64 6c 65 5f 54 5f 6f 70  har*)handle_T_op
cd00: 74 69 6f 6e 2c 20 22 53 70 65 63 69 66 79 20 61  tion, "Specify a
cd10: 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 2e 22   template file."
cd20: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52  },.    {OPT_FSTR
cd30: 2c 20 22 57 22 2c 20 30 2c 20 22 49 67 6e 6f 72  , "W", 0, "Ignor
cd40: 65 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64 65  ed.  (Placeholde
cd50: 72 20 66 6f 72 20 27 2d 57 27 20 63 6f 6d 70 69  r for '-W' compi
cd60: 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c  ler options.)"},
cd70: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 30  .    {OPT_FLAG,0
cd80: 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  ,0,0}.  };.  int
cd90: 20 69 3b 0a 20 20 69 6e 74 20 65 78 69 74 63 6f   i;.  int exitco
cda0: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 6c 65 6d  de;.  struct lem
cdb0: 6f 6e 20 6c 65 6d 3b 0a 20 20 73 74 72 75 63 74  on lem;.  struct
cdc0: 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 4f 70   rule *rp;..  Op
cdd0: 74 49 6e 69 74 28 61 72 67 76 2c 6f 70 74 69 6f  tInit(argv,optio
cde0: 6e 73 2c 73 74 64 65 72 72 29 3b 0a 20 20 69 66  ns,stderr);.  if
cdf0: 28 20 76 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20  ( version ){.   
ce00: 20 20 70 72 69 6e 74 66 28 22 4c 65 6d 6f 6e 20    printf("Lemon 
ce10: 76 65 72 73 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b  version 1.0\n");
ce20: 0a 20 20 20 20 20 65 78 69 74 28 30 29 3b 20 0a  .     exit(0); .
ce30: 20 20 7d 0a 20 20 69 66 28 20 4f 70 74 4e 41 72    }.  if( OptNAr
ce40: 67 73 28 29 21 3d 31 20 29 7b 0a 20 20 20 20 66  gs()!=1 ){.    f
ce50: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
ce60: 78 61 63 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e  xactly one filen
ce70: 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
ce80: 72 65 71 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20  required.\n");. 
ce90: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
cea0: 20 20 6d 65 6d 73 65 74 28 26 6c 65 6d 2c 20 30    memset(&lem, 0
ceb0: 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a  , sizeof(lem));.
cec0: 20 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d    lem.errorcnt =
ced0: 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61   0;..  /* Initia
cee0: 6c 69 7a 65 20 74 68 65 20 6d 61 63 68 69 6e 65  lize the machine
cef0: 20 2a 2f 0a 20 20 53 74 72 73 61 66 65 5f 69 6e   */.  Strsafe_in
cf00: 69 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69  it();.  Symbol_i
cf10: 6e 69 74 28 29 3b 0a 20 20 53 74 61 74 65 5f 69  nit();.  State_i
cf20: 6e 69 74 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67  nit();.  lem.arg
cf30: 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20  v0 = argv[0];.  
cf40: 6c 65 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f  lem.filename = O
cf50: 70 74 41 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e  ptArg(0);.  lem.
cf60: 62 61 73 69 73 66 6c 61 67 20 3d 20 62 61 73 69  basisflag = basi
cf70: 73 66 6c 61 67 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c  sflag;.  lem.nol
cf80: 69 6e 65 6e 6f 73 66 6c 61 67 20 3d 20 6e 6f 6c  inenosflag = nol
cf90: 69 6e 65 6e 6f 73 66 6c 61 67 3b 0a 20 20 53 79  inenosflag;.  Sy
cfa0: 6d 62 6f 6c 5f 6e 65 77 28 22 24 22 29 3b 0a 20  mbol_new("$");. 
cfb0: 20 6c 65 6d 2e 65 72 72 73 79 6d 20 3d 20 53 79   lem.errsym = Sy
cfc0: 6d 62 6f 6c 5f 6e 65 77 28 22 65 72 72 6f 72 22  mbol_new("error"
cfd0: 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 2d  );.  lem.errsym-
cfe0: 3e 75 73 65 43 6e 74 20 3d 20 30 3b 0a 0a 20 20  >useCnt = 0;..  
cff0: 2f 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70  /* Parse the inp
d000: 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72  ut file */.  Par
d010: 73 65 28 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20  se(&lem);.  if( 
d020: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 29 20 65  lem.errorcnt ) e
d030: 78 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74  xit(lem.errorcnt
d040: 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 72 75  );.  if( lem.nru
d050: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  le==0 ){.    fpr
d060: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 6d 70  intf(stderr,"Emp
d070: 74 79 20 67 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b  ty grammar.\n");
d080: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
d090: 7d 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 61 6e  }..  /* Count an
d0a0: 64 20 69 6e 64 65 78 20 74 68 65 20 73 79 6d 62  d index the symb
d0b0: 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61 6d 6d  ols of the gramm
d0c0: 61 72 20 2a 2f 0a 20 20 53 79 6d 62 6f 6c 5f 6e  ar */.  Symbol_n
d0d0: 65 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b  ew("{default}");
d0e0: 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d  .  lem.nsymbol =
d0f0: 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b   Symbol_count();
d100: 0a 20 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d  .  lem.symbols =
d110: 20 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28   Symbol_arrayof(
d120: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
d130: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  lem.nsymbol; i++
d140: 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d  ) lem.symbols[i]
d150: 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 71  ->index = i;.  q
d160: 73 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73  sort(lem.symbols
d170: 2c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2c 73 69 7a  ,lem.nsymbol,siz
d180: 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
d190: 6c 2a 29 2c 20 53 79 6d 62 6f 6c 63 6d 70 70 29  l*), Symbolcmpp)
d1a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
d1b0: 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  em.nsymbol; i++)
d1c0: 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d   lem.symbols[i]-
d1d0: 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 77 68  >index = i;.  wh
d1e0: 69 6c 65 28 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73  ile( lem.symbols
d1f0: 5b 69 2d 31 5d 2d 3e 74 79 70 65 3d 3d 4d 55 4c  [i-1]->type==MUL
d200: 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 20 69 2d  TITERMINAL ){ i-
d210: 2d 3b 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  -; }.  assert( s
d220: 74 72 63 6d 70 28 6c 65 6d 2e 73 79 6d 62 6f 6c  trcmp(lem.symbol
d230: 73 5b 69 2d 31 5d 2d 3e 6e 61 6d 65 2c 22 7b 64  s[i-1]->name,"{d
d240: 65 66 61 75 6c 74 7d 22 29 3d 3d 30 20 29 3b 0a  efault}")==0 );.
d250: 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20    lem.nsymbol = 
d260: 69 20 2d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31  i - 1;.  for(i=1
d270: 3b 20 49 53 55 50 50 45 52 28 6c 65 6d 2e 73 79  ; ISUPPER(lem.sy
d280: 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30  mbols[i]->name[0
d290: 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e  ]); i++);.  lem.
d2a0: 6e 74 65 72 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a  nterminal = i;..
d2b0: 20 20 2f 2a 20 41 73 73 69 67 6e 20 73 65 71 75    /* Assign sequ
d2c0: 65 6e 74 69 61 6c 20 72 75 6c 65 20 6e 75 6d 62  ential rule numb
d2d0: 65 72 73 2e 20 20 53 74 61 72 74 20 77 69 74 68  ers.  Start with
d2e0: 20 30 2e 20 20 50 75 74 20 72 75 6c 65 73 20 74   0.  Put rules t
d2f0: 68 61 74 20 68 61 76 65 20 6e 6f 0a 20 20 2a 2a  hat have no.  **
d300: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 43   reduce action C
d310: 2d 63 6f 64 65 20 61 73 73 6f 63 69 61 74 65 64  -code associated
d320: 20 77 69 74 68 20 74 68 65 6d 20 6c 61 73 74 2c   with them last,
d330: 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 77 69   so that the swi
d340: 74 63 68 28 29 0a 20 20 2a 2a 20 73 74 61 74 65  tch().  ** state
d350: 6d 65 6e 74 20 74 68 61 74 20 73 65 6c 65 63 74  ment that select
d360: 73 20 72 65 64 75 63 74 69 6f 6e 20 61 63 74 69  s reduction acti
d370: 6f 6e 73 20 77 69 6c 6c 20 68 61 76 65 20 61 20  ons will have a 
d380: 73 6d 61 6c 6c 65 72 20 6a 75 6d 70 20 74 61 62  smaller jump tab
d390: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  le..  */.  for(i
d3a0: 3d 30 2c 20 72 70 3d 6c 65 6d 2e 72 75 6c 65 3b  =0, rp=lem.rule;
d3b0: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
d3c0: 29 7b 0a 20 20 20 20 72 70 2d 3e 69 52 75 6c 65  ){.    rp->iRule
d3d0: 20 3d 20 72 70 2d 3e 63 6f 64 65 20 3f 20 69 2b   = rp->code ? i+
d3e0: 2b 20 3a 20 2d 31 3b 0a 20 20 7d 0a 20 20 66 6f  + : -1;.  }.  fo
d3f0: 72 28 72 70 3d 6c 65 6d 2e 72 75 6c 65 3b 20 72  r(rp=lem.rule; r
d400: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
d410: 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 69 52 75  .    if( rp->iRu
d420: 6c 65 3c 30 20 29 20 72 70 2d 3e 69 52 75 6c 65  le<0 ) rp->iRule
d430: 20 3d 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6c 65   = i++;.  }.  le
d440: 6d 2e 73 74 61 72 74 52 75 6c 65 20 3d 20 6c 65  m.startRule = le
d450: 6d 2e 72 75 6c 65 3b 0a 20 20 6c 65 6d 2e 72 75  m.rule;.  lem.ru
d460: 6c 65 20 3d 20 52 75 6c 65 5f 73 6f 72 74 28 6c  le = Rule_sort(l
d470: 65 6d 2e 72 75 6c 65 29 3b 0a 0a 20 20 2f 2a 20  em.rule);..  /* 
d480: 47 65 6e 65 72 61 74 65 20 61 20 72 65 70 72 69  Generate a repri
d490: 6e 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  nt of the gramma
d4a0: 72 2c 20 69 66 20 72 65 71 75 65 73 74 65 64 20  r, if requested 
d4b0: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
d4c0: 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72 70 66  ine */.  if( rpf
d4d0: 6c 61 67 20 29 7b 0a 20 20 20 20 52 65 70 72 69  lag ){.    Repri
d4e0: 6e 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73  nt(&lem);.  }els
d4f0: 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  e{.    /* Initia
d500: 6c 69 7a 65 20 74 68 65 20 73 69 7a 65 20 66 6f  lize the size fo
d510: 72 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64  r all follow and
d520: 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20   first sets */. 
d530: 20 20 20 53 65 74 53 69 7a 65 28 6c 65 6d 2e 6e     SetSize(lem.n
d540: 74 65 72 6d 69 6e 61 6c 2b 31 29 3b 0a 0a 20 20  terminal+1);..  
d550: 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 70 72    /* Find the pr
d560: 65 63 65 64 65 6e 63 65 20 66 6f 72 20 65 76 65  ecedence for eve
d570: 72 79 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75  ry production ru
d580: 6c 65 20 28 74 68 61 74 20 68 61 73 20 6f 6e 65  le (that has one
d590: 29 20 2a 2f 0a 20 20 20 20 46 69 6e 64 52 75 6c  ) */.    FindRul
d5a0: 65 50 72 65 63 65 64 65 6e 63 65 73 28 26 6c 65  ePrecedences(&le
d5b0: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
d5c0: 75 74 65 20 74 68 65 20 6c 61 6d 62 64 61 2d 6e  ute the lambda-n
d5d0: 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20  onterminals and 
d5e0: 74 68 65 20 66 69 72 73 74 2d 73 65 74 73 20 66  the first-sets f
d5f0: 6f 72 20 65 76 65 72 79 0a 20 20 20 20 2a 2a 20  or every.    ** 
d600: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20  nonterminal */. 
d610: 20 20 20 46 69 6e 64 46 69 72 73 74 53 65 74 73     FindFirstSets
d620: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
d630: 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30  Compute all LR(0
d640: 29 20 73 74 61 74 65 73 2e 20 20 41 6c 73 6f 20  ) states.  Also 
d650: 72 65 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d 73 65  record follow-se
d660: 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 0a 20 20  t propagation.  
d670: 20 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20 74 68    ** links so th
d680: 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65  at the follow-se
d690: 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65  t can be compute
d6a0: 64 20 6c 61 74 65 72 20 2a 2f 0a 20 20 20 20 6c  d later */.    l
d6b0: 65 6d 2e 6e 73 74 61 74 65 20 3d 20 30 3b 0a 20  em.nstate = 0;. 
d6c0: 20 20 20 46 69 6e 64 53 74 61 74 65 73 28 26 6c     FindStates(&l
d6d0: 65 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e 73 6f 72  em);.    lem.sor
d6e0: 74 65 64 20 3d 20 53 74 61 74 65 5f 61 72 72 61  ted = State_arra
d6f0: 79 6f 66 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  yof();..    /* T
d700: 69 65 20 75 70 20 6c 6f 6f 73 65 20 65 6e 64 73  ie up loose ends
d710: 20 6f 6e 20 74 68 65 20 70 72 6f 70 61 67 61 74   on the propagat
d720: 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20  ion links */.   
d730: 20 46 69 6e 64 4c 69 6e 6b 73 28 26 6c 65 6d 29   FindLinks(&lem)
d740: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  ;..    /* Comput
d750: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 20 73 65 74  e the follow set
d760: 20 6f 66 20 65 76 65 72 79 20 72 65 64 75 63 69   of every reduci
d770: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
d780: 6e 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 6f 6c  n */.    FindFol
d790: 6c 6f 77 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a  lowSets(&lem);..
d7a0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
d7b0: 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73  he action tables
d7c0: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 41 63 74 69   */.    FindActi
d7d0: 6f 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ons(&lem);..    
d7e0: 2f 2a 20 43 6f 6d 70 72 65 73 73 20 74 68 65 20  /* Compress the 
d7f0: 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f  action tables */
d800: 0a 20 20 20 20 69 66 28 20 63 6f 6d 70 72 65 73  .    if( compres
d810: 73 3d 3d 30 20 29 20 43 6f 6d 70 72 65 73 73 54  s==0 ) CompressT
d820: 61 62 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  ables(&lem);..  
d830: 20 20 2f 2a 20 52 65 6f 72 64 65 72 20 61 6e 64    /* Reorder and
d840: 20 72 65 6e 75 6d 62 65 72 20 74 68 65 20 73 74   renumber the st
d850: 61 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61  ates so that sta
d860: 74 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63  tes with fewer c
d870: 68 6f 69 63 65 73 0a 20 20 20 20 2a 2a 20 6f 63  hoices.    ** oc
d880: 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20  cur at the end. 
d890: 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
d8a0: 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 68 65  mization that he
d8b0: 6c 70 73 20 6d 61 6b 65 20 74 68 65 0a 20 20 20  lps make the.   
d8c0: 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 70 61   ** generated pa
d8d0: 72 73 65 72 20 74 61 62 6c 65 73 20 73 6d 61 6c  rser tables smal
d8e0: 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ler. */.    if( 
d8f0: 6e 6f 52 65 73 6f 72 74 3d 3d 30 20 29 20 52 65  noResort==0 ) Re
d900: 73 6f 72 74 53 74 61 74 65 73 28 26 6c 65 6d 29  sortStates(&lem)
d910: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
d920: 74 65 20 61 20 72 65 70 6f 72 74 20 6f 66 20 74  te a report of t
d930: 68 65 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  he parser genera
d940: 74 65 64 2e 20 20 28 74 68 65 20 22 79 2e 6f 75  ted.  (the "y.ou
d950: 74 70 75 74 22 20 66 69 6c 65 29 20 2a 2f 0a 20  tput" file) */. 
d960: 20 20 20 69 66 28 20 21 71 75 69 65 74 20 29 20     if( !quiet ) 
d970: 52 65 70 6f 72 74 4f 75 74 70 75 74 28 26 6c 65  ReportOutput(&le
d980: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  m);..    /* Gene
d990: 72 61 74 65 20 74 68 65 20 73 6f 75 72 63 65 20  rate the source 
d9a0: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61 72  code for the par
d9b0: 73 65 72 20 2a 2f 0a 20 20 20 20 52 65 70 6f 72  ser */.    Repor
d9c0: 74 54 61 62 6c 65 28 26 6c 65 6d 2c 20 6d 68 66  tTable(&lem, mhf
d9d0: 6c 61 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  lag);..    /* Pr
d9e0: 6f 64 75 63 65 20 61 20 68 65 61 64 65 72 20 66  oduce a header f
d9f0: 69 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 74  ile for use by t
da00: 68 65 20 73 63 61 6e 6e 65 72 2e 20 20 28 54 68  he scanner.  (Th
da10: 69 73 20 73 74 65 70 20 69 73 0a 20 20 20 20 2a  is step is.    *
da20: 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65  * omitted if the
da30: 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20 69 73 20   "-m" option is 
da40: 75 73 65 64 20 62 65 63 61 75 73 65 20 6d 61 6b  used because mak
da50: 65 68 65 61 64 65 72 73 20 77 69 6c 6c 0a 20 20  eheaders will.  
da60: 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 20 74 68    ** generate th
da70: 65 20 66 69 6c 65 20 66 6f 72 20 75 73 2e 29 20  e file for us.) 
da80: 2a 2f 0a 20 20 20 20 69 66 28 20 21 6d 68 66 6c  */.    if( !mhfl
da90: 61 67 20 29 20 52 65 70 6f 72 74 48 65 61 64 65  ag ) ReportHeade
daa0: 72 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 69  r(&lem);.  }.  i
dab0: 66 28 20 73 74 61 74 69 73 74 69 63 73 20 29 7b  f( statistics ){
dac0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 61 72  .    printf("Par
dad0: 73 65 72 20 73 74 61 74 69 73 74 69 63 73 3a 5c  ser statistics:\
dae0: 6e 22 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c  n");.    stats_l
daf0: 69 6e 65 28 22 74 65 72 6d 69 6e 61 6c 20 73 79  ine("terminal sy
db00: 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e 74 65 72  mbols", lem.nter
db10: 6d 69 6e 61 6c 29 3b 0a 20 20 20 20 73 74 61 74  minal);.    stat
db20: 73 5f 6c 69 6e 65 28 22 6e 6f 6e 2d 74 65 72 6d  s_line("non-term
db30: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c  inal symbols", l
db40: 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d  em.nsymbol - lem
db50: 2e 6e 74 65 72 6d 69 6e 61 6c 29 3b 0a 20 20 20  .nterminal);.   
db60: 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 74 6f 74   stats_line("tot
db70: 61 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d  al symbols", lem
db80: 2e 6e 73 79 6d 62 6f 6c 29 3b 0a 20 20 20 20 73  .nsymbol);.    s
db90: 74 61 74 73 5f 6c 69 6e 65 28 22 72 75 6c 65 73  tats_line("rules
dba0: 22 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20  ", lem.nrule);. 
dbb0: 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 73     stats_line("s
dbc0: 74 61 74 65 73 22 2c 20 6c 65 6d 2e 6e 78 73 74  tates", lem.nxst
dbd0: 61 74 65 29 3b 0a 20 20 20 20 73 74 61 74 73 5f  ate);.    stats_
dbe0: 6c 69 6e 65 28 22 63 6f 6e 66 6c 69 63 74 73 22  line("conflicts"
dbf0: 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29  , lem.nconflict)
dc00: 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65  ;.    stats_line
dc10: 28 22 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 65  ("action table e
dc20: 6e 74 72 69 65 73 22 2c 20 6c 65 6d 2e 6e 61 63  ntries", lem.nac
dc30: 74 69 6f 6e 74 61 62 29 3b 0a 20 20 20 20 73 74  tiontab);.    st
dc40: 61 74 73 5f 6c 69 6e 65 28 22 74 6f 74 61 6c 20  ats_line("total 
dc50: 74 61 62 6c 65 20 73 69 7a 65 20 28 62 79 74 65  table size (byte
dc60: 73 29 22 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69  s)", lem.tablesi
dc70: 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  ze);.  }.  if( l
dc80: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e 20 30  em.nconflict > 0
dc90: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
dca0: 73 74 64 65 72 72 2c 22 25 64 20 70 61 72 73 69  stderr,"%d parsi
dcb0: 6e 67 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22  ng conflicts.\n"
dcc0: 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b  ,lem.nconflict);
dcd0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 72 65 74 75 72  .  }..  /* retur
dce0: 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  n 0 on success, 
dcf0: 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 2a 2f  1 on failure. */
dd00: 0a 20 20 65 78 69 74 63 6f 64 65 20 3d 20 28 28  .  exitcode = ((
dd10: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3e 20 30  lem.errorcnt > 0
dd20: 29 20 7c 7c 20 28 6c 65 6d 2e 6e 63 6f 6e 66 6c  ) || (lem.nconfl
dd30: 69 63 74 20 3e 20 30 29 29 20 3f 20 31 20 3a 20  ict > 0)) ? 1 : 
dd40: 30 3b 0a 20 20 65 78 69 74 28 65 78 69 74 63 6f  0;.  exit(exitco
dd50: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 65  de);.  return (e
dd60: 78 69 74 63 6f 64 65 29 3b 0a 7d 0a 2f 2a 2a 2a  xitcode);.}./***
dd70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd80: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
dd90: 22 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  "msort.c" ******
dda0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ddb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
ddc0: 20 41 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65   A generic merge
ddd0: 2d 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a  -sort program..*
dde0: 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c  *.** USAGE:.** L
ddf0: 65 74 20 22 70 74 72 22 20 62 65 20 61 20 70 6f  et "ptr" be a po
de00: 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74  inter to some st
de10: 72 75 63 74 75 72 65 20 77 68 69 63 68 20 69 73  ructure which is
de20: 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a   at the head of.
de30: 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e  ** a null-termin
de40: 61 74 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e  ated list.  Then
de50: 20 74 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73   to sort the lis
de60: 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  t call:.**.**   
de70: 20 20 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74    ptr = msort(pt
de80: 72 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63  r,&(ptr->next),c
de90: 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e  mpfnc);.**.** In
dea0: 20 74 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70   the above, "cmp
deb0: 66 6e 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65  fnc" is a pointe
dec0: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
ded0: 77 68 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a  which compares.*
dee0: 2a 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20  * two instances 
def0: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
df00: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20   and returns an 
df10: 69 6e 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a  integer, as in.*
df20: 2a 20 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73  * strcmp.  The s
df30: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
df40: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
df50: 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  he pointer to th
df60: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d  e.** second elem
df70: 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65  ent of the linke
df80: 64 20 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64  d list.  This ad
df90: 64 72 65 73 73 20 69 73 20 75 73 65 64 20 74 6f  dress is used to
dfa0: 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   compute.** the 
dfb0: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e  offset to the "n
dfc0: 65 78 74 22 20 66 69 65 6c 64 20 77 69 74 68 69  ext" field withi
dfd0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  n the structure.
dfe0: 20 20 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a    The offset to.
dff0: 2a 2a 20 74 68 65 20 22 6e 65 78 74 22 20 66 69  ** the "next" fi
e000: 65 6c 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  eld must be cons
e010: 74 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72  tant for all str
e020: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c  uctures in the l
e030: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ist..**.** The f
e040: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
e050: 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68  a new pointer wh
e060: 69 63 68 20 69 73 20 74 68 65 20 68 65 61 64 20  ich is the head 
e070: 6f 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61  of the list.** a
e080: 66 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a  fter sorting..**
e090: 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a  .** ALGORITHM:.*
e0a0: 2a 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f  * Merge-sort..*/
e0b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
e0c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
e0d0: 6e 65 78 74 20 73 74 72 75 63 74 75 72 65 20 69  next structure i
e0e0: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
e0f0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45  t..*/.#define NE
e100: 58 54 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29  XT(A) (*(char**)
e110: 28 28 28 63 68 61 72 2a 29 41 29 2b 6f 66 66 73  (((char*)A)+offs
e120: 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75  et))../*.** Inpu
e130: 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20  ts:.**   a:     
e140: 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c    A sorted, null
e150: 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b  -terminated link
e160: 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62  ed list.  (May b
e170: 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a  e null)..**   b:
e180: 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c         A sorted,
e190: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
e1a0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28   linked list.  (
e1b0: 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a  May be null)..**
e1c0: 20 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70 6f     cmp:     A po
e1d0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6d  inter to the com
e1e0: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
e1f0: 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20 20  ..**   offset:  
e200: 4f 66 66 73 65 74 20 69 6e 20 74 68 65 20 73 74  Offset in the st
e210: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 22  ructure to the "
e220: 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a  next" field..**.
e230: 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a  ** Return Value:
e240: 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20  .**   A pointer 
e250: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  to the head of a
e260: 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e   sorted list con
e270: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d  taining the elem
e280: 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74  ents.**   of bot
e290: 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a  h a and b..**.**
e2a0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a   Side effects:.*
e2b0: 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70  *   The "next" p
e2c0: 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d  ointers for elem
e2d0: 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ents in the list
e2e0: 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a  s a and b are.**
e2f0: 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73     changed..*/.s
e300: 74 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72 67  tatic char *merg
e310: 65 28 0a 20 20 63 68 61 72 20 2a 61 2c 0a 20 20  e(.  char *a,.  
e320: 63 68 61 72 20 2a 62 2c 0a 20 20 69 6e 74 20 28  char *b,.  int (
e330: 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72  *cmp)(const char
e340: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 0a  *,const char*),.
e350: 20 20 69 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a    int offset.){.
e360: 20 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68 65    char *ptr, *he
e370: 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20  ad;..  if( a==0 
e380: 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62 3b  ){.    head = b;
e390: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d  .  }else if( b==
e3a0: 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20  0 ){.    head = 
e3b0: 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
e3c0: 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c  if( (*cmp)(a,b)<
e3d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20  =0 ){.      ptr 
e3e0: 3d 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e  = a;.      a = N
e3f0: 45 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73  EXT(a);.    }els
e400: 65 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62  e{.      ptr = b
e410: 3b 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54  ;.      b = NEXT
e420: 28 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  (b);.    }.    h
e430: 65 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77  ead = ptr;.    w
e440: 68 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a  hile( a && b ){.
e450: 20 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29        if( (*cmp)
e460: 28 61 2c 62 29 3c 3d 30 20 29 7b 0a 20 20 20 20  (a,b)<=0 ){.    
e470: 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20      NEXT(ptr) = 
e480: 61 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d  a;.        ptr =
e490: 20 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20   a;.        a = 
e4a0: 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d  NEXT(a);.      }
e4b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45  else{.        NE
e4c0: 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20  XT(ptr) = b;.   
e4d0: 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20       ptr = b;.  
e4e0: 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62        b = NEXT(b
e4f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
e500: 0a 20 20 20 20 69 66 28 20 61 20 29 20 4e 45 58  .    if( a ) NEX
e510: 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20  T(ptr) = a;.    
e520: 65 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74 72  else    NEXT(ptr
e530: 29 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74  ) = b;.  }.  ret
e540: 75 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a  urn head;.}../*.
e550: 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20  ** Inputs:.**   
e560: 6c 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74  list:      Point
e570: 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c  er to a singly-l
e580: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74  inked list of st
e590: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e  ructures..**   n
e5a0: 65 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65  ext:      Pointe
e5b0: 72 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20  r to pointer to 
e5c0: 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  the second eleme
e5d0: 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a  nt of the list..
e5e0: 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20  **   cmp:       
e5f0: 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  A comparison fun
e600: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ction..**.** Ret
e610: 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20  urn Value:.**   
e620: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
e630: 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65   head of a sorte
e640: 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  d list containin
e650: 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a  g the elements.*
e660: 2a 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e  *   orginally in
e670: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64   list..**.** Sid
e680: 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20  e effects:.**   
e690: 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74  The "next" point
e6a0: 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73  ers for elements
e6b0: 20 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61   in list are cha
e6c0: 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  nged..*/.#define
e6d0: 20 4c 49 53 54 53 49 5a 45 20 33 30 0a 73 74 61   LISTSIZE 30.sta
e6e0: 74 69 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28  tic char *msort(
e6f0: 0a 20 20 63 68 61 72 20 2a 6c 69 73 74 2c 0a 20  .  char *list,. 
e700: 20 63 68 61 72 20 2a 2a 6e 65 78 74 2c 0a 20 20   char **next,.  
e710: 69 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74  int (*cmp)(const
e720: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
e730: 72 2a 29 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  r*).){.  unsigne
e740: 64 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20  d long offset;. 
e750: 20 63 68 61 72 20 2a 65 70 3b 0a 20 20 63 68 61   char *ep;.  cha
e760: 72 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d  r *set[LISTSIZE]
e770: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66  ;.  int i;.  off
e780: 73 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  set = (unsigned 
e790: 6c 6f 6e 67 29 28 28 63 68 61 72 2a 29 6e 65 78  long)((char*)nex
e7a0: 74 20 2d 20 28 63 68 61 72 2a 29 6c 69 73 74 29  t - (char*)list)
e7b0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c  ;.  for(i=0; i<L
e7c0: 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65  ISTSIZE; i++) se
e7d0: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c  t[i] = 0;.  whil
e7e0: 65 28 20 6c 69 73 74 20 29 7b 0a 20 20 20 20 65  e( list ){.    e
e7f0: 70 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69  p = list;.    li
e800: 73 74 20 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b  st = NEXT(list);
e810: 0a 20 20 20 20 4e 45 58 54 28 65 70 29 20 3d 20  .    NEXT(ep) = 
e820: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
e830: 69 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26 26 20  i<LISTSIZE-1 && 
e840: 73 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b  set[i]!=0; i++){
e850: 0a 20 20 20 20 20 20 65 70 20 3d 20 6d 65 72 67  .      ep = merg
e860: 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c  e(ep,set[i],cmp,
e870: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  offset);.      s
e880: 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  et[i] = 0;.    }
e890: 0a 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 65 70  .    set[i] = ep
e8a0: 3b 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a  ;.  }.  ep = 0;.
e8b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53    for(i=0; i<LIS
e8c0: 54 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20  TSIZE; i++) if( 
e8d0: 73 65 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65  set[i] ) ep = me
e8e0: 72 67 65 28 73 65 74 5b 69 5d 2c 65 70 2c 63 6d  rge(set[i],ep,cm
e8f0: 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74  p,offset);.  ret
e900: 75 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn ep;.}./*****
e910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e920: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
e930: 65 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a  e "option.c" ***
e940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e950: 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20  *******/.static 
e960: 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61  char **argv;.sta
e970: 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74  tic struct s_opt
e980: 69 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63  ions *op;.static
e990: 20 46 49 4c 45 20 2a 65 72 72 73 74 72 65 61 6d   FILE *errstream
e9a0: 3b 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f 50 54  ;..#define ISOPT
e9b0: 28 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27  (X) ((X)[0]=='-'
e9c0: 7c 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73  ||(X)[0]=='+'||s
e9d0: 74 72 63 68 72 28 28 58 29 2c 27 3d 27 29 21 3d  trchr((X),'=')!=
e9e0: 30 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  0)../*.** Print 
e9f0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
ea00: 20 77 69 74 68 20 61 20 63 61 72 72 6f 74 20 70   with a carrot p
ea10: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6b  ointing to the k
ea20: 2d 74 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  -th character.**
ea30: 20 6f 66 20 74 68 65 20 6e 2d 74 68 20 66 69 65   of the n-th fie
ea40: 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ld..*/.static vo
ea50: 69 64 20 65 72 72 6c 69 6e 65 28 69 6e 74 20 6e  id errline(int n
ea60: 2c 20 69 6e 74 20 6b 2c 20 46 49 4c 45 20 2a 65  , int k, FILE *e
ea70: 72 72 29 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e  rr).{.  int spcn
ea80: 74 2c 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76  t, i;.  if( argv
ea90: 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72  [0] ) fprintf(er
eaa0: 72 2c 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b  r,"%s",argv[0]);
eab0: 0a 20 20 73 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e  .  spcnt = lemon
eac0: 53 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20  Strlen(argv[0]) 
ead0: 2b 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  + 1;.  for(i=1; 
eae0: 69 3c 6e 20 26 26 20 61 72 67 76 5b 69 5d 3b 20  i<n && argv[i]; 
eaf0: 69 2b 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  i++){.    fprint
eb00: 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76  f(err," %s",argv
eb10: 5b 69 5d 29 3b 0a 20 20 20 20 73 70 63 6e 74 20  [i]);.    spcnt 
eb20: 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61  += lemonStrlen(a
eb30: 72 67 76 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20  rgv[i])+1;.  }. 
eb40: 20 73 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66   spcnt += k;.  f
eb50: 6f 72 28 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b  or(; argv[i]; i+
eb60: 2b 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22  +) fprintf(err,"
eb70: 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20   %s",argv[i]);. 
eb80: 20 69 66 28 20 73 70 63 6e 74 3c 32 30 20 29 7b   if( spcnt<20 ){
eb90: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
eba0: 2c 22 5c 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c  ,"\n%*s^-- here\
ebb0: 6e 22 2c 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20  n",spcnt,"");.  
ebc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
ebd0: 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72  tf(err,"\n%*sher
ebe0: 65 20 2d 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37  e --^\n",spcnt-7
ebf0: 2c 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ,"");.  }.}../*.
ec00: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
ec10: 64 65 78 20 6f 66 20 74 68 65 20 4e 2d 74 68 20  dex of the N-th 
ec20: 6e 6f 6e 2d 73 77 69 74 63 68 20 61 72 67 75 6d  non-switch argum
ec30: 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  ent.  Return -1.
ec40: 2a 2a 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f  ** if N is out o
ec50: 66 20 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74  f range..*/.stat
ec60: 69 63 20 69 6e 74 20 61 72 67 69 6e 64 65 78 28  ic int argindex(
ec70: 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69  int n).{.  int i
ec80: 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68  ;.  int dashdash
ec90: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76   = 0;.  if( argv
eca0: 21 3d 30 20 26 26 20 2a 61 72 67 76 21 3d 30 20  !=0 && *argv!=0 
ecb0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
ecc0: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
ecd0: 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73       if( dashdas
ece0: 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76  h || !ISOPT(argv
ecf0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
ed00: 69 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72  if( n==0 ) retur
ed10: 6e 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d  n i;.        n--
ed20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ed30: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
ed40: 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61  i],"--")==0 ) da
ed50: 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20  shdash = 1;.    
ed60: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  }.  }.  return -
ed70: 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61  1;.}..static cha
ed80: 72 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d  r emsg[] = "Comm
ed90: 61 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20  and line syntax 
eda0: 65 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a  error: ";../*.**
edb0: 20 50 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20   Process a flag 
edc0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67  command line arg
edd0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
ede0: 20 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73   int handleflags
edf0: 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72  (int i, FILE *er
ee00: 72 29 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20  r).{.  int v;.  
ee10: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
ee20: 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
ee30: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
ee40: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
ee50: 74 72 6e 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b  trncmp(&argv[i][
ee60: 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c  1],op[j].label,l
ee70: 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d  emonStrlen(op[j]
ee80: 2e 6c 61 62 65 6c 29 29 3d 3d 30 20 29 20 62 72  .label))==0 ) br
ee90: 65 61 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61  eak;.  }.  v = a
eea0: 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f  rgv[i][0]=='-' ?
eeb0: 20 31 20 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70   1 : 0;.  if( op
eec0: 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a  [j].label==0 ){.
eed0: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
eee0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
eef0: 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70  ,"%sundefined op
ef00: 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  tion.\n",emsg);.
ef10: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
ef20: 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  1,err);.    }.  
ef30: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65    errcnt++;.  }e
ef40: 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 61 72  lse if( op[j].ar
ef50: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
ef60: 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f  gnore this optio
ef70: 6e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  n */.  }else if(
ef80: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
ef90: 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a 28 28  _FLAG ){.    *((
efa0: 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20  int*)op[j].arg) 
efb0: 3d 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = v;.  }else if(
efc0: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
efd0: 5f 46 46 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a  _FFLAG ){.    (*
efe0: 28 76 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f  (void(*)(int))(o
eff0: 70 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20  p[j].arg))(v);. 
f000: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d   }else if( op[j]
f010: 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 53 54 52 20  .type==OPT_FSTR 
f020: 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a  ){.    (*(void(*
f030: 29 28 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d  )(char *))(op[j]
f040: 2e 61 72 67 29 29 28 26 61 72 67 76 5b 69 5d 5b  .arg))(&argv[i][
f050: 32 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  2]);.  }else{.  
f060: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
f070: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
f080: 25 73 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65  %smissing argume
f090: 6e 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c 6e 22  nt on switch.\n"
f0a0: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72  ,emsg);.      er
f0b0: 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a  rline(i,1,err);.
f0c0: 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74      }.    errcnt
f0d0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
f0e0: 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   errcnt;.}../*.*
f0f0: 2a 20 50 72 6f 63 65 73 73 20 61 20 63 6f 6d 6d  * Process a comm
f100: 61 6e 64 20 6c 69 6e 65 20 73 77 69 74 63 68 20  and line switch 
f110: 77 68 69 63 68 20 68 61 73 20 61 6e 20 61 72 67  which has an arg
f120: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
f130: 20 69 6e 74 20 68 61 6e 64 6c 65 73 77 69 74 63   int handleswitc
f140: 68 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65  h(int i, FILE *e
f150: 72 72 29 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d  rr).{.  int lv =
f160: 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64 76 20   0;.  double dv 
f170: 3d 20 30 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73  = 0.0;.  char *s
f180: 76 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63  v = 0, *end;.  c
f190: 68 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a  har *cp;.  int j
f1a0: 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  ;.  int errcnt =
f1b0: 20 30 3b 0a 20 20 63 70 20 3d 20 73 74 72 63 68   0;.  cp = strch
f1c0: 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a  r(argv[i],'=');.
f1d0: 20 20 61 73 73 65 72 74 28 20 63 70 21 3d 30 20    assert( cp!=0 
f1e0: 29 3b 0a 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20  );.  *cp = 0;.  
f1f0: 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c  for(j=0; op[j].l
f200: 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  abel; j++){.    
f210: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
f220: 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d  i],op[j].label)=
f230: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
f240: 20 20 2a 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69    *cp = '=';.  i
f250: 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d  f( op[j].label==
f260: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72  0 ){.    if( err
f270: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
f280: 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e  f(err,"%sundefin
f290: 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d  ed option.\n",em
f2a0: 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69  sg);.      errli
f2b0: 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20  ne(i,0,err);.   
f2c0: 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b   }.    errcnt++;
f2d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70  .  }else{.    cp
f2e0: 2b 2b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  ++;.    switch( 
f2f0: 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[j].type ){.  
f300: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
f310: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
f320: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
f330: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
f340: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
f350: 72 2c 22 25 73 6f 70 74 69 6f 6e 20 72 65 71 75  r,"%soption requ
f360: 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
f370: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
f380: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
f390: 30 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  0,err);.        
f3a0: 7d 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74  }.        errcnt
f3b0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
f3c0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
f3d0: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73  T_DBL:.      cas
f3e0: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
f3f0: 20 20 20 20 64 76 20 3d 20 73 74 72 74 6f 64 28      dv = strtod(
f400: 63 70 2c 26 65 6e 64 29 3b 0a 20 20 20 20 20 20  cp,&end);.      
f410: 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20    if( *end ){.  
f420: 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20          if( err 
f430: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
f440: 70 72 69 6e 74 66 28 65 72 72 2c 0a 20 20 20 20  printf(err,.    
f450: 20 20 20 20 20 20 20 20 20 20 20 22 25 73 69 6c             "%sil
f460: 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
f470: 69 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  in floating-poin
f480: 74 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65  t argument.\n",e
f490: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
f4a0: 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 69 6e 74    errline(i,(int
f4b0: 29 28 28 63 68 61 72 2a 29 65 6e 64 2d 28 63 68  )((char*)end-(ch
f4c0: 61 72 2a 29 61 72 67 76 5b 69 5d 29 2c 65 72 72  ar*)argv[i]),err
f4d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
f4e0: 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b           errcnt+
f4f0: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
f500: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f510: 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a    case OPT_INT:.
f520: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
f530: 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 76 20  INT:.        lv 
f540: 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26 65 6e 64  = strtol(cp,&end
f550: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,0);.        if(
f560: 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20   *end ){.       
f570: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
f580: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
f590: 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c  f(err,"%sillegal
f5a0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 69 6e   character in in
f5b0: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 5c  teger argument.\
f5c0: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
f5d0: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
f5e0: 28 69 6e 74 29 28 28 63 68 61 72 2a 29 65 6e 64  (int)((char*)end
f5f0: 2d 28 63 68 61 72 2a 29 61 72 67 76 5b 69 5d 29  -(char*)argv[i])
f600: 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ,err);.         
f610: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72   }.          err
f620: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
f630: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
f640: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53        case OPT_S
f650: 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  TR:.      case O
f660: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
f670: 20 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20 20   sv = cp;.      
f680: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f690: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d     switch( op[j]
f6a0: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
f6b0: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
f6c0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
f6d0: 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61  AG:.        brea
f6e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
f6f0: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a  T_DBL:.        *
f700: 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e  (double*)(op[j].
f710: 61 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20 20  arg) = dv;.     
f720: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f730: 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20  case OPT_FDBL:. 
f740: 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a         (*(void(*
f750: 29 28 64 6f 75 62 6c 65 29 29 28 6f 70 5b 6a 5d  )(double))(op[j]
f760: 2e 61 72 67 29 29 28 64 76 29 3b 0a 20 20 20 20  .arg))(dv);.    
f770: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f780: 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
f790: 20 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 28 6f         *(int*)(o
f7a0: 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 6c 76 3b 0a  p[j].arg) = lv;.
f7b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f7c0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
f7d0: 4e 54 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76  NT:.        (*(v
f7e0: 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b  oid(*)(int))(op[
f7f0: 6a 5d 2e 61 72 67 29 29 28 28 69 6e 74 29 6c 76  j].arg))((int)lv
f800: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
f810: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
f820: 5f 53 54 52 3a 0a 20 20 20 20 20 20 20 20 2a 28  _STR:.        *(
f830: 63 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72  char**)(op[j].ar
f840: 67 29 20 3d 20 73 76 3b 0a 20 20 20 20 20 20 20  g) = sv;.       
f850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
f860: 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20  se OPT_FSTR:.   
f870: 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28       (*(void(*)(
f880: 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61  char *))(op[j].a
f890: 72 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20 20  rg))(sv);.      
f8a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f8b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
f8c0: 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e  nt;.}..int OptIn
f8d0: 69 74 28 63 68 61 72 20 2a 2a 61 2c 20 73 74 72  it(char **a, str
f8e0: 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f  uct s_options *o
f8f0: 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20  , FILE *err).{. 
f900: 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b   int errcnt = 0;
f910: 0a 20 20 61 72 67 76 20 3d 20 61 3b 0a 20 20 6f  .  argv = a;.  o
f920: 70 20 3d 20 6f 3b 0a 20 20 65 72 72 73 74 72 65  p = o;.  errstre
f930: 61 6d 20 3d 20 65 72 72 3b 0a 20 20 69 66 28 20  am = err;.  if( 
f940: 61 72 67 76 20 26 26 20 2a 61 72 67 76 20 26 26  argv && *argv &&
f950: 20 6f 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69   op ){.    int i
f960: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  ;.    for(i=1; a
f970: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
f980: 20 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 5b      if( argv[i][
f990: 30 5d 3d 3d 27 2b 27 20 7c 7c 20 61 72 67 76 5b  0]=='+' || argv[
f9a0: 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  i][0]=='-' ){.  
f9b0: 20 20 20 20 20 20 65 72 72 63 6e 74 20 2b 3d 20        errcnt += 
f9c0: 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72  handleflags(i,er
f9d0: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
f9e0: 69 66 28 20 73 74 72 63 68 72 28 61 72 67 76 5b  if( strchr(argv[
f9f0: 69 5d 2c 27 3d 27 29 20 29 7b 0a 20 20 20 20 20  i],'=') ){.     
fa00: 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e     errcnt += han
fa10: 64 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72 29  dleswitch(i,err)
fa20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
fa30: 20 20 7d 0a 20 20 69 66 28 20 65 72 72 63 6e 74    }.  if( errcnt
fa40: 3e 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  >0 ){.    fprint
fa50: 66 28 65 72 72 2c 22 56 61 6c 69 64 20 63 6f 6d  f(err,"Valid com
fa60: 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand line option
fa70: 73 20 66 6f 72 20 5c 22 25 73 5c 22 20 61 72 65  s for \"%s\" are
fa80: 3a 5c 6e 22 2c 2a 61 29 3b 0a 20 20 20 20 4f 70  :\n",*a);.    Op
fa90: 74 50 72 69 6e 74 28 29 3b 0a 20 20 20 20 65 78  tPrint();.    ex
faa0: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  it(1);.  }.  ret
fab0: 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70  urn 0;.}..int Op
fac0: 74 4e 41 72 67 73 28 29 7b 0a 20 20 69 6e 74 20  tNArgs(){.  int 
fad0: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 64  cnt = 0;.  int d
fae0: 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69  ashdash = 0;.  i
faf0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76  nt i;.  if( argv
fb00: 21 3d 30 20 26 26 20 61 72 67 76 5b 30 5d 21 3d  !=0 && argv[0]!=
fb10: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  0 ){.    for(i=1
fb20: 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b  ; argv[i]; i++){
fb30: 0a 20 20 20 20 20 20 69 66 28 20 64 61 73 68 64  .      if( dashd
fb40: 61 73 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72  ash || !ISOPT(ar
fb50: 67 76 5b 69 5d 29 20 29 20 63 6e 74 2b 2b 3b 0a  gv[i]) ) cnt++;.
fb60: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
fb70: 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d  (argv[i],"--")==
fb80: 30 20 29 20 64 61 73 68 64 61 73 68 20 3d 20 31  0 ) dashdash = 1
fb90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
fba0: 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 63 68 61  turn cnt;.}..cha
fbb0: 72 20 2a 4f 70 74 41 72 67 28 69 6e 74 20 6e 29  r *OptArg(int n)
fbc0: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20  .{.  int i;.  i 
fbd0: 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20  = argindex(n);. 
fbe0: 20 72 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61   return i>=0 ? a
fbf0: 72 67 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76  rgv[i] : 0;.}..v
fc00: 6f 69 64 20 4f 70 74 45 72 72 28 69 6e 74 20 6e  oid OptErr(int n
fc10: 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ).{.  int i;.  i
fc20: 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a   = argindex(n);.
fc30: 20 20 69 66 28 20 69 3e 3d 30 20 29 20 65 72 72    if( i>=0 ) err
fc40: 6c 69 6e 65 28 69 2c 30 2c 65 72 72 73 74 72 65  line(i,0,errstre
fc50: 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74  am);.}..void Opt
fc60: 50 72 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69  Print(){.  int i
fc70: 3b 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65 6e  ;.  int max, len
fc80: 3b 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20 66  ;.  max = 0;.  f
fc90: 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61  or(i=0; op[i].la
fca0: 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c  bel; i++){.    l
fcb0: 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  en = lemonStrlen
fcc0: 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b 20  (op[i].label) + 
fcd0: 31 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  1;.    switch( o
fce0: 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20  p[i].type ){.   
fcf0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47     case OPT_FLAG
fd00: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
fd10: 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20  _FFLAG:.        
fd20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
fd30: 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20  e OPT_INT:.     
fd40: 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a   case OPT_FINT:.
fd50: 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 39          len += 9
fd60: 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74  ;       /* lengt
fd70: 68 20 6f 66 20 22 3c 69 6e 74 65 67 65 72 3e 22  h of "<integer>"
fd80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
fd90: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
fda0: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73  T_DBL:.      cas
fdb0: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
fdc0: 20 20 20 20 6c 65 6e 20 2b 3d 20 36 3b 20 20 20      len += 6;   
fdd0: 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66      /* length of
fde0: 20 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20 20 20   "<real>" */.   
fdf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fe00: 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
fe10: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
fe20: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e  STR:.        len
fe30: 20 2b 3d 20 38 3b 20 20 20 20 20 20 20 2f 2a 20   += 8;       /* 
fe40: 6c 65 6e 67 74 68 20 6f 66 20 22 3c 73 74 72 69  length of "<stri
fe50: 6e 67 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  ng>" */.        
fe60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
fe70: 20 69 66 28 20 6c 65 6e 3e 6d 61 78 20 29 20 6d   if( len>max ) m
fe80: 61 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20  ax = len;.  }.  
fe90: 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c  for(i=0; op[i].l
fea0: 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  abel; i++){.    
feb0: 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79  switch( op[i].ty
fec0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
fed0: 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20   OPT_FLAG:.     
fee0: 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a   case OPT_FFLAG:
fef0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
ff00: 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25  (errstream,"  -%
ff10: 2d 2a 73 20 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f  -*s  %s\n",max,o
ff20: 70 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d  p[i].label,op[i]
ff30: 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20  .message);.     
ff40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ff50: 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20  case OPT_INT:.  
ff60: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e      case OPT_FIN
ff70: 54 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  T:.        fprin
ff80: 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20  tf(errstream,"  
ff90: 2d 25 73 3c 69 6e 74 65 67 65 72 3e 25 2a 73 20  -%s<integer>%*s 
ffa0: 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62   %s\n",op[i].lab
ffb0: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69  el,.          (i
ffc0: 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72  nt)(max-lemonStr
ffd0: 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29  len(op[i].label)
ffe0: 2d 39 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73  -9),"",op[i].mes
fff0: 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62  sage);.        b
10000 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
10010 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20   OPT_DBL:.      
10020 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20  case OPT_FDBL:. 
10030 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65         fprintf(e
10040 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 73 3c  rrstream,"  -%s<
10050 72 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e 22 2c  real>%*s  %s\n",
10060 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20  op[i].label,.   
10070 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78         (int)(max
10080 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b  -lemonStrlen(op[
10090 69 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22 22 2c  i].label)-6),"",
100a0 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a  op[i].message);.
100b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
100c0 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54       case OPT_ST
100d0 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  R:.      case OP
100e0 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20  T_FSTR:.        
100f0 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61  fprintf(errstrea
10100 6d 2c 22 20 20 2d 25 73 3c 73 74 72 69 6e 67 3e  m,"  -%s<string>
10110 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d  %*s  %s\n",op[i]
10120 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20  .label,.        
10130 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f    (int)(max-lemo
10140 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61  nStrlen(op[i].la
10150 62 65 6c 29 2d 38 29 2c 22 22 2c 6f 70 5b 69 5d  bel)-8),"",op[i]
10160 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20  .message);.     
10170 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10180 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a    }.}./*********
10190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
101a0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61  rom the file "pa
101b0 72 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  rse.c" *********
101c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
101d0 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74  ***/./*.** Input
101e0 20 66 69 6c 65 20 70 61 72 73 65 72 20 66 6f 72   file parser for
101f0 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
10200 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
10210 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66  ./* The state of
10220 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 65   the parser */.e
10230 6e 75 6d 20 65 5f 73 74 61 74 65 20 7b 0a 20 20  num e_state {.  
10240 49 4e 49 54 49 41 4c 49 5a 45 2c 0a 20 20 57 41  INITIALIZE,.  WA
10250 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
10260 52 5f 52 55 4c 45 2c 0a 20 20 57 41 49 54 49 4e  R_RULE,.  WAITIN
10270 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f  G_FOR_DECL_KEYWO
10280 52 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  RD,.  WAITING_FO
10290 52 5f 44 45 43 4c 5f 41 52 47 2c 0a 20 20 57 41  R_DECL_ARG,.  WA
102a0 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44  ITING_FOR_PRECED
102b0 45 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57  ENCE_SYMBOL,.  W
102c0 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57  AITING_FOR_ARROW
102d0 2c 0a 20 20 49 4e 5f 52 48 53 2c 0a 20 20 4c 48  ,.  IN_RHS,.  LH
102e0 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 4c 48 53  S_ALIAS_1,.  LHS
102f0 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 4c 48 53 5f  _ALIAS_2,.  LHS_
10300 41 4c 49 41 53 5f 33 2c 0a 20 20 52 48 53 5f 41  ALIAS_3,.  RHS_A
10310 4c 49 41 53 5f 31 2c 0a 20 20 52 48 53 5f 41 4c  LIAS_1,.  RHS_AL
10320 49 41 53 5f 32 2c 0a 20 20 50 52 45 43 45 44 45  IAS_2,.  PRECEDE
10330 4e 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 50 52  NCE_MARK_1,.  PR
10340 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c  ECEDENCE_MARK_2,
10350 0a 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f  .  RESYNC_AFTER_
10360 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20 52 45  RULE_ERROR,.  RE
10370 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
10380 45 52 52 4f 52 2c 0a 20 20 57 41 49 54 49 4e 47  ERROR,.  WAITING
10390 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f  _FOR_DESTRUCTOR_
103a0 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e  SYMBOL,.  WAITIN
103b0 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
103c0 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47  YMBOL,.  WAITING
103d0 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44  _FOR_FALLBACK_ID
103e0 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ,.  WAITING_FOR_
103f0 57 49 4c 44 43 41 52 44 5f 49 44 2c 0a 20 20 57  WILDCARD_ID,.  W
10400 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53  AITING_FOR_CLASS
10410 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  _ID,.  WAITING_F
10420 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 0a 7d  OR_CLASS_TOKEN.}
10430 3b 0a 73 74 72 75 63 74 20 70 73 74 61 74 65 20  ;.struct pstate 
10440 7b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61  {.  char *filena
10450 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  me;       /* Nam
10460 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66  e of the input f
10470 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b  ile */.  int tok
10480 65 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 2f  enlineno;      /
10490 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61 74 20  * Linenumber at 
104a0 77 68 69 63 68 20 63 75 72 72 65 6e 74 20 74 6f  which current to
104b0 6b 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a 20 20  ken starts */.  
104c0 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20  int errorcnt;   
104d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
104e0 6f 66 20 65 72 72 6f 72 73 20 73 6f 20 66 61 72  of errors so far
104f0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65   */.  char *toke
10500 6e 73 74 61 72 74 3b 20 20 20 20 20 2f 2a 20 54  nstart;     /* T
10510 65 78 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74  ext of current t
10520 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74  oken */.  struct
10530 20 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20 20 20   lemon *gp;     
10540 2f 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74 65 20  /* Global state 
10550 76 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d  vector */.  enum
10560 20 65 5f 73 74 61 74 65 20 73 74 61 74 65 3b 20   e_state state; 
10570 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74         /* The st
10580 61 74 65 20 6f 66 20 74 68 65 20 70 61 72 73 65  ate of the parse
10590 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  r */.  struct sy
105a0 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20  mbol *fallback; 
105b0 20 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61 63    /* The fallbac
105c0 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72  k token */.  str
105d0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 74 6b 63 6c  uct symbol *tkcl
105e0 61 73 73 3b 20 20 20 20 2f 2a 20 54 6f 6b 65 6e  ass;    /* Token
105f0 20 63 6c 61 73 73 20 73 79 6d 62 6f 6c 20 2a 2f   class symbol */
10600 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
10610 20 2a 6c 68 73 3b 20 20 20 20 20 20 20 20 2f 2a   *lhs;        /*
10620 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   Left-hand side 
10630 6f 66 20 63 75 72 72 65 6e 74 20 72 75 6c 65 20  of current rule 
10640 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
10650 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 20 20  *lhsalias;      
10660 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65  /* Alias for the
10670 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 6e 72   LHS */.  int nr
10680 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hs;             
10690 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
106a0 66 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  f right-hand sid
106b0 65 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e 20 2a  e symbols seen *
106c0 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
106d0 6c 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d 3b 20  l *rhs[MAXRHS]; 
106e0 20 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c 73 20   /* RHS symbols 
106f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
10700 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d 3b 20  *alias[MAXRHS]; 
10710 2f 2a 20 41 6c 69 61 73 65 73 20 66 6f 72 20 65  /* Aliases for e
10720 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28  ach RHS symbol (
10730 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 74  or NULL) */.  st
10740 72 75 63 74 20 72 75 6c 65 20 2a 70 72 65 76 72  ruct rule *prevr
10750 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72 65 76  ule;     /* Prev
10760 69 6f 75 73 20 72 75 6c 65 20 70 61 72 73 65 64  ious rule parsed
10770 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
10780 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b 20 20   *declkeyword;  
10790 20 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66 20 61   /* Keyword of a
107a0 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
107b0 20 20 63 68 61 72 20 2a 2a 64 65 63 6c 61 72 67    char **declarg
107c0 73 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  slot;        /* 
107d0 57 68 65 72 65 20 74 68 65 20 64 65 63 6c 61 72  Where the declar
107e0 61 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 73  ation argument s
107f0 68 6f 75 6c 64 20 62 65 20 70 75 74 20 2a 2f 0a  hould be put */.
10800 20 20 69 6e 74 20 69 6e 73 65 72 74 4c 69 6e 65    int insertLine
10810 4d 61 63 72 6f 3b 20 20 20 20 20 20 20 2f 2a 20  Macro;       /* 
10820 41 64 64 20 23 6c 69 6e 65 20 62 65 66 6f 72 65  Add #line before
10830 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 73   declaration ins
10840 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64 65  ert */.  int *de
10850 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20 20 20  cllinenoslot;   
10860 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
10870 77 72 69 74 65 20 64 65 63 6c 61 72 61 74 69 6f  write declaratio
10880 6e 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f  n line number */
10890 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20  .  enum e_assoc 
108a0 64 65 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f 2a  declassoc;    /*
108b0 20 41 73 73 69 67 6e 20 74 68 69 73 20 61 73 73   Assign this ass
108c0 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64 65 63 6c  ociation to decl
108d0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
108e0 69 6e 74 20 70 72 65 63 63 6f 75 6e 74 65 72 3b  int preccounter;
108f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
10900 73 69 67 6e 20 74 68 69 73 20 70 72 65 63 65 64  sign this preced
10910 65 6e 63 65 20 74 6f 20 64 65 63 6c 20 61 72 67  ence to decl arg
10920 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75  uments */.  stru
10930 63 74 20 72 75 6c 65 20 2a 66 69 72 73 74 72 75  ct rule *firstru
10940 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  le;    /* Pointe
10950 72 20 74 6f 20 66 69 72 73 74 20 72 75 6c 65 20  r to first rule 
10960 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  in the grammar *
10970 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
10980 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20 20 20 2f  *lastrule;     /
10990 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
109a0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
109b0 61 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b  arsed rule */.};
109c0 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20 73 69 6e  ../* Parse a sin
109d0 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61  gle token */.sta
109e0 74 69 63 20 76 6f 69 64 20 70 61 72 73 65 6f 6e  tic void parseon
109f0 65 74 6f 6b 65 6e 28 73 74 72 75 63 74 20 70 73  etoken(struct ps
10a00 74 61 74 65 20 2a 70 73 70 29 0a 7b 0a 20 20 63  tate *psp).{.  c
10a10 6f 6e 73 74 20 63 68 61 72 20 2a 78 3b 0a 20 20  onst char *x;.  
10a20 78 20 3d 20 53 74 72 73 61 66 65 28 70 73 70 2d  x = Strsafe(psp-
10a30 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20 20  >tokenstart);   
10a40 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 74 6f    /* Save the to
10a50 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20  ken permanently 
10a60 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72 69 6e 74  */.#if 0.  print
10a70 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d  f("%s:%d: Token=
10a80 5b 25 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e 22  [%s] state=%d\n"
10a90 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  ,psp->filename,p
10aa0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
10ab0 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73 74 61 74  .    x,psp->stat
10ac0 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77 69  e);.#endif.  swi
10ad0 74 63 68 28 20 70 73 70 2d 3e 73 74 61 74 65 20  tch( psp->state 
10ae0 29 7b 0a 20 20 20 20 63 61 73 65 20 49 4e 49 54  ){.    case INIT
10af0 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70 73  IALIZE:.      ps
10b00 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b  p->prevrule = 0;
10b10 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63  .      psp->prec
10b20 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20  counter = 0;.   
10b30 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c     psp->firstrul
10b40 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c  e = psp->lastrul
10b50 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70  e = 0;.      psp
10b60 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b  ->gp->nrule = 0;
10b70 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
10b80 68 72 75 20 74 6f 20 6e 65 78 74 20 63 61 73 65  hru to next case
10b90 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 57 41 49   */.    case WAI
10ba0 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
10bb0 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20 69 66 28  _RULE:.      if(
10bc0 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20 20   x[0]=='%' ){.  
10bd0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10be0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
10bf0 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20  ECL_KEYWORD;.   
10c00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 4c     }else if( ISL
10c10 4f 57 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20  OWER(x[0]) ){.  
10c20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 20 3d        psp->lhs =
10c30 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
10c40 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68          psp->nrh
10c50 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  s = 0;.        p
10c60 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 30  sp->lhsalias = 0
10c70 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
10c80 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
10c90 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20 20  OR_ARROW;.      
10ca0 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d  }else if( x[0]==
10cb0 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '{' ){.        i
10cc0 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65  f( psp->prevrule
10cd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10ce0 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
10cf0 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
10d00 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72 65  enlineno,."There
10d10 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c   is no prior rul
10d20 65 20 75 70 6f 6e 20 77 68 69 63 68 20 74 6f 20  e upon which to 
10d30 61 74 74 61 63 68 20 74 68 65 20 63 6f 64 65 20  attach the code 
10d40 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68 69 63 68  \.fragment which
10d50 20 62 65 67 69 6e 73 20 6f 6e 20 74 68 69 73 20   begins on this 
10d60 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  line.");.       
10d70 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
10d80 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
10d90 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72  e if( psp->prevr
10da0 75 6c 65 2d 3e 63 6f 64 65 21 3d 30 20 29 7b 0a  ule->code!=0 ){.
10db0 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
10dc0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
10dd0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
10de0 6f 2c 0a 22 43 6f 64 65 20 66 72 61 67 6d 65 6e  o,."Code fragmen
10df0 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f 6e 20 74  t beginning on t
10e00 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20  his line is not 
10e10 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66  the first \.to f
10e20 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f  ollow the previo
10e30 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20  us rule.");.    
10e40 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
10e50 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
10e60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10e70 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 6c  psp->prevrule->l
10e80 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e  ine = psp->token
10e90 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20  lineno;.        
10ea0 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d    psp->prevrule-
10eb0 3e 63 6f 64 65 20 3d 20 26 78 5b 31 5d 3b 0a 20  >code = &x[1];. 
10ec0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
10ed0 65 76 72 75 6c 65 2d 3e 6e 6f 43 6f 64 65 20 3d  evrule->noCode =
10ee0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
10ef0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b      }else if( x[
10f00 30 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20  0]=='[' ){.     
10f10 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
10f20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
10f30 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
10f40 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
10f50 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
10f60 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
10f70 0a 20 20 20 20 20 20 20 20 20 20 22 54 6f 6b 65  .          "Toke
10f80 6e 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20  n \"%s\" should 
10f90 62 65 20 65 69 74 68 65 72 20 5c 22 25 25 5c 22  be either \"%%\"
10fa0 20 6f 72 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61   or a nontermina
10fb0 6c 20 6e 61 6d 65 2e 22 2c 0a 20 20 20 20 20 20  l name.",.      
10fc0 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20      x);.        
10fd0 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
10fe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10ff0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50  reak;.    case P
11000 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31  RECEDENCE_MARK_1
11010 3a 0a 20 20 20 20 20 20 69 66 28 20 21 49 53 55  :.      if( !ISU
11020 50 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20  PPER(x[0]) ){.  
11030 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11040 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11050 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11060 20 20 20 20 20 20 20 20 20 22 54 68 65 20 70 72           "The pr
11070 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20  ecedence symbol 
11080 6d 75 73 74 20 62 65 20 61 20 74 65 72 6d 69 6e  must be a termin
11090 61 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  al.");.        p
110a0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
110b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
110c0 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30  psp->prevrule==0
110d0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
110e0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
110f0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
11100 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
11110 54 68 65 72 65 20 69 73 20 6e 6f 20 70 72 69 6f  There is no prio
11120 72 20 72 75 6c 65 20 74 6f 20 61 73 73 69 67 6e  r rule to assign
11130 20 70 72 65 63 65 64 65 6e 63 65 20 5c 22 5b 25   precedence \"[%
11140 73 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  s]\".",x);.     
11150 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
11160 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
11170 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c  if( psp->prevrul
11180 65 2d 3e 70 72 65 63 73 79 6d 21 3d 30 20 29 7b  e->precsym!=0 ){
11190 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
111a0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
111b0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
111c0 2c 0a 22 50 72 65 63 65 64 65 6e 63 65 20 6d 61  ,."Precedence ma
111d0 72 6b 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20  rk on this line 
111e0 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  is not the first
111f0 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65   \.to follow the
11200 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22   previous rule."
11210 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
11220 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11240 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e   psp->prevrule->
11250 70 72 65 63 73 79 6d 20 3d 20 53 79 6d 62 6f 6c  precsym = Symbol
11260 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 7d  _new(x);.      }
11270 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74  .      psp->stat
11280 65 20 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d  e = PRECEDENCE_M
11290 41 52 4b 5f 32 3b 0a 20 20 20 20 20 20 62 72 65  ARK_2;.      bre
112a0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45  ak;.    case PRE
112b0 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a  CEDENCE_MARK_2:.
112c0 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 21 3d        if( x[0]!=
112d0 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ']' ){.        E
112e0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
112f0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
11300 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
11310 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 5d 5c 22    "Missing \"]\"
11320 20 6f 6e 20 70 72 65 63 65 64 65 6e 63 65 20 6d   on precedence m
11330 61 72 6b 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ark.");.        
11340 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
11350 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
11360 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
11370 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
11380 52 55 4c 45 3b 0a 20 20 20 20 20 20 62 72 65 61  RULE;.      brea
11390 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
113a0 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3a 0a 20  ING_FOR_ARROW:. 
113b0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
113c0 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20  :' && x[1]==':' 
113d0 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a  && x[2]=='=' ){.
113e0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
113f0 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20  te = IN_RHS;.   
11400 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30     }else if( x[0
11410 5d 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20  ]=='(' ){.      
11420 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c    psp->state = L
11430 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20  HS_ALIAS_1;.    
11440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
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 45 78 70 65 63 74 65 64 20 74 6f      "Expected to
11490 20 73 65 65 20 61 20 5c 22 3a 5c 22 20 66 6f 6c   see a \":\" fol
114a0 6c 6f 77 69 6e 67 20 74 68 65 20 4c 48 53 20 73  lowing the LHS s
114b0 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a  ymbol \"%s\".",.
114c0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c            psp->l
114d0 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  hs->name);.     
114e0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
114f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
11500 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
11510 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
11520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11530 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
11540 4c 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20  LHS_ALIAS_1:.   
11550 20 20 20 69 66 28 20 49 53 41 4c 50 48 41 28 78     if( ISALPHA(x
11560 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
11570 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20  psp->lhsalias = 
11580 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  x;.        psp->
11590 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41  state = LHS_ALIA
115a0 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_2;.      }else
115b0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
115c0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
115d0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
115e0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22  o,.          "\"
115f0 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61  %s\" is not a va
11600 6c 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68  lid alias for th
11610 65 20 4c 48 53 20 5c 22 25 73 5c 22 5c 6e 22 2c  e LHS \"%s\"\n",
11620 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70  .          x,psp
11630 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ->lhs->name);.  
11640 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
11650 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
11660 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
11670 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
11680 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
11690 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
116a0 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3a 0a  se LHS_ALIAS_2:.
116b0 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
116c0 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ')' ){.        p
116d0 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f  sp->state = LHS_
116e0 41 4c 49 41 53 5f 33 3b 0a 20 20 20 20 20 20 7d  ALIAS_3;.      }
116f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
11700 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
11710 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
11720 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
11730 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20   "Missing \")\" 
11740 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c  following LHS al
11750 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e  ias name \"%s\".
11760 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29  ",psp->lhsalias)
11770 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
11780 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
11790 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
117a0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
117b0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
117c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
117d0 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53    case LHS_ALIAS
117e0 5f 33 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  _3:.      if( x[
117f0 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d  0]==':' && x[1]=
11800 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d  =':' && x[2]=='=
11810 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
11820 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53  ->state = IN_RHS
11830 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11840 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11850 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
11860 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
11870 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69            "Missi
11880 6e 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77  ng \"->\" follow
11890 69 6e 67 3a 20 5c 22 25 73 28 25 73 29 5c 22 2e  ing: \"%s(%s)\".
118a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 73  ",.           ps
118b0 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70 73 70  p->lhs->name,psp
118c0 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
118d0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
118e0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
118f0 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11900 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
11910 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
11920 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11930 65 20 49 4e 5f 52 48 53 3a 0a 20 20 20 20 20 20  e IN_RHS:.      
11940 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b  if( x[0]=='.' ){
11950 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
11960 72 75 6c 65 20 2a 72 70 3b 0a 20 20 20 20 20 20  rule *rp;.      
11970 20 20 72 70 20 3d 20 28 73 74 72 75 63 74 20 72    rp = (struct r
11980 75 6c 65 20 2a 29 63 61 6c 6c 6f 63 28 20 73 69  ule *)calloc( si
11990 7a 65 6f 66 28 73 74 72 75 63 74 20 72 75 6c 65  zeof(struct rule
119a0 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20  ) + .           
119b0 20 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20    sizeof(struct 
119c0 73 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e 72  symbol*)*psp->nr
119d0 68 73 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72  hs + sizeof(char
119e0 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 2c 20 31 29  *)*psp->nrhs, 1)
119f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70  ;.        if( rp
11a00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11a10 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
11a20 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
11a30 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
11a40 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 6c 6c        "Can't all
11a50 6f 63 61 74 65 20 65 6e 6f 75 67 68 20 6d 65 6d  ocate enough mem
11a60 6f 72 79 20 66 6f 72 20 74 68 69 73 20 72 75 6c  ory for this rul
11a70 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e.");.          
11a80 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
11a90 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11aa0 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20 20  prevrule = 0;.  
11ab0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11ac0 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
11ad0 20 20 20 20 20 20 20 20 72 70 2d 3e 72 75 6c 65          rp->rule
11ae0 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65  line = psp->toke
11af0 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20  nlineno;.       
11b00 20 20 20 72 70 2d 3e 72 68 73 20 3d 20 28 73 74     rp->rhs = (st
11b10 72 75 63 74 20 73 79 6d 62 6f 6c 2a 2a 29 26 72  ruct symbol**)&r
11b20 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  p[1];.          
11b30 72 70 2d 3e 72 68 73 61 6c 69 61 73 20 3d 20 28  rp->rhsalias = (
11b40 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 28 72  const char**)&(r
11b50 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73  p->rhs[psp->nrhs
11b60 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ]);.          fo
11b70 72 28 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e 72  r(i=0; i<psp->nr
11b80 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
11b90 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d        rp->rhs[i]
11ba0 20 3d 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a   = psp->rhs[i];.
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e              rp->
11bc0 72 68 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70 73  rhsalias[i] = ps
11bd0 70 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a 20 20 20  p->alias[i];.   
11be0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11bf0 20 20 20 72 70 2d 3e 6c 68 73 20 3d 20 70 73 70     rp->lhs = psp
11c00 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 20 20 20  ->lhs;.         
11c10 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20   rp->lhsalias = 
11c20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a 20  psp->lhsalias;. 
11c30 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 72 68           rp->nrh
11c40 73 20 3d 20 70 73 70 2d 3e 6e 72 68 73 3b 0a 20  s = psp->nrhs;. 
11c50 20 20 20 20 20 20 20 20 20 72 70 2d 3e 63 6f 64           rp->cod
11c60 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
11c70 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 31 3b   rp->noCode = 1;
11c80 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70  .          rp->p
11c90 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20  recsym = 0;.    
11ca0 20 20 20 20 20 20 72 70 2d 3e 69 6e 64 65 78 20        rp->index 
11cb0 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65  = psp->gp->nrule
11cc0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  ++;.          rp
11cd0 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e  ->nextlhs = rp->
11ce0 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20  lhs->rule;.     
11cf0 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75       rp->lhs->ru
11d00 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20  le = rp;.       
11d10 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b     rp->next = 0;
11d20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
11d30 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30  sp->firstrule==0
11d40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
11d50 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d  psp->firstrule =
11d60 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d   psp->lastrule =
11d70 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rp;.          }
11d80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11d90 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 2d    psp->lastrule-
11da0 3e 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20 20 20  >next = rp;.    
11db0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73          psp->las
11dc0 74 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20  trule = rp;.    
11dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11de0 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20    psp->prevrule 
11df0 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = rp;.        }.
11e00 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11e10 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
11e20 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
11e30 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49       }else if( I
11e40 53 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a  SALPHA(x[0]) ){.
11e50 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
11e60 3e 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20 29 7b  >nrhs>=MAXRHS ){
11e70 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
11e80 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
11e90 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
11ea0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
11eb0 22 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62 6f 6c  "Too many symbol
11ec0 73 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65  s on RHS of rule
11ed0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 5c 22   beginning at \"
11ee0 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20  %s\".",.        
11ef0 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20      x);.        
11f00 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11f10 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
11f20 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
11f30 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
11f40 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  R;.        }else
11f50 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
11f60 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20  >rhs[psp->nrhs] 
11f70 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
11f80 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11f90 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  alias[psp->nrhs]
11fa0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
11fb0 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 20 20 20  psp->nrhs++;.   
11fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
11fd0 73 65 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7c  se if( (x[0]=='|
11fe0 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20  ' || x[0]=='/') 
11ff0 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29  && psp->nrhs>0 )
12000 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
12010 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70   symbol *msp = p
12020 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68  sp->rhs[psp->nrh
12030 73 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  s-1];.        if
12040 28 20 6d 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c  ( msp->type!=MUL
12050 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
12060 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
12070 79 6d 62 6f 6c 20 2a 6f 72 69 67 73 70 20 3d 20  ymbol *origsp = 
12080 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  msp;.          m
12090 73 70 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d  sp = (struct sym
120a0 62 6f 6c 20 2a 29 20 63 61 6c 6c 6f 63 28 31 2c  bol *) calloc(1,
120b0 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20  sizeof(*msp));. 
120c0 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
120d0 6d 73 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  msp, 0, sizeof(*
120e0 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20  msp));.         
120f0 20 6d 73 70 2d 3e 74 79 70 65 20 3d 20 4d 55 4c   msp->type = MUL
12100 54 49 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20  TITERMINAL;.    
12110 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73        msp->nsubs
12120 79 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ym = 1;.        
12130 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20    msp->subsym = 
12140 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
12150 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65  *) calloc(1,size
12160 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
12170 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  *));.          m
12180 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 20 3d 20  sp->subsym[0] = 
12190 6f 72 69 67 73 70 3b 0a 20 20 20 20 20 20 20 20  origsp;.        
121a0 20 20 6d 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f 72    msp->name = or
121b0 69 67 73 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20  igsp->name;.    
121c0 20 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b 70        psp->rhs[p
121d0 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d 73  sp->nrhs-1] = ms
121e0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
121f0 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79       msp->nsubsy
12200 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70  m++;.        msp
12210 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74 72 75  ->subsym = (stru
12220 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65  ct symbol **) re
12230 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79  alloc(msp->subsy
12240 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a  m,.          siz
12250 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
12260 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d  l*)*msp->nsubsym
12270 29 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e  );.        msp->
12280 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62  subsym[msp->nsub
12290 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f  sym-1] = Symbol_
122a0 6e 65 77 28 26 78 5b 31 5d 29 3b 0a 20 20 20 20  new(&x[1]);.    
122b0 20 20 20 20 69 66 28 20 49 53 4c 4f 57 45 52 28      if( ISLOWER(
122c0 78 5b 31 5d 29 20 7c 7c 20 49 53 4c 4f 57 45 52  x[1]) || ISLOWER
122d0 28 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d  (msp->subsym[0]-
122e0 3e 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20  >name[0]) ){.   
122f0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
12300 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
12310 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
12320 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61 6e              "Can
12330 6e 6f 74 20 66 6f 72 6d 20 61 20 63 6f 6d 70 6f  not form a compo
12340 75 6e 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  und containing a
12350 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 22 29 3b   non-terminal");
12360 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12370 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
12380 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
12390 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20  e if( x[0]=='(' 
123a0 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29  && psp->nrhs>0 )
123b0 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
123c0 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53  tate = RHS_ALIAS
123d0 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _1;.      }else{
123e0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
123f0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
12400 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
12410 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c  ,.          "Ill
12420 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 6f  egal character o
12430 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c  n RHS of rule: \
12440 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20  "%s\".",x);.    
12450 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
12460 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
12470 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
12480 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
12490 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
124a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
124b0 20 52 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20   RHS_ALIAS_1:.  
124c0 20 20 20 20 69 66 28 20 49 53 41 4c 50 48 41 28      if( ISALPHA(
124d0 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
124e0 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d   psp->alias[psp-
124f0 3e 6e 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20  >nrhs-1] = x;.  
12500 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
12510 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a   = RHS_ALIAS_2;.
12520 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12530 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
12540 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
12550 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
12560 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20          "\"%s\" 
12570 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61  is not a valid a
12580 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 48 53  lias for the RHS
12590 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e   symbol \"%s\"\n
125a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70  ",.          x,p
125b0 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68  sp->rhs[psp->nrh
125c0 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  s-1]->name);.   
125d0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
125e0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
125f0 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
12600 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
12610 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
12620 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
12630 65 20 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20  e RHS_ALIAS_2:. 
12640 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
12650 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  )' ){.        ps
12660 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48  p->state = IN_RH
12670 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  S;.      }else{.
12680 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
12690 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
126a0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
126b0 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73  .          "Miss
126c0 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77  ing \")\" follow
126d0 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61  ing LHS alias na
126e0 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d  me \"%s\".",psp-
126f0 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20  >lhsalias);.    
12700 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
12710 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
12720 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
12730 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
12740 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
12750 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
12760 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
12770 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20 20  L_KEYWORD:.     
12780 20 69 66 28 20 49 53 41 4c 50 48 41 28 78 5b 30   if( ISALPHA(x[0
12790 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  ]) ){.        ps
127a0 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d  p->declkeyword =
127b0 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   x;.        psp-
127c0 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30  >declargslot = 0
127d0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64  ;.        psp->d
127e0 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20  ecllinenoslot = 
127f0 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
12800 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
12810 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 1;.        psp
12820 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
12830 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a  G_FOR_DECL_ARG;.
12840 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
12850 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30 20  mp(x,"name")==0 
12860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
12870 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
12880 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65 29  &(psp->gp->name)
12890 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
128a0 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
128b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
128c0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
128d0 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20 29  ,"include")==0 )
128e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
128f0 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
12900 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64  (psp->gp->includ
12910 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
12920 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
12930 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  code")==0 ){.   
12940 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
12950 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
12960 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 29 3b  >gp->extracode);
12970 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
12980 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b  f( strcmp(x,"tok
12990 65 6e 5f 64 65 73 74 72 75 63 74 6f 72 22 29 3d  en_destructor")=
129a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
129b0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
129c0 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b   = &psp->gp->tok
129d0 65 6e 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20  endest;.        
129e0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
129f0 28 78 2c 22 64 65 66 61 75 6c 74 5f 64 65 73 74  (x,"default_dest
12a00 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20  ructor")==0 ){. 
12a10 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
12a20 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70  clargslot = &psp
12a30 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20  ->gp->vardest;. 
12a40 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12a50 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e   strcmp(x,"token
12a60 5f 70 72 65 66 69 78 22 29 3d 3d 30 20 29 7b 0a  _prefix")==0 ){.
12a70 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
12a80 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73  eclargslot = &ps
12a90 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65 66  p->gp->tokenpref
12aa0 69 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ix;.          ps
12ab0 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
12ac0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
12ad0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
12ae0 28 78 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f 72  (x,"syntax_error
12af0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
12b00 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
12b10 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
12b20 3e 65 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20  >error);.       
12b30 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12b40 70 28 78 2c 22 70 61 72 73 65 5f 61 63 63 65 70  p(x,"parse_accep
12b50 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
12b60 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
12b70 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
12b80 2d 3e 61 63 63 65 70 74 29 3b 0a 20 20 20 20 20  ->accept);.     
12b90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
12ba0 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 66 61 69  cmp(x,"parse_fai
12bb0 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lure")==0 ){.   
12bc0 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
12bd0 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
12be0 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 20  >gp->failure);. 
12bf0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12c00 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63 6b   strcmp(x,"stack
12c10 5f 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20 29  _overflow")==0 )
12c20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
12c30 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
12c40 28 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c  (psp->gp->overfl
12c50 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ow);.        }el
12c60 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
12c70 22 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74 22  "extra_argument"
12c80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12c90 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
12ca0 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
12cb0 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  arg);.          
12cc0 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
12cd0 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  acro = 0;.      
12ce0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
12cf0 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70 65  mp(x,"token_type
12d00 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
12d10 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
12d20 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
12d30 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20 20  >tokentype);.   
12d40 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
12d50 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
12d60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
12d70 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66  f( strcmp(x,"def
12d80 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20 29  ault_type")==0 )
12d90 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
12da0 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
12db0 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79 70  (psp->gp->vartyp
12dc0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  e);.          ps
12dd0 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
12de0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
12df0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
12e00 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22 29  (x,"stack_size")
12e10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12e20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
12e30 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73  t = &(psp->gp->s
12e40 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20  tacksize);.     
12e50 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74       psp->insert
12e60 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20  LineMacro = 0;. 
12e70 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12e80 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 72 74   strcmp(x,"start
12e90 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b 0a  _symbol")==0 ){.
12ea0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
12eb0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
12ec0 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b 0a  sp->gp->start);.
12ed0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69            psp->i
12ee0 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
12ef0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
12f00 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
12f10 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  left")==0 ){.   
12f20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63         psp->prec
12f30 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20  counter++;.     
12f40 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73       psp->declas
12f50 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20 20  soc = LEFT;.    
12f60 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
12f70 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50   = WAITING_FOR_P
12f80 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c  RECEDENCE_SYMBOL
12f90 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
12fa0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 72 69  if( strcmp(x,"ri
12fb0 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ght")==0 ){.    
12fc0 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63        psp->precc
12fd0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
12fe0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73      psp->declass
12ff0 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20 20 20 20  oc = RIGHT;.    
13000 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
13010 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50   = WAITING_FOR_P
13020 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c  RECEDENCE_SYMBOL
13030 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
13040 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 6f  if( strcmp(x,"no
13050 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a 20  nassoc")==0 ){. 
13060 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
13070 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  eccounter++;.   
13080 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
13090 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20 20  assoc = NONE;.  
130a0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
130b0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
130c0 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42  _PRECEDENCE_SYMB
130d0 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OL;.        }els
130e0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
130f0 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20  destructor")==0 
13100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
13110 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
13120 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52  G_FOR_DESTRUCTOR
13130 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20  _SYMBOL;.       
13140 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13150 70 28 78 2c 22 74 79 70 65 22 29 3d 3d 30 20 29  p(x,"type")==0 )
13160 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
13170 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
13180 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59  _FOR_DATATYPE_SY
13190 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65  MBOL;.        }e
131a0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
131b0 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30 20  ,"fallback")==0 
131c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
131d0 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ->fallback = 0;.
131e0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
131f0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
13200 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b 0a  OR_FALLBACK_ID;.
13210 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
13220 28 20 73 74 72 63 6d 70 28 78 2c 22 77 69 6c 64  ( strcmp(x,"wild
13230 63 61 72 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20  card")==0 ){.   
13240 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13250 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
13260 57 49 4c 44 43 41 52 44 5f 49 44 3b 0a 20 20 20  WILDCARD_ID;.   
13270 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
13280 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 63  trcmp(x,"token_c
13290 6c 61 73 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lass")==0 ){.   
132a0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
132b0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
132c0 43 4c 41 53 53 5f 49 44 3b 0a 20 20 20 20 20 20  CLASS_ID;.      
132d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
132e0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
132f0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
13300 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
13310 20 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e          "Unknown
13320 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79   declaration key
13330 77 6f 72 64 3a 20 5c 22 25 25 25 73 5c 22 2e 22  word: \"%%%s\"."
13340 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ,x);.          p
13350 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
13360 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
13370 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
13380 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a  TER_DECL_ERROR;.
13390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
133a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
133b0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
133c0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
133d0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
133e0 20 20 22 49 6c 6c 65 67 61 6c 20 64 65 63 6c 61    "Illegal decla
133f0 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20  ration keyword: 
13400 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20  \"%s\".",x);.   
13410 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
13420 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
13430 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
13440 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
13450 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
13460 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
13470 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  e WAITING_FOR_DE
13480 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3a  STRUCTOR_SYMBOL:
13490 0a 20 20 20 20 20 20 69 66 28 20 21 49 53 41 4c  .      if( !ISAL
134a0 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  PHA(x[0]) ){.   
134b0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
134c0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
134d0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
134e0 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20          "Symbol 
134f0 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74  name missing aft
13500 65 72 20 25 25 64 65 73 74 72 75 63 74 6f 72 20  er %%destructor 
13510 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20 20  keyword");.     
13520 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
13530 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
13540 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
13550 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
13560 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13570 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
13580 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f  mbol *sp = Symbo
13590 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
135a0 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
135b0 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 72 75  ot = &sp->destru
135c0 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 73  ctor;.        ps
135d0 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f  p->decllinenoslo
135e0 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 4c 69 6e  t = &sp->destLin
135f0 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70 73 70  eno;.        psp
13600 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
13610 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  o = 1;.        p
13620 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
13630 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47  ING_FOR_DECL_ARG
13640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13650 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
13660 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41  WAITING_FOR_DATA
13670 54 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20  TYPE_SYMBOL:.   
13680 20 20 20 69 66 28 20 21 49 53 41 4c 50 48 41 28     if( !ISALPHA(
13690 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
136a0 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
136b0 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
136c0 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
136d0 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65      "Symbol name
136e0 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20 25   missing after %
136f0 25 74 79 70 65 20 6b 65 79 77 6f 72 64 22 29 3b  %type keyword");
13700 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
13710 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
13720 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
13730 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
13740 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
13750 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72  lse{.        str
13760 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
13770 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b   Symbol_find(x);
13780 0a 20 20 20 20 20 20 20 20 69 66 28 28 73 70 29  .        if((sp)
13790 20 26 26 20 28 73 70 2d 3e 64 61 74 61 74 79 70   && (sp->datatyp
137a0 65 29 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  e)){.          E
137b0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
137c0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
137d0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
137e0 20 20 20 20 22 53 79 6d 62 6f 6c 20 25 25 74 79      "Symbol %%ty
137f0 70 65 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64  pe \"%s\" alread
13800 79 20 64 65 66 69 6e 65 64 22 2c 20 78 29 3b 0a  y defined", x);.
13810 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
13820 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
13830 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
13840 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
13850 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
13860 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13870 20 20 20 20 69 66 20 28 21 73 70 29 7b 0a 20 20      if (!sp){.  
13880 20 20 20 20 20 20 20 20 20 20 73 70 20 3d 20 53            sp = S
13890 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
138a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
138b0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
138c0 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74 61  slot = &sp->data
138d0 74 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  type;.          
138e0 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
138f0 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  acro = 0;.      
13900 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
13910 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
13920 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20 7d  L_ARG;.        }
13930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13940 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
13950 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45  AITING_FOR_PRECE
13960 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20  DENCE_SYMBOL:.  
13970 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e      if( x[0]=='.
13980 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
13990 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
139a0 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
139b0 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  LE;.      }else 
139c0 69 66 28 20 49 53 55 50 50 45 52 28 78 5b 30 5d  if( ISUPPER(x[0]
139d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ) ){.        str
139e0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
139f0 20 20 20 20 20 20 20 20 73 70 20 3d 20 53 79 6d          sp = Sym
13a00 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
13a10 20 20 20 20 69 66 28 20 73 70 2d 3e 70 72 65 63      if( sp->prec
13a20 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
13a30 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
13a40 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
13a50 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
13a60 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c 22        "Symbol \"
13a70 25 73 5c 22 20 68 61 73 20 61 6c 72 65 61 64 79  %s\" has already
13a80 20 62 65 20 67 69 76 65 6e 20 61 20 70 72 65 63   be given a prec
13a90 65 64 65 6e 63 65 2e 22 2c 78 29 3b 0a 20 20 20  edence.",x);.   
13aa0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
13ab0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
13ac0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13ad0 20 73 70 2d 3e 70 72 65 63 20 3d 20 70 73 70 2d   sp->prec = psp-
13ae0 3e 70 72 65 63 63 6f 75 6e 74 65 72 3b 0a 20 20  >preccounter;.  
13af0 20 20 20 20 20 20 20 20 73 70 2d 3e 61 73 73 6f          sp->asso
13b00 63 20 3d 20 70 73 70 2d 3e 64 65 63 6c 61 73 73  c = psp->declass
13b10 6f 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  oc;.        }.  
13b20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13b30 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
13b40 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
13b50 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
13b60 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 73 73        "Can't ass
13b70 69 67 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65  ign a precedence
13b80 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b   to \"%s\".",x);
13b90 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
13ba0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
13bb0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
13bc0 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
13bd0 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20  FOR_DECL_ARG:.  
13be0 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b      if( x[0]=='{
13bf0 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27 20  ' || x[0]=='\"' 
13c00 7c 7c 20 49 53 41 4c 4e 55 4d 28 78 5b 30 5d 29  || ISALNUM(x[0])
13c10 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
13c20 74 20 63 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a 7a  t char *zOld, *z
13c30 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 63 68 61  New;.        cha
13c40 72 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20 20  r *zBuf, *z;.   
13c50 20 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e       int nOld, n
13c60 2c 20 6e 4c 69 6e 65 20 3d 20 30 2c 20 6e 4e 65  , nLine = 0, nNe
13c70 77 2c 20 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20  w, nBack;.      
13c80 20 20 69 6e 74 20 61 64 64 4c 69 6e 65 4d 61 63    int addLineMac
13c90 72 6f 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  ro;.        char
13ca0 20 7a 4c 69 6e 65 5b 35 30 5d 3b 0a 20 20 20 20   zLine[50];.    
13cb0 20 20 20 20 7a 4e 65 77 20 3d 20 78 3b 0a 20 20      zNew = x;.  
13cc0 20 20 20 20 20 20 69 66 28 20 7a 4e 65 77 5b 30        if( zNew[0
13cd0 5d 3d 3d 27 22 27 20 7c 7c 20 7a 4e 65 77 5b 30  ]=='"' || zNew[0
13ce0 5d 3d 3d 27 7b 27 20 29 20 7a 4e 65 77 2b 2b 3b  ]=='{' ) zNew++;
13cf0 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20  .        nNew = 
13d00 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4e 65 77  lemonStrlen(zNew
13d10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  );.        if( *
13d20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
13d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f   ){.          zO
13d40 6c 64 20 3d 20 2a 70 73 70 2d 3e 64 65 63 6c 61  ld = *psp->decla
13d50 72 67 73 6c 6f 74 3b 0a 20 20 20 20 20 20 20 20  rgslot;.        
13d60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13d70 20 7a 4f 6c 64 20 3d 20 22 22 3b 0a 20 20 20 20   zOld = "";.    
13d80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 4f      }.        nO
13d90 6c 64 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  ld = lemonStrlen
13da0 28 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  (zOld);.        
13db0 6e 20 3d 20 6e 4f 6c 64 20 2b 20 6e 4e 65 77 20  n = nOld + nNew 
13dc0 2b 20 32 30 3b 0a 20 20 20 20 20 20 20 20 61 64  + 20;.        ad
13dd0 64 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 21 70 73  dLineMacro = !ps
13de0 70 2d 3e 67 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73  p->gp->nolinenos
13df0 66 6c 61 67 20 26 26 20 70 73 70 2d 3e 69 6e 73  flag && psp->ins
13e00 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 26 26 0a  ertLineMacro &&.
13e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e20 20 20 20 20 20 20 20 20 28 70 73 70 2d 3e 64 65          (psp->de
13e30 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3d 3d 30 20  cllinenoslot==0 
13e40 7c 7c 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65  || psp->declline
13e50 6e 6f 73 6c 6f 74 5b 30 5d 21 3d 30 29 3b 0a 20  noslot[0]!=0);. 
13e60 20 20 20 20 20 20 20 69 66 28 20 61 64 64 4c 69         if( addLi
13e70 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20 20  neMacro ){.     
13e80 20 20 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d 3e       for(z=psp->
13e90 66 69 6c 65 6e 61 6d 65 2c 20 6e 42 61 63 6b 3d  filename, nBack=
13ea0 30 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20  0; *z; z++){.   
13eb0 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d           if( *z=
13ec0 3d 27 5c 5c 27 20 29 20 6e 42 61 63 6b 2b 2b 3b  ='\\' ) nBack++;
13ed0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
13ee0 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72         lemon_spr
13ef0 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 23 6c 69  intf(zLine, "#li
13f00 6e 65 20 25 64 20 22 2c 20 70 73 70 2d 3e 74 6f  ne %d ", psp->to
13f10 6b 65 6e 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  kenlineno);.    
13f20 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6c 65        nLine = le
13f30 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4c 69 6e 65 29  monStrlen(zLine)
13f40 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 2b 3d  ;.          n +=
13f50 20 6e 4c 69 6e 65 20 2b 20 6c 65 6d 6f 6e 53 74   nLine + lemonSt
13f60 72 6c 65 6e 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rlen(psp->filena
13f70 6d 65 29 20 2b 20 6e 42 61 63 6b 3b 0a 20 20 20  me) + nBack;.   
13f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
13f90 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
13fa0 20 3d 20 28 63 68 61 72 20 2a 29 20 72 65 61 6c   = (char *) real
13fb0 6c 6f 63 28 2a 70 73 70 2d 3e 64 65 63 6c 61 72  loc(*psp->declar
13fc0 67 73 6c 6f 74 2c 20 6e 29 3b 0a 20 20 20 20 20  gslot, n);.     
13fd0 20 20 20 7a 42 75 66 20 3d 20 2a 70 73 70 2d 3e     zBuf = *psp->
13fe0 64 65 63 6c 61 72 67 73 6c 6f 74 20 2b 20 6e 4f  declargslot + nO
13ff0 6c 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ld;.        if( 
14000 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 29 7b 0a  addLineMacro ){.
14010 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f            if( nO
14020 6c 64 20 26 26 20 7a 42 75 66 5b 2d 31 5d 21 3d  ld && zBuf[-1]!=
14030 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\n' ){.        
14040 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20      *(zBuf++) = 
14050 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\n';.          
14060 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
14070 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20  py(zBuf, zLine, 
14080 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  nLine);.        
14090 20 20 7a 42 75 66 20 2b 3d 20 6e 4c 69 6e 65 3b    zBuf += nLine;
140a0 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75  .          *(zBu
140b0 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20 20  f++) = '"';.    
140c0 20 20 20 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d        for(z=psp-
140d0 3e 66 69 6c 65 6e 61 6d 65 3b 20 2a 7a 3b 20 7a  >filename; *z; z
140e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
140f0 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29 7b   if( *z=='\\' ){
14100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
14110 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 5c 27 3b  (zBuf++) = '\\';
14120 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
14130 20 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75             *(zBu
14140 66 2b 2b 29 20 3d 20 2a 7a 3b 0a 20 20 20 20 20  f++) = *z;.     
14150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14160 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27   *(zBuf++) = '"'
14170 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42  ;.          *(zB
14180 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20 20  uf++) = '\n';.  
14190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
141a0 69 66 28 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e  if( psp->decllin
141b0 65 6e 6f 73 6c 6f 74 20 26 26 20 70 73 70 2d 3e  enoslot && psp->
141c0 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30  decllinenoslot[0
141d0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
141e0 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e    psp->decllinen
141f0 6f 73 6c 6f 74 5b 30 5d 20 3d 20 70 73 70 2d 3e  oslot[0] = psp->
14200 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20  tokenlineno;.   
14210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
14220 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4e 65 77  emcpy(zBuf, zNew
14230 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , nNew);.       
14240 20 7a 42 75 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20   zBuf += nNew;. 
14250 20 20 20 20 20 20 20 2a 7a 42 75 66 20 3d 20 30         *zBuf = 0
14260 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
14270 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
14280 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
14290 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
142a0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
142b0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
142c0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
142d0 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
142e0 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 25 25  l argument to %%
142f0 25 73 3a 20 25 73 22 2c 70 73 70 2d 3e 64 65 63  %s: %s",psp->dec
14300 6c 6b 65 79 77 6f 72 64 2c 78 29 3b 0a 20 20 20  lkeyword,x);.   
14310 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
14320 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
14330 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
14340 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
14350 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
14360 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
14370 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41  e WAITING_FOR_FA
14380 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20 20 20 20 20  LLBACK_ID:.     
14390 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
143a0 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
143b0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
143c0 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
143d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
143e0 20 21 49 53 55 50 50 45 52 28 78 5b 30 5d 29 20   !ISUPPER(x[0]) 
143f0 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
14400 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
14410 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
14420 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
14430 25 25 66 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d  %%fallback argum
14440 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c  ent \"%s\" shoul
14450 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78  d be a token", x
14460 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
14470 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
14480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14490 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
144a0 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
144b0 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
144c0 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30  psp->fallback==0
144d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
144e0 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 73 70  p->fallback = sp
144f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
14500 69 66 28 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b  if( sp->fallback
14510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
14520 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
14530 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e  name, psp->token
14540 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
14550 20 20 20 20 22 4d 6f 72 65 20 74 68 61 6e 20 6f      "More than o
14560 6e 65 20 66 61 6c 6c 62 61 63 6b 20 61 73 73 69  ne fallback assi
14570 67 6e 65 64 20 74 6f 20 74 6f 6b 65 6e 20 25 73  gned to token %s
14580 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20  ", x);.         
14590 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
145a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
145b0 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 66  .          sp->f
145c0 61 6c 6c 62 61 63 6b 20 3d 20 70 73 70 2d 3e 66  allback = psp->f
145d0 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  allback;.       
145e0 20 20 20 70 73 70 2d 3e 67 70 2d 3e 68 61 73 5f     psp->gp->has_
145f0 66 61 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  fallback = 1;.  
14600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14610 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14620 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
14630 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 3a 0a 20  R_WILDCARD_ID:. 
14640 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
14650 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  .' ){.        ps
14660 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
14670 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
14680 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
14690 20 69 66 28 20 21 49 53 55 50 50 45 52 28 78 5b   if( !ISUPPER(x[
146a0 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
146b0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
146c0 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65  ename, psp->toke
146d0 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
146e0 20 20 20 22 25 25 77 69 6c 64 63 61 72 64 20 61     "%%wildcard a
146f0 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73  rgument \"%s\" s
14700 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e  hould be a token
14710 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ", x);.        p
14720 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
14730 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14740 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
14750 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ol *sp = Symbol_
14760 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
14770 69 66 28 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c  if( psp->gp->wil
14780 64 63 61 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dcard==0 ){.    
14790 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 77        psp->gp->w
147a0 69 6c 64 63 61 72 64 20 3d 20 73 70 3b 0a 20 20  ildcard = sp;.  
147b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
147c0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
147d0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70  psp->filename, p
147e0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
147f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 45 78  .            "Ex
14800 74 72 61 20 77 69 6c 64 63 61 72 64 20 74 6f 20  tra wildcard to 
14810 74 6f 6b 65 6e 3a 20 25 73 22 2c 20 78 29 3b 0a  token: %s", x);.
14820 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
14830 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
14840 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14850 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
14860 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43  se WAITING_FOR_C
14870 4c 41 53 53 5f 49 44 3a 0a 20 20 20 20 20 20 69  LASS_ID:.      i
14880 66 28 20 21 49 53 4c 4f 57 45 52 28 78 5b 30 5d  f( !ISLOWER(x[0]
14890 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ) ){.        Err
148a0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
148b0 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ame, psp->tokenl
148c0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
148d0 20 22 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20   "%%token_class 
148e0 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64  must be followed
148f0 20 62 79 20 61 6e 20 69 64 65 6e 74 69 66 69 65   by an identifie
14900 72 3a 20 22 2c 20 78 29 3b 0a 20 20 20 20 20 20  r: ", x);.      
14910 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
14920 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
14930 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
14940 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
14950 0a 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  .     }else if( 
14960 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 20 29  Symbol_find(x) )
14970 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
14980 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
14990 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  , psp->tokenline
149a0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53  no,.          "S
149b0 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 61 6c 72  ymbol \"%s\" alr
149c0 65 61 64 79 20 75 73 65 64 22 2c 20 78 29 3b 0a  eady used", x);.
149d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
149e0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
149f0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
14a00 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
14a10 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
14a20 73 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  se{.        psp-
14a30 3e 74 6b 63 6c 61 73 73 20 3d 20 53 79 6d 62 6f  >tkclass = Symbo
14a40 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
14a50 20 20 70 73 70 2d 3e 74 6b 63 6c 61 73 73 2d 3e    psp->tkclass->
14a60 74 79 70 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d  type = MULTITERM
14a70 49 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 70 73  INAL;.        ps
14a80 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
14a90 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b  NG_FOR_CLASS_TOK
14aa0 45 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EN;.      }.    
14ab0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
14ac0 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c  e WAITING_FOR_CL
14ad0 41 53 53 5f 54 4f 4b 45 4e 3a 0a 20 20 20 20 20  ASS_TOKEN:.     
14ae0 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
14af0 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
14b00 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
14b10 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
14b20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
14b30 20 49 53 55 50 50 45 52 28 78 5b 30 5d 29 20 7c   ISUPPER(x[0]) |
14b40 7c 20 28 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c  | ((x[0]=='|' ||
14b50 20 78 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20 49   x[0]=='/') && I
14b60 53 55 50 50 45 52 28 78 5b 31 5d 29 29 20 29 7b  SUPPER(x[1])) ){
14b70 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
14b80 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73  symbol *msp = ps
14b90 70 2d 3e 74 6b 63 6c 61 73 73 3b 0a 20 20 20 20  p->tkclass;.    
14ba0 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d      msp->nsubsym
14bb0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d  ++;.        msp-
14bc0 3e 73 75 62 73 79 6d 20 3d 20 28 73 74 72 75 63  >subsym = (struc
14bd0 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61  t symbol **) rea
14be0 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d  lloc(msp->subsym
14bf0 2c 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a 65  ,.          size
14c00 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
14c10 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29  *)*msp->nsubsym)
14c20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 49  ;.        if( !I
14c30 53 55 50 50 45 52 28 78 5b 30 5d 29 20 29 20 78  SUPPER(x[0]) ) x
14c40 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d  ++;.        msp-
14c50 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75  >subsym[msp->nsu
14c60 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c  bsym-1] = Symbol
14c70 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 7d  _new(x);.      }
14c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
14c90 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
14ca0 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e  name, psp->token
14cb0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
14cc0 20 20 22 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73    "%%token_class
14cd0 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22   argument \"%s\"
14ce0 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b   should be a tok
14cf0 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  en", x);.       
14d00 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
14d10 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
14d20 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
14d30 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a  TER_DECL_ERROR;.
14d40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
14d50 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45  eak;.    case RE
14d60 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
14d70 45 52 52 4f 52 3a 0a 2f 2a 20 20 20 20 20 20 69  ERROR:./*      i
14d80 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70  f( x[0]=='.' ) p
14d90 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
14da0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
14db0 52 55 4c 45 3b 0a 2a 2a 20 20 20 20 20 20 62 72  RULE;.**      br
14dc0 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65  eak; */.    case
14dd0 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
14de0 43 4c 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  CL_ERROR:.      
14df0 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20  if( x[0]=='.' ) 
14e00 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
14e10 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
14e20 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 69 66 28  _RULE;.      if(
14e30 20 78 5b 30 5d 3d 3d 27 25 27 20 29 20 70 73 70   x[0]=='%' ) psp
14e40 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
14e50 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f  G_FOR_DECL_KEYWO
14e60 52 44 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  RD;.      break;
14e70 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 74  .  }.}../* Run t
14e80 68 65 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20  he preprocessor 
14e90 6f 76 65 72 20 74 68 65 20 69 6e 70 75 74 20 66  over the input f
14ea0 69 6c 65 20 74 65 78 74 2e 20 20 54 68 65 20 67  ile text.  The g
14eb0 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 0a  lobal variables.
14ec0 2a 2a 20 61 7a 44 65 66 69 6e 65 5b 30 5d 20 74  ** azDefine[0] t
14ed0 68 72 6f 75 67 68 20 61 7a 44 65 66 69 6e 65 5b  hrough azDefine[
14ee0 6e 44 65 66 69 6e 65 2d 31 5d 20 63 6f 6e 74 61  nDefine-1] conta
14ef0 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ins the names of
14f00 20 61 6c 6c 20 64 65 66 69 6e 65 64 0a 2a 2a 20   all defined.** 
14f10 6d 61 63 72 6f 73 2e 20 20 54 68 69 73 20 72 6f  macros.  This ro
14f20 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20  utine looks for 
14f30 22 25 69 66 64 65 66 22 20 61 6e 64 20 22 25 69  "%ifdef" and "%i
14f40 66 6e 64 65 66 22 20 61 6e 64 20 22 25 65 6e 64  fndef" and "%end
14f50 69 66 22 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d 65  if" and.** comme
14f60 6e 74 73 20 74 68 65 6d 20 6f 75 74 2e 20 20 54  nts them out.  T
14f70 65 78 74 20 69 6e 20 62 65 74 77 65 65 6e 20 69  ext in between i
14f80 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64  s also commented
14f90 20 6f 75 74 20 61 73 20 61 70 70 72 6f 70 72 69   out as appropri
14fa0 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ate..*/.static v
14fb0 6f 69 64 20 70 72 65 70 72 6f 63 65 73 73 5f 69  oid preprocess_i
14fc0 6e 70 75 74 28 63 68 61 72 20 2a 7a 29 7b 0a 20  nput(char *z){. 
14fd0 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b   int i, j, k, n;
14fe0 0a 20 20 69 6e 74 20 65 78 63 6c 75 64 65 20 3d  .  int exclude =
14ff0 20 30 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20   0;.  int start 
15000 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e  = 0;.  int linen
15010 6f 20 3d 20 31 3b 0a 20 20 69 6e 74 20 73 74 61  o = 1;.  int sta
15020 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20  rt_lineno = 1;. 
15030 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20   for(i=0; z[i]; 
15040 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  i++){.    if( z[
15050 69 5d 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e  i]=='\n' ) linen
15060 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69  o++;.    if( z[i
15070 5d 21 3d 27 25 27 20 7c 7c 20 28 69 3e 30 20 26  ]!='%' || (i>0 &
15080 26 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29 20  & z[i-1]!='\n') 
15090 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
150a0 69 66 28 20 73 74 72 6e 63 6d 70 28 26 7a 5b 69  if( strncmp(&z[i
150b0 5d 2c 22 25 65 6e 64 69 66 22 2c 36 29 3d 3d 30  ],"%endif",6)==0
150c0 20 26 26 20 49 53 53 50 41 43 45 28 7a 5b 69 2b   && ISSPACE(z[i+
150d0 36 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  6]) ){.      if(
150e0 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20   exclude ){.    
150f0 20 20 20 20 65 78 63 6c 75 64 65 2d 2d 3b 0a 20      exclude--;. 
15100 20 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75         if( exclu
15110 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  de==0 ){.       
15120 20 20 20 66 6f 72 28 6a 3d 73 74 61 72 74 3b 20     for(j=start; 
15130 6a 3c 69 3b 20 6a 2b 2b 29 20 69 66 28 20 7a 5b  j<i; j++) if( z[
15140 6a 5d 21 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d 20  j]!='\n' ) z[j] 
15150 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d  = ' ';.        }
15160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
15170 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20  or(j=i; z[j] && 
15180 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29  z[j]!='\n'; j++)
15190 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20   z[j] = ' ';.   
151a0 20 7d 65 6c 73 65 20 69 66 28 20 28 73 74 72 6e   }else if( (strn
151b0 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 64 65  cmp(&z[i],"%ifde
151c0 66 22 2c 36 29 3d 3d 30 20 26 26 20 49 53 53 50  f",6)==0 && ISSP
151d0 41 43 45 28 7a 5b 69 2b 36 5d 29 29 0a 20 20 20  ACE(z[i+6])).   
151e0 20 20 20 20 20 20 20 7c 7c 20 28 73 74 72 6e 63         || (strnc
151f0 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 6e 64 65  mp(&z[i],"%ifnde
15200 66 22 2c 37 29 3d 3d 30 20 26 26 20 49 53 53 50  f",7)==0 && ISSP
15210 41 43 45 28 7a 5b 69 2b 37 5d 29 29 20 29 7b 0a  ACE(z[i+7])) ){.
15220 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64        if( exclud
15230 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78 63  e ){.        exc
15240 6c 75 64 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  lude++;.      }e
15250 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
15260 28 6a 3d 69 2b 37 3b 20 49 53 53 50 41 43 45 28  (j=i+7; ISSPACE(
15270 7a 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  z[j]); j++){}.  
15280 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a        for(n=0; z
15290 5b 6a 2b 6e 5d 20 26 26 20 21 49 53 53 50 41 43  [j+n] && !ISSPAC
152a0 45 28 7a 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b  E(z[j+n]); n++){
152b0 7d 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64  }.        exclud
152c0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66  e = 1;.        f
152d0 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69 6e  or(k=0; k<nDefin
152e0 65 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; k++){.       
152f0 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61     if( strncmp(a
15300 7a 44 65 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d  zDefine[k],&z[j]
15310 2c 6e 29 3d 3d 30 20 26 26 20 6c 65 6d 6f 6e 53  ,n)==0 && lemonS
15320 74 72 6c 65 6e 28 61 7a 44 65 66 69 6e 65 5b 6b  trlen(azDefine[k
15330 5d 29 3d 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20  ])==n ){.       
15340 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d 20 30       exclude = 0
15350 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
15360 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
15370 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15380 20 20 20 69 66 28 20 7a 5b 69 2b 33 5d 3d 3d 27     if( z[i+3]=='
15390 6e 27 20 29 20 65 78 63 6c 75 64 65 20 3d 20 21  n' ) exclude = !
153a0 65 78 63 6c 75 64 65 3b 0a 20 20 20 20 20 20 20  exclude;.       
153b0 20 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a   if( exclude ){.
153c0 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 20            start 
153d0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = i;.          s
153e0 74 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 6c 69  tart_lineno = li
153f0 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  neno;.        }.
15400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
15410 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a  r(j=i; z[j] && z
15420 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20  [j]!='\n'; j++) 
15430 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  z[j] = ' ';.    
15440 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 78 63 6c  }.  }.  if( excl
15450 75 64 65 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ude ){.    fprin
15460 74 66 28 73 74 64 65 72 72 2c 22 75 6e 74 65 72  tf(stderr,"unter
15470 6d 69 6e 61 74 65 64 20 25 25 69 66 64 65 66 20  minated %%ifdef 
15480 73 74 61 72 74 69 6e 67 20 6f 6e 20 6c 69 6e 65  starting on line
15490 20 25 64 5c 6e 22 2c 20 73 74 61 72 74 5f 6c 69   %d\n", start_li
154a0 6e 65 6e 6f 29 3b 0a 20 20 20 20 65 78 69 74 28  neno);.    exit(
154b0 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e  1);.  }.}../* In
154c0 20 73 70 69 74 65 20 6f 66 20 69 74 73 20 6e 61   spite of its na
154d0 6d 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  me, this functio
154e0 6e 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63  n is really a sc
154f0 61 6e 6e 65 72 2e 20 20 49 74 20 72 65 61 64 0a  anner.  It read.
15500 2a 2a 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65  ** in the entire
15510 20 69 6e 70 75 74 20 66 69 6c 65 20 28 61 6c 6c   input file (all
15520 20 61 74 20 6f 6e 63 65 29 20 74 68 65 6e 20 74   at once) then t
15530 6f 6b 65 6e 69 7a 65 73 20 69 74 2e 20 20 45 61  okenizes it.  Ea
15540 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69 73 20 70  ch.** token is p
15550 61 73 73 65 64 20 74 6f 20 74 68 65 20 66 75 6e  assed to the fun
15560 63 74 69 6f 6e 20 22 70 61 72 73 65 6f 6e 65 74  ction "parseonet
15570 6f 6b 65 6e 22 20 77 68 69 63 68 20 62 75 69 6c  oken" which buil
15580 64 73 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 61 70  ds all.** the ap
15590 70 72 6f 70 72 69 61 74 65 20 64 61 74 61 20 73  propriate data s
155a0 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
155b0 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65   global state ve
155c0 63 74 6f 72 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f  ctor "gp"..*/.vo
155d0 69 64 20 50 61 72 73 65 28 73 74 72 75 63 74 20  id Parse(struct 
155e0 6c 65 6d 6f 6e 20 2a 67 70 29 0a 7b 0a 20 20 73  lemon *gp).{.  s
155f0 74 72 75 63 74 20 70 73 74 61 74 65 20 70 73 3b  truct pstate ps;
15600 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63  .  FILE *fp;.  c
15610 68 61 72 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20  har *filebuf;.  
15620 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 69 6c  unsigned int fil
15630 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e  esize;.  int lin
15640 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  eno;.  int c;.  
15650 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63  char *cp, *nextc
15660 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69  p;.  int startli
15670 6e 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65  ne = 0;..  memse
15680 74 28 26 70 73 2c 20 27 5c 30 27 2c 20 73 69 7a  t(&ps, '\0', siz
15690 65 6f 66 28 70 73 29 29 3b 0a 20 20 70 73 2e 67  eof(ps));.  ps.g
156a0 70 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c  p = gp;.  ps.fil
156b0 65 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65  ename = gp->file
156c0 6e 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72  name;.  ps.error
156d0 63 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74  cnt = 0;.  ps.st
156e0 61 74 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45  ate = INITIALIZE
156f0 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
15700 20 72 65 61 64 69 6e 67 20 74 68 65 20 69 6e 70   reading the inp
15710 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20  ut file */.  fp 
15720 3d 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e  = fopen(ps.filen
15730 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28  ame,"rb");.  if(
15740 20 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72   fp==0 ){.    Er
15750 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
15760 6d 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e  me,0,"Can't open
15770 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 72   this file for r
15780 65 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67  eading.");.    g
15790 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
157a0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
157b0 20 66 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a   fseek(fp,0,2);.
157c0 20 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74 65    filesize = fte
157d0 6c 6c 28 66 70 29 3b 0a 20 20 72 65 77 69 6e 64  ll(fp);.  rewind
157e0 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 20  (fp);.  filebuf 
157f0 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63  = (char *)malloc
15800 28 20 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a  ( filesize+1 );.
15810 20 20 69 66 28 20 66 69 6c 65 73 69 7a 65 3e 31    if( filesize>1
15820 30 30 30 30 30 30 30 30 20 7c 7c 20 66 69 6c 65  00000000 || file
15830 62 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72  buf==0 ){.    Er
15840 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
15850 6d 65 2c 30 2c 22 49 6e 70 75 74 20 66 69 6c 65  me,0,"Input file
15860 20 74 6f 6f 20 6c 61 72 67 65 2e 22 29 3b 0a 20   too large.");. 
15870 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b     gp->errorcnt+
15880 2b 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70  +;.    fclose(fp
15890 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
158a0 20 7d 0a 20 20 69 66 28 20 66 72 65 61 64 28 66   }.  if( fread(f
158b0 69 6c 65 62 75 66 2c 31 2c 66 69 6c 65 73 69 7a  ilebuf,1,filesiz
158c0 65 2c 66 70 29 21 3d 66 69 6c 65 73 69 7a 65 20  e,fp)!=filesize 
158d0 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28  ){.    ErrorMsg(
158e0 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43  ps.filename,0,"C
158f0 61 6e 27 74 20 72 65 61 64 20 69 6e 20 61 6c 6c  an't read in all
15900 20 25 64 20 62 79 74 65 73 20 6f 66 20 74 68 69   %d bytes of thi
15910 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20  s file.",.      
15920 66 69 6c 65 73 69 7a 65 29 3b 0a 20 20 20 20 66  filesize);.    f
15930 72 65 65 28 66 69 6c 65 62 75 66 29 3b 0a 20 20  ree(filebuf);.  
15940 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b    gp->errorcnt++
15950 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29  ;.    fclose(fp)
15960 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
15970 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a  }.  fclose(fp);.
15980 20 20 66 69 6c 65 62 75 66 5b 66 69 6c 65 73 69    filebuf[filesi
15990 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d  ze] = 0;..  /* M
159a0 61 6b 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 70  ake an initial p
159b0 61 73 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ass through the 
159c0 66 69 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 25  file to handle %
159d0 69 66 64 65 66 20 61 6e 64 20 25 69 66 6e 64 65  ifdef and %ifnde
159e0 66 20 2a 2f 0a 20 20 70 72 65 70 72 6f 63 65 73  f */.  preproces
159f0 73 5f 69 6e 70 75 74 28 66 69 6c 65 62 75 66 29  s_input(filebuf)
15a00 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e  ;..  /* Now scan
15a10 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
15a20 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
15a30 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66   lineno = 1;.  f
15a40 6f 72 28 63 70 3d 66 69 6c 65 62 75 66 3b 20 28  or(cp=filebuf; (
15a50 63 3d 20 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20  c= *cp)!=0; ){. 
15a60 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
15a70 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20   lineno++;      
15a80 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 65 70 20          /* Keep 
15a90 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e  track of the lin
15aa0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
15ab0 69 66 28 20 49 53 53 50 41 43 45 28 63 29 20 29  if( ISSPACE(c) )
15ac0 7b 20 63 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65  { cp++; continue
15ad0 3b 20 7d 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c  ; }  /* Skip all
15ae0 20 77 68 69 74 65 20 73 70 61 63 65 20 2a 2f 0a   white space */.
15af0 20 20 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26      if( c=='/' &
15b00 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20  & cp[1]=='/' ){ 
15b10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70           /* Skip
15b20 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65   C++ style comme
15b30 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  nts */.      cp+
15b40 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  =2;.      while(
15b50 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
15b60 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a  c!='\n' ) cp++;.
15b70 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
15b80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d      }.    if( c=
15b90 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
15ba0 2a 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  *' ){          /
15bb0 2a 20 53 6b 69 70 20 43 20 73 74 79 6c 65 20 63  * Skip C style c
15bc0 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  omments */.     
15bd0 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68   cp+=2;.      wh
15be0 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
15bf0 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63   && (c!='/' || c
15c00 70 5b 2d 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20  p[-1]!='*') ){. 
15c10 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
15c20 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n' ) lineno++;. 
15c30 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20         cp++;.   
15c40 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
15c50 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63   ) cp++;.      c
15c60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
15c70 20 20 20 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74     ps.tokenstart
15c80 20 3d 20 63 70 3b 20 20 20 20 20 20 20 20 20 20   = cp;          
15c90 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68        /* Mark th
15ca0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
15cb0 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  he token */.    
15cc0 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d  ps.tokenlineno =
15cd0 20 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20   lineno;        
15ce0 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72     /* Linenumber
15cf0 20 6f 6e 20 77 68 69 63 68 20 74 6f 6b 65 6e 20   on which token 
15d00 62 65 67 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66  begins */.    if
15d10 28 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20  ( c=='\"' ){    
15d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d30 20 2f 2a 20 53 74 72 69 6e 67 20 6c 69 74 65 72   /* String liter
15d40 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  als */.      cp+
15d50 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  +;.      while( 
15d60 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63  (c= *cp)!=0 && c
15d70 21 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20  !='\"' ){.      
15d80 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
15d90 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
15da0 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a    cp++;.      }.
15db0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
15dc0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
15dd0 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73  sg(ps.filename,s
15de0 74 61 72 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e  tartline,."Strin
15df0 67 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68  g starting on th
15e00 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
15e10 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65  erminated before
15e20 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
15e30 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  file.");.       
15e40 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a   ps.errorcnt++;.
15e50 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d          nextcp =
15e60 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   cp;.      }else
15e70 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  {.        nextcp
15e80 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d   = cp+1;.      }
15e90 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
15ea0 3d 3d 27 7b 27 20 29 7b 20 20 20 20 20 20 20 20  =='{' ){        
15eb0 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63         /* A bloc
15ec0 6b 20 6f 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20  k of C code */. 
15ed0 20 20 20 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a       int level;.
15ee0 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
15ef0 20 20 66 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28    for(level=1; (
15f00 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 6c  c= *cp)!=0 && (l
15f10 65 76 65 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27  evel>1 || c!='}'
15f20 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ); cp++){.      
15f30 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
15f40 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
15f50 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b    else if( c=='{
15f60 27 20 29 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20  ' ) level++;.   
15f70 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d       else if( c=
15f80 3d 27 7d 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a  ='}' ) level--;.
15f90 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
15fa0 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
15fb0 3d 3d 27 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69  =='*' ){  /* Ski
15fc0 70 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20  p comments */.  
15fd0 20 20 20 20 20 20 20 20 69 6e 74 20 70 72 65 76          int prev
15fe0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 63 70 20  c;.          cp 
15ff0 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20  = &cp[2];.      
16000 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20      prevc = 0;. 
16010 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
16020 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  (c= *cp)!=0 && (
16030 63 21 3d 27 2f 27 20 7c 7c 20 70 72 65 76 63 21  c!='/' || prevc!
16040 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='*') ){.       
16050 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
16060 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20   ) lineno++;.   
16070 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d           prevc =
16080 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   c;.            
16090 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  cp++;.          
160a0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
160b0 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70  if( c=='/' && cp
160c0 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20  [1]=='/' ){  /* 
160d0 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63  Skip C++ style c
160e0 6f 6d 6d 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20  omments too */. 
160f0 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26 63           cp = &c
16100 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  p[2];.          
16110 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
16120 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20  =0 && c!='\n' ) 
16130 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  cp++;.          
16140 69 66 28 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b  if( c ) lineno++
16150 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
16160 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63  if( c=='\'' || c
16170 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20  =='\"' ){    /* 
16180 53 74 72 69 6e 67 20 61 20 63 68 61 72 61 63 74  String a charact
16190 65 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20  er literals */. 
161a0 20 20 20 20 20 20 20 20 20 69 6e 74 20 73 74 61           int sta
161b0 72 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a 20  rtchar, prevc;. 
161c0 20 20 20 20 20 20 20 20 20 73 74 61 72 74 63 68           startch
161d0 61 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  ar = c;.        
161e0 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20    prevc = 0;.   
161f0 20 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b         for(cp++;
16200 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
16210 28 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c 7c  (c!=startchar ||
16220 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63   prevc=='\\'); c
16230 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  p++){.          
16240 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
16250 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
16260 20 20 20 20 20 20 69 66 28 20 70 72 65 76 63 3d        if( prevc=
16270 3d 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d 20  ='\\' ) prevc = 
16280 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  0;.            e
16290 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
162a0 20 70 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20   prevc = c;.    
162b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
162c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
162d0 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
162e0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e      ErrorMsg(ps.
162f0 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b 65  filename,ps.toke
16300 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64 65  nlineno,."C code
16310 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69   starting on thi
16320 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65  s line is not te
16330 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20  rminated before 
16340 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
16350 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ile.");.        
16360 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  ps.errorcnt++;. 
16370 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20         nextcp = 
16380 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  cp;.      }else{
16390 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20  .        nextcp 
163a0 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a  = cp+1;.      }.
163b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53      }else if( IS
163c0 41 4c 4e 55 4d 28 63 29 20 29 7b 20 20 20 20 20  ALNUM(c) ){     
163d0 20 20 20 20 20 2f 2a 20 49 64 65 6e 74 69 66 69       /* Identifi
163e0 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ers */.      whi
163f0 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
16400 26 26 20 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c  && (ISALNUM(c) |
16410 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b  | c=='_') ) cp++
16420 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
16430 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   cp;.    }else i
16440 66 28 20 63 3d 3d 27 3a 27 20 26 26 20 63 70 5b  f( c==':' && cp[
16450 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70 5b 32 5d  1]==':' && cp[2]
16460 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54 68 65 20  =='=' ){ /* The 
16470 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d 22 20 2a  operator "::=" *
16480 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 33 3b  /.      cp += 3;
16490 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20  .      nextcp = 
164a0 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  cp;.    }else if
164b0 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d  ( (c=='/' || c==
164c0 27 7c 27 29 20 26 26 20 49 53 41 4c 50 48 41 28  '|') && ISALPHA(
164d0 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  cp[1]) ){.      
164e0 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77  cp += 2;.      w
164f0 68 69 6c 65 28 20 28 63 20 3d 20 2a 63 70 29 21  hile( (c = *cp)!
16500 3d 30 20 26 26 20 28 49 53 41 4c 4e 55 4d 28 63  =0 && (ISALNUM(c
16510 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63  ) || c=='_') ) c
16520 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  p++;.      nextc
16530 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73  p = cp;.    }els
16540 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
16550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
16560 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20 63 68  ll other (one ch
16570 61 72 61 63 74 65 72 29 20 6f 70 65 72 61 74 6f  aracter) operato
16580 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b  rs */.      cp++
16590 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
165a0 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63   cp;.    }.    c
165b0 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20   = *cp;.    *cp 
165c0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
165d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
165e0 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ull terminate th
165f0 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70  e token */.    p
16600 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26 70 73  arseonetoken(&ps
16610 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
16620 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f 6b 65  * Parse the toke
16630 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d 20 28  n */.    *cp = (
16640 63 68 61 72 29 63 3b 20 20 20 20 20 20 20 20 20  char)c;         
16650 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
16660 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20 2a  ore the buffer *
16670 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78 74 63  /.    cp = nextc
16680 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 66 69  p;.  }.  free(fi
16690 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20 20 20  lebuf);         
166a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
166b0 6c 65 61 73 65 20 74 68 65 20 62 75 66 66 65 72  lease the buffer
166c0 20 61 66 74 65 72 20 70 61 72 73 69 6e 67 20 2a   after parsing *
166d0 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d 20 70  /.  gp->rule = p
166e0 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20 20 67  s.firstrule;.  g
166f0 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20 70 73  p->errorcnt = ps
16700 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a  .errorcnt;.}./**
16710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16720 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
16730 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 63  he file "plink.c
16740 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
16750 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52  *******/./*.** R
16760 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69  outines processi
16770 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ng configuration
16780 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70   follow-set prop
16790 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a  agation links.**
167a0 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
167b0 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
167c0 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
167d0 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72   plink *plink_fr
167e0 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20  eelist = 0;../* 
167f0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
16800 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74 20 70  link */.struct p
16810 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28  link *Plink_new(
16820 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  ){.  struct plin
16830 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 0a 20 20 69  k *newlink;..  i
16840 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  f( plink_freelis
16850 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t==0 ){.    int 
16860 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d  i;.    int amt =
16870 20 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f   100;.    plink_
16880 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75  freelist = (stru
16890 63 74 20 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c 6f  ct plink *)callo
168a0 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73  c( amt, sizeof(s
168b0 74 72 75 63 74 20 70 6c 69 6e 6b 29 20 29 3b 0a  truct plink) );.
168c0 20 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72      if( plink_fr
168d0 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
168e0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
168f0 72 2c 0a 20 20 20 20 20 20 22 55 6e 61 62 6c 65  r,.      "Unable
16900 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
16910 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 66 6f  ory for a new fo
16920 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
16930 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a  tion link.\n");.
16940 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
16950 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
16960 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20  ; i<amt-1; i++) 
16970 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69  plink_freelist[i
16980 5d 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f  ].next = &plink_
16990 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20  freelist[i+1];. 
169a0 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73     plink_freelis
169b0 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20  t[amt-1].next = 
169c0 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 6c 69 6e 6b  0;.  }.  newlink
169d0 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73   = plink_freelis
169e0 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  t;.  plink_freel
169f0 69 73 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65  ist = plink_free
16a00 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65  list->next;.  re
16a10 74 75 72 6e 20 6e 65 77 6c 69 6e 6b 3b 0a 7d 0a  turn newlink;.}.
16a20 0a 2f 2a 20 41 64 64 20 61 20 70 6c 69 6e 6b 20  ./* Add a plink 
16a30 74 6f 20 61 20 70 6c 69 6e 6b 20 6c 69 73 74 20  to a plink list 
16a40 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64  */.void Plink_ad
16a50 64 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  d(struct plink *
16a60 2a 70 6c 70 70 2c 20 73 74 72 75 63 74 20 63 6f  *plpp, struct co
16a70 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73  nfig *cfp).{.  s
16a80 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77  truct plink *new
16a90 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b 20  link;.  newlink 
16aa0 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b 0a 20  = Plink_new();. 
16ab0 20 6e 65 77 6c 69 6e 6b 2d 3e 6e 65 78 74 20 3d   newlink->next =
16ac0 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70 70 20   *plpp;.  *plpp 
16ad0 3d 20 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77  = newlink;.  new
16ae0 6c 69 6e 6b 2d 3e 63 66 70 20 3d 20 63 66 70 3b  link->cfp = cfp;
16af0 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66 65 72 20  .}../* Transfer 
16b00 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74  every plink on t
16b10 68 65 20 6c 69 73 74 20 22 66 72 6f 6d 22 20 74  he list "from" t
16b20 6f 20 74 68 65 20 6c 69 73 74 20 22 74 6f 22 20  o the list "to" 
16b30 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f  */.void Plink_co
16b40 70 79 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  py(struct plink 
16b50 2a 2a 74 6f 2c 20 73 74 72 75 63 74 20 70 6c 69  **to, struct pli
16b60 6e 6b 20 2a 66 72 6f 6d 29 0a 7b 0a 20 20 73 74  nk *from).{.  st
16b70 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74  ruct plink *next
16b80 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66 72 6f  pl;.  while( fro
16b90 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20  m ){.    nextpl 
16ba0 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a 20 20  = from->next;.  
16bb0 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d 20 2a    from->next = *
16bc0 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20 66 72  to;.    *to = fr
16bd0 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d 20 6e  om;.    from = n
16be0 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  extpl;.  }.}../*
16bf0 20 44 65 6c 65 74 65 20 65 76 65 72 79 20 70 6c   Delete every pl
16c00 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ink on the list 
16c10 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64 65  */.void Plink_de
16c20 6c 65 74 65 28 73 74 72 75 63 74 20 70 6c 69 6e  lete(struct plin
16c30 6b 20 2a 70 6c 70 29 0a 7b 0a 20 20 73 74 72 75  k *plp).{.  stru
16c40 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c  ct plink *nextpl
16c50 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20  ;..  while( plp 
16c60 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d 20  ){.    nextpl = 
16c70 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 70  plp->next;.    p
16c80 6c 70 2d 3e 6e 65 78 74 20 3d 20 70 6c 69 6e 6b  lp->next = plink
16c90 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70  _freelist;.    p
16ca0 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20  link_freelist = 
16cb0 70 6c 70 3b 0a 20 20 20 20 70 6c 70 20 3d 20 6e  plp;.    plp = n
16cc0 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a  extpl;.  }.}./**
16cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ce0 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
16cf0 69 6c 65 20 22 72 65 70 6f 72 74 2e 63 22 20 2a  ile "report.c" *
16d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
16d20 20 50 72 6f 63 65 64 75 72 65 73 20 66 6f 72 20   Procedures for 
16d30 67 65 6e 65 72 61 74 69 6e 67 20 72 65 70 6f 72  generating repor
16d40 74 73 20 61 6e 64 20 74 61 62 6c 65 73 20 69 6e  ts and tables in
16d50 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
16d60 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
16d70 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 66  ./* Generate a f
16d80 69 6c 65 6e 61 6d 65 20 77 69 74 68 20 74 68 65  ilename with the
16d90 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e 20 20   given suffix.  
16da0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
16db0 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65 73 20  e.** name comes 
16dc0 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
16dd0 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
16de0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
16df0 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 50  * function..*/.P
16e00 52 49 56 41 54 45 20 63 68 61 72 20 2a 66 69 6c  RIVATE char *fil
16e10 65 5f 6d 61 6b 65 6e 61 6d 65 28 73 74 72 75 63  e_makename(struc
16e20 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63  t lemon *lemp, c
16e30 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66 66 69  onst char *suffi
16e40 78 29 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d  x).{.  char *nam
16e50 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a  e;.  char *cp;..
16e60 20 20 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29    name = (char*)
16e70 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72  malloc( lemonStr
16e80 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  len(lemp->filena
16e90 6d 65 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65  me) + lemonStrle
16ea0 6e 28 73 75 66 66 69 78 29 20 2b 20 35 20 29 3b  n(suffix) + 5 );
16eb0 0a 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29  .  if( name==0 )
16ec0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
16ed0 64 65 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f  derr,"Can't allo
16ee0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61  cate space for a
16ef0 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a   filename.\n");.
16f00 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
16f10 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28  .  lemon_strcpy(
16f20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  name,lemp->filen
16f30 61 6d 65 29 3b 0a 20 20 63 70 20 3d 20 73 74 72  ame);.  cp = str
16f40 72 63 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a  rchr(name,'.');.
16f50 20 20 69 66 28 20 63 70 20 29 20 2a 63 70 20 3d    if( cp ) *cp =
16f60 20 30 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63   0;.  lemon_strc
16f70 61 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b  at(name,suffix);
16f80 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a  .  return name;.
16f90 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c  }../* Open a fil
16fa0 65 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62 61  e with a name ba
16fb0 73 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20  sed on the name 
16fc0 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
16fd0 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20 61  e,.** but with a
16fe0 20 64 69 66 66 65 72 65 6e 74 20 28 73 70 65 63   different (spec
16ff0 69 66 69 65 64 29 20 73 75 66 66 69 78 2c 20 61  ified) suffix, a
17000 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
17010 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  ter.** to the st
17020 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20  ream */.PRIVATE 
17030 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28  FILE *file_open(
17040 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
17050 2a 6c 65 6d 70 2c 0a 20 20 63 6f 6e 73 74 20 63  *lemp,.  const c
17060 68 61 72 20 2a 73 75 66 66 69 78 2c 0a 20 20 63  har *suffix,.  c
17070 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 0a  onst char *mode.
17080 29 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a  ){.  FILE *fp;..
17090 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e    if( lemp->outn
170a0 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d 70 2d  ame ) free(lemp-
170b0 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d  >outname);.  lem
170c0 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c  p->outname = fil
170d0 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c  e_makename(lemp,
170e0 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70 20 3d   suffix);.  fp =
170f0 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74   fopen(lemp->out
17100 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66  name,mode);.  if
17110 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65  ( fp==0 && *mode
17120 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66 70 72  =='w' ){.    fpr
17130 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
17140 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25  't open file \"%
17150 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75  s\".\n",lemp->ou
17160 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70  tname);.    lemp
17170 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
17180 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
17190 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a    return fp;.}..
171a0 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68 65  /* Duplicate the
171b0 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69 74 68   input file with
171c0 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64  out comments and
171d0 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e 73   without actions
171e0 20 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f   .** on rules */
171f0 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73 74  .void Reprint(st
17200 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
17210 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ).{.  struct rul
17220 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20  e *rp;.  struct 
17230 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e  symbol *sp;.  in
17240 74 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20  t i, j, maxlen, 
17250 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73  len, ncolumns, s
17260 6b 69 70 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f  kip;.  printf("/
17270 2f 20 52 65 70 72 69 6e 74 20 6f 66 20 69 6e 70  / Reprint of inp
17280 75 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c  ut file \"%s\".\
17290 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c  n// Symbols:\n",
172a0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
172b0 0a 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a  .  maxlen = 10;.
172c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
172d0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
172e0 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d  {.    sp = lemp-
172f0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
17300 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c   len = lemonStrl
17310 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  en(sp->name);.  
17320 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e    if( len>maxlen
17330 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b   ) maxlen = len;
17340 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20  .  }.  ncolumns 
17350 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b  = 76/(maxlen+5);
17360 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c  .  if( ncolumns<
17370 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31  1 ) ncolumns = 1
17380 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70  ;.  skip = (lemp
17390 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c  ->nsymbol + ncol
173a0 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d  umns - 1)/ncolum
173b0 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ns;.  for(i=0; i
173c0 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  <skip; i++){.   
173d0 20 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20   printf("//");. 
173e0 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65     for(j=i; j<le
173f0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d  mp->nsymbol; j+=
17400 73 6b 69 70 29 7b 0a 20 20 20 20 20 20 73 70 20  skip){.      sp 
17410 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
17420 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  j];.      assert
17430 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29  ( sp->index==j )
17440 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  ;.      printf("
17450 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d   %3d %-*.*s",j,m
17460 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d  axlen,maxlen,sp-
17470 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  >name);.    }.  
17480 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a    printf("\n");.
17490 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d    }.  for(rp=lem
174a0 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
174b0 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 70  rp->next){.    p
174c0 72 69 6e 74 66 28 22 25 73 22 2c 72 70 2d 3e 6c  rintf("%s",rp->l
174d0 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f  hs->name);.    /
174e0 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73  *    if( rp->lhs
174f0 61 6c 69 61 73 20 29 20 70 72 69 6e 74 66 28 22  alias ) printf("
17500 28 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69  (%s)",rp->lhsali
17510 61 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e  as); */.    prin
17520 74 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20  tf(" ::=");.    
17530 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
17540 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
17550 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d   sp = rp->rhs[i]
17560 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e  ;.      if( sp->
17570 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
17580 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  NAL ){.        p
17590 72 69 6e 74 66 28 22 20 25 73 22 2c 20 73 70 2d  rintf(" %s", sp-
175a0 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65  >subsym[0]->name
175b0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  );.        for(j
175c0 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79  =1; j<sp->nsubsy
175d0 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; j++){.       
175e0 20 20 20 70 72 69 6e 74 66 28 22 7c 25 73 22 2c     printf("|%s",
175f0 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e   sp->subsym[j]->
17600 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
17610 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17620 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25        printf(" %
17630 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  s", sp->name);. 
17640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
17650 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
17660 5b 69 5d 20 29 20 70 72 69 6e 74 66 28 22 28 25  [i] ) printf("(%
17670 73 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  s)",rp->rhsalias
17680 5b 69 5d 29 3b 20 2a 2f 0a 20 20 20 20 7d 0a 20  [i]); */.    }. 
17690 20 20 20 70 72 69 6e 74 66 28 22 2e 22 29 3b 0a     printf(".");.
176a0 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63      if( rp->prec
176b0 73 79 6d 20 29 20 70 72 69 6e 74 66 28 22 20 5b  sym ) printf(" [
176c0 25 73 5d 22 2c 72 70 2d 3e 70 72 65 63 73 79 6d  %s]",rp->precsym
176d0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20  ->name);.    /* 
176e0 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 20 70  if( rp->code ) p
176f0 72 69 6e 74 66 28 22 5c 6e 20 20 20 20 25 73 22  rintf("\n    %s"
17700 2c 72 70 2d 3e 63 6f 64 65 29 3b 20 2a 2f 0a 20  ,rp->code); */. 
17710 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
17720 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74  .  }.}../* Print
17730 20 61 20 73 69 6e 67 6c 65 20 72 75 6c 65 2e 0a   a single rule..
17740 2a 2f 0a 76 6f 69 64 20 52 75 6c 65 50 72 69 6e  */.void RulePrin
17750 74 28 46 49 4c 45 20 2a 66 70 2c 20 73 74 72 75  t(FILE *fp, stru
17760 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 69 6e 74  ct rule *rp, int
17770 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 73 74 72   iCursor){.  str
17780 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
17790 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 70    int i, j;.  fp
177a0 72 69 6e 74 66 28 66 70 2c 22 25 73 20 3a 3a 3d  rintf(fp,"%s ::=
177b0 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29  ",rp->lhs->name)
177c0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
177d0 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
177e0 20 20 20 20 69 66 28 20 69 3d 3d 69 43 75 72 73      if( i==iCurs
177f0 6f 72 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c  or ) fprintf(fp,
17800 22 20 2a 22 29 3b 0a 20 20 20 20 69 66 28 20 69  " *");.    if( i
17810 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 62 72 65  ==rp->nrhs ) bre
17820 61 6b 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d  ak;.    sp = rp-
17830 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >rhs[i];.    if(
17840 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
17850 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
17860 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25    fprintf(fp," %
17870 73 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30  s", sp->subsym[0
17880 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
17890 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e  for(j=1; j<sp->n
178a0 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20  subsym; j++){.  
178b0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
178c0 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62 73 79  ,"|%s",sp->subsy
178d0 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  m[j]->name);.   
178e0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
178f0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
17900 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65  ," %s", sp->name
17910 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
17920 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 72 75 6c  /* Print the rul
17930 65 20 66 6f 72 20 61 20 63 6f 6e 66 69 67 75 72  e for a configur
17940 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 43  ation..*/.void C
17950 6f 6e 66 69 67 50 72 69 6e 74 28 46 49 4c 45 20  onfigPrint(FILE 
17960 2a 66 70 2c 20 73 74 72 75 63 74 20 63 6f 6e 66  *fp, struct conf
17970 69 67 20 2a 63 66 70 29 7b 0a 20 20 52 75 6c 65  ig *cfp){.  Rule
17980 50 72 69 6e 74 28 66 70 2c 20 63 66 70 2d 3e 72  Print(fp, cfp->r
17990 70 2c 20 63 66 70 2d 3e 64 6f 74 29 3b 0a 7d 0a  p, cfp->dot);.}.
179a0 0a 2f 2a 20 23 64 65 66 69 6e 65 20 54 45 53 54  ./* #define TEST
179b0 20 2a 2f 0a 23 69 66 20 30 0a 2f 2a 20 50 72 69   */.#if 0./* Pri
179c0 6e 74 20 61 20 73 65 74 20 2a 2f 0a 50 52 49 56  nt a set */.PRIV
179d0 41 54 45 20 76 6f 69 64 20 53 65 74 50 72 69 6e  ATE void SetPrin
179e0 74 28 6f 75 74 2c 73 65 74 2c 6c 65 6d 70 29 0a  t(out,set,lemp).
179f0 46 49 4c 45 20 2a 6f 75 74 3b 0a 63 68 61 72 20  FILE *out;.char 
17a00 2a 73 65 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d  *set;.struct lem
17a10 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
17a20 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 73 70 61  t i;.  char *spa
17a30 63 65 72 3b 0a 20 20 73 70 61 63 65 72 20 3d 20  cer;.  spacer = 
17a40 22 22 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  "";.  fprintf(ou
17a50 74 2c 22 25 31 32 73 5b 22 2c 22 22 29 3b 0a 20  t,"%12s[","");. 
17a60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
17a70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b  ->nterminal; i++
17a80 29 7b 0a 20 20 20 20 69 66 28 20 53 65 74 46 69  ){.    if( SetFi
17a90 6e 64 28 73 65 74 2c 69 29 20 29 7b 0a 20 20 20  nd(set,i) ){.   
17aa0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
17ab0 25 73 25 73 22 2c 73 70 61 63 65 72 2c 6c 65 6d  %s%s",spacer,lem
17ac0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
17ad0 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 70 61 63  ame);.      spac
17ae0 65 72 20 3d 20 22 20 22 3b 0a 20 20 20 20 7d 0a  er = " ";.    }.
17af0 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
17b00 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20  t,"]\n");.}../* 
17b10 50 72 69 6e 74 20 61 20 70 6c 69 6e 6b 20 63 68  Print a plink ch
17b20 61 69 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  ain */.PRIVATE v
17b30 6f 69 64 20 50 6c 69 6e 6b 50 72 69 6e 74 28 6f  oid PlinkPrint(o
17b40 75 74 2c 70 6c 70 2c 74 61 67 29 0a 46 49 4c 45  ut,plp,tag).FILE
17b50 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 70 6c   *out;.struct pl
17b60 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61 72 20 2a  ink *plp;.char *
17b70 74 61 67 3b 0a 7b 0a 20 20 77 68 69 6c 65 28 20  tag;.{.  while( 
17b80 70 6c 70 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  plp ){.    fprin
17b90 74 66 28 6f 75 74 2c 22 25 31 32 73 25 73 20 28  tf(out,"%12s%s (
17ba0 73 74 61 74 65 20 25 32 64 29 20 22 2c 22 22 2c  state %2d) ","",
17bb0 74 61 67 2c 70 6c 70 2d 3e 63 66 70 2d 3e 73 74  tag,plp->cfp->st
17bc0 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20  p->statenum);.  
17bd0 20 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 6f 75    ConfigPrint(ou
17be0 74 2c 70 6c 70 2d 3e 63 66 70 29 3b 0a 20 20 20  t,plp->cfp);.   
17bf0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e   fprintf(out,"\n
17c00 22 29 3b 0a 20 20 20 20 70 6c 70 20 3d 20 70 6c  ");.    plp = pl
17c10 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23  p->next;.  }.}.#
17c20 65 6e 64 69 66 0a 0a 2f 2a 20 50 72 69 6e 74 20  endif../* Print 
17c30 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65  an action to the
17c40 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
17c50 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
17c60 46 41 4c 53 45 20 69 66 0a 2a 2a 20 6e 6f 74 68  FALSE if.** noth
17c70 69 6e 67 20 77 61 73 20 61 63 74 75 61 6c 6c 79  ing was actually
17c80 20 70 72 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74   printed..*/.int
17c90 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 0a 20 20   PrintAction(.  
17ca0 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
17cb0 70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  p,          /* T
17cc0 68 65 20 61 63 74 69 6f 6e 20 74 6f 20 70 72 69  he action to pri
17cd0 6e 74 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 66 70  nt */.  FILE *fp
17ce0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17cf0 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 74 68 65      /* Print the
17d00 20 61 63 74 69 6f 6e 20 68 65 72 65 20 2a 2f 0a   action here */.
17d10 20 20 69 6e 74 20 69 6e 64 65 6e 74 20 20 20 20    int indent    
17d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17d30 20 49 6e 64 65 6e 74 20 62 79 20 74 68 69 73 20   Indent by this 
17d40 61 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  amount */.){.  i
17d50 6e 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20  nt result = 1;. 
17d60 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70   switch( ap->typ
17d70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48  e ){.    case SH
17d80 49 46 54 3a 20 7b 0a 20 20 20 20 20 20 73 74 72  IFT: {.      str
17d90 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 20 3d  uct state *stp =
17da0 20 61 70 2d 3e 78 2e 73 74 70 3b 0a 20 20 20 20   ap->x.stp;.    
17db0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
17dc0 73 20 73 68 69 66 74 20 20 20 20 20 20 20 20 25  s shift        %
17dd0 2d 37 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  -7d",indent,ap->
17de0 73 70 2d 3e 6e 61 6d 65 2c 73 74 70 2d 3e 73 74  sp->name,stp->st
17df0 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62  atenum);.      b
17e00 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
17e10 63 61 73 65 20 52 45 44 55 43 45 3a 20 7b 0a 20  case REDUCE: {. 
17e20 20 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65       struct rule
17e30 20 2a 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b   *rp = ap->x.rp;
17e40 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
17e50 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 20 20  p,"%*s reduce   
17e60 20 20 20 20 25 2d 37 64 22 2c 69 6e 64 65 6e 74      %-7d",indent
17e70 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 72 70  ,ap->sp->name,rp
17e80 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20  ->iRule);.      
17e90 52 75 6c 65 50 72 69 6e 74 28 66 70 2c 20 72 70  RulePrint(fp, rp
17ea0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , -1);.      bre
17eb0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
17ec0 73 65 20 53 48 49 46 54 52 45 44 55 43 45 3a 20  se SHIFTREDUCE: 
17ed0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 72  {.      struct r
17ee0 75 6c 65 20 2a 72 70 20 3d 20 61 70 2d 3e 78 2e  ule *rp = ap->x.
17ef0 72 70 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  rp;.      fprint
17f00 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 2d  f(fp,"%*s shift-
17f10 72 65 64 75 63 65 20 25 2d 37 64 22 2c 69 6e 64  reduce %-7d",ind
17f20 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
17f30 2c 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20  ,rp->iRule);.   
17f40 20 20 20 52 75 6c 65 50 72 69 6e 74 28 66 70 2c     RulePrint(fp,
17f50 20 72 70 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20   rp, -1);.      
17f60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
17f70 20 63 61 73 65 20 41 43 43 45 50 54 3a 0a 20 20   case ACCEPT:.  
17f80 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
17f90 25 2a 73 20 61 63 63 65 70 74 22 2c 69 6e 64 65  %*s accept",inde
17fa0 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29  nt,ap->sp->name)
17fb0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17fc0 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a 0a 20     case ERROR:. 
17fd0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
17fe0 22 25 2a 73 20 65 72 72 6f 72 22 2c 69 6e 64 65  "%*s error",inde
17ff0 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29  nt,ap->sp->name)
18000 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18010 20 20 20 63 61 73 65 20 53 52 43 4f 4e 46 4c 49     case SRCONFLI
18020 43 54 3a 0a 20 20 20 20 63 61 73 65 20 52 52 43  CT:.    case RRC
18030 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20 66  ONFLICT:.      f
18040 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 72  printf(fp,"%*s r
18050 65 64 75 63 65 20 20 20 20 20 20 20 25 2d 37 64  educe       %-7d
18060 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66   ** Parsing conf
18070 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20  lict **",.      
18080 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d    indent,ap->sp-
18090 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e  >name,ap->x.rp->
180a0 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  iRule);.      br
180b0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53  eak;.    case SS
180c0 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20  CONFLICT:.      
180d0 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
180e0 73 68 69 66 74 20 20 20 20 20 20 20 20 25 2d 37  shift        %-7
180f0 64 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e  d ** Parsing con
18100 66 6c 69 63 74 20 2a 2a 22 2c 20 0a 20 20 20 20  flict **", .    
18110 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73      indent,ap->s
18120 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74  p->name,ap->x.st
18130 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20  p->statenum);.  
18140 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
18150 61 73 65 20 53 48 5f 52 45 53 4f 4c 56 45 44 3a  ase SH_RESOLVED:
18160 0a 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 50  .      if( showP
18170 72 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63  recedenceConflic
18180 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  t ){.        fpr
18190 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69  intf(fp,"%*s shi
181a0 66 74 20 20 20 20 20 20 20 20 25 2d 37 64 20 2d  ft        %-7d -
181b0 2d 20 64 72 6f 70 70 65 64 20 62 79 20 70 72 65  - dropped by pre
181c0 63 65 64 65 6e 63 65 22 2c 0a 20 20 20 20 20 20  cedence",.      
181d0 20 20 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74            indent
181e0 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70  ,ap->sp->name,ap
181f0 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75  ->x.stp->statenu
18200 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
18210 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20  .        result 
18220 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
18230 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
18240 73 65 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a  se RD_RESOLVED:.
18250 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 50 72        if( showPr
18260 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63 74  ecedenceConflict
18270 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
18280 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75  ntf(fp,"%*s redu
18290 63 65 20 25 2d 37 64 20 2d 2d 20 64 72 6f 70 70  ce %-7d -- dropp
182a0 65 64 20 62 79 20 70 72 65 63 65 64 65 6e 63 65  ed by precedence
182b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
182c0 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70     indent,ap->sp
182d0 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d  ->name,ap->x.rp-
182e0 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20 7d  >iRule);.      }
182f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
18300 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sult = 0;.      
18310 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
18320 20 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44     case NOT_USED
18330 3a 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d  :.      result =
18340 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
18350 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
18360 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  sult;.}../* Gene
18370 72 61 74 65 20 74 68 65 20 22 2a 2e 6f 75 74 22  rate the "*.out"
18380 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76 6f 69   log file */.voi
18390 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 73  d ReportOutput(s
183a0 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
183b0 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p).{.  int i;.  
183c0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
183d0 70 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  p;.  struct conf
183e0 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63  ig *cfp;.  struc
183f0 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20  t action *ap;.  
18400 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 66 70 20  FILE *fp;..  fp 
18410 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70  = file_open(lemp
18420 2c 22 2e 6f 75 74 22 2c 22 77 62 22 29 3b 0a 20  ,".out","wb");. 
18430 20 69 66 28 20 66 70 3d 3d 30 20 29 20 72 65 74   if( fp==0 ) ret
18440 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
18450 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b  i<lemp->nxstate;
18460 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
18470 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
18480 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70  ;.    fprintf(fp
18490 2c 22 53 74 61 74 65 20 25 64 3a 5c 6e 22 2c 73  ,"State %d:\n",s
184a0 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20  tp->statenum);. 
184b0 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73     if( lemp->bas
184c0 69 73 66 6c 61 67 20 29 20 63 66 70 3d 73 74 70  isflag ) cfp=stp
184d0 2d 3e 62 70 3b 0a 20 20 20 20 65 6c 73 65 20 20  ->bp;.    else  
184e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184f0 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 0a 20 20  cfp=stp->cfp;.  
18500 20 20 77 68 69 6c 65 28 20 63 66 70 20 29 7b 0a    while( cfp ){.
18510 20 20 20 20 20 20 63 68 61 72 20 62 75 66 5b 32        char buf[2
18520 30 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 66  0];.      if( cf
18530 70 2d 3e 64 6f 74 3d 3d 63 66 70 2d 3e 72 70 2d  p->dot==cfp->rp-
18540 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  >nrhs ){.       
18550 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 62   lemon_sprintf(b
18560 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d 3e 72  uf,"(%d)",cfp->r
18570 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 20  p->iRule);.     
18580 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20     fprintf(fp," 
18590 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b 0a 20     %5s ",buf);. 
185a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
185b0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
185c0 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a 20 20            ");.  
185d0 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f 6e 66      }.      Conf
185e0 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70 29 3b  igPrint(fp,cfp);
185f0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
18600 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20 30 0a 20  p,"\n");.#if 0. 
18610 20 20 20 20 20 53 65 74 50 72 69 6e 74 28 66 70       SetPrint(fp
18620 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70 29 3b  ,cfp->fws,lemp);
18630 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e  .      PlinkPrin
18640 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70 2c 22  t(fp,cfp->fplp,"
18650 54 6f 20 20 22 29 3b 0a 20 20 20 20 20 20 50 6c  To  ");.      Pl
18660 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70 2d  inkPrint(fp,cfp-
18670 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b 0a 23  >bplp,"From");.#
18680 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
18690 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20  lemp->basisflag 
186a0 29 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b 0a 20  ) cfp=cfp->bp;. 
186b0 20 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20       else       
186c0 20 20 20 20 20 20 20 20 20 20 20 63 66 70 3d 63             cfp=c
186d0 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a  fp->next;.    }.
186e0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
186f0 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70  \n");.    for(ap
18700 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
18710 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
18720 20 20 69 66 28 20 50 72 69 6e 74 41 63 74 69 6f    if( PrintActio
18730 6e 28 61 70 2c 66 70 2c 33 30 29 20 29 20 66 70  n(ap,fp,30) ) fp
18740 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a  rintf(fp,"\n");.
18750 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
18760 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a  f(fp,"\n");.  }.
18770 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 2d    fprintf(fp, "-
18780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
187a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
187b0 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70 72 69 6e  ---\n");.  fprin
187c0 74 66 28 66 70 2c 20 22 53 79 6d 62 6f 6c 73 3a  tf(fp, "Symbols:
187d0 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  \n");.  for(i=0;
187e0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
187f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
18800 6a 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79  j;.    struct sy
18810 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 20 20 73  mbol *sp;..    s
18820 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
18830 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74  s[i];.    fprint
18840 66 28 66 70 2c 20 22 20 20 25 33 64 3a 20 25 73  f(fp, "  %3d: %s
18850 22 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b  ", i, sp->name);
18860 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
18870 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29  e==NONTERMINAL )
18880 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
18890 66 70 2c 20 22 3a 22 29 3b 0a 20 20 20 20 20 20  fp, ":");.      
188a0 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61 20 29  if( sp->lambda )
188b0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
188c0 66 28 66 70 2c 20 22 20 3c 6c 61 6d 62 64 61 3e  f(fp, " <lambda>
188d0 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
188e0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d    for(j=0; j<lem
188f0 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b  p->nterminal; j+
18900 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
18910 73 70 2d 3e 66 69 72 73 74 73 65 74 20 26 26 20  sp->firstset && 
18920 53 65 74 46 69 6e 64 28 73 70 2d 3e 66 69 72 73  SetFind(sp->firs
18930 74 73 65 74 2c 20 6a 29 20 29 7b 0a 20 20 20 20  tset, j) ){.    
18940 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
18950 2c 20 22 20 25 73 22 2c 20 6c 65 6d 70 2d 3e 73  , " %s", lemp->s
18960 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d 65 29  ymbols[j]->name)
18970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18980 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70    }.    }.    fp
18990 72 69 6e 74 66 28 66 70 2c 20 22 5c 6e 22 29 3b  rintf(fp, "\n");
189a0 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70  .  }.  fclose(fp
189b0 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
189c0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
189d0 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20 77 68  e file "name" wh
189e0 69 63 68 20 69 73 20 69 6e 20 74 68 65 20 73 61  ich is in the sa
189f0 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a  me directory as.
18a00 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61 62 6c  ** the exacutabl
18a10 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61  e */.PRIVATE cha
18a20 72 20 2a 70 61 74 68 73 65 61 72 63 68 28 63 68  r *pathsearch(ch
18a30 61 72 20 2a 61 72 67 76 30 2c 20 63 68 61 72 20  ar *argv0, char 
18a40 2a 6e 61 6d 65 2c 20 69 6e 74 20 6d 6f 64 65 6d  *name, int modem
18a50 61 73 6b 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63  ask).{.  const c
18a60 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b 0a 20  har *pathlist;. 
18a70 20 63 68 61 72 20 2a 70 61 74 68 62 75 66 70 74   char *pathbufpt
18a80 72 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68 62  r;.  char *pathb
18a90 75 66 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68  uf;.  char *path
18aa0 2c 2a 63 70 3b 0a 20 20 63 68 61 72 20 63 3b 0a  ,*cp;.  char c;.
18ab0 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33 32 5f  .#ifdef __WIN32_
18ac0 5f 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72  _.  cp = strrchr
18ad0 28 61 72 67 76 30 2c 27 5c 5c 27 29 3b 0a 23 65  (argv0,'\\');.#e
18ae0 6c 73 65 0a 20 20 63 70 20 3d 20 73 74 72 72 63  lse.  cp = strrc
18af0 68 72 28 61 72 67 76 30 2c 27 2f 27 29 3b 0a 23  hr(argv0,'/');.#
18b00 65 6e 64 69 66 0a 20 20 69 66 28 20 63 70 20 29  endif.  if( cp )
18b10 7b 0a 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20  {.    c = *cp;. 
18b20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20     *cp = 0;.    
18b30 70 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d  path = (char *)m
18b40 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
18b50 65 6e 28 61 72 67 76 30 29 20 2b 20 6c 65 6d 6f  en(argv0) + lemo
18b60 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29 20 2b 20  nStrlen(name) + 
18b70 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 74  2 );.    if( pat
18b80 68 20 29 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74  h ) lemon_sprint
18b90 66 28 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 61  f(path,"%s/%s",a
18ba0 72 67 76 30 2c 6e 61 6d 65 29 3b 0a 20 20 20 20  rgv0,name);.    
18bb0 2a 63 70 20 3d 20 63 3b 0a 20 20 7d 65 6c 73 65  *cp = c;.  }else
18bc0 7b 0a 20 20 20 20 70 61 74 68 6c 69 73 74 20 3d  {.    pathlist =
18bd0 20 67 65 74 65 6e 76 28 22 50 41 54 48 22 29 3b   getenv("PATH");
18be0 0a 20 20 20 20 69 66 28 20 70 61 74 68 6c 69 73  .    if( pathlis
18bf0 74 3d 3d 30 20 29 20 70 61 74 68 6c 69 73 74 20  t==0 ) pathlist 
18c00 3d 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f 62  = ".:/bin:/usr/b
18c10 69 6e 22 3b 0a 20 20 20 20 70 61 74 68 62 75 66  in";.    pathbuf
18c20 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c   = (char *) mall
18c30 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
18c40 70 61 74 68 6c 69 73 74 29 20 2b 20 31 20 29 3b  pathlist) + 1 );
18c50 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63 68 61  .    path = (cha
18c60 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f  r *)malloc( lemo
18c70 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c 69 73 74  nStrlen(pathlist
18c80 29 2b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61  )+lemonStrlen(na
18c90 6d 65 29 2b 32 20 29 3b 0a 20 20 20 20 69 66 28  me)+2 );.    if(
18ca0 20 28 70 61 74 68 62 75 66 20 21 3d 20 30 29 20   (pathbuf != 0) 
18cb0 26 26 20 28 70 61 74 68 21 3d 30 29 20 29 7b 0a  && (path!=0) ){.
18cc0 20 20 20 20 20 20 70 61 74 68 62 75 66 70 74 72        pathbufptr
18cd0 20 3d 20 70 61 74 68 62 75 66 3b 0a 20 20 20 20   = pathbuf;.    
18ce0 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 70    lemon_strcpy(p
18cf0 61 74 68 62 75 66 2c 20 70 61 74 68 6c 69 73 74  athbuf, pathlist
18d00 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
18d10 2a 70 61 74 68 62 75 66 20 29 7b 0a 20 20 20 20  *pathbuf ){.    
18d20 20 20 20 20 63 70 20 3d 20 73 74 72 63 68 72 28      cp = strchr(
18d30 70 61 74 68 62 75 66 2c 27 3a 27 29 3b 0a 20 20  pathbuf,':');.  
18d40 20 20 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20        if( cp==0 
18d50 29 20 63 70 20 3d 20 26 70 61 74 68 62 75 66 5b  ) cp = &pathbuf[
18d60 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68  lemonStrlen(path
18d70 62 75 66 29 5d 3b 0a 20 20 20 20 20 20 20 20 63  buf)];.        c
18d80 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20 20 20   = *cp;.        
18d90 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  *cp = 0;.       
18da0 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 70   lemon_sprintf(p
18db0 61 74 68 2c 22 25 73 2f 25 73 22 2c 70 61 74 68  ath,"%s/%s",path
18dc0 62 75 66 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  buf,name);.     
18dd0 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 20 20     *cp = c;.    
18de0 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 70      if( c==0 ) p
18df0 61 74 68 62 75 66 5b 30 5d 20 3d 20 30 3b 0a 20  athbuf[0] = 0;. 
18e00 20 20 20 20 20 20 20 65 6c 73 65 20 70 61 74 68         else path
18e10 62 75 66 20 3d 20 26 63 70 5b 31 5d 3b 0a 20 20  buf = &cp[1];.  
18e20 20 20 20 20 20 20 69 66 28 20 61 63 63 65 73 73        if( access
18e30 28 70 61 74 68 2c 6d 6f 64 65 6d 61 73 6b 29 3d  (path,modemask)=
18e40 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
18e50 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28 70    }.      free(p
18e60 61 74 68 62 75 66 70 74 72 29 3b 0a 20 20 20 20  athbufptr);.    
18e70 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
18e80 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69 76 65 6e  ath;.}../* Given
18e90 20 61 6e 20 61 63 74 69 6f 6e 2c 20 63 6f 6d 70   an action, comp
18ea0 75 74 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  ute the integer 
18eb0 76 61 6c 75 65 20 66 6f 72 20 74 68 61 74 20 61  value for that a
18ec0 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 69  ction.** which i
18ed0 73 20 74 6f 20 62 65 20 70 75 74 20 69 6e 20 74  s to be put in t
18ee0 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  he action table 
18ef0 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
18f00 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 52 65 74   machine..** Ret
18f10 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66 20  urn negative if 
18f20 6e 6f 20 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64  no action should
18f30 20 62 65 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a   be generated..*
18f40 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 63 6f  /.PRIVATE int co
18f50 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 73 74 72  mpute_action(str
18f60 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
18f70 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
18f80 61 70 29 0a 7b 0a 20 20 69 6e 74 20 61 63 74 3b  ap).{.  int act;
18f90 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74  .  switch( ap->t
18fa0 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
18fb0 53 48 49 46 54 3a 20 20 61 63 74 20 3d 20 61 70  SHIFT:  act = ap
18fc0 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75  ->x.stp->statenu
18fd0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
18fe0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
18ff0 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54 52  .    case SHIFTR
19000 45 44 55 43 45 3a 20 61 63 74 20 3d 20 61 70 2d  EDUCE: act = ap-
19010 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 20 2b 20 6c  >x.rp->iRule + l
19020 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 20 20 20  emp->nstate;    
19030 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
19040 61 73 65 20 52 45 44 55 43 45 3a 20 61 63 74 20  ase REDUCE: act 
19050 3d 20 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c  = ap->x.rp->iRul
19060 65 20 2b 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  e + lemp->nstate
19070 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 20 62 72  +lemp->nrule; br
19080 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52  eak;.    case ER
19090 52 4f 52 3a 20 20 61 63 74 20 3d 20 6c 65 6d 70  ROR:  act = lemp
190a0 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d  ->nstate + lemp-
190b0 3e 6e 72 75 6c 65 2a 32 3b 20 20 20 20 20 20 20  >nrule*2;       
190c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
190d0 20 20 20 63 61 73 65 20 41 43 43 45 50 54 3a 20     case ACCEPT: 
190e0 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  act = lemp->nsta
190f0 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
19100 2a 32 20 2b 20 31 3b 20 20 20 20 20 20 20 20 20  *2 + 1;         
19110 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
19120 61 75 6c 74 3a 20 20 20 20 20 61 63 74 20 3d 20  ault:     act = 
19130 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  -1; break;.  }. 
19140 20 72 65 74 75 72 6e 20 61 63 74 3b 0a 7d 0a 0a   return act;.}..
19150 23 64 65 66 69 6e 65 20 4c 49 4e 45 53 49 5a 45  #define LINESIZE
19160 20 31 30 30 30 0a 2f 2a 20 54 68 65 20 6e 65 78   1000./* The nex
19170 74 20 63 6c 75 73 74 65 72 20 6f 66 20 72 6f 75  t cluster of rou
19180 74 69 6e 65 73 20 61 72 65 20 66 6f 72 20 72 65  tines are for re
19190 61 64 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61  ading the templa
191a0 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 77  te file.** and w
191b0 72 69 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c  riting the resul
191c0 74 73 20 74 6f 20 74 68 65 20 67 65 6e 65 72 61  ts to the genera
191d0 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 2f 2a  ted parser */./*
191e0 20 54 68 65 20 66 69 72 73 74 20 66 75 6e 63 74   The first funct
191f0 69 6f 6e 20 74 72 61 6e 73 66 65 72 73 20 64 61  ion transfers da
19200 74 61 20 66 72 6f 6d 20 22 69 6e 22 20 74 6f 20  ta from "in" to 
19210 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a 2a 20 61  "out" until.** a
19220 20 6c 69 6e 65 20 69 73 20 73 65 65 6e 20 77 68   line is seen wh
19230 69 63 68 20 62 65 67 69 6e 73 20 77 69 74 68 20  ich begins with 
19240 22 25 25 22 2e 20 20 54 68 65 20 6c 69 6e 65 20  "%%".  The line 
19250 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 74 72 61  number is.** tra
19260 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6e  cked..**.** if n
19270 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20 61 6e 79  ame!=0, then any
19280 20 77 6f 72 64 20 74 68 61 74 20 62 65 67 69 6e   word that begin
19290 20 77 69 74 68 20 22 50 61 72 73 65 22 20 69 73   with "Parse" is
192a0 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a 2a 20 62   changed to.** b
192b0 65 67 69 6e 20 77 69 74 68 20 2a 6e 61 6d 65 20  egin with *name 
192c0 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50 52 49 56  instead..*/.PRIV
192d0 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 78 66  ATE void tplt_xf
192e0 65 72 28 63 68 61 72 20 2a 6e 61 6d 65 2c 20 46  er(char *name, F
192f0 49 4c 45 20 2a 69 6e 2c 20 46 49 4c 45 20 2a 6f  ILE *in, FILE *o
19300 75 74 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29  ut, int *lineno)
19310 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 69 53 74 61  .{.  int i, iSta
19320 72 74 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b  rt;.  char line[
19330 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 77 68 69  LINESIZE];.  whi
19340 6c 65 28 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c  le( fgets(line,L
19350 49 4e 45 53 49 5a 45 2c 69 6e 29 20 26 26 20 28  INESIZE,in) && (
19360 6c 69 6e 65 5b 30 5d 21 3d 27 25 27 20 7c 7c 20  line[0]!='%' || 
19370 6c 69 6e 65 5b 31 5d 21 3d 27 25 27 29 20 29 7b  line[1]!='%') ){
19380 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  .    (*lineno)++
19390 3b 0a 20 20 20 20 69 53 74 61 72 74 20 3d 20 30  ;.    iStart = 0
193a0 3b 0a 20 20 20 20 69 66 28 20 6e 61 6d 65 20 29  ;.    if( name )
193b0 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
193c0 20 6c 69 6e 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   line[i]; i++){.
193d0 20 20 20 20 20 20 20 20 69 66 28 20 6c 69 6e 65          if( line
193e0 5b 69 5d 3d 3d 27 50 27 20 26 26 20 73 74 72 6e  [i]=='P' && strn
193f0 63 6d 70 28 26 6c 69 6e 65 5b 69 5d 2c 22 50 61  cmp(&line[i],"Pa
19400 72 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20 20  rse",5)==0.     
19410 20 20 20 20 20 26 26 20 28 69 3d 3d 30 20 7c 7c       && (i==0 ||
19420 20 21 49 53 41 4c 50 48 41 28 6c 69 6e 65 5b 69   !ISALPHA(line[i
19430 2d 31 5d 29 29 0a 20 20 20 20 20 20 20 20 29 7b  -1])).        ){
19440 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
19450 3e 69 53 74 61 72 74 20 29 20 66 70 72 69 6e 74  >iStart ) fprint
19460 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2d 69  f(out,"%.*s",i-i
19470 53 74 61 72 74 2c 26 6c 69 6e 65 5b 69 53 74 61  Start,&line[iSta
19480 72 74 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rt]);.          
19490 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22  fprintf(out,"%s"
194a0 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ,name);.        
194b0 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20    i += 4;.      
194c0 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31      iStart = i+1
194d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
194e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70    }.    }.    fp
194f0 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 26  rintf(out,"%s",&
19500 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20  line[iStart]);. 
19510 20 7d 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6e 65 78   }.}../* The nex
19520 74 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  t function finds
19530 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69   the template fi
19540 6c 65 20 61 6e 64 20 6f 70 65 6e 73 20 69 74 2c  le and opens it,
19550 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 20   returning.** a 
19560 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
19570 70 65 6e 65 64 20 66 69 6c 65 2e 20 2a 2f 0a 50  pened file. */.P
19580 52 49 56 41 54 45 20 46 49 4c 45 20 2a 74 70 6c  RIVATE FILE *tpl
19590 74 5f 6f 70 65 6e 28 73 74 72 75 63 74 20 6c 65  t_open(struct le
195a0 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73  mon *lemp).{.  s
195b0 74 61 74 69 63 20 63 68 61 72 20 74 65 6d 70 6c  tatic char templ
195c0 61 74 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d  atename[] = "lem
195d0 70 61 72 2e 63 22 3b 0a 20 20 63 68 61 72 20 62  par.c";.  char b
195e0 75 66 5b 31 30 30 30 5d 3b 0a 20 20 46 49 4c 45  uf[1000];.  FILE
195f0 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 74 70   *in;.  char *tp
19600 6c 74 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a  ltname;.  char *
19610 63 70 3b 0a 0a 20 20 2f 2a 20 66 69 72 73 74 2c  cp;..  /* first,
19620 20 73 65 65 20 69 66 20 75 73 65 72 20 73 70 65   see if user spe
19630 63 69 66 69 65 64 20 61 20 74 65 6d 70 6c 61 74  cified a templat
19640 65 20 66 69 6c 65 6e 61 6d 65 20 6f 6e 20 74 68  e filename on th
19650 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20  e command line. 
19660 2a 2f 0a 20 20 69 66 20 28 75 73 65 72 5f 74 65  */.  if (user_te
19670 6d 70 6c 61 74 65 6e 61 6d 65 20 21 3d 20 30 29  mplatename != 0)
19680 20 7b 0a 20 20 20 20 69 66 28 20 61 63 63 65 73   {.    if( acces
19690 73 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e  s(user_templaten
196a0 61 6d 65 2c 30 30 34 29 3d 3d 2d 31 20 29 7b 0a  ame,004)==-1 ){.
196b0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
196c0 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69 6e 64  derr,"Can't find
196d0 20 74 68 65 20 70 61 72 73 65 72 20 64 72 69 76   the parser driv
196e0 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  er template file
196f0 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20   \"%s\".\n",.   
19700 20 20 20 20 20 75 73 65 72 5f 74 65 6d 70 6c 61       user_templa
19710 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c  tename);.      l
19720 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
19730 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
19740 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20  .    }.    in = 
19750 66 6f 70 65 6e 28 75 73 65 72 5f 74 65 6d 70 6c  fopen(user_templ
19760 61 74 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20  atename,"rb");. 
19770 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a     if( in==0 ){.
19780 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
19790 64 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e  derr,"Can't open
197a0 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69   the template fi
197b0 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20  le \"%s\".\n",. 
197c0 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65               use
197d0 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b  r_templatename);
197e0 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  .      lemp->err
197f0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72  orcnt++;.      r
19800 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
19810 20 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 20 20     return in;.  
19820 7d 0a 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  }..  cp = strrch
19830 72 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  r(lemp->filename
19840 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20  ,'.');.  if( cp 
19850 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72  ){.    lemon_spr
19860 69 6e 74 66 28 62 75 66 2c 22 25 2e 2a 73 2e 6c  intf(buf,"%.*s.l
19870 74 22 2c 28 69 6e 74 29 28 63 70 2d 6c 65 6d 70  t",(int)(cp-lemp
19880 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c 6c 65 6d 70  ->filename),lemp
19890 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  ->filename);.  }
198a0 65 6c 73 65 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f  else{.    lemon_
198b0 73 70 72 69 6e 74 66 28 62 75 66 2c 22 25 73 2e  sprintf(buf,"%s.
198c0 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  lt",lemp->filena
198d0 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61  me);.  }.  if( a
198e0 63 63 65 73 73 28 62 75 66 2c 30 30 34 29 3d 3d  ccess(buf,004)==
198f0 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d  0 ){.    tpltnam
19900 65 20 3d 20 62 75 66 3b 0a 20 20 7d 65 6c 73 65  e = buf;.  }else
19910 20 69 66 28 20 61 63 63 65 73 73 28 74 65 6d 70   if( access(temp
19920 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29 3d 3d 30  latename,004)==0
19930 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65   ){.    tpltname
19940 20 3d 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 3b   = templatename;
19950 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 70  .  }else{.    tp
19960 6c 74 6e 61 6d 65 20 3d 20 70 61 74 68 73 65 61  ltname = pathsea
19970 72 63 68 28 6c 65 6d 70 2d 3e 61 72 67 76 30 2c  rch(lemp->argv0,
19980 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 29 3b  templatename,0);
19990 0a 20 20 7d 0a 20 20 69 66 28 20 74 70 6c 74 6e  .  }.  if( tpltn
199a0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  ame==0 ){.    fp
199b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61  rintf(stderr,"Ca
199c0 6e 27 74 20 66 69 6e 64 20 74 68 65 20 70 61 72  n't find the par
199d0 73 65 72 20 64 72 69 76 65 72 20 74 65 6d 70 6c  ser driver templ
199e0 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e  ate file \"%s\".
199f0 5c 6e 22 2c 0a 20 20 20 20 74 65 6d 70 6c 61 74  \n",.    templat
19a00 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70  ename);.    lemp
19a10 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
19a20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
19a30 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 74 70 6c    in = fopen(tpl
19a40 74 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69  tname,"rb");.  i
19a50 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
19a60 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
19a70 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 65 20 74  Can't open the t
19a80 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25  emplate file \"%
19a90 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70 6c 61 74 65  s\".\n",template
19aa0 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d  name);.    lemp-
19ab0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
19ac0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
19ad0 20 72 65 74 75 72 6e 20 69 6e 3b 0a 7d 0a 0a 2f   return in;.}../
19ae0 2a 20 50 72 69 6e 74 20 61 20 23 6c 69 6e 65 20  * Print a #line 
19af0 64 69 72 65 63 74 69 76 65 20 6c 69 6e 65 20 74  directive line t
19b00 6f 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c  o the output fil
19b10 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  e. */.PRIVATE vo
19b20 69 64 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28  id tplt_linedir(
19b30 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74 20 6c  FILE *out, int l
19b40 69 6e 65 6e 6f 2c 20 63 68 61 72 20 2a 66 69 6c  ineno, char *fil
19b50 65 6e 61 6d 65 29 0a 7b 0a 20 20 66 70 72 69 6e  ename).{.  fprin
19b60 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64  tf(out,"#line %d
19b70 20 5c 22 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20   \"",lineno);.  
19b80 77 68 69 6c 65 28 20 2a 66 69 6c 65 6e 61 6d 65  while( *filename
19b90 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 66 69 6c   ){.    if( *fil
19ba0 65 6e 61 6d 65 20 3d 3d 20 27 5c 5c 27 20 29 20  ename == '\\' ) 
19bb0 70 75 74 63 28 27 5c 5c 27 2c 6f 75 74 29 3b 0a  putc('\\',out);.
19bc0 20 20 20 20 70 75 74 63 28 2a 66 69 6c 65 6e 61      putc(*filena
19bd0 6d 65 2c 6f 75 74 29 3b 0a 20 20 20 20 66 69 6c  me,out);.    fil
19be0 65 6e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 20 20 66  ename++;.  }.  f
19bf0 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 5c 6e  printf(out,"\"\n
19c00 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20  ");.}../* Print 
19c10 61 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20  a string to the 
19c20 66 69 6c 65 20 61 6e 64 20 6b 65 65 70 20 74 68  file and keep th
19c30 65 20 6c 69 6e 65 6e 75 6d 62 65 72 20 75 70 20  e linenumber up 
19c40 74 6f 20 64 61 74 65 20 2a 2f 0a 50 52 49 56 41  to date */.PRIVA
19c50 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 70 72 69  TE void tplt_pri
19c60 6e 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73 74  nt(FILE *out, st
19c70 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
19c80 2c 20 63 68 61 72 20 2a 73 74 72 2c 20 69 6e 74  , char *str, int
19c90 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20 69 66   *lineno).{.  if
19ca0 28 20 73 74 72 3d 3d 30 20 29 20 72 65 74 75 72  ( str==0 ) retur
19cb0 6e 3b 0a 20 20 77 68 69 6c 65 28 20 2a 73 74 72  n;.  while( *str
19cc0 20 29 7b 0a 20 20 20 20 70 75 74 63 28 2a 73 74   ){.    putc(*st
19cd0 72 2c 6f 75 74 29 3b 0a 20 20 20 20 69 66 28 20  r,out);.    if( 
19ce0 2a 73 74 72 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c  *str=='\n' ) (*l
19cf0 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 73 74  ineno)++;.    st
19d00 72 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  r++;.  }.  if( s
19d10 74 72 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a  tr[-1]!='\n' ){.
19d20 20 20 20 20 70 75 74 63 28 27 5c 6e 27 2c 6f 75      putc('\n',ou
19d30 74 29 3b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f  t);.    (*lineno
19d40 29 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 20 28 21  )++;.  }.  if (!
19d50 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66  lemp->nolinenosf
19d60 6c 61 67 29 20 7b 0a 20 20 20 20 28 2a 6c 69 6e  lag) {.    (*lin
19d70 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e  eno)++; tplt_lin
19d80 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f  edir(out,*lineno
19d90 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b  ,lemp->outname);
19da0 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a   .  }.  return;.
19db0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
19dc0 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 65  lowing routine e
19dd0 6d 69 74 73 20 63 6f 64 65 20 66 6f 72 20 74 68  mits code for th
19de0 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
19df0 20 74 68 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73   the.** symbol s
19e00 70 0a 2a 2f 0a 76 6f 69 64 20 65 6d 69 74 5f 64  p.*/.void emit_d
19e10 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 0a  estructor_code(.
19e20 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20 20 73    FILE *out,.  s
19e30 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
19e40 2c 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ,.  struct lemon
19e50 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c   *lemp,.  int *l
19e60 69 6e 65 6e 6f 0a 29 7b 0a 20 63 68 61 72 20 2a  ineno.){. char *
19e70 63 70 20 3d 20 30 3b 0a 0a 20 69 66 28 20 73 70  cp = 0;.. if( sp
19e80 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
19e90 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70   ){.   cp = lemp
19ea0 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20  ->tokendest;.   
19eb0 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75  if( cp==0 ) retu
19ec0 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  rn;.   fprintf(o
19ed0 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e  ut,"{\n"); (*lin
19ee0 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 20 69  eno)++;. }else i
19ef0 66 28 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  f( sp->destructo
19f00 72 20 29 7b 0a 20 20 20 63 70 20 3d 20 73 70 2d  r ){.   cp = sp-
19f10 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 20  >destructor;.   
19f20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e  fprintf(out,"{\n
19f30 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
19f40 0a 20 20 20 69 66 28 20 21 6c 65 6d 70 2d 3e 6e  .   if( !lemp->n
19f50 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 29 7b 0a  olinenosflag ){.
19f60 20 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b       (*lineno)++
19f70 3b 0a 20 20 20 20 20 74 70 6c 74 5f 6c 69 6e 65  ;.     tplt_line
19f80 64 69 72 28 6f 75 74 2c 73 70 2d 3e 64 65 73 74  dir(out,sp->dest
19f90 4c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 66 69 6c  Lineno,lemp->fil
19fa0 65 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a 20 7d 65  ename);.   }. }e
19fb0 6c 73 65 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61  lse if( lemp->va
19fc0 72 64 65 73 74 20 29 7b 0a 20 20 20 63 70 20 3d  rdest ){.   cp =
19fd0 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 3b 0a   lemp->vardest;.
19fe0 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72     if( cp==0 ) r
19ff0 65 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74  eturn;.   fprint
1a000 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a  f(out,"{\n"); (*
1a010 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73  lineno)++;. }els
1a020 65 7b 0a 20 20 20 61 73 73 65 72 74 28 20 30 20  e{.   assert( 0 
1a030 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61  );  /* Cannot ha
1a040 70 70 65 6e 20 2a 2f 0a 20 7d 0a 20 66 6f 72 28  ppen */. }. for(
1a050 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20  ; *cp; cp++){.  
1a060 20 69 66 28 20 2a 63 70 3d 3d 27 24 27 20 26 26   if( *cp=='$' &&
1a070 20 63 70 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a 20   cp[1]=='$' ){. 
1a080 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1a090 22 28 79 79 70 6d 69 6e 6f 72 2d 3e 79 79 25 64  "(yypminor->yy%d
1a0a0 29 22 2c 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20  )",sp->dtnum);. 
1a0b0 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 63      cp++;.     c
1a0c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 7d 0a 20 20  ontinue;.   }.  
1a0d0 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29   if( *cp=='\n' )
1a0e0 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
1a0f0 20 66 70 75 74 63 28 2a 63 70 2c 6f 75 74 29 3b   fputc(*cp,out);
1a100 0a 20 7d 0a 20 66 70 72 69 6e 74 66 28 6f 75 74  . }. fprintf(out
1a110 2c 22 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f  ,"\n"); (*lineno
1a120 29 2b 2b 3b 0a 20 69 66 20 28 21 6c 65 6d 70 2d  )++;. if (!lemp-
1a130 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20  >nolinenosflag) 
1a140 7b 20 0a 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b  { .   (*lineno)+
1a150 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28  +; tplt_linedir(
1a160 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70  out,*lineno,lemp
1a170 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 7d 0a  ->outname); . }.
1a180 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c   fprintf(out,"}\
1a190 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n"); (*lineno)++
1a1a0 3b 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ;. return;.}../*
1a1b0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1a1c0 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68  (non-zero) if th
1a1d0 65 20 67 69 76 65 6e 20 73 79 6d 62 6f 6c 20 68  e given symbol h
1a1e0 61 73 20 61 20 64 65 73 74 72 75 63 74 6f 72 2e  as a destructor.
1a1f0 0a 2a 2f 0a 69 6e 74 20 68 61 73 5f 64 65 73 74  .*/.int has_dest
1a200 72 75 63 74 6f 72 28 73 74 72 75 63 74 20 73 79  ructor(struct sy
1a210 6d 62 6f 6c 20 2a 73 70 2c 20 73 74 72 75 63 74  mbol *sp, struct
1a220 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
1a230 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 69 66 28    int ret;.  if(
1a240 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   sp->type==TERMI
1a250 4e 41 4c 20 29 7b 0a 20 20 20 20 72 65 74 20 3d  NAL ){.    ret =
1a260 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74   lemp->tokendest
1a270 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  !=0;.  }else{.  
1a280 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 76 61    ret = lemp->va
1a290 72 64 65 73 74 21 3d 30 20 7c 7c 20 73 70 2d 3e  rdest!=0 || sp->
1a2a0 64 65 73 74 72 75 63 74 6f 72 21 3d 30 3b 0a 20  destructor!=0;. 
1a2b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
1a2c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
1a2d0 20 74 65 78 74 20 74 6f 20 61 20 64 79 6e 61 6d   text to a dynam
1a2e0 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
1a2f0 20 73 74 72 69 6e 67 2e 20 20 49 66 20 7a 54 65   string.  If zTe
1a300 78 74 20 69 73 20 30 20 74 68 65 6e 0a 2a 2a 20  xt is 0 then.** 
1a310 72 65 73 65 74 20 74 68 65 20 73 74 72 69 6e 67  reset the string
1a320 20 74 6f 20 62 65 20 65 6d 70 74 79 20 61 67 61   to be empty aga
1a330 69 6e 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  in.  Always retu
1a340 72 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  rn the complete 
1a350 74 65 78 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73  text.** of the s
1a360 74 72 69 6e 67 20 28 77 68 69 63 68 20 69 73 20  tring (which is 
1a370 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
1a380 20 65 61 63 68 20 63 61 6c 6c 29 2e 0a 2a 2a 0a   each call)..**.
1a390 2a 2a 20 6e 20 62 79 74 65 73 20 6f 66 20 7a 54  ** n bytes of zT
1a3a0 65 78 74 20 61 72 65 20 73 74 6f 72 65 64 2e 20  ext are stored. 
1a3b0 20 49 66 20 6e 3d 3d 30 20 74 68 65 6e 20 61 6c   If n==0 then al
1a3c0 6c 20 6f 66 20 7a 54 65 78 74 20 75 70 20 74 6f  l of zText up to
1a3d0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 5c 30   the first.** \0
1a3e0 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 69 73  00 terminator is
1a3f0 20 73 74 6f 72 65 64 2e 20 20 7a 54 65 78 74 20   stored.  zText 
1a400 63 61 6e 20 63 6f 6e 74 61 69 6e 20 75 70 20 74  can contain up t
1a410 6f 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20  o two instances 
1a420 6f 66 0a 2a 2a 20 25 64 2e 20 20 54 68 65 20 76  of.** %d.  The v
1a430 61 6c 75 65 73 20 6f 66 20 70 31 20 61 6e 64 20  alues of p1 and 
1a440 70 32 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  p2 are written i
1a450 6e 74 6f 20 74 68 65 20 66 69 72 73 74 20 61 6e  nto the first an
1a460 64 20 73 65 63 6f 6e 64 0a 2a 2a 20 25 64 2e 0a  d second.** %d..
1a470 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 2d 31 2c 20  **.** If n==-1, 
1a480 74 68 65 6e 20 74 68 65 20 70 72 65 76 69 6f 75  then the previou
1a490 73 20 63 68 61 72 61 63 74 65 72 20 69 73 20 6f  s character is o
1a4a0 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 50  verwritten..*/.P
1a4b0 52 49 56 41 54 45 20 63 68 61 72 20 2a 61 70 70  RIVATE char *app
1a4c0 65 6e 64 5f 73 74 72 28 63 6f 6e 73 74 20 63 68  end_str(const ch
1a4d0 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 6e  ar *zText, int n
1a4e0 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
1a4f0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
1a500 20 65 6d 70 74 79 5b 31 5d 20 3d 20 7b 20 30 20   empty[1] = { 0 
1a510 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  };.  static char
1a520 20 2a 7a 20 3d 20 30 3b 0a 20 20 73 74 61 74 69   *z = 0;.  stati
1a530 63 20 69 6e 74 20 61 6c 6c 6f 63 65 64 20 3d 20  c int alloced = 
1a540 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
1a550 75 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  used = 0;.  int 
1a560 63 3b 0a 20 20 63 68 61 72 20 7a 49 6e 74 5b 34  c;.  char zInt[4
1a570 30 5d 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 3d  0];.  if( zText=
1a580 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 75 73  =0 ){.    if( us
1a590 65 64 3d 3d 30 20 26 26 20 7a 21 3d 30 20 29 20  ed==0 && z!=0 ) 
1a5a0 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 75 73  z[0] = 0;.    us
1a5b0 65 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ed = 0;.    retu
1a5c0 72 6e 20 7a 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn z;.  }.  if( 
1a5d0 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  n<=0 ){.    if( 
1a5e0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 73 65  n<0 ){.      use
1a5f0 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 61 73  d += n;.      as
1a600 73 65 72 74 28 20 75 73 65 64 3e 3d 30 20 29 3b  sert( used>=0 );
1a610 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6c  .    }.    n = l
1a620 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 54 65 78 74  emonStrlen(zText
1a630 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 6e  );.  }.  if( (in
1a640 74 29 20 28 6e 2b 73 69 7a 65 6f 66 28 7a 49 6e  t) (n+sizeof(zIn
1a650 74 29 2a 32 2b 75 73 65 64 29 20 3e 3d 20 61 6c  t)*2+used) >= al
1a660 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 61 6c 6c  loced ){.    all
1a670 6f 63 65 64 20 3d 20 6e 20 2b 20 73 69 7a 65 6f  oced = n + sizeo
1a680 66 28 7a 49 6e 74 29 2a 32 20 2b 20 75 73 65 64  f(zInt)*2 + used
1a690 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 20 3d 20   + 200;.    z = 
1a6a0 28 63 68 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63  (char *) realloc
1a6b0 28 7a 2c 20 20 61 6c 6c 6f 63 65 64 29 3b 0a 20  (z,  alloced);. 
1a6c0 20 7d 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20   }.  if( z==0 ) 
1a6d0 72 65 74 75 72 6e 20 65 6d 70 74 79 3b 0a 20 20  return empty;.  
1a6e0 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
1a6f0 7b 0a 20 20 20 20 63 20 3d 20 2a 28 7a 54 65 78  {.    c = *(zTex
1a700 74 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63 3d  t++);.    if( c=
1a710 3d 27 25 27 20 26 26 20 6e 3e 30 20 26 26 20 7a  ='%' && n>0 && z
1a720 54 65 78 74 5b 30 5d 3d 3d 27 64 27 20 29 7b 0a  Text[0]=='d' ){.
1a730 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69        lemon_spri
1a740 6e 74 66 28 7a 49 6e 74 2c 20 22 25 64 22 2c 20  ntf(zInt, "%d", 
1a750 70 31 29 3b 0a 20 20 20 20 20 20 70 31 20 3d 20  p1);.      p1 = 
1a760 70 32 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f  p2;.      lemon_
1a770 73 74 72 63 70 79 28 26 7a 5b 75 73 65 64 5d 2c  strcpy(&z[used],
1a780 20 7a 49 6e 74 29 3b 0a 20 20 20 20 20 20 75 73   zInt);.      us
1a790 65 64 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  ed += lemonStrle
1a7a0 6e 28 26 7a 5b 75 73 65 64 5d 29 3b 0a 20 20 20  n(&z[used]);.   
1a7b0 20 20 20 7a 54 65 78 74 2b 2b 3b 0a 20 20 20 20     zText++;.    
1a7c0 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65    n--;.    }else
1a7d0 7b 0a 20 20 20 20 20 20 7a 5b 75 73 65 64 2b 2b  {.      z[used++
1a7e0 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a 20 20 20  ] = (char)c;.   
1a7f0 20 7d 0a 20 20 7d 0a 20 20 7a 5b 75 73 65 64 5d   }.  }.  z[used]
1a800 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
1a810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
1a820 20 61 6e 64 20 74 72 61 6e 73 66 6f 72 6d 20 74   and transform t
1a830 68 65 20 72 70 2d 3e 63 6f 64 65 20 73 74 72 69  he rp->code stri
1a840 6e 67 20 73 6f 20 74 68 61 74 20 73 79 6d 62 6f  ng so that symbo
1a850 6c 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e  ls are expanded.
1a860 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65  .** Populate the
1a870 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 20   rp->codePrefix 
1a880 61 6e 64 20 72 70 2d 3e 63 6f 64 65 53 75 66 66  and rp->codeSuff
1a890 69 78 20 73 74 72 69 6e 67 73 2c 20 61 73 20 61  ix strings, as a
1a8a0 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a  ppropriate..**.*
1a8b0 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
1a8c0 65 20 65 78 70 61 6e 64 65 64 20 63 6f 64 65 20  e expanded code 
1a8d0 72 65 71 75 69 72 65 73 20 74 68 61 74 20 22 79  requires that "y
1a8e0 79 6c 68 73 6d 69 6e 6f 72 22 20 6c 6f 63 61 6c  ylhsminor" local
1a8f0 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 6f 20   variable.** to 
1a900 62 65 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 50  be defined..*/.P
1a910 52 49 56 41 54 45 20 69 6e 74 20 74 72 61 6e 73  RIVATE int trans
1a920 6c 61 74 65 5f 63 6f 64 65 28 73 74 72 75 63 74  late_code(struct
1a930 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74   lemon *lemp, st
1a940 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a  ruct rule *rp){.
1a950 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 78 70 3b    char *cp, *xp;
1a960 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1a970 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1a980 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 79 79     /* True if yy
1a990 6c 68 73 6d 69 6e 6f 72 20 69 73 20 75 73 65 64  lhsminor is used
1a9a0 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 6e 74 55 73   */.  int dontUs
1a9b0 65 52 68 73 30 20 3d 20 30 3b 20 20 20 2f 2a 20  eRhs0 = 0;   /* 
1a9c0 49 66 20 74 72 75 65 2c 20 75 73 65 20 6f 66 20  If true, use of 
1a9d0 6c 65 66 74 2d 6d 6f 73 74 20 52 48 53 20 6c 61  left-most RHS la
1a9e0 62 65 6c 20 69 73 20 69 6c 6c 65 67 61 6c 20 2a  bel is illegal *
1a9f0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1aa00 7a 53 6b 69 70 20 3d 20 30 3b 20 2f 2a 20 54 68  zSkip = 0; /* Th
1aa10 65 20 7a 4f 76 77 72 74 20 63 6f 6d 6d 65 6e 74  e zOvwrt comment
1aa20 20 77 69 74 68 69 6e 20 72 70 2d 3e 63 6f 64 65   within rp->code
1aa30 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
1aa40 68 61 72 20 6c 68 73 75 73 65 64 20 3d 20 30 3b  har lhsused = 0;
1aa50 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1aa60 20 74 68 65 20 4c 48 53 20 65 6c 65 6d 65 6e 74   the LHS element
1aa70 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a   has been used *
1aa80 2f 0a 20 20 63 68 61 72 20 6c 68 73 64 69 72 65  /.  char lhsdire
1aa90 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ct;        /* Tr
1aaa0 75 65 20 69 66 20 4c 48 53 20 77 72 69 74 65 73  ue if LHS writes
1aab0 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 73   directly into s
1aac0 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 75  tack */.  char u
1aad0 73 65 64 5b 4d 41 58 52 48 53 5d 3b 20 20 20 20  sed[MAXRHS];    
1aae0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 65 61 63   /* True for eac
1aaf0 68 20 52 48 53 20 65 6c 65 6d 65 6e 74 20 77 68  h RHS element wh
1ab00 69 63 68 20 69 73 20 75 73 65 64 20 2a 2f 0a 20  ich is used */. 
1ab10 20 63 68 61 72 20 7a 4c 68 73 5b 35 30 5d 3b 20   char zLhs[50]; 
1ab20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65          /* Conve
1ab30 72 74 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f  rt the LHS symbo
1ab40 6c 20 69 6e 74 6f 20 74 68 69 73 20 73 74 72 69  l into this stri
1ab50 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4f 76  ng */.  char zOv
1ab60 77 72 74 5b 39 30 30 5d 3b 20 20 20 20 20 20 2f  wrt[900];      /
1ab70 2a 20 43 6f 6d 6d 65 6e 74 20 74 68 61 74 20 74  * Comment that t
1ab80 6f 20 61 6c 6c 6f 77 20 4c 48 53 20 74 6f 20 6f  o allow LHS to o
1ab90 76 65 72 77 72 69 74 65 20 52 48 53 20 2a 2f 0a  verwrite RHS */.
1aba0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70  .  for(i=0; i<rp
1abb0 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75 73 65  ->nrhs; i++) use
1abc0 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 6c 68 73 75  d[i] = 0;.  lhsu
1abd0 73 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  sed = 0;..  if( 
1abe0 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 7b 0a 20  rp->code==0 ){. 
1abf0 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 6e     static char n
1ac00 65 77 6c 69 6e 65 73 74 72 5b 32 5d 20 3d 20 7b  ewlinestr[2] = {
1ac10 20 27 5c 6e 27 2c 20 27 5c 30 27 20 7d 3b 0a 20   '\n', '\0' };. 
1ac20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 6e 65     rp->code = ne
1ac30 77 6c 69 6e 65 73 74 72 3b 0a 20 20 20 20 72 70  wlinestr;.    rp
1ac40 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d 3e 72 75 6c  ->line = rp->rul
1ac50 65 6c 69 6e 65 3b 0a 20 20 20 20 72 70 2d 3e 6e  eline;.    rp->n
1ac60 6f 43 6f 64 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  oCode = 1;.  }el
1ac70 73 65 7b 0a 20 20 20 20 72 70 2d 3e 6e 6f 43 6f  se{.    rp->noCo
1ac80 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 0a 20 20  de = 0;.  }...  
1ac90 69 66 28 20 72 70 2d 3e 6e 72 68 73 3d 3d 30 20  if( rp->nrhs==0 
1aca0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
1acb0 72 65 20 61 72 65 20 6e 6f 20 52 48 53 20 73 79  re are no RHS sy
1acc0 6d 62 6f 6c 73 2c 20 74 68 65 6e 20 77 72 69 74  mbols, then writ
1acd0 69 6e 67 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ing directly to 
1ace0 74 68 65 20 4c 48 53 20 69 73 20 6f 6b 20 2a 2f  the LHS is ok */
1acf0 0a 20 20 20 20 6c 68 73 64 69 72 65 63 74 20 3d  .    lhsdirect =
1ad00 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
1ad10 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d 3d  rp->rhsalias[0]=
1ad20 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
1ad30 20 6c 65 66 74 2d 6d 6f 73 74 20 52 48 53 20 73   left-most RHS s
1ad40 79 6d 62 6f 6c 20 68 61 73 20 6e 6f 20 76 61 6c  ymbol has no val
1ad50 75 65 2e 20 20 4c 48 53 20 64 69 72 65 63 74 20  ue.  LHS direct 
1ad60 69 73 20 6f 6b 2e 20 20 42 75 74 0a 20 20 20 20  is ok.  But.    
1ad70 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 63 61  ** we have to ca
1ad80 6c 6c 20 74 68 65 20 64 69 73 74 72 75 63 74 6f  ll the distructo
1ad90 72 20 6f 6e 20 74 68 65 20 52 48 53 20 73 79 6d  r on the RHS sym
1ada0 62 6f 6c 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20  bol first. */.  
1adb0 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20 31 3b    lhsdirect = 1;
1adc0 0a 20 20 20 20 69 66 28 20 68 61 73 5f 64 65 73  .    if( has_des
1add0 74 72 75 63 74 6f 72 28 72 70 2d 3e 72 68 73 5b  tructor(rp->rhs[
1ade0 30 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20 20 20  0],lemp) ){.    
1adf0 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30    append_str(0,0
1ae00 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 61 70 70  ,0,0);.      app
1ae10 65 6e 64 5f 73 74 72 28 22 20 20 79 79 5f 64 65  end_str("  yy_de
1ae20 73 74 72 75 63 74 6f 72 28 79 79 70 50 61 72 73  structor(yypPars
1ae30 65 72 2c 25 64 2c 26 79 79 6d 73 70 5b 25 64 5d  er,%d,&yymsp[%d]
1ae40 2e 6d 69 6e 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a  .minor);\n", 0,.
1ae50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae60 20 72 70 2d 3e 72 68 73 5b 30 5d 2d 3e 69 6e 64   rp->rhs[0]->ind
1ae70 65 78 2c 31 2d 72 70 2d 3e 6e 72 68 73 29 3b 0a  ex,1-rp->nrhs);.
1ae80 20 20 20 20 20 20 72 70 2d 3e 63 6f 64 65 50 72        rp->codePr
1ae90 65 66 69 78 20 3d 20 53 74 72 73 61 66 65 28 61  efix = Strsafe(a
1aea0 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c  ppend_str(0,0,0,
1aeb0 30 29 29 3b 0a 20 20 20 20 20 20 72 70 2d 3e 6e  0));.      rp->n
1aec0 6f 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 7d  oCode = 0;.    }
1aed0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70 2d  .  }else if( rp-
1aee0 3e 6c 68 73 61 6c 69 61 73 3d 3d 30 20 29 7b 0a  >lhsalias==0 ){.
1aef0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
1af00 6e 6f 20 4c 48 53 20 76 61 6c 75 65 20 73 79 6d  no LHS value sym
1af10 62 6f 6c 2e 20 2a 2f 0a 20 20 20 20 6c 68 73 64  bol. */.    lhsd
1af20 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 7d 65 6c  irect = 1;.  }el
1af30 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 72 70  se if( strcmp(rp
1af40 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 72  ->lhsalias,rp->r
1af50 68 73 61 6c 69 61 73 5b 30 5d 29 3d 3d 30 20 29  hsalias[0])==0 )
1af60 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53  {.    /* The LHS
1af70 20 73 79 6d 62 6f 6c 20 61 6e 64 20 74 68 65 20   symbol and the 
1af80 6c 65 66 74 2d 6d 6f 73 74 20 52 48 53 20 73 79  left-most RHS sy
1af90 6d 62 6f 6c 20 61 72 65 20 74 68 65 20 73 61 6d  mbol are the sam
1afa0 65 2c 20 73 6f 20 0a 20 20 20 20 2a 2a 20 64 69  e, so .    ** di
1afb0 72 65 63 74 20 77 72 69 74 69 6e 67 20 69 73 20  rect writing is 
1afc0 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 6c  allowed */.    l
1afd0 68 73 64 69 72 65 63 74 20 3d 20 31 3b 0a 20 20  hsdirect = 1;.  
1afe0 20 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a 20    lhsused = 1;. 
1aff0 20 20 20 75 73 65 64 5b 30 5d 20 3d 20 31 3b 0a     used[0] = 1;.
1b000 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 2d      if( rp->lhs-
1b010 3e 64 74 6e 75 6d 21 3d 72 70 2d 3e 72 68 73 5b  >dtnum!=rp->rhs[
1b020 30 5d 2d 3e 64 74 6e 75 6d 20 29 7b 0a 20 20 20  0]->dtnum ){.   
1b030 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
1b040 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72  ->filename,rp->r
1b050 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20  uleline,.       
1b060 20 22 25 73 28 25 73 29 20 61 6e 64 20 25 73 28   "%s(%s) and %s(
1b070 25 73 29 20 73 68 61 72 65 20 74 68 65 20 73 61  %s) share the sa
1b080 6d 65 20 6c 61 62 65 6c 20 62 75 74 20 68 61 76  me label but hav
1b090 65 20 22 0a 20 20 20 20 20 20 20 20 22 64 69 66  e ".        "dif
1b0a0 66 65 72 65 6e 74 20 64 61 74 61 74 79 70 65 73  ferent datatypes
1b0b0 2e 22 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e  .",.        rp->
1b0c0 6c 68 73 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 6c  lhs->name, rp->l
1b0d0 68 73 61 6c 69 61 73 2c 20 72 70 2d 3e 72 68 73  hsalias, rp->rhs
1b0e0 5b 30 5d 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 72  [0]->name, rp->r
1b0f0 68 73 61 6c 69 61 73 5b 30 5d 29 3b 0a 20 20 20  hsalias[0]);.   
1b100 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
1b110 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 20 20 0a 20  t++;.    }    . 
1b120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 65 6d 6f   }else{.    lemo
1b130 6e 5f 73 70 72 69 6e 74 66 28 7a 4f 76 77 72 74  n_sprintf(zOvwrt
1b140 2c 20 22 2f 2a 25 73 2d 6f 76 65 72 77 72 69 74  , "/*%s-overwrit
1b150 65 73 2d 25 73 2a 2f 22 2c 0a 20 20 20 20 20 20  es-%s*/",.      
1b160 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e              rp->
1b170 6c 68 73 61 6c 69 61 73 2c 20 72 70 2d 3e 72 68  lhsalias, rp->rh
1b180 73 61 6c 69 61 73 5b 30 5d 29 3b 0a 20 20 20 20  salias[0]);.    
1b190 7a 53 6b 69 70 20 3d 20 73 74 72 73 74 72 28 72  zSkip = strstr(r
1b1a0 70 2d 3e 63 6f 64 65 2c 20 7a 4f 76 77 72 74 29  p->code, zOvwrt)
1b1b0 3b 0a 20 20 20 20 69 66 28 20 7a 53 6b 69 70 21  ;.    if( zSkip!
1b1c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
1b1d0 68 65 20 63 6f 64 65 20 63 6f 6e 74 61 69 6e 73  he code contains
1b1e0 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6d 6d 65   a special comme
1b1f0 6e 74 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  nt that indicate
1b200 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66  s that it is saf
1b210 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  e.      ** for t
1b220 68 65 20 4c 48 53 20 6c 61 62 65 6c 20 74 6f 20  he LHS label to 
1b230 6f 76 65 72 77 72 69 74 65 20 6c 65 66 74 2d 6d  overwrite left-m
1b240 6f 73 74 20 52 48 53 20 6c 61 62 65 6c 2e 20 2a  ost RHS label. *
1b250 2f 0a 20 20 20 20 20 20 6c 68 73 64 69 72 65 63  /.      lhsdirec
1b260 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 1;.    }else
1b270 7b 0a 20 20 20 20 20 20 6c 68 73 64 69 72 65 63  {.      lhsdirec
1b280 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
1b290 0a 20 20 69 66 28 20 6c 68 73 64 69 72 65 63 74  .  if( lhsdirect
1b2a0 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   ){.    sprintf(
1b2b0 7a 4c 68 73 2c 20 22 79 79 6d 73 70 5b 25 64 5d  zLhs, "yymsp[%d]
1b2c0 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 31 2d 72  .minor.yy%d",1-r
1b2d0 70 2d 3e 6e 72 68 73 2c 72 70 2d 3e 6c 68 73 2d  p->nrhs,rp->lhs-
1b2e0 3e 64 74 6e 75 6d 29 3b 0a 20 20 7d 65 6c 73 65  >dtnum);.  }else
1b2f0 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  {.    rc = 1;.  
1b300 20 20 73 70 72 69 6e 74 66 28 7a 4c 68 73 2c 20    sprintf(zLhs, 
1b310 22 79 79 6c 68 73 6d 69 6e 6f 72 2e 79 79 25 64  "yylhsminor.yy%d
1b320 22 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d  ",rp->lhs->dtnum
1b330 29 3b 0a 20 20 7d 0a 0a 20 20 61 70 70 65 6e 64  );.  }..  append
1b340 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 0a  _str(0,0,0,0);..
1b350 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 20    /* This const 
1b360 63 61 73 74 20 69 73 20 77 72 6f 6e 67 20 62 75  cast is wrong bu
1b370 74 20 68 61 72 6d 6c 65 73 73 2c 20 69 66 20 77  t harmless, if w
1b380 65 27 72 65 20 63 61 72 65 66 75 6c 2e 20 2a 2f  e're careful. */
1b390 0a 20 20 66 6f 72 28 63 70 3d 28 63 68 61 72 20  .  for(cp=(char 
1b3a0 2a 29 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b  *)rp->code; *cp;
1b3b0 20 63 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   cp++){.    if( 
1b3c0 63 70 3d 3d 7a 53 6b 69 70 20 29 7b 0a 20 20 20  cp==zSkip ){.   
1b3d0 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 7a 4f     append_str(zO
1b3e0 76 77 72 74 2c 30 2c 30 2c 30 29 3b 0a 20 20 20  vwrt,0,0,0);.   
1b3f0 20 20 20 63 70 20 2b 3d 20 6c 65 6d 6f 6e 53 74     cp += lemonSt
1b400 72 6c 65 6e 28 7a 4f 76 77 72 74 29 2d 31 3b 0a  rlen(zOvwrt)-1;.
1b410 20 20 20 20 20 20 64 6f 6e 74 55 73 65 52 68 73        dontUseRhs
1b420 30 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e  0 = 1;.      con
1b430 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
1b440 20 69 66 28 20 49 53 41 4c 50 48 41 28 2a 63 70   if( ISALPHA(*cp
1b450 29 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63 6f  ) && (cp==rp->co
1b460 64 65 20 7c 7c 20 28 21 49 53 41 4c 4e 55 4d 28  de || (!ISALNUM(
1b470 63 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d 31  cp[-1]) && cp[-1
1b480 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20 20  ]!='_')) ){.    
1b490 20 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20 20    char saved;.  
1b4a0 20 20 20 20 66 6f 72 28 78 70 3d 20 26 63 70 5b      for(xp= &cp[
1b4b0 31 5d 3b 20 49 53 41 4c 4e 55 4d 28 2a 78 70 29  1]; ISALNUM(*xp)
1b4c0 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20 78 70   || *xp=='_'; xp
1b4d0 2b 2b 29 3b 0a 20 20 20 20 20 20 73 61 76 65 64  ++);.      saved
1b4e0 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20 2a 78   = *xp;.      *x
1b4f0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  p = 0;.      if(
1b500 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26   rp->lhsalias &&
1b510 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 6c   strcmp(cp,rp->l
1b520 68 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a 20  hsalias)==0 ){. 
1b530 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74         append_st
1b540 72 28 7a 4c 68 73 2c 30 2c 30 2c 30 29 3b 0a 20  r(zLhs,0,0,0);. 
1b550 20 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a         cp = xp;.
1b560 20 20 20 20 20 20 20 20 6c 68 73 75 73 65 64 20          lhsused 
1b570 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
1b580 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
1b590 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
1b5a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1b5b0 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  f( rp->rhsalias[
1b5c0 69 5d 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c  i] && strcmp(cp,
1b5d0 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29  rp->rhsalias[i])
1b5e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1b5f0 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 64     if( i==0 && d
1b600 6f 6e 74 55 73 65 52 68 73 30 20 29 7b 0a 20 20  ontUseRhs0 ){.  
1b610 20 20 20 20 20 20 20 20 20 20 20 20 45 72 72 6f              Erro
1b620 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
1b630 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65  ame,rp->ruleline
1b640 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b650 20 20 20 22 4c 61 62 65 6c 20 25 73 20 75 73 65     "Label %s use
1b660 64 20 61 66 74 65 72 20 27 25 73 27 2e 22 2c 0a  d after '%s'.",.
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b680 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d   rp->rhsalias[0]
1b690 2c 20 7a 4f 76 77 72 74 29 3b 0a 20 20 20 20 20  , zOvwrt);.     
1b6a0 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65           lemp->e
1b6b0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
1b6c0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1b6d0 20 63 70 21 3d 72 70 2d 3e 63 6f 64 65 20 26 26   cp!=rp->code &&
1b6e0 20 63 70 5b 2d 31 5d 3d 3d 27 40 27 20 29 7b 0a   cp[-1]=='@' ){.
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b700 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   If the argument
1b710 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
1b720 40 58 20 74 68 65 6e 20 73 75 62 73 74 69 74 75  @X then substitu
1b730 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ted.            
1b740 20 20 2a 2a 20 74 68 65 20 74 6f 6b 65 6e 20 6e    ** the token n
1b750 75 6d 62 65 72 20 6f 66 20 58 2c 20 6e 6f 74 20  umber of X, not 
1b760 74 68 65 20 76 61 6c 75 65 20 6f 66 20 58 20 2a  the value of X *
1b770 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1b780 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73  append_str("yyms
1b790 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22 2c 2d 31 2c  p[%d].major",-1,
1b7a0 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 30 29 3b  i-rp->nrhs+1,0);
1b7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
1b7c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1b7d0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1b7e0 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d  *sp = rp->rhs[i]
1b7f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1b800 69 6e 74 20 64 74 6e 75 6d 3b 0a 20 20 20 20 20  int dtnum;.     
1b810 20 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d           if( sp-
1b820 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
1b830 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
1b840 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20 3d 20          dtnum = 
1b850 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 64  sp->subsym[0]->d
1b860 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
1b870 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b880 20 20 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d             dtnum
1b890 20 3d 20 73 70 2d 3e 64 74 6e 75 6d 3b 0a 20 20   = sp->dtnum;.  
1b8a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1b8b0 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65              appe
1b8c0 6e 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25 64  nd_str("yymsp[%d
1b8d0 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30 2c  ].minor.yy%d",0,
1b8e0 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 20 64 74  i-rp->nrhs+1, dt
1b8f0 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  num);.          
1b900 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1b910 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20 20  cp = xp;.       
1b920 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d 20 31       used[i] = 1
1b930 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
1b940 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
1b950 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b960 20 7d 0a 20 20 20 20 20 20 2a 78 70 20 3d 20 73   }.      *xp = s
1b970 61 76 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  aved;.    }.    
1b980 61 70 70 65 6e 64 5f 73 74 72 28 63 70 2c 20 31  append_str(cp, 1
1b990 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 20 2f 2a 20  , 0, 0);.  } /* 
1b9a0 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 2f  End loop */..  /
1b9b0 2a 20 4d 61 69 6e 20 63 6f 64 65 20 67 65 6e 65  * Main code gene
1b9c0 72 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 64  ration completed
1b9d0 20 2a 2f 0a 20 20 63 70 20 3d 20 61 70 70 65 6e   */.  cp = appen
1b9e0 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a  d_str(0,0,0,0);.
1b9f0 20 20 69 66 28 20 63 70 20 26 26 20 63 70 5b 30    if( cp && cp[0
1ba00 5d 20 29 20 72 70 2d 3e 63 6f 64 65 20 3d 20 53  ] ) rp->code = S
1ba10 74 72 73 61 66 65 28 63 70 29 3b 0a 20 20 61 70  trsafe(cp);.  ap
1ba20 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30  pend_str(0,0,0,0
1ba30 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
1ba40 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
1ba50 4c 48 53 20 68 61 73 20 62 65 65 6e 20 75 73 65  LHS has been use
1ba60 64 20 2a 2f 0a 20 20 69 66 28 20 72 70 2d 3e 6c  d */.  if( rp->l
1ba70 68 73 61 6c 69 61 73 20 26 26 20 21 6c 68 73 75  hsalias && !lhsu
1ba80 73 65 64 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  sed ){.    Error
1ba90 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
1baa0 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c  me,rp->ruleline,
1bab0 0a 20 20 20 20 20 20 22 4c 61 62 65 6c 20 5c 22  .      "Label \"
1bac0 25 73 5c 22 20 66 6f 72 20 5c 22 25 73 28 25 73  %s\" for \"%s(%s
1bad0 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73 65  )\" is never use
1bae0 64 2e 22 2c 0a 20 20 20 20 20 20 20 20 72 70 2d  d.",.        rp-
1baf0 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 6c 68  >lhsalias,rp->lh
1bb00 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73 61  s->name,rp->lhsa
1bb10 6c 69 61 73 29 3b 0a 20 20 20 20 6c 65 6d 70 2d  lias);.    lemp-
1bb20 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d  >errorcnt++;.  }
1bb30 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1bb40 64 65 73 74 72 75 63 74 6f 72 20 63 6f 64 65 20  destructor code 
1bb50 66 6f 72 20 52 48 53 20 6d 69 6e 6f 72 20 76 61  for RHS minor va
1bb60 6c 75 65 73 20 77 68 69 63 68 20 61 72 65 20 6e  lues which are n
1bb70 6f 74 20 72 65 66 65 72 65 6e 63 65 64 2e 0a 20  ot referenced.. 
1bb80 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 65 72 72   ** Generate err
1bb90 6f 72 20 6d 65 73 73 61 67 65 73 20 66 6f 72 20  or messages for 
1bba0 75 6e 75 73 65 64 20 6c 61 62 65 6c 73 20 61 6e  unused labels an
1bbb0 64 20 64 75 70 6c 69 63 61 74 65 20 6c 61 62 65  d duplicate labe
1bbc0 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ls..  */.  for(i
1bbd0 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
1bbe0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 70  i++){.    if( rp
1bbf0 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 29 7b  ->rhsalias[i] ){
1bc00 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29  .      if( i>0 )
1bc10 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  {.        int j;
1bc20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70 2d  .        if( rp-
1bc30 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 73 74 72  >lhsalias && str
1bc40 63 6d 70 28 72 70 2d 3e 6c 68 73 61 6c 69 61 73  cmp(rp->lhsalias
1bc50 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d  ,rp->rhsalias[i]
1bc60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1bc70 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
1bc80 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
1bc90 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20  leline,.        
1bca0 20 20 20 20 22 25 73 28 25 73 29 20 68 61 73 20      "%s(%s) has 
1bcb0 74 68 65 20 73 61 6d 65 20 6c 61 62 65 6c 20 61  the same label a
1bcc0 73 20 74 68 65 20 4c 48 53 20 62 75 74 20 69 73  s the LHS but is
1bcd0 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 2d 6d 6f   not the left-mo
1bce0 73 74 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  st ".           
1bcf0 20 22 73 79 6d 62 6f 6c 20 6f 6e 20 74 68 65 20   "symbol on the 
1bd00 52 48 53 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  RHS.",.         
1bd10 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e     rp->rhs[i]->n
1bd20 61 6d 65 2c 20 72 70 2d 3e 72 68 73 61 6c 69 61  ame, rp->rhsalia
1bd30 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 65  s);.          le
1bd40 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
1bd50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bd60 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20    for(j=0; j<i; 
1bd70 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
1bd80 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
1bd90 5b 6a 5d 20 26 26 20 73 74 72 63 6d 70 28 72 70  [j] && strcmp(rp
1bda0 2d 3e 72 68 73 61 6c 69 61 73 5b 6a 5d 2c 72 70  ->rhsalias[j],rp
1bdb0 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d  ->rhsalias[i])==
1bdc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1bdd0 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
1bde0 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c  filename,rp->rul
1bdf0 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 20  eline,.         
1be00 20 20 20 20 20 22 4c 61 62 65 6c 20 25 73 20 75       "Label %s u
1be10 73 65 64 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65  sed for multiple
1be20 20 73 79 6d 62 6f 6c 73 20 6f 6e 20 74 68 65 20   symbols on the 
1be30 52 48 53 20 6f 66 20 61 20 72 75 6c 65 2e 22 2c  RHS of a rule.",
1be40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
1be50 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b  p->rhsalias[i]);
1be60 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6d  .            lem
1be70 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
1be80 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1be90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1bea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1beb0 20 20 20 20 20 20 69 66 28 20 21 75 73 65 64 5b        if( !used[
1bec0 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  i] ){.        Er
1bed0 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
1bee0 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69  ename,rp->ruleli
1bef0 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4c  ne,.          "L
1bf00 61 62 65 6c 20 25 73 20 66 6f 72 20 5c 22 25 73  abel %s for \"%s
1bf10 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20  (%s)\" is never 
1bf20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 20  used.",.        
1bf30 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69    rp->rhsalias[i
1bf40 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61  ],rp->rhs[i]->na
1bf50 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  me,rp->rhsalias[
1bf60 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d  i]);.        lem
1bf70 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
1bf80 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1bf90 20 69 66 28 20 69 3e 30 20 26 26 20 68 61 73 5f   if( i>0 && has_
1bfa0 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d 3e 72  destructor(rp->r
1bfb0 68 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20  hs[i],lemp) ){. 
1bfc0 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28       append_str(
1bfd0 22 20 20 79 79 5f 64 65 73 74 72 75 63 74 6f 72  "  yy_destructor
1bfe0 28 79 79 70 50 61 72 73 65 72 2c 25 64 2c 26 79  (yypParser,%d,&y
1bff0 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b  ymsp[%d].minor);
1c000 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  \n", 0,.        
1c010 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 69 6e 64   rp->rhs[i]->ind
1c020 65 78 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 29  ex,i-rp->nrhs+1)
1c030 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1c040 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 77  * If unable to w
1c050 72 69 74 65 20 4c 48 53 20 76 61 6c 75 65 73 20  rite LHS values 
1c060 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
1c070 65 20 73 74 61 63 6b 2c 20 77 72 69 74 65 20 74  e stack, write t
1c080 68 65 0a 20 20 2a 2a 20 73 61 76 65 64 20 4c 48  he.  ** saved LH
1c090 53 20 76 61 6c 75 65 20 6e 6f 77 2e 20 2a 2f 0a  S value now. */.
1c0a0 20 20 69 66 28 20 6c 68 73 64 69 72 65 63 74 3d    if( lhsdirect=
1c0b0 3d 30 20 29 7b 0a 20 20 20 20 61 70 70 65 6e 64  =0 ){.    append
1c0c0 5f 73 74 72 28 22 20 20 79 79 6d 73 70 5b 25 64  _str("  yymsp[%d
1c0d0 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 20 3d 20 22  ].minor.yy%d = "
1c0e0 2c 20 30 2c 20 31 2d 72 70 2d 3e 6e 72 68 73 2c  , 0, 1-rp->nrhs,
1c0f0 20 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 29   rp->lhs->dtnum)
1c100 3b 0a 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72  ;.    append_str
1c110 28 7a 4c 68 73 2c 20 30 2c 20 30 2c 20 30 29 3b  (zLhs, 0, 0, 0);
1c120 0a 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28  .    append_str(
1c130 22 3b 5c 6e 22 2c 20 30 2c 20 30 2c 20 30 29 3b  ";\n", 0, 0, 0);
1c140 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 75 66 66 69  .  }..  /* Suffi
1c150 78 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  x code generatio
1c160 6e 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20  n complete */.  
1c170 63 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72 28  cp = append_str(
1c180 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20  0,0,0,0);.  if( 
1c190 63 70 20 26 26 20 63 70 5b 30 5d 20 29 7b 0a 20  cp && cp[0] ){. 
1c1a0 20 20 20 72 70 2d 3e 63 6f 64 65 53 75 66 66 69     rp->codeSuffi
1c1b0 78 20 3d 20 53 74 72 73 61 66 65 28 63 70 29 3b  x = Strsafe(cp);
1c1c0 0a 20 20 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20  .    rp->noCode 
1c1d0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
1c1e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
1c1f0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
1c200 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
1c210 65 6e 20 74 68 65 20 72 75 6c 65 20 22 72 70 22  en the rule "rp"
1c220 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 57 72   is reduced.  Wr
1c230 69 74 65 0a 2a 2a 20 74 68 65 20 63 6f 64 65 20  ite.** the code 
1c240 74 6f 20 22 6f 75 74 22 2e 20 20 4d 61 6b 65 20  to "out".  Make 
1c250 73 75 72 65 20 6c 69 6e 65 6e 6f 20 73 74 61 79  sure lineno stay
1c260 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f  s up-to-date..*/
1c270 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 65 6d  .PRIVATE void em
1c280 69 74 5f 63 6f 64 65 28 0a 20 20 46 49 4c 45 20  it_code(.  FILE 
1c290 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63 74 20 72  *out,.  struct r
1c2a0 75 6c 65 20 2a 72 70 2c 0a 20 20 73 74 72 75 63  ule *rp,.  struc
1c2b0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20  t lemon *lemp,. 
1c2c0 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a   int *lineno.){.
1c2d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 70 3b   const char *cp;
1c2e0 0a 0a 20 2f 2a 20 53 65 74 75 70 20 63 6f 64 65  .. /* Setup code
1c2f0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 23 6c   prior to the #l
1c300 69 6e 65 20 64 69 72 65 63 74 69 76 65 20 2a 2f  ine directive */
1c310 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 50 72  . if( rp->codePr
1c320 65 66 69 78 20 26 26 20 72 70 2d 3e 63 6f 64 65  efix && rp->code
1c330 50 72 65 66 69 78 5b 30 5d 20 29 7b 0a 20 20 20  Prefix[0] ){.   
1c340 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7b 25  fprintf(out, "{%
1c350 73 22 2c 20 72 70 2d 3e 63 6f 64 65 50 72 65 66  s", rp->codePref
1c360 69 78 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72  ix);.   for(cp=r
1c370 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 3b 20 2a  p->codePrefix; *
1c380 63 70 3b 20 63 70 2b 2b 29 7b 20 69 66 28 20 2a  cp; cp++){ if( *
1c390 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e  cp=='\n' ) (*lin
1c3a0 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 7d 0a 0a 20 2f  eno)++; }. }.. /
1c3b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1c3c0 74 6f 20 64 6f 20 74 68 65 20 72 65 64 75 63 65  to do the reduce
1c3d0 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20   action */. if( 
1c3e0 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 69  rp->code ){.   i
1c3f0 66 28 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65  f( !lemp->noline
1c400 6e 6f 73 66 6c 61 67 20 29 7b 0a 20 20 20 20 20  nosflag ){.     
1c410 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
1c420 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f    tplt_linedir(o
1c430 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70  ut,rp->line,lemp
1c440 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  ->filename);.   
1c450 7d 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  }.   fprintf(out
1c460 2c 22 7b 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29  ,"{%s",rp->code)
1c470 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e  ;.   for(cp=rp->
1c480 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29  code; *cp; cp++)
1c490 7b 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20  { if( *cp=='\n' 
1c4a0 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 7d  ) (*lineno)++; }
1c4b0 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
1c4c0 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f  "}\n"); (*lineno
1c4d0 29 2b 2b 3b 0a 20 20 20 69 66 28 20 21 6c 65 6d  )++;.   if( !lem
1c4e0 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
1c4f0 20 29 7b 0a 20 20 20 20 20 28 2a 6c 69 6e 65 6e   ){.     (*linen
1c500 6f 29 2b 2b 3b 0a 20 20 20 20 20 74 70 6c 74 5f  o)++;.     tplt_
1c510 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e  linedir(out,*lin
1c520 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  eno,lemp->outnam
1c530 65 29 3b 0a 20 20 20 7d 0a 20 7d 0a 0a 20 2f 2a  e);.   }. }.. /*
1c540 20 47 65 6e 65 72 61 74 65 20 62 72 65 61 6b 64   Generate breakd
1c550 6f 77 6e 20 63 6f 64 65 20 74 68 61 74 20 6f 63  own code that oc
1c560 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20 23  curs after the #
1c570 6c 69 6e 65 20 64 69 72 65 63 74 69 76 65 20 2a  line directive *
1c580 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 53  /. if( rp->codeS
1c590 75 66 66 69 78 20 26 26 20 72 70 2d 3e 63 6f 64  uffix && rp->cod
1c5a0 65 53 75 66 66 69 78 5b 30 5d 20 29 7b 0a 20 20  eSuffix[0] ){.  
1c5b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
1c5c0 73 22 2c 20 72 70 2d 3e 63 6f 64 65 53 75 66 66  s", rp->codeSuff
1c5d0 69 78 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72  ix);.   for(cp=r
1c5e0 70 2d 3e 63 6f 64 65 53 75 66 66 69 78 3b 20 2a  p->codeSuffix; *
1c5f0 63 70 3b 20 63 70 2b 2b 29 7b 20 69 66 28 20 2a  cp; cp++){ if( *
1c600 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e  cp=='\n' ) (*lin
1c610 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 7d 0a 0a 20 69  eno)++; }. }.. i
1c620 66 28 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69  f( rp->codePrefi
1c630 78 20 29 7b 0a 20 20 20 66 70 72 69 6e 74 66 28  x ){.   fprintf(
1c640 6f 75 74 2c 20 22 7d 5c 6e 22 29 3b 20 28 2a 6c  out, "}\n"); (*l
1c650 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 0a 0a 20 72  ineno)++;. }.. r
1c660 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
1c670 50 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e 69  Print the defini
1c680 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f  tion of the unio
1c690 6e 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 70  n used for the p
1c6a0 61 72 73 65 72 27 73 20 64 61 74 61 20 73 74 61  arser's data sta
1c6b0 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f  ck..** This unio
1c6c0 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64  n contains field
1c6d0 73 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73  s for every poss
1c6e0 69 62 6c 65 20 64 61 74 61 20 74 79 70 65 20 66  ible data type f
1c6f0 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64  or tokens.** and
1c700 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20   nonterminals.  
1c710 49 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  In the process o
1c720 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20  f computing and 
1c730 70 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a  printing this.**
1c740 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74   union, also set
1c750 20 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69   the ".dtnum" fi
1c760 65 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65 72  eld of every ter
1c770 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72  minal and nonter
1c780 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e  minal.** symbol.
1c790 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73  .*/.void print_s
1c7a0 74 61 63 6b 5f 75 6e 69 6f 6e 28 0a 20 20 46 49  tack_union(.  FI
1c7b0 4c 45 20 2a 6f 75 74 2c 20 20 20 20 20 20 20 20  LE *out,        
1c7c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c7d0 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20 2a   output stream *
1c7e0 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  /.  struct lemon
1c7f0 20 2a 6c 65 6d 70 2c 20 20 20 20 20 20 20 20 20   *lemp,         
1c800 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66 6f  /* The main info
1c810 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
1c820 68 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 20 20  his parser */.  
1c830 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 2c 20 20 20  int *plineno,   
1c840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1c850 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 69  ointer to the li
1c860 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ne number */.  i
1c870 6e 74 20 6d 68 66 6c 61 67 20 20 20 20 20 20 20  nt mhflag       
1c880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1c890 75 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e 67  ue if generating
1c8a0 20 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75 74   makeheaders out
1c8b0 70 75 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  put */.){.  int 
1c8c0 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e  lineno = *plinen
1c8d0 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e  o;    /* The lin
1c8e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1c8f0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61 72  output */.  char
1c900 20 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20 20   **types;       
1c910 20 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68 20        /* A hash 
1c920 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70  table of datatyp
1c930 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61  es */.  int arra
1c940 79 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  ysize;          
1c950 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1c960 20 22 74 79 70 65 73 22 20 61 72 72 61 79 20 2a   "types" array *
1c970 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65 6e  /.  int maxdtlen
1c980 67 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  gth;          /*
1c990 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20   Maximum length 
1c9a0 6f 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79 70  of any ".datatyp
1c9b0 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 63  e" field. */.  c
1c9c0 68 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20 20  har *stddt;     
1c9d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 6e           /* Stan
1c9e0 64 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66 6f  dardized name fo
1c9f0 72 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f 0a  r a datatype */.
1ca00 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20 20    int i,j;      
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1ca20 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
1ca30 20 20 75 6e 73 69 67 6e 65 64 20 68 61 73 68 3b    unsigned hash;
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ca50 6f 72 20 68 61 73 68 69 6e 67 20 74 68 65 20 6e  or hashing the n
1ca60 61 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a 2f  ame of a type */
1ca70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e  .  const char *n
1ca80 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ame;         /* 
1ca90 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72 73  Name of the pars
1caa0 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  er */..  /* Allo
1cab0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
1cac0 69 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64 20  ize types[] and 
1cad0 61 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b 5d  allocate stddt[]
1cae0 20 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65 20   */.  arraysize 
1caf0 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  = lemp->nsymbol 
1cb00 2a 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20 28  * 2;.  types = (
1cb10 63 68 61 72 2a 2a 29 63 61 6c 6c 6f 63 28 20 61  char**)calloc( a
1cb20 72 72 61 79 73 69 7a 65 2c 20 73 69 7a 65 6f 66  rraysize, sizeof
1cb30 28 63 68 61 72 2a 29 20 29 3b 0a 20 20 69 66 28  (char*) );.  if(
1cb40 20 74 79 70 65 73 3d 3d 30 20 29 7b 0a 20 20 20   types==0 ){.   
1cb50 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1cb60 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c  "Out of memory.\
1cb70 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
1cb80 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1cb90 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b   i<arraysize; i+
1cba0 2b 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30 3b  +) types[i] = 0;
1cbb0 0a 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d  .  maxdtlength =
1cbc0 20 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   0;.  if( lemp->
1cbd0 76 61 72 74 79 70 65 20 29 7b 0a 20 20 20 20 6d  vartype ){.    m
1cbe0 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6d  axdtlength = lem
1cbf0 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76  onStrlen(lemp->v
1cc00 61 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20 66  artype);.  }.  f
1cc10 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1cc20 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
1cc30 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
1cc40 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
1cc50 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
1cc60 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70  s[i];.    if( sp
1cc70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29 20  ->datatype==0 ) 
1cc80 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c 65  continue;.    le
1cc90 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  n = lemonStrlen(
1cca0 73 70 2d 3e 64 61 74 61 74 79 70 65 29 3b 0a 20  sp->datatype);. 
1ccb0 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 64 74     if( len>maxdt
1ccc0 6c 65 6e 67 74 68 20 29 20 6d 61 78 64 74 6c 65  length ) maxdtle
1ccd0 6e 67 74 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a  ngth = len;.  }.
1cce0 20 20 73 74 64 64 74 20 3d 20 28 63 68 61 72 2a    stddt = (char*
1ccf0 29 6d 61 6c 6c 6f 63 28 20 6d 61 78 64 74 6c 65  )malloc( maxdtle
1cd00 6e 67 74 68 2a 32 20 2b 20 31 20 29 3b 0a 20 20  ngth*2 + 1 );.  
1cd10 69 66 28 20 73 74 64 64 74 3d 3d 30 20 29 7b 0a  if( stddt==0 ){.
1cd20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1cd30 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72  rr,"Out of memor
1cd40 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  y.\n");.    exit
1cd50 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  (1);.  }..  /* B
1cd60 75 69 6c 64 20 61 20 68 61 73 68 20 74 61 62 6c  uild a hash tabl
1cd70 65 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20  e of datatypes. 
1cd80 54 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65  The ".dtnum" fie
1cd90 6c 64 20 6f 66 20 65 61 63 68 20 73 79 6d 62 6f  ld of each symbo
1cda0 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c 65 64  l.  ** is filled
1cdb0 20 69 6e 20 77 69 74 68 20 74 68 65 20 68 61 73   in with the has
1cdc0 68 20 69 6e 64 65 78 20 70 6c 75 73 20 31 2e 20  h index plus 1. 
1cdd0 20 41 20 22 2e 64 74 6e 75 6d 22 20 76 61 6c 75   A ".dtnum" valu
1cde0 65 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a 20 75  e of 0 is.  ** u
1cdf0 73 65 64 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c  sed for terminal
1ce00 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66 20 74 68   symbols.  If th
1ce10 65 72 65 20 69 73 20 6e 6f 20 25 64 65 66 61 75  ere is no %defau
1ce20 6c 74 5f 74 79 70 65 20 64 65 66 69 6e 65 64 20  lt_type defined 
1ce30 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69 73 20 61  then.  ** 0 is a
1ce40 6c 73 6f 20 75 73 65 64 20 61 73 20 74 68 65 20  lso used as the 
1ce50 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20 66 6f 72  .dtnum value for
1ce60 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68   nonterminals wh
1ce70 69 63 68 20 64 6f 20 6e 6f 74 20 73 70 65 63 69  ich do not speci
1ce80 66 79 0a 20 20 2a 2a 20 61 20 64 61 74 61 74 79  fy.  ** a dataty
1ce90 70 65 20 75 73 69 6e 67 20 74 68 65 20 25 74 79  pe using the %ty
1cea0 70 65 20 64 69 72 65 63 74 69 76 65 2e 0a 20 20  pe directive..  
1ceb0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1cec0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
1ced0 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
1cee0 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
1cef0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
1cf00 20 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 20     char *cp;.   
1cf10 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e 65   if( sp==lemp->e
1cf20 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 73  rrsym ){.      s
1cf30 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72 72 61 79  p->dtnum = array
1cf40 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20 20 63 6f  size+1;.      co
1cf50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1cf60 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21 3d    if( sp->type!=
1cf70 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 28  NONTERMINAL || (
1cf80 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20  sp->datatype==0 
1cf90 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65  && lemp->vartype
1cfa0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 70  ==0) ){.      sp
1cfb0 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  ->dtnum = 0;.   
1cfc0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1cfd0 20 7d 0a 20 20 20 20 63 70 20 3d 20 73 70 2d 3e   }.    cp = sp->
1cfe0 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20 69 66  datatype;.    if
1cff0 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20 6c  ( cp==0 ) cp = l
1d000 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b 0a 20 20  emp->vartype;.  
1d010 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77 68 69    j = 0;.    whi
1d020 6c 65 28 20 49 53 53 50 41 43 45 28 2a 63 70 29  le( ISSPACE(*cp)
1d030 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69   ) cp++;.    whi
1d040 6c 65 28 20 2a 63 70 20 29 20 73 74 64 64 74 5b  le( *cp ) stddt[
1d050 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20 20  j++] = *cp++;.  
1d060 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20    while( j>0 && 
1d070 49 53 53 50 41 43 45 28 73 74 64 64 74 5b 6a 2d  ISSPACE(stddt[j-
1d080 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 73  1]) ) j--;.    s
1d090 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  tddt[j] = 0;.   
1d0a0 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e   if( lemp->token
1d0b0 74 79 70 65 20 26 26 20 73 74 72 63 6d 70 28 73  type && strcmp(s
1d0c0 74 64 64 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b 65  tddt, lemp->toke
1d0d0 6e 74 79 70 65 29 3d 3d 30 20 29 7b 0a 20 20 20  ntype)==0 ){.   
1d0e0 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30     sp->dtnum = 0
1d0f0 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
1d100 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73 68  ;.    }.    hash
1d110 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 0;.    for(j=
1d120 30 3b 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b  0; stddt[j]; j++
1d130 29 7b 0a 20 20 20 20 20 20 68 61 73 68 20 3d 20  ){.      hash = 
1d140 68 61 73 68 2a 35 33 20 2b 20 73 74 64 64 74 5b  hash*53 + stddt[
1d150 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61  j];.    }.    ha
1d160 73 68 20 3d 20 28 68 61 73 68 20 26 20 30 78 37  sh = (hash & 0x7
1d170 66 66 66 66 66 66 66 29 25 61 72 72 61 79 73 69  fffffff)%arraysi
1d180 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 74  ze;.    while( t
1d190 79 70 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20 20  ypes[hash] ){.  
1d1a0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 74      if( strcmp(t
1d1b0 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74  ypes[hash],stddt
1d1c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1d1d0 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68  sp->dtnum = hash
1d1e0 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72   + 1;.        br
1d1f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1d200 20 20 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20 20     hash++;.     
1d210 20 69 66 28 20 68 61 73 68 3e 3d 28 75 6e 73 69   if( hash>=(unsi
1d220 67 6e 65 64 29 61 72 72 61 79 73 69 7a 65 20 29  gned)arraysize )
1d230 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 7d   hash = 0;.    }
1d240 0a 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 68  .    if( types[h
1d250 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ash]==0 ){.     
1d260 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73   sp->dtnum = has
1d270 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 74 79 70  h + 1;.      typ
1d280 65 73 5b 68 61 73 68 5d 20 3d 20 28 63 68 61 72  es[hash] = (char
1d290 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53  *)malloc( lemonS
1d2a0 74 72 6c 65 6e 28 73 74 64 64 74 29 2b 31 20 29  trlen(stddt)+1 )
1d2b0 3b 0a 20 20 20 20 20 20 69 66 28 20 74 79 70 65  ;.      if( type
1d2c0 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20  s[hash]==0 ){.  
1d2d0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
1d2e0 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d  derr,"Out of mem
1d2f0 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ory.\n");.      
1d300 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20    exit(1);.     
1d310 20 7d 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73   }.      lemon_s
1d320 74 72 63 70 79 28 74 79 70 65 73 5b 68 61 73 68  trcpy(types[hash
1d330 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20 20 7d 0a  ],stddt);.    }.
1d340 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74 20    }..  /* Print 
1d350 6f 75 74 20 74 68 65 20 64 65 66 69 6e 69 74 69  out the definiti
1d360 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54 59 50  on of YYTOKENTYP
1d370 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54 59 50  E and YYMINORTYP
1d380 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c 65  E */.  name = le
1d390 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d  mp->name ? lemp-
1d3a0 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b  >name : "Parse";
1d3b0 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69  .  lineno = *pli
1d3c0 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68 66 6c  neno;.  if( mhfl
1d3d0 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75  ag ){ fprintf(ou
1d3e0 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43 45  t,"#if INTERFACE
1d3f0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n"); lineno++; 
1d400 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1d410 22 23 64 65 66 69 6e 65 20 25 73 54 4f 4b 45 4e  "#define %sTOKEN
1d420 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d 65 2c  TYPE %s\n",name,
1d430 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  .    lemp->token
1d440 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  type?lemp->token
1d450 74 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b 20 20  type:"void*");  
1d460 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20  lineno++;.  if( 
1d470 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74  mhflag ){ fprint
1d480 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22  f(out,"#endif\n"
1d490 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20  ); lineno++; }. 
1d4a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 74 79   fprintf(out,"ty
1d4b0 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e 22  pedef union {\n"
1d4c0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1d4d0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e  printf(out,"  in
1d4e0 74 20 79 79 69 6e 69 74 3b 5c 6e 22 29 3b 20 6c  t yyinit;\n"); l
1d4f0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1d500 74 66 28 6f 75 74 2c 22 20 20 25 73 54 4f 4b 45  tf(out,"  %sTOKE
1d510 4e 54 59 50 45 20 79 79 30 3b 5c 6e 22 2c 6e 61  NTYPE yy0;\n",na
1d520 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
1d530 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61   for(i=0; i<arra
1d540 79 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  ysize; i++){.   
1d550 20 69 66 28 20 74 79 70 65 73 5b 69 5d 3d 3d 30   if( types[i]==0
1d560 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1d570 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1d580 25 73 20 79 79 25 64 3b 5c 6e 22 2c 74 79 70 65  %s yy%d;\n",type
1d590 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65 6e  s[i],i+1); linen
1d5a0 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 74 79  o++;.    free(ty
1d5b0 70 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69  pes[i]);.  }.  i
1d5c0 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  f( lemp->errsym-
1d5d0 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20 66  >useCnt ){.    f
1d5e0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e  printf(out,"  in
1d5f0 74 20 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70 2d  t yy%d;\n",lemp-
1d600 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b  >errsym->dtnum);
1d610 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1d620 20 66 72 65 65 28 73 74 64 64 74 29 3b 0a 20 20   free(stddt);.  
1d630 66 72 65 65 28 74 79 70 65 73 29 3b 0a 20 20 66  free(types);.  f
1d640 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20 59 59  printf(out,"} YY
1d650 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29 3b 20  MINORTYPE;\n"); 
1d660 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c 69  lineno++;.  *pli
1d670 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 7d  neno = lineno;.}
1d680 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1d690 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 43 20 64  he name of a C d
1d6a0 61 74 61 74 79 70 65 20 61 62 6c 65 20 74 6f 20  atatype able to 
1d6b0 72 65 70 72 65 73 65 6e 74 20 76 61 6c 75 65 73  represent values
1d6c0 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c 77 72 20   between.** lwr 
1d6d0 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c 75 73 69  and upr, inclusi
1d6e0 76 65 2e 20 20 49 66 20 70 6e 42 79 74 65 21 3d  ve.  If pnByte!=
1d6f0 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 73 6f 20 77  NULL then also w
1d700 72 69 74 65 20 74 68 65 20 73 69 7a 65 6f 66 0a  rite the sizeof.
1d710 2a 2a 20 66 6f 72 20 74 68 61 74 20 74 79 70 65  ** for that type
1d720 20 28 31 2c 20 32 2c 20 6f 72 20 34 29 20 69 6e   (1, 2, or 4) in
1d730 74 6f 20 2a 70 6e 42 79 74 65 2e 0a 2a 2f 0a 73  to *pnByte..*/.s
1d740 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1d750 20 2a 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74   *minimum_size_t
1d760 79 70 65 28 69 6e 74 20 6c 77 72 2c 20 69 6e 74  ype(int lwr, int
1d770 20 75 70 72 2c 20 69 6e 74 20 2a 70 6e 42 79 74   upr, int *pnByt
1d780 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  e){.  const char
1d790 20 2a 7a 54 79 70 65 20 3d 20 22 69 6e 74 22 3b   *zType = "int";
1d7a0 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 34  .  int nByte = 4
1d7b0 3b 0a 20 20 69 66 28 20 6c 77 72 3e 3d 30 20 29  ;.  if( lwr>=0 )
1d7c0 7b 0a 20 20 20 20 69 66 28 20 75 70 72 3c 3d 32  {.    if( upr<=2
1d7d0 35 35 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  55 ){.      zTyp
1d7e0 65 20 3d 20 22 75 6e 73 69 67 6e 65 64 20 63 68  e = "unsigned ch
1d7f0 61 72 22 3b 0a 20 20 20 20 20 20 6e 42 79 74 65  ar";.      nByte
1d800 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
1d810 69 66 28 20 75 70 72 3c 36 35 35 33 35 20 29 7b  if( upr<65535 ){
1d820 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
1d830 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69  unsigned short i
1d840 6e 74 22 3b 0a 20 20 20 20 20 20 6e 42 79 74 65  nt";.      nByte
1d850 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 2;.    }else{
1d860 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
1d870 75 6e 73 69 67 6e 65 64 20 69 6e 74 22 3b 0a 20  unsigned int";. 
1d880 20 20 20 20 20 6e 42 79 74 65 20 3d 20 34 3b 0a       nByte = 4;.
1d890 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1d8a0 28 20 6c 77 72 3e 3d 2d 31 32 37 20 26 26 20 75  ( lwr>=-127 && u
1d8b0 70 72 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 7a  pr<=127 ){.    z
1d8c0 54 79 70 65 20 3d 20 22 73 69 67 6e 65 64 20 63  Type = "signed c
1d8d0 68 61 72 22 3b 0a 20 20 20 20 6e 42 79 74 65 20  har";.    nByte 
1d8e0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
1d8f0 20 6c 77 72 3e 3d 2d 33 32 37 36 37 20 26 26 20   lwr>=-32767 && 
1d900 75 70 72 3c 33 32 37 36 37 20 29 7b 0a 20 20 20  upr<32767 ){.   
1d910 20 7a 54 79 70 65 20 3d 20 22 73 68 6f 72 74 22   zType = "short"
1d920 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 32 3b  ;.    nByte = 2;
1d930 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e 42 79 74  .  }.  if( pnByt
1d940 65 20 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e 42  e ) *pnByte = nB
1d950 79 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54  yte;.  return zT
1d960 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61  ype;.}../*.** Ea
1d970 63 68 20 73 74 61 74 65 20 63 6f 6e 74 61 69 6e  ch state contain
1d980 73 20 61 20 73 65 74 20 6f 66 20 74 6f 6b 65 6e  s a set of token
1d990 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
1d9a0 20 61 20 73 65 74 20 6f 66 0a 2a 2a 20 6e 6f 6e   a set of.** non
1d9b0 74 65 72 6d 69 6e 61 6c 20 74 72 61 6e 73 61 63  terminal transac
1d9c0 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 6f 66 20  tions.  Each of 
1d9d0 74 68 65 73 65 20 73 65 74 73 20 6d 61 6b 65 73  these sets makes
1d9e0 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20   an instance.** 
1d9f0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1da00 20 73 74 72 75 63 74 75 72 65 2e 20 20 41 6e 20   structure.  An 
1da10 61 72 72 61 79 20 6f 66 20 74 68 65 73 65 20 73  array of these s
1da20 74 72 75 63 74 75 72 65 73 20 69 73 20 75 73 65  tructures is use
1da30 64 0a 2a 2a 20 74 6f 20 6f 72 64 65 72 20 74 68  d.** to order th
1da40 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 65 6e  e creation of en
1da50 74 72 69 65 73 20 69 6e 20 74 68 65 20 79 79 5f  tries in the yy_
1da60 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a  action[] table..
1da70 2a 2f 0a 73 74 72 75 63 74 20 61 78 73 65 74 20  */.struct axset 
1da80 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
1da90 20 2a 73 74 70 3b 20 20 20 2f 2a 20 41 20 70 6f   *stp;   /* A po
1daa0 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 65  inter to a state
1dab0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 6b 6e 3b   */.  int isTkn;
1dac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1dad0 75 65 20 74 6f 20 75 73 65 20 74 6f 6b 65 6e 73  ue to use tokens
1dae0 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6e 6f 6e  .  False for non
1daf0 2d 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20  -terminals */.  
1db00 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20 20 20  int nAction;    
1db10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1db20 66 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  f actions */.  i
1db30 6e 74 20 69 4f 72 64 65 72 3b 20 20 20 20 20 20  nt iOrder;      
1db40 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
1db50 6f 72 64 65 72 20 6f 66 20 61 63 74 69 6f 6e 20  order of action 
1db60 73 65 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  sets */.};../*.*
1db70 2a 20 43 6f 6d 70 61 72 65 20 74 6f 20 61 78 73  * Compare to axs
1db80 65 74 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  et structures fo
1db90 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73  r sorting purpos
1dba0 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
1dbb0 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 28 63   axset_compare(c
1dbc0 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f  onst void *a, co
1dbd0 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20  nst void *b){.  
1dbe0 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 70 31  struct axset *p1
1dbf0 20 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74   = (struct axset
1dc00 2a 29 61 3b 0a 20 20 73 74 72 75 63 74 20 61 78  *)a;.  struct ax
1dc10 73 65 74 20 2a 70 32 20 3d 20 28 73 74 72 75 63  set *p2 = (struc
1dc20 74 20 61 78 73 65 74 2a 29 62 3b 0a 20 20 69 6e  t axset*)b;.  in
1dc30 74 20 63 3b 0a 20 20 63 20 3d 20 70 32 2d 3e 6e  t c;.  c = p2->n
1dc40 41 63 74 69 6f 6e 20 2d 20 70 31 2d 3e 6e 41 63  Action - p1->nAc
1dc50 74 69 6f 6e 3b 0a 20 20 69 66 28 20 63 3d 3d 30  tion;.  if( c==0
1dc60 20 29 7b 0a 20 20 20 20 63 20 3d 20 70 31 2d 3e   ){.    c = p1->
1dc70 69 4f 72 64 65 72 20 2d 20 70 32 2d 3e 69 4f 72  iOrder - p2->iOr
1dc80 64 65 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  der;.  }.  asser
1dc90 74 28 20 63 21 3d 30 20 7c 7c 20 70 31 3d 3d 70  t( c!=0 || p1==p
1dca0 32 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b  2 );.  return c;
1dcb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
1dcc0 74 65 78 74 20 6f 6e 20 22 6f 75 74 22 20 74 68  text on "out" th
1dcd0 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
1dce0 20 72 75 6c 65 20 22 72 70 22 2e 0a 2a 2f 0a 73   rule "rp"..*/.s
1dcf0 74 61 74 69 63 20 76 6f 69 64 20 77 72 69 74 65  tatic void write
1dd00 52 75 6c 65 54 65 78 74 28 46 49 4c 45 20 2a 6f  RuleText(FILE *o
1dd10 75 74 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20  ut, struct rule 
1dd20 2a 72 70 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20  *rp){.  int j;. 
1dd30 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73   fprintf(out,"%s
1dd40 20 3a 3a 3d 22 2c 20 72 70 2d 3e 6c 68 73 2d 3e   ::=", rp->lhs->
1dd50 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 6a 3d 30  name);.  for(j=0
1dd60 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b 20 6a 2b  ; j<rp->nrhs; j+
1dd70 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73  +){.    struct s
1dd80 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e  ymbol *sp = rp->
1dd90 72 68 73 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  rhs[j];.    if( 
1dda0 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54  sp->type!=MULTIT
1ddb0 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
1ddc0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25   fprintf(out," %
1ddd0 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  s", sp->name);. 
1dde0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ddf0 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 66 70 72  int k;.      fpr
1de00 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 20  intf(out," %s", 
1de10 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e  sp->subsym[0]->n
1de20 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
1de30 6b 3d 31 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62 73  k=1; k<sp->nsubs
1de40 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  ym; k++){.      
1de50 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c    fprintf(out,"|
1de60 25 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6b  %s",sp->subsym[k
1de70 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
1de80 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  }.    }.  }.}...
1de90 2f 2a 20 47 65 6e 65 72 61 74 65 20 43 20 73 6f  /* Generate C so
1dea0 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68  urce code for th
1deb0 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64  e parser */.void
1dec0 20 52 65 70 6f 72 74 54 61 62 6c 65 28 0a 20 20   ReportTable(.  
1ded0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
1dee0 6d 70 2c 0a 20 20 69 6e 74 20 6d 68 66 6c 61 67  mp,.  int mhflag
1def0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 69       /* Output i
1df00 6e 20 6d 61 6b 65 68 65 61 64 65 72 73 20 66 6f  n makeheaders fo
1df10 72 6d 61 74 20 69 66 20 74 72 75 65 20 2a 2f 0a  rmat if true */.
1df20 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20  ){.  FILE *out, 
1df30 2a 69 6e 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65  *in;.  char line
1df40 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e  [LINESIZE];.  in
1df50 74 20 20 6c 69 6e 65 6e 6f 3b 0a 20 20 73 74 72  t  lineno;.  str
1df60 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
1df70 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
1df80 2a 61 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75  *ap;.  struct ru
1df90 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74  le *rp;.  struct
1dfa0 20 61 63 74 74 61 62 20 2a 70 41 63 74 74 61 62   acttab *pActtab
1dfb0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 2c  ;.  int i, j, n,
1dfc0 20 73 7a 3b 0a 20 20 69 6e 74 20 73 7a 41 63 74   sz;.  int szAct
1dfd0 69 6f 6e 54 79 70 65 3b 20 20 20 20 20 2f 2a 20  ionType;     /* 
1dfe0 73 69 7a 65 6f 66 28 59 59 41 43 54 49 4f 4e 54  sizeof(YYACTIONT
1dff0 59 50 45 29 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  YPE) */.  int sz
1e000 43 6f 64 65 54 79 70 65 3b 20 20 20 20 20 20 20  CodeType;       
1e010 2f 2a 20 73 69 7a 65 6f 66 28 59 59 43 4f 44 45  /* sizeof(YYCODE
1e020 54 59 50 45 29 20 20 20 2a 2f 0a 20 20 63 6f 6e  TYPE)   */.  con
1e030 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20  st char *name;. 
1e040 20 69 6e 74 20 6d 6e 54 6b 6e 4f 66 73 74 2c 20   int mnTknOfst, 
1e050 6d 78 54 6b 6e 4f 66 73 74 3b 0a 20 20 69 6e 74  mxTknOfst;.  int
1e060 20 6d 6e 4e 74 4f 66 73 74 2c 20 6d 78 4e 74 4f   mnNtOfst, mxNtO
1e070 66 73 74 3b 0a 20 20 73 74 72 75 63 74 20 61 78  fst;.  struct ax
1e080 73 65 74 20 2a 61 78 3b 0a 0a 20 20 69 6e 20 3d  set *ax;..  in =
1e090 20 74 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d 70 29   tplt_open(lemp)
1e0a0 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20  ;.  if( in==0 ) 
1e0b0 72 65 74 75 72 6e 3b 0a 20 20 6f 75 74 20 3d 20  return;.  out = 
1e0c0 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22  file_open(lemp,"
1e0d0 2e 63 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28  .c","wb");.  if(
1e0e0 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66   out==0 ){.    f
1e0f0 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 72  close(in);.    r
1e100 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c 69 6e  eturn;.  }.  lin
1e110 65 6e 6f 20 3d 20 31 3b 0a 20 20 74 70 6c 74 5f  eno = 1;.  tplt_
1e120 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1e130 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1e140 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1e150 74 68 65 20 69 6e 63 6c 75 64 65 20 63 6f 64 65  the include code
1e160 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 74 70  , if any */.  tp
1e170 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
1e180 70 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64 65 2c  p,lemp->include,
1e190 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 69 66 28 20  &lineno);.  if( 
1e1a0 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 68  mhflag ){.    ch
1e1b0 61 72 20 2a 69 6e 63 4e 61 6d 65 20 3d 20 66 69  ar *incName = fi
1e1c0 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70  le_makename(lemp
1e1d0 2c 20 22 2e 68 22 29 3b 0a 20 20 20 20 66 70 72  , ".h");.    fpr
1e1e0 69 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63 6c 75  intf(out,"#inclu
1e1f0 64 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 69 6e  de \"%s\"\n", in
1e200 63 4e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  cName); lineno++
1e210 3b 0a 20 20 20 20 66 72 65 65 28 69 6e 63 4e 61  ;.    free(incNa
1e220 6d 65 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  me);.  }.  tplt_
1e230 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1e240 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1e250 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1e260 23 64 65 66 69 6e 65 73 20 66 6f 72 20 61 6c 6c  #defines for all
1e270 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66 28   tokens */.  if(
1e280 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63   mhflag ){.    c
1e290 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 65 66 69  onst char *prefi
1e2a0 78 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  x;.    fprintf(o
1e2b0 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
1e2c0 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
1e2d0 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74  .    if( lemp->t
1e2e0 6f 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72 65  okenprefix ) pre
1e2f0 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65  fix = lemp->toke
1e300 6e 70 72 65 66 69 78 3b 0a 20 20 20 20 65 6c 73  nprefix;.    els
1e310 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1e320 20 20 20 20 20 70 72 65 66 69 78 20 3d 20 22 22       prefix = ""
1e330 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
1e340 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
1e350 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70  ; i++){.      fp
1e360 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1e370 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e  ne %s%-30s %2d\n
1e380 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73  ",prefix,lemp->s
1e390 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c  ymbols[i]->name,
1e3a0 69 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f  i);.      lineno
1e3b0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  ++;.    }.    fp
1e3c0 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69  rintf(out,"#endi
1e3d0 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  f\n"); lineno++;
1e3e0 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1e3f0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1e400 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1e410 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
1e420 64 65 66 69 6e 65 73 20 2a 2f 0a 20 20 66 70 72  defines */.  fpr
1e430 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1e440 65 20 59 59 43 4f 44 45 54 59 50 45 20 25 73 5c  e YYCODETYPE %s\
1e450 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f  n",.    minimum_
1e460 73 69 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d  size_type(0, lem
1e470 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 2c 20 26 73  p->nsymbol+1, &s
1e480 7a 43 6f 64 65 54 79 70 65 29 29 3b 20 6c 69 6e  zCodeType)); lin
1e490 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1e4a0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1e4b0 4e 4f 43 4f 44 45 20 25 64 5c 6e 22 2c 6c 65 6d  NOCODE %d\n",lem
1e4c0 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 29 3b 20 20  p->nsymbol+1);  
1e4d0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1e4e0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1e4f0 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 25 73   YYACTIONTYPE %s
1e500 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d  \n",.    minimum
1e510 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c 6c 65 6d  _size_type(0,lem
1e520 70 2d 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e  p->nstate+lemp->
1e530 6e 72 75 6c 65 2a 32 2b 35 2c 26 73 7a 41 63 74  nrule*2+5,&szAct
1e540 69 6f 6e 54 79 70 65 29 29 3b 20 6c 69 6e 65 6e  ionType)); linen
1e550 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  o++;.  if( lemp-
1e560 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20  >wildcard ){.   
1e570 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1e580 65 66 69 6e 65 20 59 59 57 49 4c 44 43 41 52 44  efine YYWILDCARD
1e590 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6c   %d\n",.       l
1e5a0 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 2d 3e 69  emp->wildcard->i
1e5b0 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ndex); lineno++;
1e5c0 0a 20 20 7d 0a 20 20 70 72 69 6e 74 5f 73 74 61  .  }.  print_sta
1e5d0 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d  ck_union(out,lem
1e5e0 70 2c 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67  p,&lineno,mhflag
1e5f0 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  );.  fprintf(out
1e600 2c 20 22 23 69 66 6e 64 65 66 20 59 59 53 54 41  , "#ifndef YYSTA
1e610 43 4b 44 45 50 54 48 5c 6e 22 29 3b 20 6c 69 6e  CKDEPTH\n"); lin
1e620 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d  eno++;.  if( lem
1e630 70 2d 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a  p->stacksize ){.
1e640 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1e650 22 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b  "#define YYSTACK
1e660 44 45 50 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70  DEPTH %s\n",lemp
1e670 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c  ->stacksize);  l
1e680 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65  ineno++;.  }else
1e690 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1e6a0 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54 41  t,"#define YYSTA
1e6b0 43 4b 44 45 50 54 48 20 31 30 30 5c 6e 22 29 3b  CKDEPTH 100\n");
1e6c0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a    lineno++;.  }.
1e6d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1e6e0 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65  #endif\n"); line
1e6f0 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c  no++;.  if( mhfl
1e700 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  ag ){.    fprint
1e710 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52  f(out,"#if INTER
1e720 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  FACE\n"); lineno
1e730 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d  ++;.  }.  name =
1e740 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65   lemp->name ? le
1e750 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73  mp->name : "Pars
1e760 65 22 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  e";.  if( lemp->
1e770 61 72 67 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67  arg && lemp->arg
1e780 5b 30 5d 20 29 7b 0a 20 20 20 20 69 20 3d 20 6c  [0] ){.    i = l
1e790 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d  emonStrlen(lemp-
1e7a0 3e 61 72 67 29 3b 0a 20 20 20 20 77 68 69 6c 65  >arg);.    while
1e7b0 28 20 69 3e 3d 31 20 26 26 20 49 53 53 50 41 43  ( i>=1 && ISSPAC
1e7c0 45 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d  E(lemp->arg[i-1]
1e7d0 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 77 68 69  ) ) i--;.    whi
1e7e0 6c 65 28 20 69 3e 3d 31 20 26 26 20 28 49 53 41  le( i>=1 && (ISA
1e7f0 4c 4e 55 4d 28 6c 65 6d 70 2d 3e 61 72 67 5b 69  LNUM(lemp->arg[i
1e800 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d 3e 61 72  -1]) || lemp->ar
1e810 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20 29 20 69  g[i-1]=='_') ) i
1e820 2d 2d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  --;.    fprintf(
1e830 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1e840 52 47 5f 53 44 45 43 4c 20 25 73 3b 5c 6e 22 2c  RG_SDECL %s;\n",
1e850 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b  name,lemp->arg);
1e860 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
1e870 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1e880 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43 4c  fine %sARG_PDECL
1e890 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d   ,%s\n",name,lem
1e8a0 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f  p->arg);  lineno
1e8b0 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1e8c0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1e8d0 52 47 5f 46 45 54 43 48 20 25 73 20 3d 20 79 79  RG_FETCH %s = yy
1e8e0 70 50 61 72 73 65 72 2d 3e 25 73 5c 6e 22 2c 0a  pParser->%s\n",.
1e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e900 20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 2c   name,lemp->arg,
1e910 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20  &lemp->arg[i]); 
1e920 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1e930 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1e940 69 6e 65 20 25 73 41 52 47 5f 53 54 4f 52 45 20  ine %sARG_STORE 
1e950 79 79 70 50 61 72 73 65 72 2d 3e 25 73 20 3d 20  yypParser->%s = 
1e960 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1e970 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 26 6c 65          name,&le
1e980 6d 70 2d 3e 61 72 67 5b 69 5d 2c 26 6c 65 6d 70  mp->arg[i],&lemp
1e990 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65  ->arg[i]);  line
1e9a0 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no++;.  }else{. 
1e9b0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1e9c0 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44  #define %sARG_SD
1e9d0 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c  ECL\n",name);  l
1e9e0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
1e9f0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1ea00 65 20 25 73 41 52 47 5f 50 44 45 43 4c 5c 6e 22  e %sARG_PDECL\n"
1ea10 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ,name);  lineno+
1ea20 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
1ea30 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1ea40 47 5f 46 45 54 43 48 5c 6e 22 2c 6e 61 6d 65 29  G_FETCH\n",name)
1ea50 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1ea60 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1ea70 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f 52 45  fine %sARG_STORE
1ea80 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  \n",name); linen
1ea90 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  o++;.  }.  if( m
1eaa0 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 66 70 72  hflag ){.    fpr
1eab0 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66  intf(out,"#endif
1eac0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1ead0 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e    }.  if( lemp->
1eae0 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20 29  errsym->useCnt )
1eaf0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1eb00 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52 52  t,"#define YYERR
1eb10 4f 52 53 59 4d 42 4f 4c 20 25 64 5c 6e 22 2c 6c  ORSYMBOL %d\n",l
1eb20 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 69 6e 64  emp->errsym->ind
1eb30 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ex); lineno++;. 
1eb40 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1eb50 23 64 65 66 69 6e 65 20 59 59 45 52 52 53 59 4d  #define YYERRSYM
1eb60 44 54 20 79 79 25 64 5c 6e 22 2c 6c 65 6d 70 2d  DT yy%d\n",lemp-
1eb70 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b  >errsym->dtnum);
1eb80 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1eb90 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66   if( lemp->has_f
1eba0 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66  allback ){.    f
1ebb0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1ebc0 69 6e 65 20 59 59 46 41 4c 4c 42 41 43 4b 20 31  ine YYFALLBACK 1
1ebd0 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  \n");  lineno++;
1ebe0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
1ebf0 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  te the action ta
1ec00 62 6c 65 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  ble, but do not 
1ec10 6f 75 74 70 75 74 20 69 74 20 79 65 74 2e 20 20  output it yet.  
1ec20 54 68 65 20 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  The action.  ** 
1ec30 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 63 6f  table must be co
1ec40 6d 70 75 74 65 64 20 62 65 66 6f 72 65 20 67 65  mputed before ge
1ec50 6e 65 72 61 74 69 6e 67 20 74 68 65 20 59 59 4e  nerating the YYN
1ec60 53 54 41 54 45 20 6d 61 63 72 6f 20 62 65 63 61  STATE macro beca
1ec70 75 73 65 0a 20 20 2a 2a 20 77 65 20 6e 65 65 64  use.  ** we need
1ec80 20 74 6f 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e   to know how man
1ec90 79 20 73 74 61 74 65 73 20 63 61 6e 20 62 65 20  y states can be 
1eca0 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 20 20 2a 2f  eliminated..  */
1ecb0 0a 20 20 61 78 20 3d 20 28 73 74 72 75 63 74 20  .  ax = (struct 
1ecc0 61 78 73 65 74 20 2a 29 20 63 61 6c 6c 6f 63 28  axset *) calloc(
1ecd0 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2a 32 2c  lemp->nxstate*2,
1ece0 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 29 3b   sizeof(ax[0]));
1ecf0 0a 20 20 69 66 28 20 61 78 3d 3d 30 20 29 7b 0a  .  if( ax==0 ){.
1ed00 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1ed10 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  rr,"malloc faile
1ed20 64 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  d\n");.    exit(
1ed30 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  1);.  }.  for(i=
1ed40 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61  0; i<lemp->nxsta
1ed50 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
1ed60 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
1ed70 5b 69 5d 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d  [i];.    ax[i*2]
1ed80 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20  .stp = stp;.    
1ed90 61 78 5b 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d 20  ax[i*2].isTkn = 
1eda0 31 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 6e  1;.    ax[i*2].n
1edb0 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 54  Action = stp->nT
1edc0 6b 6e 41 63 74 3b 0a 20 20 20 20 61 78 5b 69 2a  knAct;.    ax[i*
1edd0 32 2b 31 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a  2+1].stp = stp;.
1ede0 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 69 73      ax[i*2+1].is
1edf0 54 6b 6e 20 3d 20 30 3b 0a 20 20 20 20 61 78 5b  Tkn = 0;.    ax[
1ee00 69 2a 32 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20 3d  i*2+1].nAction =
1ee10 20 73 74 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20   stp->nNtAct;.  
1ee20 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20  }.  mxTknOfst = 
1ee30 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a 20  mnTknOfst = 0;. 
1ee40 20 6d 78 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e 74   mxNtOfst = mnNt
1ee50 4f 66 73 74 20 3d 20 30 3b 0a 20 20 2f 2a 20 49  Ofst = 0;.  /* I
1ee60 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6d  n an effort to m
1ee70 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 63 74 69  inimize the acti
1ee80 6f 6e 20 74 61 62 6c 65 20 73 69 7a 65 2c 20 75  on table size, u
1ee90 73 65 20 74 68 65 20 68 65 75 72 69 73 74 69 63  se the heuristic
1eea0 0a 20 20 2a 2a 20 6f 66 20 70 6c 61 63 69 6e 67  .  ** of placing
1eeb0 20 74 68 65 20 6c 61 72 67 65 73 74 20 61 63 74   the largest act
1eec0 69 6f 6e 20 73 65 74 73 20 66 69 72 73 74 20 2a  ion sets first *
1eed0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
1eee0 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2a 32 3b 20  emp->nxstate*2; 
1eef0 69 2b 2b 29 20 61 78 5b 69 5d 2e 69 4f 72 64 65  i++) ax[i].iOrde
1ef00 72 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74 28 61  r = i;.  qsort(a
1ef10 78 2c 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65  x, lemp->nxstate
1ef20 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d  *2, sizeof(ax[0]
1ef30 29 2c 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65  ), axset_compare
1ef40 29 3b 0a 20 20 70 41 63 74 74 61 62 20 3d 20 61  );.  pActtab = a
1ef50 63 74 74 61 62 5f 61 6c 6c 6f 63 28 29 3b 0a 20  cttab_alloc();. 
1ef60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1ef70 2d 3e 6e 78 73 74 61 74 65 2a 32 20 26 26 20 61  ->nxstate*2 && a
1ef80 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 3e 30 3b 20  x[i].nAction>0; 
1ef90 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
1efa0 61 78 5b 69 5d 2e 73 74 70 3b 0a 20 20 20 20 69  ax[i].stp;.    i
1efb0 66 28 20 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 29  f( ax[i].isTkn )
1efc0 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73  {.      for(ap=s
1efd0 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
1efe0 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
1eff0 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20    int action;.  
1f000 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70        if( ap->sp
1f010 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d 70 2d 3e 6e  ->index>=lemp->n
1f020 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69  terminal ) conti
1f030 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74  nue;.        act
1f040 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63  ion = compute_ac
1f050 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a  tion(lemp, ap);.
1f060 20 20 20 20 20 20 20 20 69 66 28 20 61 63 74 69          if( acti
1f070 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  on<0 ) continue;
1f080 0a 20 20 20 20 20 20 20 20 61 63 74 74 61 62 5f  .        acttab_
1f090 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20  action(pActtab, 
1f0a0 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61  ap->sp->index, a
1f0b0 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ction);.      }.
1f0c0 20 20 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f        stp->iTknO
1f0d0 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69 6e 73  fst = acttab_ins
1f0e0 65 72 74 28 70 41 63 74 74 61 62 29 3b 0a 20 20  ert(pActtab);.  
1f0f0 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 54 6b      if( stp->iTk
1f100 6e 4f 66 73 74 3c 6d 6e 54 6b 6e 4f 66 73 74 20  nOfst<mnTknOfst 
1f110 29 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 73 74  ) mnTknOfst = st
1f120 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20  p->iTknOfst;.   
1f130 20 20 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e     if( stp->iTkn
1f140 4f 66 73 74 3e 6d 78 54 6b 6e 4f 66 73 74 20 29  Ofst>mxTknOfst )
1f150 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70   mxTknOfst = stp
1f160 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20  ->iTknOfst;.    
1f170 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72  }else{.      for
1f180 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
1f190 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
1f1a0 20 20 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f         int actio
1f1b0 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  n;.        if( a
1f1c0 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d  p->sp->index<lem
1f1d0 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63  p->nterminal ) c
1f1e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1f1f0 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
1f200 65 78 3d 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ex==lemp->nsymbo
1f210 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
1f220 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20 63        action = c
1f230 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
1f240 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20  mp, ap);.       
1f250 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20   if( action<0 ) 
1f260 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1f270 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28    acttab_action(
1f280 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d  pActtab, ap->sp-
1f290 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b  >index, action);
1f2a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1f2b0 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 61 63  tp->iNtOfst = ac
1f2c0 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41 63 74  ttab_insert(pAct
1f2d0 74 61 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tab);.      if( 
1f2e0 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e 4e  stp->iNtOfst<mnN
1f2f0 74 4f 66 73 74 20 29 20 6d 6e 4e 74 4f 66 73 74  tOfst ) mnNtOfst
1f300 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b   = stp->iNtOfst;
1f310 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e  .      if( stp->
1f320 69 4e 74 4f 66 73 74 3e 6d 78 4e 74 4f 66 73 74  iNtOfst>mxNtOfst
1f330 20 29 20 6d 78 4e 74 4f 66 73 74 20 3d 20 73 74   ) mxNtOfst = st
1f340 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20  p->iNtOfst;.    
1f350 7d 0a 23 69 66 20 30 20 20 2f 2a 20 55 6e 63 6f  }.#if 0  /* Unco
1f360 6d 6d 65 6e 74 20 66 6f 72 20 61 20 74 72 61 63  mment for a trac
1f370 65 20 6f 66 20 68 6f 77 20 74 68 65 20 79 79 5f  e of how the yy_
1f380 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 66  action[] table f
1f390 69 6c 6c 73 20 6f 75 74 20 2a 2f 0a 20 20 20 20  ills out */.    
1f3a0 7b 20 69 6e 74 20 6a 6a 2c 20 6e 6e 3b 0a 20 20  { int jj, nn;.  
1f3b0 20 20 20 20 66 6f 72 28 6a 6a 3d 6e 6e 3d 30 3b      for(jj=nn=0;
1f3c0 20 6a 6a 3c 70 41 63 74 74 61 62 2d 3e 6e 41 63   jj<pActtab->nAc
1f3d0 74 69 6f 6e 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20  tion; jj++){.   
1f3e0 20 20 20 20 20 69 66 28 20 70 41 63 74 74 61 62       if( pActtab
1f3f0 2d 3e 61 41 63 74 69 6f 6e 5b 6a 6a 5d 2e 61 63  ->aAction[jj].ac
1f400 74 69 6f 6e 3c 30 20 29 20 6e 6e 2b 2b 3b 0a 20  tion<0 ) nn++;. 
1f410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69       }.      pri
1f420 6e 74 66 28 22 25 34 64 3a 20 53 74 61 74 65 20  ntf("%4d: State 
1f430 25 33 64 20 25 73 20 6e 3a 20 25 32 64 20 73 69  %3d %s n: %2d si
1f440 7a 65 3a 20 25 35 64 20 66 72 65 65 73 70 61 63  ze: %5d freespac
1f450 65 3a 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  e: %d\n",.      
1f460 20 20 20 20 20 20 20 69 2c 20 73 74 70 2d 3e 73         i, stp->s
1f470 74 61 74 65 6e 75 6d 2c 20 61 78 5b 69 5d 2e 69  tatenum, ax[i].i
1f480 73 54 6b 6e 20 3f 20 22 54 6f 6b 65 6e 22 20 3a  sTkn ? "Token" :
1f490 20 22 56 61 72 20 20 22 2c 0a 20 20 20 20 20 20   "Var  ",.      
1f4a0 20 20 20 20 20 20 20 61 78 5b 69 5d 2e 6e 41 63         ax[i].nAc
1f4b0 74 69 6f 6e 2c 20 70 41 63 74 74 61 62 2d 3e 6e  tion, pActtab->n
1f4c0 41 63 74 69 6f 6e 2c 20 6e 6e 29 3b 0a 20 20 20  Action, nn);.   
1f4d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
1f4e0 66 72 65 65 28 61 78 29 3b 0a 0a 20 20 2f 2a 20  free(ax);..  /* 
1f4f0 46 69 6e 69 73 68 20 72 65 6e 64 65 72 69 6e 67  Finish rendering
1f500 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 73 20 6e   the constants n
1f510 6f 77 20 74 68 61 74 20 74 68 65 20 61 63 74 69  ow that the acti
1f520 6f 6e 20 74 61 62 6c 65 20 68 61 73 0a 20 20 2a  on table has.  *
1f530 2a 20 62 65 65 6e 20 63 6f 6d 70 75 74 65 64 20  * been computed 
1f540 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
1f550 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 53 54 41  ,"#define YYNSTA
1f560 54 45 20 20 20 20 20 20 20 20 20 20 20 20 20 25  TE             %
1f570 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 78 73 74 61  d\n",lemp->nxsta
1f580 74 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  te);  lineno++;.
1f590 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1f5a0 64 65 66 69 6e 65 20 59 59 4e 52 55 4c 45 20 20  define YYNRULE  
1f5b0 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
1f5c0 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20  ",lemp->nrule); 
1f5d0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1f5e0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1f5f0 65 20 59 59 5f 4d 41 58 5f 53 48 49 46 54 20 20  e YY_MAX_SHIFT  
1f600 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 6c 65 6d         %d\n",lem
1f610 70 2d 3e 6e 78 73 74 61 74 65 2d 31 29 3b 20 6c  p->nxstate-1); l
1f620 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1f630 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1f640 59 59 5f 4d 49 4e 5f 53 48 49 46 54 52 45 44 55  YY_MIN_SHIFTREDU
1f650 43 45 20 20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d  CE   %d\n",lemp-
1f660 3e 6e 73 74 61 74 65 29 3b 20 6c 69 6e 65 6e 6f  >nstate); lineno
1f670 2b 2b 3b 0a 20 20 69 20 3d 20 6c 65 6d 70 2d 3e  ++;.  i = lemp->
1f680 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e  nstate + lemp->n
1f690 72 75 6c 65 3b 0a 20 20 66 70 72 69 6e 74 66 28  rule;.  fprintf(
1f6a0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f  out,"#define YY_
1f6b0 4d 41 58 5f 53 48 49 46 54 52 45 44 55 43 45 20  MAX_SHIFTREDUCE 
1f6c0 20 20 25 64 5c 6e 22 2c 20 69 2d 31 29 3b 20 6c    %d\n", i-1); l
1f6d0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1f6e0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1f6f0 59 59 5f 4d 49 4e 5f 52 45 44 55 43 45 20 20 20  YY_MIN_REDUCE   
1f700 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 29 3b 20       %d\n", i); 
1f710 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 20 3d 20  lineno++;.  i = 
1f720 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c  lemp->nstate + l
1f730 65 6d 70 2d 3e 6e 72 75 6c 65 2a 32 3b 0a 20 20  emp->nrule*2;.  
1f740 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1f750 66 69 6e 65 20 59 59 5f 4d 41 58 5f 52 45 44 55  fine YY_MAX_REDU
1f760 43 45 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c  CE        %d\n",
1f770 20 69 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b   i-1); lineno++;
1f780 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1f790 23 64 65 66 69 6e 65 20 59 59 5f 45 52 52 4f 52  #define YY_ERROR
1f7a0 5f 41 43 54 49 4f 4e 20 20 20 20 20 20 25 64 5c  _ACTION      %d\
1f7b0 6e 22 2c 20 69 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  n", i); lineno++
1f7c0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1f7d0 22 23 64 65 66 69 6e 65 20 59 59 5f 41 43 43 45  "#define YY_ACCE
1f7e0 50 54 5f 41 43 54 49 4f 4e 20 20 20 20 20 25 64  PT_ACTION     %d
1f7f0 5c 6e 22 2c 20 69 2b 31 29 3b 20 6c 69 6e 65 6e  \n", i+1); linen
1f800 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1f810 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4e  ut,"#define YY_N
1f820 4f 5f 41 43 54 49 4f 4e 20 20 20 20 20 20 20 20  O_ACTION        
1f830 20 25 64 5c 6e 22 2c 20 69 2b 32 29 3b 20 6c 69   %d\n", i+2); li
1f840 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78  neno++;.  tplt_x
1f850 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1f860 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1f870 0a 20 20 2f 2a 20 4e 6f 77 20 6f 75 74 70 75 74  .  /* Now output
1f880 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
1f890 65 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63 69  e and its associ
1f8a0 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ates:.  **.  ** 
1f8b0 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20 20 20   yy_action[]    
1f8c0 20 20 20 20 41 20 73 69 6e 67 6c 65 20 74 61 62      A single tab
1f8d0 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c  le containing al
1f8e0 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20  l actions..  ** 
1f8f0 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20   yy_lookahead[] 
1f900 20 20 20 20 41 20 74 61 62 6c 65 20 63 6f 6e 74      A table cont
1f910 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 6b 61  aining the looka
1f920 68 65 61 64 20 66 6f 72 20 65 61 63 68 20 65 6e  head for each en
1f930 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20 20 20 20  try in.  **     
1f940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f950 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73 65 64  yy_action.  Used
1f960 20 74 6f 20 64 65 74 65 63 74 20 68 61 73 68 20   to detect hash 
1f970 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2a  collisions..  **
1f980 20 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b    yy_shift_ofst[
1f990 5d 20 20 20 20 46 6f 72 20 65 61 63 68 20 73 74  ]    For each st
1f9a0 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74 20  ate, the offset 
1f9b0 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66  into yy_action f
1f9c0 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  or.  **         
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 73 68 69 66              shif
1f9e0 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c 73 2e 0a  ting terminals..
1f9f0 20 20 2a 2a 20 20 79 79 5f 72 65 64 75 63 65 5f    **  yy_reduce_
1fa00 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20 65 61 63  ofst[]   For eac
1fa10 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66  h state, the off
1fa20 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69  set into yy_acti
1fa30 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20  on for.  **     
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d 74 65 72  shifting non-ter
1fa60 6d 69 6e 61 6c 73 20 61 66 74 65 72 20 61 20 72  minals after a r
1fa70 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20 79 79 5f  educe..  **  yy_
1fa80 64 65 66 61 75 6c 74 5b 5d 20 20 20 20 20 20 20  default[]       
1fa90 44 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 66  Default action f
1faa0 6f 72 20 65 61 63 68 20 73 74 61 74 65 2e 0a 20  or each state.. 
1fab0 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
1fac0 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74   the yy_action t
1fad0 61 62 6c 65 20 2a 2f 0a 20 20 6c 65 6d 70 2d 3e  able */.  lemp->
1fae0 6e 61 63 74 69 6f 6e 74 61 62 20 3d 20 6e 20 3d  nactiontab = n =
1faf0 20 61 63 74 74 61 62 5f 73 69 7a 65 28 70 41 63   acttab_size(pAc
1fb00 74 74 61 62 29 3b 0a 20 20 6c 65 6d 70 2d 3e 74  ttab);.  lemp->t
1fb10 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a  ablesize += n*sz
1fb20 41 63 74 69 6f 6e 54 79 70 65 3b 0a 20 20 66 70  ActionType;.  fp
1fb30 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1fb40 6e 65 20 59 59 5f 41 43 54 54 41 42 5f 43 4f 55  ne YY_ACTTAB_COU
1fb50 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e 29 3b 20  NT (%d)\n", n); 
1fb60 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1fb70 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20  ntf(out,"static 
1fb80 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e 54 59  const YYACTIONTY
1fb90 50 45 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 3d  PE yy_action[] =
1fba0 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   {\n"); lineno++
1fbb0 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
1fbc0 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  <n; i++){.    in
1fbd0 74 20 61 63 74 69 6f 6e 20 3d 20 61 63 74 74 61  t action = actta
1fbe0 62 5f 79 79 61 63 74 69 6f 6e 28 70 41 63 74 74  b_yyaction(pActt
1fbf0 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ab, i);.    if( 
1fc00 61 63 74 69 6f 6e 3c 30 20 29 20 61 63 74 69 6f  action<0 ) actio
1fc10 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  n = lemp->nstate
1fc20 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b   + lemp->nrule +
1fc30 20 32 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30   2;.    if( j==0
1fc40 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
1fc50 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
1fc60 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1fc70 74 2c 20 22 20 25 34 64 2c 22 2c 20 61 63 74 69  t, " %4d,", acti
1fc80 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  on);.    if( j==
1fc90 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
1fca0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1fcb0 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
1fcc0 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
1fcd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fce0 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
1fcf0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1fd00 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
1fd10 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
1fd20 68 65 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20  he yy_lookahead 
1fd30 74 61 62 6c 65 20 2a 2f 0a 20 20 6c 65 6d 70 2d  table */.  lemp-
1fd40 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a  >tablesize += n*
1fd50 73 7a 43 6f 64 65 54 79 70 65 3b 0a 20 20 66 70  szCodeType;.  fp
1fd60 72 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69  rintf(out,"stati
1fd70 63 20 63 6f 6e 73 74 20 59 59 43 4f 44 45 54 59  c const YYCODETY
1fd80 50 45 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b  PE yy_lookahead[
1fd90 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ] = {\n"); linen
1fda0 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  o++;.  for(i=j=0
1fdb0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1fdc0 20 69 6e 74 20 6c 61 20 3d 20 61 63 74 74 61 62   int la = acttab
1fdd0 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 70 41 63  _yylookahead(pAc
1fde0 74 74 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66  ttab, i);.    if
1fdf0 28 20 6c 61 3c 30 20 29 20 6c 61 20 3d 20 6c 65  ( la<0 ) la = le
1fe00 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a 20 20 20  mp->nsymbol;.   
1fe10 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69   if( j==0 ) fpri
1fe20 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64  ntf(out," /* %5d
1fe30 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66   */ ", i);.    f
1fe40 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
1fe50 64 2c 22 2c 20 6c 61 29 3b 0a 20 20 20 20 69 66  d,", la);.    if
1fe60 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31  ( j==9 || i==n-1
1fe70 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1fe80 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69  f(out, "\n"); li
1fe90 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20  neno++;.      j 
1fea0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1feb0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
1fec0 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
1fed0 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e  ut, "};\n"); lin
1fee0 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74  eno++;..  /* Out
1fef0 70 75 74 20 74 68 65 20 79 79 5f 73 68 69 66 74  put the yy_shift
1ff00 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f  _ofst[] table */
1ff10 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1ff20 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46  "#define YY_SHIF
1ff30 54 5f 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c  T_USE_DFLT (%d)\
1ff40 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 2d 31 29  n", mnTknOfst-1)
1ff50 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20  ; lineno++;.  n 
1ff60 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b  = lemp->nxstate;
1ff70 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
1ff80 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d   lemp->sorted[n-
1ff90 31 5d 2d 3e 69 54 6b 6e 4f 66 73 74 3d 3d 4e 4f  1]->iTknOfst==NO
1ffa0 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20  _OFFSET ) n--;. 
1ffb0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
1ffc0 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f  define YY_SHIFT_
1ffd0 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e  COUNT (%d)\n", n
1ffe0 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  -1); lineno++;. 
1fff0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
20000 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f  define YY_SHIFT_
20010 4d 49 4e 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d  MIN   (%d)\n", m
20020 6e 54 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e  nTknOfst); linen
20030 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
20040 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f  ut, "#define YY_
20050 53 48 49 46 54 5f 4d 41 58 20 20 20 28 25 64 29  SHIFT_MAX   (%d)
20060 5c 6e 22 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 3b  \n", mxTknOfst);
20070 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
20080 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69  intf(out, "stati
20090 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f 73 68  c const %s yy_sh
200a0 69 66 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e  ift_ofst[] = {\n
200b0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6d 69  ", .          mi
200c0 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28  nimum_size_type(
200d0 6d 6e 54 6b 6e 4f 66 73 74 2d 31 2c 20 6d 78 54  mnTknOfst-1, mxT
200e0 6b 6e 4f 66 73 74 2c 20 26 73 7a 29 29 3b 20 6c  knOfst, &sz)); l
200f0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6c 65 6d 70 2d  ineno++;.  lemp-
20100 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a  >tablesize += n*
20110 73 7a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  sz;.  for(i=j=0;
20120 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
20130 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73 74  int ofst;.    st
20140 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
20150 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20  [i];.    ofst = 
20160 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20  stp->iTknOfst;. 
20170 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f     if( ofst==NO_
20180 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d 20  OFFSET ) ofst = 
20190 6d 6e 54 6b 6e 4f 66 73 74 20 2d 20 31 3b 0a 20  mnTknOfst - 1;. 
201a0 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70     if( j==0 ) fp
201b0 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
201c0 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20  5d */ ", i);.   
201d0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
201e0 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20  %4d,", ofst);.  
201f0 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d    if( j==9 || i=
20200 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70  =n-1 ){.      fp
20210 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
20220 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
20230 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c    j = 0;.    }el
20240 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  se{.      j++;. 
20250 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e     }.  }.  fprin
20260 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b  tf(out, "};\n");
20270 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a   lineno++;..  /*
20280 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 72   Output the yy_r
20290 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 74 61 62  educe_ofst[] tab
202a0 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  le */.  fprintf(
202b0 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
202c0 5f 52 45 44 55 43 45 5f 55 53 45 5f 44 46 4c 54  _REDUCE_USE_DFLT
202d0 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66   (%d)\n", mnNtOf
202e0 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  st-1); lineno++;
202f0 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73  .  n = lemp->nxs
20300 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e  tate;.  while( n
20310 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74  >0 && lemp->sort
20320 65 64 5b 6e 2d 31 5d 2d 3e 69 4e 74 4f 66 73 74  ed[n-1]->iNtOfst
20330 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e 2d  ==NO_OFFSET ) n-
20340 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  -;.  fprintf(out
20350 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45  , "#define YY_RE
20360 44 55 43 45 5f 43 4f 55 4e 54 20 28 25 64 29 5c  DUCE_COUNT (%d)\
20370 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f  n", n-1); lineno
20380 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
20390 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52  t, "#define YY_R
203a0 45 44 55 43 45 5f 4d 49 4e 20 20 20 28 25 64 29  EDUCE_MIN   (%d)
203b0 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74 29 3b 20  \n", mnNtOfst); 
203c0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
203d0 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
203e0 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 41 58 20  e YY_REDUCE_MAX 
203f0 20 20 28 25 64 29 5c 6e 22 2c 20 6d 78 4e 74 4f    (%d)\n", mxNtO
20400 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  fst); lineno++;.
20410 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
20420 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73 20  static const %s 
20430 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d  yy_reduce_ofst[]
20440 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20 20   = {\n", .      
20450 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65      minimum_size
20460 5f 74 79 70 65 28 6d 6e 4e 74 4f 66 73 74 2d 31  _type(mnNtOfst-1
20470 2c 20 6d 78 4e 74 4f 66 73 74 2c 20 26 73 7a 29  , mxNtOfst, &sz)
20480 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6c  ); lineno++;.  l
20490 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b  emp->tablesize +
204a0 3d 20 6e 2a 73 7a 3b 0a 20 20 66 6f 72 28 69 3d  = n*sz;.  for(i=
204b0 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
204c0 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20      int ofst;.  
204d0 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
204e0 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73  rted[i];.    ofs
204f0 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  t = stp->iNtOfst
20500 3b 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d  ;.    if( ofst==
20510 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74  NO_OFFSET ) ofst
20520 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 2d 20 31 3b   = mnNtOfst - 1;
20530 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20  .    if( j==0 ) 
20540 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
20550 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20   %5d */ ", i);. 
20560 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
20570 22 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a  " %4d,", ofst);.
20580 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
20590 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
205a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
205b0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
205c0 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
205d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
205e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
205f0 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
20600 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
20610 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 64 65  /* Output the de
20620 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 74 61 62  fault action tab
20630 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  le */.  fprintf(
20640 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e  out, "static con
20650 73 74 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20  st YYACTIONTYPE 
20660 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 3d 20 7b  yy_default[] = {
20670 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
20680 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74    n = lemp->nxst
20690 61 74 65 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62  ate;.  lemp->tab
206a0 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 41 63  lesize += n*szAc
206b0 74 69 6f 6e 54 79 70 65 3b 0a 20 20 66 6f 72 28  tionType;.  for(
206c0 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
206d0 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
206e0 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
206f0 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69   if( j==0 ) fpri
20700 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64  ntf(out," /* %5d
20710 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66   */ ", i);.    f
20720 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
20730 64 2c 22 2c 20 73 74 70 2d 3e 69 44 66 6c 74 52  d,", stp->iDfltR
20740 65 64 75 63 65 2b 6c 65 6d 70 2d 3e 6e 73 74 61  educe+lemp->nsta
20750 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b  te+lemp->nrule);
20760 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
20770 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
20780 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
20790 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
207a0 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
207b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
207c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
207d0 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
207e0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
207f0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
20800 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
20810 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
20820 72 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f  rate the table o
20830 66 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e  f fallback token
20840 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65  s..  */.  if( le
20850 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b  mp->has_fallback
20860 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 78 20 3d   ){.    int mx =
20870 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c   lemp->nterminal
20880 20 2d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28   - 1;.    while(
20890 20 6d 78 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73   mx>0 && lemp->s
208a0 79 6d 62 6f 6c 73 5b 6d 78 5d 2d 3e 66 61 6c 6c  ymbols[mx]->fall
208b0 62 61 63 6b 3d 3d 30 20 29 7b 20 6d 78 2d 2d 3b  back==0 ){ mx--;
208c0 20 7d 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 61 62   }.    lemp->tab
208d0 6c 65 73 69 7a 65 20 2b 3d 20 28 6d 78 2b 31 29  lesize += (mx+1)
208e0 2a 73 7a 43 6f 64 65 54 79 70 65 3b 0a 20 20 20  *szCodeType;.   
208f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 3b   for(i=0; i<=mx;
20900 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
20910 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70 20 3d 20  uct symbol *p = 
20920 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
20930 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66  ;.      if( p->f
20940 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20  allback==0 ){.  
20950 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
20960 74 2c 20 22 20 20 20 20 30 2c 20 20 2f 2a 20 25  t, "    0,  /* %
20970 31 30 73 20 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a  10s => nothing *
20980 2f 5c 6e 22 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a  /\n", p->name);.
20990 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
209a0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
209b0 2c 20 22 20 20 25 33 64 2c 20 20 2f 2a 20 25 31  , "  %3d,  /* %1
209c0 30 73 20 3d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20  0s => %s */\n", 
209d0 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64  p->fallback->ind
209e0 65 78 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ex,.          p-
209f0 3e 6e 61 6d 65 2c 20 70 2d 3e 66 61 6c 6c 62 61  >name, p->fallba
20a00 63 6b 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  ck->name);.     
20a10 20 7d 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b   }.      lineno+
20a20 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74  +;.    }.  }.  t
20a30 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
20a40 61 6d 65 2c 20 69 6e 2c 20 6f 75 74 2c 20 26 6c  ame, in, out, &l
20a50 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
20a60 6e 65 72 61 74 65 20 61 20 74 61 62 6c 65 20 63  nerate a table c
20a70 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 79  ontaining the sy
20a80 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 6f 66 20 65  mbolic name of e
20a90 76 65 72 79 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f  very symbol.  */
20aa0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
20ab0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
20ac0 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72  ){.    lemon_spr
20ad0 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25 73 5c  intf(line,"\"%s\
20ae0 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  ",",lemp->symbol
20af0 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  s[i]->name);.   
20b00 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
20b10 25 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a 20 20  %-15s",line);.  
20b20 20 20 69 66 28 20 28 69 26 33 29 3d 3d 33 20 29    if( (i&3)==3 )
20b30 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c  { fprintf(out,"\
20b40 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d  n"); lineno++; }
20b50 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 26 33 29  .  }.  if( (i&3)
20b60 21 3d 30 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  !=0 ){ fprintf(o
20b70 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ut,"\n"); lineno
20b80 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ++; }.  tplt_xfe
20b90 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
20ba0 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
20bb0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74   /* Generate a t
20bc0 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
20bd0 61 20 74 65 78 74 20 73 74 72 69 6e 67 20 74 68  a text string th
20be0 61 74 20 64 65 73 63 72 69 62 65 73 20 65 76 65  at describes eve
20bf0 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69 6e 20  ry.  ** rule in 
20c00 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f 66 20  the rule set of 
20c10 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 54 68  the grammar.  Th
20c20 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
20c30 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68 65 6e  s used.  ** when
20c40 20 74 72 61 63 69 6e 67 20 52 45 44 55 43 45 20   tracing REDUCE 
20c50 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  actions..  */.  
20c60 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 70  for(i=0, rp=lemp
20c70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
20c80 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20  p->next, i++){. 
20c90 20 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e 69     assert( rp->i
20ca0 52 75 6c 65 3d 3d 69 20 29 3b 0a 20 20 20 20 66  Rule==i );.    f
20cb0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
20cc0 25 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29 3b 0a  %3d */ \"", i);.
20cd0 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65 78      writeRuleTex
20ce0 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20  t(out, rp);.    
20cf0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 2c  fprintf(out,"\",
20d00 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
20d10 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
20d20 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
20d30 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
20d40 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
20d50 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 65  which executes e
20d60 76 65 72 79 20 74 69 6d 65 20 61 20 73 79 6d 62  very time a symb
20d70 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f  ol is popped fro
20d80 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b  m.  ** the stack
20d90 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e   while processin
20da0 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68 69 6c  g errors or whil
20db0 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68 65  e destroying the
20dc0 20 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a 20 28   parser. .  ** (
20dd0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
20de0 67 65 6e 65 72 61 74 65 20 74 68 65 20 25 64 65  generate the %de
20df0 73 74 72 75 63 74 6f 72 20 61 63 74 69 6f 6e 73  structor actions
20e00 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d  ).  */.  if( lem
20e10 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a  p->tokendest ){.
20e20 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
20e30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
20e40 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
20e50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
20e60 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
20e70 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
20e80 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d  ;.      if( sp==
20e90 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54  0 || sp->type!=T
20ea0 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e  ERMINAL ) contin
20eb0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  ue;.      if( on
20ec0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  ce ){.        fp
20ed0 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20  rintf(out, "    
20ee0 20 20 2f 2a 20 54 45 52 4d 49 4e 41 4c 20 44 65    /* TERMINAL De
20ef0 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b  structor */\n");
20f00 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
20f10 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20     once = 0;.   
20f20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
20f30 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65  tf(out,"    case
20f40 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22   %d: /* %s */\n"
20f50 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d  , sp->index, sp-
20f60 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >name); lineno++
20f70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
20f80 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
20f90 6d 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73 79  mbol && lemp->sy
20fa0 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21 3d  mbols[i]->type!=
20fb0 54 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a  TERMINAL; i++);.
20fc0 20 20 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d 3e      if( i<lemp->
20fd0 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20  nsymbol ){.     
20fe0 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72   emit_destructor
20ff0 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e  _code(out,lemp->
21000 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c  symbols[i],lemp,
21010 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20  &lineno);.      
21020 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
21030 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c     break;\n"); l
21040 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ineno++;.    }. 
21050 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76   }.  if( lemp->v
21060 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20 73 74  ardest ){.    st
21070 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66 6c  ruct symbol *dfl
21080 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e  t_sp = 0;.    in
21090 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20  t once = 1;.    
210a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
210b0 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
210c0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
210d0 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e  bol *sp = lemp->
210e0 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
210f0 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73    if( sp==0 || s
21100 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
21110 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 73  L ||.          s
21120 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73  p->index<=0 || s
21130 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30  p->destructor!=0
21140 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21150 20 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20     if( once ){. 
21160 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
21170 75 74 2c 20 22 20 20 20 20 20 20 2f 2a 20 44 65  ut, "      /* De
21180 66 61 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49 4e  fault NON-TERMIN
21190 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a 2f  AL Destructor */
211a0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
211b0 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30          once = 0
211c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
211d0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
211e0 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20   case %d: /* %s 
211f0 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78  */\n", sp->index
21200 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e  , sp->name); lin
21210 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c  eno++;.      dfl
21220 74 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d  t_sp = sp;.    }
21230 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5f 73 70  .    if( dflt_sp
21240 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 6d 69  !=0 ){.      emi
21250 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64  t_destructor_cod
21260 65 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65  e(out,dflt_sp,le
21270 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  mp,&lineno);.   
21280 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f   }.    fprintf(o
21290 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b  ut,"      break;
212a0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
212b0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
212c0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
212d0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
212e0 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65   symbol *sp = le
212f0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
21300 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c      if( sp==0 ||
21310 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   sp->type==TERMI
21320 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72  NAL || sp->destr
21330 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e 74 69  uctor==0 ) conti
21340 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  nue;.    fprintf
21350 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25  (out,"    case %
21360 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20  d: /* %s */\n", 
21370 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e  sp->index, sp->n
21380 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
21390 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20  .    /* Combine 
213a0 64 75 70 6c 69 63 61 74 65 20 64 65 73 74 72 75  duplicate destru
213b0 63 74 6f 72 73 20 69 6e 74 6f 20 61 20 73 69 6e  ctors into a sin
213c0 67 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  gle case */.    
213d0 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65 6d  for(j=i+1; j<lem
213e0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b 29  p->nsymbol; j++)
213f0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
21400 79 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c 65 6d  ymbol *sp2 = lem
21410 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20  p->symbols[j];. 
21420 20 20 20 20 20 69 66 28 20 73 70 32 20 26 26 20       if( sp2 && 
21430 73 70 32 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49  sp2->type!=TERMI
21440 4e 41 4c 20 26 26 20 73 70 32 2d 3e 64 65 73 74  NAL && sp2->dest
21450 72 75 63 74 6f 72 0a 20 20 20 20 20 20 20 20 20  ructor.         
21460 20 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d 3d 3d   && sp2->dtnum==
21470 73 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20 20 20  sp->dtnum.      
21480 20 20 20 20 26 26 20 73 74 72 63 6d 70 28 73 70      && strcmp(sp
21490 2d 3e 64 65 73 74 72 75 63 74 6f 72 2c 73 70 32  ->destructor,sp2
214a0 2d 3e 64 65 73 74 72 75 63 74 6f 72 29 3d 3d 30  ->destructor)==0
214b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 66 70 72   ){.         fpr
214c0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61  intf(out,"    ca
214d0 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c  se %d: /* %s */\
214e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
214f0 20 20 20 20 20 73 70 32 2d 3e 69 6e 64 65 78 2c       sp2->index,
21500 20 73 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e   sp2->name); lin
21510 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  eno++;.         
21520 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 20  sp2->destructor 
21530 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
21540 20 7d 0a 0a 20 20 20 20 65 6d 69 74 5f 64 65 73   }..    emit_des
21550 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74  tructor_code(out
21560 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
21570 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b  ],lemp,&lineno);
21580 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
21590 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e  ,"      break;\n
215a0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
215b0 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
215c0 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
215d0 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
215e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
215f0 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65  ich executes whe
21600 6e 65 76 65 72 20 74 68 65 20 70 61 72 73 65 72  never the parser
21610 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 73   stack overflows
21620 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
21630 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
21640 6f 76 65 72 66 6c 6f 77 2c 26 6c 69 6e 65 6e 6f  overflow,&lineno
21650 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
21660 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
21670 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
21680 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 61   Generate the ta
21690 62 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e 66 6f  ble of rule info
216a0 72 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a 20 20  rmation .  **.  
216b0 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 63 6f  ** Note: This co
216c0 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
216d0 65 20 66 61 63 74 20 74 68 61 74 20 72 75 6c 65  e fact that rule
216e0 73 20 61 72 65 20 6e 75 6d 62 65 72 0a 20 20 2a  s are number.  *
216f0 2a 20 73 65 71 75 65 6e 74 75 61 6c 6c 79 20 62  * sequentually b
21700 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 2e  eginning with 0.
21710 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c  .  */.  for(rp=l
21720 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
21730 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
21740 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
21750 7b 20 25 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c 72  { %d, %d },\n",r
21760 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c 72 70  p->lhs->index,rp
21770 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e 65 6e 6f 2b  ->nrhs); lineno+
21780 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
21790 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
217a0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
217b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
217c0 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 69  de which executi
217d0 6f 6e 20 64 75 72 69 6e 67 20 65 61 63 68 20 52  on during each R
217e0 45 44 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  EDUCE action */.
217f0 20 20 69 20 3d 20 30 3b 0a 20 20 66 6f 72 28 72    i = 0;.  for(r
21800 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
21810 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
21820 20 20 20 20 69 20 2b 3d 20 74 72 61 6e 73 6c 61      i += transla
21830 74 65 5f 63 6f 64 65 28 6c 65 6d 70 2c 20 72 70  te_code(lemp, rp
21840 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 20 29  );.  }.  if( i )
21850 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
21860 74 2c 22 20 20 20 20 20 20 20 20 59 59 4d 49 4e  t,"        YYMIN
21870 4f 52 54 59 50 45 20 79 79 6c 68 73 6d 69 6e 6f  ORTYPE yylhsmino
21880 72 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  r;\n"); lineno++
21890 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 72 73 74  ;.  }.  /* First
218a0 20 6f 75 74 70 75 74 20 72 75 6c 65 73 20 6f 74   output rules ot
218b0 68 65 72 20 74 68 61 6e 20 74 68 65 20 64 65 66  her than the def
218c0 61 75 6c 74 3a 20 72 75 6c 65 20 2a 2f 0a 20 20  ault: rule */.  
218d0 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
218e0 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
218f0 78 74 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  xt){.    struct 
21900 72 75 6c 65 20 2a 72 70 32 3b 20 20 20 20 20 20  rule *rp2;      
21910 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 74 68 65           /* Othe
21920 72 20 72 75 6c 65 73 20 77 69 74 68 20 74 68 65  r rules with the
21930 20 73 61 6d 65 20 61 63 74 69 6f 6e 20 2a 2f 0a   same action */.
21940 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65      if( rp->code
21950 45 6d 69 74 74 65 64 20 29 20 63 6f 6e 74 69 6e  Emitted ) contin
21960 75 65 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  ue;.    if( rp->
21970 6e 6f 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  noCode ){.      
21980 2f 2a 20 4e 6f 20 43 20 63 6f 64 65 20 61 63 74  /* No C code act
21990 69 6f 6e 73 2c 20 73 6f 20 74 68 69 73 20 77 69  ions, so this wi
219a0 6c 6c 20 62 65 20 70 61 72 74 20 6f 66 20 74 68  ll be part of th
219b0 65 20 22 64 65 66 61 75 6c 74 3a 22 20 72 75 6c  e "default:" rul
219c0 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69  e */.      conti
219d0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  nue;.    }.    f
219e0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
219f0 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c    case %d: /* ",
21a00 20 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20   rp->iRule);.   
21a10 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f   writeRuleText(o
21a20 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72  ut, rp);.    fpr
21a30 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f 5c 6e  intf(out, " */\n
21a40 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
21a50 20 20 66 6f 72 28 72 70 32 3d 72 70 2d 3e 6e 65    for(rp2=rp->ne
21a60 78 74 3b 20 72 70 32 3b 20 72 70 32 3d 72 70 32  xt; rp2; rp2=rp2
21a70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
21a80 66 28 20 72 70 32 2d 3e 63 6f 64 65 3d 3d 72 70  f( rp2->code==rp
21a90 2d 3e 63 6f 64 65 20 26 26 20 72 70 32 2d 3e 63  ->code && rp2->c
21aa0 6f 64 65 50 72 65 66 69 78 3d 3d 72 70 2d 3e 63  odePrefix==rp->c
21ab0 6f 64 65 50 72 65 66 69 78 0a 20 20 20 20 20 20  odePrefix.      
21ac0 20 20 20 20 20 20 20 26 26 20 72 70 32 2d 3e 63         && rp2->c
21ad0 6f 64 65 53 75 66 66 69 78 3d 3d 72 70 2d 3e 63  odeSuffix==rp->c
21ae0 6f 64 65 53 75 66 66 69 78 20 29 7b 0a 20 20 20  odeSuffix ){.   
21af0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
21b00 2c 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a  ,"      case %d:
21b10 20 2f 2a 20 22 2c 20 72 70 32 2d 3e 69 52 75 6c   /* ", rp2->iRul
21b20 65 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74  e);.        writ
21b30 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72  eRuleText(out, r
21b40 70 32 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  p2);.        fpr
21b50 69 6e 74 66 28 6f 75 74 2c 22 20 2a 2f 20 79 79  intf(out," */ yy
21b60 74 65 73 74 63 61 73 65 28 79 79 72 75 6c 65 6e  testcase(yyrulen
21b70 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72 70 32 2d  o==%d);\n", rp2-
21b80 3e 69 52 75 6c 65 29 3b 20 6c 69 6e 65 6e 6f 2b  >iRule); lineno+
21b90 2b 3b 0a 20 20 20 20 20 20 20 20 72 70 32 2d 3e  +;.        rp2->
21ba0 63 6f 64 65 45 6d 69 74 74 65 64 20 3d 20 31 3b  codeEmitted = 1;
21bb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21bc0 20 20 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74     emit_code(out
21bd0 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f  ,rp,lemp,&lineno
21be0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
21bf0 75 74 2c 22 20 20 20 20 20 20 20 20 62 72 65 61  ut,"        brea
21c00 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  k;\n"); lineno++
21c10 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 45 6d  ;.    rp->codeEm
21c20 69 74 74 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  itted = 1;.  }. 
21c30 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6f 75 74   /* Finally, out
21c40 70 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 3a  put the default:
21c50 20 72 75 6c 65 2e 20 20 57 65 20 63 68 6f 6f 73   rule.  We choos
21c60 65 20 61 73 20 74 68 65 20 64 65 66 61 75 6c 74  e as the default
21c70 3a 20 61 6c 6c 0a 20 20 2a 2a 20 65 6d 70 74 79  : all.  ** empty
21c80 20 61 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 66   actions. */.  f
21c90 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
21ca0 20 20 64 65 66 61 75 6c 74 3a 5c 6e 22 29 3b 20    default:\n"); 
21cb0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28  lineno++;.  for(
21cc0 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
21cd0 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
21ce0 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64  .    if( rp->cod
21cf0 65 45 6d 69 74 74 65 64 20 29 20 63 6f 6e 74 69  eEmitted ) conti
21d00 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
21d10 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 29 3b 0a 20   rp->noCode );. 
21d20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
21d30 20 20 20 20 20 20 2f 2a 20 28 25 64 29 20 22 2c        /* (%d) ",
21d40 20 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20   rp->iRule);.   
21d50 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f   writeRuleText(o
21d60 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72  ut, rp);.    fpr
21d70 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f 20 79  intf(out, " */ y
21d80 79 74 65 73 74 63 61 73 65 28 79 79 72 75 6c 65  ytestcase(yyrule
21d90 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72 70 2d  no==%d);\n", rp-
21da0 3e 69 52 75 6c 65 29 3b 20 6c 69 6e 65 6e 6f 2b  >iRule); lineno+
21db0 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  +;.  }.  fprintf
21dc0 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20 62 72  (out,"        br
21dd0 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  eak;\n"); lineno
21de0 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  ++;.  tplt_xfer(
21df0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
21e00 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
21e10 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
21e20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 69  which executes i
21e30 66 20 61 20 70 61 72 73 65 20 66 61 69 6c 73 20  f a parse fails 
21e40 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
21e50 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66  out,lemp,lemp->f
21e60 61 69 6c 75 72 65 2c 26 6c 69 6e 65 6e 6f 29 3b  ailure,&lineno);
21e70 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
21e80 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
21e90 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
21ea0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
21eb0 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e  ch executes when
21ec0 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20   a syntax error 
21ed0 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74 70 6c 74  occurs */.  tplt
21ee0 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
21ef0 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 26 6c 69 6e  lemp->error,&lin
21f00 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65  eno);.  tplt_xfe
21f10 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
21f20 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
21f30 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
21f40 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
21f50 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   when the parser
21f60 20 61 63 63 65 70 74 73 20 69 74 73 20 69 6e 70   accepts its inp
21f70 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ut */.  tplt_pri
21f80 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
21f90 2d 3e 61 63 63 65 70 74 2c 26 6c 69 6e 65 6e 6f  ->accept,&lineno
21fa0 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
21fb0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
21fc0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
21fd0 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64 64 69   Append any addi
21fe0 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20 75 73  tion code the us
21ff0 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a 20 20  er desires */.  
22000 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
22010 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63  emp,lemp->extrac
22020 6f 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  ode,&lineno);.. 
22030 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 66   fclose(in);.  f
22040 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 72 65  close(out);.  re
22050 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  turn;.}../* Gene
22060 72 61 74 65 20 61 20 68 65 61 64 65 72 20 66 69  rate a header fi
22070 6c 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  le for the parse
22080 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74  r */.void Report
22090 48 65 61 64 65 72 28 73 74 72 75 63 74 20 6c 65  Header(struct le
220a0 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 46  mon *lemp).{.  F
220b0 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20  ILE *out, *in;. 
220c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 65   const char *pre
220d0 66 69 78 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65  fix;.  char line
220e0 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 63 68  [LINESIZE];.  ch
220f0 61 72 20 70 61 74 74 65 72 6e 5b 4c 49 4e 45 53  ar pattern[LINES
22100 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  IZE];.  int i;..
22110 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65    if( lemp->toke
22120 6e 70 72 65 66 69 78 20 29 20 70 72 65 66 69 78  nprefix ) prefix
22130 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72   = lemp->tokenpr
22140 65 66 69 78 3b 0a 20 20 65 6c 73 65 20 20 20 20  efix;.  else    
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22160 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 69  prefix = "";.  i
22170 6e 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  n = file_open(le
22180 6d 70 2c 22 2e 68 22 2c 22 72 62 22 29 3b 0a 20  mp,".h","rb");. 
22190 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20 20 69   if( in ){.    i
221a0 6e 74 20 6e 65 78 74 43 68 61 72 3b 0a 20 20 20  nt nextChar;.   
221b0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70   for(i=1; i<lemp
221c0 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20 66  ->nterminal && f
221d0 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49  gets(line,LINESI
221e0 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20  ZE,in); i++){.  
221f0 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74      lemon_sprint
22200 66 28 70 61 74 74 65 72 6e 2c 22 23 64 65 66 69  f(pattern,"#defi
22210 6e 65 20 25 73 25 2d 33 30 73 20 25 33 64 5c 6e  ne %s%-30s %3d\n
22220 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22230 20 20 20 20 20 20 20 70 72 65 66 69 78 2c 6c 65         prefix,le
22240 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
22250 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 69  name,i);.      i
22260 66 28 20 73 74 72 63 6d 70 28 6c 69 6e 65 2c 70  f( strcmp(line,p
22270 61 74 74 65 72 6e 29 20 29 20 62 72 65 61 6b 3b  attern) ) break;
22280 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 78 74 43  .    }.    nextC
22290 68 61 72 20 3d 20 66 67 65 74 63 28 69 6e 29 3b  har = fgetc(in);
222a0 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
222b0 0a 20 20 20 20 69 66 28 20 69 3d 3d 6c 65 6d 70  .    if( i==lemp
222c0 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20 6e  ->nterminal && n
222d0 65 78 74 43 68 61 72 3d 3d 45 4f 46 20 29 7b 0a  extChar==EOF ){.
222e0 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 68 61 6e        /* No chan
222f0 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  ge in the file. 
22300 20 44 6f 6e 27 74 20 72 65 77 72 69 74 65 20 69   Don't rewrite i
22310 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
22320 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
22330 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28  out = file_open(
22340 6c 65 6d 70 2c 22 2e 68 22 2c 22 77 62 22 29 3b  lemp,".h","wb");
22350 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20  .  if( out ){.  
22360 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d    for(i=1; i<lem
22370 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b  p->nterminal; i+
22380 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  +){.      fprint
22390 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
223a0 73 25 2d 33 30 73 20 25 33 64 5c 6e 22 2c 70 72  s%-30s %3d\n",pr
223b0 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  efix,lemp->symbo
223c0 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a  ls[i]->name,i);.
223d0 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65      }.    fclose
223e0 28 6f 75 74 29 3b 20 20 0a 20 20 7d 0a 20 20 72  (out);  .  }.  r
223f0 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 64  eturn;.}../* Red
22400 75 63 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  uce the size of 
22410 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
22420 73 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  s, if possible, 
22430 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 0a 2a 2a  by making use.**
22440 20 6f 66 20 64 65 66 61 75 6c 74 73 2e 0a 2a 2a   of defaults..**
22450 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
22460 69 6f 6e 2c 20 77 65 20 74 61 6b 65 20 74 68 65  ion, we take the
22470 20 6d 6f 73 74 20 66 72 65 71 75 65 6e 74 20 52   most frequent R
22480 45 44 55 43 45 20 61 63 74 69 6f 6e 20 61 6e 64  EDUCE action and
22490 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20   make.** it the 
224a0 64 65 66 61 75 6c 74 2e 20 20 45 78 63 65 70 74  default.  Except
224b0 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65  , there is no de
224c0 66 61 75 6c 74 20 69 66 20 74 68 65 20 77 69 6c  fault if the wil
224d0 64 63 61 72 64 20 74 6f 6b 65 6e 0a 2a 2a 20 69  dcard token.** i
224e0 73 20 61 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f  s a possible loo
224f0 6b 2d 61 68 65 61 64 2e 0a 2a 2f 0a 76 6f 69 64  k-ahead..*/.void
22500 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28   CompressTables(
22510 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
22520 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  mp).{.  struct s
22530 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
22540 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20  uct action *ap, 
22550 2a 61 70 32 3b 0a 20 20 73 74 72 75 63 74 20 72  *ap2;.  struct r
22560 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c 20 2a  ule *rp, *rp2, *
22570 72 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e 62 65  rbest;.  int nbe
22580 73 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  st, n;.  int i;.
22590 20 20 69 6e 74 20 75 73 65 73 57 69 6c 64 63 61    int usesWildca
225a0 72 64 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  rd;..  for(i=0; 
225b0 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
225c0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
225d0 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
225e0 0a 20 20 20 20 6e 62 65 73 74 20 3d 20 30 3b 0a  .    nbest = 0;.
225f0 20 20 20 20 72 62 65 73 74 20 3d 20 30 3b 0a 20      rbest = 0;. 
22600 20 20 20 75 73 65 73 57 69 6c 64 63 61 72 64 20     usesWildcard 
22610 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28 61 70  = 0;..    for(ap
22620 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
22630 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
22640 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
22650 53 48 49 46 54 20 26 26 20 61 70 2d 3e 73 70 3d  SHIFT && ap->sp=
22660 3d 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 20  =lemp->wildcard 
22670 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65 73 57  ){.        usesW
22680 69 6c 64 63 61 72 64 20 3d 20 31 3b 0a 20 20 20  ildcard = 1;.   
22690 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
226a0 70 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20  p->type!=REDUCE 
226b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
226c0 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b    rp = ap->x.rp;
226d0 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c  .      if( rp->l
226e0 68 73 53 74 61 72 74 20 29 20 63 6f 6e 74 69 6e  hsStart ) contin
226f0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70  ue;.      if( rp
22700 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e  ==rbest ) contin
22710 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b  ue;.      n = 1;
22720 0a 20 20 20 20 20 20 66 6f 72 28 61 70 32 3d 61  .      for(ap2=a
22730 70 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20 61 70  p->next; ap2; ap
22740 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20  2=ap2->next){.  
22750 20 20 20 20 20 20 69 66 28 20 61 70 32 2d 3e 74        if( ap2->t
22760 79 70 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f  ype!=REDUCE ) co
22770 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
22780 72 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72 70 3b  rp2 = ap2->x.rp;
22790 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70 32  .        if( rp2
227a0 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e  ==rbest ) contin
227b0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
227c0 72 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a 20  rp2==rp ) n++;. 
227d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
227e0 20 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20 20 20   n>nbest ){.    
227f0 20 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b 0a 20      nbest = n;. 
22800 20 20 20 20 20 20 20 72 62 65 73 74 20 3d 20 72         rbest = r
22810 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
22820 0a 20 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  . .    /* Do not
22830 20 6d 61 6b 65 20 61 20 64 65 66 61 75 6c 74 20   make a default 
22840 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  if the number of
22850 20 72 75 6c 65 73 20 74 6f 20 64 65 66 61 75 6c   rules to defaul
22860 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  t.    ** is not 
22870 61 74 20 6c 65 61 73 74 20 31 20 6f 72 20 69 66  at least 1 or if
22880 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f   the wildcard to
22890 6b 65 6e 20 69 73 20 61 20 70 6f 73 73 69 62 6c  ken is a possibl
228a0 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 6b 61 68 65  e.    ** lookahe
228b0 61 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ad..    */.    i
228c0 66 28 20 6e 62 65 73 74 3c 31 20 7c 7c 20 75 73  f( nbest<1 || us
228d0 65 73 57 69 6c 64 63 61 72 64 20 29 20 63 6f 6e  esWildcard ) con
228e0 74 69 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a 20  tinue;...    /* 
228f0 43 6f 6d 62 69 6e 65 20 6d 61 74 63 68 69 6e 67  Combine matching
22900 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73 20   REDUCE actions 
22910 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 64 65  into a single de
22920 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f 72  fault */.    for
22930 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
22940 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
22950 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
22960 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d  e==REDUCE && ap-
22970 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 62  >x.rp==rbest ) b
22980 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
22990 61 73 73 65 72 74 28 20 61 70 20 29 3b 0a 20 20  assert( ap );.  
229a0 20 20 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62 6f    ap->sp = Symbo
229b0 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74 7d  l_new("{default}
229c0 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 61  ");.    for(ap=a
229d0 70 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70 3d  p->next; ap; ap=
229e0 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
229f0 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52   if( ap->type==R
22a00 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72  EDUCE && ap->x.r
22a10 70 3d 3d 72 62 65 73 74 20 29 20 61 70 2d 3e 74  p==rbest ) ap->t
22a20 79 70 65 20 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a  ype = NOT_USED;.
22a30 20 20 20 20 7d 0a 20 20 20 20 73 74 70 2d 3e 61      }.    stp->a
22a40 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28  p = Action_sort(
22a50 73 74 70 2d 3e 61 70 29 3b 0a 0a 20 20 20 20 66  stp->ap);..    f
22a60 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
22a70 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
22a80 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
22a90 79 70 65 3d 3d 53 48 49 46 54 20 29 20 62 72 65  ype==SHIFT ) bre
22aa0 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61 70  ak;.      if( ap
22ab0 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26  ->type==REDUCE &
22ac0 26 20 61 70 2d 3e 78 2e 72 70 21 3d 72 62 65 73  & ap->x.rp!=rbes
22ad0 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t ) break;.    }
22ae0 0a 20 20 20 20 69 66 28 20 61 70 3d 3d 30 20 29  .    if( ap==0 )
22af0 7b 0a 20 20 20 20 20 20 73 74 70 2d 3e 61 75 74  {.      stp->aut
22b00 6f 52 65 64 75 63 65 20 3d 20 31 3b 0a 20 20 20  oReduce = 1;.   
22b10 20 20 20 73 74 70 2d 3e 70 44 66 6c 74 52 65 64     stp->pDfltRed
22b20 75 63 65 20 3d 20 72 62 65 73 74 3b 0a 20 20 20  uce = rbest;.   
22b30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
22b40 65 20 61 20 73 65 63 6f 6e 64 20 70 61 73 73 20  e a second pass 
22b50 6f 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73 20  over all states 
22b60 61 6e 64 20 61 63 74 69 6f 6e 73 2e 20 20 43 6f  and actions.  Co
22b70 6e 76 65 72 74 0a 20 20 2a 2a 20 65 76 65 72 79  nvert.  ** every
22b80 20 61 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20   action that is 
22b90 61 20 53 48 49 46 54 20 74 6f 20 61 6e 20 61 75  a SHIFT to an au
22ba0 74 6f 52 65 64 75 63 65 20 73 74 61 74 65 20 69  toReduce state i
22bb0 6e 74 6f 0a 20 20 2a 2a 20 61 20 53 48 49 46 54  nto.  ** a SHIFT
22bc0 52 45 44 55 43 45 20 61 63 74 69 6f 6e 2e 0a 20  REDUCE action.. 
22bd0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
22be0 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
22bf0 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
22c00 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
22c10 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
22c20 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
22c30 65 78 74 29 7b 0a 20 20 20 20 20 20 73 74 72 75  ext){.      stru
22c40 63 74 20 73 74 61 74 65 20 2a 70 4e 65 78 74 53  ct state *pNextS
22c50 74 61 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20  tate;.      if( 
22c60 61 70 2d 3e 74 79 70 65 21 3d 53 48 49 46 54 20  ap->type!=SHIFT 
22c70 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22c80 20 20 70 4e 65 78 74 53 74 61 74 65 20 3d 20 61    pNextState = a
22c90 70 2d 3e 78 2e 73 74 70 3b 0a 20 20 20 20 20 20  p->x.stp;.      
22ca0 69 66 28 20 70 4e 65 78 74 53 74 61 74 65 2d 3e  if( pNextState->
22cb0 61 75 74 6f 52 65 64 75 63 65 20 26 26 20 70 4e  autoReduce && pN
22cc0 65 78 74 53 74 61 74 65 2d 3e 70 44 66 6c 74 52  extState->pDfltR
22cd0 65 64 75 63 65 21 3d 30 20 29 7b 0a 20 20 20 20  educe!=0 ){.    
22ce0 20 20 20 20 61 70 2d 3e 74 79 70 65 20 3d 20 53      ap->type = S
22cf0 48 49 46 54 52 45 44 55 43 45 3b 0a 20 20 20 20  HIFTREDUCE;.    
22d00 20 20 20 20 61 70 2d 3e 78 2e 72 70 20 3d 20 70      ap->x.rp = p
22d10 4e 65 78 74 53 74 61 74 65 2d 3e 70 44 66 6c 74  NextState->pDflt
22d20 52 65 64 75 63 65 3b 0a 20 20 20 20 20 20 7d 0a  Reduce;.      }.
22d30 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
22d40 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
22d50 73 74 61 74 65 73 20 66 6f 72 20 73 6f 72 74 69  states for sorti
22d60 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68  ng purposes.  Th
22d70 65 20 73 6d 61 6c 6c 65 72 20 73 74 61 74 65 20  e smaller state 
22d80 69 73 20 74 68 65 0a 2a 2a 20 6f 6e 65 20 77 69  is the.** one wi
22d90 74 68 20 74 68 65 20 6d 6f 73 74 20 6e 6f 6e 2d  th the most non-
22da0 74 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73  terminal actions
22db0 2e 20 20 49 66 20 74 68 65 79 20 68 61 76 65 20  .  If they have 
22dc0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
22dd0 2a 2a 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e  ** of non-termin
22de0 61 6c 20 61 63 74 69 6f 6e 73 2c 20 74 68 65 6e  al actions, then
22df0 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 69 73 20   the smaller is 
22e00 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
22e10 20 6d 6f 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 61   most.** token a
22e20 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  ctions..*/.stati
22e30 63 20 69 6e 74 20 73 74 61 74 65 52 65 73 6f 72  c int stateResor
22e40 74 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76  tCompare(const v
22e50 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f  oid *a, const vo
22e60 69 64 20 2a 62 29 7b 0a 20 20 63 6f 6e 73 74 20  id *b){.  const 
22e70 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 70 41  struct state *pA
22e80 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63   = *(const struc
22e90 74 20 73 74 61 74 65 2a 2a 29 61 3b 0a 20 20 63  t state**)a;.  c
22ea0 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74  onst struct stat
22eb0 65 20 2a 70 42 20 3d 20 2a 28 63 6f 6e 73 74 20  e *pB = *(const 
22ec0 73 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29 62  struct state**)b
22ed0 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20  ;.  int n;..  n 
22ee0 3d 20 70 42 2d 3e 6e 4e 74 41 63 74 20 2d 20 70  = pB->nNtAct - p
22ef0 41 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 69 66 28  A->nNtAct;.  if(
22f00 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d   n==0 ){.    n =
22f10 20 70 42 2d 3e 6e 54 6b 6e 41 63 74 20 2d 20 70   pB->nTknAct - p
22f20 41 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20  A->nTknAct;.    
22f30 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
22f40 20 20 6e 20 3d 20 70 42 2d 3e 73 74 61 74 65 6e    n = pB->staten
22f50 75 6d 20 2d 20 70 41 2d 3e 73 74 61 74 65 6e 75  um - pA->statenu
22f60 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  m;.    }.  }.  a
22f70 73 73 65 72 74 28 20 6e 21 3d 30 20 29 3b 0a 20  ssert( n!=0 );. 
22f80 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
22f90 2a 0a 2a 2a 20 52 65 6e 75 6d 62 65 72 20 61 6e  *.** Renumber an
22fa0 64 20 72 65 73 6f 72 74 20 73 74 61 74 65 73 20  d resort states 
22fb0 73 6f 20 74 68 61 74 20 73 74 61 74 65 73 20 77  so that states w
22fc0 69 74 68 20 66 65 77 65 72 20 63 68 6f 69 63 65  ith fewer choice
22fd0 73 0a 2a 2a 20 6f 63 63 75 72 20 61 74 20 74 68  s.** occur at th
22fe0 65 20 65 6e 64 2e 20 20 45 78 63 65 70 74 2c 20  e end.  Except, 
22ff0 6b 65 65 70 20 73 74 61 74 65 20 30 20 61 73 20  keep state 0 as 
23000 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 2e  the first state.
23010 0a 2a 2f 0a 76 6f 69 64 20 52 65 73 6f 72 74 53  .*/.void ResortS
23020 74 61 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d  tates(struct lem
23030 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e  on *lemp).{.  in
23040 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
23050 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
23060 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a  ct action *ap;..
23070 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
23080 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
23090 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
230a0 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
230b0 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73  stp->nTknAct = s
230c0 74 70 2d 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a  tp->nNtAct = 0;.
230d0 20 20 20 20 73 74 70 2d 3e 69 44 66 6c 74 52 65      stp->iDfltRe
230e0 64 75 63 65 20 3d 20 6c 65 6d 70 2d 3e 6e 72 75  duce = lemp->nru
230f0 6c 65 3b 20 20 2f 2a 20 49 6e 69 74 20 64 66 6c  le;  /* Init dfl
23100 74 20 61 63 74 69 6f 6e 20 74 6f 20 22 73 79 6e  t action to "syn
23110 74 61 78 20 65 72 72 6f 72 22 20 2a 2f 0a 20 20  tax error" */.  
23120 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20    stp->iTknOfst 
23130 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20  = NO_OFFSET;.   
23140 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20   stp->iNtOfst = 
23150 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 66  NO_OFFSET;.    f
23160 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
23170 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
23180 0a 20 20 20 20 20 20 69 6e 74 20 69 41 63 74 69  .      int iActi
23190 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74  on = compute_act
231a0 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 3b 0a 20 20  ion(lemp,ap);.  
231b0 20 20 20 20 69 66 28 20 69 41 63 74 69 6f 6e 3e      if( iAction>
231c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
231d0 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c  ( ap->sp->index<
231e0 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
231f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70  ){.          stp
23200 2d 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20 20 20  ->nTknAct++;.   
23210 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
23220 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d  p->sp->index<lem
23230 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20  p->nsymbol ){.  
23240 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 4e 74          stp->nNt
23250 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Act++;.        }
23260 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23270 61 73 73 65 72 74 28 20 73 74 70 2d 3e 61 75 74  assert( stp->aut
23280 6f 52 65 64 75 63 65 3d 3d 30 20 7c 7c 20 73 74  oReduce==0 || st
23290 70 2d 3e 70 44 66 6c 74 52 65 64 75 63 65 3d 3d  p->pDfltReduce==
232a0 61 70 2d 3e 78 2e 72 70 20 29 3b 0a 20 20 20 20  ap->x.rp );.    
232b0 20 20 20 20 20 20 73 74 70 2d 3e 69 44 66 6c 74        stp->iDflt
232c0 52 65 64 75 63 65 20 3d 20 69 41 63 74 69 6f 6e  Reduce = iAction
232d0 20 2d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20   - lemp->nstate 
232e0 2d 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20  - lemp->nrule;. 
232f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23300 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 71 73 6f  .    }.  }.  qso
23310 72 74 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  rt(&lemp->sorted
23320 5b 31 5d 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  [1], lemp->nstat
23330 65 2d 31 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 70  e-1, sizeof(lemp
23340 2d 3e 73 6f 72 74 65 64 5b 30 5d 29 2c 0a 20 20  ->sorted[0]),.  
23350 20 20 20 20 20 20 73 74 61 74 65 52 65 73 6f 72        stateResor
23360 74 43 6f 6d 70 61 72 65 29 3b 0a 20 20 66 6f 72  tCompare);.  for
23370 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
23380 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
23390 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d  lemp->sorted[i]-
233a0 3e 73 74 61 74 65 6e 75 6d 20 3d 20 69 3b 0a 20  >statenum = i;. 
233b0 20 7d 0a 20 20 6c 65 6d 70 2d 3e 6e 78 73 74 61   }.  lemp->nxsta
233c0 74 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  te = lemp->nstat
233d0 65 3b 0a 20 20 77 68 69 6c 65 28 20 6c 65 6d 70  e;.  while( lemp
233e0 2d 3e 6e 78 73 74 61 74 65 3e 31 20 26 26 20 6c  ->nxstate>1 && l
233f0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6c 65 6d 70  emp->sorted[lemp
23400 2d 3e 6e 78 73 74 61 74 65 2d 31 5d 2d 3e 61 75  ->nxstate-1]->au
23410 74 6f 52 65 64 75 63 65 20 29 7b 0a 20 20 20 20  toReduce ){.    
23420 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2d 2d 3b  lemp->nxstate--;
23430 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  .  }.}.../******
23440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
23450 20 74 68 65 20 66 69 6c 65 20 22 73 65 74 2e 63   the file "set.c
23460 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
23470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23480 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65  ******/./*.** Se
23490 74 20 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 20 72  t manipulation r
234a0 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 68 65 20  outines for the 
234b0 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
234c0 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74  erator..*/..stat
234d0 69 63 20 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b  ic int size = 0;
234e0 0a 0a 2f 2a 20 53 65 74 20 74 68 65 20 73 65 74  ../* Set the set
234f0 20 73 69 7a 65 20 2a 2f 0a 76 6f 69 64 20 53 65   size */.void Se
23500 74 53 69 7a 65 28 69 6e 74 20 6e 29 0a 7b 0a 20  tSize(int n).{. 
23510 20 73 69 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a   size = n+1;.}..
23520 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
23530 77 20 73 65 74 20 2a 2f 0a 63 68 61 72 20 2a 53  w set */.char *S
23540 65 74 4e 65 77 28 29 7b 0a 20 20 63 68 61 72 20  etNew(){.  char 
23550 2a 73 3b 0a 20 20 73 20 3d 20 28 63 68 61 72 2a  *s;.  s = (char*
23560 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 2c 20 31  )calloc( size, 1
23570 29 3b 0a 20 20 69 66 28 20 73 3d 3d 30 20 29 7b  );.  if( s==0 ){
23580 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64  .    extern void
23590 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b   memory_error();
235a0 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  .    memory_erro
235b0 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r();.  }.  retur
235c0 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c  n s;.}../* Deall
235d0 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f 0a 76  ocate a set */.v
235e0 6f 69 64 20 53 65 74 46 72 65 65 28 63 68 61 72  oid SetFree(char
235f0 20 2a 73 29 0a 7b 0a 20 20 66 72 65 65 28 73 29   *s).{.  free(s)
23600 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65  ;.}../* Add a ne
23610 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
23620 20 73 65 74 2e 20 20 52 65 74 75 72 6e 20 54 52   set.  Return TR
23630 55 45 20 69 66 20 74 68 65 20 65 6c 65 6d 65 6e  UE if the elemen
23640 74 20 77 61 73 20 61 64 64 65 64 0a 2a 2a 20 61  t was added.** a
23650 6e 64 20 46 41 4c 53 45 20 69 66 20 69 74 20 77  nd FALSE if it w
23660 61 73 20 61 6c 72 65 61 64 79 20 74 68 65 72 65  as already there
23670 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 41 64 64 28  . */.int SetAdd(
23680 63 68 61 72 20 2a 73 2c 20 69 6e 74 20 65 29 0a  char *s, int e).
23690 7b 0a 20 20 69 6e 74 20 72 76 3b 0a 20 20 61 73  {.  int rv;.  as
236a0 73 65 72 74 28 20 65 3e 3d 30 20 26 26 20 65 3c  sert( e>=0 && e<
236b0 73 69 7a 65 20 29 3b 0a 20 20 72 76 20 3d 20 73  size );.  rv = s
236c0 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20 31 3b  [e];.  s[e] = 1;
236d0 0a 20 20 72 65 74 75 72 6e 20 21 72 76 3b 0a 7d  .  return !rv;.}
236e0 0a 0a 2f 2a 20 41 64 64 20 65 76 65 72 79 20 65  ../* Add every e
236f0 6c 65 6d 65 6e 74 20 6f 66 20 73 32 20 74 6f 20  lement of s2 to 
23700 73 31 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  s1.  Return TRUE
23710 20 69 66 20 73 31 20 63 68 61 6e 67 65 73 2e 20   if s1 changes. 
23720 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28  */.int SetUnion(
23730 63 68 61 72 20 2a 73 31 2c 20 63 68 61 72 20 2a  char *s1, char *
23740 73 32 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 70  s2).{.  int i, p
23750 72 6f 67 72 65 73 73 3b 0a 20 20 70 72 6f 67 72  rogress;.  progr
23760 65 73 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ess = 0;.  for(i
23770 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
23780 7b 0a 20 20 20 20 69 66 28 20 73 32 5b 69 5d 3d  {.    if( s2[i]=
23790 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
237a0 20 20 20 69 66 28 20 73 31 5b 69 5d 3d 3d 30 20     if( s1[i]==0 
237b0 29 7b 0a 20 20 20 20 20 20 70 72 6f 67 72 65 73  ){.      progres
237c0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 31 5b  s = 1;.      s1[
237d0 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  i] = 1;.    }.  
237e0 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 6f 67 72  }.  return progr
237f0 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ess;.}./********
23800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
23810 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74 61  rom the file "ta
23820 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ble.c" *********
23830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23840 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63  ***/./*.** All c
23850 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
23860 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61   has been automa
23870 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
23880 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63  d.** from a spec
23890 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65  ification in the
238a0 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20   file.**        
238b0 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a        "table.q".
238c0 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69  ** by the associ
238d0 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65  ative array code
238e0 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61   building progra
238f0 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f  m "aagen"..** Do
23900 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66   not edit this f
23910 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65  ile!  Instead, e
23920 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63  dit the specific
23930 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74  ation.** file, t
23940 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e  hen rerun aagen.
23950 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66  .*/./*.** Code f
23960 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61  or processing ta
23970 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  bles in the LEMO
23980 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
23990 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56 41 54 45 20  or..*/..PRIVATE 
239a0 75 6e 73 69 67 6e 65 64 20 73 74 72 68 61 73 68  unsigned strhash
239b0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 29 0a  (const char *x).
239c0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 20 3d  {.  unsigned h =
239d0 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 78 20   0;.  while( *x 
239e0 29 20 68 20 3d 20 68 2a 31 33 20 2b 20 2a 28 78  ) h = h*13 + *(x
239f0 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b  ++);.  return h;
23a00 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b 73 20 6c 69 6b  .}../* Works lik
23a10 65 20 73 74 72 64 75 70 2c 20 73 6f 72 74 20 6f  e strdup, sort o
23a20 66 2e 20 20 53 61 76 65 20 61 20 73 74 72 69 6e  f.  Save a strin
23a30 67 20 69 6e 20 6d 61 6c 6c 6f 63 65 64 20 6d 65  g in malloced me
23a40 6d 6f 72 79 2c 20 62 75 74 0a 2a 2a 20 6b 65 65  mory, but.** kee
23a50 70 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20 74  p strings in a t
23a60 61 62 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65  able so that the
23a70 20 73 61 6d 65 20 73 74 72 69 6e 67 20 69 73 20   same string is 
23a80 6e 6f 74 20 69 6e 20 6d 6f 72 65 0a 2a 2a 20 74  not in more.** t
23a90 68 61 6e 20 6f 6e 65 20 70 6c 61 63 65 2e 0a 2a  han one place..*
23aa0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74  /.const char *St
23ab0 72 73 61 66 65 28 63 6f 6e 73 74 20 63 68 61 72  rsafe(const char
23ac0 20 2a 79 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63   *y).{.  const c
23ad0 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a  har *z;.  char *
23ae0 63 70 79 3b 0a 0a 20 20 69 66 28 20 79 3d 3d 30  cpy;..  if( y==0
23af0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a   ) return 0;.  z
23b00 20 3d 20 53 74 72 73 61 66 65 5f 66 69 6e 64 28   = Strsafe_find(
23b10 79 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 26  y);.  if( z==0 &
23b20 26 20 28 63 70 79 3d 28 63 68 61 72 20 2a 29 6d  & (cpy=(char *)m
23b30 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
23b40 65 6e 28 79 29 2b 31 20 29 29 21 3d 30 20 29 7b  en(y)+1 ))!=0 ){
23b50 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70  .    lemon_strcp
23b60 79 28 63 70 79 2c 79 29 3b 0a 20 20 20 20 7a 20  y(cpy,y);.    z 
23b70 3d 20 63 70 79 3b 0a 20 20 20 20 53 74 72 73 61  = cpy;.    Strsa
23b80 66 65 5f 69 6e 73 65 72 74 28 7a 29 3b 0a 20 20  fe_insert(z);.  
23b90 7d 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28  }.  MemoryCheck(
23ba0 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  z);.  return z;.
23bb0 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  }../* There is o
23bc0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
23bd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
23be0 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a  ucture for each.
23bf0 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ** associative a
23c00 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 31  rray of type "x1
23c10 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78  "..*/.struct s_x
23c20 31 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20  1 {.  int size; 
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23c40 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   The number of a
23c50 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20  vailable slots. 
23c60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
23c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c80 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65    Must be a powe
23c90 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
23ca0 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20  han or */.      
23cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cc0 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74      /*   equal t
23cd0 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  o 1 */.  int cou
23ce0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
23cf0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
23d00 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69  rrently slots fi
23d10 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  lled */.  struct
23d20 20 73 5f 78 31 6e 6f 64 65 20 2a 74 62 6c 3b 20   s_x1node *tbl; 
23d30 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f   /* The data sto
23d40 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  red here */.  st
23d50 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a  ruct s_x1node **
23d60 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ht;  /* Hash tab
23d70 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a  le for lookups *
23d80 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  /.};../* There i
23d90 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
23da0 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
23db0 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20   for every data 
23dc0 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e  element.** in an
23dd0 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
23de0 61 79 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e  ay of type "x1".
23df0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
23e00 63 74 20 73 5f 78 31 6e 6f 64 65 20 7b 0a 20 20  ct s_x1node {.  
23e10 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 61 74 61  const char *data
23e20 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
23e30 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74  data */.  struct
23e40 20 73 5f 78 31 6e 6f 64 65 20 2a 6e 65 78 74 3b   s_x1node *next;
23e50 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79     /* Next entry
23e60 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68   with the same h
23e70 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ash */.  struct 
23e80 73 5f 78 31 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b  s_x1node **from;
23e90 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69    /* Previous li
23ea0 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a  nk */.} x1node;.
23eb0 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c  ./* There is onl
23ec0 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  y one instance o
23ed0 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69  f the array, whi
23ee0 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ch is the follow
23ef0 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ing */.static st
23f00 72 75 63 74 20 73 5f 78 31 20 2a 78 31 61 3b 0a  ruct s_x1 *x1a;.
23f10 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
23f20 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ew associative a
23f30 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 72  rray */.void Str
23f40 73 61 66 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69  safe_init(){.  i
23f50 66 28 20 78 31 61 20 29 20 72 65 74 75 72 6e 3b  f( x1a ) return;
23f60 0a 20 20 78 31 61 20 3d 20 28 73 74 72 75 63 74  .  x1a = (struct
23f70 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63 28 20 73   s_x1*)malloc( s
23f80 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78  izeof(struct s_x
23f90 31 29 20 29 3b 0a 20 20 69 66 28 20 78 31 61 20  1) );.  if( x1a 
23fa0 29 7b 0a 20 20 20 20 78 31 61 2d 3e 73 69 7a 65  ){.    x1a->size
23fb0 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 78 31 61   = 1024;.    x1a
23fc0 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ->count = 0;.   
23fd0 20 78 31 61 2d 3e 74 62 6c 20 3d 20 28 78 31 6e   x1a->tbl = (x1n
23fe0 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 31 30 32 34  ode*)calloc(1024
23ff0 2c 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29  , sizeof(x1node)
24000 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65   + sizeof(x1node
24010 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 78 31 61  *));.    if( x1a
24020 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ->tbl==0 ){.    
24030 20 20 66 72 65 65 28 78 31 61 29 3b 0a 20 20 20    free(x1a);.   
24040 20 20 20 78 31 61 20 3d 20 30 3b 0a 20 20 20 20     x1a = 0;.    
24050 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
24060 20 69 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e 68   i;.      x1a->h
24070 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28  t = (x1node**)&(
24080 78 31 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29 3b  x1a->tbl[1024]);
24090 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
240a0 69 3c 31 30 32 34 3b 20 69 2b 2b 29 20 78 31 61  i<1024; i++) x1a
240b0 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  ->ht[i] = 0;.   
240c0 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65   }.  }.}./* Inse
240d0 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
240e0 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20  into the array. 
240f0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
24100 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50  successful..** P
24110 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74  rior data with t
24120 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e  he same key is N
24130 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a  OT overwritten *
24140 2f 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e  /.int Strsafe_in
24150 73 65 72 74 28 63 6f 6e 73 74 20 63 68 61 72 20  sert(const char 
24160 2a 64 61 74 61 29 0a 7b 0a 20 20 78 31 6e 6f 64  *data).{.  x1nod
24170 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65  e *np;.  unsigne
24180 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  d h;.  unsigned 
24190 70 68 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d  ph;..  if( x1a==
241a0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
241b0 70 68 20 3d 20 73 74 72 68 61 73 68 28 64 61 74  ph = strhash(dat
241c0 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28  a);.  h = ph & (
241d0 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x1a->size-1);.  
241e0 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b  np = x1a->ht[h];
241f0 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
24200 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e      if( strcmp(n
24210 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d 30  p->data,data)==0
24220 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
24230 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77  existing entry w
24240 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
24250 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20   is found. */.  
24260 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61      /* Fail beca
24270 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73  use overwrite is
24280 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a   not allows. */.
24290 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
242a0 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e      }.    np = n
242b0 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  p->next;.  }.  i
242c0 66 28 20 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d 78  f( x1a->count>=x
242d0 31 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20  1a->size ){.    
242e0 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
242f0 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62  the hash table b
24300 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  igger */.    int
24310 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20 20   i,arrSize;.    
24320 73 74 72 75 63 74 20 73 5f 78 31 20 61 72 72 61  struct s_x1 arra
24330 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
24340 65 20 3d 20 61 72 72 53 69 7a 65 20 3d 20 78 31  e = arrSize = x1
24350 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61  a->size*2;.    a
24360 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31 61  rray.count = x1a
24370 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72  ->count;.    arr
24380 61 79 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65  ay.tbl = (x1node
24390 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65  *)calloc(arrSize
243a0 2c 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29  , sizeof(x1node)
243b0 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65   + sizeof(x1node
243c0 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72  *));.    if( arr
243d0 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75  ay.tbl==0 ) retu
243e0 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64  rn 0;  /* Fail d
243f0 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69  ue to malloc fai
24400 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61  lure */.    arra
24410 79 2e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a  y.ht = (x1node**
24420 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 61 72 72  )&(array.tbl[arr
24430 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  Size]);.    for(
24440 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20  i=0; i<arrSize; 
24450 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d  i++) array.ht[i]
24460 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
24470 30 3b 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74 3b  0; i<x1a->count;
24480 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31 6e   i++){.      x1n
24490 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77  ode *oldnp, *new
244a0 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20  np;.      oldnp 
244b0 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d 29  = &(x1a->tbl[i])
244c0 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72 68  ;.      h = strh
244d0 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29  ash(oldnp->data)
244e0 20 26 20 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a   & (arrSize-1);.
244f0 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28        newnp = &(
24500 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20  array.tbl[i]);. 
24510 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68       if( array.h
24520 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b  t[h] ) array.ht[
24530 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77  h]->from = &(new
24540 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20  np->next);.     
24550 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61   newnp->next = a
24560 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20  rray.ht[h];.    
24570 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20    newnp->data = 
24580 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20  oldnp->data;.   
24590 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d     newnp->from =
245a0 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b   &(array.ht[h]);
245b0 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b  .      array.ht[
245c0 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20  h] = newnp;.    
245d0 7d 0a 20 20 20 20 66 72 65 65 28 78 31 61 2d 3e  }.    free(x1a->
245e0 74 62 6c 29 3b 0a 20 20 20 20 2a 78 31 61 20 3d  tbl);.    *x1a =
245f0 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a   array;.  }.  /*
24600 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
24610 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68  data */.  h = ph
24620 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29   & (x1a->size-1)
24630 3b 0a 20 20 6e 70 20 3d 20 26 28 78 31 61 2d 3e  ;.  np = &(x1a->
24640 74 62 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74 2b 2b  tbl[x1a->count++
24650 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d  ]);.  np->data =
24660 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 31 61   data;.  if( x1a
24670 2d 3e 68 74 5b 68 5d 20 29 20 78 31 61 2d 3e 68  ->ht[h] ) x1a->h
24680 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
24690 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e  p->next);.  np->
246a0 6e 65 78 74 20 3d 20 78 31 61 2d 3e 68 74 5b 68  next = x1a->ht[h
246b0 5d 3b 0a 20 20 78 31 61 2d 3e 68 74 5b 68 5d 20  ];.  x1a->ht[h] 
246c0 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d  = np;.  np->from
246d0 20 3d 20 26 28 78 31 61 2d 3e 68 74 5b 68 5d 29   = &(x1a->ht[h])
246e0 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
246f0 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
24700 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73  nter to data ass
24710 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76  igned to the giv
24720 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20  en key.  Return 
24730 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75  NULL.** if no su
24740 63 68 20 6b 65 79 2e 20 2a 2f 0a 63 6f 6e 73 74  ch key. */.const
24750 20 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f 66   char *Strsafe_f
24760 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ind(const char *
24770 6b 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  key).{.  unsigne
24780 64 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e  d h;.  x1node *n
24790 70 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30  p;..  if( x1a==0
247a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68   ) return 0;.  h
247b0 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20   = strhash(key) 
247c0 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x1a->size-1);
247d0 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b  .  np = x1a->ht[
247e0 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
247f0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
24800 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d  p(np->data,key)=
24810 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
24820 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
24830 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f   }.  return np ?
24840 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d   np->data : 0;.}
24850 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
24860 69 6e 74 65 72 20 74 6f 20 74 68 65 20 28 74 65  inter to the (te
24870 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65 72  rminal or nonter
24880 6d 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20 22 78  minal) symbol "x
24890 22 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  "..** Create a n
248a0 65 77 20 73 79 6d 62 6f 6c 20 69 66 20 74 68 69  ew symbol if thi
248b0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
248c0 69 6d 65 20 22 78 22 20 68 61 73 20 62 65 65 6e  ime "x" has been
248d0 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74   seen..*/.struct
248e0 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
248f0 6e 65 77 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  new(const char *
24900 78 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79  x).{.  struct sy
24910 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73 70 20  mbol *sp;..  sp 
24920 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29  = Symbol_find(x)
24930 3b 0a 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b  ;.  if( sp==0 ){
24940 0a 20 20 20 20 73 70 20 3d 20 28 73 74 72 75 63  .    sp = (struc
24950 74 20 73 79 6d 62 6f 6c 20 2a 29 63 61 6c 6c 6f  t symbol *)callo
24960 63 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  c(1, sizeof(stru
24970 63 74 20 73 79 6d 62 6f 6c 29 20 29 3b 0a 20 20  ct symbol) );.  
24980 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 70    MemoryCheck(sp
24990 29 3b 0a 20 20 20 20 73 70 2d 3e 6e 61 6d 65 20  );.    sp->name 
249a0 3d 20 53 74 72 73 61 66 65 28 78 29 3b 0a 20 20  = Strsafe(x);.  
249b0 20 20 73 70 2d 3e 74 79 70 65 20 3d 20 49 53 55    sp->type = ISU
249c0 50 50 45 52 28 2a 78 29 20 3f 20 54 45 52 4d 49  PPER(*x) ? TERMI
249d0 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e 41  NAL : NONTERMINA
249e0 4c 3b 0a 20 20 20 20 73 70 2d 3e 72 75 6c 65 20  L;.    sp->rule 
249f0 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 66 61 6c  = 0;.    sp->fal
24a00 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73  lback = 0;.    s
24a10 70 2d 3e 70 72 65 63 20 3d 20 2d 31 3b 0a 20 20  p->prec = -1;.  
24a20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 55 4e    sp->assoc = UN
24a30 4b 3b 0a 20 20 20 20 73 70 2d 3e 66 69 72 73 74  K;.    sp->first
24a40 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d  set = 0;.    sp-
24a50 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f  >lambda = LEMON_
24a60 46 41 4c 53 45 3b 0a 20 20 20 20 73 70 2d 3e 64  FALSE;.    sp->d
24a70 65 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20  estructor = 0;. 
24a80 20 20 20 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e     sp->destLinen
24a90 6f 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64  o = 0;.    sp->d
24aa0 61 74 61 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  atatype = 0;.   
24ab0 20 73 70 2d 3e 75 73 65 43 6e 74 20 3d 20 30 3b   sp->useCnt = 0;
24ac0 0a 20 20 20 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .    Symbol_inse
24ad0 72 74 28 73 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b  rt(sp,sp->name);
24ae0 0a 20 20 7d 0a 20 20 73 70 2d 3e 75 73 65 43 6e  .  }.  sp->useCn
24af0 74 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 70  t++;.  return sp
24b00 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
24b10 74 77 6f 20 73 79 6d 62 6f 6c 73 20 66 6f 72 20  two symbols for 
24b20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
24b30 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
24b40 76 65 2c 0a 2a 2a 20 7a 65 72 6f 2c 20 6f 72 20  ve,.** zero, or 
24b50 70 6f 73 69 74 69 76 65 20 69 66 20 61 20 69 73  positive if a is
24b60 20 6c 65 73 73 20 74 68 65 6e 2c 20 65 71 75 61   less then, equa
24b70 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
24b80 0a 2a 2a 20 74 68 61 6e 20 62 2e 0a 2a 2a 0a 2a  .** than b..**.*
24b90 2a 20 53 79 6d 62 6f 6c 73 20 74 68 61 74 20 62  * Symbols that b
24ba0 65 67 69 6e 20 77 69 74 68 20 75 70 70 65 72 20  egin with upper 
24bb0 63 61 73 65 20 6c 65 74 74 65 72 73 20 28 74 65  case letters (te
24bc0 72 6d 69 6e 61 6c 73 20 6f 72 20 74 6f 6b 65 6e  rminals or token
24bd0 73 29 0a 2a 2a 20 6d 75 73 74 20 73 6f 72 74 20  s).** must sort 
24be0 62 65 66 6f 72 65 20 73 79 6d 62 6f 6c 73 20 74  before symbols t
24bf0 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 6c  hat begin with l
24c00 6f 77 65 72 20 63 61 73 65 20 6c 65 74 74 65 72  ower case letter
24c10 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65 72 6d 69 6e  s.** (non-termin
24c20 61 6c 73 29 2e 20 20 41 6e 64 20 4d 55 4c 54 49  als).  And MULTI
24c30 54 45 52 4d 49 4e 41 4c 20 73 79 6d 62 6f 6c 73  TERMINAL symbols
24c40 20 28 63 72 65 61 74 65 64 20 75 73 69 6e 67 20   (created using 
24c50 74 68 65 0a 2a 2a 20 25 74 6f 6b 65 6e 5f 63 6c  the.** %token_cl
24c60 61 73 73 20 64 69 72 65 63 74 69 76 65 29 20 6d  ass directive) m
24c70 75 73 74 20 73 6f 72 74 20 61 74 20 74 68 65 20  ust sort at the 
24c80 76 65 72 79 20 65 6e 64 2e 20 4f 74 68 65 72 20  very end. Other 
24c90 74 68 61 6e 0a 2a 2a 20 74 68 61 74 2c 20 74 68  than.** that, th
24ca0 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6e 6f 74  e order does not
24cb0 20 6d 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   matter..**.** W
24cc0 65 20 66 69 6e 64 20 65 78 70 65 72 69 6d 65 6e  e find experimen
24cd0 74 61 6c 6c 79 20 74 68 61 74 20 6c 65 61 76 69  tally that leavi
24ce0 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 69  ng the symbols i
24cf0 6e 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c  n their original
24d00 0a 2a 2a 20 6f 72 64 65 72 20 28 74 68 65 20 6f  .** order (the o
24d10 72 64 65 72 20 74 68 65 79 20 61 70 70 65 61 72  rder they appear
24d20 65 64 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  ed in the gramma
24d30 72 20 66 69 6c 65 29 20 67 69 76 65 73 20 74 68  r file) gives th
24d40 65 0a 2a 2a 20 73 6d 61 6c 6c 65 73 74 20 70 61  e.** smallest pa
24d50 72 73 65 72 20 74 61 62 6c 65 73 20 69 6e 20 53  rser tables in S
24d60 51 4c 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20 53 79  QLite..*/.int Sy
24d70 6d 62 6f 6c 63 6d 70 70 28 63 6f 6e 73 74 20 76  mbolcmpp(const v
24d80 6f 69 64 20 2a 5f 61 2c 20 63 6f 6e 73 74 20 76  oid *_a, const v
24d90 6f 69 64 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e  oid *_b).{.  con
24da0 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  st struct symbol
24db0 20 2a 61 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74   *a = *(const st
24dc0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20  ruct symbol **) 
24dd0 5f 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  _a;.  const stru
24de0 63 74 20 73 79 6d 62 6f 6c 20 2a 62 20 3d 20 2a  ct symbol *b = *
24df0 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79  (const struct sy
24e00 6d 62 6f 6c 20 2a 2a 29 20 5f 62 3b 0a 20 20 69  mbol **) _b;.  i
24e10 6e 74 20 69 31 20 3d 20 61 2d 3e 74 79 70 65 3d  nt i1 = a->type=
24e20 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 3f  =MULTITERMINAL ?
24e30 20 33 20 3a 20 61 2d 3e 6e 61 6d 65 5b 30 5d 3e   3 : a->name[0]>
24e40 27 5a 27 20 3f 20 32 20 3a 20 31 3b 0a 20 20 69  'Z' ? 2 : 1;.  i
24e50 6e 74 20 69 32 20 3d 20 62 2d 3e 74 79 70 65 3d  nt i2 = b->type=
24e60 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 3f  =MULTITERMINAL ?
24e70 20 33 20 3a 20 62 2d 3e 6e 61 6d 65 5b 30 5d 3e   3 : b->name[0]>
24e80 27 5a 27 20 3f 20 32 20 3a 20 31 3b 0a 20 20 72  'Z' ? 2 : 1;.  r
24e90 65 74 75 72 6e 20 69 31 3d 3d 69 32 20 3f 20 61  eturn i1==i2 ? a
24ea0 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 69 6e 64  ->index - b->ind
24eb0 65 78 20 3a 20 69 31 20 2d 20 69 32 3b 0a 7d 0a  ex : i1 - i2;.}.
24ec0 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
24ed0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
24ee0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
24ef0 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a  ture for each.**
24f00 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
24f10 61 79 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e  ay of type "x2".
24f20 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 32 20  .*/.struct s_x2 
24f30 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  {.  int size;   
24f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24f50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
24f60 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f  ilable slots. */
24f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
24f90 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  Must be a power 
24fa0 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61  of 2 greater tha
24fb0 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  n or */.        
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fd0 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20    /*   equal to 
24fe0 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74  1 */.  int count
24ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
25000 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72  * Number of curr
25010 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c  ently slots fill
25020 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ed */.  struct s
25030 5f 78 32 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f  _x2node *tbl;  /
25040 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65  * The data store
25050 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75  d here */.  stru
25060 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 68 74  ct s_x2node **ht
25070 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65  ;  /* Hash table
25080 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a   for lookups */.
25090 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  };../* There is 
250a0 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
250b0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66  this structure f
250c0 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c  or every data el
250d0 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61  ement.** in an a
250e0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
250f0 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a   of type "x2"..*
25100 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
25110 20 73 5f 78 32 6e 6f 64 65 20 7b 0a 20 20 73 74   s_x2node {.  st
25120 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74  ruct symbol *dat
25130 61 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  a;     /* The da
25140 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ta */.  const ch
25150 61 72 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20  ar *key;        
25160 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
25170 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
25180 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78   *next;   /* Nex
25190 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  t entry with the
251a0 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20   same hash */.  
251b0 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20  struct s_x2node 
251c0 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76  **from;  /* Prev
251d0 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78  ious link */.} x
251e0 32 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65  2node;../* There
251f0 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73   is only one ins
25200 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72  tance of the arr
25210 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  ay, which is the
25220 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74   following */.st
25230 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 32  atic struct s_x2
25240 20 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63   *x2a;../* Alloc
25250 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69  ate a new associ
25260 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76  ative array */.v
25270 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28  oid Symbol_init(
25280 29 7b 0a 20 20 69 66 28 20 78 32 61 20 29 20 72  ){.  if( x2a ) r
25290 65 74 75 72 6e 3b 0a 20 20 78 32 61 20 3d 20 28  eturn;.  x2a = (
252a0 73 74 72 75 63 74 20 73 5f 78 32 2a 29 6d 61 6c  struct s_x2*)mal
252b0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
252c0 63 74 20 73 5f 78 32 29 20 29 3b 0a 20 20 69 66  ct s_x2) );.  if
252d0 28 20 78 32 61 20 29 7b 0a 20 20 20 20 78 32 61  ( x2a ){.    x2a
252e0 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20  ->size = 128;.  
252f0 20 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x2a->count = 0
25300 3b 0a 20 20 20 20 78 32 61 2d 3e 74 62 6c 20 3d  ;.    x2a->tbl =
25310 20 28 78 32 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63   (x2node*)calloc
25320 28 31 32 38 2c 20 73 69 7a 65 6f 66 28 78 32 6e  (128, sizeof(x2n
25330 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32  ode) + sizeof(x2
25340 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28  node*));.    if(
25350 20 78 32 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a   x2a->tbl==0 ){.
25360 20 20 20 20 20 20 66 72 65 65 28 78 32 61 29 3b        free(x2a);
25370 0a 20 20 20 20 20 20 78 32 61 20 3d 20 30 3b 0a  .      x2a = 0;.
25380 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25390 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 32   int i;.      x2
253a0 61 2d 3e 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a  a->ht = (x2node*
253b0 2a 29 26 28 78 32 61 2d 3e 74 62 6c 5b 31 32 38  *)&(x2a->tbl[128
253c0 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ]);.      for(i=
253d0 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78  0; i<128; i++) x
253e0 32 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  2a->ht[i] = 0;. 
253f0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e     }.  }.}./* In
25400 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
25410 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79  d into the array
25420 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
25430 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a  f successful..**
25440 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68   Prior data with
25450 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
25460 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e   NOT overwritten
25470 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69   */.int Symbol_i
25480 6e 73 65 72 74 28 73 74 72 75 63 74 20 73 79 6d  nsert(struct sym
25490 62 6f 6c 20 2a 64 61 74 61 2c 20 63 6f 6e 73 74  bol *data, const
254a0 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20   char *key).{.  
254b0 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75 6e  x2node *np;.  un
254c0 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73 69  signed h;.  unsi
254d0 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66 28 20  gned ph;..  if( 
254e0 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x2a==0 ) return 
254f0 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73  0;.  ph = strhas
25500 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68  h(key);.  h = ph
25510 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29   & (x2a->size-1)
25520 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74  ;.  np = x2a->ht
25530 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
25540 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
25550 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d  mp(np->key,key)=
25560 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
25570 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
25580 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
25590 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a  ey is found. */.
255a0 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65        /* Fail be
255b0 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20  cause overwrite 
255c0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a  is not allows. *
255d0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
255e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d  ;.    }.    np =
255f0 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
25600 20 69 66 28 20 78 32 61 2d 3e 63 6f 75 6e 74 3e   if( x2a->count>
25610 3d 78 32 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20  =x2a->size ){.  
25620 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
25630 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
25640 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69   bigger */.    i
25650 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20  nt i,arrSize;.  
25660 20 20 73 74 72 75 63 74 20 73 5f 78 32 20 61 72    struct s_x2 ar
25670 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73  ray;.    array.s
25680 69 7a 65 20 3d 20 61 72 72 53 69 7a 65 20 3d 20  ize = arrSize = 
25690 78 32 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20  x2a->size*2;.   
256a0 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78   array.count = x
256b0 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61  2a->count;.    a
256c0 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 32 6e 6f  rray.tbl = (x2no
256d0 64 65 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69  de*)calloc(arrSi
256e0 7a 65 2c 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64  ze, sizeof(x2nod
256f0 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f  e) + sizeof(x2no
25700 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61  de*));.    if( a
25710 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65  rray.tbl==0 ) re
25720 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c  turn 0;  /* Fail
25730 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66   due to malloc f
25740 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72  ailure */.    ar
25750 72 61 79 2e 68 74 20 3d 20 28 78 32 6e 6f 64 65  ray.ht = (x2node
25760 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 61  **)&(array.tbl[a
25770 72 72 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f  rrSize]);.    fo
25780 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65  r(i=0; i<arrSize
25790 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b  ; i++) array.ht[
257a0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  i] = 0;.    for(
257b0 69 3d 30 3b 20 69 3c 78 32 61 2d 3e 63 6f 75 6e  i=0; i<x2a->coun
257c0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78  t; i++){.      x
257d0 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e  2node *oldnp, *n
257e0 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e  ewnp;.      oldn
257f0 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b 69  p = &(x2a->tbl[i
25800 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74  ]);.      h = st
25810 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79  rhash(oldnp->key
25820 29 20 26 20 28 61 72 72 53 69 7a 65 2d 31 29 3b  ) & (arrSize-1);
25830 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26  .      newnp = &
25840 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a  (array.tbl[i]);.
25850 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e        if( array.
25860 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74  ht[h] ) array.ht
25870 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65  [h]->from = &(ne
25880 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20  wnp->next);.    
25890 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20    newnp->next = 
258a0 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20  array.ht[h];.   
258b0 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20     newnp->key = 
258c0 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20  oldnp->key;.    
258d0 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20    newnp->data = 
258e0 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20  oldnp->data;.   
258f0 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d     newnp->from =
25900 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b   &(array.ht[h]);
25910 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b  .      array.ht[
25920 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20  h] = newnp;.    
25930 7d 0a 20 20 20 20 66 72 65 65 28 78 32 61 2d 3e  }.    free(x2a->
25940 74 62 6c 29 3b 0a 20 20 20 20 2a 78 32 61 20 3d  tbl);.    *x2a =
25950 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a   array;.  }.  /*
25960 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
25970 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68  data */.  h = ph
25980 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29   & (x2a->size-1)
25990 3b 0a 20 20 6e 70 20 3d 20 26 28 78 32 61 2d 3e  ;.  np = &(x2a->
259a0 74 62 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b 2b  tbl[x2a->count++
259b0 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20  ]);.  np->key = 
259c0 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20  key;.  np->data 
259d0 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32  = data;.  if( x2
259e0 61 2d 3e 68 74 5b 68 5d 20 29 20 78 32 61 2d 3e  a->ht[h] ) x2a->
259f0 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
25a00 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d  np->next);.  np-
25a10 3e 6e 65 78 74 20 3d 20 78 32 61 2d 3e 68 74 5b  >next = x2a->ht[
25a20 68 5d 3b 0a 20 20 78 32 61 2d 3e 68 74 5b 68 5d  h];.  x2a->ht[h]
25a30 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f   = np;.  np->fro
25a40 6d 20 3d 20 26 28 78 32 61 2d 3e 68 74 5b 68 5d  m = &(x2a->ht[h]
25a50 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
25a60 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
25a70 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73  inter to data as
25a80 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69  signed to the gi
25a90 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e  ven key.  Return
25aa0 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73   NULL.** if no s
25ab0 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75  uch key. */.stru
25ac0 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
25ad0 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61  l_find(const cha
25ae0 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e 73 69  r *key).{.  unsi
25af0 67 6e 65 64 20 68 3b 0a 20 20 78 32 6e 6f 64 65  gned h;.  x2node
25b00 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 32 61   *np;..  if( x2a
25b10 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
25b20 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65    h = strhash(ke
25b30 79 29 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d  y) & (x2a->size-
25b40 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e  1);.  np = x2a->
25b50 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
25b60 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
25b70 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79  rcmp(np->key,key
25b80 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
25b90 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
25ba0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
25bb0 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
25bc0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  .}../* Return th
25bd0 65 20 6e 2d 74 68 20 64 61 74 61 2e 20 20 52 65  e n-th data.  Re
25be0 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 20 69  turn NULL if n i
25bf0 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
25c00 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  */.struct symbol
25c10 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74   *Symbol_Nth(int
25c20 20 6e 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73   n).{.  struct s
25c30 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 20 20 69  ymbol *data;.  i
25c40 66 28 20 78 32 61 20 26 26 20 6e 3e 30 20 26 26  f( x2a && n>0 &&
25c50 20 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e 74 20 29   n<=x2a->count )
25c60 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 78 32 61  {.    data = x2a
25c70 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b  ->tbl[n-1].data;
25c80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61  .  }else{.    da
25c90 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ta = 0;.  }.  re
25ca0 74 75 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a  turn data;.}../*
25cb0 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
25cc0 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 2a 2f   of the array */
25cd0 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e  .int Symbol_coun
25ce0 74 28 29 0a 7b 0a 20 20 72 65 74 75 72 6e 20 78  t().{.  return x
25cf0 32 61 20 3f 20 78 32 61 2d 3e 63 6f 75 6e 74 20  2a ? x2a->count 
25d00 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
25d10 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f  n an array of po
25d20 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61  inters to all da
25d30 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ta in the table.
25d40 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69 73  .** The array is
25d50 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
25d60 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e  alloc.  Return N
25d70 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c  ULL if memory al
25d80 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62  location.** prob
25d90 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20  lems, or if the 
25da0 61 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20  array is empty. 
25db0 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  */.struct symbol
25dc0 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f   **Symbol_arrayo
25dd0 66 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  f().{.  struct s
25de0 79 6d 62 6f 6c 20 2a 2a 61 72 72 61 79 3b 0a 20  ymbol **array;. 
25df0 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a   int i,arrSize;.
25e00 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72    if( x2a==0 ) r
25e10 65 74 75 72 6e 20 30 3b 0a 20 20 61 72 72 53 69  eturn 0;.  arrSi
25e20 7a 65 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b  ze = x2a->count;
25e30 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74 72 75  .  array = (stru
25e40 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 63 61 6c  ct symbol **)cal
25e50 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a  loc(arrSize, siz
25e60 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
25e70 6c 20 2a 29 29 3b 0a 20 20 69 66 28 20 61 72 72  l *));.  if( arr
25e80 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ay ){.    for(i=
25e90 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b  0; i<arrSize; i+
25ea0 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 32  +) array[i] = x2
25eb0 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a  a->tbl[i].data;.
25ec0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72    }.  return arr
25ed0 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72  ay;.}../* Compar
25ee0 65 20 74 77 6f 20 63 6f 6e 66 69 67 75 72 61 74  e two configurat
25ef0 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66  ions */.int Conf
25f00 69 67 63 6d 70 28 63 6f 6e 73 74 20 63 68 61 72  igcmp(const char
25f10 20 2a 5f 61 2c 63 6f 6e 73 74 20 63 68 61 72 20   *_a,const char 
25f20 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 73  *_b).{.  const s
25f30 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 20  truct config *a 
25f40 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  = (struct config
25f50 20 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e 73 74 20   *) _a;.  const 
25f60 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
25f70 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69   = (struct confi
25f80 67 20 2a 29 20 5f 62 3b 0a 20 20 69 6e 74 20 78  g *) _b;.  int x
25f90 3b 0a 20 20 78 20 3d 20 61 2d 3e 72 70 2d 3e 69  ;.  x = a->rp->i
25fa0 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e  ndex - b->rp->in
25fb0 64 65 78 3b 0a 20 20 69 66 28 20 78 3d 3d 30 20  dex;.  if( x==0 
25fc0 29 20 78 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62  ) x = a->dot - b
25fd0 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20  ->dot;.  return 
25fe0 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65  x;.}../* Compare
25ff0 20 74 77 6f 20 73 74 61 74 65 73 20 2a 2f 0a 50   two states */.P
26000 52 49 56 41 54 45 20 69 6e 74 20 73 74 61 74 65  RIVATE int state
26010 63 6d 70 28 73 74 72 75 63 74 20 63 6f 6e 66 69  cmp(struct confi
26020 67 20 2a 61 2c 20 73 74 72 75 63 74 20 63 6f 6e  g *a, struct con
26030 66 69 67 20 2a 62 29 0a 7b 0a 20 20 69 6e 74 20  fig *b).{.  int 
26040 72 63 3b 0a 20 20 66 6f 72 28 72 63 3d 30 3b 20  rc;.  for(rc=0; 
26050 72 63 3d 3d 30 20 26 26 20 61 20 26 26 20 62 3b  rc==0 && a && b;
26060 20 20 61 3d 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e    a=a->bp, b=b->
26070 62 70 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 2d  bp){.    rc = a-
26080 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e  >rp->index - b->
26090 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 20 20 69  rp->index;.    i
260a0 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
260b0 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b  a->dot - b->dot;
260c0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30  .  }.  if( rc==0
260d0 20 29 7b 0a 20 20 20 20 69 66 28 20 61 20 29 20   ){.    if( a ) 
260e0 72 63 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  rc = 1;.    if( 
260f0 62 20 29 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d  b ) rc = -1;.  }
26100 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26110 0a 2f 2a 20 48 61 73 68 20 61 20 73 74 61 74 65  ./* Hash a state
26120 20 2a 2f 0a 50 52 49 56 41 54 45 20 75 6e 73 69   */.PRIVATE unsi
26130 67 6e 65 64 20 73 74 61 74 65 68 61 73 68 28 73  gned statehash(s
26140 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 29  truct config *a)
26150 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3d  .{.  unsigned h=
26160 30 3b 0a 20 20 77 68 69 6c 65 28 20 61 20 29 7b  0;.  while( a ){
26170 0a 20 20 20 20 68 20 3d 20 68 2a 35 37 31 20 2b  .    h = h*571 +
26180 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37   a->rp->index*37
26190 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 20 20 61   + a->dot;.    a
261a0 20 3d 20 61 2d 3e 62 70 3b 0a 20 20 7d 0a 20 20   = a->bp;.  }.  
261b0 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20  return h;.}../* 
261c0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  Allocate a new s
261d0 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20 2a  tate structure *
261e0 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  /.struct state *
261f0 53 74 61 74 65 5f 6e 65 77 28 29 0a 7b 0a 20 20  State_new().{.  
26200 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65  struct state *ne
26210 77 73 74 61 74 65 3b 0a 20 20 6e 65 77 73 74 61  wstate;.  newsta
26220 74 65 20 3d 20 28 73 74 72 75 63 74 20 73 74 61  te = (struct sta
26230 74 65 20 2a 29 63 61 6c 6c 6f 63 28 31 2c 20 73  te *)calloc(1, s
26240 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74 61  izeof(struct sta
26250 74 65 29 20 29 3b 0a 20 20 4d 65 6d 6f 72 79 43  te) );.  MemoryC
26260 68 65 63 6b 28 6e 65 77 73 74 61 74 65 29 3b 0a  heck(newstate);.
26270 20 20 72 65 74 75 72 6e 20 6e 65 77 73 74 61 74    return newstat
26280 65 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  e;.}../* There i
26290 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
262a0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
262b0 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
262c0 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
262d0 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
262e0 22 78 33 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x3"..*/.struct 
262f0 73 5f 78 33 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x3 {.  int siz
26300 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
26310 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
26320 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
26330 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26350 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
26360 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
26370 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
26380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26390 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
263a0 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
263b0 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
263c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
263d0 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
263e0 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
263f0 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 74 62  uct s_x3node *tb
26400 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
26410 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
26420 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65   struct s_x3node
26430 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
26440 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
26450 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
26460 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
26470 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
26480 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
26490 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
264a0 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
264b0 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
264c0 33 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  3"..*/.typedef s
264d0 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 7b  truct s_x3node {
264e0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
264f0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
26500 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
26510 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ata */.  struct 
26520 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 20 20 20 20  config *key;    
26530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26540 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73  * The key */.  s
26550 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a  truct s_x3node *
26560 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20  next;   /* Next 
26570 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
26580 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74  ame hash */.  st
26590 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a  ruct s_x3node **
265a0 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f  from;  /* Previo
265b0 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 33 6e  us link */.} x3n
265c0 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  ode;../* There i
265d0 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61  s only one insta
265e0 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  nce of the array
265f0 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66  , which is the f
26600 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74  ollowing */.stat
26610 69 63 20 73 74 72 75 63 74 20 73 5f 78 33 20 2a  ic struct s_x3 *
26620 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  x3a;../* Allocat
26630 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74  e a new associat
26640 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69  ive array */.voi
26650 64 20 53 74 61 74 65 5f 69 6e 69 74 28 29 7b 0a  d State_init(){.
26660 20 20 69 66 28 20 78 33 61 20 29 20 72 65 74 75    if( x3a ) retu
26670 72 6e 3b 0a 20 20 78 33 61 20 3d 20 28 73 74 72  rn;.  x3a = (str
26680 75 63 74 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f 63  uct s_x3*)malloc
26690 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
266a0 73 5f 78 33 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x3) );.  if( x
266b0 33 61 20 29 7b 0a 20 20 20 20 78 33 61 2d 3e 73  3a ){.    x3a->s
266c0 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78  ize = 128;.    x
266d0 33 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  3a->count = 0;. 
266e0 20 20 20 78 33 61 2d 3e 74 62 6c 20 3d 20 28 78     x3a->tbl = (x
266f0 33 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 31 32  3node*)calloc(12
26700 38 2c 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65  8, sizeof(x3node
26710 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64  ) + sizeof(x3nod
26720 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 78 33  e*));.    if( x3
26730 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
26740 20 20 20 66 72 65 65 28 78 33 61 29 3b 0a 20 20     free(x3a);.  
26750 20 20 20 20 78 33 61 20 3d 20 30 3b 0a 20 20 20      x3a = 0;.   
26760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
26770 74 20 69 3b 0a 20 20 20 20 20 20 78 33 61 2d 3e  t i;.      x3a->
26780 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26  ht = (x3node**)&
26790 28 78 33 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b  (x3a->tbl[128]);
267a0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
267b0 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 33 61 2d  i<128; i++) x3a-
267c0 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
267d0 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
267e0 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
267f0 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
26800 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
26810 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
26820 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
26830 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
26840 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
26850 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72  .int State_inser
26860 74 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  t(struct state *
26870 64 61 74 61 2c 20 73 74 72 75 63 74 20 63 6f 6e  data, struct con
26880 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 78 33  fig *key).{.  x3
26890 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69  node *np;.  unsi
268a0 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e  gned h;.  unsign
268b0 65 64 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 33  ed ph;..  if( x3
268c0 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
268d0 0a 20 20 70 68 20 3d 20 73 74 61 74 65 68 61 73  .  ph = statehas
268e0 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68  h(key);.  h = ph
268f0 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29   & (x3a->size-1)
26900 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74  ;.  np = x3a->ht
26910 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
26920 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74   ){.    if( stat
26930 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79  ecmp(np->key,key
26940 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
26950 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   An existing ent
26960 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
26970 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a   key is found. *
26980 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20  /.      /* Fail 
26990 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74  because overwrit
269a0 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e  e is not allows.
269b0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
269c0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70   0;.    }.    np
269d0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
269e0 0a 20 20 69 66 28 20 78 33 61 2d 3e 63 6f 75 6e  .  if( x3a->coun
269f0 74 3e 3d 78 33 61 2d 3e 73 69 7a 65 20 29 7b 0a  t>=x3a->size ){.
26a00 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d      /* Need to m
26a10 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ake the hash tab
26a20 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20  le bigger */.   
26a30 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a   int i,arrSize;.
26a40 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 33 20      struct s_x3 
26a50 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79  array;.    array
26a60 2e 73 69 7a 65 20 3d 20 61 72 72 53 69 7a 65 20  .size = arrSize 
26a70 3d 20 78 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20  = x3a->size*2;. 
26a80 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d     array.count =
26a90 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20   x3a->count;.   
26aa0 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 33   array.tbl = (x3
26ab0 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61 72 72  node*)calloc(arr
26ac0 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78 33 6e  Size, sizeof(x3n
26ad0 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33  ode) + sizeof(x3
26ae0 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28  node*));.    if(
26af0 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20   array.tbl==0 ) 
26b00 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61  return 0;  /* Fa
26b10 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63  il due to malloc
26b20 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20   failure */.    
26b30 61 72 72 61 79 2e 68 74 20 3d 20 28 78 33 6e 6f  array.ht = (x3no
26b40 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c  de**)&(array.tbl
26b50 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20 20 20  [arrSize]);.    
26b60 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69  for(i=0; i<arrSi
26b70 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68  ze; i++) array.h
26b80 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f  t[i] = 0;.    fo
26b90 72 28 69 3d 30 3b 20 69 3c 78 33 61 2d 3e 63 6f  r(i=0; i<x3a->co
26ba0 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unt; i++){.     
26bb0 20 78 33 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20   x3node *oldnp, 
26bc0 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c  *newnp;.      ol
26bd0 64 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c  dnp = &(x3a->tbl
26be0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  [i]);.      h = 
26bf0 73 74 61 74 65 68 61 73 68 28 6f 6c 64 6e 70 2d  statehash(oldnp-
26c00 3e 6b 65 79 29 20 26 20 28 61 72 72 53 69 7a 65  >key) & (arrSize
26c10 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  -1);.      newnp
26c20 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69   = &(array.tbl[i
26c30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72  ]);.      if( ar
26c40 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61  ray.ht[h] ) arra
26c50 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  y.ht[h]->from = 
26c60 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a  &(newnp->next);.
26c70 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78        newnp->nex
26c80 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b  t = array.ht[h];
26c90 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65  .      newnp->ke
26ca0 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a  y = oldnp->key;.
26cb0 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74        newnp->dat
26cc0 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b  a = oldnp->data;
26cd0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72  .      newnp->fr
26ce0 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b  om = &(array.ht[
26cf0 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79  h]);.      array
26d00 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a  .ht[h] = newnp;.
26d10 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78      }.    free(x
26d20 33 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78  3a->tbl);.    *x
26d30 33 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a  3a = array;.  }.
26d40 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
26d50 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20  new data */.  h 
26d60 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73 69 7a  = ph & (x3a->siz
26d70 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78  e-1);.  np = &(x
26d80 33 61 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63 6f 75  3a->tbl[x3a->cou
26d90 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65  nt++]);.  np->ke
26da0 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64  y = key;.  np->d
26db0 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66  ata = data;.  if
26dc0 28 20 78 33 61 2d 3e 68 74 5b 68 5d 20 29 20 78  ( x3a->ht[h] ) x
26dd0 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  3a->ht[h]->from 
26de0 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  = &(np->next);. 
26df0 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 33 61 2d   np->next = x3a-
26e00 3e 68 74 5b 68 5d 3b 0a 20 20 78 33 61 2d 3e 68  >ht[h];.  x3a->h
26e10 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d  t[h] = np;.  np-
26e20 3e 66 72 6f 6d 20 3d 20 26 28 78 33 61 2d 3e 68  >from = &(x3a->h
26e30 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  t[h]);.  return 
26e40 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  1;.}../* Return 
26e50 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
26e60 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  a assigned to th
26e70 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65  e given key.  Re
26e80 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
26e90 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a  no such key. */.
26ea0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74  struct state *St
26eb0 61 74 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20  ate_find(struct 
26ec0 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20  config *key).{. 
26ed0 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 78   unsigned h;.  x
26ee0 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  3node *np;..  if
26ef0 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x3a==0 ) retur
26f00 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 61 74 65  n 0;.  h = state
26f10 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 33 61  hash(key) & (x3a
26f20 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
26f30 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x3a->ht[h];.  
26f40 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
26f50 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70   if( statecmp(np
26f60 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20  ->key,key)==0 ) 
26f70 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20  break;.    np = 
26f80 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
26f90 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e  return np ? np->
26fa0 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  data : 0;.}../* 
26fb0 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20  Return an array 
26fc0 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  of pointers to a
26fd0 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  ll data in the t
26fe0 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72  able..** The arr
26ff0 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ay is obtained f
27000 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74  rom malloc.  Ret
27010 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f  urn NULL if memo
27020 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
27030 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66   problems, or if
27040 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65 6d   the array is em
27050 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  pty. */.struct s
27060 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72  tate **State_arr
27070 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75 63  ayof().{.  struc
27080 74 20 73 74 61 74 65 20 2a 2a 61 72 72 61 79 3b  t state **array;
27090 0a 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65  .  int i,arrSize
270a0 3b 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29  ;.  if( x3a==0 )
270b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 72 72   return 0;.  arr
270c0 53 69 7a 65 20 3d 20 78 33 61 2d 3e 63 6f 75 6e  Size = x3a->coun
270d0 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74  t;.  array = (st
270e0 72 75 63 74 20 73 74 61 74 65 20 2a 2a 29 63 61  ruct state **)ca
270f0 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69  lloc(arrSize, si
27100 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74 61 74  zeof(struct stat
27110 65 20 2a 29 29 3b 0a 20 20 69 66 28 20 61 72 72  e *));.  if( arr
27120 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ay ){.    for(i=
27130 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b  0; i<arrSize; i+
27140 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 33  +) array[i] = x3
27150 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a  a->tbl[i].data;.
27160 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72    }.  return arr
27170 61 79 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61  ay;.}../* Hash a
27180 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a   configuration *
27190 2f 0a 50 52 49 56 41 54 45 20 75 6e 73 69 67 6e  /.PRIVATE unsign
271a0 65 64 20 63 6f 6e 66 69 67 68 61 73 68 28 73 74  ed confighash(st
271b0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 29 0a  ruct config *a).
271c0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3d 30  {.  unsigned h=0
271d0 3b 0a 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20  ;.  h = h*571 + 
271e0 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20  a->rp->index*37 
271f0 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75  + a->dot;.  retu
27200 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72  rn h;.}../* Ther
27210 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
27220 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
27230 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  ng structure for
27240 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61   each.** associa
27250 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
27260 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 73 74 72 75  pe "x4"..*/.stru
27270 63 74 20 73 5f 78 34 20 7b 0a 20 20 69 6e 74 20  ct s_x4 {.  int 
27280 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
27290 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
272a0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73  r of available s
272b0 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lots. */.       
272c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
272d0 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20     /*   Must be 
272e0 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65  a power of 2 gre
272f0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a  ater than or */.
27300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65            /*   e
27320 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69  qual to 1 */.  i
27330 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20  nt count;       
27340 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
27350 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c   of currently sl
27360 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ots filled */.  
27370 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
27380 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61  *tbl;  /* The da
27390 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a  ta stored here *
273a0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e  /.  struct s_x4n
273b0 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61  ode **ht;  /* Ha
273c0 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f  sh table for loo
273d0 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  kups */.};../* T
273e0 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
273f0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
27400 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79  ucture for every
27410 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a   data element.**
27420 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69   in an associati
27430 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
27440 20 22 78 34 22 2e 0a 2a 2f 0a 74 79 70 65 64 65   "x4"..*/.typede
27450 66 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64  f struct s_x4nod
27460 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  e {.  struct con
27470 66 69 67 20 2a 64 61 74 61 3b 20 20 20 20 20 20  fig *data;      
27480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27490 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72  he data */.  str
274a0 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 6e 65  uct s_x4node *ne
274b0 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e  xt;   /* Next en
274c0 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
274d0 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75  e hash */.  stru
274e0 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 66 72  ct s_x4node **fr
274f0 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  om;  /* Previous
27500 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64   link */.} x4nod
27510 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  e;../* There is 
27520 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63  only one instanc
27530 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20  e of the array, 
27540 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c  which is the fol
27550 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63  lowing */.static
27560 20 73 74 72 75 63 74 20 73 5f 78 34 20 2a 78 34   struct s_x4 *x4
27570 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  a;../* Allocate 
27580 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76  a new associativ
27590 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20  e array */.void 
275a0 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74  Configtable_init
275b0 28 29 7b 0a 20 20 69 66 28 20 78 34 61 20 29 20  (){.  if( x4a ) 
275c0 72 65 74 75 72 6e 3b 0a 20 20 78 34 61 20 3d 20  return;.  x4a = 
275d0 28 73 74 72 75 63 74 20 73 5f 78 34 2a 29 6d 61  (struct s_x4*)ma
275e0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
275f0 75 63 74 20 73 5f 78 34 29 20 29 3b 0a 20 20 69  uct s_x4) );.  i
27600 66 28 20 78 34 61 20 29 7b 0a 20 20 20 20 78 34  f( x4a ){.    x4
27610 61 2d 3e 73 69 7a 65 20 3d 20 36 34 3b 0a 20 20  a->size = 64;.  
27620 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x4a->count = 0
27630 3b 0a 20 20 20 20 78 34 61 2d 3e 74 62 6c 20 3d  ;.    x4a->tbl =
27640 20 28 78 34 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63   (x4node*)calloc
27650 28 36 34 2c 20 73 69 7a 65 6f 66 28 78 34 6e 6f  (64, sizeof(x4no
27660 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e  de) + sizeof(x4n
27670 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20  ode*));.    if( 
27680 78 34 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20  x4a->tbl==0 ){. 
27690 20 20 20 20 20 66 72 65 65 28 78 34 61 29 3b 0a       free(x4a);.
276a0 20 20 20 20 20 20 78 34 61 20 3d 20 30 3b 0a 20        x4a = 0;. 
276b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
276c0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 34 61  int i;.      x4a
276d0 2d 3e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a  ->ht = (x4node**
276e0 29 26 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d 29  )&(x4a->tbl[64])
276f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
27700 20 69 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61 2d   i<64; i++) x4a-
27710 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
27720 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
27730 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
27740 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
27750 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
27760 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
27770 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
27780 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
27790 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
277a0 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65  .int Configtable
277b0 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 63  _insert(struct c
277c0 6f 6e 66 69 67 20 2a 64 61 74 61 29 0a 7b 0a 20  onfig *data).{. 
277d0 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75   x4node *np;.  u
277e0 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73  nsigned h;.  uns
277f0 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66 28  igned ph;..  if(
27800 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x4a==0 ) return
27810 20 30 3b 0a 20 20 70 68 20 3d 20 63 6f 6e 66 69   0;.  ph = confi
27820 67 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68  ghash(data);.  h
27830 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69   = ph & (x4a->si
27840 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34  ze-1);.  np = x4
27850 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
27860 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
27870 20 43 6f 6e 66 69 67 63 6d 70 28 28 63 6f 6e 73   Configcmp((cons
27880 74 20 63 68 61 72 20 2a 29 20 6e 70 2d 3e 64 61  t char *) np->da
27890 74 61 2c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ta,(const char *
278a0 29 20 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20  ) data)==0 ){.  
278b0 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
278c0 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  ng entry with th
278d0 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f  e same key is fo
278e0 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  und. */.      /*
278f0 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76   Fail because ov
27900 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61  erwrite is not a
27910 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  llows. */.      
27920 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
27930 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
27940 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 34 61  t;.  }.  if( x4a
27950 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73 69  ->count>=x4a->si
27960 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  ze ){.    /* Nee
27970 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61  d to make the ha
27980 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20  sh table bigger 
27990 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61 72 72  */.    int i,arr
279a0 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  Size;.    struct
279b0 20 73 5f 78 34 20 61 72 72 61 79 3b 0a 20 20 20   s_x4 array;.   
279c0 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 61 72   array.size = ar
279d0 72 53 69 7a 65 20 3d 20 78 34 61 2d 3e 73 69 7a  rSize = x4a->siz
279e0 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63  e*2;.    array.c
279f0 6f 75 6e 74 20 3d 20 78 34 61 2d 3e 63 6f 75 6e  ount = x4a->coun
27a00 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c  t;.    array.tbl
27a10 20 3d 20 28 78 34 6e 6f 64 65 2a 29 63 61 6c 6c   = (x4node*)call
27a20 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65  oc(arrSize, size
27a30 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x4node) + siz
27a40 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 3b 0a 20  eof(x4node*));. 
27a50 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c     if( array.tbl
27a60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
27a70 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20   /* Fail due to 
27a80 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a  malloc failure *
27a90 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d  /.    array.ht =
27aa0 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72 72   (x4node**)&(arr
27ab0 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d 29  ay.tbl[arrSize])
27ac0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
27ad0 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61  <arrSize; i++) a
27ae0 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a  rray.ht[i] = 0;.
27af0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78      for(i=0; i<x
27b00 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b  4a->count; i++){
27b10 0a 20 20 20 20 20 20 78 34 6e 6f 64 65 20 2a 6f  .      x4node *o
27b20 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20  ldnp, *newnp;.  
27b30 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 34      oldnp = &(x4
27b40 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  a->tbl[i]);.    
27b50 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68    h = confighash
27b60 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20  (oldnp->data) & 
27b70 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20  (arrSize-1);.   
27b80 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72     newnp = &(arr
27b90 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  ay.tbl[i]);.    
27ba0 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68    if( array.ht[h
27bb0 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d  ] ) array.ht[h]-
27bc0 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d  >from = &(newnp-
27bd0 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65  >next);.      ne
27be0 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61  wnp->next = arra
27bf0 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e  y.ht[h];.      n
27c00 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64  ewnp->data = old
27c10 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20  np->data;.      
27c20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  newnp->from = &(
27c30 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20  array.ht[h]);.  
27c40 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20      array.ht[h] 
27c50 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20  = newnp;.    }. 
27c60 20 20 20 66 72 65 65 28 78 34 61 2d 3e 74 62 6c     free(x4a->tbl
27c70 29 3b 0a 20 20 20 20 2a 78 34 61 20 3d 20 61 72  );.    *x4a = ar
27c80 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e  ray;.  }.  /* In
27c90 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74  sert the new dat
27ca0 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20  a */.  h = ph & 
27cb0 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x4a->size-1);. 
27cc0 20 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c   np = &(x4a->tbl
27cd0 5b 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b  [x4a->count++]);
27ce0 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61  .  np->data = da
27cf0 74 61 3b 0a 20 20 69 66 28 20 78 34 61 2d 3e 68  ta;.  if( x4a->h
27d00 74 5b 68 5d 20 29 20 78 34 61 2d 3e 68 74 5b 68  t[h] ) x4a->ht[h
27d10 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e  ]->from = &(np->
27d20 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78  next);.  np->nex
27d30 74 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a  t = x4a->ht[h];.
27d40 20 20 78 34 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e    x4a->ht[h] = n
27d50 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20  p;.  np->from = 
27d60 26 28 78 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20  &(x4a->ht[h]);. 
27d70 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
27d80 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
27d90 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e  r to data assign
27da0 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  ed to the given 
27db0 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  key.  Return NUL
27dc0 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20  L.** if no such 
27dd0 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 63  key. */.struct c
27de0 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62  onfig *Configtab
27df0 6c 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63  le_find(struct c
27e00 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20  onfig *key).{.  
27e10 69 6e 74 20 68 3b 0a 20 20 78 34 6e 6f 64 65 20  int h;.  x4node 
27e20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d  *np;..  if( x4a=
27e30 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
27e40 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28   h = confighash(
27e50 6b 65 79 29 20 26 20 28 78 34 61 2d 3e 73 69 7a  key) & (x4a->siz
27e60 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61  e-1);.  np = x4a
27e70 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
27e80 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
27e90 43 6f 6e 66 69 67 63 6d 70 28 28 63 6f 6e 73 74  Configcmp((const
27ea0 20 63 68 61 72 20 2a 29 20 6e 70 2d 3e 64 61 74   char *) np->dat
27eb0 61 2c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  a,(const char *)
27ec0 20 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b   key)==0 ) break
27ed0 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
27ee0 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
27ef0 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
27f00 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f 76  : 0;.}../* Remov
27f10 65 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20  e all data from 
27f20 74 68 65 20 74 61 62 6c 65 2e 20 20 50 61 73 73  the table.  Pass
27f30 20 65 61 63 68 20 64 61 74 61 20 74 6f 20 74 68   each data to th
27f40 65 20 66 75 6e 63 74 69 6f 6e 20 22 66 22 0a 2a  e function "f".*
27f50 2a 20 61 73 20 69 74 20 69 73 20 72 65 6d 6f 76  * as it is remov
27f60 65 64 2e 20 20 28 22 66 22 20 6d 61 79 20 62 65  ed.  ("f" may be
27f70 20 6e 75 6c 6c 20 74 6f 20 61 76 6f 69 64 20 74   null to avoid t
27f80 68 69 73 20 73 74 65 70 2e 29 20 2a 2f 0a 76 6f  his step.) */.vo
27f90 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63  id Configtable_c
27fa0 6c 65 61 72 28 69 6e 74 28 2a 66 29 28 73 74 72  lear(int(*f)(str
27fb0 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 29 0a 7b  uct config *)).{
27fc0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
27fd0 78 34 61 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e 63  x4a==0 || x4a->c
27fe0 6f 75 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  ount==0 ) return
27ff0 3b 0a 20 20 69 66 28 20 66 20 29 20 66 6f 72 28  ;.  if( f ) for(
28000 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e  i=0; i<x4a->coun
28010 74 3b 20 69 2b 2b 29 20 28 2a 66 29 28 78 34 61  t; i++) (*f)(x4a
28020 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 29 3b 0a  ->tbl[i].data);.
28030 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61    for(i=0; i<x4a
28040 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29 20 78 34 61  ->size; i++) x4a
28050 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 78  ->ht[i] = 0;.  x
28060 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  4a->count = 0;. 
28070 20 72 65 74 75 72 6e 3b 0a 7d 0a                  return;.}.