/ Hex Artifact Content
Login

Artifact 501104fc7fbb01a86078841bed704184ccfd6036:


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: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70  struct symbol *p
2680: 72 65 63 73 79 6d 3b 20 20 2f 2a 20 50 72 65 63  recsym;  /* Prec
2690: 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 66 6f  edence symbol fo
26a0: 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20  r this rule */. 
26b0: 20 69 6e 74 20 69 6e 64 65 78 3b 20 20 20 20 20   int index;     
26c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
26d0: 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f 72  index number for
26e0: 20 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20   this rule */.  
26f0: 42 6f 6f 6c 65 61 6e 20 63 61 6e 52 65 64 75 63  Boolean canReduc
2700: 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e;       /* True
2710: 20 69 66 20 74 68 69 73 20 72 75 6c 65 20 69 73   if this rule is
2720: 20 65 76 65 72 20 72 65 64 75 63 65 64 20 2a 2f   ever reduced */
2730: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
2740: 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e  nextlhs;    /* N
2750: 65 78 74 20 72 75 6c 65 20 77 69 74 68 20 74 68  ext rule with th
2760: 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20  e same LHS */.  
2770: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78  struct rule *nex
2780: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  t;       /* Next
2790: 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f   rule in the glo
27a0: 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a  bal list */.};..
27b0: 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72 61 74 69  /* A configurati
27c0: 6f 6e 20 69 73 20 61 20 70 72 6f 64 75 63 74 69  on is a producti
27d0: 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68 65 20 67  on rule of the g
27e0: 72 61 6d 6d 61 72 20 74 6f 67 65 74 68 65 72 20  rammar together 
27f0: 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28  with.** a mark (
2800: 64 6f 74 29 20 73 68 6f 77 69 6e 67 20 68 6f 77  dot) showing how
2810: 20 6d 75 63 68 20 6f 66 20 74 68 61 74 20 72 75   much of that ru
2820: 6c 65 20 68 61 73 20 62 65 65 6e 20 70 72 6f 63  le has been proc
2830: 65 73 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a  essed so far..**
2840: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   Configurations 
2850: 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66  also contain a f
2860: 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63 68 20  ollow-set which 
2870: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 65 72  is a list of ter
2880: 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73  minal.** symbols
2890: 20 77 68 69 63 68 20 61 72 65 20 61 6c 6c 6f 77   which are allow
28a0: 65 64 20 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c  ed to immediatel
28b0: 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64  y follow the end
28c0: 20 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a   of the rule..**
28d0: 20 45 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61   Every configura
28e0: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
28f0: 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   as an instance 
2900: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2910: 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67 73 74 61  : */.enum cfgsta
2920: 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c 45 54 45  tus {.  COMPLETE
2930: 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54 45 0a 7d  ,.  INCOMPLETE.}
2940: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
2950: 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  {.  struct rule 
2960: 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  *rp;         /* 
2970: 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77 68  The rule upon wh
2980: 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ich the configur
2990: 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20 2a  ation is based *
29a0: 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20 20  /.  int dot;    
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29c0: 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74 20  The parse point 
29d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b 20  */.  char *fws; 
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29f0: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 20   Follow-set for 
2a00: 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  this configurati
2a10: 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  on only */.  str
2a20: 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b  uct plink *fplp;
2a30: 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d        /* Follow-
2a40: 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f 70  set forward prop
2a50: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f  agation links */
2a60: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
2a70: 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46  *bplp;      /* F
2a80: 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77 61  ollow-set backwa
2a90: 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  rds propagation 
2aa0: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63  links */.  struc
2ab0: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20  t state *stp;   
2ac0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2ad0: 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63 6f  o state which co
2ae0: 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a 20  ntains this */. 
2af0: 20 65 6e 75 6d 20 63 66 67 73 74 61 74 75 73 20   enum cfgstatus 
2b00: 73 74 61 74 75 73 3b 20 20 20 2f 2a 20 75 73 65  status;   /* use
2b10: 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f 77 73  d during follows
2b20: 65 74 20 61 6e 64 20 73 68 69 66 74 20 63 6f 6d  et and shift com
2b30: 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  putations */.  s
2b40: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
2b50: 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  xt;     /* Next 
2b60: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e  configuration in
2b70: 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a 20 20   the state */.  
2b80: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
2b90: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
2ba0: 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e 66 69  next basis confi
2bb0: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a  guration */.};..
2bc0: 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 7b 0a  enum e_action {.
2bd0: 20 20 53 48 49 46 54 2c 0a 20 20 41 43 43 45 50    SHIFT,.  ACCEP
2be0: 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a 20 20 45  T,.  REDUCE,.  E
2bf0: 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e 46 4c 49  RROR,.  SSCONFLI
2c00: 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CT,             
2c10: 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68 69 66   /* A shift/shif
2c20: 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  t conflict */.  
2c30: 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20  SRCONFLICT,     
2c40: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20           /* Was 
2c50: 61 20 72 65 64 75 63 65 2c 20 62 75 74 20 70 61  a reduce, but pa
2c60: 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63 74  rt of a conflict
2c70: 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c 49 43 54   */.  RRCONFLICT
2c80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2c90: 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c 20  * Was a reduce, 
2ca0: 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  but part of a co
2cb0: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 48 5f 52  nflict */.  SH_R
2cc0: 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20  ESOLVED,        
2cd0: 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 73 68       /* Was a sh
2ce0: 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e 63 65  ift.  Precedence
2cf0: 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69   resolved confli
2d00: 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45 53 4f 4c  ct */.  RD_RESOL
2d10: 56 45 44 2c 20 20 20 20 20 20 20 20 20 20 20 20  VED,            
2d20: 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65 2e 20   /* Was reduce. 
2d30: 20 50 72 65 63 65 64 65 6e 63 65 20 72 65 73 6f   Precedence reso
2d40: 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  lved conflict */
2d50: 0a 20 20 4e 4f 54 5f 55 53 45 44 2c 20 20 20 20  .  NOT_USED,    
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2d70: 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70 72 65  eleted by compre
2d80: 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 48 49 46 54  ssion */.  SHIFT
2d90: 52 45 44 55 43 45 20 20 20 20 20 20 20 20 20 20  REDUCE          
2da0: 20 20 20 20 2f 2a 20 53 68 69 66 74 20 66 69 72      /* Shift fir
2db0: 73 74 2c 20 74 68 65 6e 20 72 65 64 75 63 65 20  st, then reduce 
2dc0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79 20  */.};../* Every 
2dd0: 73 68 69 66 74 20 6f 72 20 72 65 64 75 63 65 20  shift or reduce 
2de0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 74 6f  operation is sto
2df0: 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20 74 68  red as one of th
2e00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
2e10: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a 20  truct action {. 
2e20: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
2e30: 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  sp;       /* The
2e40: 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d 62   look-ahead symb
2e50: 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61  ol */.  enum e_a
2e60: 63 74 69 6f 6e 20 74 79 70 65 3b 0a 20 20 75 6e  ction type;.  un
2e70: 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75 63 74  ion {.    struct
2e80: 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 20   state *stp;    
2e90: 20 2f 2a 20 54 68 65 20 6e 65 77 20 73 74 61 74   /* The new stat
2ea0: 65 2c 20 69 66 20 61 20 73 68 69 66 74 20 2a 2f  e, if a shift */
2eb0: 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65  .    struct rule
2ec0: 20 2a 72 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *rp;       /* T
2ed0: 68 65 20 72 75 6c 65 2c 20 69 66 20 61 20 72 65  he rule, if a re
2ee0: 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a 20  duce */.  } x;. 
2ef0: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
2f00: 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78  next;     /* Nex
2f10: 74 20 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  t action for thi
2f20: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  s state */.  str
2f30: 75 63 74 20 61 63 74 69 6f 6e 20 2a 63 6f 6c 6c  uct action *coll
2f40: 69 64 65 3b 20 20 2f 2a 20 4e 65 78 74 20 61 63  ide;  /* Next ac
2f50: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73 61  tion with the sa
2f60: 6d 65 20 68 61 73 68 20 2a 2f 0a 7d 3b 0a 0a 2f  me hash */.};../
2f70: 2a 20 45 61 63 68 20 73 74 61 74 65 20 6f 66 20  * Each state of 
2f80: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70 61  the generated pa
2f90: 72 73 65 72 27 73 20 66 69 6e 69 74 65 20 73 74  rser's finite st
2fa0: 61 74 65 20 6d 61 63 68 69 6e 65 0a 2a 2a 20 69  ate machine.** i
2fb0: 73 20 65 6e 63 6f 64 65 64 20 61 73 20 61 6e 20  s encoded as an 
2fc0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2fd0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2fe0: 75 72 65 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  ure. */.struct s
2ff0: 74 61 74 65 20 7b 0a 20 20 73 74 72 75 63 74 20  tate {.  struct 
3000: 63 6f 6e 66 69 67 20 2a 62 70 3b 20 20 20 20 20  config *bp;     
3010: 20 20 2f 2a 20 54 68 65 20 62 61 73 69 73 20 63    /* The basis c
3020: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 66 6f  onfigurations fo
3030: 72 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a  r this state */.
3040: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
3050: 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a 20 41 6c  *cfp;      /* Al
3060: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  l configurations
3070: 20 69 6e 20 74 68 69 73 20 73 65 74 20 2a 2f 0a   in this set */.
3080: 20 20 69 6e 74 20 73 74 61 74 65 6e 75 6d 3b 20    int statenum; 
3090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
30a0: 71 75 65 6e 74 69 61 6c 20 6e 75 6d 62 65 72 20  quential number 
30b0: 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20 2a  for this state *
30c0: 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  /.  struct actio
30d0: 6e 20 2a 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  n *ap;       /* 
30e0: 41 72 72 61 79 20 6f 66 20 61 63 74 69 6f 6e 73  Array of actions
30f0: 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20   for this state 
3100: 2a 2f 0a 20 20 69 6e 74 20 6e 54 6b 6e 41 63 74  */.  int nTknAct
3110: 2c 20 6e 4e 74 41 63 74 3b 20 20 20 20 20 2f 2a  , nNtAct;     /*
3120: 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 6f   Number of actio
3130: 6e 73 20 6f 6e 20 74 65 72 6d 69 6e 61 6c 73 20  ns on terminals 
3140: 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73  and nonterminals
3150: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6b 6e 4f 66   */.  int iTknOf
3160: 73 74 2c 20 69 4e 74 4f 66 73 74 3b 20 20 20 2f  st, iNtOfst;   /
3170: 2a 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 6f 66  * yy_action[] of
3180: 66 73 65 74 20 66 6f 72 20 74 65 72 6d 69 6e 61  fset for termina
3190: 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 73 20  ls and nonterms 
31a0: 2a 2f 0a 20 20 69 6e 74 20 69 44 66 6c 74 52 65  */.  int iDfltRe
31b0: 64 75 63 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  duce;         /*
31c0: 20 44 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20   Default action 
31d0: 69 73 20 74 6f 20 52 45 44 55 43 45 20 62 79 20  is to REDUCE by 
31e0: 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 73  this rule */.  s
31f0: 74 72 75 63 74 20 72 75 6c 65 20 2a 70 44 66 6c  truct rule *pDfl
3200: 74 52 65 64 75 63 65 3b 2f 2a 20 54 68 65 20 64  tReduce;/* The d
3210: 65 66 61 75 6c 74 20 52 45 44 55 43 45 20 72 75  efault REDUCE ru
3220: 6c 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74  le. */.  int aut
3230: 6f 52 65 64 75 63 65 3b 20 20 20 20 20 20 20 20  oReduce;        
3240: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
3250: 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 72 65 64  s is an auto-red
3260: 75 63 65 20 73 74 61 74 65 20 2a 2f 0a 7d 3b 0a  uce state */.};.
3270: 23 64 65 66 69 6e 65 20 4e 4f 5f 4f 46 46 53 45  #define NO_OFFSE
3280: 54 20 28 2d 32 31 34 37 34 38 33 36 34 37 29 0a  T (-2147483647).
3290: 0a 2f 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20  ./* A followset 
32a0: 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
32b0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
32c0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
32d0: 6f 6e 65 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61  one.** configura
32e0: 74 69 6f 6e 20 66 6f 6c 6c 6f 77 73 65 74 20 73  tion followset s
32f0: 68 6f 75 6c 64 20 62 65 20 70 72 6f 70 61 67 61  hould be propaga
3300: 74 65 64 20 74 6f 20 61 6e 6f 74 68 65 72 20 77  ted to another w
3310: 68 65 6e 65 76 65 72 0a 2a 2a 20 74 68 65 20 66  henever.** the f
3320: 69 72 73 74 20 63 68 61 6e 67 65 73 2e 20 2a 2f  irst changes. */
3330: 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 7b 0a  .struct plink {.
3340: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
3350: 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  *cfp;      /* Th
3360: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
3370: 74 6f 20 77 68 69 63 68 20 6c 69 6e 6b 65 64 20  to which linked 
3380: 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  */.  struct plin
3390: 6b 20 2a 6e 65 78 74 3b 20 20 20 20 20 20 2f 2a  k *next;      /*
33a0: 20 54 68 65 20 6e 65 78 74 20 70 72 6f 70 61 67   The next propag
33b0: 61 74 65 20 6c 69 6e 6b 20 2a 2f 0a 7d 3b 0a 0a  ate link */.};..
33c0: 2f 2a 20 54 68 65 20 73 74 61 74 65 20 76 65 63  /* The state vec
33d0: 74 6f 72 20 66 6f 72 20 74 68 65 20 65 6e 74 69  tor for the enti
33e0: 72 65 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  re parser genera
33f0: 74 6f 72 20 69 73 20 72 65 63 6f 72 64 65 64 20  tor is recorded 
3400: 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 2e 20 20  as.** follows.  
3410: 28 4c 45 4d 4f 4e 20 75 73 65 73 20 6e 6f 20 67  (LEMON uses no g
3420: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
3430: 61 6e 64 20 6d 61 6b 65 73 20 6c 69 74 74 6c 65  and makes little
3440: 20 75 73 65 20 6f 66 0a 2a 2a 20 73 74 61 74 69   use of.** stati
3450: 63 20 76 61 72 69 61 62 6c 65 73 2e 20 20 46 69  c variables.  Fi
3460: 65 6c 64 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  elds in the foll
3470: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
3480: 63 61 6e 20 62 65 20 74 68 6f 75 67 68 74 0a 2a  can be thought.*
3490: 2a 20 6f 66 20 61 73 20 62 65 67 69 6e 20 67 6c  * of as begin gl
34a0: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 69  obal variables i
34b0: 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 29 20  n the program.) 
34c0: 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  */.struct lemon 
34d0: 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
34e0: 20 2a 2a 73 6f 72 74 65 64 3b 20 20 20 2f 2a 20   **sorted;   /* 
34f0: 54 61 62 6c 65 20 6f 66 20 73 74 61 74 65 73 20  Table of states 
3500: 73 6f 72 74 65 64 20 62 79 20 73 74 61 74 65 20  sorted by state 
3510: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72 75  number */.  stru
3520: 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20  ct rule *rule;  
3530: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
3540: 61 6c 6c 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69  all rules */.  i
3550: 6e 74 20 6e 73 74 61 74 65 3b 20 20 20 20 20 20  nt nstate;      
3560: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3570: 72 20 6f 66 20 73 74 61 74 65 73 20 2a 2f 0a 20  r of states */. 
3580: 20 69 6e 74 20 6e 78 73 74 61 74 65 3b 20 20 20   int nxstate;   
3590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 73 74            /* nst
35a0: 61 74 65 20 77 69 74 68 20 74 61 69 6c 20 64 65  ate with tail de
35b0: 67 65 6e 65 72 61 74 65 20 73 74 61 74 65 73 20  generate states 
35c0: 72 65 6d 6f 76 65 64 20 2a 2f 0a 20 20 69 6e 74  removed */.  int
35d0: 20 6e 72 75 6c 65 3b 20 20 20 20 20 20 20 20 20   nrule;         
35e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
35f0: 6f 66 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e  of rules */.  in
3600: 74 20 6e 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20  t nsymbol;      
3610: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3620: 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64   of terminal and
3630: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 73 79 6d   nonterminal sym
3640: 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 74  bols */.  int nt
3650: 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20 20 20  erminal;        
3660: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3670: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
3680: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
3690: 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20 2f  bol **symbols; /
36a0: 2a 20 53 6f 72 74 65 64 20 61 72 72 61 79 20 6f  * Sorted array o
36b0: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 79  f pointers to sy
36c0: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65  mbols */.  int e
36d0: 72 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20 20  rrorcnt;        
36e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
36f0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 74 72   errors */.  str
3700: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73  uct symbol *errs
3710: 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20 65 72 72  ym;   /* The err
3720: 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73  or symbol */.  s
3730: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 77 69  truct symbol *wi
3740: 6c 64 63 61 72 64 3b 20 2f 2a 20 54 6f 6b 65 6e  ldcard; /* Token
3750: 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61 6e   that matches an
3760: 79 74 68 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  ything */.  char
3770: 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   *name;         
3780: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3790: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70 61  the generated pa
37a0: 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  rser */.  char *
37b0: 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  arg;            
37c0: 20 20 20 2f 2a 20 44 65 63 6c 61 72 61 74 69 6f     /* Declaratio
37d0: 6e 20 6f 66 20 74 68 65 20 33 74 68 20 61 72 67  n of the 3th arg
37e0: 75 6d 65 6e 74 20 74 6f 20 70 61 72 73 65 72 20  ument to parser 
37f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e  */.  char *token
3800: 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  type;         /*
3810: 20 54 79 70 65 20 6f 66 20 74 65 72 6d 69 6e 61   Type of termina
3820: 6c 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65  l symbols in the
3830: 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a 2f   parser stack */
3840: 0a 20 20 63 68 61 72 20 2a 76 61 72 74 79 70 65  .  char *vartype
3850: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
3860: 68 65 20 64 65 66 61 75 6c 74 20 74 79 70 65 20  he default type 
3870: 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  of non-terminal 
3880: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61  symbols */.  cha
3890: 72 20 2a 73 74 61 72 74 3b 20 20 20 20 20 20 20  r *start;       
38a0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
38b0: 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f   the start symbo
38c0: 6c 20 66 6f 72 20 74 68 65 20 67 72 61 6d 6d 61  l for the gramma
38d0: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74 61  r */.  char *sta
38e0: 63 6b 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  cksize;         
38f0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70  /* Size of the p
3900: 61 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20  arser stack */. 
3910: 20 63 68 61 72 20 2a 69 6e 63 6c 75 64 65 3b 20   char *include; 
3920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64            /* Cod
3930: 65 20 74 6f 20 70 75 74 20 61 74 20 74 68 65 20  e to put at the 
3940: 73 74 61 72 74 20 6f 66 20 74 68 65 20 43 20 66  start of the C f
3950: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65  ile */.  char *e
3960: 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rror;           
3970: 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65    /* Code to exe
3980: 63 75 74 65 20 77 68 65 6e 20 61 6e 20 65 72 72  cute when an err
3990: 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  or is seen */.  
39a0: 63 68 61 72 20 2a 6f 76 65 72 66 6c 6f 77 3b 20  char *overflow; 
39b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
39c0: 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e 20 61   to execute on a
39d0: 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 20   stack overflow 
39e0: 2a 2f 0a 20 20 63 68 61 72 20 2a 66 61 69 6c 75  */.  char *failu
39f0: 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  re;           /*
3a00: 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65   Code to execute
3a10: 20 6f 6e 20 70 61 72 73 65 72 20 66 61 69 6c 75   on parser failu
3a20: 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 63  re */.  char *ac
3a30: 63 65 70 74 3b 20 20 20 20 20 20 20 20 20 20 20  cept;           
3a40: 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63   /* Code to exec
3a50: 75 74 65 20 77 68 65 6e 20 74 68 65 20 70 61 72  ute when the par
3a60: 73 65 72 20 65 78 63 65 70 74 73 20 2a 2f 0a 20  ser excepts */. 
3a70: 20 63 68 61 72 20 2a 65 78 74 72 61 63 6f 64 65   char *extracode
3a80: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64  ;         /* Cod
3a90: 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
3aa0: 65 20 67 65 6e 65 72 61 74 65 64 20 66 69 6c 65  e generated file
3ab0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65   */.  char *toke
3ac0: 6e 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 2f  ndest;         /
3ad0: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
3ae0: 65 20 74 6f 20 64 65 73 74 72 6f 79 20 74 6f 6b  e to destroy tok
3af0: 65 6e 20 64 61 74 61 20 2a 2f 0a 20 20 63 68 61  en data */.  cha
3b00: 72 20 2a 76 61 72 64 65 73 74 3b 20 20 20 20 20  r *vardest;     
3b10: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 66 6f        /* Code fo
3b20: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 6e 6f  r the default no
3b30: 6e 2d 74 65 72 6d 69 6e 61 6c 20 64 65 73 74 72  n-terminal destr
3b40: 75 63 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20  uctor */.  char 
3b50: 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  *filename;      
3b60: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
3b70: 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
3b80: 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e 61 6d 65  .  char *outname
3b90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
3ba0: 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65  ame of the curre
3bb0: 6e 74 20 6f 75 74 70 75 74 20 66 69 6c 65 20 2a  nt output file *
3bc0: 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 70  /.  char *tokenp
3bd0: 72 65 66 69 78 3b 20 20 20 20 20 20 20 2f 2a 20  refix;       /* 
3be0: 41 20 70 72 65 66 69 78 20 61 64 64 65 64 20 74  A prefix added t
3bf0: 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73 20 69 6e  o token names in
3c00: 20 74 68 65 20 2e 68 20 66 69 6c 65 20 2a 2f 0a   the .h file */.
3c10: 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69 63 74 3b    int nconflict;
3c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3c30: 6d 62 65 72 20 6f 66 20 70 61 72 73 69 6e 67 20  mber of parsing 
3c40: 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20 69  conflicts */.  i
3c50: 6e 74 20 6e 61 63 74 69 6f 6e 74 61 62 3b 20 20  nt nactiontab;  
3c60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3c70: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
3c80: 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  the yy_action[] 
3c90: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74  table */.  int t
3ca0: 61 62 6c 65 73 69 7a 65 3b 20 20 20 20 20 20 20  ablesize;       
3cb0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 74 61 62      /* Total tab
3cc0: 6c 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 74  le size of all t
3cd0: 61 62 6c 65 73 20 69 6e 20 62 79 74 65 73 20 2a  ables in bytes *
3ce0: 2f 0a 20 20 69 6e 74 20 62 61 73 69 73 66 6c 61  /.  int basisfla
3cf0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g;           /* 
3d00: 50 72 69 6e 74 20 6f 6e 6c 79 20 62 61 73 69 73  Print only basis
3d10: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
3d20: 2a 2f 0a 20 20 69 6e 74 20 68 61 73 5f 66 61 6c  */.  int has_fal
3d30: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a  lback;        /*
3d40: 20 54 72 75 65 20 69 66 20 61 6e 79 20 25 66 61   True if any %fa
3d50: 6c 6c 62 61 63 6b 20 69 73 20 73 65 65 6e 20 69  llback is seen i
3d60: 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f  n the grammar */
3d70: 0a 20 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73  .  int nolinenos
3d80: 66 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 54  flag;       /* T
3d90: 72 75 65 20 69 66 20 23 6c 69 6e 65 20 73 74 61  rue if #line sta
3da0: 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 6e  tements should n
3db0: 6f 74 20 62 65 20 70 72 69 6e 74 65 64 20 2a 2f  ot be printed */
3dc0: 0a 20 20 63 68 61 72 20 2a 61 72 67 76 30 3b 20  .  char *argv0; 
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3de0: 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ame of the progr
3df0: 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e  am */.};..#defin
3e00: 65 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 58 29  e MemoryCheck(X)
3e10: 20 69 66 28 28 58 29 3d 3d 30 29 7b 20 5c 0a 20   if((X)==0){ \. 
3e20: 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d   extern void mem
3e30: 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c 0a 20  ory_error(); \. 
3e40: 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b   memory_error();
3e50: 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a   \.}../*********
3e60: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
3e70: 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 68 22 20   file "table.h" 
3e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ea0: 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64  */./*.** All cod
3eb0: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  e in this file h
3ec0: 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61 74 69  as been automati
3ed0: 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 0a  cally generated.
3ee0: 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63 69 66  ** from a specif
3ef0: 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 66  ication in the f
3f00: 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ile.**          
3f10: 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a      "table.q".**
3f20: 20 62 79 20 74 68 65 20 61 73 73 6f 63 69 61 74   by the associat
3f30: 69 76 65 20 61 72 72 61 79 20 63 6f 64 65 20 62  ive array code b
3f40: 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d 20  uilding program 
3f50: 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e  "aagen"..** Do n
3f60: 6f 74 20 65 64 69 74 20 74 68 69 73 20 66 69 6c  ot edit this fil
3f70: 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65 64 69  e!  Instead, edi
3f80: 74 20 74 68 65 20 73 70 65 63 69 66 69 63 61 74  t the specificat
3f90: 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  ion.** file, the
3fa0: 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a  n rerun aagen..*
3fb0: 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72  /./*.** Code for
3fc0: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61 62 6c   processing tabl
3fd0: 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20  es in the LEMON 
3fe0: 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
3ff0: 2e 0a 2a 2f 0a 2f 2a 20 52 6f 75 74 69 6e 65 73  ..*/./* Routines
4000: 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 61 20   for handling a 
4010: 73 74 72 69 6e 67 73 20 2a 2f 0a 0a 63 6f 6e 73  strings */..cons
4020: 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65 28  t char *Strsafe(
4030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a  const char *);..
4040: 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e 69  void Strsafe_ini
4050: 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53 74 72  t(void);.int Str
4060: 73 61 66 65 5f 69 6e 73 65 72 74 28 63 6f 6e 73  safe_insert(cons
4070: 74 20 63 68 61 72 20 2a 29 3b 0a 63 6f 6e 73 74  t char *);.const
4080: 20 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f 66   char *Strsafe_f
4090: 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ind(const char *
40a0: 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20  );../* Routines 
40b0: 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 73 79 6d  for handling sym
40c0: 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61 6d  bols of the gram
40d0: 6d 61 72 20 2a 2f 0a 0a 73 74 72 75 63 74 20 73  mar */..struct s
40e0: 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65  ymbol *Symbol_ne
40f0: 77 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  w(const char *);
4100: 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28  .int Symbolcmpp(
4110: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2c 20 63 6f  const void *, co
4120: 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 76 6f 69  nst void *);.voi
4130: 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 76 6f  d Symbol_init(vo
4140: 69 64 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f  id);.int Symbol_
4150: 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 73 79  insert(struct sy
4160: 6d 62 6f 6c 20 2a 2c 20 63 6f 6e 73 74 20 63 68  mbol *, const ch
4170: 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 79  ar *);.struct sy
4180: 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e  mbol *Symbol_fin
4190: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  d(const char *);
41a0: 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
41b0: 53 79 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74 29 3b  Symbol_Nth(int);
41c0: 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e  .int Symbol_coun
41d0: 74 28 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20  t(void);.struct 
41e0: 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f  symbol **Symbol_
41f0: 61 72 72 61 79 6f 66 28 76 6f 69 64 29 3b 0a 0a  arrayof(void);..
4200: 2f 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 6d  /* Routines to m
4210: 61 6e 61 67 65 20 74 68 65 20 73 74 61 74 65 20  anage the state 
4220: 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e 74 20 43 6f  table */..int Co
4230: 6e 66 69 67 63 6d 70 28 63 6f 6e 73 74 20 63 68  nfigcmp(const ch
4240: 61 72 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ar *, const char
4250: 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74   *);.struct stat
4260: 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 76 6f 69  e *State_new(voi
4270: 64 29 3b 0a 76 6f 69 64 20 53 74 61 74 65 5f 69  d);.void State_i
4280: 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53  nit(void);.int S
4290: 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74 72 75  tate_insert(stru
42a0: 63 74 20 73 74 61 74 65 20 2a 2c 20 73 74 72 75  ct state *, stru
42b0: 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74  ct config *);.st
42c0: 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74  ruct state *Stat
42d0: 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f  e_find(struct co
42e0: 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75 63 74 20  nfig *);.struct 
42f0: 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72  state **State_ar
4300: 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a  rayof(/*  */);..
4310: 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64  /* Routines used
4320: 20 66 6f 72 20 65 66 66 69 63 69 65 6e 63 79 20   for efficiency 
4330: 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  in Configlist_ad
4340: 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69  d */..void Confi
4350: 67 74 61 62 6c 65 5f 69 6e 69 74 28 76 6f 69 64  gtable_init(void
4360: 29 3b 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62  );.int Configtab
4370: 6c 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74  le_insert(struct
4380: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75   config *);.stru
4390: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
43a0: 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74 72 75  gtable_find(stru
43b0: 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f  ct config *);.vo
43c0: 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63  id Configtable_c
43d0: 6c 65 61 72 28 69 6e 74 28 2a 29 28 73 74 72 75  lear(int(*)(stru
43e0: 63 74 20 63 6f 6e 66 69 67 20 2a 29 29 3b 0a 0a  ct config *));..
43f0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
4400: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
4410: 65 20 22 61 63 74 69 6f 6e 2e 63 22 20 2a 2a 2a  e "action.c" ***
4420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
4440: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f  .** Routines pro
4450: 63 65 73 73 69 6e 67 20 70 61 72 73 65 72 20 61  cessing parser a
4460: 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 45  ctions in the LE
4470: 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
4480: 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 41 6c 6c  ator..*/../* All
4490: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 72 73  ocate a new pars
44a0: 65 72 20 61 63 74 69 6f 6e 20 2a 2f 0a 73 74 61  er action */.sta
44b0: 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f  tic struct actio
44c0: 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77 28 76 6f  n *Action_new(vo
44d0: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74  id){.  static st
44e0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 66 72 65  ruct action *fre
44f0: 65 6c 69 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  elist = 0;.  str
4500: 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 61  uct action *newa
4510: 63 74 69 6f 6e 3b 0a 0a 20 20 69 66 28 20 66 72  ction;..  if( fr
4520: 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
4530: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
4540: 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 66  amt = 100;.    f
4550: 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63  reelist = (struc
4560: 74 20 61 63 74 69 6f 6e 20 2a 29 63 61 6c 6c 6f  t action *)callo
4570: 63 28 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74  c(amt, sizeof(st
4580: 72 75 63 74 20 61 63 74 69 6f 6e 29 29 3b 0a 20  ruct action));. 
4590: 20 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d     if( freelist=
45a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
45b0: 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62  ntf(stderr,"Unab
45c0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
45d0: 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20  emory for a new 
45e0: 70 61 72 73 65 72 20 61 63 74 69 6f 6e 2e 22 29  parser action.")
45f0: 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
4600: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
4610: 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b  =0; i<amt-1; i++
4620: 29 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65  ) freelist[i].ne
4630: 78 74 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69  xt = &freelist[i
4640: 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  +1];.    freelis
4650: 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20  t[amt-1].next = 
4660: 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 61 63 74 69  0;.  }.  newacti
4670: 6f 6e 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20  on = freelist;. 
4680: 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65 65   freelist = free
4690: 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65  list->next;.  re
46a0: 74 75 72 6e 20 6e 65 77 61 63 74 69 6f 6e 3b 0a  turn newaction;.
46b0: 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77  }../* Compare tw
46c0: 6f 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 73 6f  o actions for so
46d0: 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  rting purposes. 
46e0: 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
46f0: 2c 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20 70 6f  , zero, or.** po
4700: 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
4710: 72 73 74 20 61 63 74 69 6f 6e 20 69 73 20 6c 65  rst action is le
4720: 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
4730: 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
4740: 61 6e 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 0a  an.** the first.
4750: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
4760: 74 69 6f 6e 63 6d 70 28 0a 20 20 73 74 72 75 63  tioncmp(.  struc
4770: 74 20 61 63 74 69 6f 6e 20 2a 61 70 31 2c 0a 20  t action *ap1,. 
4780: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
4790: 61 70 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ap2.){.  int rc;
47a0: 0a 20 20 72 63 20 3d 20 61 70 31 2d 3e 73 70 2d  .  rc = ap1->sp-
47b0: 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e 73 70  >index - ap2->sp
47c0: 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 72  ->index;.  if( r
47d0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==0 ){.    rc =
47e0: 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70 65 20   (int)ap1->type 
47f0: 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79 70 65  - (int)ap2->type
4800: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
4810: 30 20 26 26 20 28 61 70 31 2d 3e 74 79 70 65 3d  0 && (ap1->type=
4820: 3d 52 45 44 55 43 45 20 7c 7c 20 61 70 31 2d 3e  =REDUCE || ap1->
4830: 74 79 70 65 3d 3d 53 48 49 46 54 52 45 44 55 43  type==SHIFTREDUC
4840: 45 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61  E) ){.    rc = a
4850: 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20  p1->x.rp->index 
4860: 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64  - ap2->x.rp->ind
4870: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ex;.  }.  if( rc
4880: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
4890: 28 69 6e 74 29 20 28 61 70 32 20 2d 20 61 70 31  (int) (ap2 - ap1
48a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
48b0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 70  rc;.}../* Sort p
48c0: 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20 2a 2f  arser actions */
48d0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
48e0: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f  ction *Action_so
48f0: 72 74 28 0a 20 20 73 74 72 75 63 74 20 61 63 74  rt(.  struct act
4900: 69 6f 6e 20 2a 61 70 0a 29 7b 0a 20 20 61 70 20  ion *ap.){.  ap 
4910: 3d 20 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  = (struct action
4920: 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a   *)msort((char *
4930: 29 61 70 2c 28 63 68 61 72 20 2a 2a 29 26 61 70  )ap,(char **)&ap
4940: 2d 3e 6e 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ->next,.        
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4960: 20 20 20 20 20 20 28 69 6e 74 28 2a 29 28 63 6f        (int(*)(co
4970: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
4980: 63 68 61 72 2a 29 29 61 63 74 69 6f 6e 63 6d 70  char*))actioncmp
4990: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 70 3b 0a  );.  return ap;.
49a0: 7d 0a 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61  }..void Action_a
49b0: 64 64 28 0a 20 20 73 74 72 75 63 74 20 61 63 74  dd(.  struct act
49c0: 69 6f 6e 20 2a 2a 61 70 70 2c 0a 20 20 65 6e 75  ion **app,.  enu
49d0: 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79 70 65 2c  m e_action type,
49e0: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
49f0: 20 2a 73 70 2c 0a 20 20 63 68 61 72 20 2a 61 72   *sp,.  char *ar
4a00: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 61 63  g.){.  struct ac
4a10: 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f 6e 3b  tion *newaction;
4a20: 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d 20 41  .  newaction = A
4a30: 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a 20 20 6e  ction_new();.  n
4a40: 65 77 61 63 74 69 6f 6e 2d 3e 6e 65 78 74 20 3d  ewaction->next =
4a50: 20 2a 61 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20   *app;.  *app = 
4a60: 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e 65 77  newaction;.  new
4a70: 61 63 74 69 6f 6e 2d 3e 74 79 70 65 20 3d 20 74  action->type = t
4a80: 79 70 65 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e  ype;.  newaction
4a90: 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 69 66 28  ->sp = sp;.  if(
4aa0: 20 74 79 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a   type==SHIFT ){.
4ab0: 20 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78      newaction->x
4ac0: 2e 73 74 70 20 3d 20 28 73 74 72 75 63 74 20 73  .stp = (struct s
4ad0: 74 61 74 65 20 2a 29 61 72 67 3b 0a 20 20 7d 65  tate *)arg;.  }e
4ae0: 6c 73 65 7b 0a 20 20 20 20 6e 65 77 61 63 74 69  lse{.    newacti
4af0: 6f 6e 2d 3e 78 2e 72 70 20 3d 20 28 73 74 72 75  on->x.rp = (stru
4b00: 63 74 20 72 75 6c 65 20 2a 29 61 72 67 3b 0a 20  ct rule *)arg;. 
4b10: 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   }.}./**********
4b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 65 77  ************ New
4b30: 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65   code to impleme
4b40: 6e 74 20 74 68 65 20 22 61 63 74 74 61 62 22 20  nt the "acttab" 
4b50: 6d 6f 64 75 6c 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  module *********
4b60: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  **/./*.** This m
4b70: 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73  odule implements
4b80: 20 72 6f 75 74 69 6e 65 73 20 75 73 65 20 74 6f   routines use to
4b90: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 79   construct the y
4ba0: 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65  y_action[] table
4bb0: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ..*/../*.** The 
4bc0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 79 79 5f  state of the yy_
4bd0: 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 75 6e 64  action table und
4be0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
4bf0: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
4c00: 66 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69  f.** the followi
4c10: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
4c20: 0a 2a 2a 20 54 68 65 20 79 79 5f 61 63 74 69 6f  .** The yy_actio
4c30: 6e 20 74 61 62 6c 65 20 6d 61 70 73 20 74 68 65  n table maps the
4c40: 20 70 61 69 72 20 28 73 74 61 74 65 5f 6e 75 6d   pair (state_num
4c50: 62 65 72 2c 20 6c 6f 6f 6b 61 68 65 61 64 29 20  ber, lookahead) 
4c60: 69 6e 74 6f 20 61 6e 0a 2a 2a 20 61 63 74 69 6f  into an.** actio
4c70: 6e 5f 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 74  n_number.  The t
4c80: 61 62 6c 65 20 69 73 20 61 6e 20 61 72 72 61 79  able is an array
4c90: 20 6f 66 20 69 6e 74 65 67 65 72 73 20 70 61 69   of integers pai
4ca0: 72 73 2e 20 20 54 68 65 20 73 74 61 74 65 5f 6e  rs.  The state_n
4cb0: 75 6d 62 65 72 0a 2a 2a 20 64 65 74 65 72 6d 69  umber.** determi
4cc0: 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c 20 6f  nes an initial o
4cd0: 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 79  ffset into the y
4ce0: 79 5f 61 63 74 69 6f 6e 20 61 72 72 61 79 2e 20  y_action array. 
4cf0: 20 54 68 65 20 6c 6f 6f 6b 61 68 65 61 64 0a 2a   The lookahead.*
4d00: 2a 20 76 61 6c 75 65 20 69 73 20 74 68 65 6e 20  * value is then 
4d10: 61 64 64 65 64 20 74 6f 20 74 68 69 73 20 69 6e  added to this in
4d20: 69 74 69 61 6c 20 6f 66 66 73 65 74 20 74 6f 20  itial offset to 
4d30: 67 65 74 20 61 6e 20 69 6e 64 65 78 20 58 20 69  get an index X i
4d40: 6e 74 6f 20 74 68 65 0a 2a 2a 20 79 79 5f 61 63  nto the.** yy_ac
4d50: 74 69 6f 6e 20 61 72 72 61 79 2e 20 49 66 20 74  tion array. If t
4d60: 68 65 20 61 41 63 74 69 6f 6e 5b 58 5d 2e 6c 6f  he aAction[X].lo
4d70: 6f 6b 61 68 65 61 64 20 65 71 75 61 6c 73 20 74  okahead equals t
4d80: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  he value of the.
4d90: 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68  ** of the lookah
4da0: 65 61 64 20 69 6e 70 75 74 2c 20 74 68 65 6e 20  ead input, then 
4db0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
4dc0: 20 61 63 74 69 6f 6e 5f 6e 75 6d 62 65 72 20 6f   action_number o
4dd0: 75 74 70 75 74 20 69 73 0a 2a 2a 20 61 41 63 74  utput is.** aAct
4de0: 69 6f 6e 5b 58 5d 2e 61 63 74 69 6f 6e 2e 20 20  ion[X].action.  
4df0: 49 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  If the lookahead
4e00: 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74  s do not match t
4e10: 68 65 6e 20 74 68 65 0a 2a 2a 20 64 65 66 61 75  hen the.** defau
4e20: 6c 74 20 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  lt action for th
4e30: 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 69  e state_number i
4e40: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
4e50: 2a 20 41 6c 6c 20 61 63 74 69 6f 6e 73 20 61 73  * All actions as
4e60: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
4e70: 73 69 6e 67 6c 65 20 73 74 61 74 65 5f 6e 75 6d  single state_num
4e80: 62 65 72 20 61 72 65 20 66 69 72 73 74 20 65 6e  ber are first en
4e90: 74 65 72 65 64 0a 2a 2a 20 69 6e 74 6f 20 61 4c  tered.** into aL
4ea0: 6f 6f 6b 61 68 65 61 64 5b 5d 20 75 73 69 6e 67  ookahead[] using
4eb0: 20 6d 75 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20   multiple calls 
4ec0: 74 6f 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e  to acttab_action
4ed0: 28 29 2e 20 20 54 68 65 6e 20 74 68 65 20 0a 2a  ().  Then the .*
4ee0: 2a 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68  * actions for th
4ef0: 61 74 20 73 69 6e 67 6c 65 20 73 74 61 74 65 5f  at single state_
4f00: 6e 75 6d 62 65 72 20 61 72 65 20 70 6c 61 63 65  number are place
4f10: 64 20 69 6e 74 6f 20 74 68 65 20 61 41 63 74 69  d into the aActi
4f20: 6f 6e 5b 5d 20 0a 2a 2a 20 61 72 72 61 79 20 77  on[] .** array w
4f30: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 63 61 6c  ith a single cal
4f40: 6c 20 74 6f 20 61 63 74 74 61 62 5f 69 6e 73 65  l to acttab_inse
4f50: 72 74 28 29 2e 20 20 54 68 65 20 61 63 74 74 61  rt().  The actta
4f60: 62 5f 69 6e 73 65 72 74 28 29 20 63 61 6c 6c 0a  b_insert() call.
4f70: 2a 2a 20 61 6c 73 6f 20 72 65 73 65 74 73 20 74  ** also resets t
4f80: 68 65 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20  he aLookahead[] 
4f90: 61 72 72 61 79 20 69 6e 20 70 72 65 70 61 72 61  array in prepara
4fa0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 78  tion for the nex
4fb0: 74 0a 2a 2a 20 73 74 61 74 65 20 6e 75 6d 62 65  t.** state numbe
4fc0: 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 6f  r..*/.struct loo
4fd0: 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 7b 0a  kahead_action {.
4fe0: 20 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 3b    int lookahead;
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5000: 56 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f  Value of the loo
5010: 6b 61 68 65 61 64 20 74 6f 6b 65 6e 20 2a 2f 0a  kahead token */.
5020: 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20    int action;   
5030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5040: 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 6f  Action to take o
5050: 6e 20 74 68 65 20 67 69 76 65 6e 20 6c 6f 6f 6b  n the given look
5060: 61 68 65 61 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65  ahead */.};.type
5070: 64 65 66 20 73 74 72 75 63 74 20 61 63 74 74 61  def struct actta
5080: 62 20 61 63 74 74 61 62 3b 0a 73 74 72 75 63 74  b acttab;.struct
5090: 20 61 63 74 74 61 62 20 7b 0a 20 20 69 6e 74 20   acttab {.  int 
50a0: 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  nAction;        
50b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
50c0: 65 72 20 6f 66 20 75 73 65 64 20 73 6c 6f 74 73  er of used slots
50d0: 20 69 6e 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f   in aAction[] */
50e0: 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 41 6c  .  int nActionAl
50f0: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  loc;            
5100: 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74  /* Slots allocat
5110: 65 64 20 66 6f 72 20 61 41 63 74 69 6f 6e 5b 5d  ed for aAction[]
5120: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 6f   */.  struct loo
5130: 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 0a 20 20  kahead_action.  
5140: 20 20 2a 61 41 63 74 69 6f 6e 2c 20 20 20 20 20    *aAction,     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 54 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  The yy_action[] 
5170: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
5180: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  truction */.    
5190: 2a 61 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20  *aLookahead;    
51a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
51b0: 73 69 6e 67 6c 65 20 6e 65 77 20 74 72 61 6e 73  single new trans
51c0: 61 63 74 69 6f 6e 20 73 65 74 20 2a 2f 0a 20 20  action set */.  
51d0: 69 6e 74 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b  int mnLookahead;
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
51f0: 4d 69 6e 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65  Minimum aLookahe
5200: 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a  ad[].lookahead *
5210: 2f 0a 20 20 69 6e 74 20 6d 6e 41 63 74 69 6f 6e  /.  int mnAction
5220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5230: 20 2f 2a 20 41 63 74 69 6f 6e 20 61 73 73 6f 63   /* Action assoc
5240: 69 61 74 65 64 20 77 69 74 68 20 6d 6e 4c 6f 6f  iated with mnLoo
5250: 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  kahead */.  int 
5260: 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20  mxLookahead;    
5270: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
5280: 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d  mum aLookahead[]
5290: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20  .lookahead */.  
52a0: 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  int nLookahead; 
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
52c0: 55 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 4c  Used slots in aL
52d0: 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 20 20  ookahead[] */.  
52e0: 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c  int nLookaheadAl
52f0: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  loc;         /* 
5300: 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20  Slots allocated 
5310: 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20  in aLookahead[] 
5320: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e  */.};../* Return
5330: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
5340: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 79 79  ntries in the yy
5350: 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f  _action table */
5360: 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f  .#define acttab_
5370: 73 69 7a 65 28 58 29 20 28 28 58 29 2d 3e 6e 41  size(X) ((X)->nA
5380: 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76  ction)../* The v
5390: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74  alue for the N-t
53a0: 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 61 63  h entry in yy_ac
53b0: 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  tion */.#define 
53c0: 61 63 74 74 61 62 5f 79 79 61 63 74 69 6f 6e 28  acttab_yyaction(
53d0: 58 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41 63 74  X,N)  ((X)->aAct
53e0: 69 6f 6e 5b 4e 5d 2e 61 63 74 69 6f 6e 29 0a 0a  ion[N].action)..
53f0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72  /* The value for
5400: 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20   the N-th entry 
5410: 69 6e 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20  in yy_lookahead 
5420: 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61  */.#define actta
5430: 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 58 2c  b_yylookahead(X,
5440: 4e 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69 6f  N)  ((X)->aActio
5450: 6e 5b 4e 5d 2e 6c 6f 6f 6b 61 68 65 61 64 29 0a  n[N].lookahead).
5460: 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  ./* Free all mem
5470: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
5480: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 63  ith the given ac
5490: 74 74 61 62 20 2a 2f 0a 76 6f 69 64 20 61 63 74  ttab */.void act
54a0: 74 61 62 5f 66 72 65 65 28 61 63 74 74 61 62 20  tab_free(acttab 
54b0: 2a 70 29 7b 0a 20 20 66 72 65 65 28 20 70 2d 3e  *p){.  free( p->
54c0: 61 41 63 74 69 6f 6e 20 29 3b 0a 20 20 66 72 65  aAction );.  fre
54d0: 65 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  e( p->aLookahead
54e0: 20 29 3b 0a 20 20 66 72 65 65 28 20 70 20 29 3b   );.  free( p );
54f0: 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  .}../* Allocate 
5500: 61 20 6e 65 77 20 61 63 74 74 61 62 20 73 74 72  a new acttab str
5510: 75 63 74 75 72 65 20 2a 2f 0a 61 63 74 74 61 62  ucture */.acttab
5520: 20 2a 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28 76   *acttab_alloc(v
5530: 6f 69 64 29 7b 0a 20 20 61 63 74 74 61 62 20 2a  oid){.  acttab *
5540: 70 20 3d 20 28 61 63 74 74 61 62 20 2a 29 20 63  p = (acttab *) c
5550: 61 6c 6c 6f 63 28 20 31 2c 20 73 69 7a 65 6f 66  alloc( 1, sizeof
5560: 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
5570: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
5580: 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65  f(stderr,"Unable
5590: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
55a0: 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 61 63  ory for a new ac
55b0: 74 74 61 62 2e 22 29 3b 0a 20 20 20 20 65 78 69  ttab.");.    exi
55c0: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  t(1);.  }.  mems
55d0: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
55e0: 2a 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  *p));.  return p
55f0: 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65  ;.}../* Add a ne
5600: 77 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  w action to the 
5610: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
5620: 69 6f 6e 20 73 65 74 2e 20 20 0a 2a 2a 0a 2a 2a  ion set.  .**.**
5630: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5640: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
5650: 20 65 61 63 68 20 6c 6f 6f 6b 61 68 65 61 64 20   each lookahead 
5660: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
5670: 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f  .** state..*/.vo
5680: 69 64 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e  id acttab_action
5690: 28 61 63 74 74 61 62 20 2a 70 2c 20 69 6e 74 20  (acttab *p, int 
56a0: 6c 6f 6f 6b 61 68 65 61 64 2c 20 69 6e 74 20 61  lookahead, int a
56b0: 63 74 69 6f 6e 29 7b 0a 20 20 69 66 28 20 70 2d  ction){.  if( p-
56c0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 3d 70 2d 3e  >nLookahead>=p->
56d0: 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20  nLookaheadAlloc 
56e0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 6f 6f 6b 61  ){.    p->nLooka
56f0: 68 65 61 64 41 6c 6c 6f 63 20 2b 3d 20 32 35 3b  headAlloc += 25;
5700: 0a 20 20 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65  .    p->aLookahe
5710: 61 64 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 6f  ad = (struct loo
5720: 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a 29  kahead_action *)
5730: 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c 6f   realloc( p->aLo
5740: 6f 6b 61 68 65 61 64 2c 0a 20 20 20 20 20 20 20  okahead,.       
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e        sizeof(p->
5770: 61 4c 6f 6f 6b 61 68 65 61 64 5b 30 5d 29 2a 70  aLookahead[0])*p
5780: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f  ->nLookaheadAllo
5790: 63 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  c );.    if( p->
57a0: 61 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29 7b  aLookahead==0 ){
57b0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
57c0: 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61  tderr,"malloc fa
57d0: 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20  iled\n");.      
57e0: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20  exit(1);.    }. 
57f0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f   }.  if( p->nLoo
5800: 6b 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20  kahead==0 ){.   
5810: 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20   p->mxLookahead 
5820: 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20  = lookahead;.   
5830: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
5840: 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20  = lookahead;.   
5850: 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61   p->mnAction = a
5860: 63 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ction;.  }else{.
5870: 20 20 20 20 69 66 28 20 70 2d 3e 6d 78 4c 6f 6f      if( p->mxLoo
5880: 6b 61 68 65 61 64 3c 6c 6f 6f 6b 61 68 65 61 64  kahead<lookahead
5890: 20 29 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61   ) p->mxLookahea
58a0: 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20  d = lookahead;. 
58b0: 20 20 20 69 66 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b     if( p->mnLook
58c0: 61 68 65 61 64 3e 6c 6f 6f 6b 61 68 65 61 64 20  ahead>lookahead 
58d0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 4c 6f  ){.      p->mnLo
58e0: 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68  okahead = lookah
58f0: 65 61 64 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e  ead;.      p->mn
5900: 41 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b  Action = action;
5910: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
5920: 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c  aLookahead[p->nL
5930: 6f 6f 6b 61 68 65 61 64 5d 2e 6c 6f 6f 6b 61 68  ookahead].lookah
5940: 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b  ead = lookahead;
5950: 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  .  p->aLookahead
5960: 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e  [p->nLookahead].
5970: 61 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b  action = action;
5980: 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  .  p->nLookahead
5990: 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ++;.}../*.** Add
59a0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
59b0: 20 73 65 74 20 62 75 69 6c 74 20 75 70 20 77 69   set built up wi
59c0: 74 68 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74  th prior calls t
59d0: 6f 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28  o acttab_action(
59e0: 29 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 63 75  ).** into the cu
59f0: 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62  rrent action tab
5a00: 6c 65 2e 20 20 54 68 65 6e 20 72 65 73 65 74 20  le.  Then reset 
5a10: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
5a20: 73 65 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 61  set back.** to a
5a30: 6e 20 65 6d 70 74 79 20 73 65 74 20 69 6e 20 70  n empty set in p
5a40: 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 61  reparation for a
5a50: 20 6e 65 77 20 72 6f 75 6e 64 20 6f 66 20 61 63   new round of ac
5a60: 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 20 63 61  ttab_action() ca
5a70: 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lls..**.** Retur
5a80: 6e 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74  n the offset int
5a90: 6f 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  o the action tab
5aa0: 6c 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 72  le of the new tr
5ab0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  ansaction..*/.in
5ac0: 74 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28  t acttab_insert(
5ad0: 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 69 6e  acttab *p){.  in
5ae0: 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20  t i, j, k, n;.  
5af0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4c 6f 6f 6b  assert( p->nLook
5b00: 61 68 65 61 64 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ahead>0 );..  /*
5b10: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
5b20: 76 65 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ve enough space 
5b30: 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 78 70 61  to hold the expa
5b40: 6e 64 65 64 20 61 63 74 69 6f 6e 20 74 61 62 6c  nded action tabl
5b50: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 77 6f  e.  ** in the wo
5b60: 72 73 74 20 63 61 73 65 2e 20 20 54 68 65 20 77  rst case.  The w
5b70: 6f 72 73 74 20 63 61 73 65 20 6f 63 63 75 72 73  orst case occurs
5b80: 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
5b90: 69 6f 6e 20 73 65 74 0a 20 20 2a 2a 20 6d 75 73  ion set.  ** mus
5ba0: 74 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  t be appended to
5bb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 63 74   the current act
5bc0: 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  ion table.  */. 
5bd0: 20 6e 20 3d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68   n = p->mxLookah
5be0: 65 61 64 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  ead + 1;.  if( p
5bf0: 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e 20 3e 3d  ->nAction + n >=
5c00: 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63   p->nActionAlloc
5c10: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64 41   ){.    int oldA
5c20: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f  lloc = p->nActio
5c30: 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e  nAlloc;.    p->n
5c40: 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 3d 20 70 2d  ActionAlloc = p-
5c50: 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e 20 2b 20 70  >nAction + n + p
5c60: 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2b  ->nActionAlloc +
5c70: 20 32 30 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74   20;.    p->aAct
5c80: 69 6f 6e 20 3d 20 28 73 74 72 75 63 74 20 6c 6f  ion = (struct lo
5c90: 6f 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a  okahead_action *
5ca0: 29 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 41  ) realloc( p->aA
5cb0: 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ction,.         
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 41 63 74 69   sizeof(p->aActi
5ce0: 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f  on[0])*p->nActio
5cf0: 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  nAlloc);.    if(
5d00: 20 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d 30 20 29   p->aAction==0 )
5d10: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
5d20: 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66  stderr,"malloc f
5d30: 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20  ailed\n");.     
5d40: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
5d50: 20 20 20 20 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c      for(i=oldAll
5d60: 6f 63 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e  oc; i<p->nAction
5d70: 41 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  Alloc; i++){.   
5d80: 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d     p->aAction[i]
5d90: 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b  .lookahead = -1;
5da0: 0a 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f  .      p->aActio
5db0: 6e 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31  n[i].action = -1
5dc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
5dd0: 2a 20 53 63 61 6e 20 74 68 65 20 65 78 69 73 74  * Scan the exist
5de0: 69 6e 67 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ing action table
5df0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20   looking for an 
5e00: 6f 66 66 73 65 74 20 74 68 61 74 20 69 73 20 61  offset that is a
5e10: 20 0a 20 20 2a 2a 20 64 75 70 6c 69 63 61 74 65   .  ** duplicate
5e20: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
5e30: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e  transaction set.
5e40: 20 20 46 61 6c 6c 20 6f 75 74 20 6f 66 20 74 68    Fall out of th
5e50: 65 20 6c 6f 6f 70 0a 20 20 2a 2a 20 69 66 20 61  e loop.  ** if a
5e60: 6e 64 20 77 68 65 6e 20 74 68 65 20 64 75 70 6c  nd when the dupl
5e70: 69 63 61 74 65 20 69 73 20 66 6f 75 6e 64 2e 0a  icate is found..
5e80: 20 20 2a 2a 0a 20 20 2a 2a 20 69 20 69 73 20 74    **.  ** i is t
5e90: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 2d 3e 61  he index in p->a
5ea0: 41 63 74 69 6f 6e 5b 5d 20 77 68 65 72 65 20 70  Action[] where p
5eb0: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 69 73  ->mnLookahead is
5ec0: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
5ed0: 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 41 63 74 69    for(i=p->nActi
5ee0: 6f 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  on-1; i>=0; i--)
5ef0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63  {.    if( p->aAc
5f00: 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[i].lookahea
5f10: 64 3d 3d 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61  d==p->mnLookahea
5f20: 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c  d ){.      /* Al
5f30: 6c 20 6c 6f 6f 6b 61 68 65 61 64 73 20 61 6e 64  l lookaheads and
5f40: 20 61 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20   actions in the 
5f50: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61  aLookahead[] tra
5f60: 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  nsaction.      *
5f70: 2a 20 6d 75 73 74 20 6d 61 74 63 68 20 61 67 61  * must match aga
5f80: 69 6e 73 74 20 74 68 65 20 63 61 6e 64 69 64 61  inst the candida
5f90: 74 65 20 61 41 63 74 69 6f 6e 5b 69 5d 20 65 6e  te aAction[i] en
5fa0: 74 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  try. */.      if
5fb0: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e  ( p->aAction[i].
5fc0: 61 63 74 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63 74  action!=p->mnAct
5fd0: 69 6f 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ion ) continue;.
5fe0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
5ff0: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  <p->nLookahead; 
6000: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20  j++){.        k 
6010: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
6020: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70  j].lookahead - p
6030: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mnLookahead + 
6040: 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b  i;.        if( k
6050: 3c 30 20 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63 74  <0 || k>=p->nAct
6060: 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ion ) break;.   
6070: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f       if( p->aLoo
6080: 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68  kahead[j].lookah
6090: 65 61 64 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b  ead!=p->aAction[
60a0: 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 29 20 62  k].lookahead ) b
60b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
60c0: 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  ( p->aLookahead[
60d0: 6a 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 61 41  j].action!=p->aA
60e0: 63 74 69 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e 20  ction[k].action 
60f0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
6100: 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e  .      if( j<p->
6110: 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e  nLookahead ) con
6120: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a  tinue;..      /*
6130: 20 4e 6f 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f   No possible loo
6140: 6b 61 68 65 61 64 20 76 61 6c 75 65 20 74 68 61  kahead value tha
6150: 74 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  t is not in the 
6160: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 0a 20 20 20  aLookahead[].   
6170: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
6180: 6e 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  n is allowed to 
6190: 6d 61 74 63 68 20 61 41 63 74 69 6f 6e 5b 69 5d  match aAction[i]
61a0: 20 2a 2f 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b   */.      n = 0;
61b0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
61c0: 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b  j<p->nAction; j+
61d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
61e0: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f  p->aAction[j].lo
61f0: 6f 6b 61 68 65 61 64 3c 30 20 29 20 63 6f 6e 74  okahead<0 ) cont
6200: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
6210: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e  ( p->aAction[j].
6220: 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e  lookahead==j+p->
6230: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69 20 29 20  mnLookahead-i ) 
6240: 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
6250: 20 20 20 69 66 28 20 6e 3d 3d 70 2d 3e 6e 4c 6f     if( n==p->nLo
6260: 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20  okahead ){.     
6270: 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 41 6e     break;  /* An
6280: 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
6290: 66 6f 75 6e 64 20 61 74 20 6f 66 66 73 65 74 20  found at offset 
62a0: 69 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  i */.      }.   
62b0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
62c0: 6e 6f 20 65 78 69 73 74 69 6e 67 20 6f 66 66 73  no existing offs
62d0: 65 74 73 20 65 78 61 63 74 6c 79 20 6d 61 74 63  ets exactly matc
62e0: 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  h the current tr
62f0: 61 6e 73 61 63 74 69 6f 6e 2c 20 66 69 6e 64 20  ansaction, find 
6300: 61 6e 0a 20 20 2a 2a 20 61 6e 20 65 6d 70 74 79  an.  ** an empty
6310: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 61   offset in the a
6320: 41 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 69  Action[] table i
6330: 6e 20 77 68 69 63 68 20 77 65 20 63 61 6e 20 61  n which we can a
6340: 64 64 20 74 68 65 0a 20 20 2a 2a 20 61 4c 6f 6f  dd the.  ** aLoo
6350: 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63  kahead[] transac
6360: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
6370: 20 69 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4c   i<0 ){.    /* L
6380: 6f 6f 6b 20 66 6f 72 20 68 6f 6c 65 73 20 69 6e  ook for holes in
6390: 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 74   the aAction[] t
63a0: 61 62 6c 65 20 74 68 61 74 20 66 69 74 20 74 68  able that fit th
63b0: 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a  e current.    **
63c0: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72   aLookahead[] tr
63d0: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 4c 65 61 76  ansaction.  Leav
63e0: 65 20 69 20 73 65 74 20 74 6f 20 74 68 65 20 6f  e i set to the o
63f0: 66 66 73 65 74 20 6f 66 20 74 68 65 20 68 6f 6c  ffset of the hol
6400: 65 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 20  e..    ** If no 
6410: 68 6f 6c 65 73 20 61 72 65 20 66 6f 75 6e 64 2c  holes are found,
6420: 20 69 20 69 73 20 6c 65 66 74 20 61 74 20 70 2d   i is left at p-
6430: 3e 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63 68 20  >nAction, which 
6440: 6d 65 61 6e 73 20 74 68 65 0a 20 20 20 20 2a 2a  means the.    **
6450: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
6460: 6c 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 2a  l be appended. *
6470: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
6480: 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63  <p->nActionAlloc
6490: 20 2d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61   - p->mxLookahea
64a0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  d; i++){.      i
64b0: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d  f( p->aAction[i]
64c0: 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b 0a  .lookahead<0 ){.
64d0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
64e0: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
64f0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
6500: 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68    k = p->aLookah
6510: 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ead[j].lookahead
6520: 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61   - p->mnLookahea
6530: 64 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 20  d + i;.         
6540: 20 69 66 28 20 6b 3c 30 20 29 20 62 72 65 61 6b   if( k<0 ) break
6550: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
6560: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f  p->aAction[k].lo
6570: 6f 6b 61 68 65 61 64 3e 3d 30 20 29 20 62 72 65  okahead>=0 ) bre
6580: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
6590: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e        if( j<p->n
65a0: 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74  Lookahead ) cont
65b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f  inue;.        fo
65c0: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74  r(j=0; j<p->nAct
65d0: 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ion; j++){.     
65e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74       if( p->aAct
65f0: 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[j].lookahead
6600: 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  ==j+p->mnLookahe
6610: 61 64 2d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  ad-i ) break;.  
6620: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6630: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 41 63 74 69 6f  if( j==p->nActio
6640: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  n ){.          b
6650: 72 65 61 6b 3b 20 20 2f 2a 20 46 69 74 73 20 69  reak;  /* Fits i
6660: 6e 20 65 6d 70 74 79 20 73 6c 6f 74 73 20 2a 2f  n empty slots */
6670: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6680: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
6690: 2a 20 49 6e 73 65 72 74 20 74 72 61 6e 73 61 63  * Insert transac
66a0: 74 69 6f 6e 20 73 65 74 20 61 74 20 69 6e 64 65  tion set at inde
66b0: 78 20 69 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d  x i. */.  for(j=
66c0: 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  0; j<p->nLookahe
66d0: 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20  ad; j++){.    k 
66e0: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
66f0: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70  j].lookahead - p
6700: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mnLookahead + 
6710: 69 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f  i;.    p->aActio
6720: 6e 5b 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61  n[k] = p->aLooka
6730: 68 65 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  head[j];.    if(
6740: 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29   k>=p->nAction )
6750: 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b   p->nAction = k+
6760: 31 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f  1;.  }.  p->nLoo
6770: 6b 61 68 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f  kahead = 0;..  /
6780: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
6790: 73 65 74 20 74 68 61 74 20 69 73 20 61 64 64 65  set that is adde
67a0: 64 20 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65  d to the lookahe
67b0: 61 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ad in order to g
67c0: 65 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  et the.  ** inde
67d0: 78 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e  x into yy_action
67e0: 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20 2a   of the action *
67f0: 2f 0a 20 20 72 65 74 75 72 6e 20 69 20 2d 20 70  /.  return i - p
6800: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d  ->mnLookahead;.}
6810: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
6820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
6830: 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 63  he file "build.c
6840: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
6850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
6860: 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20  ./*.** Routines 
6870: 74 6f 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  to construction 
6880: 74 68 65 20 66 69 6e 69 74 65 20 73 74 61 74 65  the finite state
6890: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 74 68 65   machine for the
68a0: 20 4c 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65 72   LEMON.** parser
68b0: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
68c0: 2f 2a 20 46 69 6e 64 20 61 20 70 72 65 63 65 64  /* Find a preced
68d0: 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6f 66 20 65  ence symbol of e
68e0: 76 65 72 79 20 72 75 6c 65 20 69 6e 20 74 68 65  very rule in the
68f0: 20 67 72 61 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a   grammar..** .**
6900: 20 54 68 6f 73 65 20 72 75 6c 65 73 20 77 68 69   Those rules whi
6910: 63 68 20 68 61 76 65 20 61 20 70 72 65 63 65 64  ch have a preced
6920: 65 6e 63 65 20 73 79 6d 62 6f 6c 20 63 6f 64 65  ence symbol code
6930: 64 20 69 6e 20 74 68 65 20 69 6e 70 75 74 0a 2a  d in the input.*
6940: 2a 20 67 72 61 6d 6d 61 72 20 75 73 69 6e 67 20  * grammar using 
6950: 74 68 65 20 22 5b 73 79 6d 62 6f 6c 5d 22 20 63  the "[symbol]" c
6960: 6f 6e 73 74 72 75 63 74 20 77 69 6c 6c 20 61 6c  onstruct will al
6970: 72 65 61 64 79 20 68 61 76 65 20 74 68 65 0a 2a  ready have the.*
6980: 2a 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 66 69  * rp->precsym fi
6990: 65 6c 64 20 66 69 6c 6c 65 64 2e 20 20 4f 74 68  eld filled.  Oth
69a0: 65 72 20 72 75 6c 65 73 20 74 61 6b 65 20 61 73  er rules take as
69b0: 20 74 68 65 69 72 20 70 72 65 63 65 64 65 6e 63   their precedenc
69c0: 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 74 68 65 20  e.** symbol the 
69d0: 66 69 72 73 74 20 52 48 53 20 73 79 6d 62 6f 6c  first RHS symbol
69e0: 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20   with a defined 
69f0: 70 72 65 63 65 64 65 6e 63 65 2e 20 20 49 66 20  precedence.  If 
6a00: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 74  there.** are not
6a10: 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 69 74   RHS symbols wit
6a20: 68 20 61 20 64 65 66 69 6e 65 64 20 70 72 65 63  h a defined prec
6a30: 65 64 65 6e 63 65 2c 20 74 68 65 20 70 72 65 63  edence, the prec
6a40: 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c  edence.** symbol
6a50: 20 66 69 65 6c 64 20 69 73 20 6c 65 66 74 20 62   field is left b
6a60: 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  lank..*/.void Fi
6a70: 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65  ndRulePrecedence
6a80: 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
6a90: 78 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72  xp).{.  struct r
6aa0: 75 6c 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72  ule *rp;.  for(r
6ab0: 70 3d 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  p=xp->rule; rp; 
6ac0: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
6ad0: 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79    if( rp->precsy
6ae0: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  m==0 ){.      in
6af0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 66 6f  t i, j;.      fo
6b00: 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
6b10: 73 20 26 26 20 72 70 2d 3e 70 72 65 63 73 79 6d  s && rp->precsym
6b20: 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ==0; i++){.     
6b30: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
6b40: 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   *sp = rp->rhs[i
6b50: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ];.        if( s
6b60: 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
6b70: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
6b80: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
6b90: 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29  p->nsubsym; j++)
6ba0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
6bb0: 28 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d  ( sp->subsym[j]-
6bc0: 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20  >prec>=0 ){.    
6bd0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72            rp->pr
6be0: 65 63 73 79 6d 20 3d 20 73 70 2d 3e 73 75 62 73  ecsym = sp->subs
6bf0: 79 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  ym[j];.         
6c00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6c10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6c20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
6c30: 6c 73 65 20 69 66 28 20 73 70 2d 3e 70 72 65 63  lse if( sp->prec
6c40: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
6c50: 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 72   rp->precsym = r
6c60: 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
6c70: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6c80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b   }.  }.  return;
6c90: 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61 6c 6c 20  .}../* Find all 
6ca0: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69  nonterminals whi
6cb0: 63 68 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ch will generate
6cc0: 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e   the empty strin
6cd0: 67 2e 0a 2a 2a 20 54 68 65 6e 20 67 6f 20 62 61  g..** Then go ba
6ce0: 63 6b 20 61 6e 64 20 63 6f 6d 70 75 74 65 20 74  ck and compute t
6cf0: 68 65 20 66 69 72 73 74 20 73 65 74 73 20 6f 66  he first sets of
6d00: 20 65 76 65 72 79 20 6e 6f 6e 74 65 72 6d 69 6e   every nontermin
6d10: 61 6c 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  al..** The first
6d20: 20 73 65 74 20 69 73 20 74 68 65 20 73 65 74 20   set is the set 
6d30: 6f 66 20 61 6c 6c 20 74 65 72 6d 69 6e 61 6c 20  of all terminal 
6d40: 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61  symbols which ca
6d50: 6e 20 62 65 67 69 6e 0a 2a 2a 20 61 20 73 74 72  n begin.** a str
6d60: 69 6e 67 20 67 65 6e 65 72 61 74 65 64 20 62 79  ing generated by
6d70: 20 74 68 61 74 20 6e 6f 6e 74 65 72 6d 69 6e 61   that nontermina
6d80: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46  l..*/.void FindF
6d90: 69 72 73 74 53 65 74 73 28 73 74 72 75 63 74 20  irstSets(struct 
6da0: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
6db0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72   int i, j;.  str
6dc0: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
6dd0: 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20  int progress;.. 
6de0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
6df0: 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
6e00: 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  .    lemp->symbo
6e10: 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20  ls[i]->lambda = 
6e20: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 7d  LEMON_FALSE;.  }
6e30: 0a 20 20 66 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e  .  for(i=lemp->n
6e40: 74 65 72 6d 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70  terminal; i<lemp
6e50: 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
6e60: 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  .    lemp->symbo
6e70: 6c 73 5b 69 5d 2d 3e 66 69 72 73 74 73 65 74 20  ls[i]->firstset 
6e80: 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 7d 0a  = SetNew();.  }.
6e90: 0a 20 20 2f 2a 20 46 69 72 73 74 20 63 6f 6d 70  .  /* First comp
6ea0: 75 74 65 20 61 6c 6c 20 6c 61 6d 62 64 61 73 20  ute all lambdas 
6eb0: 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f  */.  do{.    pro
6ec0: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66  gress = 0;.    f
6ed0: 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
6ee0: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
6ef0: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70  t){.      if( rp
6f00: 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 29 20  ->lhs->lambda ) 
6f10: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6f20: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
6f30: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
6f40: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
6f50: 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   *sp = rp->rhs[i
6f60: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
6f70: 74 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e  t( sp->type==NON
6f80: 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e  TERMINAL || sp->
6f90: 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41  lambda==LEMON_FA
6fa0: 4c 53 45 20 29 3b 0a 20 20 20 20 20 20 20 20 69  LSE );.        i
6fb0: 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c  f( sp->lambda==L
6fc0: 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65  EMON_FALSE ) bre
6fd0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6fe0: 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68    if( i==rp->nrh
6ff0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 70 2d  s ){.        rp-
7000: 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c  >lhs->lambda = L
7010: 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 20  EMON_TRUE;.     
7020: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
7030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7040: 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73   }while( progres
7050: 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63  s );..  /* Now c
7060: 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69 72 73 74  ompute all first
7070: 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20   sets */.  do{. 
7080: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
7090: 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70   *s1, *s2;.    p
70a0: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
70b0: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
70c0: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
70d0: 65 78 74 29 7b 0a 20 20 20 20 20 20 73 31 20 3d  ext){.      s1 =
70e0: 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20   rp->lhs;.      
70f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
7100: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
7110: 20 20 20 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b     s2 = rp->rhs[
7120: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
7130: 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  s2->type==TERMIN
7140: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
7150: 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41  progress += SetA
7160: 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c  dd(s1->firstset,
7170: 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  s2->index);.    
7180: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7190: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
71a0: 32 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  2->type==MULTITE
71b0: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
71c0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
71d0: 32 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29  2->nsubsym; j++)
71e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  {.            pr
71f0: 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64 64  ogress += SetAdd
7200: 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32  (s1->firstset,s2
7210: 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 69 6e 64  ->subsym[j]->ind
7220: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ex);.          }
7230: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
7240: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
7250: 69 66 28 20 73 31 3d 3d 73 32 20 29 7b 0a 20 20  if( s1==s2 ){.  
7260: 20 20 20 20 20 20 20 20 69 66 28 20 73 31 2d 3e          if( s1->
7270: 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41  lambda==LEMON_FA
7280: 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  LSE ) break;.   
7290: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
72a0: 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b        progress +
72b0: 3d 20 53 65 74 55 6e 69 6f 6e 28 73 31 2d 3e 66  = SetUnion(s1->f
72c0: 69 72 73 74 73 65 74 2c 73 32 2d 3e 66 69 72 73  irstset,s2->firs
72d0: 74 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tset);.         
72e0: 20 69 66 28 20 73 32 2d 3e 6c 61 6d 62 64 61 3d   if( s2->lambda=
72f0: 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62  =LEMON_FALSE ) b
7300: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
7310: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7320: 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73  }while( progress
7330: 20 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   );.  return;.}.
7340: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20  ./* Compute all 
7350: 4c 52 28 30 29 20 73 74 61 74 65 73 20 66 6f 72  LR(0) states for
7360: 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 4c   the grammar.  L
7370: 69 6e 6b 73 0a 2a 2a 20 61 72 65 20 61 64 64 65  inks.** are adde
7380: 64 20 74 6f 20 62 65 74 77 65 65 6e 20 73 6f 6d  d to between som
7390: 65 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74  e states so that
73a0: 20 74 68 65 20 4c 52 28 31 29 20 66 6f 6c 6c 6f   the LR(1) follo
73b0: 77 20 73 65 74 73 0a 2a 2a 20 63 61 6e 20 62 65  w sets.** can be
73c0: 20 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 2e   computed later.
73d0: 0a 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75  .*/.PRIVATE stru
73e0: 63 74 20 73 74 61 74 65 20 2a 67 65 74 73 74 61  ct state *getsta
73f0: 74 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  te(struct lemon 
7400: 2a 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64 20  *);  /* forward 
7410: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f 69  reference */.voi
7420: 64 20 46 69 6e 64 53 74 61 74 65 73 28 73 74 72  d FindStates(str
7430: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
7440: 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  .{.  struct symb
7450: 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74  ol *sp;.  struct
7460: 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 43 6f   rule *rp;..  Co
7470: 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 3b  nfiglist_init();
7480: 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
7490: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a  start symbol */.
74a0: 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72    if( lemp->star
74b0: 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79  t ){.    sp = Sy
74c0: 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e  mbol_find(lemp->
74d0: 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20  start);.    if( 
74e0: 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  sp==0 ){.      E
74f0: 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
7500: 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73  lename,0,."The s
7510: 70 65 63 69 66 69 65 64 20 73 74 61 72 74 20 73  pecified start s
7520: 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 69 73 20  ymbol \"%s\" is 
7530: 6e 6f 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e 74 65  not \.in a nonte
7540: 72 6d 69 6e 61 6c 20 6f 66 20 74 68 65 20 67 72  rminal of the gr
7550: 61 6d 6d 61 72 2e 20 20 5c 22 25 73 5c 22 20 77  ammar.  \"%s\" w
7560: 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73 20 74  ill be used as t
7570: 68 65 20 73 74 61 72 74 20 5c 0a 73 79 6d 62 6f  he start \.symbo
7580: 6c 20 69 6e 73 74 65 61 64 2e 22 2c 6c 65 6d 70  l instead.",lemp
7590: 2d 3e 73 74 61 72 74 2c 6c 65 6d 70 2d 3e 72 75  ->start,lemp->ru
75a0: 6c 65 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a  le->lhs->name);.
75b0: 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
75c0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 70  rcnt++;.      sp
75d0: 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c   = lemp->rule->l
75e0: 68 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  hs;.    }.  }els
75f0: 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70  e{.    sp = lemp
7600: 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d  ->rule->lhs;.  }
7610: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
7620: 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f   the start symbo
7630: 6c 20 64 6f 65 73 6e 27 74 20 6f 63 63 75 72 20  l doesn't occur 
7640: 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
7650: 64 20 73 69 64 65 20 6f 66 0a 20 20 2a 2a 20 61  d side of.  ** a
7660: 6e 79 20 72 75 6c 65 2e 20 20 52 65 70 6f 72 74  ny rule.  Report
7670: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20   an error if it 
7680: 64 6f 65 73 2e 20 20 28 59 41 43 43 20 77 6f 75  does.  (YACC wou
7690: 6c 64 20 67 65 6e 65 72 61 74 65 20 61 20 6e 65  ld generate a ne
76a0: 77 0a 20 20 2a 2a 20 73 74 61 72 74 20 73 79 6d  w.  ** start sym
76b0: 62 6f 6c 20 69 6e 20 74 68 69 73 20 63 61 73 65  bol in this case
76c0: 2e 29 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c  .) */.  for(rp=l
76d0: 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
76e0: 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
76f0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
7700: 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
7710: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
7720: 20 72 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73 70 20   rp->rhs[i]==sp 
7730: 29 7b 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20  ){   /* FIX ME: 
7740: 20 44 65 61 6c 20 77 69 74 68 20 6d 75 6c 74 69   Deal with multi
7750: 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 20  terminals */.   
7760: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
7770: 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a  mp->filename,0,.
7780: 22 54 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f  "The start symbo
7790: 6c 20 5c 22 25 73 5c 22 20 6f 63 63 75 72 73 20  l \"%s\" occurs 
77a0: 6f 6e 20 74 68 65 20 5c 0a 72 69 67 68 74 2d 68  on the \.right-h
77b0: 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 72 75  and side of a ru
77c0: 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 72 65  le. This will re
77d0: 73 75 6c 74 20 69 6e 20 61 20 70 61 72 73 65 72  sult in a parser
77e0: 20 77 68 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f   which \.does no
77f0: 74 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e  t work properly.
7800: 22 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ",sp->name);.   
7810: 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
7820: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  cnt++;.      }. 
7830: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
7840: 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  he basis configu
7850: 72 61 74 69 6f 6e 20 73 65 74 20 66 6f 72 20 74  ration set for t
7860: 68 65 20 66 69 72 73 74 20 73 74 61 74 65 0a 20  he first state. 
7870: 20 2a 2a 20 69 73 20 61 6c 6c 20 72 75 6c 65 73   ** is all rules
7880: 20 77 68 69 63 68 20 68 61 76 65 20 74 68 65 20   which have the 
7890: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 61 73 20  start symbol as 
78a0: 74 68 65 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d  their.  ** left-
78b0: 68 61 6e 64 20 73 69 64 65 20 2a 2f 0a 20 20 66  hand side */.  f
78c0: 6f 72 28 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20  or(rp=sp->rule; 
78d0: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c  rp; rp=rp->nextl
78e0: 68 73 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  hs){.    struct 
78f0: 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a  config *newcfp;.
7900: 20 20 20 20 72 70 2d 3e 6c 68 73 53 74 61 72 74      rp->lhsStart
7910: 20 3d 20 31 3b 0a 20 20 20 20 6e 65 77 63 66 70   = 1;.    newcfp
7920: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64   = Configlist_ad
7930: 64 62 61 73 69 73 28 72 70 2c 30 29 3b 0a 20 20  dbasis(rp,0);.  
7940: 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d    SetAdd(newcfp-
7950: 3e 66 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20  >fws,0);.  }..  
7960: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66  /* Compute the f
7970: 69 72 73 74 20 73 74 61 74 65 2e 20 20 41 6c 6c  irst state.  All
7980: 20 6f 74 68 65 72 20 73 74 61 74 65 73 20 77 69   other states wi
7990: 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 6f 6d 70 75  ll be.  ** compu
79a0: 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
79b0: 79 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  y during the com
79c0: 70 75 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  putation of the 
79d0: 66 69 72 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20  first one..  ** 
79e0: 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69  The returned poi
79f0: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73  nter to the firs
7a00: 74 20 73 74 61 74 65 20 69 73 20 6e 6f 74 20 75  t state is not u
7a10: 73 65 64 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29  sed. */.  (void)
7a20: 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a  getstate(lemp);.
7a30: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
7a40: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
7a50: 20 74 6f 20 61 20 73 74 61 74 65 20 77 68 69 63   to a state whic
7a60: 68 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62  h is described b
7a70: 79 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  y the configurat
7a80: 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 77 68 69 63  ion.** list whic
7a90: 68 20 68 61 73 20 62 65 65 6e 20 62 75 69 6c 74  h has been built
7aa0: 20 66 72 6f 6d 20 63 61 6c 6c 73 20 74 6f 20 43   from calls to C
7ab0: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 2e 0a 2a  onfiglist_add..*
7ac0: 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 62  /.PRIVATE void b
7ad0: 75 69 6c 64 73 68 69 66 74 73 28 73 74 72 75 63  uildshifts(struc
7ae0: 74 20 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72 75 63  t lemon *, struc
7af0: 74 20 73 74 61 74 65 20 2a 29 3b 20 2f 2a 20 46  t state *); /* F
7b00: 6f 72 77 64 20 72 65 66 20 2a 2f 0a 50 52 49 56  orwd ref */.PRIV
7b10: 41 54 45 20 73 74 72 75 63 74 20 73 74 61 74 65  ATE struct state
7b20: 20 2a 67 65 74 73 74 61 74 65 28 73 74 72 75 63   *getstate(struc
7b30: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
7b40: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
7b50: 20 2a 63 66 70 2c 20 2a 62 70 3b 0a 20 20 73 74   *cfp, *bp;.  st
7b60: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
7b70: 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74  ..  /* Extract t
7b80: 68 65 20 73 6f 72 74 65 64 20 62 61 73 69 73 20  he sorted basis 
7b90: 6f 66 20 74 68 65 20 6e 65 77 20 73 74 61 74 65  of the new state
7ba0: 2e 20 20 54 68 65 20 62 61 73 69 73 20 77 61 73  .  The basis was
7bb0: 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a   constructed.  *
7bc0: 2a 20 62 79 20 70 72 69 6f 72 20 63 61 6c 6c 73  * by prior calls
7bd0: 20 74 6f 20 22 43 6f 6e 66 69 67 6c 69 73 74 5f   to "Configlist_
7be0: 61 64 64 62 61 73 69 73 28 29 22 2e 20 2a 2f 0a  addbasis()". */.
7bf0: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72    Configlist_sor
7c00: 74 62 61 73 69 73 28 29 3b 0a 20 20 62 70 20 3d  tbasis();.  bp =
7c10: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69   Configlist_basi
7c20: 73 28 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61  s();..  /* Get a
7c30: 20 73 74 61 74 65 20 77 69 74 68 20 74 68 65 20   state with the 
7c40: 73 61 6d 65 20 62 61 73 69 73 20 2a 2f 0a 20 20  same basis */.  
7c50: 73 74 70 20 3d 20 53 74 61 74 65 5f 66 69 6e 64  stp = State_find
7c60: 28 62 70 29 3b 0a 20 20 69 66 28 20 73 74 70 20  (bp);.  if( stp 
7c70: 29 7b 0a 20 20 20 20 2f 2a 20 41 20 73 74 61 74  ){.    /* A stat
7c80: 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
7c90: 62 61 73 69 73 20 61 6c 72 65 61 64 79 20 65 78  basis already ex
7ca0: 69 73 74 73 21 20 20 43 6f 70 79 20 61 6c 6c 20  ists!  Copy all 
7cb0: 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 0a 20  the follow-set. 
7cc0: 20 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 69 6f     ** propagatio
7cd0: 6e 20 6c 69 6e 6b 73 20 66 72 6f 6d 20 74 68 65  n links from the
7ce0: 20 73 74 61 74 65 20 75 6e 64 65 72 20 63 6f 6e   state under con
7cf0: 73 74 72 75 63 74 69 6f 6e 20 69 6e 74 6f 20 74  struction into t
7d00: 68 65 0a 20 20 20 20 2a 2a 20 70 72 65 65 78 69  he.    ** preexi
7d10: 73 74 69 6e 67 20 73 74 61 74 65 2c 20 74 68 65  sting state, the
7d20: 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
7d30: 65 72 20 74 6f 20 74 68 65 20 70 72 65 65 78 69  er to the preexi
7d40: 73 74 69 6e 67 20 73 74 61 74 65 20 2a 2f 0a 20  sting state */. 
7d50: 20 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67     struct config
7d60: 20 2a 78 2c 20 2a 79 3b 0a 20 20 20 20 66 6f 72   *x, *y;.    for
7d70: 28 78 3d 62 70 2c 20 79 3d 73 74 70 2d 3e 62 70  (x=bp, y=stp->bp
7d80: 3b 20 78 20 26 26 20 79 3b 20 78 3d 78 2d 3e 62  ; x && y; x=x->b
7d90: 70 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a 20 20 20  p, y=y->bp){.   
7da0: 20 20 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 26 79     Plink_copy(&y
7db0: 2d 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c 70 29 3b  ->bplp,x->bplp);
7dc0: 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 64 65 6c  .      Plink_del
7dd0: 65 74 65 28 78 2d 3e 66 70 6c 70 29 3b 0a 20 20  ete(x->fplp);.  
7de0: 20 20 20 20 78 2d 3e 66 70 6c 70 20 3d 20 78 2d      x->fplp = x-
7df0: 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 7d  >bplp = 0;.    }
7e00: 0a 20 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  .    cfp = Confi
7e10: 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 0a  glist_return();.
7e20: 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65      Configlist_e
7e30: 61 74 28 63 66 70 29 3b 0a 20 20 7d 65 6c 73 65  at(cfp);.  }else
7e40: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 65  {.    /* This re
7e50: 61 6c 6c 79 20 69 73 20 61 20 6e 65 77 20 73 74  ally is a new st
7e60: 61 74 65 2e 20 20 43 6f 6e 73 74 72 75 63 74 20  ate.  Construct 
7e70: 61 6c 6c 20 74 68 65 20 64 65 74 61 69 6c 73 20  all the details 
7e80: 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73  */.    Configlis
7e90: 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d 70 29 3b  t_closure(lemp);
7ea0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
7eb0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
7ec0: 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20   closure */.    
7ed0: 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28  Configlist_sort(
7ee0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );           /* 
7ef0: 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75  Sort the configu
7f00: 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a  ration closure *
7f10: 2f 0a 20 20 20 20 63 66 70 20 3d 20 43 6f 6e 66  /.    cfp = Conf
7f20: 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 3b  iglist_return();
7f30: 20 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e     /* Get a poin
7f40: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6e 66 69  ter to the confi
7f50: 67 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 73 74  g list */.    st
7f60: 70 20 3d 20 53 74 61 74 65 5f 6e 65 77 28 29 3b  p = State_new();
7f70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
7f80: 6e 65 77 20 73 74 61 74 65 20 73 74 72 75 63 74  new state struct
7f90: 75 72 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 6f 72  ure */.    Memor
7fa0: 79 43 68 65 63 6b 28 73 74 70 29 3b 0a 20 20 20  yCheck(stp);.   
7fb0: 20 73 74 70 2d 3e 62 70 20 3d 20 62 70 3b 20 20   stp->bp = bp;  
7fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7fd0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f   Remember the co
7fe0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 61 73 69  nfiguration basi
7ff0: 73 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 63 66  s */.    stp->cf
8000: 70 20 3d 20 63 66 70 3b 20 20 20 20 20 20 20 20  p = cfp;        
8010: 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65        /* Remembe
8020: 72 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  r the configurat
8030: 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20  ion closure */. 
8040: 20 20 20 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d     stp->statenum
8050: 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b   = lemp->nstate+
8060: 2b 3b 20 2f 2a 20 45 76 65 72 79 20 73 74 61 74  +; /* Every stat
8070: 65 20 67 65 74 73 20 61 20 73 65 71 75 65 6e 63  e gets a sequenc
8080: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
8090: 73 74 70 2d 3e 61 70 20 3d 20 30 3b 20 20 20 20  stp->ap = 0;    
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
80b0: 4e 6f 20 61 63 74 69 6f 6e 73 2c 20 79 65 74 2e  No actions, yet.
80c0: 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 5f 69 6e   */.    State_in
80d0: 73 65 72 74 28 73 74 70 2c 73 74 70 2d 3e 62 70  sert(stp,stp->bp
80e0: 29 3b 20 20 20 2f 2a 20 41 64 64 20 74 6f 20 74  );   /* Add to t
80f0: 68 65 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a  he state table *
8100: 2f 0a 20 20 20 20 62 75 69 6c 64 73 68 69 66 74  /.    buildshift
8110: 73 28 6c 65 6d 70 2c 73 74 70 29 3b 20 20 20 20  s(lemp,stp);    
8120: 20 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c     /* Recursivel
8130: 79 20 63 6f 6d 70 75 74 65 20 73 75 63 63 65 73  y compute succes
8140: 73 6f 72 20 73 74 61 74 65 73 20 2a 2f 0a 20 20  sor states */.  
8150: 7d 0a 20 20 72 65 74 75 72 6e 20 73 74 70 3b 0a  }.  return stp;.
8160: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8170: 74 72 75 65 20 69 66 20 74 77 6f 20 73 79 6d 62  true if two symb
8180: 6f 6c 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ols are the same
8190: 2e 0a 2a 2f 0a 69 6e 74 20 73 61 6d 65 5f 73 79  ..*/.int same_sy
81a0: 6d 62 6f 6c 28 73 74 72 75 63 74 20 73 79 6d 62  mbol(struct symb
81b0: 6f 6c 20 2a 61 2c 20 73 74 72 75 63 74 20 73 79  ol *a, struct sy
81c0: 6d 62 6f 6c 20 2a 62 29 0a 7b 0a 20 20 69 6e 74  mbol *b).{.  int
81d0: 20 69 3b 0a 20 20 69 66 28 20 61 3d 3d 62 20 29   i;.  if( a==b )
81e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
81f0: 20 61 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54   a->type!=MULTIT
8200: 45 52 4d 49 4e 41 4c 20 29 20 72 65 74 75 72 6e  ERMINAL ) return
8210: 20 30 3b 0a 20 20 69 66 28 20 62 2d 3e 74 79 70   0;.  if( b->typ
8220: 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e!=MULTITERMINAL
8230: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
8240: 66 28 20 61 2d 3e 6e 73 75 62 73 79 6d 21 3d 62  f( a->nsubsym!=b
8250: 2d 3e 6e 73 75 62 73 79 6d 20 29 20 72 65 74 75  ->nsubsym ) retu
8260: 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 0;.  for(i=0;
8270: 20 69 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b 20 69   i<a->nsubsym; i
8280: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e  ++){.    if( a->
8290: 73 75 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e 73 75  subsym[i]!=b->su
82a0: 62 73 79 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e  bsym[i] ) return
82b0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
82c0: 20 31 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72   1;.}../* Constr
82d0: 75 63 74 20 61 6c 6c 20 73 75 63 63 65 73 73 6f  uct all successo
82e0: 72 20 73 74 61 74 65 73 20 74 6f 20 74 68 65 20  r states to the 
82f0: 67 69 76 65 6e 20 73 74 61 74 65 2e 20 20 41 20  given state.  A 
8300: 22 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73  "successor".** s
8310: 74 61 74 65 20 69 73 20 61 6e 79 20 73 74 61 74  tate is any stat
8320: 65 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 72  e which can be r
8330: 65 61 63 68 65 64 20 62 79 20 61 20 73 68 69 66  eached by a shif
8340: 74 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49  t action..*/.PRI
8350: 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73  VATE void builds
8360: 68 69 66 74 73 28 73 74 72 75 63 74 20 6c 65 6d  hifts(struct lem
8370: 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74  on *lemp, struct
8380: 20 73 74 61 74 65 20 2a 73 74 70 29 0a 7b 0a 20   state *stp).{. 
8390: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
83a0: 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  cfp;  /* For loo
83b0: 70 69 6e 67 20 74 68 72 75 20 74 68 65 20 63 6f  ping thru the co
83c0: 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20  nfig closure of 
83d0: 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63  "stp" */.  struc
83e0: 74 20 63 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20  t config *bcfp; 
83f0: 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e 6e 65 72  /* For the inner
8400: 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20   loop on config 
8410: 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22  closure of "stp"
8420: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
8430: 66 69 67 20 2a 6e 65 77 63 66 67 3b 20 20 2f 2a  fig *newcfg;  /*
8440: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
8450: 62 6f 6c 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79  bol *sp;   /* Sy
8460: 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  mbol following t
8470: 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67  he dot in config
8480: 75 72 61 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f  uration "cfp" */
8490: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
84a0: 20 2a 62 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f   *bsp;  /* Symbo
84b0: 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  l following the 
84c0: 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61  dot in configura
84d0: 74 69 6f 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20  tion "bcfp" */. 
84e0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e   struct state *n
84f0: 65 77 73 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e  ewstp; /* A poin
8500: 74 65 72 20 74 6f 20 61 20 73 75 63 63 65 73 73  ter to a success
8510: 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f  or state */..  /
8520: 2a 20 45 61 63 68 20 63 6f 6e 66 69 67 75 72 61  * Each configura
8530: 74 69 6f 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d  tion becomes com
8540: 70 6c 65 74 65 20 61 66 74 65 72 20 69 74 20 63  plete after it c
8550: 6f 6e 74 69 62 75 74 65 73 20 74 6f 20 61 20 73  ontibutes to a s
8560: 75 63 63 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74  uccessor.  ** st
8570: 61 74 65 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c  ate.  Initially,
8580: 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   all configurati
8590: 6f 6e 73 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65  ons are incomple
85a0: 74 65 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d  te */.  for(cfp=
85b0: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
85c0: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 20 63 66  fp=cfp->next) cf
85d0: 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f  p->status = INCO
85e0: 4d 50 4c 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f  MPLETE;..  /* Lo
85f0: 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63  op through all c
8600: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 6f 66  onfigurations of
8610: 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22   the state "stp"
8620: 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74   */.  for(cfp=st
8630: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
8640: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
8650: 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73   if( cfp->status
8660: 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e  ==COMPLETE ) con
8670: 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72  tinue;    /* Alr
8680: 65 61 64 79 20 75 73 65 64 20 62 79 20 69 6e 6e  eady used by inn
8690: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  er loop */.    i
86a0: 66 28 20 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70  f( cfp->dot>=cfp
86b0: 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e  ->rp->nrhs ) con
86c0: 74 69 6e 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74  tinue;  /* Can't
86d0: 20 73 68 69 66 74 20 74 68 69 73 20 63 6f 6e 66   shift this conf
86e0: 69 67 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67  ig */.    Config
86f0: 6c 69 73 74 5f 72 65 73 65 74 28 29 3b 20 20 20  list_reset();   
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8710: 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20     /* Reset the 
8720: 6e 65 77 20 63 6f 6e 66 69 67 20 73 65 74 20 2a  new config set *
8730: 2f 0a 20 20 20 20 73 70 20 3d 20 63 66 70 2d 3e  /.    sp = cfp->
8740: 72 70 2d 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74  rp->rhs[cfp->dot
8750: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
8760: 2a 20 53 79 6d 62 6f 6c 20 61 66 74 65 72 20 74  * Symbol after t
8770: 68 65 20 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f  he dot */..    /
8780: 2a 20 46 6f 72 20 65 76 65 72 79 20 63 6f 6e 66  * For every conf
8790: 69 67 75 72 61 74 69 6f 6e 20 69 6e 20 74 68 65  iguration in the
87a0: 20 73 74 61 74 65 20 22 73 74 70 22 20 77 68 69   state "stp" whi
87b0: 63 68 20 68 61 73 20 74 68 65 20 73 79 6d 62 6f  ch has the symbo
87c0: 6c 20 22 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f  l "sp".    ** fo
87d0: 6c 6c 6f 77 69 6e 67 20 69 74 73 20 64 6f 74 2c  llowing its dot,
87e0: 20 61 64 64 20 74 68 65 20 73 61 6d 65 20 63 6f   add the same co
87f0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74  nfiguration to t
8800: 68 65 20 62 61 73 69 73 20 73 65 74 20 75 6e 64  he basis set und
8810: 65 72 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  er.    ** constr
8820: 75 63 74 69 6f 6e 20 62 75 74 20 77 69 74 68 20  uction but with 
8830: 74 68 65 20 64 6f 74 20 73 68 69 66 74 65 64 20  the dot shifted 
8840: 6f 6e 65 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68  one symbol to th
8850: 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
8860: 66 6f 72 28 62 63 66 70 3d 63 66 70 3b 20 62 63  for(bcfp=cfp; bc
8870: 66 70 3b 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e  fp; bcfp=bcfp->n
8880: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
8890: 62 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f  bcfp->status==CO
88a0: 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75  MPLETE ) continu
88b0: 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79  e;    /* Already
88c0: 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 69   used */.      i
88d0: 66 28 20 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63  f( bcfp->dot>=bc
88e0: 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63  fp->rp->nrhs ) c
88f0: 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27  ontinue; /* Can'
8900: 74 20 73 68 69 66 74 20 74 68 69 73 20 6f 6e 65  t shift this one
8910: 20 2a 2f 0a 20 20 20 20 20 20 62 73 70 20 3d 20   */.      bsp = 
8920: 62 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63  bcfp->rp->rhs[bc
8930: 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20  fp->dot];       
8940: 20 20 20 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f      /* Get symbo
8950: 6c 20 61 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20  l after dot */. 
8960: 20 20 20 20 20 69 66 28 20 21 73 61 6d 65 5f 73       if( !same_s
8970: 79 6d 62 6f 6c 28 62 73 70 2c 73 70 29 20 29 20  ymbol(bsp,sp) ) 
8980: 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 2f  continue;      /
8990: 2a 20 4d 75 73 74 20 62 65 20 73 61 6d 65 20 61  * Must be same a
89a0: 73 20 66 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20  s for "cfp" */. 
89b0: 20 20 20 20 20 62 63 66 70 2d 3e 73 74 61 74 75       bcfp->statu
89c0: 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20  s = COMPLETE;   
89d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
89e0: 2a 20 4d 61 72 6b 20 74 68 69 73 20 63 6f 6e 66  * Mark this conf
89f0: 69 67 20 61 73 20 75 73 65 64 20 2a 2f 0a 20 20  ig as used */.  
8a00: 20 20 20 20 6e 65 77 63 66 67 20 3d 20 43 6f 6e      newcfg = Con
8a10: 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73  figlist_addbasis
8a20: 28 62 63 66 70 2d 3e 72 70 2c 62 63 66 70 2d 3e  (bcfp->rp,bcfp->
8a30: 64 6f 74 2b 31 29 3b 0a 20 20 20 20 20 20 50 6c  dot+1);.      Pl
8a40: 69 6e 6b 5f 61 64 64 28 26 6e 65 77 63 66 67 2d  ink_add(&newcfg-
8a50: 3e 62 70 6c 70 2c 62 63 66 70 29 3b 0a 20 20 20  >bplp,bcfp);.   
8a60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 61   }..    /* Get a
8a70: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
8a80: 73 74 61 74 65 20 64 65 73 63 72 69 62 65 64 20  state described 
8a90: 62 79 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e  by the basis con
8aa0: 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 0a 20  figuration set. 
8ab0: 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65     ** constructe
8ac0: 64 20 69 6e 20 74 68 65 20 70 72 65 63 65 64 69  d in the precedi
8ad0: 6e 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 6e  ng loop */.    n
8ae0: 65 77 73 74 70 20 3d 20 67 65 74 73 74 61 74 65  ewstp = getstate
8af0: 28 6c 65 6d 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  (lemp);..    /* 
8b00: 54 68 65 20 73 74 61 74 65 20 22 6e 65 77 73 74  The state "newst
8b10: 70 22 20 69 73 20 72 65 61 63 68 65 64 20 66 72  p" is reached fr
8b20: 6f 6d 20 74 68 65 20 73 74 61 74 65 20 22 73 74  om the state "st
8b30: 70 22 20 62 79 20 61 20 73 68 69 66 74 20 61 63  p" by a shift ac
8b40: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  tion.    ** on t
8b50: 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 20 2a  he symbol "sp" *
8b60: 2f 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  /.    if( sp->ty
8b70: 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
8b80: 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  L ){.      int i
8b90: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
8ba0: 20 69 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20   i<sp->nsubsym; 
8bb0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 41 63  i++){.        Ac
8bc0: 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61  tion_add(&stp->a
8bd0: 70 2c 53 48 49 46 54 2c 73 70 2d 3e 73 75 62 73  p,SHIFT,sp->subs
8be0: 79 6d 5b 69 5d 2c 28 63 68 61 72 2a 29 6e 65 77  ym[i],(char*)new
8bf0: 73 74 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  stp);.      }.  
8c00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 41    }else{.      A
8c10: 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e  ction_add(&stp->
8c20: 61 70 2c 53 48 49 46 54 2c 73 70 2c 28 63 68 61  ap,SHIFT,sp,(cha
8c30: 72 20 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20  r *)newstp);.   
8c40: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
8c50: 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 70 72  Construct the pr
8c60: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a  opagation links.
8c70: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b  */.void FindLink
8c80: 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
8c90: 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  lemp).{.  int i;
8ca0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
8cb0: 20 2a 63 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20   *cfp, *other;. 
8cc0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
8cd0: 74 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  tp;.  struct pli
8ce0: 6e 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48  nk *plp;..  /* H
8cf0: 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65 74 61  ousekeeping deta
8d00: 69 6c 3a 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20  il:.  ** Add to 
8d10: 65 76 65 72 79 20 70 72 6f 70 61 67 61 74 65 20  every propagate 
8d20: 6c 69 6e 6b 20 61 20 70 6f 69 6e 74 65 72 20 62  link a pointer b
8d30: 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61 74 65  ack to the state
8d40: 20 74 6f 0a 20 20 2a 2a 20 77 68 69 63 68 20 74   to.  ** which t
8d50: 68 65 20 6c 69 6e 6b 20 69 73 20 61 74 74 61 63  he link is attac
8d60: 68 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  hed. */.  for(i=
8d70: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
8d80: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
8d90: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
8da0: 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d  i];.    for(cfp=
8db0: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
8dc0: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
8dd0: 20 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20       cfp->stp = 
8de0: 73 74 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  stp;.    }.  }..
8df0: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c    /* Convert all
8e00: 20 62 61 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20   backlinks into 
8e10: 66 6f 72 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20  forward links.  
8e20: 4f 6e 6c 79 20 74 68 65 20 66 6f 72 77 61 72 64  Only the forward
8e30: 0a 20 20 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20  .  ** links are 
8e40: 75 73 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c  used in the foll
8e50: 6f 77 2d 73 65 74 20 63 6f 6d 70 75 74 61 74 69  ow-set computati
8e60: 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  on. */.  for(i=0
8e70: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
8e80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
8e90: 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
8ea0: 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73  ];.    for(cfp=s
8eb0: 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66  tp->cfp; cfp; cf
8ec0: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=cfp->next){.  
8ed0: 20 20 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d      for(plp=cfp-
8ee0: 3e 62 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d  >bplp; plp; plp=
8ef0: 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  plp->next){.    
8f00: 20 20 20 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d      other = plp-
8f10: 3e 63 66 70 3b 0a 20 20 20 20 20 20 20 20 50 6c  >cfp;.        Pl
8f20: 69 6e 6b 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e  ink_add(&other->
8f30: 66 70 6c 70 2c 63 66 70 29 3b 0a 20 20 20 20 20  fplp,cfp);.     
8f40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
8f50: 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66  /* Compute all f
8f60: 6f 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a  ollowsets..**.**
8f70: 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20   A followset is 
8f80: 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 73  the set of all s
8f90: 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e  ymbols which can
8fa0: 20 63 6f 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c   come immediatel
8fb0: 79 0a 2a 2a 20 61 66 74 65 72 20 61 20 63 6f 6e  y.** after a con
8fc0: 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  figuration..*/.v
8fd0: 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65  oid FindFollowSe
8fe0: 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  ts(struct lemon 
8ff0: 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69  *lemp).{.  int i
9000: 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  ;.  struct confi
9010: 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74  g *cfp;.  struct
9020: 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69   plink *plp;.  i
9030: 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 69  nt progress;.  i
9040: 6e 74 20 63 68 61 6e 67 65 3b 0a 0a 20 20 66 6f  nt change;..  fo
9050: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
9060: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
9070: 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73   for(cfp=lemp->s
9080: 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63  orted[i]->cfp; c
9090: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
90a0: 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e 73  t){.      cfp->s
90b0: 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45  tatus = INCOMPLE
90c0: 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  TE;.    }.  }.  
90d0: 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72  .  do{.    progr
90e0: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ess = 0;.    for
90f0: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
9100: 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
9110: 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e    for(cfp=lemp->
9120: 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20  sorted[i]->cfp; 
9130: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
9140: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  xt){.        if(
9150: 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f   cfp->status==CO
9160: 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75  MPLETE ) continu
9170: 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  e;.        for(p
9180: 6c 70 3d 63 66 70 2d 3e 66 70 6c 70 3b 20 70 6c  lp=cfp->fplp; pl
9190: 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74  p; plp=plp->next
91a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
91b0: 6e 67 65 20 3d 20 53 65 74 55 6e 69 6f 6e 28 70  nge = SetUnion(p
91c0: 6c 70 2d 3e 63 66 70 2d 3e 66 77 73 2c 63 66 70  lp->cfp->fws,cfp
91d0: 2d 3e 66 77 73 29 3b 0a 20 20 20 20 20 20 20 20  ->fws);.        
91e0: 20 20 69 66 28 20 63 68 61 6e 67 65 20 29 7b 0a    if( change ){.
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 70 2d              plp-
9200: 3e 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49  >cfp->status = I
9210: 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20  NCOMPLETE;.     
9220: 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20         progress 
9230: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
9240: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9250: 20 20 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d     cfp->status =
9260: 20 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20   COMPLETE;.     
9270: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
9280: 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d  e( progress );.}
9290: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  ..static int res
92a0: 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 73 74  olve_conflict(st
92b0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2c 73 74  ruct action *,st
92c0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a  ruct action *);.
92d0: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  ./* Compute the 
92e0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c 20  reduce actions, 
92f0: 61 6e 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66  and resolve conf
9300: 6c 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46  licts..*/.void F
9310: 69 6e 64 41 63 74 69 6f 6e 73 28 73 74 72 75 63  indActions(struc
9320: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
9330: 0a 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74  .  int i,j;.  st
9340: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
9350: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
9360: 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
9370: 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74  symbol *sp;.  st
9380: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a  ruct rule *rp;..
9390: 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20    /* Add all of 
93a0: 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f  the reduce actio
93b0: 6e 73 20 0a 20 20 2a 2a 20 41 20 72 65 64 75 63  ns .  ** A reduc
93c0: 65 20 61 63 74 69 6f 6e 20 69 73 20 61 64 64 65  e action is adde
93d0: 64 20 66 6f 72 20 65 61 63 68 20 65 6c 65 6d 65  d for each eleme
93e0: 6e 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  nt of the follow
93f0: 73 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f  set of.  ** a co
9400: 6e 66 69 67 75 72 61 74 69 6f 6e 20 77 68 69 63  nfiguration whic
9410: 68 20 68 61 73 20 69 74 73 20 64 6f 74 20 61 74  h has its dot at
9420: 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
9430: 68 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ht..  */.  for(i
9440: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
9450: 74 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c  te; i++){   /* L
9460: 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 74 61  oop over all sta
9470: 74 65 73 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d  tes */.    stp =
9480: 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
9490: 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74  ;.    for(cfp=st
94a0: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
94b0: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a  =cfp->next){  /*
94c0: 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63   Loop over all c
94d0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f  onfigurations */
94e0: 0a 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e  .      if( cfp->
94f0: 72 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64  rp->nrhs==cfp->d
9500: 6f 74 20 29 7b 20 20 20 20 20 20 20 20 2f 2a 20  ot ){        /* 
9510: 49 73 20 64 6f 74 20 61 74 20 65 78 74 72 65 6d  Is dot at extrem
9520: 65 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20  e right? */.    
9530: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
9540: 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
9550: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
9560: 69 66 28 20 53 65 74 46 69 6e 64 28 63 66 70 2d  if( SetFind(cfp-
9570: 3e 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20  >fws,j) ){.     
9580: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20         /* Add a 
9590: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 74 6f  reduce action to
95a0: 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22   the state "stp"
95b0: 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65 64 75   which will redu
95c0: 63 65 20 62 79 20 74 68 65 0a 20 20 20 20 20 20  ce by the.      
95d0: 20 20 20 20 20 20 2a 2a 20 72 75 6c 65 20 22 63        ** rule "c
95e0: 66 70 2d 3e 72 70 22 20 69 66 20 74 68 65 20 6c  fp->rp" if the l
95f0: 6f 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f 6c 20  ookahead symbol 
9600: 69 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  is "lemp->symbol
9610: 73 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20  s[j]" */.       
9620: 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28       Action_add(
9630: 26 73 74 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c  &stp->ap,REDUCE,
9640: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d  lemp->symbols[j]
9650: 2c 28 63 68 61 72 20 2a 29 63 66 70 2d 3e 72 70  ,(char *)cfp->rp
9660: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
9670: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9680: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9690: 20 41 64 64 20 74 68 65 20 61 63 63 65 70 74 69   Add the accepti
96a0: 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66  ng token */.  if
96b0: 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b  ( lemp->start ){
96c0: 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c  .    sp = Symbol
96d0: 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72  _find(lemp->star
96e0: 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d  t);.    if( sp==
96f0: 30 20 29 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72  0 ) sp = lemp->r
9700: 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65 6c 73  ule->lhs;.  }els
9710: 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70  e{.    sp = lemp
9720: 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d  ->rule->lhs;.  }
9730: 0a 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65  .  /* Add to the
9740: 20 66 69 72 73 74 20 73 74 61 74 65 20 28 77 68   first state (wh
9750: 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 74 68  ich is always th
9760: 65 20 73 74 61 72 74 69 6e 67 20 73 74 61 74 65  e starting state
9770: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e   of the.  ** fin
9780: 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e  ite state machin
9790: 65 29 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20  e) an action to 
97a0: 41 43 43 45 50 54 20 69 66 20 74 68 65 20 6c 6f  ACCEPT if the lo
97b0: 6f 6b 61 68 65 61 64 20 69 73 20 74 68 65 0a 20  okahead is the. 
97c0: 20 2a 2a 20 73 74 61 72 74 20 6e 6f 6e 74 65 72   ** start nonter
97d0: 6d 69 6e 61 6c 2e 20 20 2a 2f 0a 20 20 41 63 74  minal.  */.  Act
97e0: 69 6f 6e 5f 61 64 64 28 26 6c 65 6d 70 2d 3e 73  ion_add(&lemp->s
97f0: 6f 72 74 65 64 5b 30 5d 2d 3e 61 70 2c 41 43 43  orted[0]->ap,ACC
9800: 45 50 54 2c 73 70 2c 30 29 3b 0a 0a 20 20 2f 2a  EPT,sp,0);..  /*
9810: 20 52 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63   Resolve conflic
9820: 74 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ts */.  for(i=0;
9830: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
9840: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
9850: 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 6e  t action *ap, *n
9860: 61 70 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  ap;.    stp = le
9870: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
9880: 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 73 74     /* assert( st
9890: 70 2d 3e 61 70 20 29 3b 20 2a 2f 0a 20 20 20 20  p->ap ); */.    
98a0: 73 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e  stp->ap = Action
98b0: 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a  _sort(stp->ap);.
98c0: 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
98d0: 61 70 3b 20 61 70 20 26 26 20 61 70 2d 3e 6e 65  ap; ap && ap->ne
98e0: 78 74 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  xt; ap=ap->next)
98f0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 6e 61 70 3d  {.      for(nap=
9900: 61 70 2d 3e 6e 65 78 74 3b 20 6e 61 70 20 26 26  ap->next; nap &&
9910: 20 6e 61 70 2d 3e 73 70 3d 3d 61 70 2d 3e 73 70   nap->sp==ap->sp
9920: 3b 20 6e 61 70 3d 6e 61 70 2d 3e 6e 65 78 74 29  ; nap=nap->next)
9930: 7b 0a 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  {.         /* Th
9940: 65 20 74 77 6f 20 61 63 74 69 6f 6e 73 20 22 61  e two actions "a
9950: 70 22 20 61 6e 64 20 22 6e 61 70 22 20 68 61 76  p" and "nap" hav
9960: 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 6f 6b 61  e the same looka
9970: 68 65 61 64 2e 0a 20 20 20 20 20 20 20 20 20 2a  head..         *
9980: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69  * Figure out whi
9990: 63 68 20 6f 6e 65 20 73 68 6f 75 6c 64 20 62 65  ch one should be
99a0: 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20   used */.       
99b0: 20 20 6c 65 6d 70 2d 3e 6e 63 6f 6e 66 6c 69 63    lemp->nconflic
99c0: 74 20 2b 3d 20 72 65 73 6f 6c 76 65 5f 63 6f 6e  t += resolve_con
99d0: 66 6c 69 63 74 28 61 70 2c 6e 61 70 29 3b 0a 20  flict(ap,nap);. 
99e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
99f0: 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20 61 6e  ..  /* Report an
9a00: 20 65 72 72 6f 72 20 66 6f 72 20 65 61 63 68 20   error for each 
9a10: 72 75 6c 65 20 74 68 61 74 20 63 61 6e 20 6e 65  rule that can ne
9a20: 76 65 72 20 62 65 20 72 65 64 75 63 65 64 2e 20  ver be reduced. 
9a30: 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
9a40: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
9a50: 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 63 61 6e  p->next) rp->can
9a60: 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f 46  Reduce = LEMON_F
9a70: 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ALSE;.  for(i=0;
9a80: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
9a90: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
9aa0: 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20  t action *ap;.  
9ab0: 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e 73    for(ap=lemp->s
9ac0: 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20 61 70  orted[i]->ap; ap
9ad0: 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
9ae0: 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
9af0: 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61 70 2d  pe==REDUCE ) ap-
9b00: 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75 63 65  >x.rp->canReduce
9b10: 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20   = LEMON_TRUE;. 
9b20: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 72     }.  }.  for(r
9b30: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
9b40: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
9b50: 20 20 20 20 69 66 28 20 72 70 2d 3e 63 61 6e 52      if( rp->canR
9b60: 65 64 75 63 65 20 29 20 63 6f 6e 74 69 6e 75 65  educe ) continue
9b70: 3b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c  ;.    ErrorMsg(l
9b80: 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70  emp->filename,rp
9b90: 2d 3e 72 75 6c 65 6c 69 6e 65 2c 22 54 68 69 73  ->ruleline,"This
9ba0: 20 72 75 6c 65 20 63 61 6e 20 6e 6f 74 20 62 65   rule can not be
9bb0: 20 72 65 64 75 63 65 64 2e 5c 6e 22 29 3b 0a 20   reduced.\n");. 
9bc0: 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
9bd0: 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52  t++;.  }.}../* R
9be0: 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63  esolve a conflic
9bf0: 74 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  t between the tw
9c00: 6f 20 67 69 76 65 6e 20 61 63 74 69 6f 6e 73 2e  o given actions.
9c10: 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 66    If the.** conf
9c20: 6c 69 63 74 20 63 61 6e 27 74 20 62 65 20 72 65  lict can't be re
9c30: 73 6f 6c 76 65 64 2c 20 72 65 74 75 72 6e 20 6e  solved, return n
9c40: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e  on-zero..**.** N
9c50: 4f 20 4c 4f 4e 47 45 52 20 54 52 55 45 3a 0a 2a  O LONGER TRUE:.*
9c60: 2a 20 20 20 54 6f 20 72 65 73 6f 6c 76 65 20 61  *   To resolve a
9c70: 20 63 6f 6e 66 6c 69 63 74 2c 20 66 69 72 73 74   conflict, first
9c80: 20 6c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20   look to see if 
9c90: 65 69 74 68 65 72 20 61 63 74 69 6f 6e 0a 2a 2a  either action.**
9ca0: 20 20 20 69 73 20 6f 6e 20 61 6e 20 65 72 72 6f     is on an erro
9cb0: 72 20 72 75 6c 65 2e 20 20 49 6e 20 74 68 61 74  r rule.  In that
9cc0: 20 63 61 73 65 2c 20 74 61 6b 65 20 74 68 65 20   case, take the 
9cd0: 61 63 74 69 6f 6e 20 77 68 69 63 68 0a 2a 2a 20  action which.** 
9ce0: 20 20 69 73 20 6e 6f 74 20 61 73 73 6f 63 69 61    is not associa
9cf0: 74 65 64 20 77 69 74 68 20 74 68 65 20 65 72 72  ted with the err
9d00: 6f 72 20 72 75 6c 65 2e 20 20 49 66 20 6e 65 69  or rule.  If nei
9d10: 74 68 65 72 20 6f 72 20 62 6f 74 68 0a 2a 2a 20  ther or both.** 
9d20: 20 20 61 63 74 69 6f 6e 73 20 61 72 65 20 61 73    actions are as
9d30: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 6e  sociated with an
9d40: 20 65 72 72 6f 72 20 72 75 6c 65 2c 20 74 68 65   error rule, the
9d50: 6e 20 74 72 79 20 74 6f 0a 2a 2a 20 20 20 75 73  n try to.**   us
9d60: 65 20 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20  e precedence to 
9d70: 72 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6e 66  resolve the conf
9d80: 6c 69 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  lict..**.** If e
9d90: 69 74 68 65 72 20 61 63 74 69 6f 6e 20 69 73 20  ither action is 
9da0: 61 20 53 48 49 46 54 2c 20 74 68 65 6e 20 69 74  a SHIFT, then it
9db0: 20 6d 75 73 74 20 62 65 20 61 70 78 2e 20 20 54   must be apx.  T
9dc0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
9dd0: 77 6f 6e 27 74 20 77 6f 72 6b 20 69 66 20 61 70  won't work if ap
9de0: 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  x->type==REDUCE 
9df0: 61 6e 64 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53  and apy->type==S
9e00: 48 49 46 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  HIFT..*/.static 
9e10: 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66  int resolve_conf
9e20: 6c 69 63 74 28 0a 20 20 73 74 72 75 63 74 20 61  lict(.  struct a
9e30: 63 74 69 6f 6e 20 2a 61 70 78 2c 0a 20 20 73 74  ction *apx,.  st
9e40: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 79  ruct action *apy
9e50: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  .){.  struct sym
9e60: 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70 79 3b 0a  bol *spx, *spy;.
9e70: 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30    int errcnt = 0
9e80: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70 78 2d  ;.  assert( apx-
9e90: 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20 29 3b 20  >sp==apy->sp ); 
9ea0: 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 74 68   /* Otherwise th
9eb0: 65 72 65 20 77 6f 75 6c 64 20 62 65 20 6e 6f 20  ere would be no 
9ec0: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 66  conflict */.  if
9ed0: 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 49  ( apx->type==SHI
9ee0: 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d  FT && apy->type=
9ef0: 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 61 70  =SHIFT ){.    ap
9f00: 79 2d 3e 74 79 70 65 20 3d 20 53 53 43 4f 4e 46  y->type = SSCONF
9f10: 4c 49 43 54 3b 0a 20 20 20 20 65 72 72 63 6e 74  LICT;.    errcnt
9f20: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 70  ++;.  }.  if( ap
9f30: 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26  x->type==SHIFT &
9f40: 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44  & apy->type==RED
9f50: 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d  UCE ){.    spx =
9f60: 20 61 70 78 2d 3e 73 70 3b 0a 20 20 20 20 73 70   apx->sp;.    sp
9f70: 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70  y = apy->x.rp->p
9f80: 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28 20  recsym;.    if( 
9f90: 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70  spy==0 || spx->p
9fa0: 72 65 63 3c 30 20 7c 7c 20 73 70 79 2d 3e 70 72  rec<0 || spy->pr
9fb0: 65 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ec<0 ){.      /*
9fc0: 20 4e 6f 74 20 65 6e 6f 75 67 68 20 70 72 65 63   Not enough prec
9fd0: 65 64 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69  edence informati
9fe0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 70 79  on. */.      apy
9ff0: 2d 3e 74 79 70 65 20 3d 20 53 52 43 4f 4e 46 4c  ->type = SRCONFL
a000: 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e  ICT;.      errcn
a010: 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t++;.    }else i
a020: 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73 70 79  f( spx->prec>spy
a030: 2d 3e 70 72 65 63 20 29 7b 20 20 20 20 2f 2a 20  ->prec ){    /* 
a040: 68 69 67 68 65 72 20 70 72 65 63 65 64 65 6e 63  higher precedenc
a050: 65 20 77 69 6e 73 20 2a 2f 0a 20 20 20 20 20 20  e wins */.      
a060: 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52  apy->type = RD_R
a070: 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c  ESOLVED;.    }el
a080: 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63  se if( spx->prec
a090: 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20  <spy->prec ){.  
a0a0: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20      apx->type = 
a0b0: 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20  SH_RESOLVED;.   
a0c0: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
a0d0: 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20  prec==spy->prec 
a0e0: 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 52  && spx->assoc==R
a0f0: 49 47 48 54 20 29 7b 20 2f 2a 20 55 73 65 20 6f  IGHT ){ /* Use o
a100: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
a110: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f   apy->type = RD_
a120: 52 45 53 4f 4c 56 45 44 3b 20 20 20 20 20 20 20  RESOLVED;       
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 20 20 20 20 20 20 2f 2a 20 61 73 73 6f 63 69 61        /* associa
a150: 74 69 76 69 74 79 20 2a 2f 0a 20 20 20 20 7d 65  tivity */.    }e
a160: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
a170: 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20  c==spy->prec && 
a180: 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4c 45 46 54  spx->assoc==LEFT
a190: 20 29 7b 20 20 2f 2a 20 74 6f 20 62 72 65 61 6b   ){  /* to break
a1a0: 20 74 69 65 20 2a 2f 0a 20 20 20 20 20 20 61 70   tie */.      ap
a1b0: 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52 45 53  x->type = SH_RES
a1c0: 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  OLVED;.    }else
a1d0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
a1e0: 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e  spx->prec==spy->
a1f0: 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73  prec && spx->ass
a200: 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a 20 20 20 20  oc==NONE );.    
a210: 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 45 52    apx->type = ER
a220: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ROR;.    }.  }el
a230: 73 65 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65  se if( apx->type
a240: 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 79 2d  ==REDUCE && apy-
a250: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b  >type==REDUCE ){
a260: 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e  .    spx = apx->
a270: 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20  x.rp->precsym;. 
a280: 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e     spy = apy->x.
a290: 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20  rp->precsym;.   
a2a0: 20 69 66 28 20 73 70 78 3d 3d 30 20 7c 7c 20 73   if( spx==0 || s
a2b0: 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72  py==0 || spx->pr
a2c0: 65 63 3c 30 20 7c 7c 0a 20 20 20 20 73 70 79 2d  ec<0 ||.    spy-
a2d0: 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70 78 2d 3e  >prec<0 || spx->
a2e0: 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20  prec==spy->prec 
a2f0: 29 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  ){.      apy->ty
a300: 70 65 20 3d 20 52 52 43 4f 4e 46 4c 49 43 54 3b  pe = RRCONFLICT;
a310: 0a 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b  .      errcnt++;
a320: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
a330: 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72  px->prec>spy->pr
a340: 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70 79 2d  ec ){.      apy-
a350: 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c  >type = RD_RESOL
a360: 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  VED;.    }else i
a370: 66 28 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79  f( spx->prec<spy
a380: 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20  ->prec ){.      
a390: 61 70 78 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52  apx->type = RD_R
a3a0: 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 0a 20  ESOLVED;.    }. 
a3b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
a3c0: 72 74 28 20 0a 20 20 20 20 20 20 61 70 78 2d 3e  rt( .      apx->
a3d0: 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45  type==SH_RESOLVE
a3e0: 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e  D ||.      apx->
a3f0: 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45  type==RD_RESOLVE
a400: 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e  D ||.      apx->
a410: 74 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49 43 54  type==SSCONFLICT
a420: 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ||.      apx->t
a430: 79 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43 54 20  ype==SRCONFLICT 
a440: 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  ||.      apx->ty
a450: 70 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54 20 7c  pe==RRCONFLICT |
a460: 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  |.      apy->typ
a470: 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c  e==SH_RESOLVED |
a480: 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  |.      apy->typ
a490: 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c  e==RD_RESOLVED |
a4a0: 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  |.      apy->typ
a4b0: 65 3d 3d 53 53 43 4f 4e 46 4c 49 43 54 20 7c 7c  e==SSCONFLICT ||
a4c0: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
a4d0: 3d 3d 53 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a  ==SRCONFLICT ||.
a4e0: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d        apy->type=
a4f0: 3d 52 52 43 4f 4e 46 4c 49 43 54 0a 20 20 20 20  =RRCONFLICT.    
a500: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 52 45  );.    /* The RE
a510: 44 55 43 45 2f 53 48 49 46 54 20 63 61 73 65 20  DUCE/SHIFT case 
a520: 63 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20 62 65  cannot happen be
a530: 63 61 75 73 65 20 53 48 49 46 54 73 20 63 6f 6d  cause SHIFTs com
a540: 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  e before.    ** 
a550: 52 45 44 55 43 45 73 20 6f 6e 20 74 68 65 20 6c  REDUCEs on the l
a560: 69 73 74 2e 20 20 49 66 20 77 65 20 72 65 61 63  ist.  If we reac
a570: 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  h this point it 
a580: 6d 75 73 74 20 62 65 20 62 65 63 61 75 73 65 0a  must be because.
a590: 20 20 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65      ** the parse
a5a0: 72 20 63 6f 6e 66 6c 69 63 74 20 68 61 64 20 61  r conflict had a
a5b0: 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 73 6f  lready been reso
a5c0: 6c 76 65 64 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72  lved. */.  }.  r
a5d0: 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a  eturn errcnt;.}.
a5e0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
a5f0: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
a600: 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74  file "configlist
a610: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
a620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
a630: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  *.** Routines to
a640: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 63 6f   processing a co
a650: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
a660: 20 61 6e 64 20 62 75 69 6c 64 69 6e 67 20 61 20   and building a 
a670: 73 74 61 74 65 0a 2a 2a 20 69 6e 20 74 68 65 20  state.** in the 
a680: 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
a690: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74  erator..*/..stat
a6a0: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
a6b0: 20 2a 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 20   *freelist = 0; 
a6c0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
a6d0: 66 72 65 65 20 63 6f 6e 66 69 67 75 72 61 74 69  free configurati
a6e0: 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ons */.static st
a6f0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 75 72  ruct config *cur
a700: 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  rent = 0;       
a710: 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f  /* Top of list o
a720: 66 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  f configurations
a730: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
a740: 74 20 63 6f 6e 66 69 67 20 2a 2a 63 75 72 72 65  t config **curre
a750: 6e 74 65 6e 64 20 3d 20 30 3b 20 20 20 2f 2a 20  ntend = 0;   /* 
a760: 4c 61 73 74 20 6f 6e 20 6c 69 73 74 20 6f 66 20  Last on list of 
a770: 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74 69  configs */.stati
a780: 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  c struct config 
a790: 2a 62 61 73 69 73 20 3d 20 30 3b 20 20 20 20 20  *basis = 0;     
a7a0: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69      /* Top of li
a7b0: 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e 66  st of basis conf
a7c0: 69 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  igs */.static st
a7d0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a 62 61  ruct config **ba
a7e0: 73 69 73 65 6e 64 20 3d 20 30 3b 20 20 20 20 20  sisend = 0;     
a7f0: 2f 2a 20 45 6e 64 20 6f 66 20 6c 69 73 74 20 6f  /* End of list o
a800: 66 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73 20  f basis configs 
a810: 2a 2f 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  */../* Return a 
a820: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77  pointer to a new
a830: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a   configuration *
a840: 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74  /.PRIVATE struct
a850: 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 6f 6e 66   config *newconf
a860: 69 67 28 29 7b 0a 20 20 73 74 72 75 63 74 20 63  ig(){.  struct c
a870: 6f 6e 66 69 67 20 2a 6e 65 77 63 66 67 3b 0a 20  onfig *newcfg;. 
a880: 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30   if( freelist==0
a890: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
a8a0: 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 33 3b 0a     int amt = 3;.
a8b0: 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20 28      freelist = (
a8c0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
a8d0: 63 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a  calloc( amt, siz
a8e0: 65 6f 66 28 73 74 72 75 63 74 20 63 6f 6e 66 69  eof(struct confi
a8f0: 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20 66 72  g) );.    if( fr
a900: 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
a910: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
a920: 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  r,"Unable to all
a930: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
a940: 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61   a new configura
a950: 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65  tion.");.      e
a960: 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
a970: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74    for(i=0; i<amt
a980: 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69 73  -1; i++) freelis
a990: 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65  t[i].next = &fre
a9a0: 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20  elist[i+1];.    
a9b0: 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e  freelist[amt-1].
a9c0: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  next = 0;.  }.  
a9d0: 6e 65 77 63 66 67 20 3d 20 66 72 65 65 6c 69 73  newcfg = freelis
a9e0: 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20  t;.  freelist = 
a9f0: 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a  freelist->next;.
aa00: 20 20 72 65 74 75 72 6e 20 6e 65 77 63 66 67 3b    return newcfg;
aa10: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 66 69  .}../* The confi
aa20: 67 75 72 61 74 69 6f 6e 20 22 6f 6c 64 22 20 69  guration "old" i
aa30: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 64  s no longer used
aa40: 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64   */.PRIVATE void
aa50: 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 73 74   deleteconfig(st
aa60: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64  ruct config *old
aa70: 29 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74 20  ).{.  old->next 
aa80: 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72  = freelist;.  fr
aa90: 65 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d 0a  eelist = old;.}.
aaa0: 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20  ./* Initialized 
aab0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
aac0: 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20 2a  n list builder *
aad0: 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  /.void Configlis
aae0: 74 5f 69 6e 69 74 28 29 7b 0a 20 20 63 75 72 72  t_init(){.  curr
aaf0: 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65  ent = 0;.  curre
ab00: 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74  ntend = &current
ab10: 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20  ;.  basis = 0;. 
ab20: 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73   basisend = &bas
ab30: 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c  is;.  Configtabl
ab40: 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72 65 74 75  e_init();.  retu
ab50: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61  rn;.}../* Initia
ab60: 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69 67  lized the config
ab70: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75 69  uration list bui
ab80: 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  lder */.void Con
ab90: 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 29 7b  figlist_reset(){
aba0: 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a  .  current = 0;.
abb0: 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26    currentend = &
abc0: 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73  current;.  basis
abd0: 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64   = 0;.  basisend
abe0: 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e   = &basis;.  Con
abf0: 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 30  figtable_clear(0
ac00: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
ac10: 2f 2a 20 41 64 64 20 61 6e 6f 74 68 65 72 20 63  /* Add another c
ac20: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20  onfiguration to 
ac30: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
ac40: 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74  n list */.struct
ac50: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
ac60: 69 73 74 5f 61 64 64 28 0a 20 20 73 74 72 75 63  ist_add(.  struc
ac70: 74 20 72 75 6c 65 20 2a 72 70 2c 20 20 20 20 2f  t rule *rp,    /
ac80: 2a 20 54 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20  * The rule */.  
ac90: 69 6e 74 20 64 6f 74 20 20 20 20 20 20 20 20 20  int dot         
aca0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74      /* Index int
acb0: 6f 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  o the RHS of the
acc0: 20 72 75 6c 65 20 77 68 65 72 65 20 74 68 65 20   rule where the 
acd0: 64 6f 74 20 67 6f 65 73 20 2a 2f 0a 29 7b 0a 20  dot goes */.){. 
ace0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
acf0: 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61  cfp, model;..  a
ad00: 73 73 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e  ssert( currenten
ad10: 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e  d!=0 );.  model.
ad20: 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c  rp = rp;.  model
ad30: 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66  .dot = dot;.  cf
ad40: 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  p = Configtable_
ad50: 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20  find(&model);.  
ad60: 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20  if( cfp==0 ){.  
ad70: 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69    cfp = newconfi
ad80: 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70  g();.    cfp->rp
ad90: 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e   = rp;.    cfp->
ada0: 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63  dot = dot;.    c
adb0: 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65 77  fp->fws = SetNew
adc0: 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74 70  ();.    cfp->stp
add0: 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66   = 0;.    cfp->f
ade0: 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20  plp = cfp->bplp 
adf0: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65  = 0;.    cfp->ne
ae00: 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d  xt = 0;.    cfp-
ae10: 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75  >bp = 0;.    *cu
ae20: 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a  rrentend = cfp;.
ae30: 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d      currentend =
ae40: 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20   &cfp->next;.   
ae50: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73   Configtable_ins
ae60: 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20  ert(cfp);.  }.  
ae70: 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f  return cfp;.}../
ae80: 2a 20 41 64 64 20 61 20 62 61 73 69 73 20 63 6f  * Add a basis co
ae90: 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74  nfiguration to t
aea0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
aeb0: 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20   list */.struct 
aec0: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
aed0: 73 74 5f 61 64 64 62 61 73 69 73 28 73 74 72 75  st_addbasis(stru
aee0: 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 69 6e 74  ct rule *rp, int
aef0: 20 64 6f 74 29 0a 7b 0a 20 20 73 74 72 75 63 74   dot).{.  struct
af00: 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f   config *cfp, mo
af10: 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  del;..  assert( 
af20: 62 61 73 69 73 65 6e 64 21 3d 30 20 29 3b 0a 20  basisend!=0 );. 
af30: 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e 74   assert( current
af40: 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65  end!=0 );.  mode
af50: 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64  l.rp = rp;.  mod
af60: 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20  el.dot = dot;.  
af70: 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c  cfp = Configtabl
af80: 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a  e_find(&model);.
af90: 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a    if( cfp==0 ){.
afa0: 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e      cfp = newcon
afb0: 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e  fig();.    cfp->
afc0: 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70  rp = rp;.    cfp
afd0: 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20  ->dot = dot;.   
afe0: 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e   cfp->fws = SetN
aff0: 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73  ew();.    cfp->s
b000: 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d  tp = 0;.    cfp-
b010: 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c  >fplp = cfp->bpl
b020: 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  p = 0;.    cfp->
b030: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66  next = 0;.    cf
b040: 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a  p->bp = 0;.    *
b050: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70  currentend = cfp
b060: 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64  ;.    currentend
b070: 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20   = &cfp->next;. 
b080: 20 20 20 2a 62 61 73 69 73 65 6e 64 20 3d 20 63     *basisend = c
b090: 66 70 3b 0a 20 20 20 20 62 61 73 69 73 65 6e 64  fp;.    basisend
b0a0: 20 3d 20 26 63 66 70 2d 3e 62 70 3b 0a 20 20 20   = &cfp->bp;.   
b0b0: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73   Configtable_ins
b0c0: 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20  ert(cfp);.  }.  
b0d0: 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f  return cfp;.}../
b0e0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6c  * Compute the cl
b0f0: 6f 73 75 72 65 20 6f 66 20 74 68 65 20 63 6f 6e  osure of the con
b100: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
b110: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
b120: 73 74 5f 63 6c 6f 73 75 72 65 28 73 74 72 75 63  st_closure(struc
b130: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
b140: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
b150: 20 2a 63 66 70 2c 20 2a 6e 65 77 63 66 70 3b 0a   *cfp, *newcfp;.
b160: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
b170: 70 2c 20 2a 6e 65 77 72 70 3b 0a 20 20 73 74 72  p, *newrp;.  str
b180: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 20  uct symbol *sp, 
b190: 2a 78 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 64  *xsp;.  int i, d
b1a0: 6f 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ot;..  assert( c
b1b0: 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a  urrentend!=0 );.
b1c0: 20 20 66 6f 72 28 63 66 70 3d 63 75 72 72 65 6e    for(cfp=curren
b1d0: 74 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  t; cfp; cfp=cfp-
b1e0: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72 70 20 3d  >next){.    rp =
b1f0: 20 63 66 70 2d 3e 72 70 3b 0a 20 20 20 20 64 6f   cfp->rp;.    do
b200: 74 20 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a 20 20  t = cfp->dot;.  
b210: 20 20 69 66 28 20 64 6f 74 3e 3d 72 70 2d 3e 6e    if( dot>=rp->n
b220: 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  rhs ) continue;.
b230: 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73      sp = rp->rhs
b240: 5b 64 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20 73  [dot];.    if( s
b250: 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d  p->type==NONTERM
b260: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  INAL ){.      if
b270: 28 20 73 70 2d 3e 72 75 6c 65 3d 3d 30 20 26 26  ( sp->rule==0 &&
b280: 20 73 70 21 3d 6c 65 6d 70 2d 3e 65 72 72 73 79   sp!=lemp->errsy
b290: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  m ){.        Err
b2a0: 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
b2b0: 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c 22 4e  name,rp->line,"N
b2c0: 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c 22 25 73 5c  onterminal \"%s\
b2d0: 22 20 68 61 73 20 6e 6f 20 72 75 6c 65 73 2e 22  " has no rules."
b2e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  ,.          sp->
b2f0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6c  name);.        l
b300: 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
b310: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
b320: 6f 72 28 6e 65 77 72 70 3d 73 70 2d 3e 72 75 6c  or(newrp=sp->rul
b330: 65 3b 20 6e 65 77 72 70 3b 20 6e 65 77 72 70 3d  e; newrp; newrp=
b340: 6e 65 77 72 70 2d 3e 6e 65 78 74 6c 68 73 29 7b  newrp->nextlhs){
b350: 0a 20 20 20 20 20 20 20 20 6e 65 77 63 66 70 20  .        newcfp 
b360: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64  = Configlist_add
b370: 28 6e 65 77 72 70 2c 30 29 3b 0a 20 20 20 20 20  (newrp,0);.     
b380: 20 20 20 66 6f 72 28 69 3d 64 6f 74 2b 31 3b 20     for(i=dot+1; 
b390: 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
b3a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 73 70 20  {.          xsp 
b3b0: 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20  = rp->rhs[i];.  
b3c0: 20 20 20 20 20 20 20 20 69 66 28 20 78 73 70 2d          if( xsp-
b3d0: 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20  >type==TERMINAL 
b3e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
b3f0: 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77  etAdd(newcfp->fw
b400: 73 2c 78 73 70 2d 3e 69 6e 64 65 78 29 3b 0a 20  s,xsp->index);. 
b410: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b420: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
b430: 65 20 69 66 28 20 78 73 70 2d 3e 74 79 70 65 3d  e if( xsp->type=
b440: 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
b450: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
b460: 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
b470: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 78 73 70 2d   for(k=0; k<xsp-
b480: 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a  >nsubsym; k++){.
b490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65                Se
b4a0: 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73  tAdd(newcfp->fws
b4b0: 2c 20 78 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d  , xsp->subsym[k]
b4c0: 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
b4d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b4e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b4f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b500: 20 20 20 20 20 20 20 20 53 65 74 55 6e 69 6f 6e          SetUnion
b510: 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70  (newcfp->fws,xsp
b520: 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20  ->firstset);.   
b530: 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73 70           if( xsp
b540: 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f  ->lambda==LEMON_
b550: 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 20  FALSE ) break;. 
b560: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b570: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
b580: 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 50   i==rp->nrhs ) P
b590: 6c 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e 66  link_add(&cfp->f
b5a0: 70 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20 20  plp,newcfp);.   
b5b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
b5c0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53   return;.}../* S
b5d0: 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ort the configur
b5e0: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f  ation list */.vo
b5f0: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f  id Configlist_so
b600: 72 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20  rt(){.  current 
b610: 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  = (struct config
b620: 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 2a 29 63  *)msort((char*)c
b630: 75 72 72 65 6e 74 2c 28 63 68 61 72 2a 2a 29 26  urrent,(char**)&
b640: 28 63 75 72 72 65 6e 74 2d 3e 6e 65 78 74 29 2c  (current->next),
b650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 20 20 20 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20     Configcmp);. 
b680: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b   currentend = 0;
b690: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
b6a0: 20 53 6f 72 74 20 74 68 65 20 62 61 73 69 73 20   Sort the basis 
b6b0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
b6c0: 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  st */.void Confi
b6d0: 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28  glist_sortbasis(
b6e0: 29 7b 0a 20 20 62 61 73 69 73 20 3d 20 28 73 74  ){.  basis = (st
b6f0: 72 75 63 74 20 63 6f 6e 66 69 67 2a 29 6d 73 6f  ruct config*)mso
b700: 72 74 28 28 63 68 61 72 2a 29 63 75 72 72 65 6e  rt((char*)curren
b710: 74 2c 28 63 68 61 72 2a 2a 29 26 28 63 75 72 72  t,(char**)&(curr
b720: 65 6e 74 2d 3e 62 70 29 2c 0a 20 20 20 20 20 20  ent->bp),.      
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b740: 20 20 20 20 20 20 20 20 20 20 43 6f 6e 66 69 67            Config
b750: 63 6d 70 29 3b 0a 20 20 62 61 73 69 73 65 6e 64  cmp);.  basisend
b760: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a   = 0;.  return;.
b770: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
b780: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
b790: 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67  ad of the config
b7a0: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64  uration list and
b7b0: 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69  .** reset the li
b7c0: 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e  st */.struct con
b7d0: 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f  fig *Configlist_
b7e0: 72 65 74 75 72 6e 28 29 7b 0a 20 20 73 74 72 75  return(){.  stru
b7f0: 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a  ct config *old;.
b800: 20 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e 74 3b    old = current;
b810: 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a  .  current = 0;.
b820: 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30    currentend = 0
b830: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a  ;.  return old;.
b840: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
b850: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
b860: 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67  ad of the config
b870: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64  uration list and
b880: 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69  .** reset the li
b890: 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e  st */.struct con
b8a0: 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f  fig *Configlist_
b8b0: 62 61 73 69 73 28 29 7b 0a 20 20 73 74 72 75 63  basis(){.  struc
b8c0: 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20  t config *old;. 
b8d0: 20 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a 20 20   old = basis;.  
b8e0: 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73  basis = 0;.  bas
b8f0: 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74  isend = 0;.  ret
b900: 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 46  urn old;.}../* F
b910: 72 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73  ree all elements
b920: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 6f   of the given co
b930: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
b940: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
b950: 69 73 74 5f 65 61 74 28 73 74 72 75 63 74 20 63  ist_eat(struct c
b960: 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20  onfig *cfp).{.  
b970: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
b980: 65 78 74 63 66 70 3b 0a 20 20 66 6f 72 28 3b 20  extcfp;.  for(; 
b990: 63 66 70 3b 20 63 66 70 3d 6e 65 78 74 63 66 70  cfp; cfp=nextcfp
b9a0: 29 7b 0a 20 20 20 20 6e 65 78 74 63 66 70 20 3d  ){.    nextcfp =
b9b0: 20 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20   cfp->next;.    
b9c0: 61 73 73 65 72 74 28 20 63 66 70 2d 3e 66 70 6c  assert( cfp->fpl
b9d0: 70 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  p==0 );.    asse
b9e0: 72 74 28 20 63 66 70 2d 3e 62 70 6c 70 3d 3d 30  rt( cfp->bplp==0
b9f0: 20 29 3b 0a 20 20 20 20 69 66 28 20 63 66 70 2d   );.    if( cfp-
ba00: 3e 66 77 73 20 29 20 53 65 74 46 72 65 65 28 63  >fws ) SetFree(c
ba10: 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 64 65  fp->fws);.    de
ba20: 6c 65 74 65 63 6f 6e 66 69 67 28 63 66 70 29 3b  leteconfig(cfp);
ba30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
ba40: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
ba50: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
ba60: 65 20 22 65 72 72 6f 72 2e 63 22 20 2a 2a 2a 2a  e "error.c" ****
ba70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ba80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
ba90: 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72  *.** Code for pr
baa0: 69 6e 74 69 6e 67 20 65 72 72 6f 72 20 6d 65 73  inting error mes
bab0: 73 61 67 65 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 45  sage..*/..void E
bac0: 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63 68  rrorMsg(const ch
bad0: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 69 6e  ar *filename, in
bae0: 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20  t lineno, const 
baf0: 63 68 61 72 20 2a 66 6f 72 6d 61 74 2c 20 2e 2e  char *format, ..
bb00: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
bb10: 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  ;.  fprintf(stde
bb20: 72 72 2c 20 22 25 73 3a 25 64 3a 20 22 2c 20 66  rr, "%s:%d: ", f
bb30: 69 6c 65 6e 61 6d 65 2c 20 6c 69 6e 65 6e 6f 29  ilename, lineno)
bb40: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
bb50: 20 66 6f 72 6d 61 74 29 3b 0a 20 20 76 66 70 72   format);.  vfpr
bb60: 69 6e 74 66 28 73 74 64 65 72 72 2c 66 6f 72 6d  intf(stderr,form
bb70: 61 74 2c 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  at,ap);.  va_end
bb80: 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  (ap);.  fprintf(
bb90: 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 7d  stderr, "\n");.}
bba0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
bbb0: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
bbc0: 20 22 6d 61 69 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a   "main.c" ******
bbd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bbe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
bbf0: 2f 2a 0a 2a 2a 20 4d 61 69 6e 20 70 72 6f 67 72  /*.** Main progr
bc00: 61 6d 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  am file for the 
bc10: 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
bc20: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52  erator..*/../* R
bc30: 65 70 6f 72 74 20 61 6e 20 6f 75 74 2d 6f 66 2d  eport an out-of-
bc40: 6d 65 6d 6f 72 79 20 63 6f 6e 64 69 74 69 6f 6e  memory condition
bc50: 20 61 6e 64 20 61 62 6f 72 74 2e 20 20 54 68 69   and abort.  Thi
bc60: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
bc70: 20 75 73 65 64 20 6d 6f 73 74 6c 79 20 62 79 20   used mostly by 
bc80: 74 68 65 20 22 4d 65 6d 6f 72 79 43 68 65 63 6b  the "MemoryCheck
bc90: 22 20 6d 61 63 72 6f 20 69 6e 20 73 74 72 75 63  " macro in struc
bca0: 74 2e 68 0a 2a 2f 0a 76 6f 69 64 20 6d 65 6d 6f  t.h.*/.void memo
bcb0: 72 79 5f 65 72 72 6f 72 28 29 7b 0a 20 20 66 70  ry_error(){.  fp
bcc0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75  rintf(stderr,"Ou
bcd0: 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 41 62  t of memory.  Ab
bce0: 6f 72 74 69 6e 67 2e 2e 2e 5c 6e 22 29 3b 0a 20  orting...\n");. 
bcf0: 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 73 74 61   exit(1);.}..sta
bd00: 74 69 63 20 69 6e 74 20 6e 44 65 66 69 6e 65 20  tic int nDefine 
bd10: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  = 0;      /* Num
bd20: 62 65 72 20 6f 66 20 2d 44 20 6f 70 74 69 6f 6e  ber of -D option
bd30: 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  s on the command
bd40: 20 6c 69 6e 65 20 2a 2f 0a 73 74 61 74 69 63 20   line */.static 
bd50: 63 68 61 72 20 2a 2a 61 7a 44 65 66 69 6e 65 20  char **azDefine 
bd60: 3d 20 30 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  = 0;  /* Name of
bd70: 20 74 68 65 20 2d 44 20 6d 61 63 72 6f 73 20 2a   the -D macros *
bd80: 2f 0a 0a 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  /../* This routi
bd90: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  ne is called wit
bda0: 68 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  h the argument t
bdb0: 6f 20 65 61 63 68 20 2d 44 20 63 6f 6d 6d 61 6e  o each -D comman
bdc0: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 2a  d-line option..*
bdd0: 2a 20 41 64 64 20 74 68 65 20 6d 61 63 72 6f 20  * Add the macro 
bde0: 64 65 66 69 6e 65 64 20 74 6f 20 74 68 65 20 61  defined to the a
bdf0: 7a 44 65 66 69 6e 65 20 61 72 72 61 79 2e 0a 2a  zDefine array..*
be00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 61  /.static void ha
be10: 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 28 63 68  ndle_D_option(ch
be20: 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72 20 2a  ar *z){.  char *
be30: 2a 70 61 7a 3b 0a 20 20 6e 44 65 66 69 6e 65 2b  *paz;.  nDefine+
be40: 2b 3b 0a 20 20 61 7a 44 65 66 69 6e 65 20 3d 20  +;.  azDefine = 
be50: 28 63 68 61 72 20 2a 2a 29 20 72 65 61 6c 6c 6f  (char **) reallo
be60: 63 28 61 7a 44 65 66 69 6e 65 2c 20 73 69 7a 65  c(azDefine, size
be70: 6f 66 28 61 7a 44 65 66 69 6e 65 5b 30 5d 29 2a  of(azDefine[0])*
be80: 6e 44 65 66 69 6e 65 29 3b 0a 20 20 69 66 28 20  nDefine);.  if( 
be90: 61 7a 44 65 66 69 6e 65 3d 3d 30 20 29 7b 0a 20  azDefine==0 ){. 
bea0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
beb0: 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"out of memory
bec0: 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
bed0: 29 3b 0a 20 20 7d 0a 20 20 70 61 7a 20 3d 20 26  );.  }.  paz = &
bee0: 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65  azDefine[nDefine
bef0: 2d 31 5d 3b 0a 20 20 2a 70 61 7a 20 3d 20 28 63  -1];.  *paz = (c
bf00: 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c  har *) malloc( l
bf10: 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b 31 20  emonStrlen(z)+1 
bf20: 29 3b 0a 20 20 69 66 28 20 2a 70 61 7a 3d 3d 30  );.  if( *paz==0
bf30: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
bf40: 73 74 64 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d  stderr,"out of m
bf50: 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65  emory\n");.    e
bf60: 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6c 65  xit(1);.  }.  le
bf70: 6d 6f 6e 5f 73 74 72 63 70 79 28 2a 70 61 7a 2c  mon_strcpy(*paz,
bf80: 20 7a 29 3b 0a 20 20 66 6f 72 28 7a 3d 2a 70 61   z);.  for(z=*pa
bf90: 7a 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 3d 27  z; *z && *z!='='
bfa0: 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 2a 7a 20 3d 20  ; z++){}.  *z = 
bfb0: 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61  0;.}..static cha
bfc0: 72 20 2a 75 73 65 72 5f 74 65 6d 70 6c 61 74 65  r *user_template
bfd0: 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61  name = NULL;.sta
bfe0: 74 69 63 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f  tic void handle_
bff0: 54 5f 6f 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a  T_option(char *z
c000: 29 7b 0a 20 20 75 73 65 72 5f 74 65 6d 70 6c 61  ){.  user_templa
c010: 74 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a  tename = (char *
c020: 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53  ) malloc( lemonS
c030: 74 72 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20  trlen(z)+1 );.  
c040: 69 66 28 20 75 73 65 72 5f 74 65 6d 70 6c 61 74  if( user_templat
c050: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
c060: 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a  memory_error();.
c070: 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63    }.  lemon_strc
c080: 70 79 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65  py(user_template
c090: 6e 61 6d 65 2c 20 7a 29 3b 0a 7d 0a 0a 2f 2a 20  name, z);.}../* 
c0a0: 66 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  forward referenc
c0b0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  e */.static cons
c0c0: 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d 75 6d 5f  t char *minimum_
c0d0: 73 69 7a 65 5f 74 79 70 65 28 69 6e 74 20 6c 77  size_type(int lw
c0e0: 72 2c 20 69 6e 74 20 75 70 72 2c 20 69 6e 74 20  r, int upr, int 
c0f0: 2a 70 6e 42 79 74 65 29 3b 0a 0a 2f 2a 20 50 72  *pnByte);../* Pr
c100: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e  int a single lin
c110: 65 20 6f 66 20 74 68 65 20 22 50 61 72 73 65 72  e of the "Parser
c120: 20 53 74 61 74 73 22 20 6f 75 74 70 75 74 0a 2a   Stats" output.*
c130: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  /.static void st
c140: 61 74 73 5f 6c 69 6e 65 28 63 6f 6e 73 74 20 63  ats_line(const c
c150: 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 69 6e 74  har *zLabel, int
c160: 20 69 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20   iValue){.  int 
c170: 6e 4c 61 62 65 6c 20 3d 20 6c 65 6d 6f 6e 53 74  nLabel = lemonSt
c180: 72 6c 65 6e 28 7a 4c 61 62 65 6c 29 3b 0a 20 20  rlen(zLabel);.  
c190: 70 72 69 6e 74 66 28 22 20 20 25 73 25 2e 2a 73  printf("  %s%.*s
c1a0: 20 25 35 64 5c 6e 22 2c 20 7a 4c 61 62 65 6c 2c   %5d\n", zLabel,
c1b0: 0a 20 20 20 20 20 20 20 20 20 33 35 2d 6e 4c 61  .         35-nLa
c1c0: 62 65 6c 2c 20 22 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  bel, "..........
c1d0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
c1e0: 2e 2e 2e 2e 2e 2e 22 2c 0a 20 20 20 20 20 20 20  ......",.       
c1f0: 20 20 69 56 61 6c 75 65 29 3b 0a 7d 0a 0a 2f 2a    iValue);.}../*
c200: 20 54 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   The main progra
c210: 6d 2e 20 20 50 61 72 73 65 20 74 68 65 20 63 6f  m.  Parse the co
c220: 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e 64 20 64  mmand line and d
c230: 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69 6e 74 20 6d  o it... */.int m
c240: 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  ain(int argc, ch
c250: 61 72 20 2a 2a 61 72 67 76 29 0a 7b 0a 20 20 73  ar **argv).{.  s
c260: 74 61 74 69 63 20 69 6e 74 20 76 65 72 73 69 6f  tatic int versio
c270: 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  n = 0;.  static 
c280: 69 6e 74 20 72 70 66 6c 61 67 20 3d 20 30 3b 0a  int rpflag = 0;.
c290: 20 20 73 74 61 74 69 63 20 69 6e 74 20 62 61 73    static int bas
c2a0: 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74  isflag = 0;.  st
c2b0: 61 74 69 63 20 69 6e 74 20 63 6f 6d 70 72 65 73  atic int compres
c2c0: 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  s = 0;.  static 
c2d0: 69 6e 74 20 71 75 69 65 74 20 3d 20 30 3b 0a 20  int quiet = 0;. 
c2e0: 20 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74   static int stat
c2f0: 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 73 74  istics = 0;.  st
c300: 61 74 69 63 20 69 6e 74 20 6d 68 66 6c 61 67 20  atic int mhflag 
c310: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
c320: 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20  t nolinenosflag 
c330: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
c340: 74 20 6e 6f 52 65 73 6f 72 74 20 3d 20 30 3b 0a  t noResort = 0;.
c350: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
c360: 73 5f 6f 70 74 69 6f 6e 73 20 6f 70 74 69 6f 6e  s_options option
c370: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 4f 50 54  s[] = {.    {OPT
c380: 5f 46 4c 41 47 2c 20 22 62 22 2c 20 28 63 68 61  _FLAG, "b", (cha
c390: 72 2a 29 26 62 61 73 69 73 66 6c 61 67 2c 20 22  r*)&basisflag, "
c3a0: 50 72 69 6e 74 20 6f 6e 6c 79 20 74 68 65 20 62  Print only the b
c3b0: 61 73 69 73 20 69 6e 20 72 65 70 6f 72 74 2e 22  asis in report."
c3c0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
c3d0: 2c 20 22 63 22 2c 20 28 63 68 61 72 2a 29 26 63  , "c", (char*)&c
c3e0: 6f 6d 70 72 65 73 73 2c 20 22 44 6f 6e 27 74 20  ompress, "Don't 
c3f0: 63 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63 74  compress the act
c400: 69 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c 0a 20 20  ion table."},.  
c410: 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 44 22    {OPT_FSTR, "D"
c420: 2c 20 28 63 68 61 72 2a 29 68 61 6e 64 6c 65 5f  , (char*)handle_
c430: 44 5f 6f 70 74 69 6f 6e 2c 20 22 44 65 66 69 6e  D_option, "Defin
c440: 65 20 61 6e 20 25 69 66 64 65 66 20 6d 61 63 72  e an %ifdef macr
c450: 6f 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  o."},.    {OPT_F
c460: 53 54 52 2c 20 22 66 22 2c 20 30 2c 20 22 49 67  STR, "f", 0, "Ig
c470: 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63 65 68 6f  nored.  (Placeho
c480: 6c 64 65 72 20 66 6f 72 20 2d 66 20 63 6f 6d 70  lder for -f comp
c490: 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d  iler options.)"}
c4a0: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
c4b0: 20 22 67 22 2c 20 28 63 68 61 72 2a 29 26 72 70   "g", (char*)&rp
c4c0: 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 67 72 61  flag, "Print gra
c4d0: 6d 6d 61 72 20 77 69 74 68 6f 75 74 20 61 63 74  mmar without act
c4e0: 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  ions."},.    {OP
c4f0: 54 5f 46 53 54 52 2c 20 22 49 22 2c 20 30 2c 20  T_FSTR, "I", 0, 
c500: 22 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63  "Ignored.  (Plac
c510: 65 68 6f 6c 64 65 72 20 66 6f 72 20 27 2d 49 27  eholder for '-I'
c520: 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e   compiler option
c530: 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  s.)"},.    {OPT_
c540: 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63 68 61 72  FLAG, "m", (char
c550: 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f 75 74 70  *)&mhflag, "Outp
c560: 75 74 20 61 20 6d 61 6b 65 68 65 61 64 65 72 73  ut a makeheaders
c570: 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65   compatible file
c580: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  ."},.    {OPT_FL
c590: 41 47 2c 20 22 6c 22 2c 20 28 63 68 61 72 2a 29  AG, "l", (char*)
c5a0: 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 2c 20  &nolinenosflag, 
c5b0: 22 44 6f 20 6e 6f 74 20 70 72 69 6e 74 20 23 6c  "Do not print #l
c5c0: 69 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 22  ine statements."
c5d0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52  },.    {OPT_FSTR
c5e0: 2c 20 22 4f 22 2c 20 30 2c 20 22 49 67 6e 6f 72  , "O", 0, "Ignor
c5f0: 65 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64 65  ed.  (Placeholde
c600: 72 20 66 6f 72 20 27 2d 4f 27 20 63 6f 6d 70 69  r for '-O' compi
c610: 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c  ler options.)"},
c620: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
c630: 22 70 22 2c 20 28 63 68 61 72 2a 29 26 73 68 6f  "p", (char*)&sho
c640: 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c  wPrecedenceConfl
c650: 69 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ict,.           
c660: 20 20 20 20 20 20 20 20 20 22 53 68 6f 77 20 63           "Show c
c670: 6f 6e 66 6c 69 63 74 73 20 72 65 73 6f 6c 76 65  onflicts resolve
c680: 64 20 62 79 20 70 72 65 63 65 64 65 6e 63 65 20  d by precedence 
c690: 72 75 6c 65 73 22 7d 2c 0a 20 20 20 20 7b 4f 50  rules"},.    {OP
c6a0: 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20 28 63 68  T_FLAG, "q", (ch
c6b0: 61 72 2a 29 26 71 75 69 65 74 2c 20 22 28 51 75  ar*)&quiet, "(Qu
c6c0: 69 65 74 29 20 44 6f 6e 27 74 20 70 72 69 6e 74  iet) Don't print
c6d0: 20 74 68 65 20 72 65 70 6f 72 74 20 66 69 6c 65   the report file
c6e0: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  ."},.    {OPT_FL
c6f0: 41 47 2c 20 22 72 22 2c 20 28 63 68 61 72 2a 29  AG, "r", (char*)
c700: 26 6e 6f 52 65 73 6f 72 74 2c 20 22 44 6f 20 6e  &noResort, "Do n
c710: 6f 74 20 73 6f 72 74 20 6f 72 20 72 65 6e 75 6d  ot sort or renum
c720: 62 65 72 20 73 74 61 74 65 73 22 7d 2c 0a 20 20  ber states"},.  
c730: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 73 22    {OPT_FLAG, "s"
c740: 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74 69 73  , (char*)&statis
c750: 74 69 63 73 2c 0a 20 20 20 20 20 20 20 20 20 20  tics,.          
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 20 20 20 20 20 20 20 20 20 22 50 72 69 6e 74 20           "Print 
c780: 70 61 72 73 65 72 20 73 74 61 74 73 20 74 6f 20  parser stats to 
c790: 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e  standard output.
c7a0: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
c7b0: 47 2c 20 22 78 22 2c 20 28 63 68 61 72 2a 29 26  G, "x", (char*)&
c7c0: 76 65 72 73 69 6f 6e 2c 20 22 50 72 69 6e 74 20  version, "Print 
c7d0: 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  the version numb
c7e0: 65 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  er."},.    {OPT_
c7f0: 46 53 54 52 2c 20 22 54 22 2c 20 28 63 68 61 72  FSTR, "T", (char
c800: 2a 29 68 61 6e 64 6c 65 5f 54 5f 6f 70 74 69 6f  *)handle_T_optio
c810: 6e 2c 20 22 53 70 65 63 69 66 79 20 61 20 74 65  n, "Specify a te
c820: 6d 70 6c 61 74 65 20 66 69 6c 65 2e 22 7d 2c 0a  mplate file."},.
c830: 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22      {OPT_FSTR, "
c840: 57 22 2c 20 30 2c 20 22 49 67 6e 6f 72 65 64 2e  W", 0, "Ignored.
c850: 20 20 28 50 6c 61 63 65 68 6f 6c 64 65 72 20 66    (Placeholder f
c860: 6f 72 20 27 2d 57 27 20 63 6f 6d 70 69 6c 65 72  or '-W' compiler
c870: 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20   options.)"},.  
c880: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c 30 2c    {OPT_FLAG,0,0,
c890: 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  0}.  };.  int i;
c8a0: 0a 20 20 69 6e 74 20 65 78 69 74 63 6f 64 65 3b  .  int exitcode;
c8b0: 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
c8c0: 6c 65 6d 3b 0a 0a 20 20 4f 70 74 49 6e 69 74 28  lem;..  OptInit(
c8d0: 61 72 67 76 2c 6f 70 74 69 6f 6e 73 2c 73 74 64  argv,options,std
c8e0: 65 72 72 29 3b 0a 20 20 69 66 28 20 76 65 72 73  err);.  if( vers
c8f0: 69 6f 6e 20 29 7b 0a 20 20 20 20 20 70 72 69 6e  ion ){.     prin
c900: 74 66 28 22 4c 65 6d 6f 6e 20 76 65 72 73 69 6f  tf("Lemon versio
c910: 6e 20 31 2e 30 5c 6e 22 29 3b 0a 20 20 20 20 20  n 1.0\n");.     
c920: 65 78 69 74 28 30 29 3b 20 0a 20 20 7d 0a 20 20  exit(0); .  }.  
c930: 69 66 28 20 4f 70 74 4e 41 72 67 73 28 29 21 3d  if( OptNArgs()!=
c940: 31 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  1 ){.    fprintf
c950: 28 73 74 64 65 72 72 2c 22 45 78 61 63 74 6c 79  (stderr,"Exactly
c960: 20 6f 6e 65 20 66 69 6c 65 6e 61 6d 65 20 61 72   one filename ar
c970: 67 75 6d 65 6e 74 20 69 73 20 72 65 71 75 69 72  gument is requir
c980: 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ed.\n");.    exi
c990: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  t(1);.  }.  mems
c9a0: 65 74 28 26 6c 65 6d 2c 20 30 2c 20 73 69 7a 65  et(&lem, 0, size
c9b0: 6f 66 28 6c 65 6d 29 29 3b 0a 20 20 6c 65 6d 2e  of(lem));.  lem.
c9c0: 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 0a 20  errorcnt = 0;.. 
c9d0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
c9e0: 68 65 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  he machine */.  
c9f0: 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29 3b 0a  Strsafe_init();.
ca00: 20 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 3b    Symbol_init();
ca10: 0a 20 20 53 74 61 74 65 5f 69 6e 69 74 28 29 3b  .  State_init();
ca20: 0a 20 20 6c 65 6d 2e 61 72 67 76 30 20 3d 20 61  .  lem.argv0 = a
ca30: 72 67 76 5b 30 5d 3b 0a 20 20 6c 65 6d 2e 66 69  rgv[0];.  lem.fi
ca40: 6c 65 6e 61 6d 65 20 3d 20 4f 70 74 41 72 67 28  lename = OptArg(
ca50: 30 29 3b 0a 20 20 6c 65 6d 2e 62 61 73 69 73 66  0);.  lem.basisf
ca60: 6c 61 67 20 3d 20 62 61 73 69 73 66 6c 61 67 3b  lag = basisflag;
ca70: 0a 20 20 6c 65 6d 2e 6e 6f 6c 69 6e 65 6e 6f 73  .  lem.nolinenos
ca80: 66 6c 61 67 20 3d 20 6e 6f 6c 69 6e 65 6e 6f 73  flag = nolinenos
ca90: 66 6c 61 67 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e  flag;.  Symbol_n
caa0: 65 77 28 22 24 22 29 3b 0a 20 20 6c 65 6d 2e 65  ew("$");.  lem.e
cab0: 72 72 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e  rrsym = Symbol_n
cac0: 65 77 28 22 65 72 72 6f 72 22 29 3b 0a 20 20 6c  ew("error");.  l
cad0: 65 6d 2e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e  em.errsym->useCn
cae0: 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 61 72  t = 0;..  /* Par
caf0: 73 65 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  se the input fil
cb00: 65 20 2a 2f 0a 20 20 50 61 72 73 65 28 26 6c 65  e */.  Parse(&le
cb10: 6d 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 65 72  m);.  if( lem.er
cb20: 72 6f 72 63 6e 74 20 29 20 65 78 69 74 28 6c 65  rorcnt ) exit(le
cb30: 6d 2e 65 72 72 6f 72 63 6e 74 29 3b 0a 20 20 69  m.errorcnt);.  i
cb40: 66 28 20 6c 65 6d 2e 6e 72 75 6c 65 3d 3d 30 20  f( lem.nrule==0 
cb50: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
cb60: 74 64 65 72 72 2c 22 45 6d 70 74 79 20 67 72 61  tderr,"Empty gra
cb70: 6d 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  mmar.\n");.    e
cb80: 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  xit(1);.  }..  /
cb90: 2a 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e 64 65  * Count and inde
cba0: 78 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 6f 66  x the symbols of
cbb0: 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a   the grammar */.
cbc0: 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64    Symbol_new("{d
cbd0: 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c 65 6d  efault}");.  lem
cbe0: 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53 79 6d 62 6f  .nsymbol = Symbo
cbf0: 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 6c 65 6d  l_count();.  lem
cc00: 2e 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d 62 6f  .symbols = Symbo
cc10: 6c 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20 20 66  l_arrayof();.  f
cc20: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 2e 6e 73  or(i=0; i<lem.ns
cc30: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e  ymbol; i++) lem.
cc40: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65  symbols[i]->inde
cc50: 78 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74 28 6c  x = i;.  qsort(l
cc60: 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65 6d 2e 6e  em.symbols,lem.n
cc70: 73 79 6d 62 6f 6c 2c 73 69 7a 65 6f 66 28 73 74  symbol,sizeof(st
cc80: 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2c 20 53  ruct symbol*), S
cc90: 79 6d 62 6f 6c 63 6d 70 70 29 3b 0a 20 20 66 6f  ymbolcmpp);.  fo
cca0: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 2e 6e 73 79  r(i=0; i<lem.nsy
ccb0: 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e 73  mbol; i++) lem.s
ccc0: 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65 78  ymbols[i]->index
ccd0: 20 3d 20 69 3b 0a 20 20 77 68 69 6c 65 28 20 6c   = i;.  while( l
cce0: 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 2d 31 5d 2d  em.symbols[i-1]-
ccf0: 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
cd00: 49 4e 41 4c 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  INAL ){ i--; }. 
cd10: 20 61 73 73 65 72 74 28 20 73 74 72 63 6d 70 28   assert( strcmp(
cd20: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 2d 31 5d  lem.symbols[i-1]
cd30: 2d 3e 6e 61 6d 65 2c 22 7b 64 65 66 61 75 6c 74  ->name,"{default
cd40: 7d 22 29 3d 3d 30 20 29 3b 0a 20 20 6c 65 6d 2e  }")==0 );.  lem.
cd50: 6e 73 79 6d 62 6f 6c 20 3d 20 69 20 2d 20 31 3b  nsymbol = i - 1;
cd60: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 49 53 55 50  .  for(i=1; ISUP
cd70: 50 45 52 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b  PER(lem.symbols[
cd80: 69 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b 20 69 2b  i]->name[0]); i+
cd90: 2b 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65 72 6d 69  +);.  lem.ntermi
cda0: 6e 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 47  nal = i;..  /* G
cdb0: 65 6e 65 72 61 74 65 20 61 20 72 65 70 72 69 6e  enerate a reprin
cdc0: 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72  t of the grammar
cdd0: 2c 20 69 66 20 72 65 71 75 65 73 74 65 64 20 6f  , if requested o
cde0: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
cdf0: 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c  ne */.  if( rpfl
ce00: 61 67 20 29 7b 0a 20 20 20 20 52 65 70 72 69 6e  ag ){.    Reprin
ce10: 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65  t(&lem);.  }else
ce20: 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
ce30: 69 7a 65 20 74 68 65 20 73 69 7a 65 20 66 6f 72  ize the size for
ce40: 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20   all follow and 
ce50: 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20  first sets */.  
ce60: 20 20 53 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74    SetSize(lem.nt
ce70: 65 72 6d 69 6e 61 6c 2b 31 29 3b 0a 0a 20 20 20  erminal+1);..   
ce80: 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 70 72 65   /* Find the pre
ce90: 63 65 64 65 6e 63 65 20 66 6f 72 20 65 76 65 72  cedence for ever
cea0: 79 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c  y production rul
ceb0: 65 20 28 74 68 61 74 20 68 61 73 20 6f 6e 65 29  e (that has one)
cec0: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 52 75 6c 65   */.    FindRule
ced0: 50 72 65 63 65 64 65 6e 63 65 73 28 26 6c 65 6d  Precedences(&lem
cee0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  );..    /* Compu
cef0: 74 65 20 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f  te the lambda-no
cf00: 6e 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74  nterminals and t
cf10: 68 65 20 66 69 72 73 74 2d 73 65 74 73 20 66 6f  he first-sets fo
cf20: 72 20 65 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e  r every.    ** n
cf30: 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20  onterminal */.  
cf40: 20 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28    FindFirstSets(
cf50: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
cf60: 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29  ompute all LR(0)
cf70: 20 73 74 61 74 65 73 2e 20 20 41 6c 73 6f 20 72   states.  Also r
cf80: 65 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74  ecord follow-set
cf90: 20 70 72 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20   propagation.   
cfa0: 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61   ** links so tha
cfb0: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74  t the follow-set
cfc0: 20 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64   can be computed
cfd0: 20 6c 61 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65   later */.    le
cfe0: 6d 2e 6e 73 74 61 74 65 20 3d 20 30 3b 0a 20 20  m.nstate = 0;.  
cff0: 20 20 46 69 6e 64 53 74 61 74 65 73 28 26 6c 65    FindStates(&le
d000: 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74  m);.    lem.sort
d010: 65 64 20 3d 20 53 74 61 74 65 5f 61 72 72 61 79  ed = State_array
d020: 6f 66 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69  of();..    /* Ti
d030: 65 20 75 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20  e up loose ends 
d040: 6f 6e 20 74 68 65 20 70 72 6f 70 61 67 61 74 69  on the propagati
d050: 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20  on links */.    
d060: 46 69 6e 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b  FindLinks(&lem);
d070: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
d080: 20 74 68 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20   the follow set 
d090: 6f 66 20 65 76 65 72 79 20 72 65 64 75 63 69 62  of every reducib
d0a0: 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  le configuration
d0b0: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c   */.    FindFoll
d0c0: 6f 77 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20  owSets(&lem);.. 
d0d0: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
d0e0: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20  e action tables 
d0f0: 2a 2f 0a 20 20 20 20 46 69 6e 64 41 63 74 69 6f  */.    FindActio
d100: 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  ns(&lem);..    /
d110: 2a 20 43 6f 6d 70 72 65 73 73 20 74 68 65 20 61  * Compress the a
d120: 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a  ction tables */.
d130: 20 20 20 20 69 66 28 20 63 6f 6d 70 72 65 73 73      if( compress
d140: 3d 3d 30 20 29 20 43 6f 6d 70 72 65 73 73 54 61  ==0 ) CompressTa
d150: 62 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  bles(&lem);..   
d160: 20 2f 2a 20 52 65 6f 72 64 65 72 20 61 6e 64 20   /* Reorder and 
d170: 72 65 6e 75 6d 62 65 72 20 74 68 65 20 73 74 61  renumber the sta
d180: 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61 74  tes so that stat
d190: 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63 68  es with fewer ch
d1a0: 6f 69 63 65 73 0a 20 20 20 20 2a 2a 20 6f 63 63  oices.    ** occ
d1b0: 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ur at the end.  
d1c0: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
d1d0: 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 68 65 6c  ization that hel
d1e0: 70 73 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20  ps make the.    
d1f0: 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 70 61 72  ** generated par
d200: 73 65 72 20 74 61 62 6c 65 73 20 73 6d 61 6c 6c  ser tables small
d210: 65 72 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  er. */.    if( n
d220: 6f 52 65 73 6f 72 74 3d 3d 30 20 29 20 52 65 73  oResort==0 ) Res
d230: 6f 72 74 53 74 61 74 65 73 28 26 6c 65 6d 29 3b  ortStates(&lem);
d240: 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
d250: 65 20 61 20 72 65 70 6f 72 74 20 6f 66 20 74 68  e a report of th
d260: 65 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  e parser generat
d270: 65 64 2e 20 20 28 74 68 65 20 22 79 2e 6f 75 74  ed.  (the "y.out
d280: 70 75 74 22 20 66 69 6c 65 29 20 2a 2f 0a 20 20  put" file) */.  
d290: 20 20 69 66 28 20 21 71 75 69 65 74 20 29 20 52    if( !quiet ) R
d2a0: 65 70 6f 72 74 4f 75 74 70 75 74 28 26 6c 65 6d  eportOutput(&lem
d2b0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  );..    /* Gener
d2c0: 61 74 65 20 74 68 65 20 73 6f 75 72 63 65 20 63  ate the source c
d2d0: 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ode for the pars
d2e0: 65 72 20 2a 2f 0a 20 20 20 20 52 65 70 6f 72 74  er */.    Report
d2f0: 54 61 62 6c 65 28 26 6c 65 6d 2c 20 6d 68 66 6c  Table(&lem, mhfl
d300: 61 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  ag);..    /* Pro
d310: 64 75 63 65 20 61 20 68 65 61 64 65 72 20 66 69  duce a header fi
d320: 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  le for use by th
d330: 65 20 73 63 61 6e 6e 65 72 2e 20 20 28 54 68 69  e scanner.  (Thi
d340: 73 20 73 74 65 70 20 69 73 0a 20 20 20 20 2a 2a  s step is.    **
d350: 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 20   omitted if the 
d360: 22 2d 6d 22 20 6f 70 74 69 6f 6e 20 69 73 20 75  "-m" option is u
d370: 73 65 64 20 62 65 63 61 75 73 65 20 6d 61 6b 65  sed because make
d380: 68 65 61 64 65 72 73 20 77 69 6c 6c 0a 20 20 20  headers will.   
d390: 20 2a 2a 20 67 65 6e 65 72 61 74 65 20 74 68 65   ** generate the
d3a0: 20 66 69 6c 65 20 66 6f 72 20 75 73 2e 29 20 2a   file for us.) *
d3b0: 2f 0a 20 20 20 20 69 66 28 20 21 6d 68 66 6c 61  /.    if( !mhfla
d3c0: 67 20 29 20 52 65 70 6f 72 74 48 65 61 64 65 72  g ) ReportHeader
d3d0: 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66  (&lem);.  }.  if
d3e0: 28 20 73 74 61 74 69 73 74 69 63 73 20 29 7b 0a  ( statistics ){.
d3f0: 20 20 20 20 70 72 69 6e 74 66 28 22 50 61 72 73      printf("Pars
d400: 65 72 20 73 74 61 74 69 73 74 69 63 73 3a 5c 6e  er statistics:\n
d410: 22 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69  ");.    stats_li
d420: 6e 65 28 22 74 65 72 6d 69 6e 61 6c 20 73 79 6d  ne("terminal sym
d430: 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e 74 65 72 6d  bols", lem.nterm
d440: 69 6e 61 6c 29 3b 0a 20 20 20 20 73 74 61 74 73  inal);.    stats
d450: 5f 6c 69 6e 65 28 22 6e 6f 6e 2d 74 65 72 6d 69  _line("non-termi
d460: 6e 61 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c 65  nal symbols", le
d470: 6d 2e 6e 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d 2e  m.nsymbol - lem.
d480: 6e 74 65 72 6d 69 6e 61 6c 29 3b 0a 20 20 20 20  nterminal);.    
d490: 73 74 61 74 73 5f 6c 69 6e 65 28 22 74 6f 74 61  stats_line("tota
d4a0: 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e  l symbols", lem.
d4b0: 6e 73 79 6d 62 6f 6c 29 3b 0a 20 20 20 20 73 74  nsymbol);.    st
d4c0: 61 74 73 5f 6c 69 6e 65 28 22 72 75 6c 65 73 22  ats_line("rules"
d4d0: 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20  , lem.nrule);.  
d4e0: 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 73 74    stats_line("st
d4f0: 61 74 65 73 22 2c 20 6c 65 6d 2e 6e 78 73 74 61  ates", lem.nxsta
d500: 74 65 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c  te);.    stats_l
d510: 69 6e 65 28 22 63 6f 6e 66 6c 69 63 74 73 22 2c  ine("conflicts",
d520: 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b   lem.nconflict);
d530: 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28  .    stats_line(
d540: 22 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 65 6e  "action table en
d550: 74 72 69 65 73 22 2c 20 6c 65 6d 2e 6e 61 63 74  tries", lem.nact
d560: 69 6f 6e 74 61 62 29 3b 0a 20 20 20 20 73 74 61  iontab);.    sta
d570: 74 73 5f 6c 69 6e 65 28 22 74 6f 74 61 6c 20 74  ts_line("total t
d580: 61 62 6c 65 20 73 69 7a 65 20 28 62 79 74 65 73  able size (bytes
d590: 29 22 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a  )", lem.tablesiz
d5a0: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65  e);.  }.  if( le
d5b0: 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e 20 30 20  m.nconflict > 0 
d5c0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
d5d0: 74 64 65 72 72 2c 22 25 64 20 70 61 72 73 69 6e  tderr,"%d parsin
d5e0: 67 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c  g conflicts.\n",
d5f0: 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a  lem.nconflict);.
d600: 20 20 7d 0a 0a 20 20 2f 2a 20 72 65 74 75 72 6e    }..  /* return
d610: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 31   0 on success, 1
d620: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 2a 2f 0a   on failure. */.
d630: 20 20 65 78 69 74 63 6f 64 65 20 3d 20 28 28 6c    exitcode = ((l
d640: 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3e 20 30 29  em.errorcnt > 0)
d650: 20 7c 7c 20 28 6c 65 6d 2e 6e 63 6f 6e 66 6c 69   || (lem.nconfli
d660: 63 74 20 3e 20 30 29 29 20 3f 20 31 20 3a 20 30  ct > 0)) ? 1 : 0
d670: 3b 0a 20 20 65 78 69 74 28 65 78 69 74 63 6f 64  ;.  exit(exitcod
d680: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 65 78  e);.  return (ex
d690: 69 74 63 6f 64 65 29 3b 0a 7d 0a 2f 2a 2a 2a 2a  itcode);.}./****
d6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6b0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
d6c0: 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  msort.c" *******
d6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
d6f0: 41 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65 2d  A generic merge-
d700: 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a  sort program..**
d710: 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c 65  .** USAGE:.** Le
d720: 74 20 22 70 74 72 22 20 62 65 20 61 20 70 6f 69  t "ptr" be a poi
d730: 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74 72  nter to some str
d740: 75 63 74 75 72 65 20 77 68 69 63 68 20 69 73 20  ucture which is 
d750: 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a 2a  at the head of.*
d760: 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61  * a null-termina
d770: 74 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e 20  ted list.  Then 
d780: 74 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73 74  to sort the list
d790: 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   call:.**.**    
d7a0: 20 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74 72   ptr = msort(ptr
d7b0: 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63 6d  ,&(ptr->next),cm
d7c0: 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20  pfnc);.**.** In 
d7d0: 74 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70 66  the above, "cmpf
d7e0: 6e 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72  nc" is a pointer
d7f0: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 77   to a function w
d800: 68 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a 2a  hich compares.**
d810: 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f   two instances o
d820: 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
d830: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20 69  and returns an i
d840: 6e 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a 2a  nteger, as in.**
d850: 20 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73 65   strcmp.  The se
d860: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
d870: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
d880: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
d890: 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  .** second eleme
d8a0: 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64  nt of the linked
d8b0: 20 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64 64   list.  This add
d8c0: 72 65 73 73 20 69 73 20 75 73 65 64 20 74 6f 20  ress is used to 
d8d0: 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 6f  compute.** the o
d8e0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e 65  ffset to the "ne
d8f0: 78 74 22 20 66 69 65 6c 64 20 77 69 74 68 69 6e  xt" field within
d900: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
d910: 20 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a 2a   The offset to.*
d920: 2a 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65  * the "next" fie
d930: 6c 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  ld must be const
d940: 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72 75  ant for all stru
d950: 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c 69  ctures in the li
d960: 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75  st..**.** The fu
d970: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
d980: 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68 69   new pointer whi
d990: 63 68 20 69 73 20 74 68 65 20 68 65 61 64 20 6f  ch is the head o
d9a0: 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61 66  f the list.** af
d9b0: 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a  ter sorting..**.
d9c0: 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a  ** ALGORITHM:.**
d9d0: 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a   Merge-sort..*/.
d9e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
d9f0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
da00: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 69 6e  ext structure in
da10: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
da20: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45 58  ..*/.#define NEX
da30: 54 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29 28  T(A) (*(char**)(
da40: 28 28 63 68 61 72 2a 29 41 29 2b 6f 66 66 73 65  ((char*)A)+offse
da50: 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74  t))../*.** Input
da60: 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20 20  s:.**   a:      
da70: 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d   A sorted, null-
da80: 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65  terminated linke
da90: 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65  d list.  (May be
daa0: 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a 20   null)..**   b: 
dab0: 20 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c 20        A sorted, 
dac0: 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20  null-terminated 
dad0: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d  linked list.  (M
dae0: 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20  ay be null)..** 
daf0: 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70 6f 69    cmp:     A poi
db00: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6d 70  nter to the comp
db10: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  arison function.
db20: 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20 20 4f  .**   offset:  O
db30: 66 66 73 65 74 20 69 6e 20 74 68 65 20 73 74 72  ffset in the str
db40: 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 22 6e  ucture to the "n
db50: 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a  ext" field..**.*
db60: 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a  * Return Value:.
db70: 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74  **   A pointer t
db80: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61 20  o the head of a 
db90: 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e 74  sorted list cont
dba0: 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d 65  aining the eleme
dbb0: 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74 68  nts.**   of both
dbc0: 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a 20   a and b..**.** 
dbd0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a  Side effects:.**
dbe0: 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70 6f     The "next" po
dbf0: 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d 65  inters for eleme
dc00: 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74 73  nts in the lists
dc10: 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a 20   a and b are.** 
dc20: 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74    changed..*/.st
dc30: 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72 67 65  atic char *merge
dc40: 28 0a 20 20 63 68 61 72 20 2a 61 2c 0a 20 20 63  (.  char *a,.  c
dc50: 68 61 72 20 2a 62 2c 0a 20 20 69 6e 74 20 28 2a  har *b,.  int (*
dc60: 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  cmp)(const char*
dc70: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 0a 20  ,const char*),. 
dc80: 20 69 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a 20   int offset.){. 
dc90: 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68 65 61   char *ptr, *hea
dca0: 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20 29  d;..  if( a==0 )
dcb0: 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62 3b 0a  {.    head = b;.
dcc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d 30    }else if( b==0
dcd0: 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 61   ){.    head = a
dce0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
dcf0: 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c 3d  f( (*cmp)(a,b)<=
dd00: 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20 3d  0 ){.      ptr =
dd10: 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e 45   a;.      a = NE
dd20: 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65  XT(a);.    }else
dd30: 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b  {.      ptr = b;
dd40: 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28  .      b = NEXT(
dd50: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 65  b);.    }.    he
dd60: 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77 68  ad = ptr;.    wh
dd70: 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a 20  ile( a && b ){. 
dd80: 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29 28       if( (*cmp)(
dd90: 61 2c 62 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20  a,b)<=0 ){.     
dda0: 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61     NEXT(ptr) = a
ddb0: 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d 20  ;.        ptr = 
ddc0: 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 4e  a;.        a = N
ddd0: 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d 65  EXT(a);.      }e
dde0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45 58  lse{.        NEX
ddf0: 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20 20  T(ptr) = b;.    
de00: 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20      ptr = b;.   
de10: 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29       b = NEXT(b)
de20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
de30: 20 20 20 20 69 66 28 20 61 20 29 20 4e 45 58 54      if( a ) NEXT
de40: 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 65  (ptr) = a;.    e
de50: 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74 72 29  lse    NEXT(ptr)
de60: 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = b;.  }.  retu
de70: 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn head;.}../*.*
de80: 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c  * Inputs:.**   l
de90: 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65  ist:      Pointe
dea0: 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69  r to a singly-li
deb0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74 72  nked list of str
dec0: 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65  uctures..**   ne
ded0: 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72  xt:      Pointer
dee0: 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20 74   to pointer to t
def0: 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  he second elemen
df00: 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a  t of the list..*
df10: 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20 41  *   cmp:       A
df20: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
df30: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tion..**.** Retu
df40: 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41  rn Value:.**   A
df50: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
df60: 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64  head of a sorted
df70: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
df80: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a   the elements.**
df90: 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20     orginally in 
dfa0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65  list..**.** Side
dfb0: 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54   effects:.**   T
dfc0: 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65  he "next" pointe
dfd0: 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20  rs for elements 
dfe0: 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61 6e  in list are chan
dff0: 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ged..*/.#define 
e000: 4c 49 53 54 53 49 5a 45 20 33 30 0a 73 74 61 74  LISTSIZE 30.stat
e010: 69 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 0a  ic char *msort(.
e020: 20 20 63 68 61 72 20 2a 6c 69 73 74 2c 0a 20 20    char *list,.  
e030: 63 68 61 72 20 2a 2a 6e 65 78 74 2c 0a 20 20 69  char **next,.  i
e040: 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20  nt (*cmp)(const 
e050: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
e060: 2a 29 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  *).){.  unsigned
e070: 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20 20   long offset;.  
e080: 63 68 61 72 20 2a 65 70 3b 0a 20 20 63 68 61 72  char *ep;.  char
e090: 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d 3b   *set[LISTSIZE];
e0a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66 73  .  int i;.  offs
e0b0: 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  et = (unsigned l
e0c0: 6f 6e 67 29 28 28 63 68 61 72 2a 29 6e 65 78 74  ong)((char*)next
e0d0: 20 2d 20 28 63 68 61 72 2a 29 6c 69 73 74 29 3b   - (char*)list);
e0e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49  .  for(i=0; i<LI
e0f0: 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65 74  STSIZE; i++) set
e100: 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  [i] = 0;.  while
e110: 28 20 6c 69 73 74 20 29 7b 0a 20 20 20 20 65 70  ( list ){.    ep
e120: 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69 73   = list;.    lis
e130: 74 20 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b 0a  t = NEXT(list);.
e140: 20 20 20 20 4e 45 58 54 28 65 70 29 20 3d 20 30      NEXT(ep) = 0
e150: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
e160: 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26 26 20 73  <LISTSIZE-1 && s
e170: 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a  et[i]!=0; i++){.
e180: 20 20 20 20 20 20 65 70 20 3d 20 6d 65 72 67 65        ep = merge
e190: 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f  (ep,set[i],cmp,o
e1a0: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 65  ffset);.      se
e1b0: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
e1c0: 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 65 70 3b      set[i] = ep;
e1d0: 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a 20  .  }.  ep = 0;. 
e1e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54   for(i=0; i<LIST
e1f0: 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20 73  SIZE; i++) if( s
e200: 65 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65 72  et[i] ) ep = mer
e210: 67 65 28 73 65 74 5b 69 5d 2c 65 70 2c 63 6d 70  ge(set[i],ep,cmp
e220: 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74 75  ,offset);.  retu
e230: 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  rn ep;.}./******
e240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e250: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
e260: 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a   "option.c" ****
e270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e280: 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 63  ******/.static c
e290: 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61 74  har **argv;.stat
e2a0: 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69  ic struct s_opti
e2b0: 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63 20  ons *op;.static 
e2c0: 46 49 4c 45 20 2a 65 72 72 73 74 72 65 61 6d 3b  FILE *errstream;
e2d0: 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f 50 54 28  ..#define ISOPT(
e2e0: 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c  X) ((X)[0]=='-'|
e2f0: 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74  |(X)[0]=='+'||st
e300: 72 63 68 72 28 28 58 29 2c 27 3d 27 29 21 3d 30  rchr((X),'=')!=0
e310: 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  )../*.** Print t
e320: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
e330: 77 69 74 68 20 61 20 63 61 72 72 6f 74 20 70 6f  with a carrot po
e340: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6b 2d  inting to the k-
e350: 74 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  th character.** 
e360: 6f 66 20 74 68 65 20 6e 2d 74 68 20 66 69 65 6c  of the n-th fiel
e370: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
e380: 64 20 65 72 72 6c 69 6e 65 28 69 6e 74 20 6e 2c  d errline(int n,
e390: 20 69 6e 74 20 6b 2c 20 46 49 4c 45 20 2a 65 72   int k, FILE *er
e3a0: 72 29 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e 74  r).{.  int spcnt
e3b0: 2c 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76 5b  , i;.  if( argv[
e3c0: 30 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72 72  0] ) fprintf(err
e3d0: 2c 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b 0a  ,"%s",argv[0]);.
e3e0: 20 20 73 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e 53    spcnt = lemonS
e3f0: 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20 2b  trlen(argv[0]) +
e400: 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   1;.  for(i=1; i
e410: 3c 6e 20 26 26 20 61 72 67 76 5b 69 5d 3b 20 69  <n && argv[i]; i
e420: 2b 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  ++){.    fprintf
e430: 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b  (err," %s",argv[
e440: 69 5d 29 3b 0a 20 20 20 20 73 70 63 6e 74 20 2b  i]);.    spcnt +
e450: 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72  = lemonStrlen(ar
e460: 67 76 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20  gv[i])+1;.  }.  
e470: 73 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f  spcnt += k;.  fo
e480: 72 28 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b  r(; argv[i]; i++
e490: 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 20  ) fprintf(err," 
e4a0: 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20  %s",argv[i]);.  
e4b0: 69 66 28 20 73 70 63 6e 74 3c 32 30 20 29 7b 0a  if( spcnt<20 ){.
e4c0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
e4d0: 22 5c 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e  "\n%*s^-- here\n
e4e0: 22 2c 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20 7d  ",spcnt,"");.  }
e4f0: 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74  else{.    fprint
e500: 66 28 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72 65  f(err,"\n%*shere
e510: 20 2d 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c   --^\n",spcnt-7,
e520: 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  "");.  }.}../*.*
e530: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
e540: 65 78 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 6e  ex of the N-th n
e550: 6f 6e 2d 73 77 69 74 63 68 20 61 72 67 75 6d 65  on-switch argume
e560: 6e 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a  nt.  Return -1.*
e570: 2a 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66  * if N is out of
e580: 20 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   range..*/.stati
e590: 63 20 69 6e 74 20 61 72 67 69 6e 64 65 78 28 69  c int argindex(i
e5a0: 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  nt n).{.  int i;
e5b0: 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68 20  .  int dashdash 
e5c0: 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76 21  = 0;.  if( argv!
e5d0: 3d 30 20 26 26 20 2a 61 72 67 76 21 3d 30 20 29  =0 && *argv!=0 )
e5e0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  {.    for(i=1; a
e5f0: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
e600: 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73 68      if( dashdash
e610: 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b   || !ISOPT(argv[
e620: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
e630: 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( n==0 ) return
e640: 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b   i;.        n--;
e650: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e660: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69  f( strcmp(argv[i
e670: 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73  ],"--")==0 ) das
e680: 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d  hdash = 1;.    }
e690: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
e6a0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72  ;.}..static char
e6b0: 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61   emsg[] = "Comma
e6c0: 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20 65  nd line syntax e
e6d0: 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20  rror: ";../*.** 
e6e0: 50 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20 63  Process a flag c
e6f0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67 75  ommand line argu
e700: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
e710: 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73 28  int handleflags(
e720: 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72 72  int i, FILE *err
e730: 29 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20 69  ).{.  int v;.  i
e740: 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20  nt errcnt = 0;. 
e750: 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d   int j;.  for(j=
e760: 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20  0; op[j].label; 
e770: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  j++){.    if( st
e780: 72 6e 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b 31  rncmp(&argv[i][1
e790: 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c 65  ],op[j].label,le
e7a0: 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d 2e  monStrlen(op[j].
e7b0: 6c 61 62 65 6c 29 29 3d 3d 30 20 29 20 62 72 65  label))==0 ) bre
e7c0: 61 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61 72  ak;.  }.  v = ar
e7d0: 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20  gv[i][0]=='-' ? 
e7e0: 31 20 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70 5b  1 : 0;.  if( op[
e7f0: 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20  j].label==0 ){. 
e800: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
e810: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
e820: 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74  "%sundefined opt
e830: 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  ion.\n",emsg);. 
e840: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31       errline(i,1
e850: 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ,err);.    }.   
e860: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c   errcnt++;.  }el
e870: 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 61 72 67  se if( op[j].arg
e880: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 67  ==0 ){.    /* Ig
e890: 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e  nore this option
e8a0: 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
e8b0: 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f  op[j].type==OPT_
e8c0: 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a 28 28 69  FLAG ){.    *((i
e8d0: 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d  nt*)op[j].arg) =
e8e0: 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   v;.  }else if( 
e8f0: 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f  op[j].type==OPT_
e900: 46 46 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a 28  FFLAG ){.    (*(
e910: 76 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f 70  void(*)(int))(op
e920: 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20 20  [j].arg))(v);.  
e930: 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e  }else if( op[j].
e940: 74 79 70 65 3d 3d 4f 50 54 5f 46 53 54 52 20 29  type==OPT_FSTR )
e950: 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29  {.    (*(void(*)
e960: 28 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e  (char *))(op[j].
e970: 61 72 67 29 29 28 26 61 72 67 76 5b 69 5d 5b 32  arg))(&argv[i][2
e980: 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
e990: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
e9a0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
e9b0: 73 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e  smissing argumen
e9c0: 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c 6e 22 2c  t on switch.\n",
e9d0: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72  emsg);.      err
e9e0: 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20  line(i,1,err);. 
e9f0: 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b     }.    errcnt+
ea00: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
ea10: 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  errcnt;.}../*.**
ea20: 20 50 72 6f 63 65 73 73 20 61 20 63 6f 6d 6d 61   Process a comma
ea30: 6e 64 20 6c 69 6e 65 20 73 77 69 74 63 68 20 77  nd line switch w
ea40: 68 69 63 68 20 68 61 73 20 61 6e 20 61 72 67 75  hich has an argu
ea50: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
ea60: 69 6e 74 20 68 61 6e 64 6c 65 73 77 69 74 63 68  int handleswitch
ea70: 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72  (int i, FILE *er
ea80: 72 29 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d 20  r).{.  int lv = 
ea90: 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64 76 20 3d  0;.  double dv =
eaa0: 20 30 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73 76   0.0;.  char *sv
eab0: 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63 68   = 0, *end;.  ch
eac0: 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a 3b  ar *cp;.  int j;
ead0: 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20  .  int errcnt = 
eae0: 30 3b 0a 20 20 63 70 20 3d 20 73 74 72 63 68 72  0;.  cp = strchr
eaf0: 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20  (argv[i],'=');. 
eb00: 20 61 73 73 65 72 74 28 20 63 70 21 3d 30 20 29   assert( cp!=0 )
eb10: 3b 0a 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 66  ;.  *cp = 0;.  f
eb20: 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61  or(j=0; op[j].la
eb30: 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  bel; j++){.    i
eb40: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69  f( strcmp(argv[i
eb50: 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d  ],op[j].label)==
eb60: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  0 ) break;.  }. 
eb70: 20 2a 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69 66   *cp = '=';.  if
eb80: 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30  ( op[j].label==0
eb90: 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20   ){.    if( err 
eba0: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
ebb0: 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e 65  (err,"%sundefine
ebc0: 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73  d option.\n",ems
ebd0: 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e  g);.      errlin
ebe0: 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20  e(i,0,err);.    
ebf0: 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a  }.    errcnt++;.
ec00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70 2b    }else{.    cp+
ec10: 2b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  +;.    switch( o
ec20: 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20  p[j].type ){.   
ec30: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47     case OPT_FLAG
ec40: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
ec50: 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20  _FFLAG:.        
ec60: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
ec70: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
ec80: 2c 22 25 73 6f 70 74 69 6f 6e 20 72 65 71 75 69  ,"%soption requi
ec90: 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e  res an argument.
eca0: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
ecb0: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 30       errline(i,0
ecc0: 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ,err);.        }
ecd0: 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b  .        errcnt+
ece0: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
ecf0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
ed00: 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  _DBL:.      case
ed10: 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
ed20: 20 20 20 64 76 20 3d 20 73 74 72 74 6f 64 28 63     dv = strtod(c
ed30: 70 2c 26 65 6e 64 29 3b 0a 20 20 20 20 20 20 20  p,&end);.       
ed40: 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20   if( *end ){.   
ed50: 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29         if( err )
ed60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  {.            fp
ed70: 72 69 6e 74 66 28 65 72 72 2c 0a 20 20 20 20 20  rintf(err,.     
ed80: 20 20 20 20 20 20 20 20 20 20 22 25 73 69 6c 6c            "%sill
ed90: 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 69  egal character i
eda0: 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74  n floating-point
edb0: 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d   argument.\n",em
edc0: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sg);.           
edd0: 20 65 72 72 6c 69 6e 65 28 69 2c 28 69 6e 74 29   errline(i,(int)
ede0: 28 28 63 68 61 72 2a 29 65 6e 64 2d 28 63 68 61  ((char*)end-(cha
edf0: 72 2a 29 61 72 67 76 5b 69 5d 29 2c 65 72 72 29  r*)argv[i]),err)
ee00: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ee10: 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b          errcnt++
ee20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ee30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ee40: 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
ee50: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
ee60: 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 76 20 3d  NT:.        lv =
ee70: 20 73 74 72 74 6f 6c 28 63 70 2c 26 65 6e 64 2c   strtol(cp,&end,
ee80: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
ee90: 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  *end ){.        
eea0: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
eeb0: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
eec0: 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20  (err,"%sillegal 
eed0: 63 68 61 72 61 63 74 65 72 20 69 6e 20 69 6e 74  character in int
eee0: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 5c 6e  eger argument.\n
eef0: 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  ",emsg);.       
ef00: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 28       errline(i,(
ef10: 69 6e 74 29 28 28 63 68 61 72 2a 29 65 6e 64 2d  int)((char*)end-
ef20: 28 63 68 61 72 2a 29 61 72 67 76 5b 69 5d 29 2c  (char*)argv[i]),
ef30: 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  err);.          
ef40: 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 63  }.          errc
ef50: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nt++;.        }.
ef60: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ef70: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54       case OPT_ST
ef80: 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  R:.      case OP
ef90: 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20  T_FSTR:.        
efa0: 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 20  sv = cp;.       
efb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
efc0: 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e    switch( op[j].
efd0: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
efe0: 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20  se OPT_FLAG:.   
eff0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41     case OPT_FFLA
f000: 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  G:.        break
f010: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
f020: 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28  _DBL:.        *(
f030: 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61  double*)(op[j].a
f040: 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20 20 20  rg) = dv;.      
f050: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
f060: 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20  ase OPT_FDBL:.  
f070: 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29        (*(void(*)
f080: 28 64 6f 75 62 6c 65 29 29 28 6f 70 5b 6a 5d 2e  (double))(op[j].
f090: 61 72 67 29 29 28 64 76 29 3b 0a 20 20 20 20 20  arg))(dv);.     
f0a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f0b0: 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20  case OPT_INT:.  
f0c0: 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 28 6f 70        *(int*)(op
f0d0: 5b 6a 5d 2e 61 72 67 29 20 3d 20 6c 76 3b 0a 20  [j].arg) = lv;. 
f0e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f0f0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e      case OPT_FIN
f100: 54 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f  T:.        (*(vo
f110: 69 64 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b 6a  id(*)(int))(op[j
f120: 5d 2e 61 72 67 29 29 28 28 69 6e 74 29 6c 76 29  ].arg))((int)lv)
f130: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
f140: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
f150: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 2a 28 63  STR:.        *(c
f160: 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67  har**)(op[j].arg
f170: 29 20 3d 20 73 76 3b 0a 20 20 20 20 20 20 20 20  ) = sv;.        
f180: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
f190: 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20  e OPT_FSTR:.    
f1a0: 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 63      (*(void(*)(c
f1b0: 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72  har *))(op[j].ar
f1c0: 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20 20 20  g))(sv);.       
f1d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f1e0: 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e  }.  return errcn
f1f0: 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69  t;.}..int OptIni
f200: 74 28 63 68 61 72 20 2a 2a 61 2c 20 73 74 72 75  t(char **a, stru
f210: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 2c  ct s_options *o,
f220: 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20   FILE *err).{.  
f230: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
f240: 20 20 61 72 67 76 20 3d 20 61 3b 0a 20 20 6f 70    argv = a;.  op
f250: 20 3d 20 6f 3b 0a 20 20 65 72 72 73 74 72 65 61   = o;.  errstrea
f260: 6d 20 3d 20 65 72 72 3b 0a 20 20 69 66 28 20 61  m = err;.  if( a
f270: 72 67 76 20 26 26 20 2a 61 72 67 76 20 26 26 20  rgv && *argv && 
f280: 6f 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  op ){.    int i;
f290: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72  .    for(i=1; ar
f2a0: 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  gv[i]; i++){.   
f2b0: 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 5b 30     if( argv[i][0
f2c0: 5d 3d 3d 27 2b 27 20 7c 7c 20 61 72 67 76 5b 69  ]=='+' || argv[i
f2d0: 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  ][0]=='-' ){.   
f2e0: 20 20 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68       errcnt += h
f2f0: 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72 72  andleflags(i,err
f300: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
f310: 66 28 20 73 74 72 63 68 72 28 61 72 67 76 5b 69  f( strchr(argv[i
f320: 5d 2c 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20  ],'=') ){.      
f330: 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64    errcnt += hand
f340: 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72 29 3b  leswitch(i,err);
f350: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f360: 20 7d 0a 20 20 69 66 28 20 65 72 72 63 6e 74 3e   }.  if( errcnt>
f370: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
f380: 28 65 72 72 2c 22 56 61 6c 69 64 20 63 6f 6d 6d  (err,"Valid comm
f390: 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73  and line options
f3a0: 20 66 6f 72 20 5c 22 25 73 5c 22 20 61 72 65 3a   for \"%s\" are:
f3b0: 5c 6e 22 2c 2a 61 29 3b 0a 20 20 20 20 4f 70 74  \n",*a);.    Opt
f3c0: 50 72 69 6e 74 28 29 3b 0a 20 20 20 20 65 78 69  Print();.    exi
f3d0: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  t(1);.  }.  retu
f3e0: 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74  rn 0;.}..int Opt
f3f0: 4e 41 72 67 73 28 29 7b 0a 20 20 69 6e 74 20 63  NArgs(){.  int c
f400: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 64 61  nt = 0;.  int da
f410: 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  shdash = 0;.  in
f420: 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76 21  t i;.  if( argv!
f430: 3d 30 20 26 26 20 61 72 67 76 5b 30 5d 21 3d 30  =0 && argv[0]!=0
f440: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
f450: 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   argv[i]; i++){.
f460: 20 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61        if( dashda
f470: 73 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67  sh || !ISOPT(arg
f480: 76 5b 69 5d 29 20 29 20 63 6e 74 2b 2b 3b 0a 20  v[i]) ) cnt++;. 
f490: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
f4a0: 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30  argv[i],"--")==0
f4b0: 20 29 20 64 61 73 68 64 61 73 68 20 3d 20 31 3b   ) dashdash = 1;
f4c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
f4d0: 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72  urn cnt;.}..char
f4e0: 20 2a 4f 70 74 41 72 67 28 69 6e 74 20 6e 29 0a   *OptArg(int n).
f4f0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
f500: 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20   argindex(n);.  
f510: 72 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72  return i>=0 ? ar
f520: 67 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f  gv[i] : 0;.}..vo
f530: 69 64 20 4f 70 74 45 72 72 28 69 6e 74 20 6e 29  id OptErr(int n)
f540: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20  .{.  int i;.  i 
f550: 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20  = argindex(n);. 
f560: 20 69 66 28 20 69 3e 3d 30 20 29 20 65 72 72 6c   if( i>=0 ) errl
f570: 69 6e 65 28 69 2c 30 2c 65 72 72 73 74 72 65 61  ine(i,0,errstrea
f580: 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50  m);.}..void OptP
f590: 72 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b  rint(){.  int i;
f5a0: 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b  .  int max, len;
f5b0: 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f  .  max = 0;.  fo
f5c0: 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62  r(i=0; op[i].lab
f5d0: 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65  el; i++){.    le
f5e0: 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  n = lemonStrlen(
f5f0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b 20 31  op[i].label) + 1
f600: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  ;.    switch( op
f610: 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20  [i].type ){.    
f620: 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a    case OPT_FLAG:
f630: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
f640: 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62  FFLAG:.        b
f650: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
f660: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
f670: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
f680: 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 39 3b         len += 9;
f690: 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68         /* length
f6a0: 20 6f 66 20 22 3c 69 6e 74 65 67 65 72 3e 22 20   of "<integer>" 
f6b0: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
f6c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
f6d0: 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  _DBL:.      case
f6e0: 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
f6f0: 20 20 20 6c 65 6e 20 2b 3d 20 36 3b 20 20 20 20     len += 6;    
f700: 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20     /* length of 
f710: 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20 20 20 20  "<real>" */.    
f720: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f730: 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20   case OPT_STR:. 
f740: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53       case OPT_FS
f750: 54 52 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20  TR:.        len 
f760: 2b 3d 20 38 3b 20 20 20 20 20 20 20 2f 2a 20 6c  += 8;       /* l
f770: 65 6e 67 74 68 20 6f 66 20 22 3c 73 74 72 69 6e  ength of "<strin
f780: 67 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  g>" */.        b
f790: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f7a0: 69 66 28 20 6c 65 6e 3e 6d 61 78 20 29 20 6d 61  if( len>max ) ma
f7b0: 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66  x = len;.  }.  f
f7c0: 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61  or(i=0; op[i].la
f7d0: 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bel; i++){.    s
f7e0: 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70  witch( op[i].typ
f7f0: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
f800: 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
f810: 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
f820: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
f830: 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 2d  errstream,"  -%-
f840: 2a 73 20 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70  *s  %s\n",max,op
f850: 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e  [i].label,op[i].
f860: 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20  message);.      
f870: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
f880: 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20  ase OPT_INT:.   
f890: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54     case OPT_FINT
f8a0: 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  :.        fprint
f8b0: 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d  f(errstream,"  -
f8c0: 25 73 3c 69 6e 74 65 67 65 72 3e 25 2a 73 20 20  %s<integer>%*s  
f8d0: 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65  %s\n",op[i].labe
f8e0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e  l,.          (in
f8f0: 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c  t)(max-lemonStrl
f900: 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d  en(op[i].label)-
f910: 39 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73  9),"",op[i].mess
f920: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
f930: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
f940: 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63  OPT_DBL:.      c
f950: 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20  ase OPT_FDBL:.  
f960: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
f970: 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 73 3c 72  rstream,"  -%s<r
f980: 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f  eal>%*s  %s\n",o
f990: 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20  p[i].label,.    
f9a0: 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d        (int)(max-
f9b0: 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69  lemonStrlen(op[i
f9c0: 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22 22 2c 6f  ].label)-6),"",o
f9d0: 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20  p[i].message);. 
f9e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f9f0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
fa00: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
fa10: 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 66  _FSTR:.        f
fa20: 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d  printf(errstream
fa30: 2c 22 20 20 2d 25 73 3c 73 74 72 69 6e 67 3e 25  ,"  -%s<string>%
fa40: 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e  *s  %s\n",op[i].
fa50: 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  label,.         
fa60: 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e   (int)(max-lemon
fa70: 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62  Strlen(op[i].lab
fa80: 65 6c 29 2d 38 29 2c 22 22 2c 6f 70 5b 69 5d 2e  el)-8),"",op[i].
fa90: 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20  message);.      
faa0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fab0: 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   }.}./**********
fac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
fad0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61 72  om the file "par
fae0: 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  se.c" **********
faf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fb00: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20  **/./*.** Input 
fb10: 66 69 6c 65 20 70 61 72 73 65 72 20 66 6f 72 20  file parser for 
fb20: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
fb30: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
fb40: 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20  /* The state of 
fb50: 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 65 6e  the parser */.en
fb60: 75 6d 20 65 5f 73 74 61 74 65 20 7b 0a 20 20 49  um e_state {.  I
fb70: 4e 49 54 49 41 4c 49 5a 45 2c 0a 20 20 57 41 49  NITIALIZE,.  WAI
fb80: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
fb90: 5f 52 55 4c 45 2c 0a 20 20 57 41 49 54 49 4e 47  _RULE,.  WAITING
fba0: 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52  _FOR_DECL_KEYWOR
fbb0: 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  D,.  WAITING_FOR
fbc0: 5f 44 45 43 4c 5f 41 52 47 2c 0a 20 20 57 41 49  _DECL_ARG,.  WAI
fbd0: 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45  TING_FOR_PRECEDE
fbe0: 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41  NCE_SYMBOL,.  WA
fbf0: 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 2c  ITING_FOR_ARROW,
fc00: 0a 20 20 49 4e 5f 52 48 53 2c 0a 20 20 4c 48 53  .  IN_RHS,.  LHS
fc10: 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 4c 48 53 5f  _ALIAS_1,.  LHS_
fc20: 41 4c 49 41 53 5f 32 2c 0a 20 20 4c 48 53 5f 41  ALIAS_2,.  LHS_A
fc30: 4c 49 41 53 5f 33 2c 0a 20 20 52 48 53 5f 41 4c  LIAS_3,.  RHS_AL
fc40: 49 41 53 5f 31 2c 0a 20 20 52 48 53 5f 41 4c 49  IAS_1,.  RHS_ALI
fc50: 41 53 5f 32 2c 0a 20 20 50 52 45 43 45 44 45 4e  AS_2,.  PRECEDEN
fc60: 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 50 52 45  CE_MARK_1,.  PRE
fc70: 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c 0a  CEDENCE_MARK_2,.
fc80: 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52    RESYNC_AFTER_R
fc90: 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20 52 45 53  ULE_ERROR,.  RES
fca0: 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
fcb0: 52 52 4f 52 2c 0a 20 20 57 41 49 54 49 4e 47 5f  RROR,.  WAITING_
fcc0: 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53  FOR_DESTRUCTOR_S
fcd0: 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47  YMBOL,.  WAITING
fce0: 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59  _FOR_DATATYPE_SY
fcf0: 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f  MBOL,.  WAITING_
fd00: 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 2c  FOR_FALLBACK_ID,
fd10: 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57  .  WAITING_FOR_W
fd20: 49 4c 44 43 41 52 44 5f 49 44 2c 0a 20 20 57 41  ILDCARD_ID,.  WA
fd30: 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f  ITING_FOR_CLASS_
fd40: 49 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  ID,.  WAITING_FO
fd50: 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 0a 7d 3b  R_CLASS_TOKEN.};
fd60: 0a 73 74 72 75 63 74 20 70 73 74 61 74 65 20 7b  .struct pstate {
fd70: 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  .  char *filenam
fd80: 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e;       /* Name
fd90: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69   of the input fi
fda0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65  le */.  int toke
fdb0: 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 2f 2a  nlineno;      /*
fdc0: 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61 74 20 77   Linenumber at w
fdd0: 68 69 63 68 20 63 75 72 72 65 6e 74 20 74 6f 6b  hich current tok
fde0: 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a 20 20 69  en starts */.  i
fdf0: 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20  nt errorcnt;    
fe00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
fe10: 66 20 65 72 72 6f 72 73 20 73 6f 20 66 61 72 20  f errors so far 
fe20: 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e  */.  char *token
fe30: 73 74 61 72 74 3b 20 20 20 20 20 2f 2a 20 54 65  start;     /* Te
fe40: 78 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74 6f  xt of current to
fe50: 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ken */.  struct 
fe60: 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20 20 20 2f  lemon *gp;     /
fe70: 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74 65 20 76  * Global state v
fe80: 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d 20  ector */.  enum 
fe90: 65 5f 73 74 61 74 65 20 73 74 61 74 65 3b 20 20  e_state state;  
fea0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61        /* The sta
feb0: 74 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  te of the parser
fec0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
fed0: 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 20  bol *fallback;  
fee0: 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61 63 6b   /* The fallback
fef0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75   token */.  stru
ff00: 63 74 20 73 79 6d 62 6f 6c 20 2a 74 6b 63 6c 61  ct symbol *tkcla
ff10: 73 73 3b 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  ss;    /* Token 
ff20: 63 6c 61 73 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a  class symbol */.
ff30: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
ff40: 2a 6c 68 73 3b 20 20 20 20 20 20 20 20 2f 2a 20  *lhs;        /* 
ff50: 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  Left-hand side o
ff60: 66 20 63 75 72 72 65 6e 74 20 72 75 6c 65 20 2a  f current rule *
ff70: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
ff80: 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 20 20 2f  lhsalias;      /
ff90: 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20  * Alias for the 
ffa0: 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68  LHS */.  int nrh
ffb0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
ffc0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ffd0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
ffe0: 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e 20 2a 2f   symbols seen */
fff0: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
10000 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d 3b 20 20   *rhs[MAXRHS];  
10010 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  /* RHS symbols *
10020 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10030 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d 3b 20 2f  alias[MAXRHS]; /
10040 2a 20 41 6c 69 61 73 65 73 20 66 6f 72 20 65 61  * Aliases for ea
10050 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 6f  ch RHS symbol (o
10060 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 74 72  r NULL) */.  str
10070 75 63 74 20 72 75 6c 65 20 2a 70 72 65 76 72 75  uct rule *prevru
10080 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72 65 76 69  le;     /* Previ
10090 6f 75 73 20 72 75 6c 65 20 70 61 72 73 65 64 20  ous rule parsed 
100a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
100b0 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b 20 20 20  *declkeyword;   
100c0 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66 20 61 20  /* Keyword of a 
100d0 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 20  declaration */. 
100e0 20 63 68 61 72 20 2a 2a 64 65 63 6c 61 72 67 73   char **declargs
100f0 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  lot;        /* W
10100 68 65 72 65 20 74 68 65 20 64 65 63 6c 61 72 61  here the declara
10110 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 73 68  tion argument sh
10120 6f 75 6c 64 20 62 65 20 70 75 74 20 2a 2f 0a 20  ould be put */. 
10130 20 69 6e 74 20 69 6e 73 65 72 74 4c 69 6e 65 4d   int insertLineM
10140 61 63 72 6f 3b 20 20 20 20 20 20 20 2f 2a 20 41  acro;       /* A
10150 64 64 20 23 6c 69 6e 65 20 62 65 66 6f 72 65 20  dd #line before 
10160 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 73 65  declaration inse
10170 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64 65 63  rt */.  int *dec
10180 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20 20 20 20  llinenoslot;    
10190 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
101a0 72 69 74 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  rite declaration
101b0 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
101c0 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64    enum e_assoc d
101d0 65 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20  eclassoc;    /* 
101e0 41 73 73 69 67 6e 20 74 68 69 73 20 61 73 73 6f  Assign this asso
101f0 63 69 61 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20  ciation to decl 
10200 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69  arguments */.  i
10210 6e 74 20 70 72 65 63 63 6f 75 6e 74 65 72 3b 20  nt preccounter; 
10220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
10230 69 67 6e 20 74 68 69 73 20 70 72 65 63 65 64 65  ign this precede
10240 6e 63 65 20 74 6f 20 64 65 63 6c 20 61 72 67 75  nce to decl argu
10250 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75 63  ments */.  struc
10260 74 20 72 75 6c 65 20 2a 66 69 72 73 74 72 75 6c  t rule *firstrul
10270 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  e;    /* Pointer
10280 20 74 6f 20 66 69 72 73 74 20 72 75 6c 65 20 69   to first rule i
10290 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f  n the grammar */
102a0 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
102b0 6c 61 73 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a  lastrule;     /*
102c0 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
102d0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
102e0 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a  rsed rule */.};.
102f0 0a 2f 2a 20 50 61 72 73 65 20 61 20 73 69 6e 67  ./* Parse a sing
10300 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74  le token */.stat
10310 69 63 20 76 6f 69 64 20 70 61 72 73 65 6f 6e 65  ic void parseone
10320 74 6f 6b 65 6e 28 73 74 72 75 63 74 20 70 73 74  token(struct pst
10330 61 74 65 20 2a 70 73 70 29 0a 7b 0a 20 20 63 6f  ate *psp).{.  co
10340 6e 73 74 20 63 68 61 72 20 2a 78 3b 0a 20 20 78  nst char *x;.  x
10350 20 3d 20 53 74 72 73 61 66 65 28 70 73 70 2d 3e   = Strsafe(psp->
10360 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20 20 20  tokenstart);    
10370 20 2f 2a 20 53 61 76 65 20 74 68 65 20 74 6f 6b   /* Save the tok
10380 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a  en permanently *
10390 2f 0a 23 69 66 20 30 0a 20 20 70 72 69 6e 74 66  /.#if 0.  printf
103a0 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b  ("%s:%d: Token=[
103b0 25 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c  %s] state=%d\n",
103c0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
103d0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
103e0 20 20 20 20 78 2c 70 73 70 2d 3e 73 74 61 74 65      x,psp->state
103f0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74  );.#endif.  swit
10400 63 68 28 20 70 73 70 2d 3e 73 74 61 74 65 20 29  ch( psp->state )
10410 7b 0a 20 20 20 20 63 61 73 65 20 49 4e 49 54 49  {.    case INITI
10420 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70 73 70  ALIZE:.      psp
10430 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a  ->prevrule = 0;.
10440 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63        psp->precc
10450 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  ounter = 0;.    
10460 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65    psp->firstrule
10470 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65   = psp->lastrule
10480 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d   = 0;.      psp-
10490 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a  >gp->nrule = 0;.
104a0 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
104b0 72 75 20 74 6f 20 6e 65 78 74 20 63 61 73 65 20  ru to next case 
104c0 2a 2f 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  */.    case WAIT
104d0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
104e0 52 55 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  RULE:.      if( 
104f0 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20  x[0]=='%' ){.   
10500 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10510 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
10520 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20  CL_KEYWORD;.    
10530 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 4c 4f    }else if( ISLO
10540 57 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  WER(x[0]) ){.   
10550 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20       psp->lhs = 
10560 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
10570 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73         psp->nrhs
10580 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
10590 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b  p->lhsalias = 0;
105a0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
105b0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
105c0 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d  R_ARROW;.      }
105d0 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
105e0 7b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  {' ){.        if
105f0 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d  ( psp->prevrule=
10600 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10610 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
10620 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10630 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20  nlineno,."There 
10640 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65  is no prior rule
10650 20 75 70 6f 6e 20 77 68 69 63 68 20 74 6f 20 61   upon which to a
10660 74 74 61 63 68 20 74 68 65 20 63 6f 64 65 20 5c  ttach the code \
10670 0a 66 72 61 67 6d 65 6e 74 20 77 68 69 63 68 20  .fragment which 
10680 62 65 67 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c  begins on this l
10690 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ine.");.        
106a0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
106b0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
106c0 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75   if( psp->prevru
106d0 6c 65 2d 3e 63 6f 64 65 21 3d 30 20 29 7b 0a 20  le->code!=0 ){. 
106e0 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
106f0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
10700 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
10710 2c 0a 22 43 6f 64 65 20 66 72 61 67 6d 65 6e 74  ,."Code fragment
10720 20 62 65 67 69 6e 6e 69 6e 67 20 6f 6e 20 74 68   beginning on th
10730 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
10740 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f  he first \.to fo
10750 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75  llow the previou
10760 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20  s rule.");.     
10770 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
10780 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  nt++;.        }e
10790 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
107a0 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 6c 69  sp->prevrule->li
107b0 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ne = psp->tokenl
107c0 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  ineno;.         
107d0 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e   psp->prevrule->
107e0 63 6f 64 65 20 3d 20 26 78 5b 31 5d 3b 0a 20 20  code = &x[1];.  
107f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
10800 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 5b  lse if( x[0]=='[
10810 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
10820 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45 44  ->state = PRECED
10830 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20 20  ENCE_MARK_1;.   
10840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10850 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
10860 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
10870 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
10880 20 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22 25 73       "Token \"%s
10890 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 65 69 74  \" should be eit
108a0 68 65 72 20 5c 22 25 25 5c 22 20 6f 72 20 61 20  her \"%%\" or a 
108b0 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61 6d 65  nonterminal name
108c0 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 29  .",.          x)
108d0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
108e0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
108f0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10900 20 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45      case PRECEDE
10910 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20 20  NCE_MARK_1:.    
10920 20 20 69 66 28 20 21 49 53 55 50 50 45 52 28 78    if( !ISUPPER(x
10930 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
10940 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
10950 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10960 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
10970 20 20 20 22 54 68 65 20 70 72 65 63 65 64 65 6e     "The preceden
10980 63 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74 20 62  ce symbol must b
10990 65 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22 29 3b  e a terminal.");
109a0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
109b0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
109c0 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70  }else if( psp->p
109d0 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20  revrule==0 ){.  
109e0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
109f0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
10a00 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
10a10 20 20 20 20 20 20 20 20 20 22 54 68 65 72 65 20           "There 
10a20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65  is no prior rule
10a30 20 74 6f 20 61 73 73 69 67 6e 20 70 72 65 63 65   to assign prece
10a40 64 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22 2e 22  dence \"[%s]\"."
10a50 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  ,x);.        psp
10a60 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
10a70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73      }else if( ps
10a80 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65  p->prevrule->pre
10a90 63 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20  csym!=0 ){.     
10aa0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
10ab0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
10ac0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72 65  okenlineno,."Pre
10ad0 63 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f 6e 20  cedence mark on 
10ae0 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74  this line is not
10af0 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20   the first \.to 
10b00 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69  follow the previ
10b10 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20  ous rule.");.   
10b20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
10b30 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
10b40 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  e{.        psp->
10b50 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73 79  prevrule->precsy
10b60 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  m = Symbol_new(x
10b70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10b80 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52   psp->state = PR
10b90 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3b  ECEDENCE_MARK_2;
10ba0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10bb0 20 20 63 61 73 65 20 50 52 45 43 45 44 45 4e 43    case PRECEDENC
10bc0 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20 20 20  E_MARK_2:.      
10bd0 69 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20 29 7b  if( x[0]!=']' ){
10be0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
10bf0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
10c00 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
10c10 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
10c20 73 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20 70 72  sing \"]\" on pr
10c30 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e 22 29  ecedence mark.")
10c40 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
10c50 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
10c60 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74   }.      psp->st
10c70 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
10c80 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
10c90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10ca0 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
10cb0 52 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20 20 69  R_ARROW:.      i
10cc0 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20  f( x[0]==':' && 
10cd0 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32  x[1]==':' && x[2
10ce0 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='=' ){.      
10cf0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49    psp->state = I
10d00 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c  N_RHS;.      }el
10d10 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27  se if( x[0]=='('
10d20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
10d30 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49  >state = LHS_ALI
10d40 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  AS_1;.      }els
10d50 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
10d60 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
10d70 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
10d80 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 45  no,.          "E
10d90 78 70 65 63 74 65 64 20 74 6f 20 73 65 65 20 61  xpected to see a
10da0 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67   \":\" following
10db0 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20   the LHS symbol 
10dc0 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20  \"%s\".",.      
10dd0 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61      psp->lhs->na
10de0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  me);.        psp
10df0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
10e00 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10e10 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
10e20 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
10e30 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
10e40 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c  .    case LHS_AL
10e50 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28  IAS_1:.      if(
10e60 20 49 53 41 4c 50 48 41 28 78 5b 30 5d 29 20 29   ISALPHA(x[0]) )
10e70 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c  {.        psp->l
10e80 68 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20 20 20  hsalias = x;.   
10e90 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10ea0 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20  = LHS_ALIAS_2;. 
10eb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10ec0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
10ed0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
10ee0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
10ef0 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69         "\"%s\" i
10f00 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c  s not a valid al
10f10 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20  ias for the LHS 
10f20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
10f30 20 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68 73 2d       x,psp->lhs-
10f40 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
10f50 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
10f60 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10f70 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
10f80 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20  ER_RULE_ERROR;. 
10f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
10fa0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53  ak;.    case LHS
10fb0 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20 20  _ALIAS_2:.      
10fc0 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b  if( x[0]==')' ){
10fd0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10fe0 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f  ate = LHS_ALIAS_
10ff0 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  3;.      }else{.
11000 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11010 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11020 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11030 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73  .          "Miss
11040 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77  ing \")\" follow
11050 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61  ing LHS alias na
11060 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d  me \"%s\".",psp-
11070 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20  >lhsalias);.    
11080 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
11090 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
110a0 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
110b0 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
110c0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
110d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
110e0 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a 20 20   LHS_ALIAS_3:.  
110f0 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a      if( x[0]==':
11100 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26  ' && x[1]==':' &
11110 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20  & x[2]=='=' ){. 
11120 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11130 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20  e = IN_RHS;.    
11140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11150 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
11160 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
11170 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
11180 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 2d      "Missing \"-
11190 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 5c  >\" following: \
111a0 22 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20 20 20  "%s(%s)\".",.   
111b0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
111c0 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68 73 61  ->name,psp->lhsa
111d0 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70  lias);.        p
111e0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
111f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11200 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
11210 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20  R_RULE_ERROR;.  
11220 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
11230 6b 3b 0a 20 20 20 20 63 61 73 65 20 49 4e 5f 52  k;.    case IN_R
11240 48 53 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  HS:.      if( x[
11250 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  0]=='.' ){.     
11260 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a     struct rule *
11270 72 70 3b 0a 20 20 20 20 20 20 20 20 72 70 20 3d  rp;.        rp =
11280 20 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29   (struct rule *)
11290 63 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  calloc( sizeof(s
112a0 74 72 75 63 74 20 72 75 6c 65 29 20 2b 20 0a 20  truct rule) + . 
112b0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
112c0 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
112d0 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 2b 20 73  *)*psp->nrhs + s
112e0 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 73 70  izeof(char*)*psp
112f0 2d 3e 6e 72 68 73 2c 20 31 29 3b 0a 20 20 20 20  ->nrhs, 1);.    
11300 20 20 20 20 69 66 28 20 72 70 3d 3d 30 20 29 7b      if( rp==0 ){
11310 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
11320 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
11330 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
11340 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
11350 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20  "Can't allocate 
11360 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66 6f  enough memory fo
11370 72 20 74 68 69 73 20 72 75 6c 65 2e 22 29 3b 0a  r this rule.");.
11380 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
11390 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
113a0 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
113b0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  le = 0;.        
113c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
113d0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
113e0 20 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 20 3d    rp->ruleline =
113f0 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
11400 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  o;.          rp-
11410 3e 72 68 73 20 3d 20 28 73 74 72 75 63 74 20 73  >rhs = (struct s
11420 79 6d 62 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b 0a  ymbol**)&rp[1];.
11430 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
11440 73 61 6c 69 61 73 20 3d 20 28 63 6f 6e 73 74 20  salias = (const 
11450 63 68 61 72 2a 2a 29 26 28 72 70 2d 3e 72 68 73  char**)&(rp->rhs
11460 5b 70 73 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20 20  [psp->nrhs]);.  
11470 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
11480 20 69 3c 70 73 70 2d 3e 6e 72 68 73 3b 20 69 2b   i<psp->nrhs; i+
11490 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
114a0 72 70 2d 3e 72 68 73 5b 69 5d 20 3d 20 70 73 70  rp->rhs[i] = psp
114b0 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
114c0 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69        rp->rhsali
114d0 61 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 61 6c 69  as[i] = psp->ali
114e0 61 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  as[i];.         
114f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d   }.          rp-
11500 3e 6c 68 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b  >lhs = psp->lhs;
11510 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c  .          rp->l
11520 68 73 61 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c  hsalias = psp->l
11530 68 73 61 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  hsalias;.       
11540 20 20 20 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73     rp->nrhs = ps
11550 70 2d 3e 6e 72 68 73 3b 0a 20 20 20 20 20 20 20  p->nrhs;.       
11560 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b     rp->code = 0;
11570 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70  .          rp->p
11580 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20  recsym = 0;.    
11590 20 20 20 20 20 20 72 70 2d 3e 69 6e 64 65 78 20        rp->index 
115a0 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65  = psp->gp->nrule
115b0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  ++;.          rp
115c0 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e  ->nextlhs = rp->
115d0 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20  lhs->rule;.     
115e0 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75       rp->lhs->ru
115f0 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20  le = rp;.       
11600 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b     rp->next = 0;
11610 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
11620 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30  sp->firstrule==0
11630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
11640 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d  psp->firstrule =
11650 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d   psp->lastrule =
11660 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rp;.          }
11670 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11680 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 2d    psp->lastrule-
11690 3e 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20 20 20  >next = rp;.    
116a0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73          psp->las
116b0 74 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20  trule = rp;.    
116c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
116d0 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20    psp->prevrule 
116e0 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = rp;.        }.
116f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11700 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
11710 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
11720 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49       }else if( I
11730 53 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a  SALPHA(x[0]) ){.
11740 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
11750 3e 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20 29 7b  >nrhs>=MAXRHS ){
11760 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
11770 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
11780 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
11790 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
117a0 22 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62 6f 6c  "Too many symbol
117b0 73 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65  s on RHS of rule
117c0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 5c 22   beginning at \"
117d0 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20  %s\".",.        
117e0 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20      x);.        
117f0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11800 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
11810 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
11820 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
11830 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  R;.        }else
11840 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
11850 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20  >rhs[psp->nrhs] 
11860 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
11870 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11880 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  alias[psp->nrhs]
11890 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
118a0 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 20 20 20  psp->nrhs++;.   
118b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
118c0 73 65 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7c  se if( (x[0]=='|
118d0 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20  ' || x[0]=='/') 
118e0 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29  && psp->nrhs>0 )
118f0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
11900 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70   symbol *msp = p
11910 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68  sp->rhs[psp->nrh
11920 73 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  s-1];.        if
11930 28 20 6d 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c  ( msp->type!=MUL
11940 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
11950 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
11960 79 6d 62 6f 6c 20 2a 6f 72 69 67 73 70 20 3d 20  ymbol *origsp = 
11970 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  msp;.          m
11980 73 70 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d  sp = (struct sym
11990 62 6f 6c 20 2a 29 20 63 61 6c 6c 6f 63 28 31 2c  bol *) calloc(1,
119a0 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20  sizeof(*msp));. 
119b0 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
119c0 6d 73 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  msp, 0, sizeof(*
119d0 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20  msp));.         
119e0 20 6d 73 70 2d 3e 74 79 70 65 20 3d 20 4d 55 4c   msp->type = MUL
119f0 54 49 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20  TITERMINAL;.    
11a00 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73        msp->nsubs
11a10 79 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ym = 1;.        
11a20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20    msp->subsym = 
11a30 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
11a40 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65  *) calloc(1,size
11a50 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
11a60 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  *));.          m
11a70 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 20 3d 20  sp->subsym[0] = 
11a80 6f 72 69 67 73 70 3b 0a 20 20 20 20 20 20 20 20  origsp;.        
11a90 20 20 6d 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f 72    msp->name = or
11aa0 69 67 73 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20  igsp->name;.    
11ab0 20 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b 70        psp->rhs[p
11ac0 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d 73  sp->nrhs-1] = ms
11ad0 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
11ae0 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79       msp->nsubsy
11af0 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70  m++;.        msp
11b00 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74 72 75  ->subsym = (stru
11b10 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65  ct symbol **) re
11b20 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79  alloc(msp->subsy
11b30 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a  m,.          siz
11b40 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
11b50 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d  l*)*msp->nsubsym
11b60 29 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e  );.        msp->
11b70 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62  subsym[msp->nsub
11b80 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f  sym-1] = Symbol_
11b90 6e 65 77 28 26 78 5b 31 5d 29 3b 0a 20 20 20 20  new(&x[1]);.    
11ba0 20 20 20 20 69 66 28 20 49 53 4c 4f 57 45 52 28      if( ISLOWER(
11bb0 78 5b 31 5d 29 20 7c 7c 20 49 53 4c 4f 57 45 52  x[1]) || ISLOWER
11bc0 28 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d  (msp->subsym[0]-
11bd0 3e 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20  >name[0]) ){.   
11be0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11bf0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
11c00 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
11c10 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61 6e              "Can
11c20 6e 6f 74 20 66 6f 72 6d 20 61 20 63 6f 6d 70 6f  not form a compo
11c30 75 6e 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  und containing a
11c40 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 22 29 3b   non-terminal");
11c50 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11c60 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11c70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
11c80 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20  e if( x[0]=='(' 
11c90 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29  && psp->nrhs>0 )
11ca0 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
11cb0 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53  tate = RHS_ALIAS
11cc0 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _1;.      }else{
11cd0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
11ce0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
11cf0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
11d00 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c  ,.          "Ill
11d10 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 6f  egal character o
11d20 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c  n RHS of rule: \
11d30 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20  "%s\".",x);.    
11d40 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
11d50 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
11d60 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
11d70 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
11d80 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
11d90 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
11da0 20 52 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20   RHS_ALIAS_1:.  
11db0 20 20 20 20 69 66 28 20 49 53 41 4c 50 48 41 28      if( ISALPHA(
11dc0 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
11dd0 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d   psp->alias[psp-
11de0 3e 6e 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20  >nrhs-1] = x;.  
11df0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11e00 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a   = RHS_ALIAS_2;.
11e10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11e20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
11e30 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
11e40 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
11e50 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20          "\"%s\" 
11e60 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61  is not a valid a
11e70 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 48 53  lias for the RHS
11e80 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e   symbol \"%s\"\n
11e90 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70  ",.          x,p
11ea0 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68  sp->rhs[psp->nrh
11eb0 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  s-1]->name);.   
11ec0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11ed0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
11ee0 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11ef0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
11f00 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
11f10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11f20 65 20 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20  e RHS_ALIAS_2:. 
11f30 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
11f40 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  )' ){.        ps
11f50 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48  p->state = IN_RH
11f60 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  S;.      }else{.
11f70 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11f80 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11f90 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11fa0 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73  .          "Miss
11fb0 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77  ing \")\" follow
11fc0 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61  ing LHS alias na
11fd0 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d  me \"%s\".",psp-
11fe0 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20  >lhsalias);.    
11ff0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
12000 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
12010 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
12020 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
12030 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
12040 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
12050 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
12060 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20 20  L_KEYWORD:.     
12070 20 69 66 28 20 49 53 41 4c 50 48 41 28 78 5b 30   if( ISALPHA(x[0
12080 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  ]) ){.        ps
12090 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d  p->declkeyword =
120a0 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   x;.        psp-
120b0 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30  >declargslot = 0
120c0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64  ;.        psp->d
120d0 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20  ecllinenoslot = 
120e0 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
120f0 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
12100 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 1;.        psp
12110 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
12120 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a  G_FOR_DECL_ARG;.
12130 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
12140 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30 20  mp(x,"name")==0 
12150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
12160 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
12170 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65 29  &(psp->gp->name)
12180 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12190 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
121a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
121b0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
121c0 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20 29  ,"include")==0 )
121d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
121e0 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
121f0 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64  (psp->gp->includ
12200 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
12210 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
12220 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  code")==0 ){.   
12230 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
12240 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
12250 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 29 3b  >gp->extracode);
12260 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
12270 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b  f( strcmp(x,"tok
12280 65 6e 5f 64 65 73 74 72 75 63 74 6f 72 22 29 3d  en_destructor")=
12290 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
122a0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
122b0 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b   = &psp->gp->tok
122c0 65 6e 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20  endest;.        
122d0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
122e0 28 78 2c 22 64 65 66 61 75 6c 74 5f 64 65 73 74  (x,"default_dest
122f0 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20  ructor")==0 ){. 
12300 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
12310 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70  clargslot = &psp
12320 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20  ->gp->vardest;. 
12330 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12340 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e   strcmp(x,"token
12350 5f 70 72 65 66 69 78 22 29 3d 3d 30 20 29 7b 0a  _prefix")==0 ){.
12360 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
12370 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73  eclargslot = &ps
12380 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65 66  p->gp->tokenpref
12390 69 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ix;.          ps
123a0 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
123b0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
123c0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
123d0 28 78 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f 72  (x,"syntax_error
123e0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
123f0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
12400 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
12410 3e 65 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20  >error);.       
12420 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12430 70 28 78 2c 22 70 61 72 73 65 5f 61 63 63 65 70  p(x,"parse_accep
12440 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
12450 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
12460 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
12470 2d 3e 61 63 63 65 70 74 29 3b 0a 20 20 20 20 20  ->accept);.     
12480 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
12490 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 66 61 69  cmp(x,"parse_fai
124a0 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lure")==0 ){.   
124b0 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
124c0 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
124d0 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 20  >gp->failure);. 
124e0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
124f0 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63 6b   strcmp(x,"stack
12500 5f 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20 29  _overflow")==0 )
12510 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
12520 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
12530 28 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c  (psp->gp->overfl
12540 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ow);.        }el
12550 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
12560 22 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74 22  "extra_argument"
12570 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12580 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
12590 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
125a0 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  arg);.          
125b0 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
125c0 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  acro = 0;.      
125d0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
125e0 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70 65  mp(x,"token_type
125f0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
12600 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
12610 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
12620 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20 20  >tokentype);.   
12630 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
12640 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
12650 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
12660 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66  f( strcmp(x,"def
12670 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20 29  ault_type")==0 )
12680 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
12690 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
126a0 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79 70  (psp->gp->vartyp
126b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  e);.          ps
126c0 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
126d0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
126e0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
126f0 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22 29  (x,"stack_size")
12700 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12710 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
12720 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73  t = &(psp->gp->s
12730 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20  tacksize);.     
12740 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74       psp->insert
12750 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20  LineMacro = 0;. 
12760 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12770 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 72 74   strcmp(x,"start
12780 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b 0a  _symbol")==0 ){.
12790 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
127a0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
127b0 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b 0a  sp->gp->start);.
127c0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69            psp->i
127d0 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
127e0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
127f0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
12800 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  left")==0 ){.   
12810 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63         psp->prec
12820 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20  counter++;.     
12830 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73       psp->declas
12840 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20 20  soc = LEFT;.    
12850 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
12860 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50   = WAITING_FOR_P
12870 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c  RECEDENCE_SYMBOL
12880 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
12890 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 72 69  if( strcmp(x,"ri
128a0 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ght")==0 ){.    
128b0 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63        psp->precc
128c0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
128d0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73      psp->declass
128e0 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20 20 20 20  oc = RIGHT;.    
128f0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
12900 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50   = WAITING_FOR_P
12910 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c  RECEDENCE_SYMBOL
12920 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
12930 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 6f  if( strcmp(x,"no
12940 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a 20  nassoc")==0 ){. 
12950 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
12960 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  eccounter++;.   
12970 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
12980 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20 20  assoc = NONE;.  
12990 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
129a0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
129b0 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42  _PRECEDENCE_SYMB
129c0 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OL;.        }els
129d0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
129e0 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20  destructor")==0 
129f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
12a00 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
12a10 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52  G_FOR_DESTRUCTOR
12a20 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20  _SYMBOL;.       
12a30 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12a40 70 28 78 2c 22 74 79 70 65 22 29 3d 3d 30 20 29  p(x,"type")==0 )
12a50 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
12a60 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
12a70 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59  _FOR_DATATYPE_SY
12a80 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65  MBOL;.        }e
12a90 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
12aa0 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30 20  ,"fallback")==0 
12ab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
12ac0 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ->fallback = 0;.
12ad0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
12ae0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
12af0 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b 0a  OR_FALLBACK_ID;.
12b00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
12b10 28 20 73 74 72 63 6d 70 28 78 2c 22 77 69 6c 64  ( strcmp(x,"wild
12b20 63 61 72 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20  card")==0 ){.   
12b30 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12b40 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
12b50 57 49 4c 44 43 41 52 44 5f 49 44 3b 0a 20 20 20  WILDCARD_ID;.   
12b60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
12b70 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 63  trcmp(x,"token_c
12b80 6c 61 73 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lass")==0 ){.   
12b90 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12ba0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
12bb0 43 4c 41 53 53 5f 49 44 3b 0a 20 20 20 20 20 20  CLASS_ID;.      
12bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12bd0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
12be0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
12bf0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
12c00 20 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e          "Unknown
12c10 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79   declaration key
12c20 77 6f 72 64 3a 20 5c 22 25 25 25 73 5c 22 2e 22  word: \"%%%s\"."
12c30 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ,x);.          p
12c40 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
12c50 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
12c60 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
12c70 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a  TER_DECL_ERROR;.
12c80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12c90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
12ca0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
12cb0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
12cc0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
12cd0 20 20 22 49 6c 6c 65 67 61 6c 20 64 65 63 6c 61    "Illegal decla
12ce0 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20  ration keyword: 
12cf0 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20  \"%s\".",x);.   
12d00 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
12d10 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
12d20 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
12d30 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
12d40 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
12d50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
12d60 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  e WAITING_FOR_DE
12d70 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3a  STRUCTOR_SYMBOL:
12d80 0a 20 20 20 20 20 20 69 66 28 20 21 49 53 41 4c  .      if( !ISAL
12d90 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  PHA(x[0]) ){.   
12da0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
12db0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
12dc0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
12dd0 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20          "Symbol 
12de0 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74  name missing aft
12df0 65 72 20 25 25 64 65 73 74 72 75 63 74 6f 72 20  er %%destructor 
12e00 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20 20  keyword");.     
12e10 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
12e20 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
12e30 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
12e40 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
12e50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12e60 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
12e70 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f  mbol *sp = Symbo
12e80 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
12e90 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
12ea0 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 72 75  ot = &sp->destru
12eb0 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 73  ctor;.        ps
12ec0 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f  p->decllinenoslo
12ed0 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 4c 69 6e  t = &sp->destLin
12ee0 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70 73 70  eno;.        psp
12ef0 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
12f00 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  o = 1;.        p
12f10 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
12f20 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47  ING_FOR_DECL_ARG
12f30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12f40 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
12f50 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41  WAITING_FOR_DATA
12f60 54 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20  TYPE_SYMBOL:.   
12f70 20 20 20 69 66 28 20 21 49 53 41 4c 50 48 41 28     if( !ISALPHA(
12f80 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
12f90 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
12fa0 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
12fb0 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
12fc0 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65      "Symbol name
12fd0 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20 25   missing after %
12fe0 25 74 79 70 65 20 6b 65 79 77 6f 72 64 22 29 3b  %type keyword");
12ff0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
13000 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
13010 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
13020 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
13030 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
13040 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72  lse{.        str
13050 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
13060 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b   Symbol_find(x);
13070 0a 20 20 20 20 20 20 20 20 69 66 28 28 73 70 29  .        if((sp)
13080 20 26 26 20 28 73 70 2d 3e 64 61 74 61 74 79 70   && (sp->datatyp
13090 65 29 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  e)){.          E
130a0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
130b0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
130c0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
130d0 20 20 20 20 22 53 79 6d 62 6f 6c 20 25 25 74 79      "Symbol %%ty
130e0 70 65 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64  pe \"%s\" alread
130f0 79 20 64 65 66 69 6e 65 64 22 2c 20 78 29 3b 0a  y defined", x);.
13100 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
13110 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
13120 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
13130 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
13140 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
13150 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13160 20 20 20 20 69 66 20 28 21 73 70 29 7b 0a 20 20      if (!sp){.  
13170 20 20 20 20 20 20 20 20 20 20 73 70 20 3d 20 53            sp = S
13180 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
13190 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
131a0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
131b0 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74 61  slot = &sp->data
131c0 74 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  type;.          
131d0 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
131e0 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  acro = 0;.      
131f0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
13200 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
13210 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20 7d  L_ARG;.        }
13220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13230 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
13240 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45  AITING_FOR_PRECE
13250 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20  DENCE_SYMBOL:.  
13260 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e      if( x[0]=='.
13270 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
13280 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
13290 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
132a0 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  LE;.      }else 
132b0 69 66 28 20 49 53 55 50 50 45 52 28 78 5b 30 5d  if( ISUPPER(x[0]
132c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ) ){.        str
132d0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
132e0 20 20 20 20 20 20 20 20 73 70 20 3d 20 53 79 6d          sp = Sym
132f0 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
13300 20 20 20 20 69 66 28 20 73 70 2d 3e 70 72 65 63      if( sp->prec
13310 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
13320 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
13330 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
13340 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
13350 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c 22        "Symbol \"
13360 25 73 5c 22 20 68 61 73 20 61 6c 72 65 61 64 79  %s\" has already
13370 20 62 65 20 67 69 76 65 6e 20 61 20 70 72 65 63   be given a prec
13380 65 64 65 6e 63 65 2e 22 2c 78 29 3b 0a 20 20 20  edence.",x);.   
13390 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
133a0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
133b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
133c0 20 73 70 2d 3e 70 72 65 63 20 3d 20 70 73 70 2d   sp->prec = psp-
133d0 3e 70 72 65 63 63 6f 75 6e 74 65 72 3b 0a 20 20  >preccounter;.  
133e0 20 20 20 20 20 20 20 20 73 70 2d 3e 61 73 73 6f          sp->asso
133f0 63 20 3d 20 70 73 70 2d 3e 64 65 63 6c 61 73 73  c = psp->declass
13400 6f 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  oc;.        }.  
13410 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13420 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
13430 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
13440 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
13450 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 73 73        "Can't ass
13460 69 67 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65  ign a precedence
13470 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b   to \"%s\".",x);
13480 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
13490 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
134a0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
134b0 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
134c0 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20  FOR_DECL_ARG:.  
134d0 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b      if( x[0]=='{
134e0 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27 20  ' || x[0]=='\"' 
134f0 7c 7c 20 49 53 41 4c 4e 55 4d 28 78 5b 30 5d 29  || ISALNUM(x[0])
13500 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
13510 74 20 63 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a 7a  t char *zOld, *z
13520 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 63 68 61  New;.        cha
13530 72 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20 20  r *zBuf, *z;.   
13540 20 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e       int nOld, n
13550 2c 20 6e 4c 69 6e 65 20 3d 20 30 2c 20 6e 4e 65  , nLine = 0, nNe
13560 77 2c 20 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20  w, nBack;.      
13570 20 20 69 6e 74 20 61 64 64 4c 69 6e 65 4d 61 63    int addLineMac
13580 72 6f 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  ro;.        char
13590 20 7a 4c 69 6e 65 5b 35 30 5d 3b 0a 20 20 20 20   zLine[50];.    
135a0 20 20 20 20 7a 4e 65 77 20 3d 20 78 3b 0a 20 20      zNew = x;.  
135b0 20 20 20 20 20 20 69 66 28 20 7a 4e 65 77 5b 30        if( zNew[0
135c0 5d 3d 3d 27 22 27 20 7c 7c 20 7a 4e 65 77 5b 30  ]=='"' || zNew[0
135d0 5d 3d 3d 27 7b 27 20 29 20 7a 4e 65 77 2b 2b 3b  ]=='{' ) zNew++;
135e0 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20  .        nNew = 
135f0 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4e 65 77  lemonStrlen(zNew
13600 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  );.        if( *
13610 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
13620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f   ){.          zO
13630 6c 64 20 3d 20 2a 70 73 70 2d 3e 64 65 63 6c 61  ld = *psp->decla
13640 72 67 73 6c 6f 74 3b 0a 20 20 20 20 20 20 20 20  rgslot;.        
13650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
13660 20 7a 4f 6c 64 20 3d 20 22 22 3b 0a 20 20 20 20   zOld = "";.    
13670 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 4f      }.        nO
13680 6c 64 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  ld = lemonStrlen
13690 28 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  (zOld);.        
136a0 6e 20 3d 20 6e 4f 6c 64 20 2b 20 6e 4e 65 77 20  n = nOld + nNew 
136b0 2b 20 32 30 3b 0a 20 20 20 20 20 20 20 20 61 64  + 20;.        ad
136c0 64 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 21 70 73  dLineMacro = !ps
136d0 70 2d 3e 67 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73  p->gp->nolinenos
136e0 66 6c 61 67 20 26 26 20 70 73 70 2d 3e 69 6e 73  flag && psp->ins
136f0 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 26 26 0a  ertLineMacro &&.
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13710 20 20 20 20 20 20 20 20 28 70 73 70 2d 3e 64 65          (psp->de
13720 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3d 3d 30 20  cllinenoslot==0 
13730 7c 7c 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65  || psp->declline
13740 6e 6f 73 6c 6f 74 5b 30 5d 21 3d 30 29 3b 0a 20  noslot[0]!=0);. 
13750 20 20 20 20 20 20 20 69 66 28 20 61 64 64 4c 69         if( addLi
13760 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20 20  neMacro ){.     
13770 20 20 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d 3e       for(z=psp->
13780 66 69 6c 65 6e 61 6d 65 2c 20 6e 42 61 63 6b 3d  filename, nBack=
13790 30 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20  0; *z; z++){.   
137a0 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d           if( *z=
137b0 3d 27 5c 5c 27 20 29 20 6e 42 61 63 6b 2b 2b 3b  ='\\' ) nBack++;
137c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
137d0 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72         lemon_spr
137e0 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 23 6c 69  intf(zLine, "#li
137f0 6e 65 20 25 64 20 22 2c 20 70 73 70 2d 3e 74 6f  ne %d ", psp->to
13800 6b 65 6e 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  kenlineno);.    
13810 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6c 65        nLine = le
13820 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4c 69 6e 65 29  monStrlen(zLine)
13830 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 2b 3d  ;.          n +=
13840 20 6e 4c 69 6e 65 20 2b 20 6c 65 6d 6f 6e 53 74   nLine + lemonSt
13850 72 6c 65 6e 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rlen(psp->filena
13860 6d 65 29 20 2b 20 6e 42 61 63 6b 3b 0a 20 20 20  me) + nBack;.   
13870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
13880 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
13890 20 3d 20 28 63 68 61 72 20 2a 29 20 72 65 61 6c   = (char *) real
138a0 6c 6f 63 28 2a 70 73 70 2d 3e 64 65 63 6c 61 72  loc(*psp->declar
138b0 67 73 6c 6f 74 2c 20 6e 29 3b 0a 20 20 20 20 20  gslot, n);.     
138c0 20 20 20 7a 42 75 66 20 3d 20 2a 70 73 70 2d 3e     zBuf = *psp->
138d0 64 65 63 6c 61 72 67 73 6c 6f 74 20 2b 20 6e 4f  declargslot + nO
138e0 6c 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ld;.        if( 
138f0 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 29 7b 0a  addLineMacro ){.
13900 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f            if( nO
13910 6c 64 20 26 26 20 7a 42 75 66 5b 2d 31 5d 21 3d  ld && zBuf[-1]!=
13920 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\n' ){.        
13930 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20      *(zBuf++) = 
13940 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\n';.          
13950 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
13960 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20  py(zBuf, zLine, 
13970 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  nLine);.        
13980 20 20 7a 42 75 66 20 2b 3d 20 6e 4c 69 6e 65 3b    zBuf += nLine;
13990 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75  .          *(zBu
139a0 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20 20  f++) = '"';.    
139b0 20 20 20 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d        for(z=psp-
139c0 3e 66 69 6c 65 6e 61 6d 65 3b 20 2a 7a 3b 20 7a  >filename; *z; z
139d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
139e0 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29 7b   if( *z=='\\' ){
139f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
13a00 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 5c 27 3b  (zBuf++) = '\\';
13a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
13a20 20 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75             *(zBu
13a30 66 2b 2b 29 20 3d 20 2a 7a 3b 0a 20 20 20 20 20  f++) = *z;.     
13a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13a50 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27   *(zBuf++) = '"'
13a60 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42  ;.          *(zB
13a70 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20 20  uf++) = '\n';.  
13a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13a90 69 66 28 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e  if( psp->decllin
13aa0 65 6e 6f 73 6c 6f 74 20 26 26 20 70 73 70 2d 3e  enoslot && psp->
13ab0 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30  decllinenoslot[0
13ac0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
13ad0 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e    psp->decllinen
13ae0 6f 73 6c 6f 74 5b 30 5d 20 3d 20 70 73 70 2d 3e  oslot[0] = psp->
13af0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20  tokenlineno;.   
13b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
13b10 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4e 65 77  emcpy(zBuf, zNew
13b20 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , nNew);.       
13b30 20 7a 42 75 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20   zBuf += nNew;. 
13b40 20 20 20 20 20 20 20 2a 7a 42 75 66 20 3d 20 30         *zBuf = 0
13b50 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
13b60 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
13b70 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
13b80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13b90 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
13ba0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
13bb0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
13bc0 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
13bd0 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 25 25  l argument to %%
13be0 25 73 3a 20 25 73 22 2c 70 73 70 2d 3e 64 65 63  %s: %s",psp->dec
13bf0 6c 6b 65 79 77 6f 72 64 2c 78 29 3b 0a 20 20 20  lkeyword,x);.   
13c00 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
13c10 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
13c20 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
13c30 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
13c40 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
13c50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
13c60 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41  e WAITING_FOR_FA
13c70 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20 20 20 20 20  LLBACK_ID:.     
13c80 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
13c90 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
13ca0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
13cb0 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
13cc0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
13cd0 20 21 49 53 55 50 50 45 52 28 78 5b 30 5d 29 20   !ISUPPER(x[0]) 
13ce0 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
13cf0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
13d00 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
13d10 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
13d20 25 25 66 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d  %%fallback argum
13d30 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c  ent \"%s\" shoul
13d40 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78  d be a token", x
13d50 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
13d60 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
13d70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13d80 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
13d90 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
13da0 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
13db0 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30  psp->fallback==0
13dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
13dd0 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 73 70  p->fallback = sp
13de0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
13df0 69 66 28 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b  if( sp->fallback
13e00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
13e10 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
13e20 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e  name, psp->token
13e30 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
13e40 20 20 20 20 22 4d 6f 72 65 20 74 68 61 6e 20 6f      "More than o
13e50 6e 65 20 66 61 6c 6c 62 61 63 6b 20 61 73 73 69  ne fallback assi
13e60 67 6e 65 64 20 74 6f 20 74 6f 6b 65 6e 20 25 73  gned to token %s
13e70 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20  ", x);.         
13e80 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
13e90 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
13ea0 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 66  .          sp->f
13eb0 61 6c 6c 62 61 63 6b 20 3d 20 70 73 70 2d 3e 66  allback = psp->f
13ec0 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  allback;.       
13ed0 20 20 20 70 73 70 2d 3e 67 70 2d 3e 68 61 73 5f     psp->gp->has_
13ee0 66 61 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  fallback = 1;.  
13ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13f00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13f10 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
13f20 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 3a 0a 20  R_WILDCARD_ID:. 
13f30 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
13f40 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  .' ){.        ps
13f50 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
13f60 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
13f70 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
13f80 20 69 66 28 20 21 49 53 55 50 50 45 52 28 78 5b   if( !ISUPPER(x[
13f90 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
13fa0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
13fb0 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65  ename, psp->toke
13fc0 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
13fd0 20 20 20 22 25 25 77 69 6c 64 63 61 72 64 20 61     "%%wildcard a
13fe0 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73  rgument \"%s\" s
13ff0 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e  hould be a token
14000 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ", x);.        p
14010 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
14020 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14030 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
14040 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ol *sp = Symbol_
14050 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
14060 69 66 28 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c  if( psp->gp->wil
14070 64 63 61 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20  dcard==0 ){.    
14080 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 77        psp->gp->w
14090 69 6c 64 63 61 72 64 20 3d 20 73 70 3b 0a 20 20  ildcard = sp;.  
140a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
140b0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
140c0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70  psp->filename, p
140d0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
140e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 45 78  .            "Ex
140f0 74 72 61 20 77 69 6c 64 63 61 72 64 20 74 6f 20  tra wildcard to 
14100 74 6f 6b 65 6e 3a 20 25 73 22 2c 20 78 29 3b 0a  token: %s", x);.
14110 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
14120 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
14130 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14140 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
14150 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43  se WAITING_FOR_C
14160 4c 41 53 53 5f 49 44 3a 0a 20 20 20 20 20 20 69  LASS_ID:.      i
14170 66 28 20 21 49 53 4c 4f 57 45 52 28 78 5b 30 5d  f( !ISLOWER(x[0]
14180 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ) ){.        Err
14190 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
141a0 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ame, psp->tokenl
141b0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
141c0 20 22 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20   "%%token_class 
141d0 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64  must be followed
141e0 20 62 79 20 61 6e 20 69 64 65 6e 74 69 66 69 65   by an identifie
141f0 72 3a 20 22 2c 20 78 29 3b 0a 20 20 20 20 20 20  r: ", x);.      
14200 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
14210 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
14220 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
14230 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
14240 0a 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  .     }else if( 
14250 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 20 29  Symbol_find(x) )
14260 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
14270 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
14280 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  , psp->tokenline
14290 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53  no,.          "S
142a0 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 61 6c 72  ymbol \"%s\" alr
142b0 65 61 64 79 20 75 73 65 64 22 2c 20 78 29 3b 0a  eady used", x);.
142c0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
142d0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
142e0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
142f0 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
14300 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
14310 73 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  se{.        psp-
14320 3e 74 6b 63 6c 61 73 73 20 3d 20 53 79 6d 62 6f  >tkclass = Symbo
14330 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
14340 20 20 70 73 70 2d 3e 74 6b 63 6c 61 73 73 2d 3e    psp->tkclass->
14350 74 79 70 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d  type = MULTITERM
14360 49 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 70 73  INAL;.        ps
14370 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
14380 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b  NG_FOR_CLASS_TOK
14390 45 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EN;.      }.    
143a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
143b0 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c  e WAITING_FOR_CL
143c0 41 53 53 5f 54 4f 4b 45 4e 3a 0a 20 20 20 20 20  ASS_TOKEN:.     
143d0 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
143e0 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
143f0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
14400 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
14410 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
14420 20 49 53 55 50 50 45 52 28 78 5b 30 5d 29 20 7c   ISUPPER(x[0]) |
14430 7c 20 28 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c  | ((x[0]=='|' ||
14440 20 78 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20 49   x[0]=='/') && I
14450 53 55 50 50 45 52 28 78 5b 31 5d 29 29 20 29 7b  SUPPER(x[1])) ){
14460 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
14470 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73  symbol *msp = ps
14480 70 2d 3e 74 6b 63 6c 61 73 73 3b 0a 20 20 20 20  p->tkclass;.    
14490 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d      msp->nsubsym
144a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d  ++;.        msp-
144b0 3e 73 75 62 73 79 6d 20 3d 20 28 73 74 72 75 63  >subsym = (struc
144c0 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61  t symbol **) rea
144d0 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d  lloc(msp->subsym
144e0 2c 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a 65  ,.          size
144f0 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
14500 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29  *)*msp->nsubsym)
14510 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 49  ;.        if( !I
14520 53 55 50 50 45 52 28 78 5b 30 5d 29 20 29 20 78  SUPPER(x[0]) ) x
14530 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d  ++;.        msp-
14540 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75  >subsym[msp->nsu
14550 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c  bsym-1] = Symbol
14560 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 7d  _new(x);.      }
14570 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
14580 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
14590 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e  name, psp->token
145a0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
145b0 20 20 22 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73    "%%token_class
145c0 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22   argument \"%s\"
145d0 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b   should be a tok
145e0 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  en", x);.       
145f0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
14600 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
14610 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
14620 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a  TER_DECL_ERROR;.
14630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
14640 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45  eak;.    case RE
14650 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
14660 45 52 52 4f 52 3a 0a 2f 2a 20 20 20 20 20 20 69  ERROR:./*      i
14670 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70  f( x[0]=='.' ) p
14680 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
14690 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
146a0 52 55 4c 45 3b 0a 2a 2a 20 20 20 20 20 20 62 72  RULE;.**      br
146b0 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65  eak; */.    case
146c0 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
146d0 43 4c 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  CL_ERROR:.      
146e0 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20  if( x[0]=='.' ) 
146f0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
14700 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
14710 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 69 66 28  _RULE;.      if(
14720 20 78 5b 30 5d 3d 3d 27 25 27 20 29 20 70 73 70   x[0]=='%' ) psp
14730 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
14740 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f  G_FOR_DECL_KEYWO
14750 52 44 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  RD;.      break;
14760 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 74  .  }.}../* Run t
14770 68 65 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20  he preprocessor 
14780 6f 76 65 72 20 74 68 65 20 69 6e 70 75 74 20 66  over the input f
14790 69 6c 65 20 74 65 78 74 2e 20 20 54 68 65 20 67  ile text.  The g
147a0 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 0a  lobal variables.
147b0 2a 2a 20 61 7a 44 65 66 69 6e 65 5b 30 5d 20 74  ** azDefine[0] t
147c0 68 72 6f 75 67 68 20 61 7a 44 65 66 69 6e 65 5b  hrough azDefine[
147d0 6e 44 65 66 69 6e 65 2d 31 5d 20 63 6f 6e 74 61  nDefine-1] conta
147e0 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ins the names of
147f0 20 61 6c 6c 20 64 65 66 69 6e 65 64 0a 2a 2a 20   all defined.** 
14800 6d 61 63 72 6f 73 2e 20 20 54 68 69 73 20 72 6f  macros.  This ro
14810 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20  utine looks for 
14820 22 25 69 66 64 65 66 22 20 61 6e 64 20 22 25 69  "%ifdef" and "%i
14830 66 6e 64 65 66 22 20 61 6e 64 20 22 25 65 6e 64  fndef" and "%end
14840 69 66 22 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d 65  if" and.** comme
14850 6e 74 73 20 74 68 65 6d 20 6f 75 74 2e 20 20 54  nts them out.  T
14860 65 78 74 20 69 6e 20 62 65 74 77 65 65 6e 20 69  ext in between i
14870 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64  s also commented
14880 20 6f 75 74 20 61 73 20 61 70 70 72 6f 70 72 69   out as appropri
14890 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ate..*/.static v
148a0 6f 69 64 20 70 72 65 70 72 6f 63 65 73 73 5f 69  oid preprocess_i
148b0 6e 70 75 74 28 63 68 61 72 20 2a 7a 29 7b 0a 20  nput(char *z){. 
148c0 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b   int i, j, k, n;
148d0 0a 20 20 69 6e 74 20 65 78 63 6c 75 64 65 20 3d  .  int exclude =
148e0 20 30 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20   0;.  int start 
148f0 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e  = 0;.  int linen
14900 6f 20 3d 20 31 3b 0a 20 20 69 6e 74 20 73 74 61  o = 1;.  int sta
14910 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20  rt_lineno = 1;. 
14920 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20   for(i=0; z[i]; 
14930 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  i++){.    if( z[
14940 69 5d 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e  i]=='\n' ) linen
14950 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69  o++;.    if( z[i
14960 5d 21 3d 27 25 27 20 7c 7c 20 28 69 3e 30 20 26  ]!='%' || (i>0 &
14970 26 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29 20  & z[i-1]!='\n') 
14980 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14990 69 66 28 20 73 74 72 6e 63 6d 70 28 26 7a 5b 69  if( strncmp(&z[i
149a0 5d 2c 22 25 65 6e 64 69 66 22 2c 36 29 3d 3d 30  ],"%endif",6)==0
149b0 20 26 26 20 49 53 53 50 41 43 45 28 7a 5b 69 2b   && ISSPACE(z[i+
149c0 36 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  6]) ){.      if(
149d0 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20   exclude ){.    
149e0 20 20 20 20 65 78 63 6c 75 64 65 2d 2d 3b 0a 20      exclude--;. 
149f0 20 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75         if( exclu
14a00 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  de==0 ){.       
14a10 20 20 20 66 6f 72 28 6a 3d 73 74 61 72 74 3b 20     for(j=start; 
14a20 6a 3c 69 3b 20 6a 2b 2b 29 20 69 66 28 20 7a 5b  j<i; j++) if( z[
14a30 6a 5d 21 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d 20  j]!='\n' ) z[j] 
14a40 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d  = ' ';.        }
14a50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
14a60 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20  or(j=i; z[j] && 
14a70 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29  z[j]!='\n'; j++)
14a80 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20   z[j] = ' ';.   
14a90 20 7d 65 6c 73 65 20 69 66 28 20 28 73 74 72 6e   }else if( (strn
14aa0 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 64 65  cmp(&z[i],"%ifde
14ab0 66 22 2c 36 29 3d 3d 30 20 26 26 20 49 53 53 50  f",6)==0 && ISSP
14ac0 41 43 45 28 7a 5b 69 2b 36 5d 29 29 0a 20 20 20  ACE(z[i+6])).   
14ad0 20 20 20 20 20 20 20 7c 7c 20 28 73 74 72 6e 63         || (strnc
14ae0 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 6e 64 65  mp(&z[i],"%ifnde
14af0 66 22 2c 37 29 3d 3d 30 20 26 26 20 49 53 53 50  f",7)==0 && ISSP
14b00 41 43 45 28 7a 5b 69 2b 37 5d 29 29 20 29 7b 0a  ACE(z[i+7])) ){.
14b10 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64        if( exclud
14b20 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78 63  e ){.        exc
14b30 6c 75 64 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  lude++;.      }e
14b40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
14b50 28 6a 3d 69 2b 37 3b 20 49 53 53 50 41 43 45 28  (j=i+7; ISSPACE(
14b60 7a 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  z[j]); j++){}.  
14b70 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a        for(n=0; z
14b80 5b 6a 2b 6e 5d 20 26 26 20 21 49 53 53 50 41 43  [j+n] && !ISSPAC
14b90 45 28 7a 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b  E(z[j+n]); n++){
14ba0 7d 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64  }.        exclud
14bb0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66  e = 1;.        f
14bc0 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69 6e  or(k=0; k<nDefin
14bd0 65 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; k++){.       
14be0 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61     if( strncmp(a
14bf0 7a 44 65 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d  zDefine[k],&z[j]
14c00 2c 6e 29 3d 3d 30 20 26 26 20 6c 65 6d 6f 6e 53  ,n)==0 && lemonS
14c10 74 72 6c 65 6e 28 61 7a 44 65 66 69 6e 65 5b 6b  trlen(azDefine[k
14c20 5d 29 3d 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20  ])==n ){.       
14c30 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d 20 30       exclude = 0
14c40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
14c50 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
14c60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14c70 20 20 20 69 66 28 20 7a 5b 69 2b 33 5d 3d 3d 27     if( z[i+3]=='
14c80 6e 27 20 29 20 65 78 63 6c 75 64 65 20 3d 20 21  n' ) exclude = !
14c90 65 78 63 6c 75 64 65 3b 0a 20 20 20 20 20 20 20  exclude;.       
14ca0 20 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a   if( exclude ){.
14cb0 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 20            start 
14cc0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = i;.          s
14cd0 74 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 6c 69  tart_lineno = li
14ce0 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  neno;.        }.
14cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
14d00 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a  r(j=i; z[j] && z
14d10 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20  [j]!='\n'; j++) 
14d20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  z[j] = ' ';.    
14d30 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 78 63 6c  }.  }.  if( excl
14d40 75 64 65 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ude ){.    fprin
14d50 74 66 28 73 74 64 65 72 72 2c 22 75 6e 74 65 72  tf(stderr,"unter
14d60 6d 69 6e 61 74 65 64 20 25 25 69 66 64 65 66 20  minated %%ifdef 
14d70 73 74 61 72 74 69 6e 67 20 6f 6e 20 6c 69 6e 65  starting on line
14d80 20 25 64 5c 6e 22 2c 20 73 74 61 72 74 5f 6c 69   %d\n", start_li
14d90 6e 65 6e 6f 29 3b 0a 20 20 20 20 65 78 69 74 28  neno);.    exit(
14da0 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e  1);.  }.}../* In
14db0 20 73 70 69 74 65 20 6f 66 20 69 74 73 20 6e 61   spite of its na
14dc0 6d 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  me, this functio
14dd0 6e 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63  n is really a sc
14de0 61 6e 6e 65 72 2e 20 20 49 74 20 72 65 61 64 0a  anner.  It read.
14df0 2a 2a 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65  ** in the entire
14e00 20 69 6e 70 75 74 20 66 69 6c 65 20 28 61 6c 6c   input file (all
14e10 20 61 74 20 6f 6e 63 65 29 20 74 68 65 6e 20 74   at once) then t
14e20 6f 6b 65 6e 69 7a 65 73 20 69 74 2e 20 20 45 61  okenizes it.  Ea
14e30 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69 73 20 70  ch.** token is p
14e40 61 73 73 65 64 20 74 6f 20 74 68 65 20 66 75 6e  assed to the fun
14e50 63 74 69 6f 6e 20 22 70 61 72 73 65 6f 6e 65 74  ction "parseonet
14e60 6f 6b 65 6e 22 20 77 68 69 63 68 20 62 75 69 6c  oken" which buil
14e70 64 73 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 61 70  ds all.** the ap
14e80 70 72 6f 70 72 69 61 74 65 20 64 61 74 61 20 73  propriate data s
14e90 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
14ea0 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65   global state ve
14eb0 63 74 6f 72 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f  ctor "gp"..*/.vo
14ec0 69 64 20 50 61 72 73 65 28 73 74 72 75 63 74 20  id Parse(struct 
14ed0 6c 65 6d 6f 6e 20 2a 67 70 29 0a 7b 0a 20 20 73  lemon *gp).{.  s
14ee0 74 72 75 63 74 20 70 73 74 61 74 65 20 70 73 3b  truct pstate ps;
14ef0 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63  .  FILE *fp;.  c
14f00 68 61 72 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20  har *filebuf;.  
14f10 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 69 6c  unsigned int fil
14f20 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e  esize;.  int lin
14f30 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  eno;.  int c;.  
14f40 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63  char *cp, *nextc
14f50 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69  p;.  int startli
14f60 6e 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65  ne = 0;..  memse
14f70 74 28 26 70 73 2c 20 27 5c 30 27 2c 20 73 69 7a  t(&ps, '\0', siz
14f80 65 6f 66 28 70 73 29 29 3b 0a 20 20 70 73 2e 67  eof(ps));.  ps.g
14f90 70 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c  p = gp;.  ps.fil
14fa0 65 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65  ename = gp->file
14fb0 6e 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72  name;.  ps.error
14fc0 63 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74  cnt = 0;.  ps.st
14fd0 61 74 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45  ate = INITIALIZE
14fe0 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
14ff0 20 72 65 61 64 69 6e 67 20 74 68 65 20 69 6e 70   reading the inp
15000 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20  ut file */.  fp 
15010 3d 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e  = fopen(ps.filen
15020 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28  ame,"rb");.  if(
15030 20 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72   fp==0 ){.    Er
15040 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
15050 6d 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e  me,0,"Can't open
15060 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 72   this file for r
15070 65 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67  eading.");.    g
15080 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
15090 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
150a0 20 66 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a   fseek(fp,0,2);.
150b0 20 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74 65    filesize = fte
150c0 6c 6c 28 66 70 29 3b 0a 20 20 72 65 77 69 6e 64  ll(fp);.  rewind
150d0 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 20  (fp);.  filebuf 
150e0 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63  = (char *)malloc
150f0 28 20 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a  ( filesize+1 );.
15100 20 20 69 66 28 20 66 69 6c 65 73 69 7a 65 3e 31    if( filesize>1
15110 30 30 30 30 30 30 30 30 20 7c 7c 20 66 69 6c 65  00000000 || file
15120 62 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72  buf==0 ){.    Er
15130 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
15140 6d 65 2c 30 2c 22 49 6e 70 75 74 20 66 69 6c 65  me,0,"Input file
15150 20 74 6f 6f 20 6c 61 72 67 65 2e 22 29 3b 0a 20   too large.");. 
15160 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b     gp->errorcnt+
15170 2b 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70  +;.    fclose(fp
15180 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
15190 20 7d 0a 20 20 69 66 28 20 66 72 65 61 64 28 66   }.  if( fread(f
151a0 69 6c 65 62 75 66 2c 31 2c 66 69 6c 65 73 69 7a  ilebuf,1,filesiz
151b0 65 2c 66 70 29 21 3d 66 69 6c 65 73 69 7a 65 20  e,fp)!=filesize 
151c0 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28  ){.    ErrorMsg(
151d0 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43  ps.filename,0,"C
151e0 61 6e 27 74 20 72 65 61 64 20 69 6e 20 61 6c 6c  an't read in all
151f0 20 25 64 20 62 79 74 65 73 20 6f 66 20 74 68 69   %d bytes of thi
15200 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20  s file.",.      
15210 66 69 6c 65 73 69 7a 65 29 3b 0a 20 20 20 20 66  filesize);.    f
15220 72 65 65 28 66 69 6c 65 62 75 66 29 3b 0a 20 20  ree(filebuf);.  
15230 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b    gp->errorcnt++
15240 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29  ;.    fclose(fp)
15250 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
15260 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a  }.  fclose(fp);.
15270 20 20 66 69 6c 65 62 75 66 5b 66 69 6c 65 73 69    filebuf[filesi
15280 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d  ze] = 0;..  /* M
15290 61 6b 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 70  ake an initial p
152a0 61 73 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  ass through the 
152b0 66 69 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 25  file to handle %
152c0 69 66 64 65 66 20 61 6e 64 20 25 69 66 6e 64 65  ifdef and %ifnde
152d0 66 20 2a 2f 0a 20 20 70 72 65 70 72 6f 63 65 73  f */.  preproces
152e0 73 5f 69 6e 70 75 74 28 66 69 6c 65 62 75 66 29  s_input(filebuf)
152f0 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e  ;..  /* Now scan
15300 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
15310 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
15320 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66   lineno = 1;.  f
15330 6f 72 28 63 70 3d 66 69 6c 65 62 75 66 3b 20 28  or(cp=filebuf; (
15340 63 3d 20 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20  c= *cp)!=0; ){. 
15350 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
15360 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20   lineno++;      
15370 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 65 70 20          /* Keep 
15380 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e  track of the lin
15390 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
153a0 69 66 28 20 49 53 53 50 41 43 45 28 63 29 20 29  if( ISSPACE(c) )
153b0 7b 20 63 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65  { cp++; continue
153c0 3b 20 7d 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c  ; }  /* Skip all
153d0 20 77 68 69 74 65 20 73 70 61 63 65 20 2a 2f 0a   white space */.
153e0 20 20 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26      if( c=='/' &
153f0 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20  & cp[1]=='/' ){ 
15400 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70           /* Skip
15410 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65   C++ style comme
15420 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  nts */.      cp+
15430 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  =2;.      while(
15440 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
15450 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a  c!='\n' ) cp++;.
15460 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
15470 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d      }.    if( c=
15480 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
15490 2a 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  *' ){          /
154a0 2a 20 53 6b 69 70 20 43 20 73 74 79 6c 65 20 63  * Skip C style c
154b0 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  omments */.     
154c0 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68   cp+=2;.      wh
154d0 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
154e0 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63   && (c!='/' || c
154f0 70 5b 2d 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20  p[-1]!='*') ){. 
15500 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
15510 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n' ) lineno++;. 
15520 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20         cp++;.   
15530 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
15540 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63   ) cp++;.      c
15550 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
15560 20 20 20 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74     ps.tokenstart
15570 20 3d 20 63 70 3b 20 20 20 20 20 20 20 20 20 20   = cp;          
15580 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68        /* Mark th
15590 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
155a0 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  he token */.    
155b0 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d  ps.tokenlineno =
155c0 20 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20   lineno;        
155d0 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72     /* Linenumber
155e0 20 6f 6e 20 77 68 69 63 68 20 74 6f 6b 65 6e 20   on which token 
155f0 62 65 67 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66  begins */.    if
15600 28 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20  ( c=='\"' ){    
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15620 20 2f 2a 20 53 74 72 69 6e 67 20 6c 69 74 65 72   /* String liter
15630 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  als */.      cp+
15640 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  +;.      while( 
15650 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63  (c= *cp)!=0 && c
15660 21 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20  !='\"' ){.      
15670 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
15680 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
15690 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a    cp++;.      }.
156a0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
156b0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
156c0 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73  sg(ps.filename,s
156d0 74 61 72 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e  tartline,."Strin
156e0 67 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68  g starting on th
156f0 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
15700 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65  erminated before
15710 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
15720 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  file.");.       
15730 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a   ps.errorcnt++;.
15740 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d          nextcp =
15750 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   cp;.      }else
15760 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  {.        nextcp
15770 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d   = cp+1;.      }
15780 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
15790 3d 3d 27 7b 27 20 29 7b 20 20 20 20 20 20 20 20  =='{' ){        
157a0 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63         /* A bloc
157b0 6b 20 6f 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20  k of C code */. 
157c0 20 20 20 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a       int level;.
157d0 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
157e0 20 20 66 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28    for(level=1; (
157f0 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 6c  c= *cp)!=0 && (l
15800 65 76 65 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27  evel>1 || c!='}'
15810 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ); cp++){.      
15820 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
15830 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
15840 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b    else if( c=='{
15850 27 20 29 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20  ' ) level++;.   
15860 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d       else if( c=
15870 3d 27 7d 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a  ='}' ) level--;.
15880 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
15890 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
158a0 3d 3d 27 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69  =='*' ){  /* Ski
158b0 70 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20  p comments */.  
158c0 20 20 20 20 20 20 20 20 69 6e 74 20 70 72 65 76          int prev
158d0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 63 70 20  c;.          cp 
158e0 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20  = &cp[2];.      
158f0 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20      prevc = 0;. 
15900 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
15910 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  (c= *cp)!=0 && (
15920 63 21 3d 27 2f 27 20 7c 7c 20 70 72 65 76 63 21  c!='/' || prevc!
15930 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='*') ){.       
15940 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
15950 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20   ) lineno++;.   
15960 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d           prevc =
15970 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   c;.            
15980 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  cp++;.          
15990 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
159a0 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70  if( c=='/' && cp
159b0 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20  [1]=='/' ){  /* 
159c0 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63  Skip C++ style c
159d0 6f 6d 6d 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20  omments too */. 
159e0 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26 63           cp = &c
159f0 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  p[2];.          
15a00 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
15a10 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20  =0 && c!='\n' ) 
15a20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  cp++;.          
15a30 69 66 28 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b  if( c ) lineno++
15a40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
15a50 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63  if( c=='\'' || c
15a60 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20  =='\"' ){    /* 
15a70 53 74 72 69 6e 67 20 61 20 63 68 61 72 61 63 74  String a charact
15a80 65 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20  er literals */. 
15a90 20 20 20 20 20 20 20 20 20 69 6e 74 20 73 74 61           int sta
15aa0 72 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a 20  rtchar, prevc;. 
15ab0 20 20 20 20 20 20 20 20 20 73 74 61 72 74 63 68           startch
15ac0 61 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  ar = c;.        
15ad0 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20    prevc = 0;.   
15ae0 20 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b         for(cp++;
15af0 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
15b00 28 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c 7c  (c!=startchar ||
15b10 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63   prevc=='\\'); c
15b20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  p++){.          
15b30 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
15b40 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
15b50 20 20 20 20 20 20 69 66 28 20 70 72 65 76 63 3d        if( prevc=
15b60 3d 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d 20  ='\\' ) prevc = 
15b70 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  0;.            e
15b80 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
15b90 20 70 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20   prevc = c;.    
15ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15bb0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
15bc0 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
15bd0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e      ErrorMsg(ps.
15be0 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b 65  filename,ps.toke
15bf0 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64 65  nlineno,."C code
15c00 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69   starting on thi
15c10 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65  s line is not te
15c20 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20  rminated before 
15c30 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
15c40 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ile.");.        
15c50 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  ps.errorcnt++;. 
15c60 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20         nextcp = 
15c70 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  cp;.      }else{
15c80 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20  .        nextcp 
15c90 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a  = cp+1;.      }.
15ca0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53      }else if( IS
15cb0 41 4c 4e 55 4d 28 63 29 20 29 7b 20 20 20 20 20  ALNUM(c) ){     
15cc0 20 20 20 20 20 2f 2a 20 49 64 65 6e 74 69 66 69       /* Identifi
15cd0 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ers */.      whi
15ce0 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
15cf0 26 26 20 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c  && (ISALNUM(c) |
15d00 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b  | c=='_') ) cp++
15d10 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
15d20 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   cp;.    }else i
15d30 66 28 20 63 3d 3d 27 3a 27 20 26 26 20 63 70 5b  f( c==':' && cp[
15d40 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70 5b 32 5d  1]==':' && cp[2]
15d50 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54 68 65 20  =='=' ){ /* The 
15d60 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d 22 20 2a  operator "::=" *
15d70 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 33 3b  /.      cp += 3;
15d80 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20  .      nextcp = 
15d90 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  cp;.    }else if
15da0 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d  ( (c=='/' || c==
15db0 27 7c 27 29 20 26 26 20 49 53 41 4c 50 48 41 28  '|') && ISALPHA(
15dc0 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  cp[1]) ){.      
15dd0 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77  cp += 2;.      w
15de0 68 69 6c 65 28 20 28 63 20 3d 20 2a 63 70 29 21  hile( (c = *cp)!
15df0 3d 30 20 26 26 20 28 49 53 41 4c 4e 55 4d 28 63  =0 && (ISALNUM(c
15e00 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63  ) || c=='_') ) c
15e10 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  p++;.      nextc
15e20 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73  p = cp;.    }els
15e30 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
15e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
15e50 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20 63 68  ll other (one ch
15e60 61 72 61 63 74 65 72 29 20 6f 70 65 72 61 74 6f  aracter) operato
15e70 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b  rs */.      cp++
15e80 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
15e90 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63   cp;.    }.    c
15ea0 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20   = *cp;.    *cp 
15eb0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15ed0 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ull terminate th
15ee0 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70  e token */.    p
15ef0 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26 70 73  arseonetoken(&ps
15f00 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
15f10 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f 6b 65  * Parse the toke
15f20 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d 20 28  n */.    *cp = (
15f30 63 68 61 72 29 63 3b 20 20 20 20 20 20 20 20 20  char)c;         
15f40 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
15f50 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20 2a  ore the buffer *
15f60 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78 74 63  /.    cp = nextc
15f70 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 66 69  p;.  }.  free(fi
15f80 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20 20 20  lebuf);         
15f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
15fa0 6c 65 61 73 65 20 74 68 65 20 62 75 66 66 65 72  lease the buffer
15fb0 20 61 66 74 65 72 20 70 61 72 73 69 6e 67 20 2a   after parsing *
15fc0 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d 20 70  /.  gp->rule = p
15fd0 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20 20 67  s.firstrule;.  g
15fe0 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20 70 73  p->errorcnt = ps
15ff0 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a  .errorcnt;.}./**
16000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16010 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
16020 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 63  he file "plink.c
16030 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
16040 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52  *******/./*.** R
16050 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69  outines processi
16060 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ng configuration
16070 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70   follow-set prop
16080 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a  agation links.**
16090 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
160a0 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
160b0 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
160c0 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72   plink *plink_fr
160d0 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20  eelist = 0;../* 
160e0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
160f0 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74 20 70  link */.struct p
16100 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28  link *Plink_new(
16110 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  ){.  struct plin
16120 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 0a 20 20 69  k *newlink;..  i
16130 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  f( plink_freelis
16140 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t==0 ){.    int 
16150 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d  i;.    int amt =
16160 20 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f   100;.    plink_
16170 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75  freelist = (stru
16180 63 74 20 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c 6f  ct plink *)callo
16190 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73  c( amt, sizeof(s
161a0 74 72 75 63 74 20 70 6c 69 6e 6b 29 20 29 3b 0a  truct plink) );.
161b0 20 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72      if( plink_fr
161c0 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
161d0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
161e0 72 2c 0a 20 20 20 20 20 20 22 55 6e 61 62 6c 65  r,.      "Unable
161f0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
16200 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 66 6f  ory for a new fo
16210 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
16220 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a  tion link.\n");.
16230 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
16240 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
16250 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20  ; i<amt-1; i++) 
16260 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69  plink_freelist[i
16270 5d 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f  ].next = &plink_
16280 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20  freelist[i+1];. 
16290 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73     plink_freelis
162a0 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20  t[amt-1].next = 
162b0 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 6c 69 6e 6b  0;.  }.  newlink
162c0 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73   = plink_freelis
162d0 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  t;.  plink_freel
162e0 69 73 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65  ist = plink_free
162f0 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65  list->next;.  re
16300 74 75 72 6e 20 6e 65 77 6c 69 6e 6b 3b 0a 7d 0a  turn newlink;.}.
16310 0a 2f 2a 20 41 64 64 20 61 20 70 6c 69 6e 6b 20  ./* Add a plink 
16320 74 6f 20 61 20 70 6c 69 6e 6b 20 6c 69 73 74 20  to a plink list 
16330 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64  */.void Plink_ad
16340 64 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  d(struct plink *
16350 2a 70 6c 70 70 2c 20 73 74 72 75 63 74 20 63 6f  *plpp, struct co
16360 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73  nfig *cfp).{.  s
16370 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77  truct plink *new
16380 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b 20  link;.  newlink 
16390 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b 0a 20  = Plink_new();. 
163a0 20 6e 65 77 6c 69 6e 6b 2d 3e 6e 65 78 74 20 3d   newlink->next =
163b0 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70 70 20   *plpp;.  *plpp 
163c0 3d 20 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77  = newlink;.  new
163d0 6c 69 6e 6b 2d 3e 63 66 70 20 3d 20 63 66 70 3b  link->cfp = cfp;
163e0 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66 65 72 20  .}../* Transfer 
163f0 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74  every plink on t
16400 68 65 20 6c 69 73 74 20 22 66 72 6f 6d 22 20 74  he list "from" t
16410 6f 20 74 68 65 20 6c 69 73 74 20 22 74 6f 22 20  o the list "to" 
16420 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f  */.void Plink_co
16430 70 79 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  py(struct plink 
16440 2a 2a 74 6f 2c 20 73 74 72 75 63 74 20 70 6c 69  **to, struct pli
16450 6e 6b 20 2a 66 72 6f 6d 29 0a 7b 0a 20 20 73 74  nk *from).{.  st
16460 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74  ruct plink *next
16470 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66 72 6f  pl;.  while( fro
16480 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20  m ){.    nextpl 
16490 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a 20 20  = from->next;.  
164a0 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d 20 2a    from->next = *
164b0 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20 66 72  to;.    *to = fr
164c0 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d 20 6e  om;.    from = n
164d0 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  extpl;.  }.}../*
164e0 20 44 65 6c 65 74 65 20 65 76 65 72 79 20 70 6c   Delete every pl
164f0 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  ink on the list 
16500 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64 65  */.void Plink_de
16510 6c 65 74 65 28 73 74 72 75 63 74 20 70 6c 69 6e  lete(struct plin
16520 6b 20 2a 70 6c 70 29 0a 7b 0a 20 20 73 74 72 75  k *plp).{.  stru
16530 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c  ct plink *nextpl
16540 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20  ;..  while( plp 
16550 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d 20  ){.    nextpl = 
16560 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 70  plp->next;.    p
16570 6c 70 2d 3e 6e 65 78 74 20 3d 20 70 6c 69 6e 6b  lp->next = plink
16580 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70  _freelist;.    p
16590 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20  link_freelist = 
165a0 70 6c 70 3b 0a 20 20 20 20 70 6c 70 20 3d 20 6e  plp;.    plp = n
165b0 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a  extpl;.  }.}./**
165c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
165d0 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
165e0 69 6c 65 20 22 72 65 70 6f 72 74 2e 63 22 20 2a  ile "report.c" *
165f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
16610 20 50 72 6f 63 65 64 75 72 65 73 20 66 6f 72 20   Procedures for 
16620 67 65 6e 65 72 61 74 69 6e 67 20 72 65 70 6f 72  generating repor
16630 74 73 20 61 6e 64 20 74 61 62 6c 65 73 20 69 6e  ts and tables in
16640 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
16650 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
16660 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 66  ./* Generate a f
16670 69 6c 65 6e 61 6d 65 20 77 69 74 68 20 74 68 65  ilename with the
16680 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e 20 20   given suffix.  
16690 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
166a0 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65 73 20  e.** name comes 
166b0 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
166c0 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
166d0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
166e0 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 50  * function..*/.P
166f0 52 49 56 41 54 45 20 63 68 61 72 20 2a 66 69 6c  RIVATE char *fil
16700 65 5f 6d 61 6b 65 6e 61 6d 65 28 73 74 72 75 63  e_makename(struc
16710 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63  t lemon *lemp, c
16720 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66 66 69  onst char *suffi
16730 78 29 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d  x).{.  char *nam
16740 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a  e;.  char *cp;..
16750 20 20 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29    name = (char*)
16760 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72  malloc( lemonStr
16770 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  len(lemp->filena
16780 6d 65 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65  me) + lemonStrle
16790 6e 28 73 75 66 66 69 78 29 20 2b 20 35 20 29 3b  n(suffix) + 5 );
167a0 0a 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29  .  if( name==0 )
167b0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
167c0 64 65 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f  derr,"Can't allo
167d0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61  cate space for a
167e0 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a   filename.\n");.
167f0 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
16800 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28  .  lemon_strcpy(
16810 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  name,lemp->filen
16820 61 6d 65 29 3b 0a 20 20 63 70 20 3d 20 73 74 72  ame);.  cp = str
16830 72 63 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a  rchr(name,'.');.
16840 20 20 69 66 28 20 63 70 20 29 20 2a 63 70 20 3d    if( cp ) *cp =
16850 20 30 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63   0;.  lemon_strc
16860 61 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b  at(name,suffix);
16870 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a  .  return name;.
16880 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c  }../* Open a fil
16890 65 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62 61  e with a name ba
168a0 73 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20  sed on the name 
168b0 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
168c0 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20 61  e,.** but with a
168d0 20 64 69 66 66 65 72 65 6e 74 20 28 73 70 65 63   different (spec
168e0 69 66 69 65 64 29 20 73 75 66 66 69 78 2c 20 61  ified) suffix, a
168f0 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
16900 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  ter.** to the st
16910 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20  ream */.PRIVATE 
16920 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28  FILE *file_open(
16930 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
16940 2a 6c 65 6d 70 2c 0a 20 20 63 6f 6e 73 74 20 63  *lemp,.  const c
16950 68 61 72 20 2a 73 75 66 66 69 78 2c 0a 20 20 63  har *suffix,.  c
16960 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 0a  onst char *mode.
16970 29 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a  ){.  FILE *fp;..
16980 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e    if( lemp->outn
16990 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d 70 2d  ame ) free(lemp-
169a0 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d  >outname);.  lem
169b0 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c  p->outname = fil
169c0 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c  e_makename(lemp,
169d0 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70 20 3d   suffix);.  fp =
169e0 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74   fopen(lemp->out
169f0 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66  name,mode);.  if
16a00 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65  ( fp==0 && *mode
16a10 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66 70 72  =='w' ){.    fpr
16a20 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
16a30 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25  't open file \"%
16a40 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75  s\".\n",lemp->ou
16a50 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70  tname);.    lemp
16a60 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
16a70 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
16a80 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a    return fp;.}..
16a90 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68 65  /* Duplicate the
16aa0 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69 74 68   input file with
16ab0 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64  out comments and
16ac0 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e 73   without actions
16ad0 20 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f   .** on rules */
16ae0 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73 74  .void Reprint(st
16af0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
16b00 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ).{.  struct rul
16b10 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20  e *rp;.  struct 
16b20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e  symbol *sp;.  in
16b30 74 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20  t i, j, maxlen, 
16b40 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73  len, ncolumns, s
16b50 6b 69 70 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f  kip;.  printf("/
16b60 2f 20 52 65 70 72 69 6e 74 20 6f 66 20 69 6e 70  / Reprint of inp
16b70 75 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c  ut file \"%s\".\
16b80 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c  n// Symbols:\n",
16b90 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
16ba0 0a 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a  .  maxlen = 10;.
16bb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
16bc0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
16bd0 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d  {.    sp = lemp-
16be0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
16bf0 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c   len = lemonStrl
16c00 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  en(sp->name);.  
16c10 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e    if( len>maxlen
16c20 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b   ) maxlen = len;
16c30 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20  .  }.  ncolumns 
16c40 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b  = 76/(maxlen+5);
16c50 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c  .  if( ncolumns<
16c60 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31  1 ) ncolumns = 1
16c70 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70  ;.  skip = (lemp
16c80 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c  ->nsymbol + ncol
16c90 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d  umns - 1)/ncolum
16ca0 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ns;.  for(i=0; i
16cb0 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  <skip; i++){.   
16cc0 20 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20   printf("//");. 
16cd0 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65     for(j=i; j<le
16ce0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d  mp->nsymbol; j+=
16cf0 73 6b 69 70 29 7b 0a 20 20 20 20 20 20 73 70 20  skip){.      sp 
16d00 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
16d10 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  j];.      assert
16d20 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29  ( sp->index==j )
16d30 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  ;.      printf("
16d40 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d   %3d %-*.*s",j,m
16d50 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d  axlen,maxlen,sp-
16d60 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  >name);.    }.  
16d70 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a    printf("\n");.
16d80 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d    }.  for(rp=lem
16d90 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
16da0 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 70  rp->next){.    p
16db0 72 69 6e 74 66 28 22 25 73 22 2c 72 70 2d 3e 6c  rintf("%s",rp->l
16dc0 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f  hs->name);.    /
16dd0 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73  *    if( rp->lhs
16de0 61 6c 69 61 73 20 29 20 70 72 69 6e 74 66 28 22  alias ) printf("
16df0 28 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69  (%s)",rp->lhsali
16e00 61 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e  as); */.    prin
16e10 74 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20  tf(" ::=");.    
16e20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
16e30 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
16e40 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d   sp = rp->rhs[i]
16e50 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e  ;.      if( sp->
16e60 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
16e70 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  NAL ){.        p
16e80 72 69 6e 74 66 28 22 20 25 73 22 2c 20 73 70 2d  rintf(" %s", sp-
16e90 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65  >subsym[0]->name
16ea0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  );.        for(j
16eb0 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79  =1; j<sp->nsubsy
16ec0 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; j++){.       
16ed0 20 20 20 70 72 69 6e 74 66 28 22 7c 25 73 22 2c     printf("|%s",
16ee0 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e   sp->subsym[j]->
16ef0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
16f00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16f10 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25        printf(" %
16f20 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  s", sp->name);. 
16f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
16f40 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
16f50 5b 69 5d 20 29 20 70 72 69 6e 74 66 28 22 28 25  [i] ) printf("(%
16f60 73 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  s)",rp->rhsalias
16f70 5b 69 5d 29 3b 20 2a 2f 0a 20 20 20 20 7d 0a 20  [i]); */.    }. 
16f80 20 20 20 70 72 69 6e 74 66 28 22 2e 22 29 3b 0a     printf(".");.
16f90 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63      if( rp->prec
16fa0 73 79 6d 20 29 20 70 72 69 6e 74 66 28 22 20 5b  sym ) printf(" [
16fb0 25 73 5d 22 2c 72 70 2d 3e 70 72 65 63 73 79 6d  %s]",rp->precsym
16fc0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20  ->name);.    /* 
16fd0 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 20 70  if( rp->code ) p
16fe0 72 69 6e 74 66 28 22 5c 6e 20 20 20 20 25 73 22  rintf("\n    %s"
16ff0 2c 72 70 2d 3e 63 6f 64 65 29 3b 20 2a 2f 0a 20  ,rp->code); */. 
17000 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
17010 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74  .  }.}../* Print
17020 20 61 20 73 69 6e 67 6c 65 20 72 75 6c 65 2e 0a   a single rule..
17030 2a 2f 0a 76 6f 69 64 20 52 75 6c 65 50 72 69 6e  */.void RulePrin
17040 74 28 46 49 4c 45 20 2a 66 70 2c 20 73 74 72 75  t(FILE *fp, stru
17050 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 69 6e 74  ct rule *rp, int
17060 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 73 74 72   iCursor){.  str
17070 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
17080 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 70    int i, j;.  fp
17090 72 69 6e 74 66 28 66 70 2c 22 25 73 20 3a 3a 3d  rintf(fp,"%s ::=
170a0 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29  ",rp->lhs->name)
170b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
170c0 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
170d0 20 20 20 20 69 66 28 20 69 3d 3d 69 43 75 72 73      if( i==iCurs
170e0 6f 72 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c  or ) fprintf(fp,
170f0 22 20 2a 22 29 3b 0a 20 20 20 20 69 66 28 20 69  " *");.    if( i
17100 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 62 72 65  ==rp->nrhs ) bre
17110 61 6b 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d  ak;.    sp = rp-
17120 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >rhs[i];.    if(
17130 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
17140 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
17150 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25    fprintf(fp," %
17160 73 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30  s", sp->subsym[0
17170 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
17180 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e  for(j=1; j<sp->n
17190 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20  subsym; j++){.  
171a0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
171b0 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62 73 79  ,"|%s",sp->subsy
171c0 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  m[j]->name);.   
171d0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
171e0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
171f0 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65  ," %s", sp->name
17200 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
17210 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 72 75 6c  /* Print the rul
17220 65 20 66 6f 72 20 61 20 63 6f 6e 66 69 67 75 72  e for a configur
17230 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 43  ation..*/.void C
17240 6f 6e 66 69 67 50 72 69 6e 74 28 46 49 4c 45 20  onfigPrint(FILE 
17250 2a 66 70 2c 20 73 74 72 75 63 74 20 63 6f 6e 66  *fp, struct conf
17260 69 67 20 2a 63 66 70 29 7b 0a 20 20 52 75 6c 65  ig *cfp){.  Rule
17270 50 72 69 6e 74 28 66 70 2c 20 63 66 70 2d 3e 72  Print(fp, cfp->r
17280 70 2c 20 63 66 70 2d 3e 64 6f 74 29 3b 0a 7d 0a  p, cfp->dot);.}.
17290 0a 2f 2a 20 23 64 65 66 69 6e 65 20 54 45 53 54  ./* #define TEST
172a0 20 2a 2f 0a 23 69 66 20 30 0a 2f 2a 20 50 72 69   */.#if 0./* Pri
172b0 6e 74 20 61 20 73 65 74 20 2a 2f 0a 50 52 49 56  nt a set */.PRIV
172c0 41 54 45 20 76 6f 69 64 20 53 65 74 50 72 69 6e  ATE void SetPrin
172d0 74 28 6f 75 74 2c 73 65 74 2c 6c 65 6d 70 29 0a  t(out,set,lemp).
172e0 46 49 4c 45 20 2a 6f 75 74 3b 0a 63 68 61 72 20  FILE *out;.char 
172f0 2a 73 65 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d  *set;.struct lem
17300 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
17310 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 73 70 61  t i;.  char *spa
17320 63 65 72 3b 0a 20 20 73 70 61 63 65 72 20 3d 20  cer;.  spacer = 
17330 22 22 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  "";.  fprintf(ou
17340 74 2c 22 25 31 32 73 5b 22 2c 22 22 29 3b 0a 20  t,"%12s[","");. 
17350 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
17360 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b  ->nterminal; i++
17370 29 7b 0a 20 20 20 20 69 66 28 20 53 65 74 46 69  ){.    if( SetFi
17380 6e 64 28 73 65 74 2c 69 29 20 29 7b 0a 20 20 20  nd(set,i) ){.   
17390 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
173a0 25 73 25 73 22 2c 73 70 61 63 65 72 2c 6c 65 6d  %s%s",spacer,lem
173b0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
173c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 70 61 63  ame);.      spac
173d0 65 72 20 3d 20 22 20 22 3b 0a 20 20 20 20 7d 0a  er = " ";.    }.
173e0 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
173f0 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20  t,"]\n");.}../* 
17400 50 72 69 6e 74 20 61 20 70 6c 69 6e 6b 20 63 68  Print a plink ch
17410 61 69 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  ain */.PRIVATE v
17420 6f 69 64 20 50 6c 69 6e 6b 50 72 69 6e 74 28 6f  oid PlinkPrint(o
17430 75 74 2c 70 6c 70 2c 74 61 67 29 0a 46 49 4c 45  ut,plp,tag).FILE
17440 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 70 6c   *out;.struct pl
17450 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61 72 20 2a  ink *plp;.char *
17460 74 61 67 3b 0a 7b 0a 20 20 77 68 69 6c 65 28 20  tag;.{.  while( 
17470 70 6c 70 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  plp ){.    fprin
17480 74 66 28 6f 75 74 2c 22 25 31 32 73 25 73 20 28  tf(out,"%12s%s (
17490 73 74 61 74 65 20 25 32 64 29 20 22 2c 22 22 2c  state %2d) ","",
174a0 74 61 67 2c 70 6c 70 2d 3e 63 66 70 2d 3e 73 74  tag,plp->cfp->st
174b0 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20  p->statenum);.  
174c0 20 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 6f 75    ConfigPrint(ou
174d0 74 2c 70 6c 70 2d 3e 63 66 70 29 3b 0a 20 20 20  t,plp->cfp);.   
174e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e   fprintf(out,"\n
174f0 22 29 3b 0a 20 20 20 20 70 6c 70 20 3d 20 70 6c  ");.    plp = pl
17500 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23  p->next;.  }.}.#
17510 65 6e 64 69 66 0a 0a 2f 2a 20 50 72 69 6e 74 20  endif../* Print 
17520 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65  an action to the
17530 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
17540 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
17550 46 41 4c 53 45 20 69 66 0a 2a 2a 20 6e 6f 74 68  FALSE if.** noth
17560 69 6e 67 20 77 61 73 20 61 63 74 75 61 6c 6c 79  ing was actually
17570 20 70 72 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74   printed..*/.int
17580 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 0a 20 20   PrintAction(.  
17590 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
175a0 70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  p,          /* T
175b0 68 65 20 61 63 74 69 6f 6e 20 74 6f 20 70 72 69  he action to pri
175c0 6e 74 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 66 70  nt */.  FILE *fp
175d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
175e0 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 74 68 65      /* Print the
175f0 20 61 63 74 69 6f 6e 20 68 65 72 65 20 2a 2f 0a   action here */.
17600 20 20 69 6e 74 20 69 6e 64 65 6e 74 20 20 20 20    int indent    
17610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17620 20 49 6e 64 65 6e 74 20 62 79 20 74 68 69 73 20   Indent by this 
17630 61 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  amount */.){.  i
17640 6e 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20  nt result = 1;. 
17650 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70   switch( ap->typ
17660 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48  e ){.    case SH
17670 49 46 54 3a 20 7b 0a 20 20 20 20 20 20 73 74 72  IFT: {.      str
17680 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 20 3d  uct state *stp =
17690 20 61 70 2d 3e 78 2e 73 74 70 3b 0a 20 20 20 20   ap->x.stp;.    
176a0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
176b0 73 20 73 68 69 66 74 20 20 20 20 20 20 20 20 25  s shift        %
176c0 2d 37 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  -7d",indent,ap->
176d0 73 70 2d 3e 6e 61 6d 65 2c 73 74 70 2d 3e 73 74  sp->name,stp->st
176e0 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62  atenum);.      b
176f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
17700 63 61 73 65 20 52 45 44 55 43 45 3a 20 7b 0a 20  case REDUCE: {. 
17710 20 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65       struct rule
17720 20 2a 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b   *rp = ap->x.rp;
17730 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
17740 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 20 20  p,"%*s reduce   
17750 20 20 20 20 25 2d 37 64 22 2c 69 6e 64 65 6e 74      %-7d",indent
17760 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 72 70  ,ap->sp->name,rp
17770 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
17780 52 75 6c 65 50 72 69 6e 74 28 66 70 2c 20 72 70  RulePrint(fp, rp
17790 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , -1);.      bre
177a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
177b0 73 65 20 53 48 49 46 54 52 45 44 55 43 45 3a 20  se SHIFTREDUCE: 
177c0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 72  {.      struct r
177d0 75 6c 65 20 2a 72 70 20 3d 20 61 70 2d 3e 78 2e  ule *rp = ap->x.
177e0 72 70 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  rp;.      fprint
177f0 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 2d  f(fp,"%*s shift-
17800 72 65 64 75 63 65 20 25 2d 37 64 22 2c 69 6e 64  reduce %-7d",ind
17810 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
17820 2c 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  ,rp->index);.   
17830 20 20 20 52 75 6c 65 50 72 69 6e 74 28 66 70 2c     RulePrint(fp,
17840 20 72 70 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20   rp, -1);.      
17850 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
17860 20 63 61 73 65 20 41 43 43 45 50 54 3a 0a 20 20   case ACCEPT:.  
17870 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
17880 25 2a 73 20 61 63 63 65 70 74 22 2c 69 6e 64 65  %*s accept",inde
17890 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29  nt,ap->sp->name)
178a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
178b0 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a 0a 20     case ERROR:. 
178c0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
178d0 22 25 2a 73 20 65 72 72 6f 72 22 2c 69 6e 64 65  "%*s error",inde
178e0 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29  nt,ap->sp->name)
178f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
17900 20 20 20 63 61 73 65 20 53 52 43 4f 4e 46 4c 49     case SRCONFLI
17910 43 54 3a 0a 20 20 20 20 63 61 73 65 20 52 52 43  CT:.    case RRC
17920 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20 66  ONFLICT:.      f
17930 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 72  printf(fp,"%*s r
17940 65 64 75 63 65 20 20 20 20 20 20 20 25 2d 37 64  educe       %-7d
17950 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66   ** Parsing conf
17960 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20  lict **",.      
17970 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d    indent,ap->sp-
17980 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e  >name,ap->x.rp->
17990 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72  index);.      br
179a0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53  eak;.    case SS
179b0 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20  CONFLICT:.      
179c0 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
179d0 73 68 69 66 74 20 20 20 20 20 20 20 20 25 2d 37  shift        %-7
179e0 64 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e  d ** Parsing con
179f0 66 6c 69 63 74 20 2a 2a 22 2c 20 0a 20 20 20 20  flict **", .    
17a00 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73      indent,ap->s
17a10 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74  p->name,ap->x.st
17a20 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20  p->statenum);.  
17a30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
17a40 61 73 65 20 53 48 5f 52 45 53 4f 4c 56 45 44 3a  ase SH_RESOLVED:
17a50 0a 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 50  .      if( showP
17a60 72 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63  recedenceConflic
17a70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  t ){.        fpr
17a80 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69  intf(fp,"%*s shi
17a90 66 74 20 20 20 20 20 20 20 20 25 2d 37 64 20 2d  ft        %-7d -
17aa0 2d 20 64 72 6f 70 70 65 64 20 62 79 20 70 72 65  - dropped by pre
17ab0 63 65 64 65 6e 63 65 22 2c 0a 20 20 20 20 20 20  cedence",.      
17ac0 20 20 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74            indent
17ad0 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70  ,ap->sp->name,ap
17ae0 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75  ->x.stp->statenu
17af0 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
17b00 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20  .        result 
17b10 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
17b20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
17b30 73 65 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a  se RD_RESOLVED:.
17b40 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 50 72        if( showPr
17b50 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63 74  ecedenceConflict
17b60 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
17b70 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75  ntf(fp,"%*s redu
17b80 63 65 20 25 2d 37 64 20 2d 2d 20 64 72 6f 70 70  ce %-7d -- dropp
17b90 65 64 20 62 79 20 70 72 65 63 65 64 65 6e 63 65  ed by precedence
17ba0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
17bb0 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70     indent,ap->sp
17bc0 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d  ->name,ap->x.rp-
17bd0 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d  >index);.      }
17be0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
17bf0 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sult = 0;.      
17c00 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
17c10 20 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44     case NOT_USED
17c20 3a 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d  :.      result =
17c30 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
17c40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
17c50 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  sult;.}../* Gene
17c60 72 61 74 65 20 74 68 65 20 22 2a 2e 6f 75 74 22  rate the "*.out"
17c70 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76 6f 69   log file */.voi
17c80 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 73  d ReportOutput(s
17c90 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
17ca0 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p).{.  int i;.  
17cb0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
17cc0 70 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  p;.  struct conf
17cd0 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63  ig *cfp;.  struc
17ce0 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20  t action *ap;.  
17cf0 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 66 70 20  FILE *fp;..  fp 
17d00 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70  = file_open(lemp
17d10 2c 22 2e 6f 75 74 22 2c 22 77 62 22 29 3b 0a 20  ,".out","wb");. 
17d20 20 69 66 28 20 66 70 3d 3d 30 20 29 20 72 65 74   if( fp==0 ) ret
17d30 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
17d40 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b  i<lemp->nxstate;
17d50 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
17d60 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
17d70 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70  ;.    fprintf(fp
17d80 2c 22 53 74 61 74 65 20 25 64 3a 5c 6e 22 2c 73  ,"State %d:\n",s
17d90 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20  tp->statenum);. 
17da0 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73     if( lemp->bas
17db0 69 73 66 6c 61 67 20 29 20 63 66 70 3d 73 74 70  isflag ) cfp=stp
17dc0 2d 3e 62 70 3b 0a 20 20 20 20 65 6c 73 65 20 20  ->bp;.    else  
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 0a 20 20  cfp=stp->cfp;.  
17df0 20 20 77 68 69 6c 65 28 20 63 66 70 20 29 7b 0a    while( cfp ){.
17e00 20 20 20 20 20 20 63 68 61 72 20 62 75 66 5b 32        char buf[2
17e10 30 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 66  0];.      if( cf
17e20 70 2d 3e 64 6f 74 3d 3d 63 66 70 2d 3e 72 70 2d  p->dot==cfp->rp-
17e30 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  >nrhs ){.       
17e40 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 62   lemon_sprintf(b
17e50 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d 3e 72  uf,"(%d)",cfp->r
17e60 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  p->index);.     
17e70 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20     fprintf(fp," 
17e80 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b 0a 20     %5s ",buf);. 
17e90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17ea0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
17eb0 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a 20 20            ");.  
17ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f 6e 66      }.      Conf
17ed0 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70 29 3b  igPrint(fp,cfp);
17ee0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
17ef0 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20 30 0a 20  p,"\n");.#if 0. 
17f00 20 20 20 20 20 53 65 74 50 72 69 6e 74 28 66 70       SetPrint(fp
17f10 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70 29 3b  ,cfp->fws,lemp);
17f20 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e  .      PlinkPrin
17f30 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70 2c 22  t(fp,cfp->fplp,"
17f40 54 6f 20 20 22 29 3b 0a 20 20 20 20 20 20 50 6c  To  ");.      Pl
17f50 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70 2d  inkPrint(fp,cfp-
17f60 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b 0a 23  >bplp,"From");.#
17f70 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
17f80 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20  lemp->basisflag 
17f90 29 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b 0a 20  ) cfp=cfp->bp;. 
17fa0 20 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20       else       
17fb0 20 20 20 20 20 20 20 20 20 20 20 63 66 70 3d 63             cfp=c
17fc0 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a  fp->next;.    }.
17fd0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
17fe0 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70  \n");.    for(ap
17ff0 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
18000 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
18010 20 20 69 66 28 20 50 72 69 6e 74 41 63 74 69 6f    if( PrintActio
18020 6e 28 61 70 2c 66 70 2c 33 30 29 20 29 20 66 70  n(ap,fp,30) ) fp
18030 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a  rintf(fp,"\n");.
18040 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
18050 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a  f(fp,"\n");.  }.
18060 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 2d    fprintf(fp, "-
18070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
180a0 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70 72 69 6e  ---\n");.  fprin
180b0 74 66 28 66 70 2c 20 22 53 79 6d 62 6f 6c 73 3a  tf(fp, "Symbols:
180c0 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  \n");.  for(i=0;
180d0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
180e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
180f0 6a 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79  j;.    struct sy
18100 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 20 20 73  mbol *sp;..    s
18110 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
18120 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74  s[i];.    fprint
18130 66 28 66 70 2c 20 22 20 20 25 33 64 3a 20 25 73  f(fp, "  %3d: %s
18140 22 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b  ", i, sp->name);
18150 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
18160 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29  e==NONTERMINAL )
18170 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
18180 66 70 2c 20 22 3a 22 29 3b 0a 20 20 20 20 20 20  fp, ":");.      
18190 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61 20 29  if( sp->lambda )
181a0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
181b0 66 28 66 70 2c 20 22 20 3c 6c 61 6d 62 64 61 3e  f(fp, " <lambda>
181c0 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
181d0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d    for(j=0; j<lem
181e0 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b  p->nterminal; j+
181f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
18200 73 70 2d 3e 66 69 72 73 74 73 65 74 20 26 26 20  sp->firstset && 
18210 53 65 74 46 69 6e 64 28 73 70 2d 3e 66 69 72 73  SetFind(sp->firs
18220 74 73 65 74 2c 20 6a 29 20 29 7b 0a 20 20 20 20  tset, j) ){.    
18230 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
18240 2c 20 22 20 25 73 22 2c 20 6c 65 6d 70 2d 3e 73  , " %s", lemp->s
18250 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d 65 29  ymbols[j]->name)
18260 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18270 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70    }.    }.    fp
18280 72 69 6e 74 66 28 66 70 2c 20 22 5c 6e 22 29 3b  rintf(fp, "\n");
18290 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70  .  }.  fclose(fp
182a0 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
182b0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
182c0 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20 77 68  e file "name" wh
182d0 69 63 68 20 69 73 20 69 6e 20 74 68 65 20 73 61  ich is in the sa
182e0 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a  me directory as.
182f0 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61 62 6c  ** the exacutabl
18300 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61  e */.PRIVATE cha
18310 72 20 2a 70 61 74 68 73 65 61 72 63 68 28 63 68  r *pathsearch(ch
18320 61 72 20 2a 61 72 67 76 30 2c 20 63 68 61 72 20  ar *argv0, char 
18330 2a 6e 61 6d 65 2c 20 69 6e 74 20 6d 6f 64 65 6d  *name, int modem
18340 61 73 6b 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63  ask).{.  const c
18350 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b 0a 20  har *pathlist;. 
18360 20 63 68 61 72 20 2a 70 61 74 68 62 75 66 70 74   char *pathbufpt
18370 72 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68 62  r;.  char *pathb
18380 75 66 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68  uf;.  char *path
18390 2c 2a 63 70 3b 0a 20 20 63 68 61 72 20 63 3b 0a  ,*cp;.  char c;.
183a0 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33 32 5f  .#ifdef __WIN32_
183b0 5f 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72  _.  cp = strrchr
183c0 28 61 72 67 76 30 2c 27 5c 5c 27 29 3b 0a 23 65  (argv0,'\\');.#e
183d0 6c 73 65 0a 20 20 63 70 20 3d 20 73 74 72 72 63  lse.  cp = strrc
183e0 68 72 28 61 72 67 76 30 2c 27 2f 27 29 3b 0a 23  hr(argv0,'/');.#
183f0 65 6e 64 69 66 0a 20 20 69 66 28 20 63 70 20 29  endif.  if( cp )
18400 7b 0a 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20  {.    c = *cp;. 
18410 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20     *cp = 0;.    
18420 70 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d  path = (char *)m
18430 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
18440 65 6e 28 61 72 67 76 30 29 20 2b 20 6c 65 6d 6f  en(argv0) + lemo
18450 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29 20 2b 20  nStrlen(name) + 
18460 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 74  2 );.    if( pat
18470 68 20 29 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74  h ) lemon_sprint
18480 66 28 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 61  f(path,"%s/%s",a
18490 72 67 76 30 2c 6e 61 6d 65 29 3b 0a 20 20 20 20  rgv0,name);.    
184a0 2a 63 70 20 3d 20 63 3b 0a 20 20 7d 65 6c 73 65  *cp = c;.  }else
184b0 7b 0a 20 20 20 20 70 61 74 68 6c 69 73 74 20 3d  {.    pathlist =
184c0 20 67 65 74 65 6e 76 28 22 50 41 54 48 22 29 3b   getenv("PATH");
184d0 0a 20 20 20 20 69 66 28 20 70 61 74 68 6c 69 73  .    if( pathlis
184e0 74 3d 3d 30 20 29 20 70 61 74 68 6c 69 73 74 20  t==0 ) pathlist 
184f0 3d 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f 62  = ".:/bin:/usr/b
18500 69 6e 22 3b 0a 20 20 20 20 70 61 74 68 62 75 66  in";.    pathbuf
18510 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c   = (char *) mall
18520 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
18530 70 61 74 68 6c 69 73 74 29 20 2b 20 31 20 29 3b  pathlist) + 1 );
18540 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63 68 61  .    path = (cha
18550 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f  r *)malloc( lemo
18560 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c 69 73 74  nStrlen(pathlist
18570 29 2b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61  )+lemonStrlen(na
18580 6d 65 29 2b 32 20 29 3b 0a 20 20 20 20 69 66 28  me)+2 );.    if(
18590 20 28 70 61 74 68 62 75 66 20 21 3d 20 30 29 20   (pathbuf != 0) 
185a0 26 26 20 28 70 61 74 68 21 3d 30 29 20 29 7b 0a  && (path!=0) ){.
185b0 20 20 20 20 20 20 70 61 74 68 62 75 66 70 74 72        pathbufptr
185c0 20 3d 20 70 61 74 68 62 75 66 3b 0a 20 20 20 20   = pathbuf;.    
185d0 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 70    lemon_strcpy(p
185e0 61 74 68 62 75 66 2c 20 70 61 74 68 6c 69 73 74  athbuf, pathlist
185f0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
18600 2a 70 61 74 68 62 75 66 20 29 7b 0a 20 20 20 20  *pathbuf ){.    
18610 20 20 20 20 63 70 20 3d 20 73 74 72 63 68 72 28      cp = strchr(
18620 70 61 74 68 62 75 66 2c 27 3a 27 29 3b 0a 20 20  pathbuf,':');.  
18630 20 20 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20        if( cp==0 
18640 29 20 63 70 20 3d 20 26 70 61 74 68 62 75 66 5b  ) cp = &pathbuf[
18650 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68  lemonStrlen(path
18660 62 75 66 29 5d 3b 0a 20 20 20 20 20 20 20 20 63  buf)];.        c
18670 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20 20 20   = *cp;.        
18680 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  *cp = 0;.       
18690 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 70   lemon_sprintf(p
186a0 61 74 68 2c 22 25 73 2f 25 73 22 2c 70 61 74 68  ath,"%s/%s",path
186b0 62 75 66 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  buf,name);.     
186c0 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 20 20     *cp = c;.    
186d0 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 70      if( c==0 ) p
186e0 61 74 68 62 75 66 5b 30 5d 20 3d 20 30 3b 0a 20  athbuf[0] = 0;. 
186f0 20 20 20 20 20 20 20 65 6c 73 65 20 70 61 74 68         else path
18700 62 75 66 20 3d 20 26 63 70 5b 31 5d 3b 0a 20 20  buf = &cp[1];.  
18710 20 20 20 20 20 20 69 66 28 20 61 63 63 65 73 73        if( access
18720 28 70 61 74 68 2c 6d 6f 64 65 6d 61 73 6b 29 3d  (path,modemask)=
18730 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
18740 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28 70    }.      free(p
18750 61 74 68 62 75 66 70 74 72 29 3b 0a 20 20 20 20  athbufptr);.    
18760 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
18770 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69 76 65 6e  ath;.}../* Given
18780 20 61 6e 20 61 63 74 69 6f 6e 2c 20 63 6f 6d 70   an action, comp
18790 75 74 65 20 74 68 65 20 69 6e 74 65 67 65 72 20  ute the integer 
187a0 76 61 6c 75 65 20 66 6f 72 20 74 68 61 74 20 61  value for that a
187b0 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 69  ction.** which i
187c0 73 20 74 6f 20 62 65 20 70 75 74 20 69 6e 20 74  s to be put in t
187d0 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  he action table 
187e0 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
187f0 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 52 65 74   machine..** Ret
18800 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66 20  urn negative if 
18810 6e 6f 20 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64  no action should
18820 20 62 65 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a   be generated..*
18830 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 63 6f  /.PRIVATE int co
18840 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 73 74 72  mpute_action(str
18850 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
18860 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
18870 61 70 29 0a 7b 0a 20 20 69 6e 74 20 61 63 74 3b  ap).{.  int act;
18880 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74  .  switch( ap->t
18890 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
188a0 53 48 49 46 54 3a 20 20 61 63 74 20 3d 20 61 70  SHIFT:  act = ap
188b0 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75  ->x.stp->statenu
188c0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
188d0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
188e0 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54 52  .    case SHIFTR
188f0 45 44 55 43 45 3a 20 61 63 74 20 3d 20 61 70 2d  EDUCE: act = ap-
18900 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2b 20 6c  >x.rp->index + l
18910 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 20 20 20  emp->nstate;    
18920 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
18930 61 73 65 20 52 45 44 55 43 45 3a 20 61 63 74 20  ase REDUCE: act 
18940 3d 20 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65  = ap->x.rp->inde
18950 78 20 2b 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  x + lemp->nstate
18960 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 20 62 72  +lemp->nrule; br
18970 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52  eak;.    case ER
18980 52 4f 52 3a 20 20 61 63 74 20 3d 20 6c 65 6d 70  ROR:  act = lemp
18990 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d  ->nstate + lemp-
189a0 3e 6e 72 75 6c 65 2a 32 3b 20 20 20 20 20 20 20  >nrule*2;       
189b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
189c0 20 20 20 63 61 73 65 20 41 43 43 45 50 54 3a 20     case ACCEPT: 
189d0 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  act = lemp->nsta
189e0 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
189f0 2a 32 20 2b 20 31 3b 20 20 20 20 20 20 20 20 20  *2 + 1;         
18a00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
18a10 61 75 6c 74 3a 20 20 20 20 20 61 63 74 20 3d 20  ault:     act = 
18a20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  -1; break;.  }. 
18a30 20 72 65 74 75 72 6e 20 61 63 74 3b 0a 7d 0a 0a   return act;.}..
18a40 23 64 65 66 69 6e 65 20 4c 49 4e 45 53 49 5a 45  #define LINESIZE
18a50 20 31 30 30 30 0a 2f 2a 20 54 68 65 20 6e 65 78   1000./* The nex
18a60 74 20 63 6c 75 73 74 65 72 20 6f 66 20 72 6f 75  t cluster of rou
18a70 74 69 6e 65 73 20 61 72 65 20 66 6f 72 20 72 65  tines are for re
18a80 61 64 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61  ading the templa
18a90 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 77  te file.** and w
18aa0 72 69 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c  riting the resul
18ab0 74 73 20 74 6f 20 74 68 65 20 67 65 6e 65 72 61  ts to the genera
18ac0 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 2f 2a  ted parser */./*
18ad0 20 54 68 65 20 66 69 72 73 74 20 66 75 6e 63 74   The first funct
18ae0 69 6f 6e 20 74 72 61 6e 73 66 65 72 73 20 64 61  ion transfers da
18af0 74 61 20 66 72 6f 6d 20 22 69 6e 22 20 74 6f 20  ta from "in" to 
18b00 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a 2a 20 61  "out" until.** a
18b10 20 6c 69 6e 65 20 69 73 20 73 65 65 6e 20 77 68   line is seen wh
18b20 69 63 68 20 62 65 67 69 6e 73 20 77 69 74 68 20  ich begins with 
18b30 22 25 25 22 2e 20 20 54 68 65 20 6c 69 6e 65 20  "%%".  The line 
18b40 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 74 72 61  number is.** tra
18b50 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6e  cked..**.** if n
18b60 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20 61 6e 79  ame!=0, then any
18b70 20 77 6f 72 64 20 74 68 61 74 20 62 65 67 69 6e   word that begin
18b80 20 77 69 74 68 20 22 50 61 72 73 65 22 20 69 73   with "Parse" is
18b90 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a 2a 20 62   changed to.** b
18ba0 65 67 69 6e 20 77 69 74 68 20 2a 6e 61 6d 65 20  egin with *name 
18bb0 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50 52 49 56  instead..*/.PRIV
18bc0 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 78 66  ATE void tplt_xf
18bd0 65 72 28 63 68 61 72 20 2a 6e 61 6d 65 2c 20 46  er(char *name, F
18be0 49 4c 45 20 2a 69 6e 2c 20 46 49 4c 45 20 2a 6f  ILE *in, FILE *o
18bf0 75 74 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29  ut, int *lineno)
18c00 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 69 53 74 61  .{.  int i, iSta
18c10 72 74 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b  rt;.  char line[
18c20 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 77 68 69  LINESIZE];.  whi
18c30 6c 65 28 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c  le( fgets(line,L
18c40 49 4e 45 53 49 5a 45 2c 69 6e 29 20 26 26 20 28  INESIZE,in) && (
18c50 6c 69 6e 65 5b 30 5d 21 3d 27 25 27 20 7c 7c 20  line[0]!='%' || 
18c60 6c 69 6e 65 5b 31 5d 21 3d 27 25 27 29 20 29 7b  line[1]!='%') ){
18c70 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  .    (*lineno)++
18c80 3b 0a 20 20 20 20 69 53 74 61 72 74 20 3d 20 30  ;.    iStart = 0
18c90 3b 0a 20 20 20 20 69 66 28 20 6e 61 6d 65 20 29  ;.    if( name )
18ca0 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
18cb0 20 6c 69 6e 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   line[i]; i++){.
18cc0 20 20 20 20 20 20 20 20 69 66 28 20 6c 69 6e 65          if( line
18cd0 5b 69 5d 3d 3d 27 50 27 20 26 26 20 73 74 72 6e  [i]=='P' && strn
18ce0 63 6d 70 28 26 6c 69 6e 65 5b 69 5d 2c 22 50 61  cmp(&line[i],"Pa
18cf0 72 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20 20  rse",5)==0.     
18d00 20 20 20 20 20 26 26 20 28 69 3d 3d 30 20 7c 7c       && (i==0 ||
18d10 20 21 49 53 41 4c 50 48 41 28 6c 69 6e 65 5b 69   !ISALPHA(line[i
18d20 2d 31 5d 29 29 0a 20 20 20 20 20 20 20 20 29 7b  -1])).        ){
18d30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
18d40 3e 69 53 74 61 72 74 20 29 20 66 70 72 69 6e 74  >iStart ) fprint
18d50 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2d 69  f(out,"%.*s",i-i
18d60 53 74 61 72 74 2c 26 6c 69 6e 65 5b 69 53 74 61  Start,&line[iSta
18d70 72 74 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rt]);.          
18d80 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22  fprintf(out,"%s"
18d90 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ,name);.        
18da0 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20    i += 4;.      
18db0 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31      iStart = i+1
18dc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18dd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70    }.    }.    fp
18de0 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 26  rintf(out,"%s",&
18df0 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20  line[iStart]);. 
18e00 20 7d 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6e 65 78   }.}../* The nex
18e10 74 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  t function finds
18e20 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69   the template fi
18e30 6c 65 20 61 6e 64 20 6f 70 65 6e 73 20 69 74 2c  le and opens it,
18e40 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 20   returning.** a 
18e50 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f  pointer to the o
18e60 70 65 6e 65 64 20 66 69 6c 65 2e 20 2a 2f 0a 50  pened file. */.P
18e70 52 49 56 41 54 45 20 46 49 4c 45 20 2a 74 70 6c  RIVATE FILE *tpl
18e80 74 5f 6f 70 65 6e 28 73 74 72 75 63 74 20 6c 65  t_open(struct le
18e90 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73  mon *lemp).{.  s
18ea0 74 61 74 69 63 20 63 68 61 72 20 74 65 6d 70 6c  tatic char templ
18eb0 61 74 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d  atename[] = "lem
18ec0 70 61 72 2e 63 22 3b 0a 20 20 63 68 61 72 20 62  par.c";.  char b
18ed0 75 66 5b 31 30 30 30 5d 3b 0a 20 20 46 49 4c 45  uf[1000];.  FILE
18ee0 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 74 70   *in;.  char *tp
18ef0 6c 74 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a  ltname;.  char *
18f00 63 70 3b 0a 0a 20 20 2f 2a 20 66 69 72 73 74 2c  cp;..  /* first,
18f10 20 73 65 65 20 69 66 20 75 73 65 72 20 73 70 65   see if user spe
18f20 63 69 66 69 65 64 20 61 20 74 65 6d 70 6c 61 74  cified a templat
18f30 65 20 66 69 6c 65 6e 61 6d 65 20 6f 6e 20 74 68  e filename on th
18f40 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20  e command line. 
18f50 2a 2f 0a 20 20 69 66 20 28 75 73 65 72 5f 74 65  */.  if (user_te
18f60 6d 70 6c 61 74 65 6e 61 6d 65 20 21 3d 20 30 29  mplatename != 0)
18f70 20 7b 0a 20 20 20 20 69 66 28 20 61 63 63 65 73   {.    if( acces
18f80 73 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e  s(user_templaten
18f90 61 6d 65 2c 30 30 34 29 3d 3d 2d 31 20 29 7b 0a  ame,004)==-1 ){.
18fa0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
18fb0 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69 6e 64  derr,"Can't find
18fc0 20 74 68 65 20 70 61 72 73 65 72 20 64 72 69 76   the parser driv
18fd0 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  er template file
18fe0 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20   \"%s\".\n",.   
18ff0 20 20 20 20 20 75 73 65 72 5f 74 65 6d 70 6c 61       user_templa
19000 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c  tename);.      l
19010 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
19020 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
19030 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20  .    }.    in = 
19040 66 6f 70 65 6e 28 75 73 65 72 5f 74 65 6d 70 6c  fopen(user_templ
19050 61 74 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20  atename,"rb");. 
19060 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a     if( in==0 ){.
19070 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
19080 64 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e  derr,"Can't open
19090 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69   the template fi
190a0 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20  le \"%s\".\n",. 
190b0 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65               use
190c0 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b  r_templatename);
190d0 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  .      lemp->err
190e0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72  orcnt++;.      r
190f0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
19100 20 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 20 20     return in;.  
19110 7d 0a 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  }..  cp = strrch
19120 72 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  r(lemp->filename
19130 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20  ,'.');.  if( cp 
19140 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72  ){.    lemon_spr
19150 69 6e 74 66 28 62 75 66 2c 22 25 2e 2a 73 2e 6c  intf(buf,"%.*s.l
19160 74 22 2c 28 69 6e 74 29 28 63 70 2d 6c 65 6d 70  t",(int)(cp-lemp
19170 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c 6c 65 6d 70  ->filename),lemp
19180 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  ->filename);.  }
19190 65 6c 73 65 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f  else{.    lemon_
191a0 73 70 72 69 6e 74 66 28 62 75 66 2c 22 25 73 2e  sprintf(buf,"%s.
191b0 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  lt",lemp->filena
191c0 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61  me);.  }.  if( a
191d0 63 63 65 73 73 28 62 75 66 2c 30 30 34 29 3d 3d  ccess(buf,004)==
191e0 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d  0 ){.    tpltnam
191f0 65 20 3d 20 62 75 66 3b 0a 20 20 7d 65 6c 73 65  e = buf;.  }else
19200 20 69 66 28 20 61 63 63 65 73 73 28 74 65 6d 70   if( access(temp
19210 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29 3d 3d 30  latename,004)==0
19220 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65   ){.    tpltname
19230 20 3d 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 3b   = templatename;
19240 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 70  .  }else{.    tp
19250 6c 74 6e 61 6d 65 20 3d 20 70 61 74 68 73 65 61  ltname = pathsea
19260 72 63 68 28 6c 65 6d 70 2d 3e 61 72 67 76 30 2c  rch(lemp->argv0,
19270 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 29 3b  templatename,0);
19280 0a 20 20 7d 0a 20 20 69 66 28 20 74 70 6c 74 6e  .  }.  if( tpltn
19290 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  ame==0 ){.    fp
192a0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61  rintf(stderr,"Ca
192b0 6e 27 74 20 66 69 6e 64 20 74 68 65 20 70 61 72  n't find the par
192c0 73 65 72 20 64 72 69 76 65 72 20 74 65 6d 70 6c  ser driver templ
192d0 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e  ate file \"%s\".
192e0 5c 6e 22 2c 0a 20 20 20 20 74 65 6d 70 6c 61 74  \n",.    templat
192f0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70  ename);.    lemp
19300 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
19310 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
19320 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 74 70 6c    in = fopen(tpl
19330 74 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69  tname,"rb");.  i
19340 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
19350 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
19360 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 65 20 74  Can't open the t
19370 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25  emplate file \"%
19380 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70 6c 61 74 65  s\".\n",template
19390 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d  name);.    lemp-
193a0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
193b0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
193c0 20 72 65 74 75 72 6e 20 69 6e 3b 0a 7d 0a 0a 2f   return in;.}../
193d0 2a 20 50 72 69 6e 74 20 61 20 23 6c 69 6e 65 20  * Print a #line 
193e0 64 69 72 65 63 74 69 76 65 20 6c 69 6e 65 20 74  directive line t
193f0 6f 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c  o the output fil
19400 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  e. */.PRIVATE vo
19410 69 64 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28  id tplt_linedir(
19420 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74 20 6c  FILE *out, int l
19430 69 6e 65 6e 6f 2c 20 63 68 61 72 20 2a 66 69 6c  ineno, char *fil
19440 65 6e 61 6d 65 29 0a 7b 0a 20 20 66 70 72 69 6e  ename).{.  fprin
19450 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64  tf(out,"#line %d
19460 20 5c 22 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20   \"",lineno);.  
19470 77 68 69 6c 65 28 20 2a 66 69 6c 65 6e 61 6d 65  while( *filename
19480 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 66 69 6c   ){.    if( *fil
19490 65 6e 61 6d 65 20 3d 3d 20 27 5c 5c 27 20 29 20  ename == '\\' ) 
194a0 70 75 74 63 28 27 5c 5c 27 2c 6f 75 74 29 3b 0a  putc('\\',out);.
194b0 20 20 20 20 70 75 74 63 28 2a 66 69 6c 65 6e 61      putc(*filena
194c0 6d 65 2c 6f 75 74 29 3b 0a 20 20 20 20 66 69 6c  me,out);.    fil
194d0 65 6e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 20 20 66  ename++;.  }.  f
194e0 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 5c 6e  printf(out,"\"\n
194f0 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20  ");.}../* Print 
19500 61 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20  a string to the 
19510 66 69 6c 65 20 61 6e 64 20 6b 65 65 70 20 74 68  file and keep th
19520 65 20 6c 69 6e 65 6e 75 6d 62 65 72 20 75 70 20  e linenumber up 
19530 74 6f 20 64 61 74 65 20 2a 2f 0a 50 52 49 56 41  to date */.PRIVA
19540 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 70 72 69  TE void tplt_pri
19550 6e 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73 74  nt(FILE *out, st
19560 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
19570 2c 20 63 68 61 72 20 2a 73 74 72 2c 20 69 6e 74  , char *str, int
19580 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20 69 66   *lineno).{.  if
19590 28 20 73 74 72 3d 3d 30 20 29 20 72 65 74 75 72  ( str==0 ) retur
195a0 6e 3b 0a 20 20 77 68 69 6c 65 28 20 2a 73 74 72  n;.  while( *str
195b0 20 29 7b 0a 20 20 20 20 70 75 74 63 28 2a 73 74   ){.    putc(*st
195c0 72 2c 6f 75 74 29 3b 0a 20 20 20 20 69 66 28 20  r,out);.    if( 
195d0 2a 73 74 72 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c  *str=='\n' ) (*l
195e0 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 73 74  ineno)++;.    st
195f0 72 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  r++;.  }.  if( s
19600 74 72 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a  tr[-1]!='\n' ){.
19610 20 20 20 20 70 75 74 63 28 27 5c 6e 27 2c 6f 75      putc('\n',ou
19620 74 29 3b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f  t);.    (*lineno
19630 29 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 20 28 21  )++;.  }.  if (!
19640 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66  lemp->nolinenosf
19650 6c 61 67 29 20 7b 0a 20 20 20 20 28 2a 6c 69 6e  lag) {.    (*lin
19660 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e  eno)++; tplt_lin
19670 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f  edir(out,*lineno
19680 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b  ,lemp->outname);
19690 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a   .  }.  return;.
196a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
196b0 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 65  lowing routine e
196c0 6d 69 74 73 20 63 6f 64 65 20 66 6f 72 20 74 68  mits code for th
196d0 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
196e0 20 74 68 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73   the.** symbol s
196f0 70 0a 2a 2f 0a 76 6f 69 64 20 65 6d 69 74 5f 64  p.*/.void emit_d
19700 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 0a  estructor_code(.
19710 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20 20 73    FILE *out,.  s
19720 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
19730 2c 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ,.  struct lemon
19740 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c   *lemp,.  int *l
19750 69 6e 65 6e 6f 0a 29 7b 0a 20 63 68 61 72 20 2a  ineno.){. char *
19760 63 70 20 3d 20 30 3b 0a 0a 20 69 66 28 20 73 70  cp = 0;.. if( sp
19770 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
19780 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70   ){.   cp = lemp
19790 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20  ->tokendest;.   
197a0 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75  if( cp==0 ) retu
197b0 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  rn;.   fprintf(o
197c0 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e  ut,"{\n"); (*lin
197d0 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 20 69  eno)++;. }else i
197e0 66 28 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  f( sp->destructo
197f0 72 20 29 7b 0a 20 20 20 63 70 20 3d 20 73 70 2d  r ){.   cp = sp-
19800 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 20  >destructor;.   
19810 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e  fprintf(out,"{\n
19820 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
19830 0a 20 20 20 69 66 28 20 21 6c 65 6d 70 2d 3e 6e  .   if( !lemp->n
19840 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 29 7b 0a  olinenosflag ){.
19850 20 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b       (*lineno)++
19860 3b 0a 20 20 20 20 20 74 70 6c 74 5f 6c 69 6e 65  ;.     tplt_line
19870 64 69 72 28 6f 75 74 2c 73 70 2d 3e 64 65 73 74  dir(out,sp->dest
19880 4c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 66 69 6c  Lineno,lemp->fil
19890 65 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a 20 7d 65  ename);.   }. }e
198a0 6c 73 65 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61  lse if( lemp->va
198b0 72 64 65 73 74 20 29 7b 0a 20 20 20 63 70 20 3d  rdest ){.   cp =
198c0 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 3b 0a   lemp->vardest;.
198d0 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72     if( cp==0 ) r
198e0 65 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74  eturn;.   fprint
198f0 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a  f(out,"{\n"); (*
19900 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73  lineno)++;. }els
19910 65 7b 0a 20 20 20 61 73 73 65 72 74 28 20 30 20  e{.   assert( 0 
19920 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61  );  /* Cannot ha
19930 70 70 65 6e 20 2a 2f 0a 20 7d 0a 20 66 6f 72 28  ppen */. }. for(
19940 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20  ; *cp; cp++){.  
19950 20 69 66 28 20 2a 63 70 3d 3d 27 24 27 20 26 26   if( *cp=='$' &&
19960 20 63 70 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a 20   cp[1]=='$' ){. 
19970 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
19980 22 28 79 79 70 6d 69 6e 6f 72 2d 3e 79 79 25 64  "(yypminor->yy%d
19990 29 22 2c 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20  )",sp->dtnum);. 
199a0 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 63      cp++;.     c
199b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 7d 0a 20 20  ontinue;.   }.  
199c0 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29   if( *cp=='\n' )
199d0 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
199e0 20 66 70 75 74 63 28 2a 63 70 2c 6f 75 74 29 3b   fputc(*cp,out);
199f0 0a 20 7d 0a 20 66 70 72 69 6e 74 66 28 6f 75 74  . }. fprintf(out
19a00 2c 22 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f  ,"\n"); (*lineno
19a10 29 2b 2b 3b 0a 20 69 66 20 28 21 6c 65 6d 70 2d  )++;. if (!lemp-
19a20 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20  >nolinenosflag) 
19a30 7b 20 0a 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b  { .   (*lineno)+
19a40 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28  +; tplt_linedir(
19a50 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70  out,*lineno,lemp
19a60 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 7d 0a  ->outname); . }.
19a70 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c   fprintf(out,"}\
19a80 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n"); (*lineno)++
19a90 3b 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ;. return;.}../*
19aa0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
19ab0 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68  (non-zero) if th
19ac0 65 20 67 69 76 65 6e 20 73 79 6d 62 6f 6c 20 68  e given symbol h
19ad0 61 73 20 61 20 64 65 73 74 72 75 63 74 6f 72 2e  as a destructor.
19ae0 0a 2a 2f 0a 69 6e 74 20 68 61 73 5f 64 65 73 74  .*/.int has_dest
19af0 72 75 63 74 6f 72 28 73 74 72 75 63 74 20 73 79  ructor(struct sy
19b00 6d 62 6f 6c 20 2a 73 70 2c 20 73 74 72 75 63 74  mbol *sp, struct
19b10 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
19b20 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 69 66 28    int ret;.  if(
19b30 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   sp->type==TERMI
19b40 4e 41 4c 20 29 7b 0a 20 20 20 20 72 65 74 20 3d  NAL ){.    ret =
19b50 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74   lemp->tokendest
19b60 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  !=0;.  }else{.  
19b70 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 76 61    ret = lemp->va
19b80 72 64 65 73 74 21 3d 30 20 7c 7c 20 73 70 2d 3e  rdest!=0 || sp->
19b90 64 65 73 74 72 75 63 74 6f 72 21 3d 30 3b 0a 20  destructor!=0;. 
19ba0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
19bb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
19bc0 20 74 65 78 74 20 74 6f 20 61 20 64 79 6e 61 6d   text to a dynam
19bd0 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
19be0 20 73 74 72 69 6e 67 2e 20 20 49 66 20 7a 54 65   string.  If zTe
19bf0 78 74 20 69 73 20 30 20 74 68 65 6e 0a 2a 2a 20  xt is 0 then.** 
19c00 72 65 73 65 74 20 74 68 65 20 73 74 72 69 6e 67  reset the string
19c10 20 74 6f 20 62 65 20 65 6d 70 74 79 20 61 67 61   to be empty aga
19c20 69 6e 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  in.  Always retu
19c30 72 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  rn the complete 
19c40 74 65 78 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73  text.** of the s
19c50 74 72 69 6e 67 20 28 77 68 69 63 68 20 69 73 20  tring (which is 
19c60 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
19c70 20 65 61 63 68 20 63 61 6c 6c 29 2e 0a 2a 2a 0a   each call)..**.
19c80 2a 2a 20 6e 20 62 79 74 65 73 20 6f 66 20 7a 54  ** n bytes of zT
19c90 65 78 74 20 61 72 65 20 73 74 6f 72 65 64 2e 20  ext are stored. 
19ca0 20 49 66 20 6e 3d 3d 30 20 74 68 65 6e 20 61 6c   If n==0 then al
19cb0 6c 20 6f 66 20 7a 54 65 78 74 20 75 70 20 74 6f  l of zText up to
19cc0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 5c 30   the first.** \0
19cd0 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 69 73  00 terminator is
19ce0 20 73 74 6f 72 65 64 2e 20 20 7a 54 65 78 74 20   stored.  zText 
19cf0 63 61 6e 20 63 6f 6e 74 61 69 6e 20 75 70 20 74  can contain up t
19d00 6f 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20  o two instances 
19d10 6f 66 0a 2a 2a 20 25 64 2e 20 20 54 68 65 20 76  of.** %d.  The v
19d20 61 6c 75 65 73 20 6f 66 20 70 31 20 61 6e 64 20  alues of p1 and 
19d30 70 32 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  p2 are written i
19d40 6e 74 6f 20 74 68 65 20 66 69 72 73 74 20 61 6e  nto the first an
19d50 64 20 73 65 63 6f 6e 64 0a 2a 2a 20 25 64 2e 0a  d second.** %d..
19d60 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 2d 31 2c 20  **.** If n==-1, 
19d70 74 68 65 6e 20 74 68 65 20 70 72 65 76 69 6f 75  then the previou
19d80 73 20 63 68 61 72 61 63 74 65 72 20 69 73 20 6f  s character is o
19d90 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 50  verwritten..*/.P
19da0 52 49 56 41 54 45 20 63 68 61 72 20 2a 61 70 70  RIVATE char *app
19db0 65 6e 64 5f 73 74 72 28 63 6f 6e 73 74 20 63 68  end_str(const ch
19dc0 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 6e  ar *zText, int n
19dd0 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
19de0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
19df0 20 65 6d 70 74 79 5b 31 5d 20 3d 20 7b 20 30 20   empty[1] = { 0 
19e00 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  };.  static char
19e10 20 2a 7a 20 3d 20 30 3b 0a 20 20 73 74 61 74 69   *z = 0;.  stati
19e20 63 20 69 6e 74 20 61 6c 6c 6f 63 65 64 20 3d 20  c int alloced = 
19e30 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
19e40 75 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  used = 0;.  int 
19e50 63 3b 0a 20 20 63 68 61 72 20 7a 49 6e 74 5b 34  c;.  char zInt[4
19e60 30 5d 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 3d  0];.  if( zText=
19e70 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 75 73  =0 ){.    if( us
19e80 65 64 3d 3d 30 20 26 26 20 7a 21 3d 30 20 29 20  ed==0 && z!=0 ) 
19e90 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 75 73  z[0] = 0;.    us
19ea0 65 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ed = 0;.    retu
19eb0 72 6e 20 7a 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn z;.  }.  if( 
19ec0 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  n<=0 ){.    if( 
19ed0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 73 65  n<0 ){.      use
19ee0 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 61 73  d += n;.      as
19ef0 73 65 72 74 28 20 75 73 65 64 3e 3d 30 20 29 3b  sert( used>=0 );
19f00 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6c  .    }.    n = l
19f10 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 54 65 78 74  emonStrlen(zText
19f20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 6e  );.  }.  if( (in
19f30 74 29 20 28 6e 2b 73 69 7a 65 6f 66 28 7a 49 6e  t) (n+sizeof(zIn
19f40 74 29 2a 32 2b 75 73 65 64 29 20 3e 3d 20 61 6c  t)*2+used) >= al
19f50 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 61 6c 6c  loced ){.    all
19f60 6f 63 65 64 20 3d 20 6e 20 2b 20 73 69 7a 65 6f  oced = n + sizeo
19f70 66 28 7a 49 6e 74 29 2a 32 20 2b 20 75 73 65 64  f(zInt)*2 + used
19f80 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 20 3d 20   + 200;.    z = 
19f90 28 63 68 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63  (char *) realloc
19fa0 28 7a 2c 20 20 61 6c 6c 6f 63 65 64 29 3b 0a 20  (z,  alloced);. 
19fb0 20 7d 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20   }.  if( z==0 ) 
19fc0 72 65 74 75 72 6e 20 65 6d 70 74 79 3b 0a 20 20  return empty;.  
19fd0 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
19fe0 7b 0a 20 20 20 20 63 20 3d 20 2a 28 7a 54 65 78  {.    c = *(zTex
19ff0 74 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63 3d  t++);.    if( c=
1a000 3d 27 25 27 20 26 26 20 6e 3e 30 20 26 26 20 7a  ='%' && n>0 && z
1a010 54 65 78 74 5b 30 5d 3d 3d 27 64 27 20 29 7b 0a  Text[0]=='d' ){.
1a020 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69        lemon_spri
1a030 6e 74 66 28 7a 49 6e 74 2c 20 22 25 64 22 2c 20  ntf(zInt, "%d", 
1a040 70 31 29 3b 0a 20 20 20 20 20 20 70 31 20 3d 20  p1);.      p1 = 
1a050 70 32 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f  p2;.      lemon_
1a060 73 74 72 63 70 79 28 26 7a 5b 75 73 65 64 5d 2c  strcpy(&z[used],
1a070 20 7a 49 6e 74 29 3b 0a 20 20 20 20 20 20 75 73   zInt);.      us
1a080 65 64 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  ed += lemonStrle
1a090 6e 28 26 7a 5b 75 73 65 64 5d 29 3b 0a 20 20 20  n(&z[used]);.   
1a0a0 20 20 20 7a 54 65 78 74 2b 2b 3b 0a 20 20 20 20     zText++;.    
1a0b0 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65    n--;.    }else
1a0c0 7b 0a 20 20 20 20 20 20 7a 5b 75 73 65 64 2b 2b  {.      z[used++
1a0d0 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a 20 20 20  ] = (char)c;.   
1a0e0 20 7d 0a 20 20 7d 0a 20 20 7a 5b 75 73 65 64 5d   }.  }.  z[used]
1a0f0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
1a100 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 7a 43 6f 64 65  ;.}../*.** zCode
1a110 20 69 73 20 61 20 73 74 72 69 6e 67 20 74 68 61   is a string tha
1a120 74 20 69 73 20 74 68 65 20 61 63 74 69 6f 6e 20  t is the action 
1a130 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1a140 61 20 72 75 6c 65 2e 20 20 45 78 70 61 6e 64 0a  a rule.  Expand.
1a150 2a 2a 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 69  ** the symbols i
1a160 6e 20 74 68 69 73 20 73 74 72 69 6e 67 20 73 6f  n this string so
1a170 20 74 68 61 74 20 74 68 65 20 72 65 66 65 72 20   that the refer 
1a180 74 6f 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  to elements of t
1a190 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 73 74 61  he parser.** sta
1a1a0 63 6b 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  ck..*/.PRIVATE v
1a1b0 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f  oid translate_co
1a1c0 64 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  de(struct lemon 
1a1d0 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 72 75  *lemp, struct ru
1a1e0 6c 65 20 2a 72 70 29 7b 0a 20 20 63 68 61 72 20  le *rp){.  char 
1a1f0 2a 63 70 2c 20 2a 78 70 3b 0a 20 20 69 6e 74 20  *cp, *xp;.  int 
1a200 69 3b 0a 20 20 63 68 61 72 20 6c 68 73 75 73 65  i;.  char lhsuse
1a210 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 72 75  d = 0;    /* Tru
1a220 65 20 69 66 20 74 68 65 20 4c 48 53 20 65 6c 65  e if the LHS ele
1a230 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 20 75 73  ment has been us
1a240 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 6c 68 73  ed */.  char lhs
1a250 64 69 72 65 63 74 3b 20 20 20 20 20 20 2f 2a 20  direct;      /* 
1a260 54 72 75 65 20 69 66 20 4c 48 53 20 77 72 69 74  True if LHS writ
1a270 65 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  es directly into
1a280 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72   stack */.  char
1a290 20 75 73 65 64 5b 4d 41 58 52 48 53 5d 3b 20 20   used[MAXRHS];  
1a2a0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 65 61 63   /* True for eac
1a2b0 68 20 52 48 53 20 65 6c 65 6d 65 6e 74 20 77 68  h RHS element wh
1a2c0 69 63 68 20 69 73 20 75 73 65 64 20 2a 2f 0a 20  ich is used */. 
1a2d0 20 63 68 61 72 20 7a 4c 68 73 5b 35 30 5d 3b 20   char zLhs[50]; 
1a2e0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
1a2f0 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20   the LHS symbol 
1a300 69 6e 74 6f 20 74 68 69 73 20 73 74 72 69 6e 67  into this string
1a310 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */..  for(i=0; 
1a320 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
1a330 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20   used[i] = 0;.  
1a340 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  lhsused = 0;..  
1a350 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20  if( rp->code==0 
1a360 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68  ){.    static ch
1a370 61 72 20 6e 65 77 6c 69 6e 65 73 74 72 5b 32 5d  ar newlinestr[2]
1a380 20 3d 20 7b 20 27 5c 6e 27 2c 20 27 5c 30 27 20   = { '\n', '\0' 
1a390 7d 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20  };.    rp->code 
1a3a0 3d 20 6e 65 77 6c 69 6e 65 73 74 72 3b 0a 20 20  = newlinestr;.  
1a3b0 20 20 72 70 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d    rp->line = rp-
1a3c0 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20 20 7d 0a 0a  >ruleline;.  }..
1a3d0 0a 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c  .  if( rp->lhsal
1a3e0 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ias==0 ){.    /*
1a3f0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4c 48 53   There is no LHS
1a400 20 76 61 6c 75 65 20 73 79 6d 62 6f 6c 2e 20 2a   value symbol. *
1a410 2f 0a 20 20 20 20 6c 68 73 64 69 72 65 63 74 20  /.    lhsdirect 
1a420 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
1a430 20 72 70 2d 3e 6e 72 68 73 3d 3d 30 20 29 7b 0a   rp->nrhs==0 ){.
1a440 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1a450 61 72 65 20 6e 6f 20 52 48 53 20 73 79 6d 62 6f  are no RHS symbo
1a460 6c 73 2c 20 74 68 65 6e 20 77 72 69 74 69 6e 67  ls, then writing
1a470 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
1a480 20 4c 48 53 20 69 73 20 6f 6b 20 2a 2f 0a 20 20   LHS is ok */.  
1a490 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20 31 3b    lhsdirect = 1;
1a4a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70 2d  .  }else if( rp-
1a4b0 3e 72 68 73 61 6c 69 61 73 5b 30 5d 3d 3d 30 20  >rhsalias[0]==0 
1a4c0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 65  ){.    /* The le
1a4d0 66 74 2d 6d 6f 73 74 20 52 48 53 20 73 79 6d 62  ft-most RHS symb
1a4e0 6f 6c 20 68 61 73 20 6e 6f 74 20 76 61 6c 75 65  ol has not value
1a4f0 2e 20 20 4c 48 53 20 64 69 72 65 63 74 20 69 73  .  LHS direct is
1a500 20 6f 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a   ok.  But.    **
1a510 20 77 65 20 68 61 76 65 20 74 6f 20 63 61 6c 6c   we have to call
1a520 20 74 68 65 20 64 69 73 74 72 75 63 74 6f 72 20   the distructor 
1a530 6f 6e 20 74 68 65 20 52 48 53 20 73 79 6d 62 6f  on the RHS symbo
1a540 6c 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20  l first. */.    
1a550 6c 68 73 64 69 72 65 63 74 20 3d 20 31 3b 0a 20  lhsdirect = 1;. 
1a560 20 20 20 69 66 28 20 68 61 73 5f 64 65 73 74 72     if( has_destr
1a570 75 63 74 6f 72 28 72 70 2d 3e 72 68 73 5b 30 5d  uctor(rp->rhs[0]
1a580 2c 6c 65 6d 70 29 20 29 7b 0a 20 20 20 20 20 20  ,lemp) ){.      
1a590 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30  append_str(0,0,0
1a5a0 2c 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e  ,0);.      appen
1a5b0 64 5f 73 74 72 28 22 20 20 79 79 5f 64 65 73 74  d_str("  yy_dest
1a5c0 72 75 63 74 6f 72 28 79 79 70 50 61 72 73 65 72  ructor(yypParser
1a5d0 2c 25 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d  ,%d,&yymsp[%d].m
1a5e0 69 6e 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20  inor);\n", 0,.  
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1a600 70 2d 3e 72 68 73 5b 30 5d 2d 3e 69 6e 64 65 78  p->rhs[0]->index
1a610 2c 31 2d 72 70 2d 3e 6e 72 68 73 29 3b 0a 20 20  ,1-rp->nrhs);.  
1a620 20 20 20 20 72 70 2d 3e 63 6f 64 65 50 72 65 66      rp->codePref
1a630 69 78 20 3d 20 53 74 72 73 61 66 65 28 61 70 70  ix = Strsafe(app
1a640 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29  end_str(0,0,0,0)
1a650 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1a660 20 69 66 28 20 73 74 72 63 6d 70 28 72 70 2d 3e   if( strcmp(rp->
1a670 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 72 68 73  lhsalias,rp->rhs
1a680 61 6c 69 61 73 5b 30 5d 29 3d 3d 30 20 29 7b 0a  alias[0])==0 ){.
1a690 20 20 20 20 2f 2a 20 54 68 65 20 4c 48 53 20 73      /* The LHS s
1a6a0 79 6d 62 6f 6c 20 61 6e 64 20 74 68 65 20 6c 65  ymbol and the le
1a6b0 66 74 2d 6d 6f 73 74 20 52 48 53 20 73 79 6d 62  ft-most RHS symb
1a6c0 6f 6c 20 61 72 65 20 74 68 65 20 73 61 6d 65 2c  ol are the same,
1a6d0 20 73 6f 20 0a 20 20 20 20 2a 2a 20 64 69 72 65   so .    ** dire
1a6e0 63 74 20 77 72 69 74 69 6e 67 20 69 73 20 61 6c  ct writing is al
1a6f0 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 6c 68 73  lowed */.    lhs
1a700 64 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 20 20  direct = 1;.    
1a710 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a 20 20 20  lhsused = 1;.   
1a720 20 75 73 65 64 5b 30 5d 20 3d 20 31 3b 0a 20 20   used[0] = 1;.  
1a730 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 2d 3e 64    if( rp->lhs->d
1a740 74 6e 75 6d 21 3d 72 70 2d 3e 72 68 73 5b 30 5d  tnum!=rp->rhs[0]
1a750 2d 3e 64 74 6e 75 6d 20 29 7b 0a 20 20 20 20 20  ->dtnum ){.     
1a760 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
1a770 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c  filename,rp->rul
1a780 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 22  eline,.        "
1a790 25 73 28 25 73 29 20 61 6e 64 20 25 73 28 25 73  %s(%s) and %s(%s
1a7a0 29 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  ) share the same
1a7b0 20 6c 61 62 65 6c 20 62 75 74 20 68 61 76 65 20   label but have 
1a7c0 22 0a 20 20 20 20 20 20 20 20 22 64 69 66 66 65  ".        "diffe
1a7d0 72 65 6e 74 20 64 61 74 61 74 79 70 65 73 2e 22  rent datatypes."
1a7e0 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68  ,.        rp->lh
1a7f0 73 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 6c 68 73  s->name, rp->lhs
1a800 61 6c 69 61 73 2c 20 72 70 2d 3e 72 68 73 5b 30  alias, rp->rhs[0
1a810 5d 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 72 68 73  ]->name, rp->rhs
1a820 61 6c 69 61 73 5b 30 5d 29 3b 0a 20 20 20 20 20  alias[0]);.     
1a830 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
1a840 2b 3b 0a 20 20 20 20 7d 20 20 20 20 0a 20 20 7d  +;.    }    .  }
1a850 65 6c 73 65 7b 0a 20 20 20 20 6c 68 73 64 69 72  else{.    lhsdir
1a860 65 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ect = 0;.  }.  i
1a870 66 28 20 6c 68 73 64 69 72 65 63 74 20 29 7b 0a  f( lhsdirect ){.
1a880 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 68 73      sprintf(zLhs
1a890 2c 20 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e  , "yymsp[%d].min
1a8a0 6f 72 2e 79 79 25 64 22 2c 31 2d 72 70 2d 3e 6e  or.yy%d",1-rp->n
1a8b0 72 68 73 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e  rhs,rp->lhs->dtn
1a8c0 75 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  um);.  }else{.  
1a8d0 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30    append_str(0,0
1a8e0 2c 30 2c 30 29 3b 0a 20 20 20 20 61 70 70 65 6e  ,0,0);.    appen
1a8f0 64 5f 73 74 72 28 22 20 20 59 59 4d 49 4e 4f 52  d_str("  YYMINOR
1a900 54 59 50 45 20 79 79 6c 68 73 6d 69 6e 6f 72 3b  TYPE yylhsminor;
1a910 5c 6e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  \n", 0, 0, 0);. 
1a920 20 20 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69     rp->codePrefi
1a930 78 20 3d 20 53 74 72 73 61 66 65 28 61 70 70 65  x = Strsafe(appe
1a940 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 29  nd_str(0,0,0,0))
1a950 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c  ;.    sprintf(zL
1a960 68 73 2c 20 22 79 79 6c 68 73 6d 69 6e 6f 72 2e  hs, "yylhsminor.
1a970 79 79 25 64 22 2c 72 70 2d 3e 6c 68 73 2d 3e 64  yy%d",rp->lhs->d
1a980 74 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 61 70  tnum);.  }..  ap
1a990 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30  pend_str(0,0,0,0
1a9a0 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
1a9b0 6e 73 74 20 63 61 73 74 20 69 73 20 77 72 6f 6e  nst cast is wron
1a9c0 67 20 62 75 74 20 68 61 72 6d 6c 65 73 73 2c 20  g but harmless, 
1a9d0 69 66 20 77 65 27 72 65 20 63 61 72 65 66 75 6c  if we're careful
1a9e0 2e 20 2a 2f 0a 20 20 66 6f 72 28 63 70 3d 28 63  . */.  for(cp=(c
1a9f0 68 61 72 20 2a 29 72 70 2d 3e 63 6f 64 65 3b 20  har *)rp->code; 
1aa00 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20  *cp; cp++){.    
1aa10 69 66 28 20 49 53 41 4c 50 48 41 28 2a 63 70 29  if( ISALPHA(*cp)
1aa20 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63 6f 64   && (cp==rp->cod
1aa30 65 20 7c 7c 20 28 21 49 53 41 4c 4e 55 4d 28 63  e || (!ISALNUM(c
1aa40 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d 31 5d  p[-1]) && cp[-1]
1aa50 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20 20 20  !='_')) ){.     
1aa60 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20 20 20   char saved;.   
1aa70 20 20 20 66 6f 72 28 78 70 3d 20 26 63 70 5b 31     for(xp= &cp[1
1aa80 5d 3b 20 49 53 41 4c 4e 55 4d 28 2a 78 70 29 20  ]; ISALNUM(*xp) 
1aa90 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20 78 70 2b  || *xp=='_'; xp+
1aaa0 2b 29 3b 0a 20 20 20 20 20 20 73 61 76 65 64 20  +);.      saved 
1aab0 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20 2a 78 70  = *xp;.      *xp
1aac0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1aad0 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20  rp->lhsalias && 
1aae0 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 6c 68  strcmp(cp,rp->lh
1aaf0 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a 20 20  salias)==0 ){.  
1ab00 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
1ab10 28 7a 4c 68 73 2c 30 2c 30 2c 30 29 3b 0a 20 20  (zLhs,0,0,0);.  
1ab20 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20        cp = xp;. 
1ab30 20 20 20 20 20 20 20 6c 68 73 75 73 65 64 20 3d         lhsused =
1ab40 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
1ab50 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
1ab60 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
1ab70 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
1ab80 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  ( rp->rhsalias[i
1ab90 5d 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72  ] && strcmp(cp,r
1aba0 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d  p->rhsalias[i])=
1abb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1abc0 20 20 69 66 28 20 63 70 21 3d 72 70 2d 3e 63 6f    if( cp!=rp->co
1abd0 64 65 20 26 26 20 63 70 5b 2d 31 5d 3d 3d 27 40  de && cp[-1]=='@
1abe0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
1abf0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 72 67     /* If the arg
1ac00 75 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20  ument is of the 
1ac10 66 6f 72 6d 20 40 58 20 74 68 65 6e 20 73 75 62  form @X then sub
1ac20 73 74 69 74 75 74 65 64 0a 20 20 20 20 20 20 20  stituted.       
1ac30 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 6f         ** the to
1ac40 6b 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 2c  ken number of X,
1ac50 20 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f   not the value o
1ac60 66 20 58 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  f X */.         
1ac70 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28       append_str(
1ac80 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72  "yymsp[%d].major
1ac90 22 2c 2d 31 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b  ",-1,i-rp->nrhs+
1aca0 31 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  1,0);.          
1acb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1acc0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
1acd0 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72  mbol *sp = rp->r
1ace0 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  hs[i];.         
1acf0 20 20 20 20 20 69 6e 74 20 64 74 6e 75 6d 3b 0a       int dtnum;.
1ad00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1ad10 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54  ( sp->type==MULT
1ad20 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e               dtn
1ad40 75 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b  um = sp->subsym[
1ad50 30 5d 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20  0]->dtnum;.     
1ad60 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad80 64 74 6e 75 6d 20 3d 20 73 70 2d 3e 64 74 6e 75  dtnum = sp->dtnu
1ad90 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
1ada0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1adb0 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d   append_str("yym
1adc0 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25  sp[%d].minor.yy%
1add0 64 22 2c 30 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b  d",0,i-rp->nrhs+
1ade0 31 2c 20 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20  1, dtnum);.     
1adf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ae00 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20       cp = xp;.  
1ae10 20 20 20 20 20 20 20 20 20 20 75 73 65 64 5b 69            used[i
1ae20 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  ] = 1;.         
1ae30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1ae40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1ae50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 78        }.      *x
1ae60 70 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 7d  p = saved;.    }
1ae70 0a 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28  .    append_str(
1ae80 63 70 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20  cp, 1, 0, 0);.  
1ae90 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f  } /* End loop */
1aea0 0a 0a 20 20 2f 2a 20 4d 61 69 6e 20 63 6f 64 65  ..  /* Main code
1aeb0 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 6d 70   generation comp
1aec0 6c 65 74 65 64 20 2a 2f 0a 20 20 63 70 20 3d 20  leted */.  cp = 
1aed0 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30  append_str(0,0,0
1aee0 2c 30 29 3b 0a 20 20 69 66 28 20 63 70 20 26 26  ,0);.  if( cp &&
1aef0 20 63 70 5b 30 5d 20 29 20 72 70 2d 3e 63 6f 64   cp[0] ) rp->cod
1af00 65 20 3d 20 53 74 72 73 61 66 65 28 63 70 29 3b  e = Strsafe(cp);
1af10 0a 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c  .  append_str(0,
1af20 30 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a 20 43 68  0,0,0);..  /* Ch
1af30 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
1af40 20 74 68 65 20 4c 48 53 20 68 61 73 20 62 65 65   the LHS has bee
1af50 6e 20 75 73 65 64 20 2a 2f 0a 20 20 69 66 28 20  n used */.  if( 
1af60 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20  rp->lhsalias && 
1af70 21 6c 68 73 75 73 65 64 20 29 7b 0a 20 20 20 20  !lhsused ){.    
1af80 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
1af90 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65  ilename,rp->rule
1afa0 6c 69 6e 65 2c 0a 20 20 20 20 20 20 22 4c 61 62  line,.      "Lab
1afb0 65 6c 20 5c 22 25 73 5c 22 20 66 6f 72 20 5c 22  el \"%s\" for \"
1afc0 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65  %s(%s)\" is neve
1afd0 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20  r used.",.      
1afe0 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72    rp->lhsalias,r
1aff0 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d  p->lhs->name,rp-
1b000 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20  >lhsalias);.    
1b010 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
1b020 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
1b030 72 61 74 65 20 64 65 73 74 72 75 63 74 6f 72 20  rate destructor 
1b040 63 6f 64 65 20 66 6f 72 20 52 48 53 20 6d 69 6e  code for RHS min
1b050 6f 72 20 76 61 6c 75 65 73 20 77 68 69 63 68 20  or values which 
1b060 61 72 65 20 6e 6f 74 20 72 65 66 65 72 65 6e 63  are not referenc
1b070 65 64 2e 0a 20 20 2a 2a 20 47 65 6e 65 72 61 74  ed..  ** Generat
1b080 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  e error messages
1b090 20 66 6f 72 20 75 6e 75 73 65 64 20 6c 61 62 65   for unused labe
1b0a0 6c 73 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65  ls and duplicate
1b0b0 20 6c 61 62 65 6c 73 2e 0a 20 20 2a 2f 0a 20 20   labels..  */.  
1b0c0 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
1b0d0 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  rhs; i++){.    i
1b0e0 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  f( rp->rhsalias[
1b0f0 69 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i] ){.      if( 
1b100 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i>0 ){.        i
1b110 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 69 66  nt j;.        if
1b120 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26  ( rp->lhsalias &
1b130 26 20 73 74 72 63 6d 70 28 72 70 2d 3e 6c 68 73  & strcmp(rp->lhs
1b140 61 6c 69 61 73 2c 72 70 2d 3e 72 68 73 61 6c 69  alias,rp->rhsali
1b150 61 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20  as[i])==0 ){.   
1b160 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
1b170 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72  lemp->filename,r
1b180 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20  p->ruleline,.   
1b190 20 20 20 20 20 20 20 20 20 22 25 73 28 25 73 29           "%s(%s)
1b1a0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6c 61   has the same la
1b1b0 62 65 6c 20 61 73 20 74 68 65 20 4c 48 53 20 62  bel as the LHS b
1b1c0 75 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65  ut is not the le
1b1d0 66 74 2d 6d 6f 73 74 20 22 0a 20 20 20 20 20 20  ft-most ".      
1b1e0 20 20 20 20 20 20 22 73 79 6d 62 6f 6c 20 6f 6e        "symbol on
1b1f0 20 74 68 65 20 52 48 53 2e 22 2c 0a 20 20 20 20   the RHS.",.    
1b200 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b          rp->rhs[
1b210 69 5d 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 72 68  i]->name, rp->rh
1b220 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
1b230 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
1b240 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
1b250 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
1b260 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
1b270 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73       if( rp->rhs
1b280 61 6c 69 61 73 5b 6a 5d 20 26 26 20 73 74 72 63  alias[j] && strc
1b290 6d 70 28 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  mp(rp->rhsalias[
1b2a0 6a 5d 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  j],rp->rhsalias[
1b2b0 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  i])==0 ){.      
1b2c0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
1b2d0 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70  emp->filename,rp
1b2e0 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20  ->ruleline,.    
1b2f0 20 20 20 20 20 20 20 20 20 20 22 4c 61 62 65 6c            "Label
1b300 20 25 73 20 75 73 65 64 20 66 6f 72 20 6d 75 6c   %s used for mul
1b310 74 69 70 6c 65 20 73 79 6d 62 6f 6c 73 20 6f 6e  tiple symbols on
1b320 20 74 68 65 20 52 48 53 20 6f 66 20 61 20 72 75   the RHS of a ru
1b330 6c 65 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  le.",.          
1b340 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73      rp->rhsalias
1b350 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
1b360 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
1b370 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1b380 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1b390 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1b3a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
1b3b0 75 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20  used[i] ){.     
1b3c0 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
1b3d0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72  ->filename,rp->r
1b3e0 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20  uleline,.       
1b3f0 20 20 20 22 4c 61 62 65 6c 20 25 73 20 66 6f 72     "Label %s for
1b400 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e   \"%s(%s)\" is n
1b410 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20  ever used.",.   
1b420 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c         rp->rhsal
1b430 69 61 73 5b 69 5d 2c 72 70 2d 3e 72 68 73 5b 69  ias[i],rp->rhs[i
1b440 5d 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68 73 61  ]->name,rp->rhsa
1b450 6c 69 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20  lias[i]);.      
1b460 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
1b470 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1b480 7d 65 6c 73 65 20 69 66 28 20 69 3e 30 20 26 26  }else if( i>0 &&
1b490 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28   has_destructor(
1b4a0 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70 29  rp->rhs[i],lemp)
1b4b0 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64   ){.      append
1b4c0 5f 73 74 72 28 22 20 20 79 79 5f 64 65 73 74 72  _str("  yy_destr
1b4d0 75 63 74 6f 72 28 79 79 70 50 61 72 73 65 72 2c  uctor(yypParser,
1b4e0 25 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69  %d,&yymsp[%d].mi
1b4f0 6e 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20  nor);\n", 0,.   
1b500 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d        rp->rhs[i]
1b510 2d 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72  ->index,i-rp->nr
1b520 68 73 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  hs+1);.    }.  }
1b530 0a 0a 20 20 2f 2a 20 49 66 20 75 6e 61 62 6c 65  ..  /* If unable
1b540 20 74 6f 20 77 72 69 74 65 20 4c 48 53 20 76 61   to write LHS va
1b550 6c 75 65 73 20 64 69 72 65 63 74 6c 79 20 69 6e  lues directly in
1b560 74 6f 20 74 68 65 20 73 74 61 63 6b 2c 20 77 72  to the stack, wr
1b570 69 74 65 20 74 68 65 0a 20 20 2a 2a 20 73 61 76  ite the.  ** sav
1b580 65 64 20 4c 48 53 20 76 61 6c 75 65 20 6e 6f 77  ed LHS value now
1b590 2e 20 2a 2f 0a 20 20 69 66 28 20 6c 68 73 64 69  . */.  if( lhsdi
1b5a0 72 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  rect==0 ){.    a
1b5b0 70 70 65 6e 64 5f 73 74 72 28 22 20 20 79 79 6d  ppend_str("  yym
1b5c0 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25  sp[%d].minor.yy%
1b5d0 64 20 3d 20 22 2c 20 30 2c 20 31 2d 72 70 2d 3e  d = ", 0, 1-rp->
1b5e0 6e 72 68 73 2c 20 72 70 2d 3e 6c 68 73 2d 3e 64  nrhs, rp->lhs->d
1b5f0 74 6e 75 6d 29 3b 0a 20 20 20 20 61 70 70 65 6e  tnum);.    appen
1b600 64 5f 73 74 72 28 7a 4c 68 73 2c 20 30 2c 20 30  d_str(zLhs, 0, 0
1b610 2c 20 30 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  , 0);.    append
1b620 5f 73 74 72 28 22 3b 5c 6e 22 2c 20 30 2c 20 30  _str(";\n", 0, 0
1b630 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
1b640 53 75 66 66 69 78 20 63 6f 64 65 20 67 65 6e 65  Suffix code gene
1b650 72 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 20  ration complete 
1b660 2a 2f 0a 20 20 63 70 20 3d 20 61 70 70 65 6e 64  */.  cp = append
1b670 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20  _str(0,0,0,0);. 
1b680 20 69 66 28 20 63 70 20 29 20 72 70 2d 3e 63 6f   if( cp ) rp->co
1b690 64 65 53 75 66 66 69 78 20 3d 20 53 74 72 73 61  deSuffix = Strsa
1b6a0 66 65 28 63 70 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  fe(cp);.}../* .*
1b6b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1b6c0 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
1b6d0 68 65 6e 20 74 68 65 20 72 75 6c 65 20 22 72 70  hen the rule "rp
1b6e0 22 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 57  " is reduced.  W
1b6f0 72 69 74 65 0a 2a 2a 20 74 68 65 20 63 6f 64 65  rite.** the code
1b700 20 74 6f 20 22 6f 75 74 22 2e 20 20 4d 61 6b 65   to "out".  Make
1b710 20 73 75 72 65 20 6c 69 6e 65 6e 6f 20 73 74 61   sure lineno sta
1b720 79 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a  ys up-to-date..*
1b730 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 65  /.PRIVATE void e
1b740 6d 69 74 5f 63 6f 64 65 28 0a 20 20 46 49 4c 45  mit_code(.  FILE
1b750 20 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63 74 20   *out,.  struct 
1b760 72 75 6c 65 20 2a 72 70 2c 0a 20 20 73 74 72 75  rule *rp,.  stru
1b770 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a  ct lemon *lemp,.
1b780 20 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a 29 7b    int *lineno.){
1b790 0a 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 70  . const char *cp
1b7a0 3b 0a 0a 20 2f 2a 20 53 65 74 75 70 20 63 6f 64  ;.. /* Setup cod
1b7b0 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 23  e prior to the #
1b7c0 6c 69 6e 65 20 64 69 72 65 63 74 69 76 65 20 2a  line directive *
1b7d0 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 50  /. if( rp->codeP
1b7e0 72 65 66 69 78 20 26 26 20 72 70 2d 3e 63 6f 64  refix && rp->cod
1b7f0 65 50 72 65 66 69 78 5b 30 5d 20 29 7b 0a 20 20  ePrefix[0] ){.  
1b800 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7b   fprintf(out, "{
1b810 25 73 22 2c 20 72 70 2d 3e 63 6f 64 65 50 72 65  %s", rp->codePre
1b820 66 69 78 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d  fix);.   for(cp=
1b830 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 3b 20  rp->codePrefix; 
1b840 2a 63 70 3b 20 63 70 2b 2b 29 7b 20 69 66 28 20  *cp; cp++){ if( 
1b850 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69  *cp=='\n' ) (*li
1b860 6e 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 7d 0a 0a 20  neno)++; }. }.. 
1b870 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1b880 20 74 6f 20 64 6f 20 74 68 65 20 72 65 64 75 63   to do the reduc
1b890 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28  e action */. if(
1b8a0 20 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20   rp->code ){.   
1b8b0 69 66 28 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e  if( !lemp->nolin
1b8c0 65 6e 6f 73 66 6c 61 67 20 29 7b 0a 20 20 20 20  enosflag ){.    
1b8d0 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
1b8e0 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28     tplt_linedir(
1b8f0 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d  out,rp->line,lem
1b900 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
1b910 20 7d 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75   }.   fprintf(ou
1b920 74 2c 22 7b 25 73 22 2c 72 70 2d 3e 63 6f 64 65  t,"{%s",rp->code
1b930 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d  );.   for(cp=rp-
1b940 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b  >code; *cp; cp++
1b950 29 7b 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27  ){ if( *cp=='\n'
1b960 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20   ) (*lineno)++; 
1b970 7d 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  }.   fprintf(out
1b980 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e  ,"}\n"); (*linen
1b990 6f 29 2b 2b 3b 0a 20 20 20 69 66 28 20 21 6c 65  o)++;.   if( !le
1b9a0 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  mp->nolinenosfla
1b9b0 67 20 29 7b 0a 20 20 20 20 20 28 2a 6c 69 6e 65  g ){.     (*line
1b9c0 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 74 70 6c 74  no)++;.     tplt
1b9d0 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69  _linedir(out,*li
1b9e0 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  neno,lemp->outna
1b9f0 6d 65 29 3b 0a 20 20 20 7d 0a 20 7d 0a 0a 20 2f  me);.   }. }.. /
1ba00 2a 20 47 65 6e 65 72 61 74 65 20 62 72 65 61 6b  * Generate break
1ba10 64 6f 77 6e 20 63 6f 64 65 20 74 68 61 74 20 6f  down code that o
1ba20 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20  ccurs after the 
1ba30 23 6c 69 6e 65 20 64 69 72 65 63 74 69 76 65 20  #line directive 
1ba40 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65  */. if( rp->code
1ba50 53 75 66 66 69 78 20 26 26 20 72 70 2d 3e 63 6f  Suffix && rp->co
1ba60 64 65 53 75 66 66 69 78 5b 30 5d 20 29 7b 0a 20  deSuffix[0] ){. 
1ba70 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1ba80 25 73 22 2c 20 72 70 2d 3e 63 6f 64 65 53 75 66  %s", rp->codeSuf
1ba90 66 69 78 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d  fix);.   for(cp=
1baa0 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78 3b 20  rp->codeSuffix; 
1bab0 2a 63 70 3b 20 63 70 2b 2b 29 7b 20 69 66 28 20  *cp; cp++){ if( 
1bac0 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69  *cp=='\n' ) (*li
1bad0 6e 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 7d 0a 0a 20  neno)++; }. }.. 
1bae0 69 66 28 20 72 70 2d 3e 63 6f 64 65 50 72 65 66  if( rp->codePref
1baf0 69 78 20 29 7b 0a 20 20 20 66 70 72 69 6e 74 66  ix ){.   fprintf
1bb00 28 6f 75 74 2c 20 22 7d 5c 6e 22 29 3b 20 28 2a  (out, "}\n"); (*
1bb10 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 0a 0a 20  lineno)++;. }.. 
1bb20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
1bb30 20 50 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e   Print the defin
1bb40 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69  ition of the uni
1bb50 6f 6e 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  on used for the 
1bb60 70 61 72 73 65 72 27 73 20 64 61 74 61 20 73 74  parser's data st
1bb70 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69  ack..** This uni
1bb80 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c  on contains fiel
1bb90 64 73 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73  ds for every pos
1bba0 73 69 62 6c 65 20 64 61 74 61 20 74 79 70 65 20  sible data type 
1bbb0 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e  for tokens.** an
1bbc0 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20  d nonterminals. 
1bbd0 20 49 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20   In the process 
1bbe0 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64  of computing and
1bbf0 20 70 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a   printing this.*
1bc00 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65  * union, also se
1bc10 74 20 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66  t the ".dtnum" f
1bc20 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65  ield of every te
1bc30 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65  rminal and nonte
1bc40 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c  rminal.** symbol
1bc50 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f  ..*/.void print_
1bc60 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 0a 20 20 46  stack_union(.  F
1bc70 49 4c 45 20 2a 6f 75 74 2c 20 20 20 20 20 20 20  ILE *out,       
1bc80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1bc90 65 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20  e output stream 
1bca0 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  */.  struct lemo
1bcb0 6e 20 2a 6c 65 6d 70 2c 20 20 20 20 20 20 20 20  n *lemp,        
1bcc0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66   /* The main inf
1bcd0 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  o structure for 
1bce0 74 68 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 20  this parser */. 
1bcf0 20 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 2c 20 20   int *plineno,  
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd10 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c  Pointer to the l
1bd20 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ine number */.  
1bd30 69 6e 74 20 6d 68 66 6c 61 67 20 20 20 20 20 20  int mhflag      
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bd50 72 75 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e  rue if generatin
1bd60 67 20 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75  g makeheaders ou
1bd70 74 70 75 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tput */.){.  int
1bd80 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65   lineno = *pline
1bd90 6e 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69  no;    /* The li
1bda0 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ne number of the
1bdb0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61   output */.  cha
1bdc0 72 20 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20  r **types;      
1bdd0 20 20 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68         /* A hash
1bde0 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79   table of dataty
1bdf0 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72  pes */.  int arr
1be00 61 79 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  aysize;         
1be10 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1be20 65 20 22 74 79 70 65 73 22 20 61 72 72 61 79 20  e "types" array 
1be30 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65  */.  int maxdtle
1be40 6e 67 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f  ngth;          /
1be50 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68  * Maximum length
1be60 20 6f 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79   of any ".dataty
1be70 70 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  pe" field. */.  
1be80 63 68 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20  char *stddt;    
1be90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
1bea0 6e 64 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66  ndardized name f
1beb0 6f 72 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f  or a datatype */
1bec0 0a 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20  .  int i,j;     
1bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bee0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1bef0 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 61 73 68  .  unsigned hash
1bf00 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1bf10 46 6f 72 20 68 61 73 68 69 6e 67 20 74 68 65 20  For hashing the 
1bf20 6e 61 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a  name of a type *
1bf30 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1bf40 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  name;         /*
1bf50 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72   Name of the par
1bf60 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ser */..  /* All
1bf70 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
1bf80 6c 69 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64  lize types[] and
1bf90 20 61 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b   allocate stddt[
1bfa0 5d 20 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65  ] */.  arraysize
1bfb0 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   = lemp->nsymbol
1bfc0 20 2a 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20   * 2;.  types = 
1bfd0 28 63 68 61 72 2a 2a 29 63 61 6c 6c 6f 63 28 20  (char**)calloc( 
1bfe0 61 72 72 61 79 73 69 7a 65 2c 20 73 69 7a 65 6f  arraysize, sizeo
1bff0 66 28 63 68 61 72 2a 29 20 29 3b 0a 20 20 69 66  f(char*) );.  if
1c000 28 20 74 79 70 65 73 3d 3d 30 20 29 7b 0a 20 20  ( types==0 ){.  
1c010 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1c020 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  ,"Out of memory.
1c030 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
1c040 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1c050 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69  ; i<arraysize; i
1c060 2b 2b 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30  ++) types[i] = 0
1c070 3b 0a 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20  ;.  maxdtlength 
1c080 3d 20 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  = 0;.  if( lemp-
1c090 3e 76 61 72 74 79 70 65 20 29 7b 0a 20 20 20 20  >vartype ){.    
1c0a0 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65  maxdtlength = le
1c0b0 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e  monStrlen(lemp->
1c0c0 76 61 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20  vartype);.  }.  
1c0d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1c0e0 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
1c0f0 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
1c100 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1c110 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
1c120 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73  ls[i];.    if( s
1c130 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29  p->datatype==0 )
1c140 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c   continue;.    l
1c150 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  en = lemonStrlen
1c160 28 73 70 2d 3e 64 61 74 61 74 79 70 65 29 3b 0a  (sp->datatype);.
1c170 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 64      if( len>maxd
1c180 74 6c 65 6e 67 74 68 20 29 20 6d 61 78 64 74 6c  tlength ) maxdtl
1c190 65 6e 67 74 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d  ength = len;.  }
1c1a0 0a 20 20 73 74 64 64 74 20 3d 20 28 63 68 61 72  .  stddt = (char
1c1b0 2a 29 6d 61 6c 6c 6f 63 28 20 6d 61 78 64 74 6c  *)malloc( maxdtl
1c1c0 65 6e 67 74 68 2a 32 20 2b 20 31 20 29 3b 0a 20  ength*2 + 1 );. 
1c1d0 20 69 66 28 20 73 74 64 64 74 3d 3d 30 20 29 7b   if( stddt==0 ){
1c1e0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
1c1f0 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f  err,"Out of memo
1c200 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ry.\n");.    exi
1c210 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  t(1);.  }..  /* 
1c220 42 75 69 6c 64 20 61 20 68 61 73 68 20 74 61 62  Build a hash tab
1c230 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e  le of datatypes.
1c240 20 54 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69   The ".dtnum" fi
1c250 65 6c 64 20 6f 66 20 65 61 63 68 20 73 79 6d 62  eld of each symb
1c260 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c 65  ol.  ** is fille
1c270 64 20 69 6e 20 77 69 74 68 20 74 68 65 20 68 61  d in with the ha
1c280 73 68 20 69 6e 64 65 78 20 70 6c 75 73 20 31 2e  sh index plus 1.
1c290 20 20 41 20 22 2e 64 74 6e 75 6d 22 20 76 61 6c    A ".dtnum" val
1c2a0 75 65 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a 20  ue of 0 is.  ** 
1c2b0 75 73 65 64 20 66 6f 72 20 74 65 72 6d 69 6e 61  used for termina
1c2c0 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66 20 74  l symbols.  If t
1c2d0 68 65 72 65 20 69 73 20 6e 6f 20 25 64 65 66 61  here is no %defa
1c2e0 75 6c 74 5f 74 79 70 65 20 64 65 66 69 6e 65 64  ult_type defined
1c2f0 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69 73 20   then.  ** 0 is 
1c300 61 6c 73 6f 20 75 73 65 64 20 61 73 20 74 68 65  also used as the
1c310 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20 66 6f   .dtnum value fo
1c320 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77  r nonterminals w
1c330 68 69 63 68 20 64 6f 20 6e 6f 74 20 73 70 65 63  hich do not spec
1c340 69 66 79 0a 20 20 2a 2a 20 61 20 64 61 74 61 74  ify.  ** a datat
1c350 79 70 65 20 75 73 69 6e 67 20 74 68 65 20 25 74  ype using the %t
1c360 79 70 65 20 64 69 72 65 63 74 69 76 65 2e 0a 20  ype directive.. 
1c370 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
1c380 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
1c390 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
1c3a0 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65   symbol *sp = le
1c3b0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
1c3c0 20 20 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20      char *cp;.  
1c3d0 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e    if( sp==lemp->
1c3e0 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20  errsym ){.      
1c3f0 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72 72 61  sp->dtnum = arra
1c400 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20 20 63  ysize+1;.      c
1c410 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
1c420 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21     if( sp->type!
1c430 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20  =NONTERMINAL || 
1c440 28 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30  (sp->datatype==0
1c450 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70   && lemp->vartyp
1c460 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  e==0) ){.      s
1c470 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20  p->dtnum = 0;.  
1c480 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1c490 20 20 7d 0a 20 20 20 20 63 70 20 3d 20 73 70 2d    }.    cp = sp-
1c4a0 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20 69  >datatype;.    i
1c4b0 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20  f( cp==0 ) cp = 
1c4c0 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b 0a 20  lemp->vartype;. 
1c4d0 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77 68     j = 0;.    wh
1c4e0 69 6c 65 28 20 49 53 53 50 41 43 45 28 2a 63 70  ile( ISSPACE(*cp
1c4f0 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77 68  ) ) cp++;.    wh
1c500 69 6c 65 28 20 2a 63 70 20 29 20 73 74 64 64 74  ile( *cp ) stddt
1c510 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20  [j++] = *cp++;. 
1c520 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26     while( j>0 &&
1c530 20 49 53 53 50 41 43 45 28 73 74 64 64 74 5b 6a   ISSPACE(stddt[j
1c540 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20 20  -1]) ) j--;.    
1c550 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20  stddt[j] = 0;.  
1c560 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65    if( lemp->toke
1c570 6e 74 79 70 65 20 26 26 20 73 74 72 63 6d 70 28  ntype && strcmp(
1c580 73 74 64 64 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b  stddt, lemp->tok
1c590 65 6e 74 79 70 65 29 3d 3d 30 20 29 7b 0a 20 20  entype)==0 ){.  
1c5a0 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
1c5b0 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
1c5c0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73  e;.    }.    has
1c5d0 68 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a  h = 0;.    for(j
1c5e0 3d 30 3b 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b  =0; stddt[j]; j+
1c5f0 2b 29 7b 0a 20 20 20 20 20 20 68 61 73 68 20 3d  +){.      hash =
1c600 20 68 61 73 68 2a 35 33 20 2b 20 73 74 64 64 74   hash*53 + stddt
1c610 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  [j];.    }.    h
1c620 61 73 68 20 3d 20 28 68 61 73 68 20 26 20 30 78  ash = (hash & 0x
1c630 37 66 66 66 66 66 66 66 29 25 61 72 72 61 79 73  7fffffff)%arrays
1c640 69 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ize;.    while( 
1c650 74 79 70 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20  types[hash] ){. 
1c660 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
1c670 74 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64  types[hash],stdd
1c680 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)==0 ){.       
1c690 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73   sp->dtnum = has
1c6a0 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 62  h + 1;.        b
1c6b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1c6c0 20 20 20 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20      hash++;.    
1c6d0 20 20 69 66 28 20 68 61 73 68 3e 3d 28 75 6e 73    if( hash>=(uns
1c6e0 69 67 6e 65 64 29 61 72 72 61 79 73 69 7a 65 20  igned)arraysize 
1c6f0 29 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20  ) hash = 0;.    
1c700 7d 0a 20 20 20 20 69 66 28 20 74 79 70 65 73 5b  }.    if( types[
1c710 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  hash]==0 ){.    
1c720 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61    sp->dtnum = ha
1c730 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 74 79  sh + 1;.      ty
1c740 70 65 73 5b 68 61 73 68 5d 20 3d 20 28 63 68 61  pes[hash] = (cha
1c750 72 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e  r*)malloc( lemon
1c760 53 74 72 6c 65 6e 28 73 74 64 64 74 29 2b 31 20  Strlen(stddt)+1 
1c770 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74 79 70  );.      if( typ
1c780 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20  es[hash]==0 ){. 
1c790 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
1c7a0 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65  tderr,"Out of me
1c7b0 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 20  mory.\n");.     
1c7c0 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
1c7d0 20 20 7d 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f    }.      lemon_
1c7e0 73 74 72 63 70 79 28 74 79 70 65 73 5b 68 61 73  strcpy(types[has
1c7f0 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20 20 7d  h],stddt);.    }
1c800 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74  .  }..  /* Print
1c810 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e 69 74   out the definit
1c820 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54 59  ion of YYTOKENTY
1c830 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54 59  PE and YYMINORTY
1c840 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c  PE */.  name = l
1c850 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70  emp->name ? lemp
1c860 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22  ->name : "Parse"
1c870 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c  ;.  lineno = *pl
1c880 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68 66  ineno;.  if( mhf
1c890 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  lag ){ fprintf(o
1c8a0 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
1c8b0 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
1c8c0 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
1c8d0 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f 4b 45  ,"#define %sTOKE
1c8e0 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d 65  NTYPE %s\n",name
1c8f0 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65  ,.    lemp->toke
1c900 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65  ntype?lemp->toke
1c910 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b 20  ntype:"void*"); 
1c920 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28   lineno++;.  if(
1c930 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e   mhflag ){ fprin
1c940 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e  tf(out,"#endif\n
1c950 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a  "); lineno++; }.
1c960 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 74    fprintf(out,"t
1c970 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e  ypedef union {\n
1c980 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1c990 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69  fprintf(out,"  i
1c9a0 6e 74 20 79 79 69 6e 69 74 3b 5c 6e 22 29 3b 20  nt yyinit;\n"); 
1c9b0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1c9c0 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 54 4f 4b  ntf(out,"  %sTOK
1c9d0 45 4e 54 59 50 45 20 79 79 30 3b 5c 6e 22 2c 6e  ENTYPE yy0;\n",n
1c9e0 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
1c9f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72    for(i=0; i<arr
1ca00 61 79 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  aysize; i++){.  
1ca10 20 20 69 66 28 20 74 79 70 65 73 5b 69 5d 3d 3d    if( types[i]==
1ca20 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1ca30 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1ca40 20 25 73 20 79 79 25 64 3b 5c 6e 22 2c 74 79 70   %s yy%d;\n",typ
1ca50 65 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65  es[i],i+1); line
1ca60 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 74  no++;.    free(t
1ca70 79 70 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  ypes[i]);.  }.  
1ca80 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  if( lemp->errsym
1ca90 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20  ->useCnt ){.    
1caa0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69  fprintf(out,"  i
1cab0 6e 74 20 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70  nt yy%d;\n",lemp
1cac0 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29  ->errsym->dtnum)
1cad0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1cae0 20 20 66 72 65 65 28 73 74 64 64 74 29 3b 0a 20    free(stddt);. 
1caf0 20 66 72 65 65 28 74 79 70 65 73 29 3b 0a 20 20   free(types);.  
1cb00 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20 59  fprintf(out,"} Y
1cb10 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29 3b  YMINORTYPE;\n");
1cb20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c   lineno++;.  *pl
1cb30 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a  ineno = lineno;.
1cb40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1cb50 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 43 20  the name of a C 
1cb60 64 61 74 61 74 79 70 65 20 61 62 6c 65 20 74 6f  datatype able to
1cb70 20 72 65 70 72 65 73 65 6e 74 20 76 61 6c 75 65   represent value
1cb80 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c 77 72  s between.** lwr
1cb90 20 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c 75 73   and upr, inclus
1cba0 69 76 65 2e 20 20 49 66 20 70 6e 42 79 74 65 21  ive.  If pnByte!
1cbb0 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 73 6f 20  =NULL then also 
1cbc0 77 72 69 74 65 20 74 68 65 20 73 69 7a 65 6f 66  write the sizeof
1cbd0 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 74 79 70  .** for that typ
1cbe0 65 20 28 31 2c 20 32 2c 20 6f 72 20 34 29 20 69  e (1, 2, or 4) i
1cbf0 6e 74 6f 20 2a 70 6e 42 79 74 65 2e 0a 2a 2f 0a  nto *pnByte..*/.
1cc00 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
1cc10 72 20 2a 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f  r *minimum_size_
1cc20 74 79 70 65 28 69 6e 74 20 6c 77 72 2c 20 69 6e  type(int lwr, in
1cc30 74 20 75 70 72 2c 20 69 6e 74 20 2a 70 6e 42 79  t upr, int *pnBy
1cc40 74 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  te){.  const cha
1cc50 72 20 2a 7a 54 79 70 65 20 3d 20 22 69 6e 74 22  r *zType = "int"
1cc60 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  ;.  int nByte = 
1cc70 34 3b 0a 20 20 69 66 28 20 6c 77 72 3e 3d 30 20  4;.  if( lwr>=0 
1cc80 29 7b 0a 20 20 20 20 69 66 28 20 75 70 72 3c 3d  ){.    if( upr<=
1cc90 32 35 35 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  255 ){.      zTy
1cca0 70 65 20 3d 20 22 75 6e 73 69 67 6e 65 64 20 63  pe = "unsigned c
1ccb0 68 61 72 22 3b 0a 20 20 20 20 20 20 6e 42 79 74  har";.      nByt
1ccc0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 1;.    }else
1ccd0 20 69 66 28 20 75 70 72 3c 36 35 35 33 35 20 29   if( upr<65535 )
1cce0 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
1ccf0 22 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  "unsigned short 
1cd00 69 6e 74 22 3b 0a 20 20 20 20 20 20 6e 42 79 74  int";.      nByt
1cd10 65 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 2;.    }else
1cd20 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
1cd30 22 75 6e 73 69 67 6e 65 64 20 69 6e 74 22 3b 0a  "unsigned int";.
1cd40 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 34 3b        nByte = 4;
1cd50 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1cd60 66 28 20 6c 77 72 3e 3d 2d 31 32 37 20 26 26 20  f( lwr>=-127 && 
1cd70 75 70 72 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20  upr<=127 ){.    
1cd80 7a 54 79 70 65 20 3d 20 22 73 69 67 6e 65 64 20  zType = "signed 
1cd90 63 68 61 72 22 3b 0a 20 20 20 20 6e 42 79 74 65  char";.    nByte
1cda0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
1cdb0 28 20 6c 77 72 3e 3d 2d 33 32 37 36 37 20 26 26  ( lwr>=-32767 &&
1cdc0 20 75 70 72 3c 33 32 37 36 37 20 29 7b 0a 20 20   upr<32767 ){.  
1cdd0 20 20 7a 54 79 70 65 20 3d 20 22 73 68 6f 72 74    zType = "short
1cde0 22 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 32  ";.    nByte = 2
1cdf0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e 42 79  ;.  }.  if( pnBy
1ce00 74 65 20 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e  te ) *pnByte = n
1ce10 42 79 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 7a  Byte;.  return z
1ce20 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  Type;.}../*.** E
1ce30 61 63 68 20 73 74 61 74 65 20 63 6f 6e 74 61 69  ach state contai
1ce40 6e 73 20 61 20 73 65 74 20 6f 66 20 74 6f 6b 65  ns a set of toke
1ce50 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  n transaction an
1ce60 64 20 61 20 73 65 74 20 6f 66 0a 2a 2a 20 6e 6f  d a set of.** no
1ce70 6e 74 65 72 6d 69 6e 61 6c 20 74 72 61 6e 73 61  nterminal transa
1ce80 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 6f 66  ctions.  Each of
1ce90 20 74 68 65 73 65 20 73 65 74 73 20 6d 61 6b 65   these sets make
1cea0 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a 2a  s an instance.**
1ceb0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1cec0 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 41 6e  g structure.  An
1ced0 20 61 72 72 61 79 20 6f 66 20 74 68 65 73 65 20   array of these 
1cee0 73 74 72 75 63 74 75 72 65 73 20 69 73 20 75 73  structures is us
1cef0 65 64 0a 2a 2a 20 74 6f 20 6f 72 64 65 72 20 74  ed.** to order t
1cf00 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 65  he creation of e
1cf10 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 79 79  ntries in the yy
1cf20 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e  _action[] table.
1cf30 0a 2a 2f 0a 73 74 72 75 63 74 20 61 78 73 65 74  .*/.struct axset
1cf40 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74   {.  struct stat
1cf50 65 20 2a 73 74 70 3b 20 20 20 2f 2a 20 41 20 70  e *stp;   /* A p
1cf60 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74  ointer to a stat
1cf70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 6b 6e  e */.  int isTkn
1cf80 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
1cf90 72 75 65 20 74 6f 20 75 73 65 20 74 6f 6b 65 6e  rue to use token
1cfa0 73 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6e 6f  s.  False for no
1cfb0 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20  n-terminals */. 
1cfc0 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20 20   int nAction;   
1cfd0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1cfe0 6f 66 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  of actions */.  
1cff0 69 6e 74 20 69 4f 72 64 65 72 3b 20 20 20 20 20  int iOrder;     
1d000 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
1d010 20 6f 72 64 65 72 20 6f 66 20 61 63 74 69 6f 6e   order of action
1d020 20 73 65 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   sets */.};../*.
1d030 2a 2a 20 43 6f 6d 70 61 72 65 20 74 6f 20 61 78  ** Compare to ax
1d040 73 65 74 20 73 74 72 75 63 74 75 72 65 73 20 66  set structures f
1d050 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f  or sorting purpo
1d060 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ses.*/.static in
1d070 74 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 28  t axset_compare(
1d080 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63  const void *a, c
1d090 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20  onst void *b){. 
1d0a0 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 70   struct axset *p
1d0b0 31 20 3d 20 28 73 74 72 75 63 74 20 61 78 73 65  1 = (struct axse
1d0c0 74 2a 29 61 3b 0a 20 20 73 74 72 75 63 74 20 61  t*)a;.  struct a
1d0d0 78 73 65 74 20 2a 70 32 20 3d 20 28 73 74 72 75  xset *p2 = (stru
1d0e0 63 74 20 61 78 73 65 74 2a 29 62 3b 0a 20 20 69  ct axset*)b;.  i
1d0f0 6e 74 20 63 3b 0a 20 20 63 20 3d 20 70 32 2d 3e  nt c;.  c = p2->
1d100 6e 41 63 74 69 6f 6e 20 2d 20 70 31 2d 3e 6e 41  nAction - p1->nA
1d110 63 74 69 6f 6e 3b 0a 20 20 69 66 28 20 63 3d 3d  ction;.  if( c==
1d120 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 70 31 2d  0 ){.    c = p1-
1d130 3e 69 4f 72 64 65 72 20 2d 20 70 32 2d 3e 69 4f  >iOrder - p2->iO
1d140 72 64 65 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rder;.  }.  asse
1d150 72 74 28 20 63 21 3d 30 20 7c 7c 20 70 31 3d 3d  rt( c!=0 || p1==
1d160 70 32 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  p2 );.  return c
1d170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
1d180 20 74 65 78 74 20 6f 6e 20 22 6f 75 74 22 20 74   text on "out" t
1d190 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
1d1a0 65 20 72 75 6c 65 20 22 72 70 22 2e 0a 2a 2f 0a  e rule "rp"..*/.
1d1b0 73 74 61 74 69 63 20 76 6f 69 64 20 77 72 69 74  static void writ
1d1c0 65 52 75 6c 65 54 65 78 74 28 46 49 4c 45 20 2a  eRuleText(FILE *
1d1d0 6f 75 74 2c 20 73 74 72 75 63 74 20 72 75 6c 65  out, struct rule
1d1e0 20 2a 72 70 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a   *rp){.  int j;.
1d1f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
1d200 73 20 3a 3a 3d 22 2c 20 72 70 2d 3e 6c 68 73 2d  s ::=", rp->lhs-
1d210 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 6a 3d  >name);.  for(j=
1d220 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b 20 6a  0; j<rp->nrhs; j
1d230 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
1d240 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d  symbol *sp = rp-
1d250 3e 72 68 73 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  >rhs[j];.    if(
1d260 20 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49   sp->type!=MULTI
1d270 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
1d280 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1d290 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  %s", sp->name);.
1d2a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d2b0 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 66 70   int k;.      fp
1d2c0 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c  rintf(out," %s",
1d2d0 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e   sp->subsym[0]->
1d2e0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  name);.      for
1d2f0 28 6b 3d 31 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62  (k=1; k<sp->nsub
1d300 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  sym; k++){.     
1d310 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1d320 7c 25 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b  |%s",sp->subsym[
1d330 6b 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  k]->name);.     
1d340 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
1d350 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 43 20 73  ./* Generate C s
1d360 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74  ource code for t
1d370 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69  he parser */.voi
1d380 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28 0a 20  d ReportTable(. 
1d390 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c   struct lemon *l
1d3a0 65 6d 70 2c 0a 20 20 69 6e 74 20 6d 68 66 6c 61  emp,.  int mhfla
1d3b0 67 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  g     /* Output 
1d3c0 69 6e 20 6d 61 6b 65 68 65 61 64 65 72 73 20 66  in makeheaders f
1d3d0 6f 72 6d 61 74 20 69 66 20 74 72 75 65 20 2a 2f  ormat if true */
1d3e0 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c  .){.  FILE *out,
1d3f0 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 6c 69 6e   *in;.  char lin
1d400 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69  e[LINESIZE];.  i
1d410 6e 74 20 20 6c 69 6e 65 6e 6f 3b 0a 20 20 73 74  nt  lineno;.  st
1d420 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
1d430 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
1d440 20 2a 61 70 3b 0a 20 20 73 74 72 75 63 74 20 72   *ap;.  struct r
1d450 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63  ule *rp;.  struc
1d460 74 20 61 63 74 74 61 62 20 2a 70 41 63 74 74 61  t acttab *pActta
1d470 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  b;.  int i, j, n
1d480 2c 20 73 7a 3b 0a 20 20 69 6e 74 20 73 7a 41 63  , sz;.  int szAc
1d490 74 69 6f 6e 54 79 70 65 3b 20 20 20 20 20 2f 2a  tionType;     /*
1d4a0 20 73 69 7a 65 6f 66 28 59 59 41 43 54 49 4f 4e   sizeof(YYACTION
1d4b0 54 59 50 45 29 20 2a 2f 0a 20 20 69 6e 74 20 73  TYPE) */.  int s
1d4c0 7a 43 6f 64 65 54 79 70 65 3b 20 20 20 20 20 20  zCodeType;      
1d4d0 20 2f 2a 20 73 69 7a 65 6f 66 28 59 59 43 4f 44   /* sizeof(YYCOD
1d4e0 45 54 59 50 45 29 20 20 20 2a 2f 0a 20 20 63 6f  ETYPE)   */.  co
1d4f0 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a  nst char *name;.
1d500 20 20 69 6e 74 20 6d 6e 54 6b 6e 4f 66 73 74 2c    int mnTknOfst,
1d510 20 6d 78 54 6b 6e 4f 66 73 74 3b 0a 20 20 69 6e   mxTknOfst;.  in
1d520 74 20 6d 6e 4e 74 4f 66 73 74 2c 20 6d 78 4e 74  t mnNtOfst, mxNt
1d530 4f 66 73 74 3b 0a 20 20 73 74 72 75 63 74 20 61  Ofst;.  struct a
1d540 78 73 65 74 20 2a 61 78 3b 0a 0a 20 20 69 6e 20  xset *ax;..  in 
1d550 3d 20 74 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d 70  = tplt_open(lemp
1d560 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  );.  if( in==0 )
1d570 20 72 65 74 75 72 6e 3b 0a 20 20 6f 75 74 20 3d   return;.  out =
1d580 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c   file_open(lemp,
1d590 22 2e 63 22 2c 22 77 62 22 29 3b 0a 20 20 69 66  ".c","wb");.  if
1d5a0 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( out==0 ){.    
1d5b0 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
1d5c0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c 69  return;.  }.  li
1d5d0 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 74 70 6c 74  neno = 1;.  tplt
1d5e0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1d5f0 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1d600 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1d610 20 74 68 65 20 69 6e 63 6c 75 64 65 20 63 6f 64   the include cod
1d620 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 74  e, if any */.  t
1d630 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
1d640 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64 65  mp,lemp->include
1d650 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 69 66 28  ,&lineno);.  if(
1d660 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63   mhflag ){.    c
1d670 68 61 72 20 2a 69 6e 63 4e 61 6d 65 20 3d 20 66  har *incName = f
1d680 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d  ile_makename(lem
1d690 70 2c 20 22 2e 68 22 29 3b 0a 20 20 20 20 66 70  p, ".h");.    fp
1d6a0 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63 6c  rintf(out,"#incl
1d6b0 75 64 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 69  ude \"%s\"\n", i
1d6c0 6e 63 4e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ncName); lineno+
1d6d0 2b 3b 0a 20 20 20 20 66 72 65 65 28 69 6e 63 4e  +;.    free(incN
1d6e0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  ame);.  }.  tplt
1d6f0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1d700 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1d710 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1d720 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20 61 6c   #defines for al
1d730 6c 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66  l tokens */.  if
1d740 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( mhflag ){.    
1d750 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 65 66  const char *pref
1d760 69 78 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ix;.    fprintf(
1d770 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41  out,"#if INTERFA
1d780 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  CE\n"); lineno++
1d790 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ;.    if( lemp->
1d7a0 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72  tokenprefix ) pr
1d7b0 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b  efix = lemp->tok
1d7c0 65 6e 70 72 65 66 69 78 3b 0a 20 20 20 20 65 6c  enprefix;.    el
1d7d0 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
1d7e0 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20 22        prefix = "
1d7f0 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ";.    for(i=1; 
1d800 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i<lemp->ntermina
1d810 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  l; i++){.      f
1d820 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1d830 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c  ine %s%-30s %2d\
1d840 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e  n",prefix,lemp->
1d850 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65  symbols[i]->name
1d860 2c 69 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e  ,i);.      linen
1d870 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  o++;.    }.    f
1d880 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64  printf(out,"#end
1d890 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  if\n"); lineno++
1d8a0 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
1d8b0 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1d8c0 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1d8d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
1d8e0 20 64 65 66 69 6e 65 73 20 2a 2f 0a 20 20 66 70   defines */.  fp
1d8f0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1d900 6e 65 20 59 59 43 4f 44 45 54 59 50 45 20 25 73  ne YYCODETYPE %s
1d910 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d  \n",.    minimum
1d920 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65  _size_type(0, le
1d930 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 2c 20 26  mp->nsymbol+1, &
1d940 73 7a 43 6f 64 65 54 79 70 65 29 29 3b 20 6c 69  szCodeType)); li
1d950 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1d960 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1d970 59 4e 4f 43 4f 44 45 20 25 64 5c 6e 22 2c 6c 65  YNOCODE %d\n",le
1d980 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 29 3b 20  mp->nsymbol+1); 
1d990 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1d9a0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1d9b0 65 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 25  e YYACTIONTYPE %
1d9c0 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75  s\n",.    minimu
1d9d0 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c 6c 65  m_size_type(0,le
1d9e0 6d 70 2d 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d  mp->nstate+lemp-
1d9f0 3e 6e 72 75 6c 65 2a 32 2b 35 2c 26 73 7a 41 63  >nrule*2+5,&szAc
1da00 74 69 6f 6e 54 79 70 65 29 29 3b 20 6c 69 6e 65  tionType)); line
1da10 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70  no++;.  if( lemp
1da20 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20  ->wildcard ){.  
1da30 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1da40 64 65 66 69 6e 65 20 59 59 57 49 4c 44 43 41 52  define YYWILDCAR
1da50 44 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  D %d\n",.       
1da60 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 2d 3e  lemp->wildcard->
1da70 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  index); lineno++
1da80 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 5f 73 74  ;.  }.  print_st
1da90 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65  ack_union(out,le
1daa0 6d 70 2c 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61  mp,&lineno,mhfla
1dab0 67 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  g);.  fprintf(ou
1dac0 74 2c 20 22 23 69 66 6e 64 65 66 20 59 59 53 54  t, "#ifndef YYST
1dad0 41 43 4b 44 45 50 54 48 5c 6e 22 29 3b 20 6c 69  ACKDEPTH\n"); li
1dae0 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65  neno++;.  if( le
1daf0 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b  mp->stacksize ){
1db00 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1db10 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54 41 43  ,"#define YYSTAC
1db20 4b 44 45 50 54 48 20 25 73 5c 6e 22 2c 6c 65 6d  KDEPTH %s\n",lem
1db30 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 20 20  p->stacksize);  
1db40 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73  lineno++;.  }els
1db50 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e{.    fprintf(o
1db60 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54  ut,"#define YYST
1db70 41 43 4b 44 45 50 54 48 20 31 30 30 5c 6e 22 29  ACKDEPTH 100\n")
1db80 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ;  lineno++;.  }
1db90 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1dba0 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e  "#endif\n"); lin
1dbb0 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66  eno++;.  if( mhf
1dbc0 6c 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  lag ){.    fprin
1dbd0 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45  tf(out,"#if INTE
1dbe0 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e  RFACE\n"); linen
1dbf0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 20  o++;.  }.  name 
1dc00 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c  = lemp->name ? l
1dc10 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72  emp->name : "Par
1dc20 73 65 22 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  se";.  if( lemp-
1dc30 3e 61 72 67 20 26 26 20 6c 65 6d 70 2d 3e 61 72  >arg && lemp->ar
1dc40 67 5b 30 5d 20 29 7b 0a 20 20 20 20 69 20 3d 20  g[0] ){.    i = 
1dc50 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70  lemonStrlen(lemp
1dc60 2d 3e 61 72 67 29 3b 0a 20 20 20 20 77 68 69 6c  ->arg);.    whil
1dc70 65 28 20 69 3e 3d 31 20 26 26 20 49 53 53 50 41  e( i>=1 && ISSPA
1dc80 43 45 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31  CE(lemp->arg[i-1
1dc90 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 77 68  ]) ) i--;.    wh
1dca0 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 28 49 53  ile( i>=1 && (IS
1dcb0 41 4c 4e 55 4d 28 6c 65 6d 70 2d 3e 61 72 67 5b  ALNUM(lemp->arg[
1dcc0 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d 3e 61  i-1]) || lemp->a
1dcd0 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20 29 20  rg[i-1]=='_') ) 
1dce0 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  i--;.    fprintf
1dcf0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1dd00 41 52 47 5f 53 44 45 43 4c 20 25 73 3b 5c 6e 22  ARG_SDECL %s;\n"
1dd10 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29  ,name,lemp->arg)
1dd20 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1dd30 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1dd40 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43  efine %sARG_PDEC
1dd50 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c 6c 65  L ,%s\n",name,le
1dd60 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e  mp->arg);  linen
1dd70 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1dd80 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1dd90 41 52 47 5f 46 45 54 43 48 20 25 73 20 3d 20 79  ARG_FETCH %s = y
1dda0 79 70 50 61 72 73 65 72 2d 3e 25 73 5c 6e 22 2c  ypParser->%s\n",
1ddb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ddc0 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67    name,lemp->arg
1ddd0 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b  ,&lemp->arg[i]);
1dde0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
1ddf0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1de00 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f 52 45  fine %sARG_STORE
1de10 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73 20 3d   yypParser->%s =
1de20 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
1de30 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 26 6c           name,&l
1de40 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c 26 6c 65 6d  emp->arg[i],&lem
1de50 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e  p->arg[i]);  lin
1de60 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  eno++;.  }else{.
1de70 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1de80 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53  "#define %sARG_S
1de90 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20  DECL\n",name);  
1dea0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70  lineno++;.    fp
1deb0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1dec0 6e 65 20 25 73 41 52 47 5f 50 44 45 43 4c 5c 6e  ne %sARG_PDECL\n
1ded0 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f  ",name);  lineno
1dee0 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1def0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1df00 52 47 5f 46 45 54 43 48 5c 6e 22 2c 6e 61 6d 65  RG_FETCH\n",name
1df10 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1df20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1df30 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f 52  efine %sARG_STOR
1df40 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65  E\n",name); line
1df50 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  no++;.  }.  if( 
1df60 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 66 70  mhflag ){.    fp
1df70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69  rintf(out,"#endi
1df80 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  f\n"); lineno++;
1df90 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d  .  }.  if( lemp-
1dfa0 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20  >errsym->useCnt 
1dfb0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1dfc0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52  ut,"#define YYER
1dfd0 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c 6e 22 2c  RORSYMBOL %d\n",
1dfe0 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 69 6e  lemp->errsym->in
1dff0 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
1e000 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1e010 22 23 64 65 66 69 6e 65 20 59 59 45 52 52 53 59  "#define YYERRSY
1e020 4d 44 54 20 79 79 25 64 5c 6e 22 2c 6c 65 6d 70  MDT yy%d\n",lemp
1e030 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29  ->errsym->dtnum)
1e040 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1e050 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f    if( lemp->has_
1e060 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  fallback ){.    
1e070 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1e080 66 69 6e 65 20 59 59 46 41 4c 4c 42 41 43 4b 20  fine YYFALLBACK 
1e090 31 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  1\n");  lineno++
1e0a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
1e0b0 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74  ute the action t
1e0c0 61 62 6c 65 2c 20 62 75 74 20 64 6f 20 6e 6f 74  able, but do not
1e0d0 20 6f 75 74 70 75 74 20 69 74 20 79 65 74 2e 20   output it yet. 
1e0e0 20 54 68 65 20 61 63 74 69 6f 6e 0a 20 20 2a 2a   The action.  **
1e0f0 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 63   table must be c
1e100 6f 6d 70 75 74 65 64 20 62 65 66 6f 72 65 20 67  omputed before g
1e110 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 59 59  enerating the YY
1e120 4e 53 54 41 54 45 20 6d 61 63 72 6f 20 62 65 63  NSTATE macro bec
1e130 61 75 73 65 0a 20 20 2a 2a 20 77 65 20 6e 65 65  ause.  ** we nee
1e140 64 20 74 6f 20 6b 6e 6f 77 20 68 6f 77 20 6d 61  d to know how ma
1e150 6e 79 20 73 74 61 74 65 73 20 63 61 6e 20 62 65  ny states can be
1e160 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 20 20 2a   eliminated..  *
1e170 2f 0a 20 20 61 78 20 3d 20 28 73 74 72 75 63 74  /.  ax = (struct
1e180 20 61 78 73 65 74 20 2a 29 20 63 61 6c 6c 6f 63   axset *) calloc
1e190 28 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2a 32  (lemp->nxstate*2
1e1a0 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 29  , sizeof(ax[0]))
1e1b0 3b 0a 20 20 69 66 28 20 61 78 3d 3d 30 20 29 7b  ;.  if( ax==0 ){
1e1c0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
1e1d0 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  err,"malloc fail
1e1e0 65 64 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ed\n");.    exit
1e1f0 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  (1);.  }.  for(i
1e200 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74  =0; i<lemp->nxst
1e210 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
1e220 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
1e230 64 5b 69 5d 3b 0a 20 20 20 20 61 78 5b 69 2a 32  d[i];.    ax[i*2
1e240 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20  ].stp = stp;.   
1e250 20 61 78 5b 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d   ax[i*2].isTkn =
1e260 20 31 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e   1;.    ax[i*2].
1e270 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e  nAction = stp->n
1e280 54 6b 6e 41 63 74 3b 0a 20 20 20 20 61 78 5b 69  TknAct;.    ax[i
1e290 2a 32 2b 31 5d 2e 73 74 70 20 3d 20 73 74 70 3b  *2+1].stp = stp;
1e2a0 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 69  .    ax[i*2+1].i
1e2b0 73 54 6b 6e 20 3d 20 30 3b 0a 20 20 20 20 61 78  sTkn = 0;.    ax
1e2c0 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20  [i*2+1].nAction 
1e2d0 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20  = stp->nNtAct;. 
1e2e0 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73 74 20 3d   }.  mxTknOfst =
1e2f0 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a   mnTknOfst = 0;.
1e300 20 20 6d 78 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e    mxNtOfst = mnN
1e310 74 4f 66 73 74 20 3d 20 30 3b 0a 20 20 2f 2a 20  tOfst = 0;.  /* 
1e320 49 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  In an effort to 
1e330 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 63 74  minimize the act
1e340 69 6f 6e 20 74 61 62 6c 65 20 73 69 7a 65 2c 20  ion table size, 
1e350 75 73 65 20 74 68 65 20 68 65 75 72 69 73 74 69  use the heuristi
1e360 63 0a 20 20 2a 2a 20 6f 66 20 70 6c 61 63 69 6e  c.  ** of placin
1e370 67 20 74 68 65 20 6c 61 72 67 65 73 74 20 61 63  g the largest ac
1e380 74 69 6f 6e 20 73 65 74 73 20 66 69 72 73 74 20  tion sets first 
1e390 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1e3a0 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2a 32 3b  lemp->nxstate*2;
1e3b0 20 69 2b 2b 29 20 61 78 5b 69 5d 2e 69 4f 72 64   i++) ax[i].iOrd
1e3c0 65 72 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74 28  er = i;.  qsort(
1e3d0 61 78 2c 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  ax, lemp->nxstat
1e3e0 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30  e*2, sizeof(ax[0
1e3f0 5d 29 2c 20 61 78 73 65 74 5f 63 6f 6d 70 61 72  ]), axset_compar
1e400 65 29 3b 0a 20 20 70 41 63 74 74 61 62 20 3d 20  e);.  pActtab = 
1e410 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28 29 3b 0a  acttab_alloc();.
1e420 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1e430 70 2d 3e 6e 78 73 74 61 74 65 2a 32 20 26 26 20  p->nxstate*2 && 
1e440 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 3e 30 3b  ax[i].nAction>0;
1e450 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
1e460 20 61 78 5b 69 5d 2e 73 74 70 3b 0a 20 20 20 20   ax[i].stp;.    
1e470 69 66 28 20 61 78 5b 69 5d 2e 69 73 54 6b 6e 20  if( ax[i].isTkn 
1e480 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 3d  ){.      for(ap=
1e490 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
1e4a0 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
1e4b0 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20     int action;. 
1e4c0 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73         if( ap->s
1e4d0 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d 70 2d 3e  p->index>=lemp->
1e4e0 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74  nterminal ) cont
1e4f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63  inue;.        ac
1e500 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61  tion = compute_a
1e510 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b  ction(lemp, ap);
1e520 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63 74  .        if( act
1e530 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65  ion<0 ) continue
1e540 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74 61 62  ;.        acttab
1e550 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c  _action(pActtab,
1e560 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20   ap->sp->index, 
1e570 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  action);.      }
1e580 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e  .      stp->iTkn
1e590 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69 6e  Ofst = acttab_in
1e5a0 73 65 72 74 28 70 41 63 74 74 61 62 29 3b 0a 20  sert(pActtab);. 
1e5b0 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 54       if( stp->iT
1e5c0 6b 6e 4f 66 73 74 3c 6d 6e 54 6b 6e 4f 66 73 74  knOfst<mnTknOfst
1e5d0 20 29 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 73   ) mnTknOfst = s
1e5e0 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20  tp->iTknOfst;.  
1e5f0 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 54 6b      if( stp->iTk
1e600 6e 4f 66 73 74 3e 6d 78 54 6b 6e 4f 66 73 74 20  nOfst>mxTknOfst 
1e610 29 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 73 74  ) mxTknOfst = st
1e620 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20  p->iTknOfst;.   
1e630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
1e640 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1e650 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1e660 20 20 20 20 20 20 20 20 69 6e 74 20 61 63 74 69          int acti
1e670 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  on;.        if( 
1e680 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65  ap->sp->index<le
1e690 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20  mp->nterminal ) 
1e6a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1e6b0 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e    if( ap->sp->in
1e6c0 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62  dex==lemp->nsymb
1e6d0 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ol ) continue;. 
1e6e0 20 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20         action = 
1e6f0 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c  compute_action(l
1e700 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20  emp, ap);.      
1e710 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29    if( action<0 )
1e720 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1e730 20 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e     acttab_action
1e740 28 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70  (pActtab, ap->sp
1e750 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29  ->index, action)
1e760 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e770 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 61  stp->iNtOfst = a
1e780 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41 63  cttab_insert(pAc
1e790 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ttab);.      if(
1e7a0 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e   stp->iNtOfst<mn
1e7b0 4e 74 4f 66 73 74 20 29 20 6d 6e 4e 74 4f 66 73  NtOfst ) mnNtOfs
1e7c0 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  t = stp->iNtOfst
1e7d0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d  ;.      if( stp-
1e7e0 3e 69 4e 74 4f 66 73 74 3e 6d 78 4e 74 4f 66 73  >iNtOfst>mxNtOfs
1e7f0 74 20 29 20 6d 78 4e 74 4f 66 73 74 20 3d 20 73  t ) mxNtOfst = s
1e800 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20  tp->iNtOfst;.   
1e810 20 7d 0a 23 69 66 20 30 20 20 2f 2a 20 55 6e 63   }.#if 0  /* Unc
1e820 6f 6d 6d 65 6e 74 20 66 6f 72 20 61 20 74 72 61  omment for a tra
1e830 63 65 20 6f 66 20 68 6f 77 20 74 68 65 20 79 79  ce of how the yy
1e840 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20  _action[] table 
1e850 66 69 6c 6c 73 20 6f 75 74 20 2a 2f 0a 20 20 20  fills out */.   
1e860 20 7b 20 69 6e 74 20 6a 6a 2c 20 6e 6e 3b 0a 20   { int jj, nn;. 
1e870 20 20 20 20 20 66 6f 72 28 6a 6a 3d 6e 6e 3d 30       for(jj=nn=0
1e880 3b 20 6a 6a 3c 70 41 63 74 74 61 62 2d 3e 6e 41  ; jj<pActtab->nA
1e890 63 74 69 6f 6e 3b 20 6a 6a 2b 2b 29 7b 0a 20 20  ction; jj++){.  
1e8a0 20 20 20 20 20 20 69 66 28 20 70 41 63 74 74 61        if( pActta
1e8b0 62 2d 3e 61 41 63 74 69 6f 6e 5b 6a 6a 5d 2e 61  b->aAction[jj].a
1e8c0 63 74 69 6f 6e 3c 30 20 29 20 6e 6e 2b 2b 3b 0a  ction<0 ) nn++;.
1e8d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72        }.      pr
1e8e0 69 6e 74 66 28 22 25 34 64 3a 20 53 74 61 74 65  intf("%4d: State
1e8f0 20 25 33 64 20 25 73 20 6e 3a 20 25 32 64 20 73   %3d %s n: %2d s
1e900 69 7a 65 3a 20 25 35 64 20 66 72 65 65 73 70 61  ize: %5d freespa
1e910 63 65 3a 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ce: %d\n",.     
1e920 20 20 20 20 20 20 20 20 69 2c 20 73 74 70 2d 3e          i, stp->
1e930 73 74 61 74 65 6e 75 6d 2c 20 61 78 5b 69 5d 2e  statenum, ax[i].
1e940 69 73 54 6b 6e 20 3f 20 22 54 6f 6b 65 6e 22 20  isTkn ? "Token" 
1e950 3a 20 22 56 61 72 20 20 22 2c 0a 20 20 20 20 20  : "Var  ",.     
1e960 20 20 20 20 20 20 20 20 61 78 5b 69 5d 2e 6e 41          ax[i].nA
1e970 63 74 69 6f 6e 2c 20 70 41 63 74 74 61 62 2d 3e  ction, pActtab->
1e980 6e 41 63 74 69 6f 6e 2c 20 6e 6e 29 3b 0a 20 20  nAction, nn);.  
1e990 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
1e9a0 20 66 72 65 65 28 61 78 29 3b 0a 0a 20 20 2f 2a   free(ax);..  /*
1e9b0 20 46 69 6e 69 73 68 20 72 65 6e 64 65 72 69 6e   Finish renderin
1e9c0 67 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 73 20  g the constants 
1e9d0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 61 63 74  now that the act
1e9e0 69 6f 6e 20 74 61 62 6c 65 20 68 61 73 0a 20 20  ion table has.  
1e9f0 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 75 74 65 64  ** been computed
1ea00 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1ea10 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 53 54  t,"#define YYNST
1ea20 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20 20  ATE             
1ea30 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 78 73 74  %d\n",lemp->nxst
1ea40 61 74 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  ate);  lineno++;
1ea50 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1ea60 23 64 65 66 69 6e 65 20 59 59 4e 52 55 4c 45 20  #define YYNRULE 
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
1ea80 6e 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b  n",lemp->nrule);
1ea90 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70    lineno++;.  fp
1eaa0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1eab0 6e 65 20 59 59 5f 4d 41 58 5f 53 48 49 46 54 20  ne YY_MAX_SHIFT 
1eac0 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 6c 65          %d\n",le
1ead0 6d 70 2d 3e 6e 78 73 74 61 74 65 2d 31 29 3b 20  mp->nxstate-1); 
1eae0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1eaf0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1eb00 20 59 59 5f 4d 49 4e 5f 53 48 49 46 54 52 45 44   YY_MIN_SHIFTRED
1eb10 55 43 45 20 20 20 25 64 5c 6e 22 2c 6c 65 6d 70  UCE   %d\n",lemp
1eb20 2d 3e 6e 73 74 61 74 65 29 3b 20 6c 69 6e 65 6e  ->nstate); linen
1eb30 6f 2b 2b 3b 0a 20 20 69 20 3d 20 6c 65 6d 70 2d  o++;.  i = lemp-
1eb40 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e  >nstate + lemp->
1eb50 6e 72 75 6c 65 3b 0a 20 20 66 70 72 69 6e 74 66  nrule;.  fprintf
1eb60 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1eb70 5f 4d 41 58 5f 53 48 49 46 54 52 45 44 55 43 45  _MAX_SHIFTREDUCE
1eb80 20 20 20 25 64 5c 6e 22 2c 20 69 2d 31 29 3b 20     %d\n", i-1); 
1eb90 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1eba0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1ebb0 20 59 59 5f 4d 49 4e 5f 52 45 44 55 43 45 20 20   YY_MIN_REDUCE  
1ebc0 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 29 3b        %d\n", i);
1ebd0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 20 3d   lineno++;.  i =
1ebe0 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20   lemp->nstate + 
1ebf0 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2a 32 3b 0a 20  lemp->nrule*2;. 
1ec00 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1ec10 65 66 69 6e 65 20 59 59 5f 4d 41 58 5f 52 45 44  efine YY_MAX_RED
1ec20 55 43 45 20 20 20 20 20 20 20 20 25 64 5c 6e 22  UCE        %d\n"
1ec30 2c 20 69 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  , i-1); lineno++
1ec40 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1ec50 22 23 64 65 66 69 6e 65 20 59 59 5f 45 52 52 4f  "#define YY_ERRO
1ec60 52 5f 41 43 54 49 4f 4e 20 20 20 20 20 20 25 64  R_ACTION      %d
1ec70 5c 6e 22 2c 20 69 29 3b 20 6c 69 6e 65 6e 6f 2b  \n", i); lineno+
1ec80 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1ec90 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 41 43 43  ,"#define YY_ACC
1eca0 45 50 54 5f 41 43 54 49 4f 4e 20 20 20 20 20 25  EPT_ACTION     %
1ecb0 64 5c 6e 22 2c 20 69 2b 31 29 3b 20 6c 69 6e 65  d\n", i+1); line
1ecc0 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1ecd0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f  out,"#define YY_
1ece0 4e 4f 5f 41 43 54 49 4f 4e 20 20 20 20 20 20 20  NO_ACTION       
1ecf0 20 20 25 64 5c 6e 22 2c 20 69 2b 32 29 3b 20 6c    %d\n", i+2); l
1ed00 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f  ineno++;.  tplt_
1ed10 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1ed20 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1ed30 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6f 75 74 70 75  ..  /* Now outpu
1ed40 74 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  t the action tab
1ed50 6c 65 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63  le and its assoc
1ed60 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  iates:.  **.  **
1ed70 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20 20    yy_action[]   
1ed80 20 20 20 20 20 41 20 73 69 6e 67 6c 65 20 74 61       A single ta
1ed90 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ble containing a
1eda0 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a  ll actions..  **
1edb0 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d    yy_lookahead[]
1edc0 20 20 20 20 20 41 20 74 61 62 6c 65 20 63 6f 6e       A table con
1edd0 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 6b  taining the look
1ede0 61 68 65 61 64 20 66 6f 72 20 65 61 63 68 20 65  ahead for each e
1edf0 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20 20 20  ntry in.  **    
1ee00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee10 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73 65   yy_action.  Use
1ee20 64 20 74 6f 20 64 65 74 65 63 74 20 68 61 73 68  d to detect hash
1ee30 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a   collisions..  *
1ee40 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74  *  yy_shift_ofst
1ee50 5b 5d 20 20 20 20 46 6f 72 20 65 61 63 68 20 73  []    For each s
1ee60 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74  tate, the offset
1ee70 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20   into yy_action 
1ee80 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  for.  **        
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 69               shi
1eea0 66 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c 73 2e  fting terminals.
1eeb0 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64 75 63 65  .  **  yy_reduce
1eec0 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20 65 61  _ofst[]   For ea
1eed0 63 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66  ch state, the of
1eee0 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74  fset into yy_act
1eef0 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20  ion for.  **    
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef10 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d 74 65   shifting non-te
1ef20 72 6d 69 6e 61 6c 73 20 61 66 74 65 72 20 61 20  rminals after a 
1ef30 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20 79 79  reduce..  **  yy
1ef40 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20 20 20 20  _default[]      
1ef50 20 44 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20   Default action 
1ef60 66 6f 72 20 65 61 63 68 20 73 74 61 74 65 2e 0a  for each state..
1ef70 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75    */..  /* Outpu
1ef80 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20  t the yy_action 
1ef90 74 61 62 6c 65 20 2a 2f 0a 20 20 6c 65 6d 70 2d  table */.  lemp-
1efa0 3e 6e 61 63 74 69 6f 6e 74 61 62 20 3d 20 6e 20  >nactiontab = n 
1efb0 3d 20 61 63 74 74 61 62 5f 73 69 7a 65 28 70 41  = acttab_size(pA
1efc0 63 74 74 61 62 29 3b 0a 20 20 6c 65 6d 70 2d 3e  cttab);.  lemp->
1efd0 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a 73  tablesize += n*s
1efe0 7a 41 63 74 69 6f 6e 54 79 70 65 3b 0a 20 20 66  zActionType;.  f
1eff0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1f000 69 6e 65 20 59 59 5f 41 43 54 54 41 42 5f 43 4f  ine YY_ACTTAB_CO
1f010 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e 29 3b  UNT (%d)\n", n);
1f020 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1f030 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63  intf(out,"static
1f040 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e 54   const YYACTIONT
1f050 59 50 45 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  YPE yy_action[] 
1f060 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  = {\n"); lineno+
1f070 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  +;.  for(i=j=0; 
1f080 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
1f090 6e 74 20 61 63 74 69 6f 6e 20 3d 20 61 63 74 74  nt action = actt
1f0a0 61 62 5f 79 79 61 63 74 69 6f 6e 28 70 41 63 74  ab_yyaction(pAct
1f0b0 74 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  tab, i);.    if(
1f0c0 20 61 63 74 69 6f 6e 3c 30 20 29 20 61 63 74 69   action<0 ) acti
1f0d0 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  on = lemp->nstat
1f0e0 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20  e + lemp->nrule 
1f0f0 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  + 2;.    if( j==
1f100 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
1f110 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
1f120 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1f130 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 61 63 74  ut, " %4d,", act
1f140 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  ion);.    if( j=
1f150 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
1f160 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1f170 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
1f180 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
1f190 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f1a0 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1f1b0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1f1c0 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
1f1d0 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  +;..  /* Output 
1f1e0 74 68 65 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64  the yy_lookahead
1f1f0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6c 65 6d 70   table */.  lemp
1f200 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e  ->tablesize += n
1f210 2a 73 7a 43 6f 64 65 54 79 70 65 3b 0a 20 20 66  *szCodeType;.  f
1f220 70 72 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74  printf(out,"stat
1f230 69 63 20 63 6f 6e 73 74 20 59 59 43 4f 44 45 54  ic const YYCODET
1f240 59 50 45 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64  YPE yy_lookahead
1f250 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65  [] = {\n"); line
1f260 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  no++;.  for(i=j=
1f270 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
1f280 20 20 69 6e 74 20 6c 61 20 3d 20 61 63 74 74 61    int la = actta
1f290 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 70 41  b_yylookahead(pA
1f2a0 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20 20 69  cttab, i);.    i
1f2b0 66 28 20 6c 61 3c 30 20 29 20 6c 61 20 3d 20 6c  f( la<0 ) la = l
1f2c0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a 20 20  emp->nsymbol;.  
1f2d0 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
1f2e0 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
1f2f0 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
1f300 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
1f310 34 64 2c 22 2c 20 6c 61 29 3b 0a 20 20 20 20 69  4d,", la);.    i
1f320 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d  f( j==9 || i==n-
1f330 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  1 ){.      fprin
1f340 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c  tf(out, "\n"); l
1f350 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a  ineno++;.      j
1f360 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1f370 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
1f380 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  }.  }.  fprintf(
1f390 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69  out, "};\n"); li
1f3a0 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75  neno++;..  /* Ou
1f3b0 74 70 75 74 20 74 68 65 20 79 79 5f 73 68 69 66  tput the yy_shif
1f3c0 74 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a  t_ofst[] table *
1f3d0 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
1f3e0 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49   "#define YY_SHI
1f3f0 46 54 5f 55 53 45 5f 44 46 4c 54 20 28 25 64 29  FT_USE_DFLT (%d)
1f400 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 2d 31  \n", mnTknOfst-1
1f410 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e  ); lineno++;.  n
1f420 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65   = lemp->nxstate
1f430 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  ;.  while( n>0 &
1f440 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e  & lemp->sorted[n
1f450 2d 31 5d 2d 3e 69 54 6b 6e 4f 66 73 74 3d 3d 4e  -1]->iTknOfst==N
1f460 4f 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a  O_OFFSET ) n--;.
1f470 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1f480 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54  #define YY_SHIFT
1f490 5f 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20  _COUNT (%d)\n", 
1f4a0 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  n-1); lineno++;.
1f4b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1f4c0 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54  #define YY_SHIFT
1f4d0 5f 4d 49 4e 20 20 20 28 25 64 29 5c 6e 22 2c 20  _MIN   (%d)\n", 
1f4e0 6d 6e 54 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e 65  mnTknOfst); line
1f4f0 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1f500 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
1f510 5f 53 48 49 46 54 5f 4d 41 58 20 20 20 28 25 64  _SHIFT_MAX   (%d
1f520 29 5c 6e 22 2c 20 6d 78 54 6b 6e 4f 66 73 74 29  )\n", mxTknOfst)
1f530 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1f540 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74  rintf(out, "stat
1f550 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f 73  ic const %s yy_s
1f560 68 69 66 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c  hift_ofst[] = {\
1f570 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6d  n", .          m
1f580 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65  inimum_size_type
1f590 28 6d 6e 54 6b 6e 4f 66 73 74 2d 31 2c 20 6d 78  (mnTknOfst-1, mx
1f5a0 54 6b 6e 4f 66 73 74 2c 20 26 73 7a 29 29 3b 20  TknOfst, &sz)); 
1f5b0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6c 65 6d 70  lineno++;.  lemp
1f5c0 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e  ->tablesize += n
1f5d0 2a 73 7a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  *sz;.  for(i=j=0
1f5e0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1f5f0 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73   int ofst;.    s
1f600 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
1f610 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d  d[i];.    ofst =
1f620 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a   stp->iTknOfst;.
1f630 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f      if( ofst==NO
1f640 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d  _OFFSET ) ofst =
1f650 20 6d 6e 54 6b 6e 4f 66 73 74 20 2d 20 31 3b 0a   mnTknOfst - 1;.
1f660 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
1f670 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
1f680 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
1f690 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1f6a0 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20   %4d,", ofst);. 
1f6b0 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69     if( j==9 || i
1f6c0 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  ==n-1 ){.      f
1f6d0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
1f6e0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1f6f0 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65     j = 0;.    }e
1f700 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  lse{.      j++;.
1f710 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69      }.  }.  fpri
1f720 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29  ntf(out, "};\n")
1f730 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f  ; lineno++;..  /
1f740 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f  * Output the yy_
1f750 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 74 61  reduce_ofst[] ta
1f760 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ble */.  fprintf
1f770 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
1f780 59 5f 52 45 44 55 43 45 5f 55 53 45 5f 44 46 4c  Y_REDUCE_USE_DFL
1f790 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f  T (%d)\n", mnNtO
1f7a0 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  fst-1); lineno++
1f7b0 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 78  ;.  n = lemp->nx
1f7c0 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20  state;.  while( 
1f7d0 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72  n>0 && lemp->sor
1f7e0 74 65 64 5b 6e 2d 31 5d 2d 3e 69 4e 74 4f 66 73  ted[n-1]->iNtOfs
1f7f0 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e  t==NO_OFFSET ) n
1f800 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  --;.  fprintf(ou
1f810 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52  t, "#define YY_R
1f820 45 44 55 43 45 5f 43 4f 55 4e 54 20 28 25 64 29  EDUCE_COUNT (%d)
1f830 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e  \n", n-1); linen
1f840 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1f850 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f  ut, "#define YY_
1f860 52 45 44 55 43 45 5f 4d 49 4e 20 20 20 28 25 64  REDUCE_MIN   (%d
1f870 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74 29 3b  )\n", mnNtOfst);
1f880 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1f890 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
1f8a0 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 41 58  ne YY_REDUCE_MAX
1f8b0 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 78 4e 74     (%d)\n", mxNt
1f8c0 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  Ofst); lineno++;
1f8d0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1f8e0 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73  "static const %s
1f8f0 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b   yy_reduce_ofst[
1f900 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20  ] = {\n", .     
1f910 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a       minimum_siz
1f920 65 5f 74 79 70 65 28 6d 6e 4e 74 4f 66 73 74 2d  e_type(mnNtOfst-
1f930 31 2c 20 6d 78 4e 74 4f 66 73 74 2c 20 26 73 7a  1, mxNtOfst, &sz
1f940 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  )); lineno++;.  
1f950 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20  lemp->tablesize 
1f960 2b 3d 20 6e 2a 73 7a 3b 0a 20 20 66 6f 72 28 69  += n*sz;.  for(i
1f970 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
1f980 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20  .    int ofst;. 
1f990 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
1f9a0 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66  orted[i];.    of
1f9b0 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73  st = stp->iNtOfs
1f9c0 74 3b 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d  t;.    if( ofst=
1f9d0 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73  =NO_OFFSET ) ofs
1f9e0 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 2d 20 31  t = mnNtOfst - 1
1f9f0 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29  ;.    if( j==0 )
1fa00 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
1fa10 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a  * %5d */ ", i);.
1fa20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1fa30 20 22 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b   " %4d,", ofst);
1fa40 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
1fa50 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
1fa60 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
1fa70 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1fa80 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
1fa90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
1faa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
1fab0 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
1fac0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
1fad0 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 64   /* Output the d
1fae0 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 74 61  efault action ta
1faf0 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ble */.  fprintf
1fb00 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f  (out, "static co
1fb10 6e 73 74 20 59 59 41 43 54 49 4f 4e 54 59 50 45  nst YYACTIONTYPE
1fb20 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 3d 20   yy_default[] = 
1fb30 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  {\n"); lineno++;
1fb40 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73  .  n = lemp->nxs
1fb50 74 61 74 65 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61  tate;.  lemp->ta
1fb60 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 41  blesize += n*szA
1fb70 63 74 69 6f 6e 54 79 70 65 3b 0a 20 20 66 6f 72  ctionType;.  for
1fb80 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
1fb90 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
1fba0 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
1fbb0 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
1fbc0 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
1fbd0 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
1fbe0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
1fbf0 34 64 2c 22 2c 20 73 74 70 2d 3e 69 44 66 6c 74  4d,", stp->iDflt
1fc00 52 65 64 75 63 65 2b 6c 65 6d 70 2d 3e 6e 73 74  Reduce+lemp->nst
1fc10 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29  ate+lemp->nrule)
1fc20 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c  ;.    if( j==9 |
1fc30 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20  | i==n-1 ){.    
1fc40 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1fc50 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1fc60 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
1fc70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b   }else{.      j+
1fc80 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  +;.    }.  }.  f
1fc90 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c  printf(out, "};\
1fca0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1fcb0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1fcc0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1fcd0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1fce0 65 72 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  erate the table 
1fcf0 6f 66 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65  of fallback toke
1fd00 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ns..  */.  if( l
1fd10 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63  emp->has_fallbac
1fd20 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 78 20  k ){.    int mx 
1fd30 3d 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  = lemp->ntermina
1fd40 6c 20 2d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65  l - 1;.    while
1fd50 28 20 6d 78 3e 30 20 26 26 20 6c 65 6d 70 2d 3e  ( mx>0 && lemp->
1fd60 73 79 6d 62 6f 6c 73 5b 6d 78 5d 2d 3e 66 61 6c  symbols[mx]->fal
1fd70 6c 62 61 63 6b 3d 3d 30 20 29 7b 20 6d 78 2d 2d  lback==0 ){ mx--
1fd80 3b 20 7d 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 61  ; }.    lemp->ta
1fd90 62 6c 65 73 69 7a 65 20 2b 3d 20 28 6d 78 2b 31  blesize += (mx+1
1fda0 29 2a 73 7a 43 6f 64 65 54 79 70 65 3b 0a 20 20  )*szCodeType;.  
1fdb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6d 78    for(i=0; i<=mx
1fdc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
1fdd0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70 20 3d  ruct symbol *p =
1fde0 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
1fdf0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ];.      if( p->
1fe00 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20  fallback==0 ){. 
1fe10 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1fe20 75 74 2c 20 22 20 20 20 20 30 2c 20 20 2f 2a 20  ut, "    0,  /* 
1fe30 25 31 30 73 20 3d 3e 20 6e 6f 74 68 69 6e 67 20  %10s => nothing 
1fe40 2a 2f 5c 6e 22 2c 20 70 2d 3e 6e 61 6d 65 29 3b  */\n", p->name);
1fe50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1fe60 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1fe70 74 2c 20 22 20 20 25 33 64 2c 20 20 2f 2a 20 25  t, "  %3d,  /* %
1fe80 31 30 73 20 3d 3e 20 25 73 20 2a 2f 5c 6e 22 2c  10s => %s */\n",
1fe90 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 69 6e   p->fallback->in
1fea0 64 65 78 2c 0a 20 20 20 20 20 20 20 20 20 20 70  dex,.          p
1feb0 2d 3e 6e 61 6d 65 2c 20 70 2d 3e 66 61 6c 6c 62  ->name, p->fallb
1fec0 61 63 6b 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  ack->name);.    
1fed0 20 20 7d 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f    }.      lineno
1fee0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1fef0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1ff00 6e 61 6d 65 2c 20 69 6e 2c 20 6f 75 74 2c 20 26  name, in, out, &
1ff10 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1ff20 65 6e 65 72 61 74 65 20 61 20 74 61 62 6c 65 20  enerate a table 
1ff30 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
1ff40 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 6f 66 20  ymbolic name of 
1ff50 65 76 65 72 79 20 73 79 6d 62 6f 6c 0a 20 20 2a  every symbol.  *
1ff60 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
1ff70 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
1ff80 2b 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70  +){.    lemon_sp
1ff90 72 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25 73  rintf(line,"\"%s
1ffa0 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  \",",lemp->symbo
1ffb0 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ls[i]->name);.  
1ffc0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1ffd0 20 25 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a 20   %-15s",line);. 
1ffe0 20 20 20 69 66 28 20 28 69 26 33 29 3d 3d 33 20     if( (i&3)==3 
1fff0 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ){ fprintf(out,"
20000 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n"); lineno++; 
20010 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 26 33  }.  }.  if( (i&3
20020 29 21 3d 30 20 29 7b 20 66 70 72 69 6e 74 66 28  )!=0 ){ fprintf(
20030 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  out,"\n"); linen
20040 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78 66  o++; }.  tplt_xf
20050 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
20060 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
20070 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
20080 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
20090 20 61 20 74 65 78 74 20 73 74 72 69 6e 67 20 74   a text string t
200a0 68 61 74 20 64 65 73 63 72 69 62 65 73 20 65 76  hat describes ev
200b0 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69 6e  ery.  ** rule in
200c0 20 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f 66   the rule set of
200d0 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 54   the grammar.  T
200e0 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
200f0 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68 65  is used.  ** whe
20100 6e 20 74 72 61 63 69 6e 67 20 52 45 44 55 43 45  n tracing REDUCE
20110 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20   actions..  */. 
20120 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d   for(i=0, rp=lem
20130 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
20140 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a  rp->next, i++){.
20150 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e      assert( rp->
20160 69 6e 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20 20  index==i );.    
20170 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
20180 20 25 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29 3b   %3d */ \"", i);
20190 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65  .    writeRuleTe
201a0 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20  xt(out, rp);.   
201b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22   fprintf(out,"\"
201c0 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ,\n"); lineno++;
201d0 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
201e0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
201f0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
20200 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
20210 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
20220 65 76 65 72 79 20 74 69 6d 65 20 61 20 73 79 6d  every time a sym
20230 62 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72  bol is popped fr
20240 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63  om.  ** the stac
20250 6b 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  k while processi
20260 6e 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68 69  ng errors or whi
20270 6c 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68  le destroying th
20280 65 20 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a 20  e parser. .  ** 
20290 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
202a0 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 25 64   generate the %d
202b0 65 73 74 72 75 63 74 6f 72 20 61 63 74 69 6f 6e  estructor action
202c0 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65  s).  */.  if( le
202d0 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b  mp->tokendest ){
202e0 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20  .    int once = 
202f0 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  1;.    for(i=0; 
20300 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
20310 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
20320 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
20330 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
20340 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d  ];.      if( sp=
20350 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d  =0 || sp->type!=
20360 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69  TERMINAL ) conti
20370 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  nue;.      if( o
20380 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66  nce ){.        f
20390 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20  printf(out, "   
203a0 20 20 20 2f 2a 20 54 45 52 4d 49 4e 41 4c 20 44     /* TERMINAL D
203b0 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29  estructor */\n")
203c0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
203d0 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
203e0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
203f0 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
20400 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e  e %d: /* %s */\n
20410 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70  ", sp->index, sp
20420 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ->name); lineno+
20430 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  +;.    }.    for
20440 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
20450 79 6d 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73  ymbol && lemp->s
20460 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21  ymbols[i]->type!
20470 3d 54 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b  =TERMINAL; i++);
20480 0a 20 20 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d  .    if( i<lemp-
20490 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20  >nsymbol ){.    
204a0 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f    emit_destructo
204b0 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d  r_code(out,lemp-
204c0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70  >symbols[i],lemp
204d0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  ,&lineno);.     
204e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
204f0 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20      break;\n"); 
20500 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
20510 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e    }.  if( lemp->
20520 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20 73  vardest ){.    s
20530 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66  truct symbol *df
20540 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20 69  lt_sp = 0;.    i
20550 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20  nt once = 1;.   
20560 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
20570 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
20580 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79  .      struct sy
20590 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
205a0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
205b0 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20     if( sp==0 || 
205c0 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
205d0 41 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  AL ||.          
205e0 73 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20  sp->index<=0 || 
205f0 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d  sp->destructor!=
20600 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
20610 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a      if( once ){.
20620 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
20630 6f 75 74 2c 20 22 20 20 20 20 20 20 2f 2a 20 44  out, "      /* D
20640 65 66 61 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49  efault NON-TERMI
20650 4e 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a  NAL Destructor *
20660 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  /\n"); lineno++;
20670 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20  .        once = 
20680 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
20690 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
206a0 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73    case %d: /* %s
206b0 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65   */\n", sp->inde
206c0 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69  x, sp->name); li
206d0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66  neno++;.      df
206e0 6c 74 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20 20  lt_sp = sp;.    
206f0 7d 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5f 73  }.    if( dflt_s
20700 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 6d  p!=0 ){.      em
20710 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
20720 64 65 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c  de(out,dflt_sp,l
20730 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  emp,&lineno);.  
20740 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
20750 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b  out,"      break
20760 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
20770 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
20780 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
20790 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
207a0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
207b0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
207c0 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c  .    if( sp==0 |
207d0 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  | sp->type==TERM
207e0 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73 74  INAL || sp->dest
207f0 72 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e 74  ructor==0 ) cont
20800 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74  inue;.    fprint
20810 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20  f(out,"    case 
20820 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c  %d: /* %s */\n",
20830 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e   sp->index, sp->
20840 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
20850 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65  ..    /* Combine
20860 20 64 75 70 6c 69 63 61 74 65 20 64 65 73 74 72   duplicate destr
20870 75 63 74 6f 72 73 20 69 6e 74 6f 20 61 20 73 69  uctors into a si
20880 6e 67 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20 20  ngle case */.   
20890 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65   for(j=i+1; j<le
208a0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b  mp->nsymbol; j++
208b0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
208c0 73 79 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c 65  symbol *sp2 = le
208d0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a  mp->symbols[j];.
208e0 20 20 20 20 20 20 69 66 28 20 73 70 32 20 26 26        if( sp2 &&
208f0 20 73 70 32 2d 3e 74 79 70 65 21 3d 54 45 52 4d   sp2->type!=TERM
20900 49 4e 41 4c 20 26 26 20 73 70 32 2d 3e 64 65 73  INAL && sp2->des
20910 74 72 75 63 74 6f 72 0a 20 20 20 20 20 20 20 20  tructor.        
20920 20 20 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d 3d    && sp2->dtnum=
20930 3d 73 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20 20  =sp->dtnum.     
20940 20 20 20 20 20 26 26 20 73 74 72 63 6d 70 28 73       && strcmp(s
20950 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 2c 73 70  p->destructor,sp
20960 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 29 3d 3d  2->destructor)==
20970 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 66 70  0 ){.         fp
20980 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63  rintf(out,"    c
20990 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f  ase %d: /* %s */
209a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
209b0 20 20 20 20 20 20 73 70 32 2d 3e 69 6e 64 65 78        sp2->index
209c0 2c 20 73 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c 69  , sp2->name); li
209d0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
209e0 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72   sp2->destructor
209f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
20a00 20 20 7d 0a 0a 20 20 20 20 65 6d 69 74 5f 64 65    }..    emit_de
20a10 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75  structor_code(ou
20a20 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  t,lemp->symbols[
20a30 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  i],lemp,&lineno)
20a40 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
20a50 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c  t,"      break;\
20a60 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
20a70 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
20a80 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
20a90 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
20aa0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
20ab0 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
20ac0 65 6e 65 76 65 72 20 74 68 65 20 70 61 72 73 65  enever the parse
20ad0 72 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77  r stack overflow
20ae0 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  s */.  tplt_prin
20af0 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
20b00 3e 6f 76 65 72 66 6c 6f 77 2c 26 6c 69 6e 65 6e  >overflow,&linen
20b10 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  o);.  tplt_xfer(
20b20 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
20b30 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
20b40 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74  * Generate the t
20b50 61 62 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e 66  able of rule inf
20b60 6f 72 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a 20  ormation .  **. 
20b70 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 63   ** Note: This c
20b80 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
20b90 68 65 20 66 61 63 74 20 74 68 61 74 20 72 75 6c  he fact that rul
20ba0 65 73 20 61 72 65 20 6e 75 6d 62 65 72 0a 20 20  es are number.  
20bb0 2a 2a 20 73 65 71 75 65 6e 74 75 61 6c 6c 79 20  ** sequentually 
20bc0 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30  beginning with 0
20bd0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d  ..  */.  for(rp=
20be0 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
20bf0 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
20c00 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
20c10 20 7b 20 25 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c   { %d, %d },\n",
20c20 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c 72  rp->lhs->index,r
20c30 70 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e 65 6e 6f  p->nrhs); lineno
20c40 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  ++;.  }.  tplt_x
20c50 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
20c60 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
20c70 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
20c80 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
20c90 69 6f 6e 20 64 75 72 69 6e 67 20 65 61 63 68 20  ion during each 
20ca0 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f  REDUCE action */
20cb0 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
20cc0 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
20cd0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 74 72 61 6e  >next){.    tran
20ce0 73 6c 61 74 65 5f 63 6f 64 65 28 6c 65 6d 70 2c  slate_code(lemp,
20cf0 20 72 70 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46   rp);.  }.  /* F
20d00 69 72 73 74 20 6f 75 74 70 75 74 20 72 75 6c 65  irst output rule
20d10 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  s other than the
20d20 20 64 65 66 61 75 6c 74 3a 20 72 75 6c 65 20 2a   default: rule *
20d30 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  /.  for(rp=lemp-
20d40 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
20d50 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 73 74 72  ->next){.    str
20d60 75 63 74 20 72 75 6c 65 20 2a 72 70 32 3b 20 20  uct rule *rp2;  
20d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20d80 4f 74 68 65 72 20 72 75 6c 65 73 20 77 69 74 68  Other rules with
20d90 20 74 68 65 20 73 61 6d 65 20 61 63 74 69 6f 6e   the same action
20da0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 70 2d 3e   */.    if( rp->
20db0 63 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  code==0 ) contin
20dc0 75 65 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  ue;.    if( rp->
20dd0 63 6f 64 65 5b 30 5d 3d 3d 27 5c 6e 27 20 26 26  code[0]=='\n' &&
20de0 20 72 70 2d 3e 63 6f 64 65 5b 31 5d 3d 3d 30 20   rp->code[1]==0 
20df0 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 57  ) continue; /* W
20e00 69 6c 6c 20 62 65 20 64 65 66 61 75 6c 74 3a 20  ill be default: 
20e10 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  */.    fprintf(o
20e20 75 74 2c 22 20 20 20 20 20 20 63 61 73 65 20 25  ut,"      case %
20e30 64 3a 20 2f 2a 20 22 2c 20 72 70 2d 3e 69 6e 64  d: /* ", rp->ind
20e40 65 78 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75  ex);.    writeRu
20e50 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b  leText(out, rp);
20e60 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
20e70 2c 20 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65  , " */\n"); line
20e80 6e 6f 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 72 70  no++;.    for(rp
20e90 32 3d 72 70 2d 3e 6e 65 78 74 3b 20 72 70 32 3b  2=rp->next; rp2;
20ea0 20 72 70 32 3d 72 70 32 2d 3e 6e 65 78 74 29 7b   rp2=rp2->next){
20eb0 0a 20 20 20 20 20 20 69 66 28 20 72 70 32 2d 3e  .      if( rp2->
20ec0 63 6f 64 65 3d 3d 72 70 2d 3e 63 6f 64 65 20 29  code==rp->code )
20ed0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
20ee0 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73  f(out,"      cas
20ef0 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70 32 2d  e %d: /* ", rp2-
20f00 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20  >index);.       
20f10 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f   writeRuleText(o
20f20 75 74 2c 20 72 70 32 29 3b 0a 20 20 20 20 20 20  ut, rp2);.      
20f30 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
20f40 2a 2f 20 79 79 74 65 73 74 63 61 73 65 28 79 79  */ yytestcase(yy
20f50 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c  ruleno==%d);\n",
20f60 20 72 70 32 2d 3e 69 6e 64 65 78 29 3b 20 6c 69   rp2->index); li
20f70 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
20f80 72 70 32 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20  rp2->code = 0;. 
20f90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
20fa0 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72   emit_code(out,r
20fb0 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b  p,lemp,&lineno);
20fc0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
20fd0 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ,"        break;
20fe0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
20ff0 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30      rp->code = 0
21000 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 6e 61 6c  ;.  }.  /* Final
21010 6c 79 2c 20 6f 75 74 70 75 74 20 74 68 65 20 64  ly, output the d
21020 65 66 61 75 6c 74 3a 20 72 75 6c 65 2e 20 20 57  efault: rule.  W
21030 65 20 63 68 6f 6f 73 65 20 61 73 20 74 68 65 20  e choose as the 
21040 64 65 66 61 75 6c 74 3a 20 61 6c 6c 0a 20 20 2a  default: all.  *
21050 2a 20 65 6d 70 74 79 20 61 63 74 69 6f 6e 73 2e  * empty actions.
21060 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
21070 74 2c 22 20 20 20 20 20 20 64 65 66 61 75 6c 74  t,"      default
21080 3a 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  :\n"); lineno++;
21090 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
210a0 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
210b0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
210c0 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 20 63 6f  rp->code==0 ) co
210d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
210e0 72 74 28 20 72 70 2d 3e 63 6f 64 65 5b 30 5d 3d  rt( rp->code[0]=
210f0 3d 27 5c 6e 27 20 26 26 20 72 70 2d 3e 63 6f 64  ='\n' && rp->cod
21100 65 5b 31 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 66  e[1]==0 );.    f
21110 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
21120 20 20 2f 2a 20 28 25 64 29 20 22 2c 20 72 70 2d    /* (%d) ", rp-
21130 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 77 72 69  >index);.    wri
21140 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20  teRuleText(out, 
21150 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  rp);.    fprintf
21160 28 6f 75 74 2c 20 22 20 2a 2f 20 79 79 74 65 73  (out, " */ yytes
21170 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d  tcase(yyruleno==
21180 25 64 29 3b 5c 6e 22 2c 20 72 70 2d 3e 69 6e 64  %d);\n", rp->ind
21190 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ex); lineno++;. 
211a0 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
211b0 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ,"        break;
211c0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
211d0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
211e0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
211f0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
21200 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
21210 68 20 65 78 65 63 75 74 65 73 20 69 66 20 61 20  h executes if a 
21220 70 61 72 73 65 20 66 61 69 6c 73 20 2a 2f 0a 20  parse fails */. 
21230 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
21240 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75  lemp,lemp->failu
21250 72 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74  re,&lineno);.  t
21260 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
21270 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
21280 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
21290 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
212a0 78 65 63 75 74 65 73 20 77 68 65 6e 20 61 20 73  xecutes when a s
212b0 79 6e 74 61 78 20 65 72 72 6f 72 20 6f 63 63 75  yntax error occu
212c0 72 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  rs */.  tplt_pri
212d0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
212e0 2d 3e 65 72 72 6f 72 2c 26 6c 69 6e 65 6e 6f 29  ->error,&lineno)
212f0 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
21300 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
21310 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
21320 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
21330 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65  ich executes whe
21340 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 63 63  n the parser acc
21350 65 70 74 73 20 69 74 73 20 69 6e 70 75 74 20 2a  epts its input *
21360 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  /.  tplt_print(o
21370 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61 63  ut,lemp,lemp->ac
21380 63 65 70 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  cept,&lineno);. 
21390 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
213a0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
213b0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41 70 70  neno);..  /* App
213c0 65 6e 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e  end any addition
213d0 20 63 6f 64 65 20 74 68 65 20 75 73 65 72 20 64   code the user d
213e0 65 73 69 72 65 73 20 2a 2f 0a 20 20 74 70 6c 74  esires */.  tplt
213f0 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
21400 6c 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65 2c  lemp->extracode,
21410 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63 6c  &lineno);..  fcl
21420 6f 73 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f 73  ose(in);.  fclos
21430 65 28 6f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e  e(out);.  return
21440 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  ;.}../* Generate
21450 20 61 20 68 65 61 64 65 72 20 66 69 6c 65 20 66   a header file f
21460 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  or the parser */
21470 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65 61 64  .void ReportHead
21480 65 72 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  er(struct lemon 
21490 2a 6c 65 6d 70 29 0a 7b 0a 20 20 46 49 4c 45 20  *lemp).{.  FILE 
214a0 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 6f 6e  *out, *in;.  con
214b0 73 74 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b  st char *prefix;
214c0 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e  .  char line[LIN
214d0 45 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70  ESIZE];.  char p
214e0 61 74 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d  attern[LINESIZE]
214f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
21500 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65  ( lemp->tokenpre
21510 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c  fix ) prefix = l
21520 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78  emp->tokenprefix
21530 3b 0a 20 20 65 6c 73 65 20 20 20 20 20 20 20 20  ;.  else        
21540 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66              pref
21550 69 78 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d 20  ix = "";.  in = 
21560 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22  file_open(lemp,"
21570 2e 68 22 2c 22 72 62 22 29 3b 0a 20 20 69 66 28  .h","rb");.  if(
21580 20 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e   in ){.    int n
21590 65 78 74 43 68 61 72 3b 0a 20 20 20 20 66 6f 72  extChar;.    for
215a0 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74  (i=1; i<lemp->nt
215b0 65 72 6d 69 6e 61 6c 20 26 26 20 66 67 65 74 73  erminal && fgets
215c0 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69  (line,LINESIZE,i
215d0 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  n); i++){.      
215e0 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 70 61  lemon_sprintf(pa
215f0 74 74 65 72 6e 2c 22 23 64 65 66 69 6e 65 20 25  ttern,"#define %
21600 73 25 2d 33 30 73 20 25 33 64 5c 6e 22 2c 0a 20  s%-30s %3d\n",. 
21610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21620 20 20 20 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e     prefix,lemp->
21630 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65  symbols[i]->name
21640 2c 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ,i);.      if( s
21650 74 72 63 6d 70 28 6c 69 6e 65 2c 70 61 74 74 65  trcmp(line,patte
21660 72 6e 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  rn) ) break;.   
21670 20 7d 0a 20 20 20 20 6e 65 78 74 43 68 61 72 20   }.    nextChar 
21680 3d 20 66 67 65 74 63 28 69 6e 29 3b 0a 20 20 20  = fgetc(in);.   
21690 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
216a0 20 69 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74   if( i==lemp->nt
216b0 65 72 6d 69 6e 61 6c 20 26 26 20 6e 65 78 74 43  erminal && nextC
216c0 68 61 72 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20  har==EOF ){.    
216d0 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 67 65 20 69    /* No change i
216e0 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 44 6f 6e  n the file.  Don
216f0 27 74 20 72 65 77 72 69 74 65 20 69 74 2e 20 2a  't rewrite it. *
21700 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  /.      return;.
21710 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 20      }.  }.  out 
21720 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70  = file_open(lemp
21730 2c 22 2e 68 22 2c 22 77 62 22 29 3b 0a 20 20 69  ,".h","wb");.  i
21740 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 66 6f  f( out ){.    fo
21750 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=1; i<lemp->n
21760 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a  terminal; i++){.
21770 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
21780 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33  t,"#define %s%-3
21790 30 73 20 25 33 64 5c 6e 22 2c 70 72 65 66 69 78  0s %3d\n",prefix
217a0 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
217b0 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20  ]->name,i);.    
217c0 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74  }.    fclose(out
217d0 29 3b 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  );  .  }.  retur
217e0 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63 65 20  n;.}../* Reduce 
217f0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
21800 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 2c 20 69  action tables, i
21810 66 20 70 6f 73 73 69 62 6c 65 2c 20 62 79 20 6d  f possible, by m
21820 61 6b 69 6e 67 20 75 73 65 0a 2a 2a 20 6f 66 20  aking use.** of 
21830 64 65 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20  defaults..**.** 
21840 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 2c  In this version,
21850 20 77 65 20 74 61 6b 65 20 74 68 65 20 6d 6f 73   we take the mos
21860 74 20 66 72 65 71 75 65 6e 74 20 52 45 44 55 43  t frequent REDUC
21870 45 20 61 63 74 69 6f 6e 20 61 6e 64 20 6d 61 6b  E action and mak
21880 65 0a 2a 2a 20 69 74 20 74 68 65 20 64 65 66 61  e.** it the defa
21890 75 6c 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68  ult.  Except, th
218a0 65 72 65 20 69 73 20 6e 6f 20 64 65 66 61 75 6c  ere is no defaul
218b0 74 20 69 66 20 74 68 65 20 77 69 6c 64 63 61 72  t if the wildcar
218c0 64 20 74 6f 6b 65 6e 0a 2a 2a 20 69 73 20 61 20  d token.** is a 
218d0 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 2d 61 68  possible look-ah
218e0 65 61 64 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d  ead..*/.void Com
218f0 70 72 65 73 73 54 61 62 6c 65 73 28 73 74 72 75  pressTables(stru
21900 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
21910 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
21920 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
21930 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 61 70 32  action *ap, *ap2
21940 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
21950 2a 72 70 2c 20 2a 72 70 32 2c 20 2a 72 62 65 73  *rp, *rp2, *rbes
21960 74 3b 0a 20 20 69 6e 74 20 6e 62 65 73 74 2c 20  t;.  int nbest, 
21970 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
21980 74 20 75 73 65 73 57 69 6c 64 63 61 72 64 3b 0a  t usesWildcard;.
21990 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
219a0 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
219b0 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
219c0 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
219d0 20 6e 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20   nbest = 0;.    
219e0 72 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 75  rbest = 0;.    u
219f0 73 65 73 57 69 6c 64 63 61 72 64 20 3d 20 30 3b  sesWildcard = 0;
21a00 0a 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  ..    for(ap=stp
21a10 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
21a20 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
21a30 28 20 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46  ( ap->type==SHIF
21a40 54 20 26 26 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d  T && ap->sp==lem
21a50 70 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20  p->wildcard ){. 
21a60 20 20 20 20 20 20 20 75 73 65 73 57 69 6c 64 63         usesWildc
21a70 61 72 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ard = 1;.      }
21a80 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
21a90 79 70 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f  ype!=REDUCE ) co
21aa0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 70  ntinue;.      rp
21ab0 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20   = ap->x.rp;.   
21ac0 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 53 74     if( rp->lhsSt
21ad0 61 72 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  art ) continue;.
21ae0 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d 72 62        if( rp==rb
21af0 65 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  est ) continue;.
21b00 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
21b10 20 20 20 66 6f 72 28 61 70 32 3d 61 70 2d 3e 6e     for(ap2=ap->n
21b20 65 78 74 3b 20 61 70 32 3b 20 61 70 32 3d 61 70  ext; ap2; ap2=ap
21b30 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  2->next){.      
21b40 20 20 69 66 28 20 61 70 32 2d 3e 74 79 70 65 21    if( ap2->type!
21b50 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e  =REDUCE ) contin
21b60 75 65 3b 0a 20 20 20 20 20 20 20 20 72 70 32 20  ue;.        rp2 
21b70 3d 20 61 70 32 2d 3e 78 2e 72 70 3b 0a 20 20 20  = ap2->x.rp;.   
21b80 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72 62       if( rp2==rb
21b90 65 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  est ) continue;.
21ba0 20 20 20 20 20 20 20 20 69 66 28 20 72 70 32 3d          if( rp2=
21bb0 3d 72 70 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20  =rp ) n++;.     
21bc0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e   }.      if( n>n
21bd0 62 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  best ){.        
21be0 6e 62 65 73 74 20 3d 20 6e 3b 0a 20 20 20 20 20  nbest = n;.     
21bf0 20 20 20 72 62 65 73 74 20 3d 20 72 70 3b 0a 20     rbest = rp;. 
21c00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 0a 20       }.    }. . 
21c10 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b     /* Do not mak
21c20 65 20 61 20 64 65 66 61 75 6c 74 20 69 66 20 74  e a default if t
21c30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 75 6c  he number of rul
21c40 65 73 20 74 6f 20 64 65 66 61 75 6c 74 0a 20 20  es to default.  
21c50 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 74 20 6c    ** is not at l
21c60 65 61 73 74 20 31 20 6f 72 20 69 66 20 74 68 65  east 1 or if the
21c70 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e 20   wildcard token 
21c80 69 73 20 61 20 70 6f 73 73 69 62 6c 65 0a 20 20  is a possible.  
21c90 20 20 2a 2a 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a    ** lookahead..
21ca0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
21cb0 62 65 73 74 3c 31 20 7c 7c 20 75 73 65 73 57 69  best<1 || usesWi
21cc0 6c 64 63 61 72 64 20 29 20 63 6f 6e 74 69 6e 75  ldcard ) continu
21cd0 65 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62  e;...    /* Comb
21ce0 69 6e 65 20 6d 61 74 63 68 69 6e 67 20 52 45 44  ine matching RED
21cf0 55 43 45 20 61 63 74 69 6f 6e 73 20 69 6e 74 6f  UCE actions into
21d00 20 61 20 73 69 6e 67 6c 65 20 64 65 66 61 75 6c   a single defaul
21d10 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 61 70 3d  t */.    for(ap=
21d20 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
21d30 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
21d40 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52   if( ap->type==R
21d50 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72  EDUCE && ap->x.r
21d60 70 3d 3d 72 62 65 73 74 20 29 20 62 72 65 61 6b  p==rbest ) break
21d70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
21d80 72 74 28 20 61 70 20 29 3b 0a 20 20 20 20 61 70  rt( ap );.    ap
21d90 2d 3e 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  ->sp = Symbol_ne
21da0 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a  w("{default}");.
21db0 20 20 20 20 66 6f 72 28 61 70 3d 61 70 2d 3e 6e      for(ap=ap->n
21dc0 65 78 74 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  ext; ap; ap=ap->
21dd0 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
21de0 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43   ap->type==REDUC
21df0 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72  E && ap->x.rp==r
21e00 62 65 73 74 20 29 20 61 70 2d 3e 74 79 70 65 20  best ) ap->type 
21e10 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a 20 20 20 20  = NOT_USED;.    
21e20 7d 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20  }.    stp->ap = 
21e30 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d  Action_sort(stp-
21e40 3e 61 70 29 3b 0a 0a 20 20 20 20 66 6f 72 28 61  >ap);..    for(a
21e50 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
21e60 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
21e70 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
21e80 3d 53 48 49 46 54 20 29 20 62 72 65 61 6b 3b 0a  =SHIFT ) break;.
21e90 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
21ea0 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70  pe==REDUCE && ap
21eb0 2d 3e 78 2e 72 70 21 3d 72 62 65 73 74 20 29 20  ->x.rp!=rbest ) 
21ec0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
21ed0 20 69 66 28 20 61 70 3d 3d 30 20 29 7b 0a 20 20   if( ap==0 ){.  
21ee0 20 20 20 20 73 74 70 2d 3e 61 75 74 6f 52 65 64      stp->autoRed
21ef0 75 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  uce = 1;.      s
21f00 74 70 2d 3e 70 44 66 6c 74 52 65 64 75 63 65 20  tp->pDfltReduce 
21f10 3d 20 72 62 65 73 74 3b 0a 20 20 20 20 7d 0a 20  = rbest;.    }. 
21f20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20   }..  /* Make a 
21f30 73 65 63 6f 6e 64 20 70 61 73 73 20 6f 76 65 72  second pass over
21f40 20 61 6c 6c 20 73 74 61 74 65 73 20 61 6e 64 20   all states and 
21f50 61 63 74 69 6f 6e 73 2e 20 20 43 6f 6e 76 65 72  actions.  Conver
21f60 74 0a 20 20 2a 2a 20 65 76 65 72 79 20 61 63 74  t.  ** every act
21f70 69 6f 6e 20 74 68 61 74 20 69 73 20 61 20 53 48  ion that is a SH
21f80 49 46 54 20 74 6f 20 61 6e 20 61 75 74 6f 52 65  IFT to an autoRe
21f90 64 75 63 65 20 73 74 61 74 65 20 69 6e 74 6f 0a  duce state into.
21fa0 20 20 2a 2a 20 61 20 53 48 49 46 54 52 45 44 55    ** a SHIFTREDU
21fb0 43 45 20 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  CE action..  */.
21fc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
21fd0 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
21fe0 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
21ff0 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
22000 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
22010 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
22020 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
22030 74 61 74 65 20 2a 70 4e 65 78 74 53 74 61 74 65  tate *pNextState
22040 3b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  ;.      if( ap->
22050 74 79 70 65 21 3d 53 48 49 46 54 20 29 20 63 6f  type!=SHIFT ) co
22060 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4e  ntinue;.      pN
22070 65 78 74 53 74 61 74 65 20 3d 20 61 70 2d 3e 78  extState = ap->x
22080 2e 73 74 70 3b 0a 20 20 20 20 20 20 69 66 28 20  .stp;.      if( 
22090 70 4e 65 78 74 53 74 61 74 65 2d 3e 61 75 74 6f  pNextState->auto
220a0 52 65 64 75 63 65 20 26 26 20 70 4e 65 78 74 53  Reduce && pNextS
220b0 74 61 74 65 2d 3e 70 44 66 6c 74 52 65 64 75 63  tate->pDfltReduc
220c0 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=0 ){.        
220d0 61 70 2d 3e 74 79 70 65 20 3d 20 53 48 49 46 54  ap->type = SHIFT
220e0 52 45 44 55 43 45 3b 0a 20 20 20 20 20 20 20 20  REDUCE;.        
220f0 61 70 2d 3e 78 2e 72 70 20 3d 20 70 4e 65 78 74  ap->x.rp = pNext
22100 53 74 61 74 65 2d 3e 70 44 66 6c 74 52 65 64 75  State->pDfltRedu
22110 63 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ce;.      }.    
22120 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
22130 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61 74  Compare two stat
22140 65 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70  es for sorting p
22150 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 73 6d  urposes.  The sm
22160 61 6c 6c 65 72 20 73 74 61 74 65 20 69 73 20 74  aller state is t
22170 68 65 0a 2a 2a 20 6f 6e 65 20 77 69 74 68 20 74  he.** one with t
22180 68 65 20 6d 6f 73 74 20 6e 6f 6e 2d 74 65 72 6d  he most non-term
22190 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2e 20 20 49  inal actions.  I
221a0 66 20 74 68 65 79 20 68 61 76 65 20 74 68 65 20  f they have the 
221b0 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f  same number.** o
221c0 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61  f non-terminal a
221d0 63 74 69 6f 6e 73 2c 20 74 68 65 6e 20 74 68 65  ctions, then the
221e0 20 73 6d 61 6c 6c 65 72 20 69 73 20 74 68 65 20   smaller is the 
221f0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73  one with the mos
22200 74 0a 2a 2a 20 74 6f 6b 65 6e 20 61 63 74 69 6f  t.** token actio
22210 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
22220 74 20 73 74 61 74 65 52 65 73 6f 72 74 43 6f 6d  t stateResortCom
22230 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20  pare(const void 
22240 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  *a, const void *
22250 62 29 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  b){.  const stru
22260 63 74 20 73 74 61 74 65 20 2a 70 41 20 3d 20 2a  ct state *pA = *
22270 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74  (const struct st
22280 61 74 65 2a 2a 29 61 3b 0a 20 20 63 6f 6e 73 74  ate**)a;.  const
22290 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 70   struct state *p
222a0 42 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75  B = *(const stru
222b0 63 74 20 73 74 61 74 65 2a 2a 29 62 3b 0a 20 20  ct state**)b;.  
222c0 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 42  int n;..  n = pB
222d0 2d 3e 6e 4e 74 41 63 74 20 2d 20 70 41 2d 3e 6e  ->nNtAct - pA->n
222e0 4e 74 41 63 74 3b 0a 20 20 69 66 28 20 6e 3d 3d  NtAct;.  if( n==
222f0 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 42 2d  0 ){.    n = pB-
22300 3e 6e 54 6b 6e 41 63 74 20 2d 20 70 41 2d 3e 6e  >nTknAct - pA->n
22310 54 6b 6e 41 63 74 3b 0a 20 20 20 20 69 66 28 20  TknAct;.    if( 
22320 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 20  n==0 ){.      n 
22330 3d 20 70 42 2d 3e 73 74 61 74 65 6e 75 6d 20 2d  = pB->statenum -
22340 20 70 41 2d 3e 73 74 61 74 65 6e 75 6d 3b 0a 20   pA->statenum;. 
22350 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
22360 74 28 20 6e 21 3d 30 20 29 3b 0a 20 20 72 65 74  t( n!=0 );.  ret
22370 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
22380 20 52 65 6e 75 6d 62 65 72 20 61 6e 64 20 72 65   Renumber and re
22390 73 6f 72 74 20 73 74 61 74 65 73 20 73 6f 20 74  sort states so t
223a0 68 61 74 20 73 74 61 74 65 73 20 77 69 74 68 20  hat states with 
223b0 66 65 77 65 72 20 63 68 6f 69 63 65 73 0a 2a 2a  fewer choices.**
223c0 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e   occur at the en
223d0 64 2e 20 20 45 78 63 65 70 74 2c 20 6b 65 65 70  d.  Except, keep
223e0 20 73 74 61 74 65 20 30 20 61 73 20 74 68 65 20   state 0 as the 
223f0 66 69 72 73 74 20 73 74 61 74 65 2e 0a 2a 2f 0a  first state..*/.
22400 76 6f 69 64 20 52 65 73 6f 72 74 53 74 61 74 65  void ResortState
22410 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
22420 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  lemp).{.  int i;
22430 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
22440 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61  *stp;.  struct a
22450 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a 20 20 66 6f  ction *ap;..  fo
22460 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
22470 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
22480 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
22490 74 65 64 5b 69 5d 3b 0a 20 20 20 20 73 74 70 2d  ted[i];.    stp-
224a0 3e 6e 54 6b 6e 41 63 74 20 3d 20 73 74 70 2d 3e  >nTknAct = stp->
224b0 6e 4e 74 41 63 74 20 3d 20 30 3b 0a 20 20 20 20  nNtAct = 0;.    
224c0 73 74 70 2d 3e 69 44 66 6c 74 52 65 64 75 63 65  stp->iDfltReduce
224d0 20 3d 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 20   = lemp->nrule; 
224e0 20 2f 2a 20 49 6e 69 74 20 64 66 6c 74 20 61 63   /* Init dflt ac
224f0 74 69 6f 6e 20 74 6f 20 22 73 79 6e 74 61 78 20  tion to "syntax 
22500 65 72 72 6f 72 22 20 2a 2f 0a 20 20 20 20 73 74  error" */.    st
22510 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f  p->iTknOfst = NO
22520 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 73 74 70  _OFFSET;.    stp
22530 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f  ->iNtOfst = NO_O
22540 46 46 53 45 54 3b 0a 20 20 20 20 66 6f 72 28 61  FFSET;.    for(a
22550 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
22560 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
22570 20 20 20 69 6e 74 20 69 41 63 74 69 6f 6e 20 3d     int iAction =
22580 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28   compute_action(
22590 6c 65 6d 70 2c 61 70 29 3b 0a 20 20 20 20 20 20  lemp,ap);.      
225a0 69 66 28 20 69 41 63 74 69 6f 6e 3e 3d 30 20 29  if( iAction>=0 )
225b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  {.        if( ap
225c0 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70  ->sp->index<lemp
225d0 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20  ->nterminal ){. 
225e0 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 54           stp->nT
225f0 6b 6e 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20  knAct++;.       
22600 20 7d 65 6c 73 65 20 69 66 28 20 61 70 2d 3e 73   }else if( ap->s
22610 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e  p->index<lemp->n
22620 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20  symbol ){.      
22630 20 20 20 20 73 74 70 2d 3e 6e 4e 74 41 63 74 2b      stp->nNtAct+
22640 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
22650 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
22660 72 74 28 20 73 74 70 2d 3e 61 75 74 6f 52 65 64  rt( stp->autoRed
22670 75 63 65 3d 3d 30 20 7c 7c 20 73 74 70 2d 3e 70  uce==0 || stp->p
22680 44 66 6c 74 52 65 64 75 63 65 3d 3d 61 70 2d 3e  DfltReduce==ap->
22690 78 2e 72 70 20 29 3b 0a 20 20 20 20 20 20 20 20  x.rp );.        
226a0 20 20 73 74 70 2d 3e 69 44 66 6c 74 52 65 64 75    stp->iDfltRedu
226b0 63 65 20 3d 20 69 41 63 74 69 6f 6e 20 2d 20 6c  ce = iAction - l
226c0 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2d 20 6c 65  emp->nstate - le
226d0 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20 20 20  mp->nrule;.     
226e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
226f0 20 7d 0a 20 20 7d 0a 20 20 71 73 6f 72 74 28 26   }.  }.  qsort(&
22700 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c  lemp->sorted[1],
22710 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2d 31 2c   lemp->nstate-1,
22720 20 73 69 7a 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f   sizeof(lemp->so
22730 72 74 65 64 5b 30 5d 29 2c 0a 20 20 20 20 20 20  rted[0]),.      
22740 20 20 73 74 61 74 65 52 65 73 6f 72 74 43 6f 6d    stateResortCom
22750 70 61 72 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  pare);.  for(i=0
22760 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
22770 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70  ; i++){.    lemp
22780 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 73 74 61  ->sorted[i]->sta
22790 74 65 6e 75 6d 20 3d 20 69 3b 0a 20 20 7d 0a 20  tenum = i;.  }. 
227a0 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 20 3d   lemp->nxstate =
227b0 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20   lemp->nstate;. 
227c0 20 77 68 69 6c 65 28 20 6c 65 6d 70 2d 3e 6e 78   while( lemp->nx
227d0 73 74 61 74 65 3e 31 20 26 26 20 6c 65 6d 70 2d  state>1 && lemp-
227e0 3e 73 6f 72 74 65 64 5b 6c 65 6d 70 2d 3e 6e 78  >sorted[lemp->nx
227f0 73 74 61 74 65 2d 31 5d 2d 3e 61 75 74 6f 52 65  state-1]->autoRe
22800 64 75 63 65 20 29 7b 0a 20 20 20 20 6c 65 6d 70  duce ){.    lemp
22810 2d 3e 6e 78 73 74 61 74 65 2d 2d 3b 0a 20 20 7d  ->nxstate--;.  }
22820 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
22830 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
22840 20 66 69 6c 65 20 22 73 65 74 2e 63 22 20 2a 2a   file "set.c" **
22850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22870 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61  **/./*.** Set ma
22880 6e 69 70 75 6c 61 74 69 6f 6e 20 72 6f 75 74 69  nipulation routi
22890 6e 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f  nes for the LEMO
228a0 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
228b0 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69  or..*/..static i
228c0 6e 74 20 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a  nt size = 0;../*
228d0 20 53 65 74 20 74 68 65 20 73 65 74 20 73 69 7a   Set the set siz
228e0 65 20 2a 2f 0a 76 6f 69 64 20 53 65 74 53 69 7a  e */.void SetSiz
228f0 65 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73 69 7a  e(int n).{.  siz
22900 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41  e = n+1;.}../* A
22910 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65  llocate a new se
22920 74 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65  t */.char *SetNe
22930 77 28 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b 0a  w(){.  char *s;.
22940 20 20 73 20 3d 20 28 63 68 61 72 2a 29 63 61 6c    s = (char*)cal
22950 6c 6f 63 28 20 73 69 7a 65 2c 20 31 29 3b 0a 20  loc( size, 1);. 
22960 20 69 66 28 20 73 3d 3d 30 20 29 7b 0a 20 20 20   if( s==0 ){.   
22970 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d   extern void mem
22980 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20  ory_error();.   
22990 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b   memory_error();
229a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 3b  .  }.  return s;
229b0 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  .}../* Deallocat
229c0 65 20 61 20 73 65 74 20 2a 2f 0a 76 6f 69 64 20  e a set */.void 
229d0 53 65 74 46 72 65 65 28 63 68 61 72 20 2a 73 29  SetFree(char *s)
229e0 0a 7b 0a 20 20 66 72 65 65 28 73 29 3b 0a 7d 0a  .{.  free(s);.}.
229f0 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  ./* Add a new el
22a00 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 73 65 74  ement to the set
22a10 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
22a20 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 77 61  f the element wa
22a30 73 20 61 64 64 65 64 0a 2a 2a 20 61 6e 64 20 46  s added.** and F
22a40 41 4c 53 45 20 69 66 20 69 74 20 77 61 73 20 61  ALSE if it was a
22a50 6c 72 65 61 64 79 20 74 68 65 72 65 2e 20 2a 2f  lready there. */
22a60 0a 69 6e 74 20 53 65 74 41 64 64 28 63 68 61 72  .int SetAdd(char
22a70 20 2a 73 2c 20 69 6e 74 20 65 29 0a 7b 0a 20 20   *s, int e).{.  
22a80 69 6e 74 20 72 76 3b 0a 20 20 61 73 73 65 72 74  int rv;.  assert
22a90 28 20 65 3e 3d 30 20 26 26 20 65 3c 73 69 7a 65  ( e>=0 && e<size
22aa0 20 29 3b 0a 20 20 72 76 20 3d 20 73 5b 65 5d 3b   );.  rv = s[e];
22ab0 0a 20 20 73 5b 65 5d 20 3d 20 31 3b 0a 20 20 72  .  s[e] = 1;.  r
22ac0 65 74 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f 2a  eturn !rv;.}../*
22ad0 20 41 64 64 20 65 76 65 72 79 20 65 6c 65 6d 65   Add every eleme
22ae0 6e 74 20 6f 66 20 73 32 20 74 6f 20 73 31 2e 20  nt of s2 to s1. 
22af0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
22b00 73 31 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 69  s1 changes. */.i
22b10 6e 74 20 53 65 74 55 6e 69 6f 6e 28 63 68 61 72  nt SetUnion(char
22b20 20 2a 73 31 2c 20 63 68 61 72 20 2a 73 32 29 0a   *s1, char *s2).
22b30 7b 0a 20 20 69 6e 74 20 69 2c 20 70 72 6f 67 72  {.  int i, progr
22b40 65 73 73 3b 0a 20 20 70 72 6f 67 72 65 73 73 20  ess;.  progress 
22b50 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
22b60 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  i<size; i++){.  
22b70 20 20 69 66 28 20 73 32 5b 69 5d 3d 3d 30 20 29    if( s2[i]==0 )
22b80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
22b90 66 28 20 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20  f( s1[i]==0 ){. 
22ba0 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20       progress = 
22bb0 31 3b 0a 20 20 20 20 20 20 73 31 5b 69 5d 20 3d  1;.      s1[i] =
22bc0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
22bd0 72 65 74 75 72 6e 20 70 72 6f 67 72 65 73 73 3b  return progress;
22be0 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
22bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
22c00 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e  the file "table.
22c10 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
22c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
22c30 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20  ./*.** All code 
22c40 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68 61 73  in this file has
22c50 20 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61   been automatica
22c60 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  lly generated.**
22c70 20 66 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63   from a specific
22c80 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c  ation in the fil
22c90 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
22ca0 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62    "table.q".** b
22cb0 79 20 74 68 65 20 61 73 73 6f 63 69 61 74 69 76  y the associativ
22cc0 65 20 61 72 72 61 79 20 63 6f 64 65 20 62 75 69  e array code bui
22cd0 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61  lding program "a
22ce0 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  agen"..** Do not
22cf0 20 65 64 69 74 20 74 68 69 73 20 66 69 6c 65 21   edit this file!
22d00 20 20 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20    Instead, edit 
22d10 74 68 65 20 73 70 65 63 69 66 69 63 61 74 69 6f  the specificatio
22d20 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  n.** file, then 
22d30 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a  rerun aagen..*/.
22d40 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70  /*.** Code for p
22d50 72 6f 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73  rocessing tables
22d60 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
22d70 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
22d80 2a 2f 0a 0a 50 52 49 56 41 54 45 20 75 6e 73 69  */..PRIVATE unsi
22d90 67 6e 65 64 20 73 74 72 68 61 73 68 28 63 6f 6e  gned strhash(con
22da0 73 74 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20  st char *x).{.  
22db0 75 6e 73 69 67 6e 65 64 20 68 20 3d 20 30 3b 0a  unsigned h = 0;.
22dc0 20 20 77 68 69 6c 65 28 20 2a 78 20 29 20 68 20    while( *x ) h 
22dd0 3d 20 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b  = h*13 + *(x++);
22de0 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a  .  return h;.}..
22df0 2f 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74  /* Works like st
22e00 72 64 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20  rdup, sort of.  
22e10 53 61 76 65 20 61 20 73 74 72 69 6e 67 20 69 6e  Save a string in
22e20 20 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79   malloced memory
22e30 2c 20 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74  , but.** keep st
22e40 72 69 6e 67 73 20 69 6e 20 61 20 74 61 62 6c 65  rings in a table
22e50 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d   so that the sam
22e60 65 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20  e string is not 
22e70 69 6e 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20  in more.** than 
22e80 6f 6e 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 6f  one place..*/.co
22e90 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66  nst char *Strsaf
22ea0 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 79 29  e(const char *y)
22eb0 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .{.  const char 
22ec0 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 63 70 79 3b  *z;.  char *cpy;
22ed0 0a 0a 20 20 69 66 28 20 79 3d 3d 30 20 29 20 72  ..  if( y==0 ) r
22ee0 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 53  eturn 0;.  z = S
22ef0 74 72 73 61 66 65 5f 66 69 6e 64 28 79 29 3b 0a  trsafe_find(y);.
22f00 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 28 63    if( z==0 && (c
22f10 70 79 3d 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f  py=(char *)mallo
22f20 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 79  c( lemonStrlen(y
22f30 29 2b 31 20 29 29 21 3d 30 20 29 7b 0a 20 20 20  )+1 ))!=0 ){.   
22f40 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63 70   lemon_strcpy(cp
22f50 79 2c 79 29 3b 0a 20 20 20 20 7a 20 3d 20 63 70  y,y);.    z = cp
22f60 79 3b 0a 20 20 20 20 53 74 72 73 61 66 65 5f 69  y;.    Strsafe_i
22f70 6e 73 65 72 74 28 7a 29 3b 0a 20 20 7d 0a 20 20  nsert(z);.  }.  
22f80 4d 65 6d 6f 72 79 43 68 65 63 6b 28 7a 29 3b 0a  MemoryCheck(z);.
22f90 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f    return z;.}../
22fa0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
22fb0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
22fc0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
22fd0 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
22fe0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
22ff0 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a   of type "x1"..*
23000 2f 0a 73 74 72 75 63 74 20 73 5f 78 31 20 7b 0a  /.struct s_x1 {.
23010 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
23020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23030 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
23040 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23060 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
23070 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
23080 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
23090 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
230a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230b0 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
230c0 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
230d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
230e0 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
230f0 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
23100 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
23110 31 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  1node *tbl;  /* 
23120 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
23130 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
23140 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x1node **ht; 
23150 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
23160 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
23170 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
23180 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
23190 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
231a0 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
231b0 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
231c0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
231d0 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a  f type "x1"..*/.
231e0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
231f0 5f 78 31 6e 6f 64 65 20 7b 0a 20 20 63 6f 6e 73  _x1node {.  cons
23200 74 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  t char *data;   
23210 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
23220 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
23230 31 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f  1node *next;   /
23240 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74  * Next entry wit
23250 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20  h the same hash 
23260 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31  */.  struct s_x1
23270 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a  node **from;  /*
23280 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a   Previous link *
23290 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a 20  /.} x1node;../* 
232a0 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e  There is only on
232b0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
232c0 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69  e array, which i
232d0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
232e0 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
232f0 20 73 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a 20   s_x1 *x1a;../* 
23300 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61  Allocate a new a
23310 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
23320 20 2a 2f 0a 76 6f 69 64 20 53 74 72 73 61 66 65   */.void Strsafe
23330 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78  _init(){.  if( x
23340 31 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  1a ) return;.  x
23350 31 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78  1a = (struct s_x
23360 31 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  1*)malloc( sizeo
23370 66 28 73 74 72 75 63 74 20 73 5f 78 31 29 20 29  f(struct s_x1) )
23380 3b 0a 20 20 69 66 28 20 78 31 61 20 29 7b 0a 20  ;.  if( x1a ){. 
23390 20 20 20 78 31 61 2d 3e 73 69 7a 65 20 3d 20 31     x1a->size = 1
233a0 30 32 34 3b 0a 20 20 20 20 78 31 61 2d 3e 63 6f  024;.    x1a->co
233b0 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 31 61  unt = 0;.    x1a
233c0 2d 3e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a  ->tbl = (x1node*
233d0 29 63 61 6c 6c 6f 63 28 31 30 32 34 2c 20 73 69  )calloc(1024, si
233e0 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73  zeof(x1node) + s
233f0 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 3b  izeof(x1node*));
23400 0a 20 20 20 20 69 66 28 20 78 31 61 2d 3e 74 62  .    if( x1a->tb
23410 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  l==0 ){.      fr
23420 65 65 28 78 31 61 29 3b 0a 20 20 20 20 20 20 78  ee(x1a);.      x
23430 31 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  1a = 0;.    }els
23440 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
23450 20 20 20 20 20 20 78 31 61 2d 3e 68 74 20 3d 20        x1a->ht = 
23460 28 78 31 6e 6f 64 65 2a 2a 29 26 28 78 31 61 2d  (x1node**)&(x1a-
23470 3e 74 62 6c 5b 31 30 32 34 5d 29 3b 0a 20 20 20  >tbl[1024]);.   
23480 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30     for(i=0; i<10
23490 32 34 3b 20 69 2b 2b 29 20 78 31 61 2d 3e 68 74  24; i++) x1a->ht
234a0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
234b0 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61   }.}./* Insert a
234c0 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
234d0 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74   the array.  Ret
234e0 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63  urn TRUE if succ
234f0 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72  essful..** Prior
23500 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73   data with the s
23510 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f  ame key is NOT o
23520 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e  verwritten */.in
23530 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74  t Strsafe_insert
23540 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 61 74  (const char *dat
23550 61 29 0a 7b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e  a).{.  x1node *n
23560 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b  p;.  unsigned h;
23570 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a  .  unsigned ph;.
23580 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29 20  .  if( x1a==0 ) 
23590 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
235a0 20 73 74 72 68 61 73 68 28 64 61 74 61 29 3b 0a   strhash(data);.
235b0 20 20 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d    h = ph & (x1a-
235c0 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
235d0 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77   x1a->ht[h];.  w
235e0 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20  hile( np ){.    
235f0 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64  if( strcmp(np->d
23600 61 74 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a  ata,data)==0 ){.
23610 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
23620 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20  ting entry with 
23630 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
23640 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20  found. */.      
23650 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20  /* Fail because 
23660 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74  overwrite is not
23670 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20   allows. */.    
23680 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
23690 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  }.    np = np->n
236a0 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78  ext;.  }.  if( x
236b0 31 61 2d 3e 63 6f 75 6e 74 3e 3d 78 31 61 2d 3e  1a->count>=x1a->
236c0 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  size ){.    /* N
236d0 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  eed to make the 
236e0 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65  hash table bigge
236f0 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61  r */.    int i,a
23700 72 72 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75  rrSize;.    stru
23710 63 74 20 73 5f 78 31 20 61 72 72 61 79 3b 0a 20  ct s_x1 array;. 
23720 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20     array.size = 
23730 61 72 72 53 69 7a 65 20 3d 20 78 31 61 2d 3e 73  arrSize = x1a->s
23740 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79  ize*2;.    array
23750 2e 63 6f 75 6e 74 20 3d 20 78 31 61 2d 3e 63 6f  .count = x1a->co
23760 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74  unt;.    array.t
23770 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 63 61  bl = (x1node*)ca
23780 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69  lloc(arrSize, si
23790 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73  zeof(x1node) + s
237a0 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 3b  izeof(x1node*));
237b0 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74  .    if( array.t
237c0 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  bl==0 ) return 0
237d0 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74  ;  /* Fail due t
237e0 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  o malloc failure
237f0 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74   */.    array.ht
23800 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 61   = (x1node**)&(a
23810 72 72 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65  rray.tbl[arrSize
23820 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
23830 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29   i<arrSize; i++)
23840 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30   array.ht[i] = 0
23850 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
23860 3c 78 31 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b  <x1a->count; i++
23870 29 7b 0a 20 20 20 20 20 20 78 31 6e 6f 64 65 20  ){.      x1node 
23880 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a  *oldnp, *newnp;.
23890 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28        oldnp = &(
238a0 78 31 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20  x1a->tbl[i]);.  
238b0 20 20 20 20 68 20 3d 20 73 74 72 68 61 73 68 28      h = strhash(
238c0 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20 28  oldnp->data) & (
238d0 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20  arrSize-1);.    
238e0 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61    newnp = &(arra
238f0 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  y.tbl[i]);.     
23900 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d   if( array.ht[h]
23910 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e   ) array.ht[h]->
23920 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e  from = &(newnp->
23930 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77  next);.      new
23940 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79  np->next = array
23950 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65  .ht[h];.      ne
23960 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e  wnp->data = oldn
23970 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e  p->data;.      n
23980 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61  ewnp->from = &(a
23990 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20  rray.ht[h]);.   
239a0 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d     array.ht[h] =
239b0 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20   newnp;.    }.  
239c0 20 20 66 72 65 65 28 78 31 61 2d 3e 74 62 6c 29    free(x1a->tbl)
239d0 3b 0a 20 20 20 20 2a 78 31 61 20 3d 20 61 72 72  ;.    *x1a = arr
239e0 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73  ay;.  }.  /* Ins
239f0 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61  ert the new data
23a00 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28   */.  h = ph & (
23a10 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x1a->size-1);.  
23a20 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b  np = &(x1a->tbl[
23a30 78 31 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a  x1a->count++]);.
23a40 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74    np->data = dat
23a50 61 3b 0a 20 20 69 66 28 20 78 31 61 2d 3e 68 74  a;.  if( x1a->ht
23a60 5b 68 5d 20 29 20 78 31 61 2d 3e 68 74 5b 68 5d  [h] ) x1a->ht[h]
23a70 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e  ->from = &(np->n
23a80 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74  ext);.  np->next
23a90 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x1a->ht[h];. 
23aa0 20 78 31 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70   x1a->ht[h] = np
23ab0 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26  ;.  np->from = &
23ac0 28 78 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20  (x1a->ht[h]);.  
23ad0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20  return 1;.}../* 
23ae0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
23af0 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65   to data assigne
23b00 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b  d to the given k
23b10 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ey.  Return NULL
23b20 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b  .** if no such k
23b30 65 79 2e 20 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ey. */.const cha
23b40 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28  r *Strsafe_find(
23b50 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29  const char *key)
23b60 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b  .{.  unsigned h;
23b70 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 0a  .  x1node *np;..
23b80 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29 20 72    if( x1a==0 ) r
23b90 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73  eturn 0;.  h = s
23ba0 74 72 68 61 73 68 28 6b 65 79 29 20 26 20 28 78  trhash(key) & (x
23bb0 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  1a->size-1);.  n
23bc0 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x1a->ht[h];.
23bd0 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
23be0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70     if( strcmp(np
23bf0 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30 20 29  ->data,key)==0 )
23c00 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
23c10 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
23c20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
23c30 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
23c40 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
23c50 72 20 74 6f 20 74 68 65 20 28 74 65 72 6d 69 6e  r to the (termin
23c60 61 6c 20 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61  al or nontermina
23c70 6c 29 20 73 79 6d 62 6f 6c 20 22 78 22 2e 0a 2a  l) symbol "x"..*
23c80 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73  * Create a new s
23c90 79 6d 62 6f 6c 20 69 66 20 74 68 69 73 20 69 73  ymbol if this is
23ca0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
23cb0 22 78 22 20 68 61 73 20 62 65 65 6e 20 73 65 65  "x" has been see
23cc0 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d  n..*/.struct sym
23cd0 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28  bol *Symbol_new(
23ce0 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 29 0a 7b  const char *x).{
23cf0 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
23d00 20 2a 73 70 3b 0a 0a 20 20 73 70 20 3d 20 53 79   *sp;..  sp = Sy
23d10 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20  mbol_find(x);.  
23d20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20  if( sp==0 ){.   
23d30 20 73 70 20 3d 20 28 73 74 72 75 63 74 20 73 79   sp = (struct sy
23d40 6d 62 6f 6c 20 2a 29 63 61 6c 6c 6f 63 28 31 2c  mbol *)calloc(1,
23d50 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
23d60 79 6d 62 6f 6c 29 20 29 3b 0a 20 20 20 20 4d 65  ymbol) );.    Me
23d70 6d 6f 72 79 43 68 65 63 6b 28 73 70 29 3b 0a 20  moryCheck(sp);. 
23d80 20 20 20 73 70 2d 3e 6e 61 6d 65 20 3d 20 53 74     sp->name = St
23d90 72 73 61 66 65 28 78 29 3b 0a 20 20 20 20 73 70  rsafe(x);.    sp
23da0 2d 3e 74 79 70 65 20 3d 20 49 53 55 50 50 45 52  ->type = ISUPPER
23db0 28 2a 78 29 20 3f 20 54 45 52 4d 49 4e 41 4c 20  (*x) ? TERMINAL 
23dc0 3a 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c 3b 0a 20  : NONTERMINAL;. 
23dd0 20 20 20 73 70 2d 3e 72 75 6c 65 20 3d 20 30 3b     sp->rule = 0;
23de0 0a 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63  .    sp->fallbac
23df0 6b 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 70  k = 0;.    sp->p
23e00 72 65 63 20 3d 20 2d 31 3b 0a 20 20 20 20 73 70  rec = -1;.    sp
23e10 2d 3e 61 73 73 6f 63 20 3d 20 55 4e 4b 3b 0a 20  ->assoc = UNK;. 
23e20 20 20 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20     sp->firstset 
23e30 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 6c 61 6d  = 0;.    sp->lam
23e40 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53  bda = LEMON_FALS
23e50 45 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73 74 72  E;.    sp->destr
23e60 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73  uctor = 0;.    s
23e70 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 20 3d 20  p->destLineno = 
23e80 30 3b 0a 20 20 20 20 73 70 2d 3e 64 61 74 61 74  0;.    sp->datat
23e90 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d  ype = 0;.    sp-
23ea0 3e 75 73 65 43 6e 74 20 3d 20 30 3b 0a 20 20 20  >useCnt = 0;.   
23eb0 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73   Symbol_insert(s
23ec0 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d  p,sp->name);.  }
23ed0 0a 20 20 73 70 2d 3e 75 73 65 43 6e 74 2b 2b 3b  .  sp->useCnt++;
23ee0 0a 20 20 72 65 74 75 72 6e 20 73 70 3b 0a 7d 0a  .  return sp;.}.
23ef0 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
23f00 73 79 6d 62 6f 6c 73 20 66 6f 72 20 73 6f 72 74  symbols for sort
23f10 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 52  ing purposes.  R
23f20 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 0a  eturn negative,.
23f30 2a 2a 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  ** zero, or posi
23f40 74 69 76 65 20 69 66 20 61 20 69 73 20 6c 65 73  tive if a is les
23f50 73 20 74 68 65 6e 2c 20 65 71 75 61 6c 20 74 6f  s then, equal to
23f60 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20  , or greater.** 
23f70 74 68 61 6e 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 79  than b..**.** Sy
23f80 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69 6e  mbols that begin
23f90 20 77 69 74 68 20 75 70 70 65 72 20 63 61 73 65   with upper case
23fa0 20 6c 65 74 74 65 72 73 20 28 74 65 72 6d 69 6e   letters (termin
23fb0 61 6c 73 20 6f 72 20 74 6f 6b 65 6e 73 29 0a 2a  als or tokens).*
23fc0 2a 20 6d 75 73 74 20 73 6f 72 74 20 62 65 66 6f  * must sort befo
23fd0 72 65 20 73 79 6d 62 6f 6c 73 20 74 68 61 74 20  re symbols that 
23fe0 62 65 67 69 6e 20 77 69 74 68 20 6c 6f 77 65 72  begin with lower
23ff0 20 63 61 73 65 20 6c 65 74 74 65 72 73 0a 2a 2a   case letters.**
24000 20 28 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 29   (non-terminals)
24010 2e 20 20 41 6e 64 20 4d 55 4c 54 49 54 45 52 4d  .  And MULTITERM
24020 49 4e 41 4c 20 73 79 6d 62 6f 6c 73 20 28 63 72  INAL symbols (cr
24030 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 0a  eated using the.
24040 2a 2a 20 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20  ** %token_class 
24050 64 69 72 65 63 74 69 76 65 29 20 6d 75 73 74 20  directive) must 
24060 73 6f 72 74 20 61 74 20 74 68 65 20 76 65 72 79  sort at the very
24070 20 65 6e 64 2e 20 4f 74 68 65 72 20 74 68 61 6e   end. Other than
24080 0a 2a 2a 20 74 68 61 74 2c 20 74 68 65 20 6f 72  .** that, the or
24090 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  der does not mat
240a0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 66 69  ter..**.** We fi
240b0 6e 64 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 6c  nd experimentall
240c0 79 20 74 68 61 74 20 6c 65 61 76 69 6e 67 20 74  y that leaving t
240d0 68 65 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68  he symbols in th
240e0 65 69 72 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  eir original.** 
240f0 6f 72 64 65 72 20 28 74 68 65 20 6f 72 64 65 72  order (the order
24100 20 74 68 65 79 20 61 70 70 65 61 72 65 64 20 69   they appeared i
24110 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 66 69  n the grammar fi
24120 6c 65 29 20 67 69 76 65 73 20 74 68 65 0a 2a 2a  le) gives the.**
24130 20 73 6d 61 6c 6c 65 73 74 20 70 61 72 73 65 72   smallest parser
24140 20 74 61 62 6c 65 73 20 69 6e 20 53 51 4c 69 74   tables in SQLit
24150 65 2e 0a 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c  e..*/.int Symbol
24160 63 6d 70 70 28 63 6f 6e 73 74 20 76 6f 69 64 20  cmpp(const void 
24170 2a 5f 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  *_a, const void 
24180 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 73  *_b).{.  const s
24190 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 61 20  truct symbol *a 
241a0 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74  = *(const struct
241b0 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 5f 61 3b 0a   symbol **) _a;.
241c0 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
241d0 79 6d 62 6f 6c 20 2a 62 20 3d 20 2a 28 63 6f 6e  ymbol *b = *(con
241e0 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  st struct symbol
241f0 20 2a 2a 29 20 5f 62 3b 0a 20 20 69 6e 74 20 69   **) _b;.  int i
24200 31 20 3d 20 61 2d 3e 74 79 70 65 3d 3d 4d 55 4c  1 = a->type==MUL
24210 54 49 54 45 52 4d 49 4e 41 4c 20 3f 20 33 20 3a  TITERMINAL ? 3 :
24220 20 61 2d 3e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 20   a->name[0]>'Z' 
24230 3f 20 32 20 3a 20 31 3b 0a 20 20 69 6e 74 20 69  ? 2 : 1;.  int i
24240 32 20 3d 20 62 2d 3e 74 79 70 65 3d 3d 4d 55 4c  2 = b->type==MUL
24250 54 49 54 45 52 4d 49 4e 41 4c 20 3f 20 33 20 3a  TITERMINAL ? 3 :
24260 20 62 2d 3e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 20   b->name[0]>'Z' 
24270 3f 20 32 20 3a 20 31 3b 0a 20 20 72 65 74 75 72  ? 2 : 1;.  retur
24280 6e 20 69 31 3d 3d 69 32 20 3f 20 61 2d 3e 69 6e  n i1==i2 ? a->in
24290 64 65 78 20 2d 20 62 2d 3e 69 6e 64 65 78 20 3a  dex - b->index :
242a0 20 69 31 20 2d 20 69 32 3b 0a 7d 0a 0a 2f 2a 20   i1 - i2;.}../* 
242b0 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
242c0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
242d0 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
242e0 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
242f0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
24300 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a  f type "x2"..*/.
24310 73 74 72 75 63 74 20 73 5f 78 32 20 7b 0a 20 20  struct s_x2 {.  
24320 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
24330 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
24340 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
24350 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24370 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
24380 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
24390 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
243a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
243b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
243c0 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
243d0 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
243e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
243f0 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
24400 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
24410 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
24420 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
24430 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
24440 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
24450 5f 78 32 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x2node **ht;  /
24460 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
24470 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
24480 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
24490 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
244a0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
244b0 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
244c0 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
244d0 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
244e0 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 74 79  type "x2"..*/.ty
244f0 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
24500 32 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74  2node {.  struct
24510 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 20 20   symbol *data;  
24520 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
24530 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
24540 6b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  key;         /* 
24550 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72  The key */.  str
24560 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 6e 65  uct s_x2node *ne
24570 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e  xt;   /* Next en
24580 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
24590 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75  e hash */.  stru
245a0 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 66 72  ct s_x2node **fr
245b0 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  om;  /* Previous
245c0 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64   link */.} x2nod
245d0 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  e;../* There is 
245e0 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63  only one instanc
245f0 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20  e of the array, 
24600 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c  which is the fol
24610 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63  lowing */.static
24620 20 73 74 72 75 63 74 20 73 5f 78 32 20 2a 78 32   struct s_x2 *x2
24630 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  a;../* Allocate 
24640 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76  a new associativ
24650 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20  e array */.void 
24660 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a 20  Symbol_init(){. 
24670 20 69 66 28 20 78 32 61 20 29 20 72 65 74 75 72   if( x2a ) retur
24680 6e 3b 0a 20 20 78 32 61 20 3d 20 28 73 74 72 75  n;.  x2a = (stru
24690 63 74 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28  ct s_x2*)malloc(
246a0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
246b0 5f 78 32 29 20 29 3b 0a 20 20 69 66 28 20 78 32  _x2) );.  if( x2
246c0 61 20 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69  a ){.    x2a->si
246d0 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 32  ze = 128;.    x2
246e0 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
246f0 20 20 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32    x2a->tbl = (x2
24700 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 31 32 38  node*)calloc(128
24710 2c 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29  , sizeof(x2node)
24720 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65   + sizeof(x2node
24730 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 78 32 61  *));.    if( x2a
24740 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ->tbl==0 ){.    
24750 20 20 66 72 65 65 28 78 32 61 29 3b 0a 20 20 20    free(x2a);.   
24760 20 20 20 78 32 61 20 3d 20 30 3b 0a 20 20 20 20     x2a = 0;.    
24770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
24780 20 69 3b 0a 20 20 20 20 20 20 78 32 61 2d 3e 68   i;.      x2a->h
24790 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28  t = (x2node**)&(
247a0 78 32 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a  x2a->tbl[128]);.
247b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
247c0 3c 31 32 38 3b 20 69 2b 2b 29 20 78 32 61 2d 3e  <128; i++) x2a->
247d0 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ht[i] = 0;.    }
247e0 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74  .  }.}./* Insert
247f0 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
24800 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52  to the array.  R
24810 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75  eturn TRUE if su
24820 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69  ccessful..** Pri
24830 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65  or data with the
24840 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54   same key is NOT
24850 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a   overwritten */.
24860 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72  int Symbol_inser
24870 74 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  t(struct symbol 
24880 2a 64 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 61  *data, const cha
24890 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 78 32 6e 6f  r *key).{.  x2no
248a0 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e  de *np;.  unsign
248b0 65 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ed h;.  unsigned
248c0 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d   ph;..  if( x2a=
248d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
248e0 20 70 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65   ph = strhash(ke
248f0 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28  y);.  h = ph & (
24900 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x2a->size-1);.  
24910 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b  np = x2a->ht[h];
24920 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
24930 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e      if( strcmp(n
24940 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29  p->key,key)==0 )
24950 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  {.      /* An ex
24960 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74  isting entry wit
24970 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
24980 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20  s found. */.    
24990 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73    /* Fail becaus
249a0 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e  e overwrite is n
249b0 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20  ot allows. */.  
249c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
249d0 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d    }.    np = np-
249e0 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  >next;.  }.  if(
249f0 20 78 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61   x2a->count>=x2a
24a00 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  ->size ){.    /*
24a10 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68   Need to make th
24a20 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67  e hash table big
24a30 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ger */.    int i
24a40 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20 20 73 74  ,arrSize;.    st
24a50 72 75 63 74 20 73 5f 78 32 20 61 72 72 61 79 3b  ruct s_x2 array;
24a60 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20  .    array.size 
24a70 3d 20 61 72 72 53 69 7a 65 20 3d 20 78 32 61 2d  = arrSize = x2a-
24a80 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72  >size*2;.    arr
24a90 61 79 2e 63 6f 75 6e 74 20 3d 20 78 32 61 2d 3e  ay.count = x2a->
24aa0 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79  count;.    array
24ab0 2e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29  .tbl = (x2node*)
24ac0 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20  calloc(arrSize, 
24ad0 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b  sizeof(x2node) +
24ae0 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29   sizeof(x2node*)
24af0 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79  );.    if( array
24b00 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  .tbl==0 ) return
24b10 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65   0;  /* Fail due
24b20 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   to malloc failu
24b30 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e  re */.    array.
24b40 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26  ht = (x2node**)&
24b50 28 61 72 72 61 79 2e 74 62 6c 5b 61 72 72 53 69  (array.tbl[arrSi
24b60 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ze]);.    for(i=
24b70 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b  0; i<arrSize; i+
24b80 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d  +) array.ht[i] =
24b90 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
24ba0 20 69 3c 78 32 61 2d 3e 63 6f 75 6e 74 3b 20 69   i<x2a->count; i
24bb0 2b 2b 29 7b 0a 20 20 20 20 20 20 78 32 6e 6f 64  ++){.      x2nod
24bc0 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70  e *oldnp, *newnp
24bd0 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20  ;.      oldnp = 
24be0 26 28 78 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a  &(x2a->tbl[i]);.
24bf0 20 20 20 20 20 20 68 20 3d 20 73 74 72 68 61 73        h = strhas
24c00 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20  h(oldnp->key) & 
24c10 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20  (arrSize-1);.   
24c20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72     newnp = &(arr
24c30 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  ay.tbl[i]);.    
24c40 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68    if( array.ht[h
24c50 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d  ] ) array.ht[h]-
24c60 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d  >from = &(newnp-
24c70 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65  >next);.      ne
24c80 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61  wnp->next = arra
24c90 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e  y.ht[h];.      n
24ca0 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e  ewnp->key = oldn
24cb0 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65  p->key;.      ne
24cc0 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e  wnp->data = oldn
24cd0 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e  p->data;.      n
24ce0 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61  ewnp->from = &(a
24cf0 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20  rray.ht[h]);.   
24d00 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d     array.ht[h] =
24d10 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20   newnp;.    }.  
24d20 20 20 66 72 65 65 28 78 32 61 2d 3e 74 62 6c 29    free(x2a->tbl)
24d30 3b 0a 20 20 20 20 2a 78 32 61 20 3d 20 61 72 72  ;.    *x2a = arr
24d40 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73  ay;.  }.  /* Ins
24d50 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61  ert the new data
24d60 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28   */.  h = ph & (
24d70 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x2a->size-1);.  
24d80 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b  np = &(x2a->tbl[
24d90 78 32 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a  x2a->count++]);.
24da0 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b    np->key = key;
24db0 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61  .  np->data = da
24dc0 74 61 3b 0a 20 20 69 66 28 20 78 32 61 2d 3e 68  ta;.  if( x2a->h
24dd0 74 5b 68 5d 20 29 20 78 32 61 2d 3e 68 74 5b 68  t[h] ) x2a->ht[h
24de0 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e  ]->from = &(np->
24df0 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78  next);.  np->nex
24e00 74 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a  t = x2a->ht[h];.
24e10 20 20 78 32 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e    x2a->ht[h] = n
24e20 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20  p;.  np->from = 
24e30 26 28 78 32 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20  &(x2a->ht[h]);. 
24e40 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
24e50 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
24e60 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e  r to data assign
24e70 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  ed to the given 
24e80 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  key.  Return NUL
24e90 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20  L.** if no such 
24ea0 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  key. */.struct s
24eb0 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69  ymbol *Symbol_fi
24ec0 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b  nd(const char *k
24ed0 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ey).{.  unsigned
24ee0 20 68 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70   h;.  x2node *np
24ef0 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20  ;..  if( x2a==0 
24f00 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
24f10 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26  = strhash(key) &
24f20 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x2a->size-1);.
24f30 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68    np = x2a->ht[h
24f40 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
24f50 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
24f60 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30  (np->key,key)==0
24f70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
24f80 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
24f90 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
24fa0 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
24fb0 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 2d  /* Return the n-
24fc0 74 68 20 64 61 74 61 2e 20 20 52 65 74 75 72 6e  th data.  Return
24fd0 20 4e 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f 75   NULL if n is ou
24fe0 74 20 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a 73  t of range. */.s
24ff0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
25000 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74 20 6e 29 0a  mbol_Nth(int n).
25010 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
25020 6c 20 2a 64 61 74 61 3b 0a 20 20 69 66 28 20 78  l *data;.  if( x
25030 32 61 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c 3d  2a && n>0 && n<=
25040 78 32 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20 20  x2a->count ){.  
25050 20 20 64 61 74 61 20 3d 20 78 32 61 2d 3e 74 62    data = x2a->tb
25060 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20 7d  l[n-1].data;.  }
25070 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d  else{.    data =
25080 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
25090 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74   data;.}../* Ret
250a0 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
250b0 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e 74  the array */.int
250c0 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a   Symbol_count().
250d0 7b 0a 20 20 72 65 74 75 72 6e 20 78 32 61 20 3f  {.  return x2a ?
250e0 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b   x2a->count : 0;
250f0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e  .}../* Return an
25100 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
25110 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69  rs to all data i
25120 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  n the table..** 
25130 54 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74  The array is obt
25140 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
25150 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  c.  Return NULL 
25160 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  if memory alloca
25170 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73  tion.** problems
25180 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61  , or if the arra
25190 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73  y is empty. */.s
251a0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53  truct symbol **S
251b0 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 0a  ymbol_arrayof().
251c0 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
251d0 6c 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74  l **array;.  int
251e0 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 69 66   i,arrSize;.  if
251f0 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x2a==0 ) retur
25200 6e 20 30 3b 0a 20 20 61 72 72 53 69 7a 65 20 3d  n 0;.  arrSize =
25210 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61   x2a->count;.  a
25220 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20 73  rray = (struct s
25230 79 6d 62 6f 6c 20 2a 2a 29 63 61 6c 6c 6f 63 28  ymbol **)calloc(
25240 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28  arrSize, sizeof(
25250 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29  struct symbol *)
25260 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29  );.  if( array )
25270 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
25280 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61  <arrSize; i++) a
25290 72 72 61 79 5b 69 5d 20 3d 20 78 32 61 2d 3e 74  rray[i] = x2a->t
252a0 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a  bl[i].data;.  }.
252b0 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a    return array;.
252c0 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77  }../* Compare tw
252d0 6f 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  o configurations
252e0 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d   */.int Configcm
252f0 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f 61  p(const char *_a
25300 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f 62 29  ,const char *_b)
25310 0a 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  .{.  const struc
25320 74 20 63 6f 6e 66 69 67 20 2a 61 20 3d 20 28 73  t config *a = (s
25330 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20  truct config *) 
25340 5f 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  _a;.  const stru
25350 63 74 20 63 6f 6e 66 69 67 20 2a 62 20 3d 20 28  ct config *b = (
25360 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
25370 20 5f 62 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20   _b;.  int x;.  
25380 78 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78  x = a->rp->index
25390 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b   - b->rp->index;
253a0 0a 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20  .  if( x==0 ) x 
253b0 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f  = a->dot - b->do
253c0 74 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d  t;.  return x;.}
253d0 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  ../* Compare two
253e0 20 73 74 61 74 65 73 20 2a 2f 0a 50 52 49 56 41   states */.PRIVA
253f0 54 45 20 69 6e 74 20 73 74 61 74 65 63 6d 70 28  TE int statecmp(
25400 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61  struct config *a
25410 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
25420 2a 62 29 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *b).{.  int rc;.
25430 20 20 66 6f 72 28 72 63 3d 30 3b 20 72 63 3d 3d    for(rc=0; rc==
25440 30 20 26 26 20 61 20 26 26 20 62 3b 20 20 61 3d  0 && a && b;  a=
25450 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e 62 70 29 7b  a->bp, b=b->bp){
25460 0a 20 20 20 20 72 63 20 3d 20 61 2d 3e 72 70 2d  .    rc = a->rp-
25470 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e  >index - b->rp->
25480 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 72  index;.    if( r
25490 63 3d 3d 30 20 29 20 72 63 20 3d 20 61 2d 3e 64  c==0 ) rc = a->d
254a0 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d  ot - b->dot;.  }
254b0 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
254c0 20 20 20 20 69 66 28 20 61 20 29 20 72 63 20 3d      if( a ) rc =
254d0 20 31 3b 0a 20 20 20 20 69 66 28 20 62 20 29 20   1;.    if( b ) 
254e0 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  rc = -1;.  }.  r
254f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
25500 48 61 73 68 20 61 20 73 74 61 74 65 20 2a 2f 0a  Hash a state */.
25510 50 52 49 56 41 54 45 20 75 6e 73 69 67 6e 65 64  PRIVATE unsigned
25520 20 73 74 61 74 65 68 61 73 68 28 73 74 72 75 63   statehash(struc
25530 74 20 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20  t config *a).{. 
25540 20 75 6e 73 69 67 6e 65 64 20 68 3d 30 3b 0a 20   unsigned h=0;. 
25550 20 77 68 69 6c 65 28 20 61 20 29 7b 0a 20 20 20   while( a ){.   
25560 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e   h = h*571 + a->
25570 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61  rp->index*37 + a
25580 2d 3e 64 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61  ->dot;.    a = a
25590 2d 3e 62 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ->bp;.  }.  retu
255a0 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f  rn h;.}../* Allo
255b0 63 61 74 65 20 61 20 6e 65 77 20 73 74 61 74 65  cate a new state
255c0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 73 74   structure */.st
255d0 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74  ruct state *Stat
255e0 65 5f 6e 65 77 28 29 0a 7b 0a 20 20 73 74 72 75  e_new().{.  stru
255f0 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73 74 61  ct state *newsta
25600 74 65 3b 0a 20 20 6e 65 77 73 74 61 74 65 20 3d  te;.  newstate =
25610 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
25620 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f  )calloc(1, sizeo
25630 66 28 73 74 72 75 63 74 20 73 74 61 74 65 29 20  f(struct state) 
25640 29 3b 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b  );.  MemoryCheck
25650 28 6e 65 77 73 74 61 74 65 29 3b 0a 20 20 72 65  (newstate);.  re
25660 74 75 72 6e 20 6e 65 77 73 74 61 74 65 3b 0a 7d  turn newstate;.}
25670 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
25680 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
25690 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
256a0 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a  cture for each.*
256b0 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  * associative ar
256c0 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 33 22  ray of type "x3"
256d0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 33  ..*/.struct s_x3
256e0 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20   {.  int size;  
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25700 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  The number of av
25710 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a  ailable slots. *
25720 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
25730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
25740 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   Must be a power
25750 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68   of 2 greater th
25760 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  an or */.       
25770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25780 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f     /*   equal to
25790 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e   1 */.  int coun
257a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
257b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
257c0 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c  rently slots fil
257d0 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  led */.  struct 
257e0 73 5f 78 33 6e 6f 64 65 20 2a 74 62 6c 3b 20 20  s_x3node *tbl;  
257f0 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72  /* The data stor
25800 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  ed here */.  str
25810 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 68  uct s_x3node **h
25820 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c  t;  /* Hash tabl
25830 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f  e for lookups */
25840 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  .};../* There is
25850 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
25860 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
25870 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65  for every data e
25880 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20  lement.** in an 
25890 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
258a0 79 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a  y of type "x3"..
258b0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
258c0 74 20 73 5f 78 33 6e 6f 64 65 20 7b 0a 20 20 73  t s_x3node {.  s
258d0 74 72 75 63 74 20 73 74 61 74 65 20 2a 64 61 74  truct state *dat
258e0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
258f0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
25900 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  */.  struct conf
25910 69 67 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20  ig *key;        
25920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25930 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63  e key */.  struc
25940 74 20 73 5f 78 33 6e 6f 64 65 20 2a 6e 65 78 74  t s_x3node *next
25950 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ;   /* Next entr
25960 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
25970 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74  hash */.  struct
25980 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d   s_x3node **from
25990 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c  ;  /* Previous l
259a0 69 6e 6b 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b  ink */.} x3node;
259b0 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
259c0 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  ly one instance 
259d0 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68  of the array, wh
259e0 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f  ich is the follo
259f0 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73  wing */.static s
25a00 74 72 75 63 74 20 73 5f 78 33 20 2a 78 33 61 3b  truct s_x3 *x3a;
25a10 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
25a20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20  new associative 
25a30 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74  array */.void St
25a40 61 74 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66  ate_init(){.  if
25a50 28 20 78 33 61 20 29 20 72 65 74 75 72 6e 3b 0a  ( x3a ) return;.
25a60 20 20 78 33 61 20 3d 20 28 73 74 72 75 63 74 20    x3a = (struct 
25a70 73 5f 78 33 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  s_x3*)malloc( si
25a80 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 33  zeof(struct s_x3
25a90 29 20 29 3b 0a 20 20 69 66 28 20 78 33 61 20 29  ) );.  if( x3a )
25aa0 7b 0a 20 20 20 20 78 33 61 2d 3e 73 69 7a 65 20  {.    x3a->size 
25ab0 3d 20 31 32 38 3b 0a 20 20 20 20 78 33 61 2d 3e  = 128;.    x3a->
25ac0 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78  count = 0;.    x
25ad0 33 61 2d 3e 74 62 6c 20 3d 20 28 78 33 6e 6f 64  3a->tbl = (x3nod
25ae0 65 2a 29 63 61 6c 6c 6f 63 28 31 32 38 2c 20 73  e*)calloc(128, s
25af0 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20  izeof(x3node) + 
25b00 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29  sizeof(x3node*))
25b10 3b 0a 20 20 20 20 69 66 28 20 78 33 61 2d 3e 74  ;.    if( x3a->t
25b20 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  bl==0 ){.      f
25b30 72 65 65 28 78 33 61 29 3b 0a 20 20 20 20 20 20  ree(x3a);.      
25b40 78 33 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  x3a = 0;.    }el
25b50 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
25b60 0a 20 20 20 20 20 20 78 33 61 2d 3e 68 74 20 3d  .      x3a->ht =
25b70 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61   (x3node**)&(x3a
25b80 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20  ->tbl[128]);.   
25b90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32     for(i=0; i<12
25ba0 38 3b 20 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b  8; i++) x3a->ht[
25bb0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
25bc0 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20  }.}./* Insert a 
25bd0 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
25be0 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75  the array.  Retu
25bf0 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65  rn TRUE if succe
25c00 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20  ssful..** Prior 
25c10 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61  data with the sa
25c20 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76  me key is NOT ov
25c30 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74  erwritten */.int
25c40 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74   State_insert(st
25c50 72 75 63 74 20 73 74 61 74 65 20 2a 64 61 74 61  ruct state *data
25c60 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
25c70 2a 6b 65 79 29 0a 7b 0a 20 20 78 33 6e 6f 64 65  *key).{.  x3node
25c80 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64   *np;.  unsigned
25c90 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   h;.  unsigned p
25ca0 68 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30  h;..  if( x3a==0
25cb0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
25cc0 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65  h = statehash(ke
25cd0 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28  y);.  h = ph & (
25ce0 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x3a->size-1);.  
25cf0 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b  np = x3a->ht[h];
25d00 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
25d10 20 20 20 20 69 66 28 20 73 74 61 74 65 63 6d 70      if( statecmp
25d20 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30  (np->key,key)==0
25d30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
25d40 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77  existing entry w
25d50 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
25d60 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20   is found. */.  
25d70 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61      /* Fail beca
25d80 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73  use overwrite is
25d90 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a   not allows. */.
25da0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
25db0 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e      }.    np = n
25dc0 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  p->next;.  }.  i
25dd0 66 28 20 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78  f( x3a->count>=x
25de0 33 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20  3a->size ){.    
25df0 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
25e00 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62  the hash table b
25e10 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  igger */.    int
25e20 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20 20   i,arrSize;.    
25e30 73 74 72 75 63 74 20 73 5f 78 33 20 61 72 72 61  struct s_x3 arra
25e40 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
25e50 65 20 3d 20 61 72 72 53 69 7a 65 20 3d 20 78 33  e = arrSize = x3
25e60 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61  a->size*2;.    a
25e70 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 33 61  rray.count = x3a
25e80 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72  ->count;.    arr
25e90 61 79 2e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65  ay.tbl = (x3node
25ea0 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65  *)calloc(arrSize
25eb0 2c 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29  , sizeof(x3node)
25ec0 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65   + sizeof(x3node
25ed0 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72  *));.    if( arr
25ee0 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75  ay.tbl==0 ) retu
25ef0 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64  rn 0;  /* Fail d
25f00 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69  ue to malloc fai
25f10 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61  lure */.    arra
25f20 79 2e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a  y.ht = (x3node**
25f30 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 61 72 72  )&(array.tbl[arr
25f40 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  Size]);.    for(
25f50 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20  i=0; i<arrSize; 
25f60 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d  i++) array.ht[i]
25f70 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
25f80 30 3b 20 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b  0; i<x3a->count;
25f90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e   i++){.      x3n
25fa0 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77  ode *oldnp, *new
25fb0 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20  np;.      oldnp 
25fc0 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29  = &(x3a->tbl[i])
25fd0 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 61 74  ;.      h = stat
25fe0 65 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79  ehash(oldnp->key
25ff0 29 20 26 20 28 61 72 72 53 69 7a 65 2d 31 29 3b  ) & (arrSize-1);
26000 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26  .      newnp = &
26010 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a  (array.tbl[i]);.
26020 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e        if( array.
26030 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74  ht[h] ) array.ht
26040 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65  [h]->from = &(ne
26050 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20  wnp->next);.    
26060 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20    newnp->next = 
26070 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20  array.ht[h];.   
26080 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20     newnp->key = 
26090 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20  oldnp->key;.    
260a0 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20    newnp->data = 
260b0 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20  oldnp->data;.   
260c0 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d     newnp->from =
260d0 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b   &(array.ht[h]);
260e0 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b  .      array.ht[
260f0 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20  h] = newnp;.    
26100 7d 0a 20 20 20 20 66 72 65 65 28 78 33 61 2d 3e  }.    free(x3a->
26110 74 62 6c 29 3b 0a 20 20 20 20 2a 78 33 61 20 3d  tbl);.    *x3a =
26120 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a   array;.  }.  /*
26130 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
26140 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68  data */.  h = ph
26150 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29   & (x3a->size-1)
26160 3b 0a 20 20 6e 70 20 3d 20 26 28 78 33 61 2d 3e  ;.  np = &(x3a->
26170 74 62 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b  tbl[x3a->count++
26180 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20  ]);.  np->key = 
26190 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20  key;.  np->data 
261a0 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 33  = data;.  if( x3
261b0 61 2d 3e 68 74 5b 68 5d 20 29 20 78 33 61 2d 3e  a->ht[h] ) x3a->
261c0 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
261d0 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d  np->next);.  np-
261e0 3e 6e 65 78 74 20 3d 20 78 33 61 2d 3e 68 74 5b  >next = x3a->ht[
261f0 68 5d 3b 0a 20 20 78 33 61 2d 3e 68 74 5b 68 5d  h];.  x3a->ht[h]
26200 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f   = np;.  np->fro
26210 6d 20 3d 20 26 28 78 33 61 2d 3e 68 74 5b 68 5d  m = &(x3a->ht[h]
26220 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
26230 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
26240 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73  inter to data as
26250 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69  signed to the gi
26260 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e  ven key.  Return
26270 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73   NULL.** if no s
26280 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75  uch key. */.stru
26290 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f  ct state *State_
262a0 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66  find(struct conf
262b0 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e 73  ig *key).{.  uns
262c0 69 67 6e 65 64 20 68 3b 0a 20 20 78 33 6e 6f 64  igned h;.  x3nod
262d0 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 33  e *np;..  if( x3
262e0 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
262f0 0a 20 20 68 20 3d 20 73 74 61 74 65 68 61 73 68  .  h = statehash
26300 28 6b 65 79 29 20 26 20 28 78 33 61 2d 3e 73 69  (key) & (x3a->si
26310 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33  ze-1);.  np = x3
26320 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
26330 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
26340 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65   statecmp(np->ke
26350 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61  y,key)==0 ) brea
26360 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e  k;.    np = np->
26370 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  next;.  }.  retu
26380 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61  rn np ? np->data
26390 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75   : 0;.}../* Retu
263a0 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  rn an array of p
263b0 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64  ointers to all d
263c0 61 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ata in the table
263d0 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69  ..** The array i
263e0 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
263f0 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20  malloc.  Return 
26400 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61  NULL if memory a
26410 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f  llocation.** pro
26420 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65  blems, or if the
26430 20 61 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e   array is empty.
26440 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65   */.struct state
26450 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79 6f 66   **State_arrayof
26460 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74  ().{.  struct st
26470 61 74 65 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69  ate **array;.  i
26480 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20  nt i,arrSize;.  
26490 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74  if( x3a==0 ) ret
264a0 75 72 6e 20 30 3b 0a 20 20 61 72 72 53 69 7a 65  urn 0;.  arrSize
264b0 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x3a->count;. 
264c0 20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74   array = (struct
264d0 20 73 74 61 74 65 20 2a 2a 29 63 61 6c 6c 6f 63   state **)calloc
264e0 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66  (arrSize, sizeof
264f0 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29  (struct state *)
26500 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29  );.  if( array )
26510 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
26520 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61  <arrSize; i++) a
26530 72 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e 74  rray[i] = x3a->t
26540 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a  bl[i].data;.  }.
26550 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a    return array;.
26560 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f 6e  }../* Hash a con
26570 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52  figuration */.PR
26580 49 56 41 54 45 20 75 6e 73 69 67 6e 65 64 20 63  IVATE unsigned c
26590 6f 6e 66 69 67 68 61 73 68 28 73 74 72 75 63 74  onfighash(struct
265a0 20 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20 20   config *a).{.  
265b0 75 6e 73 69 67 6e 65 64 20 68 3d 30 3b 0a 20 20  unsigned h=0;.  
265c0 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72  h = h*571 + a->r
265d0 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d  p->index*37 + a-
265e0 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 68  >dot;.  return h
265f0 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  ;.}../* There is
26600 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
26610 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
26620 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63  tructure for eac
26630 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65  h.** associative
26640 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
26650 78 34 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73  x4"..*/.struct s
26660 5f 78 34 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65  _x4 {.  int size
26670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26680 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
26690 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73   available slots
266a0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
266b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
266c0 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f  *   Must be a po
266d0 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72  wer of 2 greater
266e0 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20   than or */.    
266f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26700 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c        /*   equal
26710 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63   to 1 */.  int c
26720 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ount;           
26730 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26740 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20  currently slots 
26750 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75  filled */.  stru
26760 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 74 62 6c  ct s_x4node *tbl
26770 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73  ;  /* The data s
26780 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20  tored here */.  
26790 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
267a0 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74  **ht;  /* Hash t
267b0 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73  able for lookups
267c0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65   */.};../* There
267d0 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
267e0 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
267f0 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  re for every dat
26800 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20  a element.** in 
26810 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  an associative a
26820 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 34  rray of type "x4
26830 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  "..*/.typedef st
26840 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 7b 0a  ruct s_x4node {.
26850 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
26860 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
26870 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
26880 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ata */.  struct 
26890 73 5f 78 34 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x4node *next; 
268a0 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
268b0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
268c0 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
268d0 5f 78 34 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x4node **from; 
268e0 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
268f0 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a  k */.} x4node;..
26900 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
26910 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
26920 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
26930 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
26940 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
26950 75 63 74 20 73 5f 78 34 20 2a 78 34 61 3b 0a 0a  uct s_x4 *x4a;..
26960 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
26970 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
26980 72 61 79 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  ray */.void Conf
26990 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 7b 0a  igtable_init(){.
269a0 20 20 69 66 28 20 78 34 61 20 29 20 72 65 74 75    if( x4a ) retu
269b0 72 6e 3b 0a 20 20 78 34 61 20 3d 20 28 73 74 72  rn;.  x4a = (str
269c0 75 63 74 20 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63  uct s_x4*)malloc
269d0 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
269e0 73 5f 78 34 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x4) );.  if( x
269f0 34 61 20 29 7b 0a 20 20 20 20 78 34 61 2d 3e 73  4a ){.    x4a->s
26a00 69 7a 65 20 3d 20 36 34 3b 0a 20 20 20 20 78 34  ize = 64;.    x4
26a10 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
26a20 20 20 78 34 61 2d 3e 74 62 6c 20 3d 20 28 78 34    x4a->tbl = (x4
26a30 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 36 34 2c  node*)calloc(64,
26a40 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20   sizeof(x4node) 
26a50 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a  + sizeof(x4node*
26a60 29 29 3b 0a 20 20 20 20 69 66 28 20 78 34 61 2d  ));.    if( x4a-
26a70 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >tbl==0 ){.     
26a80 20 66 72 65 65 28 78 34 61 29 3b 0a 20 20 20 20   free(x4a);.    
26a90 20 20 78 34 61 20 3d 20 30 3b 0a 20 20 20 20 7d    x4a = 0;.    }
26aa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
26ab0 69 3b 0a 20 20 20 20 20 20 78 34 61 2d 3e 68 74  i;.      x4a->ht
26ac0 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 78   = (x4node**)&(x
26ad0 34 61 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20 20  4a->tbl[64]);.  
26ae0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 36      for(i=0; i<6
26af0 34 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b  4; i++) x4a->ht[
26b00 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
26b10 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20  }.}./* Insert a 
26b20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
26b30 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75  the array.  Retu
26b40 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65  rn TRUE if succe
26b50 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20  ssful..** Prior 
26b60 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61  data with the sa
26b70 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76  me key is NOT ov
26b80 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74  erwritten */.int
26b90 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73   Configtable_ins
26ba0 65 72 74 28 73 74 72 75 63 74 20 63 6f 6e 66 69  ert(struct confi
26bb0 67 20 2a 64 61 74 61 29 0a 7b 0a 20 20 78 34 6e  g *data).{.  x4n
26bc0 6f 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67  ode *np;.  unsig
26bd0 6e 65 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65  ned h;.  unsigne
26be0 64 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 34 61  d ph;..  if( x4a
26bf0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
26c00 20 20 70 68 20 3d 20 63 6f 6e 66 69 67 68 61 73    ph = confighas
26c10 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70  h(data);.  h = p
26c20 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31  h & (x4a->size-1
26c30 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68  );.  np = x4a->h
26c40 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
26c50 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e  p ){.    if( Con
26c60 66 69 67 63 6d 70 28 28 63 6f 6e 73 74 20 63 68  figcmp((const ch
26c70 61 72 20 2a 29 20 6e 70 2d 3e 64 61 74 61 2c 28  ar *) np->data,(
26c80 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 64 61  const char *) da
26c90 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ta)==0 ){.      
26ca0 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65  /* An existing e
26cb0 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
26cc0 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e  me key is found.
26cd0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   */.      /* Fai
26ce0 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72  l because overwr
26cf0 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ite is not allow
26d00 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  s. */.      retu
26d10 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
26d20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
26d30 20 7d 0a 20 20 69 66 28 20 78 34 61 2d 3e 63 6f   }.  if( x4a->co
26d40 75 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a 65 20 29  unt>=x4a->size )
26d50 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
26d60 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
26d70 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20  able bigger */. 
26d80 20 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65     int i,arrSize
26d90 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
26da0 34 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  4 array;.    arr
26db0 61 79 2e 73 69 7a 65 20 3d 20 61 72 72 53 69 7a  ay.size = arrSiz
26dc0 65 20 3d 20 78 34 61 2d 3e 73 69 7a 65 2a 32 3b  e = x4a->size*2;
26dd0 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74  .    array.count
26de0 20 3d 20 78 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x4a->count;. 
26df0 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28     array.tbl = (
26e00 78 34 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61  x4node*)calloc(a
26e10 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78  rrSize, sizeof(x
26e20 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  4node) + sizeof(
26e30 78 34 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69  x4node*));.    i
26e40 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20  f( array.tbl==0 
26e50 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
26e60 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c  Fail due to mall
26e70 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20  oc failure */.  
26e80 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 34    array.ht = (x4
26e90 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74  node**)&(array.t
26ea0 62 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20  bl[arrSize]);.  
26eb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72    for(i=0; i<arr
26ec0 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  Size; i++) array
26ed0 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  .ht[i] = 0;.    
26ee0 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e  for(i=0; i<x4a->
26ef0 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  count; i++){.   
26f00 20 20 20 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70     x4node *oldnp
26f10 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20  , *newnp;.      
26f20 6f 6c 64 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74  oldnp = &(x4a->t
26f30 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20  bl[i]);.      h 
26f40 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6f 6c 64  = confighash(old
26f50 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 61 72 72  np->data) & (arr
26f60 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e  Size-1);.      n
26f70 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74  ewnp = &(array.t
26f80 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  bl[i]);.      if
26f90 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20  ( array.ht[h] ) 
26fa0 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f  array.ht[h]->fro
26fb0 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78  m = &(newnp->nex
26fc0 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  t);.      newnp-
26fd0 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74  >next = array.ht
26fe0 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  [h];.      newnp
26ff0 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e  ->data = oldnp->
27000 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e  data;.      newn
27010 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61  p->from = &(arra
27020 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20  y.ht[h]);.      
27030 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65  array.ht[h] = ne
27040 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  wnp;.    }.    f
27050 72 65 65 28 78 34 61 2d 3e 74 62 6c 29 3b 0a 20  ree(x4a->tbl);. 
27060 20 20 20 2a 78 34 61 20 3d 20 61 72 72 61 79 3b     *x4a = array;
27070 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74  .  }.  /* Insert
27080 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f   the new data */
27090 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 34 61  .  h = ph & (x4a
270a0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
270b0 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 78 34 61  = &(x4a->tbl[x4a
270c0 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e  ->count++]);.  n
270d0 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a  p->data = data;.
270e0 20 20 69 66 28 20 78 34 61 2d 3e 68 74 5b 68 5d    if( x4a->ht[h]
270f0 20 29 20 78 34 61 2d 3e 68 74 5b 68 5d 2d 3e 66   ) x4a->ht[h]->f
27100 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74  rom = &(np->next
27110 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20  );.  np->next = 
27120 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 34  x4a->ht[h];.  x4
27130 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20  a->ht[h] = np;. 
27140 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 34   np->from = &(x4
27150 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74  a->ht[h]);.  ret
27160 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  urn 1;.}../* Ret
27170 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
27180 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74   data assigned t
27190 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e  o the given key.
271a0 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a    Return NULL.**
271b0 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e   if no such key.
271c0 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69   */.struct confi
271d0 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66  g *Configtable_f
271e0 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69  ind(struct confi
271f0 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 69 6e 74 20  g *key).{.  int 
27200 68 3b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b  h;.  x4node *np;
27210 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29  ..  if( x4a==0 )
27220 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
27230 20 63 6f 6e 66 69 67 68 61 73 68 28 6b 65 79 29   confighash(key)
27240 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29   & (x4a->size-1)
27250 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74  ;.  np = x4a->ht
27260 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
27270 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66   ){.    if( Conf
27280 69 67 63 6d 70 28 28 63 6f 6e 73 74 20 63 68 61  igcmp((const cha
27290 72 20 2a 29 20 6e 70 2d 3e 64 61 74 61 2c 28 63  r *) np->data,(c
272a0 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6b 65 79  onst char *) key
272b0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
272c0 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
272d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
272e0 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
272f0 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20 61 6c  .}../* Remove al
27300 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  l data from the 
27310 74 61 62 6c 65 2e 20 20 50 61 73 73 20 65 61 63  table.  Pass eac
27320 68 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 75  h data to the fu
27330 6e 63 74 69 6f 6e 20 22 66 22 0a 2a 2a 20 61 73  nction "f".** as
27340 20 69 74 20 69 73 20 72 65 6d 6f 76 65 64 2e 20   it is removed. 
27350 20 28 22 66 22 20 6d 61 79 20 62 65 20 6e 75 6c   ("f" may be nul
27360 6c 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20  l to avoid this 
27370 73 74 65 70 2e 29 20 2a 2f 0a 76 6f 69 64 20 43  step.) */.void C
27380 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72  onfigtable_clear
27390 28 69 6e 74 28 2a 66 29 28 73 74 72 75 63 74 20  (int(*f)(struct 
273a0 63 6f 6e 66 69 67 20 2a 29 29 0a 7b 0a 20 20 69  config *)).{.  i
273b0 6e 74 20 69 3b 0a 20 20 69 66 28 20 78 34 61 3d  nt i;.  if( x4a=
273c0 3d 30 20 7c 7c 20 78 34 61 2d 3e 63 6f 75 6e 74  =0 || x4a->count
273d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
273e0 69 66 28 20 66 20 29 20 66 6f 72 28 69 3d 30 3b  if( f ) for(i=0;
273f0 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69   i<x4a->count; i
27400 2b 2b 29 20 28 2a 66 29 28 78 34 61 2d 3e 74 62  ++) (*f)(x4a->tb
27410 6c 5b 69 5d 2e 64 61 74 61 29 3b 0a 20 20 66 6f  l[i].data);.  fo
27420 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 73 69  r(i=0; i<x4a->si
27430 7a 65 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74  ze; i++) x4a->ht
27440 5b 69 5d 20 3d 20 30 3b 0a 20 20 78 34 61 2d 3e  [i] = 0;.  x4a->
27450 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 72 65 74  count = 0;.  ret
27460 75 72 6e 3b 0a 7d 0a                             urn;.}.