/ Hex Artifact Content
Login

Artifact 31a7325a4407fa35af7e5913b67517debae8181b:


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 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
1a1b0 20 31 20 69 66 20 74 68 65 20 65 78 70 61 6e 64   1 if the expand
1a1c0 65 64 20 63 6f 64 65 20 72 65 71 75 69 72 65 73  ed code requires
1a1d0 20 74 68 61 74 20 22 79 79 6c 68 73 6d 69 6e 6f   that "yylhsmino
1a1e0 72 22 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  r" local variabl
1a1f0 65 0a 2a 2a 20 74 6f 20 62 65 20 64 65 66 69 6e  e.** to be defin
1a200 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69  ed..*/.PRIVATE i
1a210 6e 74 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f 64  nt translate_cod
1a220 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  e(struct lemon *
1a230 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 72 75 6c  lemp, struct rul
1a240 65 20 2a 72 70 29 7b 0a 20 20 63 68 61 72 20 2a  e *rp){.  char *
1a250 63 70 2c 20 2a 78 70 3b 0a 20 20 69 6e 74 20 69  cp, *xp;.  int i
1a260 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  ;.  int rc = 0; 
1a270 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1a280 75 65 20 69 66 20 79 79 6c 68 73 6d 69 6e 6f 72  ue if yylhsminor
1a290 20 69 73 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f   is used */.  co
1a2a0 6e 73 74 20 63 68 61 72 20 2a 7a 53 6b 69 70 20  nst char *zSkip 
1a2b0 3d 20 30 3b 20 2f 2a 20 54 68 65 20 7a 4f 76 77  = 0; /* The zOvw
1a2c0 72 74 20 63 6f 6d 6d 65 6e 74 20 77 69 74 68 69  rt comment withi
1a2d0 6e 20 72 70 2d 3e 63 6f 64 65 2c 20 6f 72 20 4e  n rp->code, or N
1a2e0 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 6c 68  ULL */.  char lh
1a2f0 73 75 73 65 64 20 3d 20 30 3b 20 20 20 20 20 20  sused = 0;      
1a300 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 4c  /* True if the L
1a310 48 53 20 65 6c 65 6d 65 6e 74 20 68 61 73 20 62  HS element has b
1a320 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 63 68  een used */.  ch
1a330 61 72 20 6c 68 73 64 69 72 65 63 74 3b 20 20 20  ar lhsdirect;   
1a340 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1a350 4c 48 53 20 77 72 69 74 65 73 20 64 69 72 65 63  LHS writes direc
1a360 74 6c 79 20 69 6e 74 6f 20 73 74 61 63 6b 20 2a  tly into stack *
1a370 2f 0a 20 20 63 68 61 72 20 75 73 65 64 5b 4d 41  /.  char used[MA
1a380 58 52 48 53 5d 3b 20 20 20 20 20 2f 2a 20 54 72  XRHS];     /* Tr
1a390 75 65 20 66 6f 72 20 65 61 63 68 20 52 48 53 20  ue for each RHS 
1a3a0 65 6c 65 6d 65 6e 74 20 77 68 69 63 68 20 69 73  element which is
1a3b0 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20   used */.  char 
1a3c0 7a 4c 68 73 5b 35 30 5d 3b 20 20 20 20 20 20 20  zLhs[50];       
1a3d0 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
1a3e0 20 4c 48 53 20 73 79 6d 62 6f 6c 20 69 6e 74 6f   LHS symbol into
1a3f0 20 74 68 69 73 20 73 74 72 69 6e 67 20 2a 2f 0a   this string */.
1a400 20 20 63 68 61 72 20 7a 4f 76 77 72 74 5b 39 30    char zOvwrt[90
1a410 30 5d 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d  0];      /* Comm
1a420 65 6e 74 20 74 68 61 74 20 74 6f 20 61 6c 6c 6f  ent that to allo
1a430 77 20 4c 48 53 20 74 6f 20 6f 76 65 72 77 72 69  w LHS to overwri
1a440 74 65 20 52 48 53 20 2a 2f 0a 0a 20 20 66 6f 72  te RHS */..  for
1a450 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
1a460 3b 20 69 2b 2b 29 20 75 73 65 64 5b 69 5d 20 3d  ; i++) used[i] =
1a470 20 30 3b 0a 20 20 6c 68 73 75 73 65 64 20 3d 20   0;.  lhsused = 
1a480 30 3b 0a 0a 20 20 69 66 28 20 72 70 2d 3e 63 6f  0;..  if( rp->co
1a490 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  de==0 ){.    sta
1a4a0 74 69 63 20 63 68 61 72 20 6e 65 77 6c 69 6e 65  tic char newline
1a4b0 73 74 72 5b 32 5d 20 3d 20 7b 20 27 5c 6e 27 2c  str[2] = { '\n',
1a4c0 20 27 5c 30 27 20 7d 3b 0a 20 20 20 20 72 70 2d   '\0' };.    rp-
1a4d0 3e 63 6f 64 65 20 3d 20 6e 65 77 6c 69 6e 65 73  >code = newlines
1a4e0 74 72 3b 0a 20 20 20 20 72 70 2d 3e 6c 69 6e 65  tr;.    rp->line
1a4f0 20 3d 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 3b   = rp->ruleline;
1a500 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 70 2d  .  }...  if( rp-
1a510 3e 6c 68 73 61 6c 69 61 73 3d 3d 30 20 29 7b 0a  >lhsalias==0 ){.
1a520 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
1a530 6e 6f 20 4c 48 53 20 76 61 6c 75 65 20 73 79 6d  no LHS value sym
1a540 62 6f 6c 2e 20 2a 2f 0a 20 20 20 20 6c 68 73 64  bol. */.    lhsd
1a550 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 7d 65 6c  irect = 1;.  }el
1a560 73 65 20 69 66 28 20 72 70 2d 3e 6e 72 68 73 3d  se if( rp->nrhs=
1a570 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
1a580 74 68 65 72 65 20 61 72 65 20 6e 6f 20 52 48 53  there are no RHS
1a590 20 73 79 6d 62 6f 6c 73 2c 20 74 68 65 6e 20 77   symbols, then w
1a5a0 72 69 74 69 6e 67 20 64 69 72 65 63 74 6c 79 20  riting directly 
1a5b0 74 6f 20 74 68 65 20 4c 48 53 20 69 73 20 6f 6b  to the LHS is ok
1a5c0 20 2a 2f 0a 20 20 20 20 6c 68 73 64 69 72 65 63   */.    lhsdirec
1a5d0 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  t = 1;.  }else i
1a5e0 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  f( rp->rhsalias[
1a5f0 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  0]==0 ){.    /* 
1a600 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 52 48  The left-most RH
1a610 53 20 73 79 6d 62 6f 6c 20 68 61 73 20 6e 6f 74  S symbol has not
1a620 20 76 61 6c 75 65 2e 20 20 4c 48 53 20 64 69 72   value.  LHS dir
1a630 65 63 74 20 69 73 20 6f 6b 2e 20 20 42 75 74 0a  ect is ok.  But.
1a640 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74      ** we have t
1a650 6f 20 63 61 6c 6c 20 74 68 65 20 64 69 73 74 72  o call the distr
1a660 75 63 74 6f 72 20 6f 6e 20 74 68 65 20 52 48 53  uctor on the RHS
1a670 20 73 79 6d 62 6f 6c 20 66 69 72 73 74 2e 20 2a   symbol first. *
1a680 2f 0a 20 20 20 20 6c 68 73 64 69 72 65 63 74 20  /.    lhsdirect 
1a690 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 68 61 73  = 1;.    if( has
1a6a0 5f 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d 3e  _destructor(rp->
1a6b0 72 68 73 5b 30 5d 2c 6c 65 6d 70 29 20 29 7b 0a  rhs[0],lemp) ){.
1a6c0 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
1a6d0 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20  (0,0,0,0);.     
1a6e0 20 61 70 70 65 6e 64 5f 73 74 72 28 22 20 20 79   append_str("  y
1a6f0 79 5f 64 65 73 74 72 75 63 74 6f 72 28 79 79 70  y_destructor(yyp
1a700 50 61 72 73 65 72 2c 25 64 2c 26 79 79 6d 73 70  Parser,%d,&yymsp
1a710 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e 22 2c  [%d].minor);\n",
1a720 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1a730 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 30 5d 2d       rp->rhs[0]-
1a740 3e 69 6e 64 65 78 2c 31 2d 72 70 2d 3e 6e 72 68  >index,1-rp->nrh
1a750 73 29 3b 0a 20 20 20 20 20 20 72 70 2d 3e 63 6f  s);.      rp->co
1a760 64 65 50 72 65 66 69 78 20 3d 20 53 74 72 73 61  dePrefix = Strsa
1a770 66 65 28 61 70 70 65 6e 64 5f 73 74 72 28 30 2c  fe(append_str(0,
1a780 30 2c 30 2c 30 29 29 3b 0a 20 20 20 20 7d 0a 20  0,0,0));.    }. 
1a790 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1a7a0 70 28 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72  p(rp->lhsalias,r
1a7b0 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d 29 3d  p->rhsalias[0])=
1a7c0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
1a7d0 20 4c 48 53 20 73 79 6d 62 6f 6c 20 61 6e 64 20   LHS symbol and 
1a7e0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 52 48  the left-most RH
1a7f0 53 20 73 79 6d 62 6f 6c 20 61 72 65 20 74 68 65  S symbol are the
1a800 20 73 61 6d 65 2c 20 73 6f 20 0a 20 20 20 20 2a   same, so .    *
1a810 2a 20 64 69 72 65 63 74 20 77 72 69 74 69 6e 67  * direct writing
1a820 20 69 73 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20   is allowed */. 
1a830 20 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20 31     lhsdirect = 1
1a840 3b 0a 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20  ;.    lhsused = 
1a850 31 3b 0a 20 20 20 20 75 73 65 64 5b 30 5d 20 3d  1;.    used[0] =
1a860 20 31 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e   1;.    if( rp->
1a870 6c 68 73 2d 3e 64 74 6e 75 6d 21 3d 72 70 2d 3e  lhs->dtnum!=rp->
1a880 72 68 73 5b 30 5d 2d 3e 64 74 6e 75 6d 20 29 7b  rhs[0]->dtnum ){
1a890 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28  .      ErrorMsg(
1a8a0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72  lemp->filename,r
1a8b0 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20  p->ruleline,.   
1a8c0 20 20 20 20 20 22 25 73 28 25 73 29 20 61 6e 64       "%s(%s) and
1a8d0 20 25 73 28 25 73 29 20 73 68 61 72 65 20 74 68   %s(%s) share th
1a8e0 65 20 73 61 6d 65 20 6c 61 62 65 6c 20 62 75 74  e same label but
1a8f0 20 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20   have ".        
1a900 22 64 69 66 66 65 72 65 6e 74 20 64 61 74 61 74  "different datat
1a910 79 70 65 73 2e 22 2c 0a 20 20 20 20 20 20 20 20  ypes.",.        
1a920 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 20 72  rp->lhs->name, r
1a930 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 20 72 70 2d  p->lhsalias, rp-
1a940 3e 72 68 73 5b 30 5d 2d 3e 6e 61 6d 65 2c 20 72  >rhs[0]->name, r
1a950 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d 29 3b  p->rhsalias[0]);
1a960 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  .      lemp->err
1a970 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 20 20  orcnt++;.    }  
1a980 20 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20    .  }else{.    
1a990 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a 4f  lemon_sprintf(zO
1a9a0 76 77 72 74 2c 20 22 2f 2a 25 73 2d 6f 76 65 72  vwrt, "/*%s-over
1a9b0 77 72 69 74 65 73 2d 25 73 2a 2f 22 2c 0a 20 20  writes-%s*/",.  
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9d0 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 20 72 70  rp->lhsalias, rp
1a9e0 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d 29 3b 0a  ->rhsalias[0]);.
1a9f0 20 20 20 20 7a 53 6b 69 70 20 3d 20 73 74 72 73      zSkip = strs
1aa00 74 72 28 72 70 2d 3e 63 6f 64 65 2c 20 7a 4f 76  tr(rp->code, zOv
1aa10 77 72 74 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  wrt);.    if( zS
1aa20 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  kip!=0 ){.      
1aa30 2f 2a 20 54 68 65 20 63 6f 64 65 20 63 6f 6e 74  /* The code cont
1aa40 61 69 6e 73 20 61 20 73 70 65 63 69 61 6c 20 63  ains a special c
1aa50 6f 6d 6d 65 6e 74 20 74 68 61 74 20 69 6e 64 69  omment that indi
1aa60 63 61 74 65 73 20 74 68 61 74 20 69 74 20 69 73  cates that it is
1aa70 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 66   safe.      ** f
1aa80 6f 72 20 74 68 65 20 4c 48 53 20 6c 61 62 65 6c  or the LHS label
1aa90 20 74 6f 20 6f 76 65 72 77 72 69 74 65 20 6c 65   to overwrite le
1aaa0 66 74 2d 6d 6f 73 74 20 52 48 53 20 6c 61 62 65  ft-most RHS labe
1aab0 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 64  l. */.      lhsd
1aac0 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 20 20 7d  irect = 1;.    }
1aad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 68 73 64  else{.      lhsd
1aae0 69 72 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 7d  irect = 0;.    }
1aaf0 0a 20 20 7d 0a 20 20 69 66 28 20 6c 68 73 64 69  .  }.  if( lhsdi
1ab00 72 65 63 74 20 29 7b 0a 20 20 20 20 73 70 72 69  rect ){.    spri
1ab10 6e 74 66 28 7a 4c 68 73 2c 20 22 79 79 6d 73 70  ntf(zLhs, "yymsp
1ab20 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22  [%d].minor.yy%d"
1ab30 2c 31 2d 72 70 2d 3e 6e 72 68 73 2c 72 70 2d 3e  ,1-rp->nrhs,rp->
1ab40 6c 68 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 7d  lhs->dtnum);.  }
1ab50 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
1ab60 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c  ;.    sprintf(zL
1ab70 68 73 2c 20 22 79 79 6c 68 73 6d 69 6e 6f 72 2e  hs, "yylhsminor.
1ab80 79 79 25 64 22 2c 72 70 2d 3e 6c 68 73 2d 3e 64  yy%d",rp->lhs->d
1ab90 74 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 61 70  tnum);.  }..  ap
1aba0 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30  pend_str(0,0,0,0
1abb0 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
1abc0 6e 73 74 20 63 61 73 74 20 69 73 20 77 72 6f 6e  nst cast is wron
1abd0 67 20 62 75 74 20 68 61 72 6d 6c 65 73 73 2c 20  g but harmless, 
1abe0 69 66 20 77 65 27 72 65 20 63 61 72 65 66 75 6c  if we're careful
1abf0 2e 20 2a 2f 0a 20 20 66 6f 72 28 63 70 3d 28 63  . */.  for(cp=(c
1ac00 68 61 72 20 2a 29 72 70 2d 3e 63 6f 64 65 3b 20  har *)rp->code; 
1ac10 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20  *cp; cp++){.    
1ac20 69 66 28 20 63 70 3d 3d 7a 53 6b 69 70 20 29 7b  if( cp==zSkip ){
1ac30 0a 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74  .      append_st
1ac40 72 28 7a 4f 76 77 72 74 2c 30 2c 30 2c 30 29 3b  r(zOvwrt,0,0,0);
1ac50 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 6c 65 6d  .      cp += lem
1ac60 6f 6e 53 74 72 6c 65 6e 28 7a 4f 76 77 72 74 29  onStrlen(zOvwrt)
1ac70 2d 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  -1;.      contin
1ac80 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
1ac90 28 20 49 53 41 4c 50 48 41 28 2a 63 70 29 20 26  ( ISALPHA(*cp) &
1aca0 26 20 28 63 70 3d 3d 72 70 2d 3e 63 6f 64 65 20  & (cp==rp->code 
1acb0 7c 7c 20 28 21 49 53 41 4c 4e 55 4d 28 63 70 5b  || (!ISALNUM(cp[
1acc0 2d 31 5d 29 20 26 26 20 63 70 5b 2d 31 5d 21 3d  -1]) && cp[-1]!=
1acd0 27 5f 27 29 29 20 29 7b 0a 20 20 20 20 20 20 63  '_')) ){.      c
1ace0 68 61 72 20 73 61 76 65 64 3b 0a 20 20 20 20 20  har saved;.     
1acf0 20 66 6f 72 28 78 70 3d 20 26 63 70 5b 31 5d 3b   for(xp= &cp[1];
1ad00 20 49 53 41 4c 4e 55 4d 28 2a 78 70 29 20 7c 7c   ISALNUM(*xp) ||
1ad10 20 2a 78 70 3d 3d 27 5f 27 3b 20 78 70 2b 2b 29   *xp=='_'; xp++)
1ad20 3b 0a 20 20 20 20 20 20 73 61 76 65 64 20 3d 20  ;.      saved = 
1ad30 2a 78 70 3b 0a 20 20 20 20 20 20 2a 78 70 20 3d  *xp;.      *xp =
1ad40 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70   0;.      if( rp
1ad50 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 73 74  ->lhsalias && st
1ad60 72 63 6d 70 28 63 70 2c 72 70 2d 3e 6c 68 73 61  rcmp(cp,rp->lhsa
1ad70 6c 69 61 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lias)==0 ){.    
1ad80 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 7a      append_str(z
1ad90 4c 68 73 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20  Lhs,0,0,0);.    
1ada0 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20      cp = xp;.   
1adb0 20 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20 31       lhsused = 1
1adc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1add0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1ade0 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
1adf0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1ae00 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20  rp->rhsalias[i] 
1ae10 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d  && strcmp(cp,rp-
1ae20 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30  >rhsalias[i])==0
1ae30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ae40 69 66 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64 65  if( cp!=rp->code
1ae50 20 26 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27 20   && cp[-1]=='@' 
1ae60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1ae70 20 2f 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d   /* If the argum
1ae80 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ent is of the fo
1ae90 72 6d 20 40 58 20 74 68 65 6e 20 73 75 62 73 74  rm @X then subst
1aea0 69 74 75 74 65 64 0a 20 20 20 20 20 20 20 20 20  ituted.         
1aeb0 20 20 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b 65       ** the toke
1aec0 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20 6e  n number of X, n
1aed0 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ot the value of 
1aee0 58 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  X */.           
1aef0 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79     append_str("y
1af00 79 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22 2c  ymsp[%d].major",
1af10 2d 31 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c  -1,i-rp->nrhs+1,
1af20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
1af30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1af40 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
1af50 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73  ol *sp = rp->rhs
1af60 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
1af70 20 20 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20 20     int dtnum;.  
1af80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1af90 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54  sp->type==MULTIT
1afa0 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
1afb0 20 20 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d             dtnum
1afc0 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d   = sp->subsym[0]
1afd0 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  ->dtnum;.       
1afe0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 74                dt
1b000 6e 75 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d 3b  num = sp->dtnum;
1b010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1b020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
1b030 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73 70  ppend_str("yymsp
1b040 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22  [%d].minor.yy%d"
1b050 2c 30 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c  ,0,i-rp->nrhs+1,
1b060 20 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20   dtnum);.       
1b070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b080 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20     cp = xp;.    
1b090 20 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d 20          used[i] 
1b0a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
1b0b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1b0c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1b0d0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 78 70 20      }.      *xp 
1b0e0 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a 20  = saved;.    }. 
1b0f0 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 63 70     append_str(cp
1b100 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 20  , 1, 0, 0);.  } 
1b110 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 0a  /* End loop */..
1b120 20 20 2f 2a 20 4d 61 69 6e 20 63 6f 64 65 20 67    /* Main code g
1b130 65 6e 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c 65  eneration comple
1b140 74 65 64 20 2a 2f 0a 20 20 63 70 20 3d 20 61 70  ted */.  cp = ap
1b150 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30  pend_str(0,0,0,0
1b160 29 3b 0a 20 20 69 66 28 20 63 70 20 26 26 20 63  );.  if( cp && c
1b170 70 5b 30 5d 20 29 20 72 70 2d 3e 63 6f 64 65 20  p[0] ) rp->code 
1b180 3d 20 53 74 72 73 61 66 65 28 63 70 29 3b 0a 20  = Strsafe(cp);. 
1b190 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c   append_str(0,0,
1b1a0 30 2c 30 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  0,0);..  /* Chec
1b1b0 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  k to make sure t
1b1c0 68 65 20 4c 48 53 20 68 61 73 20 62 65 65 6e 20  he LHS has been 
1b1d0 75 73 65 64 20 2a 2f 0a 20 20 69 66 28 20 72 70  used */.  if( rp
1b1e0 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 21 6c  ->lhsalias && !l
1b1f0 68 73 75 73 65 64 20 29 7b 0a 20 20 20 20 45 72  hsused ){.    Er
1b200 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
1b210 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69  ename,rp->ruleli
1b220 6e 65 2c 0a 20 20 20 20 20 20 22 4c 61 62 65 6c  ne,.      "Label
1b230 20 5c 22 25 73 5c 22 20 66 6f 72 20 5c 22 25 73   \"%s\" for \"%s
1b240 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20  (%s)\" is never 
1b250 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 20  used.",.        
1b260 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d  rp->lhsalias,rp-
1b270 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 6c  >lhs->name,rp->l
1b280 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 6c 65  hsalias);.    le
1b290 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
1b2a0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1b2b0 74 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 6f  te destructor co
1b2c0 64 65 20 66 6f 72 20 52 48 53 20 6d 69 6e 6f 72  de for RHS minor
1b2d0 20 76 61 6c 75 65 73 20 77 68 69 63 68 20 61 72   values which ar
1b2e0 65 20 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 64  e not referenced
1b2f0 2e 0a 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20  ..  ** Generate 
1b300 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 66  error messages f
1b310 6f 72 20 75 6e 75 73 65 64 20 6c 61 62 65 6c 73  or unused labels
1b320 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20 6c   and duplicate l
1b330 61 62 65 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  abels..  */.  fo
1b340 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
1b350 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  s; i++){.    if(
1b360 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
1b370 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3e   ){.      if( i>
1b380 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
1b390 20 6a 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   j;.        if( 
1b3a0 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20  rp->lhsalias && 
1b3b0 73 74 72 63 6d 70 28 72 70 2d 3e 6c 68 73 61 6c  strcmp(rp->lhsal
1b3c0 69 61 73 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  ias,rp->rhsalias
1b3d0 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  [i])==0 ){.     
1b3e0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
1b3f0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
1b400 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20  >ruleline,.     
1b410 20 20 20 20 20 20 20 22 25 73 28 25 73 29 20 68         "%s(%s) h
1b420 61 73 20 74 68 65 20 73 61 6d 65 20 6c 61 62 65  as the same labe
1b430 6c 20 61 73 20 74 68 65 20 4c 48 53 20 62 75 74  l as the LHS but
1b440 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74   is not the left
1b450 2d 6d 6f 73 74 20 22 0a 20 20 20 20 20 20 20 20  -most ".        
1b460 20 20 20 20 22 73 79 6d 62 6f 6c 20 6f 6e 20 74      "symbol on t
1b470 68 65 20 52 48 53 2e 22 2c 0a 20 20 20 20 20 20  he RHS.",.      
1b480 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d        rp->rhs[i]
1b490 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 72 68 73 61  ->name, rp->rhsa
1b4a0 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lias);.         
1b4b0 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
1b4c0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
1b4d0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1b4e0 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  i; j++){.       
1b4f0 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c     if( rp->rhsal
1b500 69 61 73 5b 6a 5d 20 26 26 20 73 74 72 63 6d 70  ias[j] && strcmp
1b510 28 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 6a 5d  (rp->rhsalias[j]
1b520 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d  ,rp->rhsalias[i]
1b530 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1b540 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
1b550 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
1b560 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20  ruleline,.      
1b570 20 20 20 20 20 20 20 20 22 4c 61 62 65 6c 20 25          "Label %
1b580 73 20 75 73 65 64 20 66 6f 72 20 6d 75 6c 74 69  s used for multi
1b590 70 6c 65 20 73 79 6d 62 6f 6c 73 20 6f 6e 20 74  ple symbols on t
1b5a0 68 65 20 52 48 53 20 6f 66 20 61 20 72 75 6c 65  he RHS of a rule
1b5b0 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  .",.            
1b5c0 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69    rp->rhsalias[i
1b5d0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
1b5e0 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
1b5f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
1b600 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
1b610 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b620 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 75 73   }.      if( !us
1b630 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  ed[i] ){.       
1b640 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
1b650 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c  filename,rp->rul
1b660 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 20  eline,.         
1b670 20 22 4c 61 62 65 6c 20 25 73 20 66 6f 72 20 5c   "Label %s for \
1b680 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76  "%s(%s)\" is nev
1b690 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20  er used.",.     
1b6a0 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61       rp->rhsalia
1b6b0 73 5b 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d  s[i],rp->rhs[i]-
1b6c0 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69  >name,rp->rhsali
1b6d0 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  as[i]);.        
1b6e0 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
1b6f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1b700 6c 73 65 20 69 66 28 20 69 3e 30 20 26 26 20 68  lse if( i>0 && h
1b710 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28 72 70  as_destructor(rp
1b720 2d 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70 29 20 29  ->rhs[i],lemp) )
1b730 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73  {.      append_s
1b740 74 72 28 22 20 20 79 79 5f 64 65 73 74 72 75 63  tr("  yy_destruc
1b750 74 6f 72 28 79 79 70 50 61 72 73 65 72 2c 25 64  tor(yypParser,%d
1b760 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f  ,&yymsp[%d].mino
1b770 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20  r);\n", 0,.     
1b780 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e      rp->rhs[i]->
1b790 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72 68 73  index,i-rp->nrhs
1b7a0 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  +1);.    }.  }..
1b7b0 20 20 2f 2a 20 49 66 20 75 6e 61 62 6c 65 20 74    /* If unable t
1b7c0 6f 20 77 72 69 74 65 20 4c 48 53 20 76 61 6c 75  o write LHS valu
1b7d0 65 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f  es directly into
1b7e0 20 74 68 65 20 73 74 61 63 6b 2c 20 77 72 69 74   the stack, writ
1b7f0 65 20 74 68 65 0a 20 20 2a 2a 20 73 61 76 65 64  e the.  ** saved
1b800 20 4c 48 53 20 76 61 6c 75 65 20 6e 6f 77 2e 20   LHS value now. 
1b810 2a 2f 0a 20 20 69 66 28 20 6c 68 73 64 69 72 65  */.  if( lhsdire
1b820 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70 70  ct==0 ){.    app
1b830 65 6e 64 5f 73 74 72 28 22 20 20 79 79 6d 73 70  end_str("  yymsp
1b840 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 20  [%d].minor.yy%d 
1b850 3d 20 22 2c 20 30 2c 20 31 2d 72 70 2d 3e 6e 72  = ", 0, 1-rp->nr
1b860 68 73 2c 20 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e  hs, rp->lhs->dtn
1b870 75 6d 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 5f  um);.    append_
1b880 73 74 72 28 7a 4c 68 73 2c 20 30 2c 20 30 2c 20  str(zLhs, 0, 0, 
1b890 30 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 5f 73  0);.    append_s
1b8a0 74 72 28 22 3b 5c 6e 22 2c 20 30 2c 20 30 2c 20  tr(";\n", 0, 0, 
1b8b0 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 75  0);.  }..  /* Su
1b8c0 66 66 69 78 20 63 6f 64 65 20 67 65 6e 65 72 61  ffix code genera
1b8d0 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 20 2a 2f  tion complete */
1b8e0 0a 20 20 63 70 20 3d 20 61 70 70 65 6e 64 5f 73  .  cp = append_s
1b8f0 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 69  tr(0,0,0,0);.  i
1b900 66 28 20 63 70 20 29 20 72 70 2d 3e 63 6f 64 65  f( cp ) rp->code
1b910 53 75 66 66 69 78 20 3d 20 53 74 72 73 61 66 65  Suffix = Strsafe
1b920 28 63 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  (cp);..  return 
1b930 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 47 65  rc;.}../* .** Ge
1b940 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
1b950 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20  h executes when 
1b960 74 68 65 20 72 75 6c 65 20 22 72 70 22 20 69 73  the rule "rp" is
1b970 20 72 65 64 75 63 65 64 2e 20 20 57 72 69 74 65   reduced.  Write
1b980 0a 2a 2a 20 74 68 65 20 63 6f 64 65 20 74 6f 20  .** the code to 
1b990 22 6f 75 74 22 2e 20 20 4d 61 6b 65 20 73 75 72  "out".  Make sur
1b9a0 65 20 6c 69 6e 65 6e 6f 20 73 74 61 79 73 20 75  e lineno stays u
1b9b0 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 50 52  p-to-date..*/.PR
1b9c0 49 56 41 54 45 20 76 6f 69 64 20 65 6d 69 74 5f  IVATE void emit_
1b9d0 63 6f 64 65 28 0a 20 20 46 49 4c 45 20 2a 6f 75  code(.  FILE *ou
1b9e0 74 2c 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  t,.  struct rule
1b9f0 20 2a 72 70 2c 0a 20 20 73 74 72 75 63 74 20 6c   *rp,.  struct l
1ba00 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e  emon *lemp,.  in
1ba10 74 20 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a 20 63 6f  t *lineno.){. co
1ba20 6e 73 74 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20  nst char *cp;.. 
1ba30 2f 2a 20 53 65 74 75 70 20 63 6f 64 65 20 70 72  /* Setup code pr
1ba40 69 6f 72 20 74 6f 20 74 68 65 20 23 6c 69 6e 65  ior to the #line
1ba50 20 64 69 72 65 63 74 69 76 65 20 2a 2f 0a 20 69   directive */. i
1ba60 66 28 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69  f( rp->codePrefi
1ba70 78 20 26 26 20 72 70 2d 3e 63 6f 64 65 50 72 65  x && rp->codePre
1ba80 66 69 78 5b 30 5d 20 29 7b 0a 20 20 20 66 70 72  fix[0] ){.   fpr
1ba90 69 6e 74 66 28 6f 75 74 2c 20 22 7b 25 73 22 2c  intf(out, "{%s",
1baa0 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 29   rp->codePrefix)
1bab0 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e  ;.   for(cp=rp->
1bac0 63 6f 64 65 50 72 65 66 69 78 3b 20 2a 63 70 3b  codePrefix; *cp;
1bad0 20 63 70 2b 2b 29 7b 20 69 66 28 20 2a 63 70 3d   cp++){ if( *cp=
1bae0 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f  ='\n' ) (*lineno
1baf0 29 2b 2b 3b 20 7d 0a 20 7d 0a 0a 20 2f 2a 20 47  )++; }. }.. /* G
1bb00 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1bb10 64 6f 20 74 68 65 20 72 65 64 75 63 65 20 61 63  do the reduce ac
1bb20 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d  tion */. if( rp-
1bb30 3e 63 6f 64 65 20 29 7b 0a 20 20 20 69 66 28 20  >code ){.   if( 
1bb40 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73  !lemp->nolinenos
1bb50 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 28 2a 6c  flag ){.     (*l
1bb60 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 74  ineno)++;.     t
1bb70 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c  plt_linedir(out,
1bb80 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66  rp->line,lemp->f
1bb90 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a 20  ilename);.   }. 
1bba0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b    fprintf(out,"{
1bbb0 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 0a 20  %s",rp->code);. 
1bbc0 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64    for(cp=rp->cod
1bbd0 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 20 69  e; *cp; cp++){ i
1bbe0 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28  f( *cp=='\n' ) (
1bbf0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 20  *lineno)++; }.  
1bc00 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c   fprintf(out,"}\
1bc10 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n"); (*lineno)++
1bc20 3b 0a 20 20 20 69 66 28 20 21 6c 65 6d 70 2d 3e  ;.   if( !lemp->
1bc30 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 29 7b  nolinenosflag ){
1bc40 0a 20 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b  .     (*lineno)+
1bc50 2b 3b 0a 20 20 20 20 20 74 70 6c 74 5f 6c 69 6e  +;.     tplt_lin
1bc60 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f  edir(out,*lineno
1bc70 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b  ,lemp->outname);
1bc80 0a 20 20 20 7d 0a 20 7d 0a 0a 20 2f 2a 20 47 65  .   }. }.. /* Ge
1bc90 6e 65 72 61 74 65 20 62 72 65 61 6b 64 6f 77 6e  nerate breakdown
1bca0 20 63 6f 64 65 20 74 68 61 74 20 6f 63 63 75 72   code that occur
1bcb0 73 20 61 66 74 65 72 20 74 68 65 20 23 6c 69 6e  s after the #lin
1bcc0 65 20 64 69 72 65 63 74 69 76 65 20 2a 2f 0a 20  e directive */. 
1bcd0 69 66 28 20 72 70 2d 3e 63 6f 64 65 53 75 66 66  if( rp->codeSuff
1bce0 69 78 20 26 26 20 72 70 2d 3e 63 6f 64 65 53 75  ix && rp->codeSu
1bcf0 66 66 69 78 5b 30 5d 20 29 7b 0a 20 20 20 66 70  ffix[0] ){.   fp
1bd00 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
1bd10 20 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78 29   rp->codeSuffix)
1bd20 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e  ;.   for(cp=rp->
1bd30 63 6f 64 65 53 75 66 66 69 78 3b 20 2a 63 70 3b  codeSuffix; *cp;
1bd40 20 63 70 2b 2b 29 7b 20 69 66 28 20 2a 63 70 3d   cp++){ if( *cp=
1bd50 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f  ='\n' ) (*lineno
1bd60 29 2b 2b 3b 20 7d 0a 20 7d 0a 0a 20 69 66 28 20  )++; }. }.. if( 
1bd70 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 20 29  rp->codePrefix )
1bd80 7b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  {.   fprintf(out
1bd90 2c 20 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65  , "}\n"); (*line
1bda0 6e 6f 29 2b 2b 3b 0a 20 7d 0a 0a 20 72 65 74 75  no)++;. }.. retu
1bdb0 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  rn;.}../*.** Pri
1bdc0 6e 74 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  nt the definitio
1bdd0 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f 6e 20 75  n of the union u
1bde0 73 65 64 20 66 6f 72 20 74 68 65 20 70 61 72 73  sed for the pars
1bdf0 65 72 27 73 20 64 61 74 61 20 73 74 61 63 6b 2e  er's data stack.
1be00 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f 6e 20 63  .** This union c
1be10 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64 73 20 66  ontains fields f
1be20 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c  or every possibl
1be30 65 20 64 61 74 61 20 74 79 70 65 20 66 6f 72 20  e data type for 
1be40 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f  tokens.** and no
1be50 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20 49 6e 20  nterminals.  In 
1be60 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 63  the process of c
1be70 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20 70 72 69  omputing and pri
1be80 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a 20 75 6e  nting this.** un
1be90 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74 20 74 68  ion, also set th
1bea0 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64  e ".dtnum" field
1beb0 20 6f 66 20 65 76 65 72 79 20 74 65 72 6d 69 6e   of every termin
1bec0 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e  al and nontermin
1bed0 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f  al.** symbol..*/
1bee0 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73 74 61 63  .void print_stac
1bef0 6b 5f 75 6e 69 6f 6e 28 0a 20 20 46 49 4c 45 20  k_union(.  FILE 
1bf00 2a 6f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  *out,           
1bf10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75         /* The ou
1bf20 74 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20  tput stream */. 
1bf30 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c   struct lemon *l
1bf40 65 6d 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  emp,         /* 
1bf50 54 68 65 20 6d 61 69 6e 20 69 6e 66 6f 20 73 74  The main info st
1bf60 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 73  ructure for this
1bf70 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 69 6e 74   parser */.  int
1bf80 20 2a 70 6c 69 6e 65 6e 6f 2c 20 20 20 20 20 20   *plineno,      
1bf90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1bfa0 74 65 72 20 74 6f 20 74 68 65 20 6c 69 6e 65 20  ter to the line 
1bfb0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
1bfc0 6d 68 66 6c 61 67 20 20 20 20 20 20 20 20 20 20  mhflag          
1bfd0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1bfe0 69 66 20 67 65 6e 65 72 61 74 69 6e 67 20 6d 61  if generating ma
1bff0 6b 65 68 65 61 64 65 72 73 20 6f 75 74 70 75 74  keheaders output
1c000 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6c 69 6e   */.){.  int lin
1c010 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20  eno = *plineno; 
1c020 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20 6e     /* The line n
1c030 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6f 75 74  umber of the out
1c040 70 75 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  put */.  char **
1c050 74 79 70 65 73 3b 20 20 20 20 20 20 20 20 20 20  types;          
1c060 20 20 20 2f 2a 20 41 20 68 61 73 68 20 74 61 62     /* A hash tab
1c070 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65 73 20  le of datatypes 
1c080 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61 79 73 69  */.  int arraysi
1c090 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
1c0a0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 22 74  * Size of the "t
1c0b0 79 70 65 73 22 20 61 72 72 61 79 20 2a 2f 0a 20  ypes" array */. 
1c0c0 20 69 6e 74 20 6d 61 78 64 74 6c 65 6e 67 74 68   int maxdtlength
1c0d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  ;          /* Ma
1c0e0 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20  ximum length of 
1c0f0 61 6e 79 20 22 2e 64 61 74 61 74 79 70 65 22 20  any ".datatype" 
1c100 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 63 68 61 72  field. */.  char
1c110 20 2a 73 74 64 64 74 3b 20 20 20 20 20 20 20 20   *stddt;        
1c120 20 20 20 20 20 20 2f 2a 20 53 74 61 6e 64 61 72        /* Standar
1c130 64 69 7a 65 64 20 6e 61 6d 65 20 66 6f 72 20 61  dized name for a
1c140 20 64 61 74 61 74 79 70 65 20 2a 2f 0a 20 20 69   datatype */.  i
1c150 6e 74 20 69 2c 6a 3b 20 20 20 20 20 20 20 20 20  nt i,j;         
1c160 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1c170 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75   counters */.  u
1c180 6e 73 69 67 6e 65 64 20 68 61 73 68 3b 20 20 20  nsigned hash;   
1c190 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1c1a0 68 61 73 68 69 6e 67 20 74 68 65 20 6e 61 6d 65  hashing the name
1c1b0 20 6f 66 20 61 20 74 79 70 65 20 2a 2f 0a 20 20   of a type */.  
1c1c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65  const char *name
1c1d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
1c1e0 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20  e of the parser 
1c1f0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
1c200 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
1c210 20 74 79 70 65 73 5b 5d 20 61 6e 64 20 61 6c 6c   types[] and all
1c220 6f 63 61 74 65 20 73 74 64 64 74 5b 5d 20 2a 2f  ocate stddt[] */
1c230 0a 20 20 61 72 72 61 79 73 69 7a 65 20 3d 20 6c  .  arraysize = l
1c240 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32  emp->nsymbol * 2
1c250 3b 0a 20 20 74 79 70 65 73 20 3d 20 28 63 68 61  ;.  types = (cha
1c260 72 2a 2a 29 63 61 6c 6c 6f 63 28 20 61 72 72 61  r**)calloc( arra
1c270 79 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28 63 68  ysize, sizeof(ch
1c280 61 72 2a 29 20 29 3b 0a 20 20 69 66 28 20 74 79  ar*) );.  if( ty
1c290 70 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  pes==0 ){.    fp
1c2a0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75  rintf(stderr,"Ou
1c2b0 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29  t of memory.\n")
1c2c0 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
1c2d0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1c2e0 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29 20  arraysize; i++) 
1c2f0 74 79 70 65 73 5b 69 5d 20 3d 20 30 3b 0a 20 20  types[i] = 0;.  
1c300 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 30 3b  maxdtlength = 0;
1c310 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72  .  if( lemp->var
1c320 74 79 70 65 20 29 7b 0a 20 20 20 20 6d 61 78 64  type ){.    maxd
1c330 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6d 6f 6e 53  tlength = lemonS
1c340 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61 72 74  trlen(lemp->vart
1c350 79 70 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ype);.  }.  for(
1c360 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
1c370 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
1c380 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 73 74 72  int len;.    str
1c390 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
1c3a0 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
1c3b0 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 64  ];.    if( sp->d
1c3c0 61 74 61 74 79 70 65 3d 3d 30 20 29 20 63 6f 6e  atatype==0 ) con
1c3d0 74 69 6e 75 65 3b 0a 20 20 20 20 6c 65 6e 20 3d  tinue;.    len =
1c3e0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 70 2d   lemonStrlen(sp-
1c3f0 3e 64 61 74 61 74 79 70 65 29 3b 0a 20 20 20 20  >datatype);.    
1c400 69 66 28 20 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e  if( len>maxdtlen
1c410 67 74 68 20 29 20 6d 61 78 64 74 6c 65 6e 67 74  gth ) maxdtlengt
1c420 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73  h = len;.  }.  s
1c430 74 64 64 74 20 3d 20 28 63 68 61 72 2a 29 6d 61  tddt = (char*)ma
1c440 6c 6c 6f 63 28 20 6d 61 78 64 74 6c 65 6e 67 74  lloc( maxdtlengt
1c450 68 2a 32 20 2b 20 31 20 29 3b 0a 20 20 69 66 28  h*2 + 1 );.  if(
1c460 20 73 74 64 64 74 3d 3d 30 20 29 7b 0a 20 20 20   stddt==0 ){.   
1c470 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1c480 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c  "Out of memory.\
1c490 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
1c4a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c  ;.  }..  /* Buil
1c4b0 64 20 61 20 68 61 73 68 20 74 61 62 6c 65 20 6f  d a hash table o
1c4c0 66 20 64 61 74 61 74 79 70 65 73 2e 20 54 68 65  f datatypes. The
1c4d0 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20   ".dtnum" field 
1c4e0 6f 66 20 65 61 63 68 20 73 79 6d 62 6f 6c 0a 20  of each symbol. 
1c4f0 20 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 69 6e   ** is filled in
1c500 20 77 69 74 68 20 74 68 65 20 68 61 73 68 20 69   with the hash i
1c510 6e 64 65 78 20 70 6c 75 73 20 31 2e 20 20 41 20  ndex plus 1.  A 
1c520 22 2e 64 74 6e 75 6d 22 20 76 61 6c 75 65 20 6f  ".dtnum" value o
1c530 66 20 30 20 69 73 0a 20 20 2a 2a 20 75 73 65 64  f 0 is.  ** used
1c540 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 20 73 79   for terminal sy
1c550 6d 62 6f 6c 73 2e 20 20 49 66 20 74 68 65 72 65  mbols.  If there
1c560 20 69 73 20 6e 6f 20 25 64 65 66 61 75 6c 74 5f   is no %default_
1c570 74 79 70 65 20 64 65 66 69 6e 65 64 20 74 68 65  type defined the
1c580 6e 0a 20 20 2a 2a 20 30 20 69 73 20 61 6c 73 6f  n.  ** 0 is also
1c590 20 75 73 65 64 20 61 73 20 74 68 65 20 2e 64 74   used as the .dt
1c5a0 6e 75 6d 20 76 61 6c 75 65 20 66 6f 72 20 6e 6f  num value for no
1c5b0 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68  nterminals which
1c5c0 20 64 6f 20 6e 6f 74 20 73 70 65 63 69 66 79 0a   do not specify.
1c5d0 20 20 2a 2a 20 61 20 64 61 74 61 74 79 70 65 20    ** a datatype 
1c5e0 75 73 69 6e 67 20 74 68 65 20 25 74 79 70 65 20  using the %type 
1c5f0 64 69 72 65 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  directive..  */.
1c600 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1c610 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
1c620 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  {.    struct sym
1c630 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e  bol *sp = lemp->
1c640 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
1c650 63 68 61 72 20 2a 63 70 3b 0a 20 20 20 20 69 66  char *cp;.    if
1c660 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e 65 72 72 73  ( sp==lemp->errs
1c670 79 6d 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e  ym ){.      sp->
1c680 64 74 6e 75 6d 20 3d 20 61 72 72 61 79 73 69 7a  dtnum = arraysiz
1c690 65 2b 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  e+1;.      conti
1c6a0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
1c6b0 66 28 20 73 70 2d 3e 74 79 70 65 21 3d 4e 4f 4e  f( sp->type!=NON
1c6c0 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 28 73 70 2d  TERMINAL || (sp-
1c6d0 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 26 26 20  >datatype==0 && 
1c6e0 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3d 3d 30  lemp->vartype==0
1c6f0 29 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64  ) ){.      sp->d
1c700 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  tnum = 0;.      
1c710 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1c720 20 20 20 20 63 70 20 3d 20 73 70 2d 3e 64 61 74      cp = sp->dat
1c730 61 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20 63  atype;.    if( c
1c740 70 3d 3d 30 20 29 20 63 70 20 3d 20 6c 65 6d 70  p==0 ) cp = lemp
1c750 2d 3e 76 61 72 74 79 70 65 3b 0a 20 20 20 20 6a  ->vartype;.    j
1c760 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
1c770 20 49 53 53 50 41 43 45 28 2a 63 70 29 20 29 20   ISSPACE(*cp) ) 
1c780 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28  cp++;.    while(
1c790 20 2a 63 70 20 29 20 73 74 64 64 74 5b 6a 2b 2b   *cp ) stddt[j++
1c7a0 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20 20 20 20 77  ] = *cp++;.    w
1c7b0 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 49 53 53  hile( j>0 && ISS
1c7c0 50 41 43 45 28 73 74 64 64 74 5b 6a 2d 31 5d 29  PACE(stddt[j-1])
1c7d0 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 73 74 64 64   ) j--;.    stdd
1c7e0 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66  t[j] = 0;.    if
1c7f0 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70  ( lemp->tokentyp
1c800 65 20 26 26 20 73 74 72 63 6d 70 28 73 74 64 64  e && strcmp(stdd
1c810 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79  t, lemp->tokenty
1c820 70 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pe)==0 ){.      
1c830 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20  sp->dtnum = 0;. 
1c840 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1c850 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20     }.    hash = 
1c860 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
1c870 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  stddt[j]; j++){.
1c880 20 20 20 20 20 20 68 61 73 68 20 3d 20 68 61 73        hash = has
1c890 68 2a 35 33 20 2b 20 73 74 64 64 74 5b 6a 5d 3b  h*53 + stddt[j];
1c8a0 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20  .    }.    hash 
1c8b0 3d 20 28 68 61 73 68 20 26 20 30 78 37 66 66 66  = (hash & 0x7fff
1c8c0 66 66 66 66 29 25 61 72 72 61 79 73 69 7a 65 3b  ffff)%arraysize;
1c8d0 0a 20 20 20 20 77 68 69 6c 65 28 20 74 79 70 65  .    while( type
1c8e0 73 5b 68 61 73 68 5d 20 29 7b 0a 20 20 20 20 20  s[hash] ){.     
1c8f0 20 69 66 28 20 73 74 72 63 6d 70 28 74 79 70 65   if( strcmp(type
1c900 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3d 3d  s[hash],stddt)==
1c910 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70 2d  0 ){.        sp-
1c920 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20  >dtnum = hash + 
1c930 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
1c940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c950 68 61 73 68 2b 2b 3b 0a 20 20 20 20 20 20 69 66  hash++;.      if
1c960 28 20 68 61 73 68 3e 3d 28 75 6e 73 69 67 6e 65  ( hash>=(unsigne
1c970 64 29 61 72 72 61 79 73 69 7a 65 20 29 20 68 61  d)arraysize ) ha
1c980 73 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  sh = 0;.    }.  
1c990 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68    if( types[hash
1c9a0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70  ]==0 ){.      sp
1c9b0 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b  ->dtnum = hash +
1c9c0 20 31 3b 0a 20 20 20 20 20 20 74 79 70 65 73 5b   1;.      types[
1c9d0 68 61 73 68 5d 20 3d 20 28 63 68 61 72 2a 29 6d  hash] = (char*)m
1c9e0 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
1c9f0 65 6e 28 73 74 64 64 74 29 2b 31 20 29 3b 0a 20  en(stddt)+1 );. 
1ca00 20 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 68       if( types[h
1ca10 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ash]==0 ){.     
1ca20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1ca30 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
1ca40 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65  .\n");.        e
1ca50 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a  xit(1);.      }.
1ca60 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63        lemon_strc
1ca70 70 79 28 74 79 70 65 73 5b 68 61 73 68 5d 2c 73  py(types[hash],s
1ca80 74 64 64 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tddt);.    }.  }
1ca90 0a 0a 20 20 2f 2a 20 50 72 69 6e 74 20 6f 75 74  ..  /* Print out
1caa0 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20   the definition 
1cab0 6f 66 20 59 59 54 4f 4b 45 4e 54 59 50 45 20 61  of YYTOKENTYPE a
1cac0 6e 64 20 59 59 4d 49 4e 4f 52 54 59 50 45 20 2a  nd YYMINORTYPE *
1cad0 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d  /.  name = lemp-
1cae0 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61  >name ? lemp->na
1caf0 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20  me : "Parse";.  
1cb00 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e  lineno = *plinen
1cb10 6f 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  o;.  if( mhflag 
1cb20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ){ fprintf(out,"
1cb30 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22  #if INTERFACE\n"
1cb40 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20  ); lineno++; }. 
1cb50 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1cb60 65 66 69 6e 65 20 25 73 54 4f 4b 45 4e 54 59 50  efine %sTOKENTYP
1cb70 45 20 25 73 5c 6e 22 2c 6e 61 6d 65 2c 0a 20 20  E %s\n",name,.  
1cb80 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70    lemp->tokentyp
1cb90 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70  e?lemp->tokentyp
1cba0 65 3a 22 76 6f 69 64 2a 22 29 3b 20 20 6c 69 6e  e:"void*");  lin
1cbb0 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66  eno++;.  if( mhf
1cbc0 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  lag ){ fprintf(o
1cbd0 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  ut,"#endif\n"); 
1cbe0 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70  lineno++; }.  fp
1cbf0 72 69 6e 74 66 28 6f 75 74 2c 22 74 79 70 65 64  rintf(out,"typed
1cc00 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e 22 29 3b 20  ef union {\n"); 
1cc10 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1cc20 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e 74 20 79  ntf(out,"  int y
1cc30 79 69 6e 69 74 3b 5c 6e 22 29 3b 20 6c 69 6e 65  yinit;\n"); line
1cc40 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1cc50 6f 75 74 2c 22 20 20 25 73 54 4f 4b 45 4e 54 59  out,"  %sTOKENTY
1cc60 50 45 20 79 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29  PE yy0;\n",name)
1cc70 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
1cc80 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69  r(i=0; i<arraysi
1cc90 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ze; i++){.    if
1cca0 28 20 74 79 70 65 73 5b 69 5d 3d 3d 30 20 29 20  ( types[i]==0 ) 
1ccb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70  continue;.    fp
1ccc0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 20  rintf(out,"  %s 
1ccd0 79 79 25 64 3b 5c 6e 22 2c 74 79 70 65 73 5b 69  yy%d;\n",types[i
1cce0 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ],i+1); lineno++
1ccf0 3b 0a 20 20 20 20 66 72 65 65 28 74 79 70 65 73  ;.    free(types
1cd00 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [i]);.  }.  if( 
1cd10 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73  lemp->errsym->us
1cd20 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69  eCnt ){.    fpri
1cd30 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e 74 20 79  ntf(out,"  int y
1cd40 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72  y%d;\n",lemp->er
1cd50 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69  rsym->dtnum); li
1cd60 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 72  neno++;.  }.  fr
1cd70 65 65 28 73 74 64 64 74 29 3b 0a 20 20 66 72 65  ee(stddt);.  fre
1cd80 65 28 74 79 70 65 73 29 3b 0a 20 20 66 70 72 69  e(types);.  fpri
1cd90 6e 74 66 28 6f 75 74 2c 22 7d 20 59 59 4d 49 4e  ntf(out,"} YYMIN
1cda0 4f 52 54 59 50 45 3b 5c 6e 22 29 3b 20 6c 69 6e  ORTYPE;\n"); lin
1cdb0 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c 69 6e 65 6e  eno++;.  *plinen
1cdc0 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 7d 0a 0a 2f  o = lineno;.}../
1cdd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1cde0 6e 61 6d 65 20 6f 66 20 61 20 43 20 64 61 74 61  name of a C data
1cdf0 74 79 70 65 20 61 62 6c 65 20 74 6f 20 72 65 70  type able to rep
1ce00 72 65 73 65 6e 74 20 76 61 6c 75 65 73 20 62 65  resent values be
1ce10 74 77 65 65 6e 0a 2a 2a 20 6c 77 72 20 61 6e 64  tween.** lwr and
1ce20 20 75 70 72 2c 20 69 6e 63 6c 75 73 69 76 65 2e   upr, inclusive.
1ce30 20 20 49 66 20 70 6e 42 79 74 65 21 3d 4e 55 4c    If pnByte!=NUL
1ce40 4c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74  L then also writ
1ce50 65 20 74 68 65 20 73 69 7a 65 6f 66 0a 2a 2a 20  e the sizeof.** 
1ce60 66 6f 72 20 74 68 61 74 20 74 79 70 65 20 28 31  for that type (1
1ce70 2c 20 32 2c 20 6f 72 20 34 29 20 69 6e 74 6f 20  , 2, or 4) into 
1ce80 2a 70 6e 42 79 74 65 2e 0a 2a 2f 0a 73 74 61 74  *pnByte..*/.stat
1ce90 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d  ic const char *m
1cea0 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65  inimum_size_type
1ceb0 28 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75 70  (int lwr, int up
1cec0 72 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b  r, int *pnByte){
1ced0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1cee0 54 79 70 65 20 3d 20 22 69 6e 74 22 3b 0a 20 20  Type = "int";.  
1cef0 69 6e 74 20 6e 42 79 74 65 20 3d 20 34 3b 0a 20  int nByte = 4;. 
1cf00 20 69 66 28 20 6c 77 72 3e 3d 30 20 29 7b 0a 20   if( lwr>=0 ){. 
1cf10 20 20 20 69 66 28 20 75 70 72 3c 3d 32 35 35 20     if( upr<=255 
1cf20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
1cf30 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61 72 22   "unsigned char"
1cf40 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20  ;.      nByte = 
1cf50 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
1cf60 20 75 70 72 3c 36 35 35 33 35 20 29 7b 0a 20 20   upr<65535 ){.  
1cf70 20 20 20 20 7a 54 79 70 65 20 3d 20 22 75 6e 73      zType = "uns
1cf80 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 22  igned short int"
1cf90 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20  ;.      nByte = 
1cfa0 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
1cfb0 20 20 20 20 7a 54 79 70 65 20 3d 20 22 75 6e 73      zType = "uns
1cfc0 69 67 6e 65 64 20 69 6e 74 22 3b 0a 20 20 20 20  igned int";.    
1cfd0 20 20 6e 42 79 74 65 20 3d 20 34 3b 0a 20 20 20    nByte = 4;.   
1cfe0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c   }.  }else if( l
1cff0 77 72 3e 3d 2d 31 32 37 20 26 26 20 75 70 72 3c  wr>=-127 && upr<
1d000 3d 31 32 37 20 29 7b 0a 20 20 20 20 7a 54 79 70  =127 ){.    zTyp
1d010 65 20 3d 20 22 73 69 67 6e 65 64 20 63 68 61 72  e = "signed char
1d020 22 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 31  ";.    nByte = 1
1d030 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77  ;.  }else if( lw
1d040 72 3e 3d 2d 33 32 37 36 37 20 26 26 20 75 70 72  r>=-32767 && upr
1d050 3c 33 32 37 36 37 20 29 7b 0a 20 20 20 20 7a 54  <32767 ){.    zT
1d060 79 70 65 20 3d 20 22 73 68 6f 72 74 22 3b 0a 20  ype = "short";. 
1d070 20 20 20 6e 42 79 74 65 20 3d 20 32 3b 0a 20 20     nByte = 2;.  
1d080 7d 0a 20 20 69 66 28 20 70 6e 42 79 74 65 20 29  }.  if( pnByte )
1d090 20 2a 70 6e 42 79 74 65 20 3d 20 6e 42 79 74 65   *pnByte = nByte
1d0a0 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65  ;.  return zType
1d0b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  ;.}../*.** Each 
1d0c0 73 74 61 74 65 20 63 6f 6e 74 61 69 6e 73 20 61  state contains a
1d0d0 20 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 74 72   set of token tr
1d0e0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
1d0f0 73 65 74 20 6f 66 0a 2a 2a 20 6e 6f 6e 74 65 72  set of.** nonter
1d100 6d 69 6e 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  minal transactio
1d110 6e 73 2e 20 20 45 61 63 68 20 6f 66 20 74 68 65  ns.  Each of the
1d120 73 65 20 73 65 74 73 20 6d 61 6b 65 73 20 61 6e  se sets makes an
1d130 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20   instance.** of 
1d140 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1d150 72 75 63 74 75 72 65 2e 20 20 41 6e 20 61 72 72  ructure.  An arr
1d160 61 79 20 6f 66 20 74 68 65 73 65 20 73 74 72 75  ay of these stru
1d170 63 74 75 72 65 73 20 69 73 20 75 73 65 64 0a 2a  ctures is used.*
1d180 2a 20 74 6f 20 6f 72 64 65 72 20 74 68 65 20 63  * to order the c
1d190 72 65 61 74 69 6f 6e 20 6f 66 20 65 6e 74 72 69  reation of entri
1d1a0 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74  es in the yy_act
1d1b0 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a  ion[] table..*/.
1d1c0 73 74 72 75 63 74 20 61 78 73 65 74 20 7b 0a 20  struct axset {. 
1d1d0 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
1d1e0 74 70 3b 20 20 20 2f 2a 20 41 20 70 6f 69 6e 74  tp;   /* A point
1d1f0 65 72 20 74 6f 20 61 20 73 74 61 74 65 20 2a 2f  er to a state */
1d200 0a 20 20 69 6e 74 20 69 73 54 6b 6e 3b 20 20 20  .  int isTkn;   
1d210 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d220 74 6f 20 75 73 65 20 74 6f 6b 65 6e 73 2e 20 20  to use tokens.  
1d230 46 61 6c 73 65 20 66 6f 72 20 6e 6f 6e 2d 74 65  False for non-te
1d240 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e 74  rminals */.  int
1d250 20 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20   nAction;       
1d260 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
1d270 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
1d280 69 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20 20  iOrder;         
1d290 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6f 72 64   /* Original ord
1d2a0 65 72 20 6f 66 20 61 63 74 69 6f 6e 20 73 65 74  er of action set
1d2b0 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  s */.};../*.** C
1d2c0 6f 6d 70 61 72 65 20 74 6f 20 61 78 73 65 74 20  ompare to axset 
1d2d0 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 73  structures for s
1d2e0 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 0a  orting purposes.
1d2f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 78  */.static int ax
1d300 73 65 74 5f 63 6f 6d 70 61 72 65 28 63 6f 6e 73  set_compare(cons
1d310 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74  t void *a, const
1d320 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 73 74 72   void *b){.  str
1d330 75 63 74 20 61 78 73 65 74 20 2a 70 31 20 3d 20  uct axset *p1 = 
1d340 28 73 74 72 75 63 74 20 61 78 73 65 74 2a 29 61  (struct axset*)a
1d350 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74  ;.  struct axset
1d360 20 2a 70 32 20 3d 20 28 73 74 72 75 63 74 20 61   *p2 = (struct a
1d370 78 73 65 74 2a 29 62 3b 0a 20 20 69 6e 74 20 63  xset*)b;.  int c
1d380 3b 0a 20 20 63 20 3d 20 70 32 2d 3e 6e 41 63 74  ;.  c = p2->nAct
1d390 69 6f 6e 20 2d 20 70 31 2d 3e 6e 41 63 74 69 6f  ion - p1->nActio
1d3a0 6e 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b  n;.  if( c==0 ){
1d3b0 0a 20 20 20 20 63 20 3d 20 70 31 2d 3e 69 4f 72  .    c = p1->iOr
1d3c0 64 65 72 20 2d 20 70 32 2d 3e 69 4f 72 64 65 72  der - p2->iOrder
1d3d0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1d3e0 63 21 3d 30 20 7c 7c 20 70 31 3d 3d 70 32 20 29  c!=0 || p1==p2 )
1d3f0 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  ;.  return c;.}.
1d400 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 65 78  ./*.** Write tex
1d410 74 20 6f 6e 20 22 6f 75 74 22 20 74 68 61 74 20  t on "out" that 
1d420 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72 75  describes the ru
1d430 6c 65 20 22 72 70 22 2e 0a 2a 2f 0a 73 74 61 74  le "rp"..*/.stat
1d440 69 63 20 76 6f 69 64 20 77 72 69 74 65 52 75 6c  ic void writeRul
1d450 65 54 65 78 74 28 46 49 4c 45 20 2a 6f 75 74 2c  eText(FILE *out,
1d460 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
1d470 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 70  ){.  int j;.  fp
1d480 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 20 3a 3a  rintf(out,"%s ::
1d490 3d 22 2c 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d  =", rp->lhs->nam
1d4a0 65 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  e);.  for(j=0; j
1d4b0 3c 72 70 2d 3e 6e 72 68 73 3b 20 6a 2b 2b 29 7b  <rp->nrhs; j++){
1d4c0 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62  .    struct symb
1d4d0 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73  ol *sp = rp->rhs
1d4e0 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d  [j];.    if( sp-
1d4f0 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d  >type!=MULTITERM
1d500 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 70  INAL ){.      fp
1d510 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c  rintf(out," %s",
1d520 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
1d530 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1d540 20 6b 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   k;.      fprint
1d550 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73 70 2d  f(out," %s", sp-
1d560 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65  >subsym[0]->name
1d570 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31  );.      for(k=1
1d580 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; k<sp->nsubsym;
1d590 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   k++){.        f
1d5a0 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c 25 73 22  printf(out,"|%s"
1d5b0 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e  ,sp->subsym[k]->
1d5c0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  name);.      }. 
1d5d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20     }.  }.}.../* 
1d5e0 47 65 6e 65 72 61 74 65 20 43 20 73 6f 75 72 63  Generate C sourc
1d5f0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70  e code for the p
1d600 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65  arser */.void Re
1d610 70 6f 72 74 54 61 62 6c 65 28 0a 20 20 73 74 72  portTable(.  str
1d620 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
1d630 0a 20 20 69 6e 74 20 6d 68 66 6c 61 67 20 20 20  .  int mhflag   
1d640 20 20 2f 2a 20 4f 75 74 70 75 74 20 69 6e 20 6d    /* Output in m
1d650 61 6b 65 68 65 61 64 65 72 73 20 66 6f 72 6d 61  akeheaders forma
1d660 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  t if true */.){.
1d670 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e    FILE *out, *in
1d680 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49  ;.  char line[LI
1d690 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 20  NESIZE];.  int  
1d6a0 6c 69 6e 65 6e 6f 3b 0a 20 20 73 74 72 75 63 74  lineno;.  struct
1d6b0 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73   state *stp;.  s
1d6c0 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
1d6d0 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
1d6e0 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63  *rp;.  struct ac
1d6f0 74 74 61 62 20 2a 70 41 63 74 74 61 62 3b 0a 20  ttab *pActtab;. 
1d700 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 2c 20 73 7a   int i, j, n, sz
1d710 3b 0a 20 20 69 6e 74 20 73 7a 41 63 74 69 6f 6e  ;.  int szAction
1d720 54 79 70 65 3b 20 20 20 20 20 2f 2a 20 73 69 7a  Type;     /* siz
1d730 65 6f 66 28 59 59 41 43 54 49 4f 4e 54 59 50 45  eof(YYACTIONTYPE
1d740 29 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 6f 64  ) */.  int szCod
1d750 65 54 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20  eType;       /* 
1d760 73 69 7a 65 6f 66 28 59 59 43 4f 44 45 54 59 50  sizeof(YYCODETYP
1d770 45 29 20 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  E)   */.  const 
1d780 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e  char *name;.  in
1d790 74 20 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6d 78 54  t mnTknOfst, mxT
1d7a0 6b 6e 4f 66 73 74 3b 0a 20 20 69 6e 74 20 6d 6e  knOfst;.  int mn
1d7b0 4e 74 4f 66 73 74 2c 20 6d 78 4e 74 4f 66 73 74  NtOfst, mxNtOfst
1d7c0 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74  ;.  struct axset
1d7d0 20 2a 61 78 3b 0a 0a 20 20 69 6e 20 3d 20 74 70   *ax;..  in = tp
1d7e0 6c 74 5f 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a 20  lt_open(lemp);. 
1d7f0 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74   if( in==0 ) ret
1d800 75 72 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 69 6c  urn;.  out = fil
1d810 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 63 22  e_open(lemp,".c"
1d820 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75  ,"wb");.  if( ou
1d830 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f  t==0 ){.    fclo
1d840 73 65 28 69 6e 29 3b 0a 20 20 20 20 72 65 74 75  se(in);.    retu
1d850 72 6e 3b 0a 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f  rn;.  }.  lineno
1d860 20 3d 20 31 3b 0a 20 20 74 70 6c 74 5f 78 66 65   = 1;.  tplt_xfe
1d870 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1d880 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1d890 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
1d8a0 20 69 6e 63 6c 75 64 65 20 63 6f 64 65 2c 20 69   include code, i
1d8b0 66 20 61 6e 79 20 2a 2f 0a 20 20 74 70 6c 74 5f  f any */.  tplt_
1d8c0 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
1d8d0 65 6d 70 2d 3e 69 6e 63 6c 75 64 65 2c 26 6c 69  emp->include,&li
1d8e0 6e 65 6e 6f 29 3b 0a 20 20 69 66 28 20 6d 68 66  neno);.  if( mhf
1d8f0 6c 61 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20  lag ){.    char 
1d900 2a 69 6e 63 4e 61 6d 65 20 3d 20 66 69 6c 65 5f  *incName = file_
1d910 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 22  makename(lemp, "
1d920 2e 68 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  .h");.    fprint
1d930 66 28 6f 75 74 2c 22 23 69 6e 63 6c 75 64 65 20  f(out,"#include 
1d940 5c 22 25 73 5c 22 5c 6e 22 2c 20 69 6e 63 4e 61  \"%s\"\n", incNa
1d950 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
1d960 20 20 20 66 72 65 65 28 69 6e 63 4e 61 6d 65 29     free(incName)
1d970 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
1d980 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1d990 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1d9a0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 23 64 65   /* Generate #de
1d9b0 66 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f  fines for all to
1d9c0 6b 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68  kens */.  if( mh
1d9d0 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 6f 6e 73  flag ){.    cons
1d9e0 74 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a  t char *prefix;.
1d9f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1da00 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e  "#if INTERFACE\n
1da10 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1da20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65    if( lemp->toke
1da30 6e 70 72 65 66 69 78 20 29 20 70 72 65 66 69 78  nprefix ) prefix
1da40 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72   = lemp->tokenpr
1da50 65 66 69 78 3b 0a 20 20 20 20 65 6c 73 65 20 20  efix;.    else  
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da70 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20    prefix = "";. 
1da80 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65     for(i=1; i<le
1da90 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69  mp->nterminal; i
1daa0 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ++){.      fprin
1dab0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1dac0 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70  %s%-30s %2d\n",p
1dad0 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62  refix,lemp->symb
1dae0 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b  ols[i]->name,i);
1daf0 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  .      lineno++;
1db00 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
1db10 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e  tf(out,"#endif\n
1db20 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1db30 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
1db40 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1db50 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1db60 47 65 6e 65 72 61 74 65 20 74 68 65 20 64 65 66  Generate the def
1db70 69 6e 65 73 20 2a 2f 0a 20 20 66 70 72 69 6e 74  ines */.  fprint
1db80 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1db90 59 43 4f 44 45 54 59 50 45 20 25 73 5c 6e 22 2c  YCODETYPE %s\n",
1dba0 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a  .    minimum_siz
1dbb0 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e  e_type(0, lemp->
1dbc0 6e 73 79 6d 62 6f 6c 2b 31 2c 20 26 73 7a 43 6f  nsymbol+1, &szCo
1dbd0 64 65 54 79 70 65 29 29 3b 20 6c 69 6e 65 6e 6f  deType)); lineno
1dbe0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1dbf0 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 4f 43  t,"#define YYNOC
1dc00 4f 44 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e  ODE %d\n",lemp->
1dc10 6e 73 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e  nsymbol+1);  lin
1dc20 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1dc30 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1dc40 41 43 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22  ACTIONTYPE %s\n"
1dc50 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69  ,.    minimum_si
1dc60 7a 65 5f 74 79 70 65 28 30 2c 6c 65 6d 70 2d 3e  ze_type(0,lemp->
1dc70 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75  nstate+lemp->nru
1dc80 6c 65 2a 32 2b 35 2c 26 73 7a 41 63 74 69 6f 6e  le*2+5,&szAction
1dc90 54 79 70 65 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  Type)); lineno++
1dca0 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 77 69  ;.  if( lemp->wi
1dcb0 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20 66 70  ldcard ){.    fp
1dcc0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1dcd0 6e 65 20 59 59 57 49 4c 44 43 41 52 44 20 25 64  ne YYWILDCARD %d
1dce0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6c 65 6d 70  \n",.       lemp
1dcf0 2d 3e 77 69 6c 64 63 61 72 64 2d 3e 69 6e 64 65  ->wildcard->inde
1dd00 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  x); lineno++;.  
1dd10 7d 0a 20 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f  }.  print_stack_
1dd20 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26  union(out,lemp,&
1dd30 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a  lineno,mhflag);.
1dd40 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1dd50 23 69 66 6e 64 65 66 20 59 59 53 54 41 43 4b 44  #ifndef YYSTACKD
1dd60 45 50 54 48 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  EPTH\n"); lineno
1dd70 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ++;.  if( lemp->
1dd80 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20  stacksize ){.   
1dd90 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1dda0 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50  efine YYSTACKDEP
1ddb0 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73  TH %s\n",lemp->s
1ddc0 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65  tacksize);  line
1ddd0 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no++;.  }else{. 
1dde0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1ddf0 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44  #define YYSTACKD
1de00 45 50 54 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c  EPTH 100\n");  l
1de10 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66  ineno++;.  }.  f
1de20 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 65 6e  printf(out, "#en
1de30 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
1de40 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  +;.  if( mhflag 
1de50 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1de60 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
1de70 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
1de80 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65  .  }.  name = le
1de90 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d  mp->name ? lemp-
1dea0 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b  >name : "Parse";
1deb0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67  .  if( lemp->arg
1dec0 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d   && lemp->arg[0]
1ded0 20 29 7b 0a 20 20 20 20 69 20 3d 20 6c 65 6d 6f   ){.    i = lemo
1dee0 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72  nStrlen(lemp->ar
1def0 67 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  g);.    while( i
1df00 3e 3d 31 20 26 26 20 49 53 53 50 41 43 45 28 6c  >=1 && ISSPACE(l
1df10 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29  emp->arg[i-1]) )
1df20 20 69 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28   i--;.    while(
1df30 20 69 3e 3d 31 20 26 26 20 28 49 53 41 4c 4e 55   i>=1 && (ISALNU
1df40 4d 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d  M(lemp->arg[i-1]
1df50 29 20 7c 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69  ) || lemp->arg[i
1df60 2d 31 5d 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b  -1]=='_') ) i--;
1df70 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1df80 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1df90 53 44 45 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d  SDECL %s;\n",nam
1dfa0 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c  e,lemp->arg);  l
1dfb0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
1dfc0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1dfd0 65 20 25 73 41 52 47 5f 50 44 45 43 4c 20 2c 25  e %sARG_PDECL ,%
1dfe0 73 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e  s\n",name,lemp->
1dff0 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  arg);  lineno++;
1e000 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1e010 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1e020 46 45 54 43 48 20 25 73 20 3d 20 79 79 70 50 61  FETCH %s = yypPa
1e030 72 73 65 72 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20  rser->%s\n",.   
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
1e050 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65  me,lemp->arg,&le
1e060 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69  mp->arg[i]);  li
1e070 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1e080 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1e090 20 25 73 41 52 47 5f 53 54 4f 52 45 20 79 79 70   %sARG_STORE yyp
1e0a0 50 61 72 73 65 72 2d 3e 25 73 20 3d 20 25 73 5c  Parser->%s = %s\
1e0b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1e0c0 20 20 20 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d       name,&lemp-
1e0d0 3e 61 72 67 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61  >arg[i],&lemp->a
1e0e0 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b  rg[i]);  lineno+
1e0f0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1e100 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1e110 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c  fine %sARG_SDECL
1e120 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65  \n",name);  line
1e130 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1e140 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1e150 73 41 52 47 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61  sARG_PDECL\n",na
1e160 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  me);  lineno++;.
1e170 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1e180 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46  "#define %sARG_F
1e190 45 54 43 48 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c  ETCH\n",name); l
1e1a0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
1e1b0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1e1c0 65 20 25 73 41 52 47 5f 53 54 4f 52 45 5c 6e 22  e %sARG_STORE\n"
1e1d0 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ,name); lineno++
1e1e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c  ;.  }.  if( mhfl
1e1f0 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  ag ){.    fprint
1e200 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22  f(out,"#endif\n"
1e210 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1e220 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72  .  if( lemp->err
1e230 73 79 6d 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20  sym->useCnt ){. 
1e240 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1e250 23 64 65 66 69 6e 65 20 59 59 45 52 52 4f 52 53  #define YYERRORS
1e260 59 4d 42 4f 4c 20 25 64 5c 6e 22 2c 6c 65 6d 70  YMBOL %d\n",lemp
1e270 2d 3e 65 72 72 73 79 6d 2d 3e 69 6e 64 65 78 29  ->errsym->index)
1e280 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1e290 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1e2a0 66 69 6e 65 20 59 59 45 52 52 53 59 4d 44 54 20  fine YYERRSYMDT 
1e2b0 79 79 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72  yy%d\n",lemp->er
1e2c0 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69  rsym->dtnum); li
1e2d0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  neno++;.  }.  if
1e2e0 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c  ( lemp->has_fall
1e2f0 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 70 72 69  back ){.    fpri
1e300 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1e310 20 59 59 46 41 4c 4c 42 41 43 4b 20 31 5c 6e 22   YYFALLBACK 1\n"
1e320 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1e330 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
1e340 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
1e350 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 6f 75 74  , but do not out
1e360 70 75 74 20 69 74 20 79 65 74 2e 20 20 54 68 65  put it yet.  The
1e370 20 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 61 62   action.  ** tab
1e380 6c 65 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 75  le must be compu
1e390 74 65 64 20 62 65 66 6f 72 65 20 67 65 6e 65 72  ted before gener
1e3a0 61 74 69 6e 67 20 74 68 65 20 59 59 4e 53 54 41  ating the YYNSTA
1e3b0 54 45 20 6d 61 63 72 6f 20 62 65 63 61 75 73 65  TE macro because
1e3c0 0a 20 20 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f  .  ** we need to
1e3d0 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e 79 20 73   know how many s
1e3e0 74 61 74 65 73 20 63 61 6e 20 62 65 20 65 6c 69  tates can be eli
1e3f0 6d 69 6e 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  minated..  */.  
1e400 61 78 20 3d 20 28 73 74 72 75 63 74 20 61 78 73  ax = (struct axs
1e410 65 74 20 2a 29 20 63 61 6c 6c 6f 63 28 6c 65 6d  et *) calloc(lem
1e420 70 2d 3e 6e 78 73 74 61 74 65 2a 32 2c 20 73 69  p->nxstate*2, si
1e430 7a 65 6f 66 28 61 78 5b 30 5d 29 29 3b 0a 20 20  zeof(ax[0]));.  
1e440 69 66 28 20 61 78 3d 3d 30 20 29 7b 0a 20 20 20  if( ax==0 ){.   
1e450 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1e460 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e  "malloc failed\n
1e470 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
1e480 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1e490 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b  i<lemp->nxstate;
1e4a0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
1e4b0 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
1e4c0 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 73 74  ;.    ax[i*2].st
1e4d0 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78 5b  p = stp;.    ax[
1e4e0 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a  i*2].isTkn = 1;.
1e4f0 20 20 20 20 61 78 5b 69 2a 32 5d 2e 6e 41 63 74      ax[i*2].nAct
1e500 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41  ion = stp->nTknA
1e510 63 74 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31  ct;.    ax[i*2+1
1e520 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20  ].stp = stp;.   
1e530 20 61 78 5b 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e   ax[i*2+1].isTkn
1e540 20 3d 20 30 3b 0a 20 20 20 20 61 78 5b 69 2a 32   = 0;.    ax[i*2
1e550 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74  +1].nAction = st
1e560 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 7d 0a 20  p->nNtAct;.  }. 
1e570 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54   mxTknOfst = mnT
1e580 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a 20 20 6d 78  knOfst = 0;.  mx
1e590 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73  NtOfst = mnNtOfs
1e5a0 74 20 3d 20 30 3b 0a 20 20 2f 2a 20 49 6e 20 61  t = 0;.  /* In a
1e5b0 6e 20 65 66 66 6f 72 74 20 74 6f 20 6d 69 6e 69  n effort to mini
1e5c0 6d 69 7a 65 20 74 68 65 20 61 63 74 69 6f 6e 20  mize the action 
1e5d0 74 61 62 6c 65 20 73 69 7a 65 2c 20 75 73 65 20  table size, use 
1e5e0 74 68 65 20 68 65 75 72 69 73 74 69 63 0a 20 20  the heuristic.  
1e5f0 2a 2a 20 6f 66 20 70 6c 61 63 69 6e 67 20 74 68  ** of placing th
1e600 65 20 6c 61 72 67 65 73 74 20 61 63 74 69 6f 6e  e largest action
1e610 20 73 65 74 73 20 66 69 72 73 74 20 2a 2f 0a 20   sets first */. 
1e620 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1e630 2d 3e 6e 78 73 74 61 74 65 2a 32 3b 20 69 2b 2b  ->nxstate*2; i++
1e640 29 20 61 78 5b 69 5d 2e 69 4f 72 64 65 72 20 3d  ) ax[i].iOrder =
1e650 20 69 3b 0a 20 20 71 73 6f 72 74 28 61 78 2c 20   i;.  qsort(ax, 
1e660 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2a 32 2c  lemp->nxstate*2,
1e670 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 2c 20   sizeof(ax[0]), 
1e680 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 29 3b 0a  axset_compare);.
1e690 20 20 70 41 63 74 74 61 62 20 3d 20 61 63 74 74    pActtab = actt
1e6a0 61 62 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f  ab_alloc();.  fo
1e6b0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1e6c0 78 73 74 61 74 65 2a 32 20 26 26 20 61 78 5b 69  xstate*2 && ax[i
1e6d0 5d 2e 6e 41 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b  ].nAction>0; i++
1e6e0 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 61 78 5b  ){.    stp = ax[
1e6f0 69 5d 2e 73 74 70 3b 0a 20 20 20 20 69 66 28 20  i].stp;.    if( 
1e700 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20  ax[i].isTkn ){. 
1e710 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d       for(ap=stp-
1e720 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
1e730 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  next){.        i
1e740 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20  nt action;.     
1e750 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69     if( ap->sp->i
1e760 6e 64 65 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72  ndex>=lemp->nter
1e770 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65  minal ) continue
1e780 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e  ;.        action
1e790 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f   = compute_actio
1e7a0 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20  n(lemp, ap);.   
1e7b0 20 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c       if( action<
1e7c0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1e7d0 20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63 74        acttab_act
1e7e0 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70 2d  ion(pActtab, ap-
1e7f0 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69  >sp->index, acti
1e800 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  on);.      }.   
1e810 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74     stp->iTknOfst
1e820 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74   = acttab_insert
1e830 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20  (pActtab);.     
1e840 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66   if( stp->iTknOf
1e850 73 74 3c 6d 6e 54 6b 6e 4f 66 73 74 20 29 20 6d  st<mnTknOfst ) m
1e860 6e 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e  nTknOfst = stp->
1e870 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 20 20  iTknOfst;.      
1e880 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73  if( stp->iTknOfs
1e890 74 3e 6d 78 54 6b 6e 4f 66 73 74 20 29 20 6d 78  t>mxTknOfst ) mx
1e8a0 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69  TknOfst = stp->i
1e8b0 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 7d 65 6c  TknOfst;.    }el
1e8c0 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70  se{.      for(ap
1e8d0 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
1e8e0 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
1e8f0 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a      int action;.
1e900 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e          if( ap->
1e910 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e  sp->index<lemp->
1e920 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74  nterminal ) cont
1e930 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1e940 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d  ( ap->sp->index=
1e950 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29  =lemp->nsymbol )
1e960 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1e970 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70     action = comp
1e980 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c  ute_action(lemp,
1e990 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66   ap);.        if
1e9a0 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e  ( action<0 ) con
1e9b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
1e9c0 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63  cttab_action(pAc
1e9d0 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e  ttab, ap->sp->in
1e9e0 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20  dex, action);.  
1e9f0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d      }.      stp-
1ea00 3e 69 4e 74 4f 66 73 74 20 3d 20 61 63 74 74 61  >iNtOfst = actta
1ea10 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61 62  b_insert(pActtab
1ea20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  );.      if( stp
1ea30 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66  ->iNtOfst<mnNtOf
1ea40 73 74 20 29 20 6d 6e 4e 74 4f 66 73 74 20 3d 20  st ) mnNtOfst = 
1ea50 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20  stp->iNtOfst;.  
1ea60 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74      if( stp->iNt
1ea70 4f 66 73 74 3e 6d 78 4e 74 4f 66 73 74 20 29 20  Ofst>mxNtOfst ) 
1ea80 6d 78 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e  mxNtOfst = stp->
1ea90 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 23  iNtOfst;.    }.#
1eaa0 69 66 20 30 20 20 2f 2a 20 55 6e 63 6f 6d 6d 65  if 0  /* Uncomme
1eab0 6e 74 20 66 6f 72 20 61 20 74 72 61 63 65 20 6f  nt for a trace o
1eac0 66 20 68 6f 77 20 74 68 65 20 79 79 5f 61 63 74  f how the yy_act
1ead0 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 66 69 6c 6c  ion[] table fill
1eae0 73 20 6f 75 74 20 2a 2f 0a 20 20 20 20 7b 20 69  s out */.    { i
1eaf0 6e 74 20 6a 6a 2c 20 6e 6e 3b 0a 20 20 20 20 20  nt jj, nn;.     
1eb00 20 66 6f 72 28 6a 6a 3d 6e 6e 3d 30 3b 20 6a 6a   for(jj=nn=0; jj
1eb10 3c 70 41 63 74 74 61 62 2d 3e 6e 41 63 74 69 6f  <pActtab->nActio
1eb20 6e 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  n; jj++){.      
1eb30 20 20 69 66 28 20 70 41 63 74 74 61 62 2d 3e 61    if( pActtab->a
1eb40 41 63 74 69 6f 6e 5b 6a 6a 5d 2e 61 63 74 69 6f  Action[jj].actio
1eb50 6e 3c 30 20 29 20 6e 6e 2b 2b 3b 0a 20 20 20 20  n<0 ) nn++;.    
1eb60 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 66    }.      printf
1eb70 28 22 25 34 64 3a 20 53 74 61 74 65 20 25 33 64  ("%4d: State %3d
1eb80 20 25 73 20 6e 3a 20 25 32 64 20 73 69 7a 65 3a   %s n: %2d size:
1eb90 20 25 35 64 20 66 72 65 65 73 70 61 63 65 3a 20   %5d freespace: 
1eba0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
1ebb0 20 20 20 20 69 2c 20 73 74 70 2d 3e 73 74 61 74      i, stp->stat
1ebc0 65 6e 75 6d 2c 20 61 78 5b 69 5d 2e 69 73 54 6b  enum, ax[i].isTk
1ebd0 6e 20 3f 20 22 54 6f 6b 65 6e 22 20 3a 20 22 56  n ? "Token" : "V
1ebe0 61 72 20 20 22 2c 0a 20 20 20 20 20 20 20 20 20  ar  ",.         
1ebf0 20 20 20 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f      ax[i].nActio
1ec00 6e 2c 20 70 41 63 74 74 61 62 2d 3e 6e 41 63 74  n, pActtab->nAct
1ec10 69 6f 6e 2c 20 6e 6e 29 3b 0a 20 20 20 20 7d 0a  ion, nn);.    }.
1ec20 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72 65  #endif.  }.  fre
1ec30 65 28 61 78 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  e(ax);..  /* Fin
1ec40 69 73 68 20 72 65 6e 64 65 72 69 6e 67 20 74 68  ish rendering th
1ec50 65 20 63 6f 6e 73 74 61 6e 74 73 20 6e 6f 77 20  e constants now 
1ec60 74 68 61 74 20 74 68 65 20 61 63 74 69 6f 6e 20  that the action 
1ec70 74 61 62 6c 65 20 68 61 73 0a 20 20 2a 2a 20 62  table has.  ** b
1ec80 65 65 6e 20 63 6f 6d 70 75 74 65 64 20 2a 2f 0a  een computed */.
1ec90 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1eca0 64 65 66 69 6e 65 20 59 59 4e 53 54 41 54 45 20  define YYNSTATE 
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
1ecc0 22 2c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 29  ",lemp->nxstate)
1ecd0 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ;  lineno++;.  f
1ece0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1ecf0 69 6e 65 20 59 59 4e 52 55 4c 45 20 20 20 20 20  ine YYNRULE     
1ed00 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 6c           %d\n",l
1ed10 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69  emp->nrule);  li
1ed20 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1ed30 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1ed40 59 5f 4d 41 58 5f 53 48 49 46 54 20 20 20 20 20  Y_MAX_SHIFT     
1ed50 20 20 20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e      %d\n",lemp->
1ed60 6e 78 73 74 61 74 65 2d 31 29 3b 20 6c 69 6e 65  nxstate-1); line
1ed70 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1ed80 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f  out,"#define YY_
1ed90 4d 49 4e 5f 53 48 49 46 54 52 45 44 55 43 45 20  MIN_SHIFTREDUCE 
1eda0 20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73    %d\n",lemp->ns
1edb0 74 61 74 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  tate); lineno++;
1edc0 0a 20 20 69 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74  .  i = lemp->nst
1edd0 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  ate + lemp->nrul
1ede0 65 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  e;.  fprintf(out
1edf0 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 41 58  ,"#define YY_MAX
1ee00 5f 53 48 49 46 54 52 45 44 55 43 45 20 20 20 25  _SHIFTREDUCE   %
1ee10 64 5c 6e 22 2c 20 69 2d 31 29 3b 20 6c 69 6e 65  d\n", i-1); line
1ee20 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1ee30 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f  out,"#define YY_
1ee40 4d 49 4e 5f 52 45 44 55 43 45 20 20 20 20 20 20  MIN_REDUCE      
1ee50 20 20 25 64 5c 6e 22 2c 20 69 29 3b 20 6c 69 6e    %d\n", i); lin
1ee60 65 6e 6f 2b 2b 3b 0a 20 20 69 20 3d 20 6c 65 6d  eno++;.  i = lem
1ee70 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70  p->nstate + lemp
1ee80 2d 3e 6e 72 75 6c 65 2a 32 3b 0a 20 20 66 70 72  ->nrule*2;.  fpr
1ee90 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1eea0 65 20 59 59 5f 4d 41 58 5f 52 45 44 55 43 45 20  e YY_MAX_REDUCE 
1eeb0 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 2d         %d\n", i-
1eec0 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  1); lineno++;.  
1eed0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1eee0 66 69 6e 65 20 59 59 5f 45 52 52 4f 52 5f 41 43  fine YY_ERROR_AC
1eef0 54 49 4f 4e 20 20 20 20 20 20 25 64 5c 6e 22 2c  TION      %d\n",
1ef00 20 69 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20   i); lineno++;. 
1ef10 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1ef20 65 66 69 6e 65 20 59 59 5f 41 43 43 45 50 54 5f  efine YY_ACCEPT_
1ef30 41 43 54 49 4f 4e 20 20 20 20 20 25 64 5c 6e 22  ACTION     %d\n"
1ef40 2c 20 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  , i+1); lineno++
1ef50 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1ef60 22 23 64 65 66 69 6e 65 20 59 59 5f 4e 4f 5f 41  "#define YY_NO_A
1ef70 43 54 49 4f 4e 20 20 20 20 20 20 20 20 20 25 64  CTION         %d
1ef80 5c 6e 22 2c 20 69 2b 32 29 3b 20 6c 69 6e 65 6e  \n", i+2); linen
1ef90 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  o++;.  tplt_xfer
1efa0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1efb0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1efc0 2f 2a 20 4e 6f 77 20 6f 75 74 70 75 74 20 74 68  /* Now output th
1efd0 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 61  e action table a
1efe0 6e 64 20 69 74 73 20 61 73 73 6f 63 69 61 74 65  nd its associate
1eff0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 79 79  s:.  **.  **  yy
1f000 5f 61 63 74 69 6f 6e 5b 5d 20 20 20 20 20 20 20  _action[]       
1f010 20 41 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   A single table 
1f020 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 61  containing all a
1f030 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79 79  ctions..  **  yy
1f040 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 20 20 20  _lookahead[]    
1f050 20 41 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e   A table contain
1f060 69 6e 67 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61  ing the lookahea
1f070 64 20 66 6f 72 20 65 61 63 68 20 65 6e 74 72 79  d for each entry
1f080 20 69 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   in.  **        
1f090 20 20 20 20 20 20 20 20 20 20 20 20 20 79 79 5f               yy_
1f0a0 61 63 74 69 6f 6e 2e 20 20 55 73 65 64 20 74 6f  action.  Used to
1f0b0 20 64 65 74 65 63 74 20 68 61 73 68 20 63 6f 6c   detect hash col
1f0c0 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79  lisions..  **  y
1f0d0 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 20  y_shift_ofst[]  
1f0e0 20 20 46 6f 72 20 65 61 63 68 20 73 74 61 74 65    For each state
1f0f0 2c 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74  , the offset int
1f100 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a  o yy_action for.
1f110 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1f120 20 20 20 20 20 20 20 20 20 73 68 69 66 74 69 6e           shiftin
1f130 67 20 74 65 72 6d 69 6e 61 6c 73 2e 0a 20 20 2a  g terminals..  *
1f140 2a 20 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73  *  yy_reduce_ofs
1f150 74 5b 5d 20 20 20 46 6f 72 20 65 61 63 68 20 73  t[]   For each s
1f160 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74  tate, the offset
1f170 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20   into yy_action 
1f180 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  for.  **        
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 69               shi
1f1a0 66 74 69 6e 67 20 6e 6f 6e 2d 74 65 72 6d 69 6e  fting non-termin
1f1b0 61 6c 73 20 61 66 74 65 72 20 61 20 72 65 64 75  als after a redu
1f1c0 63 65 2e 0a 20 20 2a 2a 20 20 79 79 5f 64 65 66  ce..  **  yy_def
1f1d0 61 75 6c 74 5b 5d 20 20 20 20 20 20 20 44 65 66  ault[]       Def
1f1e0 61 75 6c 74 20 61 63 74 69 6f 6e 20 66 6f 72 20  ault action for 
1f1f0 65 61 63 68 20 73 74 61 74 65 2e 0a 20 20 2a 2f  each state..  */
1f200 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
1f210 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c  e yy_action tabl
1f220 65 20 2a 2f 0a 20 20 6c 65 6d 70 2d 3e 6e 61 63  e */.  lemp->nac
1f230 74 69 6f 6e 74 61 62 20 3d 20 6e 20 3d 20 61 63  tiontab = n = ac
1f240 74 74 61 62 5f 73 69 7a 65 28 70 41 63 74 74 61  ttab_size(pActta
1f250 62 29 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c  b);.  lemp->tabl
1f260 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 41 63 74  esize += n*szAct
1f270 69 6f 6e 54 79 70 65 3b 0a 20 20 66 70 72 69 6e  ionType;.  fprin
1f280 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1f290 59 59 5f 41 43 54 54 41 42 5f 43 4f 55 4e 54 20  YY_ACTTAB_COUNT 
1f2a0 28 25 64 29 5c 6e 22 2c 20 6e 29 3b 20 6c 69 6e  (%d)\n", n); lin
1f2b0 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1f2c0 28 6f 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e  (out,"static con
1f2d0 73 74 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20  st YYACTIONTYPE 
1f2e0 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c  yy_action[] = {\
1f2f0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1f300 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
1f310 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61   i++){.    int a
1f320 63 74 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79  ction = acttab_y
1f330 79 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c  yaction(pActtab,
1f340 20 69 29 3b 0a 20 20 20 20 69 66 28 20 61 63 74   i);.    if( act
1f350 69 6f 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d  ion<0 ) action =
1f360 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20   lemp->nstate + 
1f370 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b  lemp->nrule + 2;
1f380 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20  .    if( j==0 ) 
1f390 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
1f3a0 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20   %5d */ ", i);. 
1f3b0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1f3c0 22 20 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29  " %4d,", action)
1f3d0 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c  ;.    if( j==9 |
1f3e0 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20  | i==n-1 ){.    
1f3f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1f400 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1f410 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
1f420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b   }else{.      j+
1f430 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  +;.    }.  }.  f
1f440 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c  printf(out, "};\
1f450 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a  n"); lineno++;..
1f460 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
1f470 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62  yy_lookahead tab
1f480 6c 65 20 2a 2f 0a 20 20 6c 65 6d 70 2d 3e 74 61  le */.  lemp->ta
1f490 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 43  blesize += n*szC
1f4a0 6f 64 65 54 79 70 65 3b 0a 20 20 66 70 72 69 6e  odeType;.  fprin
1f4b0 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20 63  tf(out,"static c
1f4c0 6f 6e 73 74 20 59 59 43 4f 44 45 54 59 50 45 20  onst YYCODETYPE 
1f4d0 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 3d  yy_lookahead[] =
1f4e0 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   {\n"); lineno++
1f4f0 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
1f500 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  <n; i++){.    in
1f510 74 20 6c 61 20 3d 20 61 63 74 74 61 62 5f 79 79  t la = acttab_yy
1f520 6c 6f 6f 6b 61 68 65 61 64 28 70 41 63 74 74 61  lookahead(pActta
1f530 62 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 6c  b, i);.    if( l
1f540 61 3c 30 20 29 20 6c 61 20 3d 20 6c 65 6d 70 2d  a<0 ) la = lemp-
1f550 3e 6e 73 79 6d 62 6f 6c 3b 0a 20 20 20 20 69 66  >nsymbol;.    if
1f560 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66  ( j==0 ) fprintf
1f570 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f  (out," /* %5d */
1f580 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69   ", i);.    fpri
1f590 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22  ntf(out, " %4d,"
1f5a0 2c 20 6c 61 29 3b 0a 20 20 20 20 69 66 28 20 6a  , la);.    if( j
1f5b0 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b  ==9 || i==n-1 ){
1f5c0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1f5d0 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ut, "\n"); linen
1f5e0 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  o++;.      j = 0
1f5f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1f600 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
1f610 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1f620 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   "};\n"); lineno
1f630 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  ++;..  /* Output
1f640 20 74 68 65 20 79 79 5f 73 68 69 66 74 5f 6f 66   the yy_shift_of
1f650 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20  st[] table */.  
1f660 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
1f670 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 55  efine YY_SHIFT_U
1f680 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c  SE_DFLT (%d)\n",
1f690 20 6d 6e 54 6b 6e 4f 66 73 74 2d 31 29 3b 20 6c   mnTknOfst-1); l
1f6a0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c  ineno++;.  n = l
1f6b0 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 0a 20 20  emp->nxstate;.  
1f6c0 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65  while( n>0 && le
1f6d0 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d  mp->sorted[n-1]-
1f6e0 3e 69 54 6b 6e 4f 66 73 74 3d 3d 4e 4f 5f 4f 46  >iTknOfst==NO_OF
1f6f0 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70  FSET ) n--;.  fp
1f700 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
1f710 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 43 4f 55  ine YY_SHIFT_COU
1f720 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29  NT (%d)\n", n-1)
1f730 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1f740 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
1f750 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 49 4e  ine YY_SHIFT_MIN
1f760 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b     (%d)\n", mnTk
1f770 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  nOfst); lineno++
1f780 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1f790 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49   "#define YY_SHI
1f7a0 46 54 5f 4d 41 58 20 20 20 28 25 64 29 5c 6e 22  FT_MAX   (%d)\n"
1f7b0 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 3b 20 6c 69  , mxTknOfst); li
1f7c0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1f7d0 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63  f(out, "static c
1f7e0 6f 6e 73 74 20 25 73 20 79 79 5f 73 68 69 66 74  onst %s yy_shift
1f7f0 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20  _ofst[] = {\n", 
1f800 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d  .          minim
1f810 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 54  um_size_type(mnT
1f820 6b 6e 4f 66 73 74 2d 31 2c 20 6d 78 54 6b 6e 4f  knOfst-1, mxTknO
1f830 66 73 74 2c 20 26 73 7a 29 29 3b 20 6c 69 6e 65  fst, &sz)); line
1f840 6e 6f 2b 2b 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61  no++;.  lemp->ta
1f850 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 3b  blesize += n*sz;
1f860 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
1f870 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
1f880 20 6f 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d   ofst;.    stp =
1f890 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
1f8a0 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70  ;.    ofst = stp
1f8b0 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20  ->iTknOfst;.    
1f8c0 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46  if( ofst==NO_OFF
1f8d0 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6d 6e 54  SET ) ofst = mnT
1f8e0 6b 6e 4f 66 73 74 20 2d 20 31 3b 0a 20 20 20 20  knOfst - 1;.    
1f8f0 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e  if( j==0 ) fprin
1f900 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20  tf(out," /* %5d 
1f910 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70  */ ", i);.    fp
1f920 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64  rintf(out, " %4d
1f930 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ,", ofst);.    i
1f940 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d  f( j==9 || i==n-
1f950 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  1 ){.      fprin
1f960 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c  tf(out, "\n"); l
1f970 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a  ineno++;.      j
1f980 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1f990 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
1f9a0 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  }.  }.  fprintf(
1f9b0 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69  out, "};\n"); li
1f9c0 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75  neno++;..  /* Ou
1f9d0 74 70 75 74 20 74 68 65 20 79 79 5f 72 65 64 75  tput the yy_redu
1f9e0 63 65 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20  ce_ofst[] table 
1f9f0 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
1fa00 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45  , "#define YY_RE
1fa10 44 55 43 45 5f 55 53 45 5f 44 46 4c 54 20 28 25  DUCE_USE_DFLT (%
1fa20 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74 2d  d)\n", mnNtOfst-
1fa30 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  1); lineno++;.  
1fa40 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  n = lemp->nxstat
1fa50 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  e;.  while( n>0 
1fa60 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  && lemp->sorted[
1fa70 6e 2d 31 5d 2d 3e 69 4e 74 4f 66 73 74 3d 3d 4e  n-1]->iNtOfst==N
1fa80 4f 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a  O_OFFSET ) n--;.
1fa90 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1faa0 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43  #define YY_REDUC
1fab0 45 5f 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c  E_COUNT (%d)\n",
1fac0 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b   n-1); lineno++;
1fad0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1fae0 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55  "#define YY_REDU
1faf0 43 45 5f 4d 49 4e 20 20 20 28 25 64 29 5c 6e 22  CE_MIN   (%d)\n"
1fb00 2c 20 6d 6e 4e 74 4f 66 73 74 29 3b 20 6c 69 6e  , mnNtOfst); lin
1fb10 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1fb20 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
1fb30 59 5f 52 45 44 55 43 45 5f 4d 41 58 20 20 20 28  Y_REDUCE_MAX   (
1fb40 25 64 29 5c 6e 22 2c 20 6d 78 4e 74 4f 66 73 74  %d)\n", mxNtOfst
1fb50 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1fb60 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61  printf(out, "sta
1fb70 74 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f  tic const %s yy_
1fb80 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 3d 20  reduce_ofst[] = 
1fb90 7b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  {\n", .         
1fba0 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79   minimum_size_ty
1fbb0 70 65 28 6d 6e 4e 74 4f 66 73 74 2d 31 2c 20 6d  pe(mnNtOfst-1, m
1fbc0 78 4e 74 4f 66 73 74 2c 20 26 73 7a 29 29 3b 20  xNtOfst, &sz)); 
1fbd0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6c 65 6d 70  lineno++;.  lemp
1fbe0 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e  ->tablesize += n
1fbf0 2a 73 7a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  *sz;.  for(i=j=0
1fc00 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1fc10 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73   int ofst;.    s
1fc20 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
1fc30 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d  d[i];.    ofst =
1fc40 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20   stp->iNtOfst;. 
1fc50 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f     if( ofst==NO_
1fc60 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d 20  OFFSET ) ofst = 
1fc70 6d 6e 4e 74 4f 66 73 74 20 2d 20 31 3b 0a 20 20  mnNtOfst - 1;.  
1fc80 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
1fc90 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
1fca0 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
1fcb0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
1fcc0 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20  4d,", ofst);.   
1fcd0 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
1fce0 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
1fcf0 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
1fd00 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
1fd10 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
1fd20 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
1fd30 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
1fd40 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
1fd50 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20  lineno++;..  /* 
1fd60 4f 75 74 70 75 74 20 74 68 65 20 64 65 66 61 75  Output the defau
1fd70 6c 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  lt action table 
1fd80 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
1fd90 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20  , "static const 
1fda0 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f  YYACTIONTYPE yy_
1fdb0 64 65 66 61 75 6c 74 5b 5d 20 3d 20 7b 5c 6e 22  default[] = {\n"
1fdc0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e  ); lineno++;.  n
1fdd0 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65   = lemp->nxstate
1fde0 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73  ;.  lemp->tables
1fdf0 69 7a 65 20 2b 3d 20 6e 2a 73 7a 41 63 74 69 6f  ize += n*szActio
1fe00 6e 54 79 70 65 3b 0a 20 20 66 6f 72 28 69 3d 6a  nType;.  for(i=j
1fe10 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
1fe20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
1fe30 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 69 66  orted[i];.    if
1fe40 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66  ( j==0 ) fprintf
1fe50 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f  (out," /* %5d */
1fe60 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69   ", i);.    fpri
1fe70 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22  ntf(out, " %4d,"
1fe80 2c 20 73 74 70 2d 3e 69 44 66 6c 74 52 65 64 75  , stp->iDfltRedu
1fe90 63 65 2b 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b  ce+lemp->nstate+
1fea0 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 0a 20 20  lemp->nrule);.  
1feb0 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d    if( j==9 || i=
1fec0 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70  =n-1 ){.      fp
1fed0 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
1fee0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1fef0 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c    j = 0;.    }el
1ff00 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  se{.      j++;. 
1ff10 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e     }.  }.  fprin
1ff20 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b  tf(out, "};\n");
1ff30 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c   lineno++;.  tpl
1ff40 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1ff50 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1ff60 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1ff70 65 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 66  e the table of f
1ff80 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a  allback tokens..
1ff90 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d    */.  if( lemp-
1ffa0 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b  >has_fallback ){
1ffb0 0a 20 20 20 20 69 6e 74 20 6d 78 20 3d 20 6c 65  .    int mx = le
1ffc0 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 2d 20  mp->nterminal - 
1ffd0 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6d 78  1;.    while( mx
1ffe0 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62  >0 && lemp->symb
1fff0 6f 6c 73 5b 6d 78 5d 2d 3e 66 61 6c 6c 62 61 63  ols[mx]->fallbac
20000 6b 3d 3d 30 20 29 7b 20 6d 78 2d 2d 3b 20 7d 0a  k==0 ){ mx--; }.
20010 20 20 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73      lemp->tables
20020 69 7a 65 20 2b 3d 20 28 6d 78 2b 31 29 2a 73 7a  ize += (mx+1)*sz
20030 43 6f 64 65 54 79 70 65 3b 0a 20 20 20 20 66 6f  CodeType;.    fo
20040 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 3b 20 69 2b  r(i=0; i<=mx; i+
20050 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
20060 20 73 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d   symbol *p = lem
20070 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
20080 20 20 20 20 20 69 66 28 20 70 2d 3e 66 61 6c 6c       if( p->fall
20090 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  back==0 ){.     
200a0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
200b0 22 20 20 20 20 30 2c 20 20 2f 2a 20 25 31 30 73  "    0,  /* %10s
200c0 20 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e   => nothing */\n
200d0 22 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ", p->name);.   
200e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
200f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
20100 20 20 25 33 64 2c 20 20 2f 2a 20 25 31 30 73 20    %3d,  /* %10s 
20110 3d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e  => %s */\n", p->
20120 66 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65 78 2c  fallback->index,
20130 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 61  .          p->na
20140 6d 65 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d  me, p->fallback-
20150 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  >name);.      }.
20160 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a        lineno++;.
20170 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74      }.  }.  tplt
20180 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
20190 2c 20 69 6e 2c 20 6f 75 74 2c 20 26 6c 69 6e 65  , in, out, &line
201a0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
201b0 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74  ate a table cont
201c0 61 69 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f  aining the symbo
201d0 6c 69 63 20 6e 61 6d 65 20 6f 66 20 65 76 65 72  lic name of ever
201e0 79 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20  y symbol.  */.  
201f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
20200 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
20210 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74      lemon_sprint
20220 66 28 6c 69 6e 65 2c 22 5c 22 25 73 5c 22 2c 22  f(line,"\"%s\","
20230 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
20240 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 70  ]->name);.    fp
20250 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 2d 31  rintf(out,"  %-1
20260 35 73 22 2c 6c 69 6e 65 29 3b 0a 20 20 20 20 69  5s",line);.    i
20270 66 28 20 28 69 26 33 29 3d 3d 33 20 29 7b 20 66  f( (i&3)==3 ){ f
20280 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29  printf(out,"\n")
20290 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20  ; lineno++; }.  
202a0 7d 0a 20 20 69 66 28 20 28 69 26 33 29 21 3d 30  }.  if( (i&3)!=0
202b0 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   ){ fprintf(out,
202c0 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
202d0 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
202e0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
202f0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
20300 20 47 65 6e 65 72 61 74 65 20 61 20 74 61 62 6c   Generate a tabl
20310 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74  e containing a t
20320 65 78 74 20 73 74 72 69 6e 67 20 74 68 61 74 20  ext string that 
20330 64 65 73 63 72 69 62 65 73 20 65 76 65 72 79 0a  describes every.
20340 20 20 2a 2a 20 72 75 6c 65 20 69 6e 20 74 68 65    ** rule in the
20350 20 72 75 6c 65 20 73 65 74 20 6f 66 20 74 68 65   rule set of the
20360 20 67 72 61 6d 6d 61 72 2e 20 20 54 68 69 73 20   grammar.  This 
20370 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
20380 73 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 72  sed.  ** when tr
20390 61 63 69 6e 67 20 52 45 44 55 43 45 20 61 63 74  acing REDUCE act
203a0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
203b0 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d 3e 72  (i=0, rp=lemp->r
203c0 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
203d0 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  next, i++){.    
203e0 61 73 73 65 72 74 28 20 72 70 2d 3e 69 6e 64 65  assert( rp->inde
203f0 78 3d 3d 69 20 29 3b 0a 20 20 20 20 66 70 72 69  x==i );.    fpri
20400 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 33 64  ntf(out," /* %3d
20410 20 2a 2f 20 5c 22 22 2c 20 69 29 3b 0a 20 20 20   */ \"", i);.   
20420 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f   writeRuleText(o
20430 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72  ut, rp);.    fpr
20440 69 6e 74 66 28 6f 75 74 2c 22 5c 22 2c 5c 6e 22  intf(out,"\",\n"
20450 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
20460 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
20470 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
20480 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
20490 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
204a0 63 68 20 65 78 65 63 75 74 65 73 20 65 76 65 72  ch executes ever
204b0 79 20 74 69 6d 65 20 61 20 73 79 6d 62 6f 6c 20  y time a symbol 
204c0 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d 0a 20  is popped from. 
204d0 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 20 77 68   ** the stack wh
204e0 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 65  ile processing e
204f0 72 72 6f 72 73 20 6f 72 20 77 68 69 6c 65 20 64  rrors or while d
20500 65 73 74 72 6f 79 69 6e 67 20 74 68 65 20 70 61  estroying the pa
20510 72 73 65 72 2e 20 0a 20 20 2a 2a 20 28 49 6e 20  rser. .  ** (In 
20520 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 67 65 6e  other words, gen
20530 65 72 61 74 65 20 74 68 65 20 25 64 65 73 74 72  erate the %destr
20540 75 63 74 6f 72 20 61 63 74 69 6f 6e 73 29 0a 20  uctor actions). 
20550 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
20560 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a 20 20 20  tokendest ){.   
20570 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20   int once = 1;. 
20580 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
20590 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
205a0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
205b0 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
205c0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
205d0 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c       if( sp==0 |
205e0 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54 45 52 4d  | sp->type!=TERM
205f0 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  INAL ) continue;
20600 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20  .      if( once 
20610 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
20620 74 66 28 6f 75 74 2c 20 22 20 20 20 20 20 20 2f  tf(out, "      /
20630 2a 20 54 45 52 4d 49 4e 41 4c 20 44 65 73 74 72  * TERMINAL Destr
20640 75 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20 6c 69  uctor */\n"); li
20650 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
20660 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  once = 0;.      
20670 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
20680 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64  out,"    case %d
20690 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73  : /* %s */\n", s
206a0 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61  p->index, sp->na
206b0 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
206c0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
206d0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
206e0 6c 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  l && lemp->symbo
206f0 6c 73 5b 69 5d 2d 3e 74 79 70 65 21 3d 54 45 52  ls[i]->type!=TER
20700 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20 20  MINAL; i++);.   
20710 20 69 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79   if( i<lemp->nsy
20720 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 65 6d  mbol ){.      em
20730 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
20740 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d  de(out,lemp->sym
20750 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69  bols[i],lemp,&li
20760 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70 72  neno);.      fpr
20770 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
20780 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
20790 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  no++;.    }.  }.
207a0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64    if( lemp->vard
207b0 65 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  est ){.    struc
207c0 74 20 73 79 6d 62 6f 6c 20 2a 64 66 6c 74 5f 73  t symbol *dflt_s
207d0 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6f  p = 0;.    int o
207e0 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  nce = 1;.    for
207f0 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
20800 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
20810 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
20820 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d   *sp = lemp->sym
20830 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69  bols[i];.      i
20840 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e  f( sp==0 || sp->
20850 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c  type==TERMINAL |
20860 7c 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  |.          sp->
20870 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73 70 2d 3e  index<=0 || sp->
20880 64 65 73 74 72 75 63 74 6f 72 21 3d 30 20 29 20  destructor!=0 ) 
20890 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
208a0 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20  if( once ){.    
208b0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
208c0 20 22 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75   "      /* Defau
208d0 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49 4e 41 4c 20  lt NON-TERMINAL 
208e0 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22  Destructor */\n"
208f0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
20900 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
20910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
20920 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61  intf(out,"    ca
20930 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c  se %d: /* %s */\
20940 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73  n", sp->index, s
20950 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  p->name); lineno
20960 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f 73  ++;.      dflt_s
20970 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20 20  p = sp;.    }.  
20980 20 20 69 66 28 20 64 66 6c 74 5f 73 70 21 3d 30    if( dflt_sp!=0
20990 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64   ){.      emit_d
209a0 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f  estructor_code(o
209b0 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70 2c  ut,dflt_sp,lemp,
209c0 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 7d 0a  &lineno);.    }.
209d0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
209e0 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22  "      break;\n"
209f0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
20a00 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
20a10 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
20a20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79  ){.    struct sy
20a30 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
20a40 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
20a50 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70   if( sp==0 || sp
20a60 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
20a70 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74   || sp->destruct
20a80 6f 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  or==0 ) continue
20a90 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
20aa0 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20  t,"    case %d: 
20ab0 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d  /* %s */\n", sp-
20ac0 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65  >index, sp->name
20ad0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
20ae0 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 64 75 70    /* Combine dup
20af0 6c 69 63 61 74 65 20 64 65 73 74 72 75 63 74 6f  licate destructo
20b00 72 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  rs into a single
20b10 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 66 6f 72   case */.    for
20b20 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65 6d 70 2d 3e  (j=i+1; j<lemp->
20b30 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nsymbol; j++){. 
20b40 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
20b50 6f 6c 20 2a 73 70 32 20 3d 20 6c 65 6d 70 2d 3e  ol *sp2 = lemp->
20b60 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20  symbols[j];.    
20b70 20 20 69 66 28 20 73 70 32 20 26 26 20 73 70 32    if( sp2 && sp2
20b80 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c  ->type!=TERMINAL
20b90 20 26 26 20 73 70 32 2d 3e 64 65 73 74 72 75 63   && sp2->destruc
20ba0 74 6f 72 0a 20 20 20 20 20 20 20 20 20 20 26 26  tor.          &&
20bb0 20 73 70 32 2d 3e 64 74 6e 75 6d 3d 3d 73 70 2d   sp2->dtnum==sp-
20bc0 3e 64 74 6e 75 6d 0a 20 20 20 20 20 20 20 20 20  >dtnum.         
20bd0 20 26 26 20 73 74 72 63 6d 70 28 73 70 2d 3e 64   && strcmp(sp->d
20be0 65 73 74 72 75 63 74 6f 72 2c 73 70 32 2d 3e 64  estructor,sp2->d
20bf0 65 73 74 72 75 63 74 6f 72 29 3d 3d 30 20 29 7b  estructor)==0 ){
20c00 0a 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  .         fprint
20c10 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20  f(out,"    case 
20c20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c  %d: /* %s */\n",
20c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20c40 20 20 73 70 32 2d 3e 69 6e 64 65 78 2c 20 73 70    sp2->index, sp
20c50 32 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  2->name); lineno
20c60 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 73 70 32  ++;.         sp2
20c70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30  ->destructor = 0
20c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20c90 0a 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75  .    emit_destru
20ca0 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65  ctor_code(out,le
20cb0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c  mp->symbols[i],l
20cc0 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  emp,&lineno);.  
20cd0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
20ce0 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b       break;\n");
20cf0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
20d00 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
20d10 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
20d20 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
20d30 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
20d40 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 65 76   executes whenev
20d50 65 72 20 74 68 65 20 70 61 72 73 65 72 20 73 74  er the parser st
20d60 61 63 6b 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f  ack overflows */
20d70 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
20d80 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 6f 76 65  t,lemp,lemp->ove
20d90 72 66 6c 6f 77 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  rflow,&lineno);.
20da0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
20db0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
20dc0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
20dd0 6e 65 72 61 74 65 20 74 68 65 20 74 61 62 6c 65  nerate the table
20de0 20 6f 66 20 72 75 6c 65 20 69 6e 66 6f 72 6d 61   of rule informa
20df0 74 69 6f 6e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  tion .  **.  ** 
20e00 4e 6f 74 65 3a 20 54 68 69 73 20 63 6f 64 65 20  Note: This code 
20e10 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
20e20 61 63 74 20 74 68 61 74 20 72 75 6c 65 73 20 61  act that rules a
20e30 72 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73  re number.  ** s
20e40 65 71 75 65 6e 74 75 61 6c 6c 79 20 62 65 67 69  equentually begi
20e50 6e 6e 69 6e 67 20 77 69 74 68 20 30 2e 0a 20 20  nning with 0..  
20e60 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
20e70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
20e80 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 66 70  p->next){.    fp
20e90 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 7b 20 25  rintf(out,"  { %
20ea0 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c 72 70 2d 3e  d, %d },\n",rp->
20eb0 6c 68 73 2d 3e 69 6e 64 65 78 2c 72 70 2d 3e 6e  lhs->index,rp->n
20ec0 72 68 73 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  rhs); lineno++;.
20ed0 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
20ee0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
20ef0 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
20f00 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
20f10 77 68 69 63 68 20 65 78 65 63 75 74 69 6f 6e 20  which execution 
20f20 64 75 72 69 6e 67 20 65 61 63 68 20 52 45 44 55  during each REDU
20f30 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  CE action */.  i
20f40 20 3d 20 30 3b 0a 20 20 66 6f 72 28 72 70 3d 6c   = 0;.  for(rp=l
20f50 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
20f60 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
20f70 20 69 20 2b 3d 20 74 72 61 6e 73 6c 61 74 65 5f   i += translate_
20f80 63 6f 64 65 28 6c 65 6d 70 2c 20 72 70 29 3b 0a  code(lemp, rp);.
20f90 20 20 7d 0a 20 20 69 66 28 20 69 20 29 7b 0a 20    }.  if( i ){. 
20fa0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
20fb0 20 20 20 20 20 20 20 20 59 59 4d 49 4e 4f 52 54          YYMINORT
20fc0 59 50 45 20 79 79 6c 68 73 6d 69 6e 6f 72 3b 5c  YPE yylhsminor;\
20fd0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
20fe0 20 7d 0a 20 20 2f 2a 20 46 69 72 73 74 20 6f 75   }.  /* First ou
20ff0 74 70 75 74 20 72 75 6c 65 73 20 6f 74 68 65 72  tput rules other
21000 20 74 68 61 6e 20 74 68 65 20 64 65 66 61 75 6c   than the defaul
21010 74 3a 20 72 75 6c 65 20 2a 2f 0a 20 20 66 6f 72  t: rule */.  for
21020 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
21030 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
21040 7b 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 6c  {.    struct rul
21050 65 20 2a 72 70 32 3b 20 20 20 20 20 20 20 20 20  e *rp2;         
21060 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 72        /* Other r
21070 75 6c 65 73 20 77 69 74 68 20 74 68 65 20 73 61  ules with the sa
21080 6d 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  me action */.   
21090 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30   if( rp->code==0
210a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
210b0 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 5b 30 5d   if( rp->code[0]
210c0 3d 3d 27 5c 6e 27 20 26 26 20 72 70 2d 3e 63 6f  =='\n' && rp->co
210d0 64 65 5b 31 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  de[1]==0 ) conti
210e0 6e 75 65 3b 20 2f 2a 20 57 69 6c 6c 20 62 65 20  nue; /* Will be 
210f0 64 65 66 61 75 6c 74 3a 20 2a 2f 0a 20 20 20 20  default: */.    
21100 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
21110 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 22     case %d: /* "
21120 2c 20 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20  , rp->index);.  
21130 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28    writeRuleText(
21140 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70  out, rp);.    fp
21150 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f 5c  rintf(out, " */\
21160 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
21170 20 20 20 66 6f 72 28 72 70 32 3d 72 70 2d 3e 6e     for(rp2=rp->n
21180 65 78 74 3b 20 72 70 32 3b 20 72 70 32 3d 72 70  ext; rp2; rp2=rp
21190 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  2->next){.      
211a0 69 66 28 20 72 70 32 2d 3e 63 6f 64 65 3d 3d 72  if( rp2->code==r
211b0 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20 20  p->code ){.     
211c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
211d0 20 20 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f        case %d: /
211e0 2a 20 22 2c 20 72 70 32 2d 3e 69 6e 64 65 78 29  * ", rp2->index)
211f0 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 52  ;.        writeR
21200 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 32  uleText(out, rp2
21210 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
21220 74 66 28 6f 75 74 2c 22 20 2a 2f 20 79 79 74 65  tf(out," */ yyte
21230 73 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d  stcase(yyruleno=
21240 3d 25 64 29 3b 5c 6e 22 2c 20 72 70 32 2d 3e 69  =%d);\n", rp2->i
21250 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ndex); lineno++;
21260 0a 20 20 20 20 20 20 20 20 72 70 32 2d 3e 63 6f  .        rp2->co
21270 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  de = 0;.      }.
21280 20 20 20 20 7d 0a 20 20 20 20 65 6d 69 74 5f 63      }.    emit_c
21290 6f 64 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c  ode(out,rp,lemp,
212a0 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70  &lineno);.    fp
212b0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
212c0 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c     break;\n"); l
212d0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 72 70 2d  ineno++;.    rp-
212e0 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  >code = 0;.  }. 
212f0 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6f 75 74   /* Finally, out
21300 70 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 3a  put the default:
21310 20 72 75 6c 65 2e 20 20 57 65 20 63 68 6f 6f 73   rule.  We choos
21320 65 20 61 73 20 74 68 65 20 64 65 66 61 75 6c 74  e as the default
21330 3a 20 61 6c 6c 0a 20 20 2a 2a 20 65 6d 70 74 79  : all.  ** empty
21340 20 61 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 66   actions. */.  f
21350 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
21360 20 20 64 65 66 61 75 6c 74 3a 5c 6e 22 29 3b 20    default:\n"); 
21370 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28  lineno++;.  for(
21380 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
21390 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
213a0 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64  .    if( rp->cod
213b0 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e==0 ) continue;
213c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d  .    assert( rp-
213d0 3e 63 6f 64 65 5b 30 5d 3d 3d 27 5c 6e 27 20 26  >code[0]=='\n' &
213e0 26 20 72 70 2d 3e 63 6f 64 65 5b 31 5d 3d 3d 30  & rp->code[1]==0
213f0 20 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   );.    fprintf(
21400 6f 75 74 2c 22 20 20 20 20 20 20 2f 2a 20 28 25  out,"      /* (%
21410 64 29 20 22 2c 20 72 70 2d 3e 69 6e 64 65 78 29  d) ", rp->index)
21420 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54  ;.    writeRuleT
21430 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20  ext(out, rp);.  
21440 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
21450 20 2a 2f 20 79 79 74 65 73 74 63 61 73 65 28 79   */ yytestcase(y
21460 79 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22  yruleno==%d);\n"
21470 2c 20 72 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69  , rp->index); li
21480 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70  neno++;.  }.  fp
21490 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
214a0 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c     break;\n"); l
214b0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f  ineno++;.  tplt_
214c0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
214d0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
214e0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
214f0 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
21500 74 65 73 20 69 66 20 61 20 70 61 72 73 65 20 66  tes if a parse f
21510 61 69 6c 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  ails */.  tplt_p
21520 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
21530 6d 70 2d 3e 66 61 69 6c 75 72 65 2c 26 6c 69 6e  mp->failure,&lin
21540 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65  eno);.  tplt_xfe
21550 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
21560 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
21570 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
21580 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
21590 20 77 68 65 6e 20 61 20 73 79 6e 74 61 78 20 65   when a syntax e
215a0 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20  rror occurs */. 
215b0 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
215c0 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72  lemp,lemp->error
215d0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c  ,&lineno);.  tpl
215e0 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
215f0 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
21600 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
21610 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
21620 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 70  cutes when the p
21630 61 72 73 65 72 20 61 63 63 65 70 74 73 20 69 74  arser accepts it
21640 73 20 69 6e 70 75 74 20 2a 2f 0a 20 20 74 70 6c  s input */.  tpl
21650 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
21660 2c 6c 65 6d 70 2d 3e 61 63 63 65 70 74 2c 26 6c  ,lemp->accept,&l
21670 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78  ineno);.  tplt_x
21680 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
21690 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
216a0 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 61 6e 79  .  /* Append any
216b0 20 61 64 64 69 74 69 6f 6e 20 63 6f 64 65 20 74   addition code t
216c0 68 65 20 75 73 65 72 20 64 65 73 69 72 65 73 20  he user desires 
216d0 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
216e0 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65  out,lemp,lemp->e
216f0 78 74 72 61 63 6f 64 65 2c 26 6c 69 6e 65 6e 6f  xtracode,&lineno
21700 29 3b 0a 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29  );..  fclose(in)
21710 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b  ;.  fclose(out);
21720 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
21730 20 47 65 6e 65 72 61 74 65 20 61 20 68 65 61 64   Generate a head
21740 65 72 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  er file for the 
21750 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52  parser */.void R
21760 65 70 6f 72 74 48 65 61 64 65 72 28 73 74 72 75  eportHeader(stru
21770 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
21780 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a  {.  FILE *out, *
21790 69 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  in;.  const char
217a0 20 2a 70 72 65 66 69 78 3b 0a 20 20 63 68 61 72   *prefix;.  char
217b0 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b   line[LINESIZE];
217c0 0a 20 20 63 68 61 72 20 70 61 74 74 65 72 6e 5b  .  char pattern[
217d0 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  LINESIZE];.  int
217e0 20 69 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d   i;..  if( lemp-
217f0 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20 70  >tokenprefix ) p
21800 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f  refix = lemp->to
21810 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 65 6c 73  kenprefix;.  els
21820 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
21830 20 20 20 20 20 70 72 65 66 69 78 20 3d 20 22 22       prefix = ""
21840 3b 0a 20 20 69 6e 20 3d 20 66 69 6c 65 5f 6f 70  ;.  in = file_op
21850 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 72 62  en(lemp,".h","rb
21860 22 29 3b 0a 20 20 69 66 28 20 69 6e 20 29 7b 0a  ");.  if( in ){.
21870 20 20 20 20 69 6e 74 20 6e 65 78 74 43 68 61 72      int nextChar
21880 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
21890 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
218a0 20 26 26 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c   && fgets(line,L
218b0 49 4e 45 53 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b  INESIZE,in); i++
218c0 29 7b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73  ){.      lemon_s
218d0 70 72 69 6e 74 66 28 70 61 74 74 65 72 6e 2c 22  printf(pattern,"
218e0 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20  #define %s%-30s 
218f0 25 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %3d\n",.        
21900 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66              pref
21910 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ix,lemp->symbols
21920 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20  [i]->name,i);.  
21930 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6c      if( strcmp(l
21940 69 6e 65 2c 70 61 74 74 65 72 6e 29 20 29 20 62  ine,pattern) ) b
21950 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
21960 6e 65 78 74 43 68 61 72 20 3d 20 66 67 65 74 63  nextChar = fgetc
21970 28 69 6e 29 3b 0a 20 20 20 20 66 63 6c 6f 73 65  (in);.    fclose
21980 28 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 69 3d  (in);.    if( i=
21990 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  =lemp->nterminal
219a0 20 26 26 20 6e 65 78 74 43 68 61 72 3d 3d 45 4f   && nextChar==EO
219b0 46 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  F ){.      /* No
219c0 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20 66   change in the f
219d0 69 6c 65 2e 20 20 44 6f 6e 27 74 20 72 65 77 72  ile.  Don't rewr
219e0 69 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20  ite it. */.     
219f0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
21a00 20 7d 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f   }.  out = file_
21a10 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22  open(lemp,".h","
21a20 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 20  wb");.  if( out 
21a30 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
21a40 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i<lemp->ntermina
21a50 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  l; i++){.      f
21a60 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
21a70 69 6e 65 20 25 73 25 2d 33 30 73 20 25 33 64 5c  ine %s%-30s %3d\
21a80 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e  n",prefix,lemp->
21a90 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65  symbols[i]->name
21aa0 2c 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ,i);.    }.    f
21ab0 63 6c 6f 73 65 28 6f 75 74 29 3b 20 20 0a 20 20  close(out);  .  
21ac0 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
21ad0 2a 20 52 65 64 75 63 65 20 74 68 65 20 73 69 7a  * Reduce the siz
21ae0 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20  e of the action 
21af0 74 61 62 6c 65 73 2c 20 69 66 20 70 6f 73 73 69  tables, if possi
21b00 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e 67 20 75  ble, by making u
21b10 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61 75 6c 74  se.** of default
21b20 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  s..**.** In this
21b30 20 76 65 72 73 69 6f 6e 2c 20 77 65 20 74 61 6b   version, we tak
21b40 65 20 74 68 65 20 6d 6f 73 74 20 66 72 65 71 75  e the most frequ
21b50 65 6e 74 20 52 45 44 55 43 45 20 61 63 74 69 6f  ent REDUCE actio
21b60 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69 74  n and make.** it
21b70 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 45   the default.  E
21b80 78 63 65 70 74 2c 20 74 68 65 72 65 20 69 73 20  xcept, there is 
21b90 6e 6f 20 64 65 66 61 75 6c 74 20 69 66 20 74 68  no default if th
21ba0 65 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e  e wildcard token
21bb0 0a 2a 2a 20 69 73 20 61 20 70 6f 73 73 69 62 6c  .** is a possibl
21bc0 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 2e 0a 2a 2f  e look-ahead..*/
21bd0 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73 54 61  .void CompressTa
21be0 62 6c 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f  bles(struct lemo
21bf0 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72  n *lemp).{.  str
21c00 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
21c10 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
21c20 2a 61 70 2c 20 2a 61 70 32 3b 0a 20 20 73 74 72  *ap, *ap2;.  str
21c30 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 72  uct rule *rp, *r
21c40 70 32 2c 20 2a 72 62 65 73 74 3b 0a 20 20 69 6e  p2, *rbest;.  in
21c50 74 20 6e 62 65 73 74 2c 20 6e 3b 0a 20 20 69 6e  t nbest, n;.  in
21c60 74 20 69 3b 0a 20 20 69 6e 74 20 75 73 65 73 57  t i;.  int usesW
21c70 69 6c 64 63 61 72 64 3b 0a 0a 20 20 66 6f 72 28  ildcard;..  for(
21c80 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
21c90 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
21ca0 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
21cb0 64 5b 69 5d 3b 0a 20 20 20 20 6e 62 65 73 74 20  d[i];.    nbest 
21cc0 3d 20 30 3b 0a 20 20 20 20 72 62 65 73 74 20 3d  = 0;.    rbest =
21cd0 20 30 3b 0a 20 20 20 20 75 73 65 73 57 69 6c 64   0;.    usesWild
21ce0 63 61 72 64 20 3d 20 30 3b 0a 0a 20 20 20 20 66  card = 0;..    f
21cf0 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
21d00 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
21d10 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
21d20 79 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70  ype==SHIFT && ap
21d30 2d 3e 73 70 3d 3d 6c 65 6d 70 2d 3e 77 69 6c 64  ->sp==lemp->wild
21d40 63 61 72 64 20 29 7b 0a 20 20 20 20 20 20 20 20  card ){.        
21d50 75 73 65 73 57 69 6c 64 63 61 72 64 20 3d 20 31  usesWildcard = 1
21d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21d70 69 66 28 20 61 70 2d 3e 74 79 70 65 21 3d 52 45  if( ap->type!=RE
21d80 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DUCE ) continue;
21d90 0a 20 20 20 20 20 20 72 70 20 3d 20 61 70 2d 3e  .      rp = ap->
21da0 78 2e 72 70 3b 0a 20 20 20 20 20 20 69 66 28 20  x.rp;.      if( 
21db0 72 70 2d 3e 6c 68 73 53 74 61 72 74 20 29 20 63  rp->lhsStart ) c
21dc0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
21dd0 66 28 20 72 70 3d 3d 72 62 65 73 74 20 29 20 63  f( rp==rbest ) c
21de0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e  ontinue;.      n
21df0 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 1;.      for(
21e00 61 70 32 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70  ap2=ap->next; ap
21e10 32 3b 20 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74  2; ap2=ap2->next
21e20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
21e30 70 32 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45  p2->type!=REDUCE
21e40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21e50 20 20 20 20 20 72 70 32 20 3d 20 61 70 32 2d 3e       rp2 = ap2->
21e60 78 2e 72 70 3b 0a 20 20 20 20 20 20 20 20 69 66  x.rp;.        if
21e70 28 20 72 70 32 3d 3d 72 62 65 73 74 20 29 20 63  ( rp2==rbest ) c
21e80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
21e90 20 69 66 28 20 72 70 32 3d 3d 72 70 20 29 20 6e   if( rp2==rp ) n
21ea0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
21eb0 20 20 69 66 28 20 6e 3e 6e 62 65 73 74 20 29 7b    if( n>nbest ){
21ec0 0a 20 20 20 20 20 20 20 20 6e 62 65 73 74 20 3d  .        nbest =
21ed0 20 6e 3b 0a 20 20 20 20 20 20 20 20 72 62 65 73   n;.        rbes
21ee0 74 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 7d 0a  t = rp;.      }.
21ef0 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 44      }. .    /* D
21f00 6f 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 65 66  o not make a def
21f10 61 75 6c 74 20 69 66 20 74 68 65 20 6e 75 6d 62  ault if the numb
21f20 65 72 20 6f 66 20 72 75 6c 65 73 20 74 6f 20 64  er of rules to d
21f30 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 69 73  efault.    ** is
21f40 20 6e 6f 74 20 61 74 20 6c 65 61 73 74 20 31 20   not at least 1 
21f50 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64 63 61  or if the wildca
21f60 72 64 20 74 6f 6b 65 6e 20 69 73 20 61 20 70 6f  rd token is a po
21f70 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 6c 6f  ssible.    ** lo
21f80 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 2a 2f 0a  okahead..    */.
21f90 20 20 20 20 69 66 28 20 6e 62 65 73 74 3c 31 20      if( nbest<1 
21fa0 7c 7c 20 75 73 65 73 57 69 6c 64 63 61 72 64 20  || usesWildcard 
21fb0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20  ) continue;...  
21fc0 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 6d 61 74    /* Combine mat
21fd0 63 68 69 6e 67 20 52 45 44 55 43 45 20 61 63 74  ching REDUCE act
21fe0 69 6f 6e 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ions into a sing
21ff0 6c 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20  le default */.  
22000 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
22010 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
22020 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  t){.      if( ap
22030 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26  ->type==REDUCE &
22040 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73  & ap->x.rp==rbes
22050 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t ) break;.    }
22060 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70 20  .    assert( ap 
22070 29 3b 0a 20 20 20 20 61 70 2d 3e 73 70 20 3d 20  );.    ap->sp = 
22080 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66  Symbol_new("{def
22090 61 75 6c 74 7d 22 29 3b 0a 20 20 20 20 66 6f 72  ault}");.    for
220a0 28 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70  (ap=ap->next; ap
220b0 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
220c0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
220d0 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70  pe==REDUCE && ap
220e0 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20  ->x.rp==rbest ) 
220f0 61 70 2d 3e 74 79 70 65 20 3d 20 4e 4f 54 5f 55  ap->type = NOT_U
22100 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  SED;.    }.    s
22110 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f  tp->ap = Action_
22120 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 0a  sort(stp->ap);..
22130 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
22140 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
22150 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
22160 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20  ap->type==SHIFT 
22170 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
22180 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44  f( ap->type==RED
22190 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 21  UCE && ap->x.rp!
221a0 3d 72 62 65 73 74 20 29 20 62 72 65 61 6b 3b 0a  =rbest ) break;.
221b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 70      }.    if( ap
221c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 70  ==0 ){.      stp
221d0 2d 3e 61 75 74 6f 52 65 64 75 63 65 20 3d 20 31  ->autoReduce = 1
221e0 3b 0a 20 20 20 20 20 20 73 74 70 2d 3e 70 44 66  ;.      stp->pDf
221f0 6c 74 52 65 64 75 63 65 20 3d 20 72 62 65 73 74  ltReduce = rbest
22200 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
22210 2a 20 4d 61 6b 65 20 61 20 73 65 63 6f 6e 64 20  * Make a second 
22220 70 61 73 73 20 6f 76 65 72 20 61 6c 6c 20 73 74  pass over all st
22230 61 74 65 73 20 61 6e 64 20 61 63 74 69 6f 6e 73  ates and actions
22240 2e 20 20 43 6f 6e 76 65 72 74 0a 20 20 2a 2a 20  .  Convert.  ** 
22250 65 76 65 72 79 20 61 63 74 69 6f 6e 20 74 68 61  every action tha
22260 74 20 69 73 20 61 20 53 48 49 46 54 20 74 6f 20  t is a SHIFT to 
22270 61 6e 20 61 75 74 6f 52 65 64 75 63 65 20 73 74  an autoReduce st
22280 61 74 65 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20  ate into.  ** a 
22290 53 48 49 46 54 52 45 44 55 43 45 20 61 63 74 69  SHIFTREDUCE acti
222a0 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  on..  */.  for(i
222b0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
222c0 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
222d0 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
222e0 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  [i];.    for(ap=
222f0 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
22300 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
22310 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 70   struct state *p
22320 4e 65 78 74 53 74 61 74 65 3b 0a 20 20 20 20 20  NextState;.     
22330 20 69 66 28 20 61 70 2d 3e 74 79 70 65 21 3d 53   if( ap->type!=S
22340 48 49 46 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b  HIFT ) continue;
22350 0a 20 20 20 20 20 20 70 4e 65 78 74 53 74 61 74  .      pNextStat
22360 65 20 3d 20 61 70 2d 3e 78 2e 73 74 70 3b 0a 20  e = ap->x.stp;. 
22370 20 20 20 20 20 69 66 28 20 70 4e 65 78 74 53 74       if( pNextSt
22380 61 74 65 2d 3e 61 75 74 6f 52 65 64 75 63 65 20  ate->autoReduce 
22390 26 26 20 70 4e 65 78 74 53 74 61 74 65 2d 3e 70  && pNextState->p
223a0 44 66 6c 74 52 65 64 75 63 65 21 3d 30 20 29 7b  DfltReduce!=0 ){
223b0 0a 20 20 20 20 20 20 20 20 61 70 2d 3e 74 79 70  .        ap->typ
223c0 65 20 3d 20 53 48 49 46 54 52 45 44 55 43 45 3b  e = SHIFTREDUCE;
223d0 0a 20 20 20 20 20 20 20 20 61 70 2d 3e 78 2e 72  .        ap->x.r
223e0 70 20 3d 20 70 4e 65 78 74 53 74 61 74 65 2d 3e  p = pNextState->
223f0 70 44 66 6c 74 52 65 64 75 63 65 3b 0a 20 20 20  pDfltReduce;.   
22400 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
22410 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  .../*.** Compare
22420 20 74 77 6f 20 73 74 61 74 65 73 20 66 6f 72 20   two states for 
22430 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
22440 2e 20 20 54 68 65 20 73 6d 61 6c 6c 65 72 20 73  .  The smaller s
22450 74 61 74 65 20 69 73 20 74 68 65 0a 2a 2a 20 6f  tate is the.** o
22460 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74  ne with the most
22470 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63   non-terminal ac
22480 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 79 20  tions.  If they 
22490 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
224a0 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f 6e 2d 74  mber.** of non-t
224b0 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2c  erminal actions,
224c0 20 74 68 65 6e 20 74 68 65 20 73 6d 61 6c 6c 65   then the smalle
224d0 72 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  r is the one wit
224e0 68 20 74 68 65 20 6d 6f 73 74 0a 2a 2a 20 74 6f  h the most.** to
224f0 6b 65 6e 20 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  ken actions..*/.
22500 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 65  static int state
22510 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 28 63 6f  ResortCompare(co
22520 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e  nst void *a, con
22530 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 63  st void *b){.  c
22540 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74  onst struct stat
22550 65 20 2a 70 41 20 3d 20 2a 28 63 6f 6e 73 74 20  e *pA = *(const 
22560 73 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29 61  struct state**)a
22570 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  ;.  const struct
22580 20 73 74 61 74 65 20 2a 70 42 20 3d 20 2a 28 63   state *pB = *(c
22590 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74  onst struct stat
225a0 65 2a 2a 29 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a  e**)b;.  int n;.
225b0 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e 74 41 63  .  n = pB->nNtAc
225c0 74 20 2d 20 70 41 2d 3e 6e 4e 74 41 63 74 3b 0a  t - pA->nNtAct;.
225d0 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
225e0 20 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b 6e 41 63    n = pB->nTknAc
225f0 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41 63 74 3b  t - pA->nTknAct;
22600 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  .    if( n==0 ){
22610 0a 20 20 20 20 20 20 6e 20 3d 20 70 42 2d 3e 73  .      n = pB->s
22620 74 61 74 65 6e 75 6d 20 2d 20 70 41 2d 3e 73 74  tatenum - pA->st
22630 61 74 65 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20  atenum;.    }.  
22640 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 21 3d 30  }.  assert( n!=0
22650 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a   );.  return n;.
22660 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 75 6d 62  }.../*.** Renumb
22670 65 72 20 61 6e 64 20 72 65 73 6f 72 74 20 73 74  er and resort st
22680 61 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61  ates so that sta
22690 74 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63  tes with fewer c
226a0 68 6f 69 63 65 73 0a 2a 2a 20 6f 63 63 75 72 20  hoices.** occur 
226b0 61 74 20 74 68 65 20 65 6e 64 2e 20 20 45 78 63  at the end.  Exc
226c0 65 70 74 2c 20 6b 65 65 70 20 73 74 61 74 65 20  ept, keep state 
226d0 30 20 61 73 20 74 68 65 20 66 69 72 73 74 20 73  0 as the first s
226e0 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 52 65  tate..*/.void Re
226f0 73 6f 72 74 53 74 61 74 65 73 28 73 74 72 75 63  sortStates(struc
22700 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
22710 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
22720 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
22730 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
22740 61 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ap;..  for(i=0; 
22750 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
22760 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
22770 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
22780 0a 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63  .    stp->nTknAc
22790 74 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 20  t = stp->nNtAct 
227a0 3d 20 30 3b 0a 20 20 20 20 73 74 70 2d 3e 69 44  = 0;.    stp->iD
227b0 66 6c 74 52 65 64 75 63 65 20 3d 20 6c 65 6d 70  fltReduce = lemp
227c0 2d 3e 6e 72 75 6c 65 3b 20 20 2f 2a 20 49 6e 69  ->nrule;  /* Ini
227d0 74 20 64 66 6c 74 20 61 63 74 69 6f 6e 20 74 6f  t dflt action to
227e0 20 22 73 79 6e 74 61 78 20 65 72 72 6f 72 22 20   "syntax error" 
227f0 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e  */.    stp->iTkn
22800 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54  Ofst = NO_OFFSET
22810 3b 0a 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66  ;.    stp->iNtOf
22820 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a  st = NO_OFFSET;.
22830 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
22840 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
22850 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
22860 69 41 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74  iAction = comput
22870 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70  e_action(lemp,ap
22880 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 41 63  );.      if( iAc
22890 74 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20  tion>=0 ){.     
228a0 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69     if( ap->sp->i
228b0 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  ndex<lemp->nterm
228c0 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  inal ){.        
228d0 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 2b 2b    stp->nTknAct++
228e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
228f0 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
22900 78 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  x<lemp->nsymbol 
22910 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70  ){.          stp
22920 2d 3e 6e 4e 74 41 63 74 2b 2b 3b 0a 20 20 20 20  ->nNtAct++;.    
22930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22940 20 20 20 20 20 61 73 73 65 72 74 28 20 73 74 70       assert( stp
22950 2d 3e 61 75 74 6f 52 65 64 75 63 65 3d 3d 30 20  ->autoReduce==0 
22960 7c 7c 20 73 74 70 2d 3e 70 44 66 6c 74 52 65 64  || stp->pDfltRed
22970 75 63 65 3d 3d 61 70 2d 3e 78 2e 72 70 20 29 3b  uce==ap->x.rp );
22980 0a 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e  .          stp->
22990 69 44 66 6c 74 52 65 64 75 63 65 20 3d 20 69 41  iDfltReduce = iA
229a0 63 74 69 6f 6e 20 2d 20 6c 65 6d 70 2d 3e 6e 73  ction - lemp->ns
229b0 74 61 74 65 20 2d 20 6c 65 6d 70 2d 3e 6e 72 75  tate - lemp->nru
229c0 6c 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  le;.        }.  
229d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
229e0 20 20 71 73 6f 72 74 28 26 6c 65 6d 70 2d 3e 73    qsort(&lemp->s
229f0 6f 72 74 65 64 5b 31 5d 2c 20 6c 65 6d 70 2d 3e  orted[1], lemp->
22a00 6e 73 74 61 74 65 2d 31 2c 20 73 69 7a 65 6f 66  nstate-1, sizeof
22a10 28 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d  (lemp->sorted[0]
22a20 29 2c 0a 20 20 20 20 20 20 20 20 73 74 61 74 65  ),.        state
22a30 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 29 3b 0a  ResortCompare);.
22a40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
22a50 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
22a60 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  .    lemp->sorte
22a70 64 5b 69 5d 2d 3e 73 74 61 74 65 6e 75 6d 20 3d  d[i]->statenum =
22a80 20 69 3b 0a 20 20 7d 0a 20 20 6c 65 6d 70 2d 3e   i;.  }.  lemp->
22a90 6e 78 73 74 61 74 65 20 3d 20 6c 65 6d 70 2d 3e  nxstate = lemp->
22aa0 6e 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28  nstate;.  while(
22ab0 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3e 31   lemp->nxstate>1
22ac0 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64   && lemp->sorted
22ad0 5b 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2d 31  [lemp->nxstate-1
22ae0 5d 2d 3e 61 75 74 6f 52 65 64 75 63 65 20 29 7b  ]->autoReduce ){
22af0 0a 20 20 20 20 6c 65 6d 70 2d 3e 6e 78 73 74 61  .    lemp->nxsta
22b00 74 65 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  te--;.  }.}.../*
22b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22b20 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
22b30 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  set.c" *********
22b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
22b60 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75 6c 61 74  ** Set manipulat
22b70 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  ion routines for
22b80 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
22b90 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
22ba0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 7a 65  .static int size
22bb0 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74 20 74 68   = 0;../* Set th
22bc0 65 20 73 65 74 20 73 69 7a 65 20 2a 2f 0a 76 6f  e set size */.vo
22bd0 69 64 20 53 65 74 53 69 7a 65 28 69 6e 74 20 6e  id SetSize(int n
22be0 29 0a 7b 0a 20 20 73 69 7a 65 20 3d 20 6e 2b 31  ).{.  size = n+1
22bf0 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;.}../* Allocate
22c00 20 61 20 6e 65 77 20 73 65 74 20 2a 2f 0a 63 68   a new set */.ch
22c10 61 72 20 2a 53 65 74 4e 65 77 28 29 7b 0a 20 20  ar *SetNew(){.  
22c20 63 68 61 72 20 2a 73 3b 0a 20 20 73 20 3d 20 28  char *s;.  s = (
22c30 63 68 61 72 2a 29 63 61 6c 6c 6f 63 28 20 73 69  char*)calloc( si
22c40 7a 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73 3d  ze, 1);.  if( s=
22c50 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  =0 ){.    extern
22c60 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72   void memory_err
22c70 6f 72 28 29 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  or();.    memory
22c80 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20  _error();.  }.  
22c90 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20  return s;.}../* 
22ca0 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65 74  Deallocate a set
22cb0 20 2a 2f 0a 76 6f 69 64 20 53 65 74 46 72 65 65   */.void SetFree
22cc0 28 63 68 61 72 20 2a 73 29 0a 7b 0a 20 20 66 72  (char *s).{.  fr
22cd0 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64  ee(s);.}../* Add
22ce0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
22cf0 6f 20 74 68 65 20 73 65 74 2e 20 20 52 65 74 75  o the set.  Retu
22d00 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 65  rn TRUE if the e
22d10 6c 65 6d 65 6e 74 20 77 61 73 20 61 64 64 65 64  lement was added
22d20 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20 69 66  .** and FALSE if
22d30 20 69 74 20 77 61 73 20 61 6c 72 65 61 64 79 20   it was already 
22d40 74 68 65 72 65 2e 20 2a 2f 0a 69 6e 74 20 53 65  there. */.int Se
22d50 74 41 64 64 28 63 68 61 72 20 2a 73 2c 20 69 6e  tAdd(char *s, in
22d60 74 20 65 29 0a 7b 0a 20 20 69 6e 74 20 72 76 3b  t e).{.  int rv;
22d70 0a 20 20 61 73 73 65 72 74 28 20 65 3e 3d 30 20  .  assert( e>=0 
22d80 26 26 20 65 3c 73 69 7a 65 20 29 3b 0a 20 20 72  && e<size );.  r
22d90 76 20 3d 20 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d  v = s[e];.  s[e]
22da0 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 21   = 1;.  return !
22db0 72 76 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65 76  rv;.}../* Add ev
22dc0 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 73  ery element of s
22dd0 32 20 74 6f 20 73 31 2e 20 20 52 65 74 75 72 6e  2 to s1.  Return
22de0 20 54 52 55 45 20 69 66 20 73 31 20 63 68 61 6e   TRUE if s1 chan
22df0 67 65 73 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 55  ges. */.int SetU
22e00 6e 69 6f 6e 28 63 68 61 72 20 2a 73 31 2c 20 63  nion(char *s1, c
22e10 68 61 72 20 2a 73 32 29 0a 7b 0a 20 20 69 6e 74  har *s2).{.  int
22e20 20 69 2c 20 70 72 6f 67 72 65 73 73 3b 0a 20 20   i, progress;.  
22e30 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
22e40 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
22e50 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
22e60 32 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  2[i]==0 ) contin
22e70 75 65 3b 0a 20 20 20 20 69 66 28 20 73 31 5b 69  ue;.    if( s1[i
22e80 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72  ]==0 ){.      pr
22e90 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20  ogress = 1;.    
22ea0 20 20 73 31 5b 69 5d 20 3d 20 31 3b 0a 20 20 20    s1[i] = 1;.   
22eb0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
22ec0 70 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a  progress;.}./***
22ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22ee0 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
22ef0 65 20 22 74 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a  e "table.c" ****
22f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22f10 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
22f20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73  All code in this
22f30 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61   file has been a
22f40 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
22f50 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61  erated.** from a
22f60 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69   specification i
22f70 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  n the file.**   
22f80 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c             "tabl
22f90 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61  e.q".** by the a
22fa0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
22fb0 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70   code building p
22fc0 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a  rogram "aagen"..
22fd0 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74  ** Do not edit t
22fe0 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65  his file!  Inste
22ff0 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70 65  ad, edit the spe
23000 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69  cification.** fi
23010 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61  le, then rerun a
23020 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43  agen..*/./*.** C
23030 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ode for processi
23040 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ng tables in the
23050 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
23060 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49  nerator..*/..PRI
23070 56 41 54 45 20 75 6e 73 69 67 6e 65 64 20 73 74  VATE unsigned st
23080 72 68 61 73 68 28 63 6f 6e 73 74 20 63 68 61 72  rhash(const char
23090 20 2a 78 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65   *x).{.  unsigne
230a0 64 20 68 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  d h = 0;.  while
230b0 28 20 2a 78 20 29 20 68 20 3d 20 68 2a 31 33 20  ( *x ) h = h*13 
230c0 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20 72 65 74 75  + *(x++);.  retu
230d0 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b  rn h;.}../* Work
230e0 73 20 6c 69 6b 65 20 73 74 72 64 75 70 2c 20 73  s like strdup, s
230f0 6f 72 74 20 6f 66 2e 20 20 53 61 76 65 20 61 20  ort of.  Save a 
23100 73 74 72 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63  string in malloc
23110 65 64 20 6d 65 6d 6f 72 79 2c 20 62 75 74 0a 2a  ed memory, but.*
23120 2a 20 6b 65 65 70 20 73 74 72 69 6e 67 73 20 69  * keep strings i
23130 6e 20 61 20 74 61 62 6c 65 20 73 6f 20 74 68 61  n a table so tha
23140 74 20 74 68 65 20 73 61 6d 65 20 73 74 72 69 6e  t the same strin
23150 67 20 69 73 20 6e 6f 74 20 69 6e 20 6d 6f 72 65  g is not in more
23160 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 70 6c 61  .** than one pla
23170 63 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ce..*/.const cha
23180 72 20 2a 53 74 72 73 61 66 65 28 63 6f 6e 73 74  r *Strsafe(const
23190 20 63 68 61 72 20 2a 79 29 0a 7b 0a 20 20 63 6f   char *y).{.  co
231a0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63  nst char *z;.  c
231b0 68 61 72 20 2a 63 70 79 3b 0a 0a 20 20 69 66 28  har *cpy;..  if(
231c0 20 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   y==0 ) return 0
231d0 3b 0a 20 20 7a 20 3d 20 53 74 72 73 61 66 65 5f  ;.  z = Strsafe_
231e0 66 69 6e 64 28 79 29 3b 0a 20 20 69 66 28 20 7a  find(y);.  if( z
231f0 3d 3d 30 20 26 26 20 28 63 70 79 3d 28 63 68 61  ==0 && (cpy=(cha
23200 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f  r *)malloc( lemo
23210 6e 53 74 72 6c 65 6e 28 79 29 2b 31 20 29 29 21  nStrlen(y)+1 ))!
23220 3d 30 20 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f  =0 ){.    lemon_
23230 73 74 72 63 70 79 28 63 70 79 2c 79 29 3b 0a 20  strcpy(cpy,y);. 
23240 20 20 20 7a 20 3d 20 63 70 79 3b 0a 20 20 20 20     z = cpy;.    
23250 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 7a  Strsafe_insert(z
23260 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72 79 43  );.  }.  MemoryC
23270 68 65 63 6b 28 7a 29 3b 0a 20 20 72 65 74 75 72  heck(z);.  retur
23280 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65  n z;.}../* There
23290 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
232a0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
232b0 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  g structure for 
232c0 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74  each.** associat
232d0 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
232e0 65 20 22 78 31 22 2e 0a 2a 2f 0a 73 74 72 75 63  e "x1"..*/.struc
232f0 74 20 73 5f 78 31 20 7b 0a 20 20 69 6e 74 20 73  t s_x1 {.  int s
23300 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
23310 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
23320 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c   of available sl
23330 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ots. */.        
23340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23350 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61    /*   Must be a
23360 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61   power of 2 grea
23370 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20  ter than or */. 
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23390 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71           /*   eq
233a0 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e  ual to 1 */.  in
233b0 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  t count;        
233c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
233d0 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f  of currently slo
233e0 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73  ts filled */.  s
233f0 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a  truct s_x1node *
23400 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  tbl;  /* The dat
23410 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f  a stored here */
23420 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f  .  struct s_x1no
23430 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73  de **ht;  /* Has
23440 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b  h table for look
23450 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  ups */.};../* Th
23460 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
23470 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
23480 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20  cture for every 
23490 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  data element.** 
234a0 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76  in an associativ
234b0 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
234c0 22 78 31 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  "x1"..*/.typedef
234d0 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
234e0 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
234f0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 2f 2a  *data;        /*
23500 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73   The data */.  s
23510 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a  truct s_x1node *
23520 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20  next;   /* Next 
23530 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
23540 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74  ame hash */.  st
23550 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a  ruct s_x1node **
23560 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f  from;  /* Previo
23570 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e  us link */.} x1n
23580 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  ode;../* There i
23590 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61  s only one insta
235a0 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  nce of the array
235b0 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66  , which is the f
235c0 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74  ollowing */.stat
235d0 69 63 20 73 74 72 75 63 74 20 73 5f 78 31 20 2a  ic struct s_x1 *
235e0 78 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  x1a;../* Allocat
235f0 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74  e a new associat
23600 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69  ive array */.voi
23610 64 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29  d Strsafe_init()
23620 7b 0a 20 20 69 66 28 20 78 31 61 20 29 20 72 65  {.  if( x1a ) re
23630 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20 28 73  turn;.  x1a = (s
23640 74 72 75 63 74 20 73 5f 78 31 2a 29 6d 61 6c 6c  truct s_x1*)mall
23650 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
23660 74 20 73 5f 78 31 29 20 29 3b 0a 20 20 69 66 28  t s_x1) );.  if(
23670 20 78 31 61 20 29 7b 0a 20 20 20 20 78 31 61 2d   x1a ){.    x1a-
23680 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  >size = 1024;.  
23690 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x1a->count = 0
236a0 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c 20 3d  ;.    x1a->tbl =
236b0 20 28 78 31 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63   (x1node*)calloc
236c0 28 31 30 32 34 2c 20 73 69 7a 65 6f 66 28 78 31  (1024, sizeof(x1
236d0 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
236e0 31 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66  1node*));.    if
236f0 28 20 78 31 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b  ( x1a->tbl==0 ){
23700 0a 20 20 20 20 20 20 66 72 65 65 28 78 31 61 29  .      free(x1a)
23710 3b 0a 20 20 20 20 20 20 78 31 61 20 3d 20 30 3b  ;.      x1a = 0;
23720 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23730 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78    int i;.      x
23740 31 61 2d 3e 68 74 20 3d 20 28 78 31 6e 6f 64 65  1a->ht = (x1node
23750 2a 2a 29 26 28 78 31 61 2d 3e 74 62 6c 5b 31 30  **)&(x1a->tbl[10
23760 32 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  24]);.      for(
23770 69 3d 30 3b 20 69 3c 31 30 32 34 3b 20 69 2b 2b  i=0; i<1024; i++
23780 29 20 78 31 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x1a->ht[i] = 0
23790 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
237a0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
237b0 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
237c0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
237d0 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
237e0 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
237f0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
23800 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
23810 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 72 73 61  ten */.int Strsa
23820 66 65 5f 69 6e 73 65 72 74 28 63 6f 6e 73 74 20  fe_insert(const 
23830 63 68 61 72 20 2a 64 61 74 61 29 0a 7b 0a 20 20  char *data).{.  
23840 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75 6e  x1node *np;.  un
23850 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73 69  signed h;.  unsi
23860 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66 28 20  gned ph;..  if( 
23870 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x1a==0 ) return 
23880 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73  0;.  ph = strhas
23890 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70  h(data);.  h = p
238a0 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31  h & (x1a->size-1
238b0 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68  );.  np = x1a->h
238c0 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
238d0 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
238e0 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74  cmp(np->data,dat
238f0 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  a)==0 ){.      /
23900 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  * An existing en
23910 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
23920 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20  e key is found. 
23930 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  */.      /* Fail
23940 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69   because overwri
23950 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73  te is not allows
23960 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
23970 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
23980 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
23990 7d 0a 20 20 69 66 28 20 78 31 61 2d 3e 63 6f 75  }.  if( x1a->cou
239a0 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20 29 7b  nt>=x1a->size ){
239b0 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
239c0 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
239d0 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20  ble bigger */.  
239e0 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b    int i,arrSize;
239f0 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 31  .    struct s_x1
23a00 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61   array;.    arra
23a10 79 2e 73 69 7a 65 20 3d 20 61 72 72 53 69 7a 65  y.size = arrSize
23a20 20 3d 20 78 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a   = x1a->size*2;.
23a30 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20      array.count 
23a40 3d 20 78 31 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x1a->count;.  
23a50 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78    array.tbl = (x
23a60 31 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61 72  1node*)calloc(ar
23a70 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78 31  rSize, sizeof(x1
23a80 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
23a90 31 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66  1node*));.    if
23aa0 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29  ( array.tbl==0 )
23ab0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46   return 0;  /* F
23ac0 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f  ail due to mallo
23ad0 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20  c failure */.   
23ae0 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 31 6e   array.ht = (x1n
23af0 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62  ode**)&(array.tb
23b00 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20 20  l[arrSize]);.   
23b10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53   for(i=0; i<arrS
23b20 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e  ize; i++) array.
23b30 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66  ht[i] = 0;.    f
23b40 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61 2d 3e 63  or(i=0; i<x1a->c
23b50 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
23b60 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c    x1node *oldnp,
23b70 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f   *newnp;.      o
23b80 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62  ldnp = &(x1a->tb
23b90 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d  l[i]);.      h =
23ba0 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e   strhash(oldnp->
23bb0 64 61 74 61 29 20 26 20 28 61 72 72 53 69 7a 65  data) & (arrSize
23bc0 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  -1);.      newnp
23bd0 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69   = &(array.tbl[i
23be0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72  ]);.      if( ar
23bf0 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61  ray.ht[h] ) arra
23c00 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  y.ht[h]->from = 
23c10 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a  &(newnp->next);.
23c20 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78        newnp->nex
23c30 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b  t = array.ht[h];
23c40 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
23c50 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
23c60 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
23c70 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
23c80 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
23c90 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
23ca0 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
23cb0 78 31 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x1a->tbl);.    *
23cc0 78 31 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x1a = array;.  }
23cd0 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
23ce0 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
23cf0 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69   = ph & (x1a->si
23d00 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
23d10 78 31 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f  x1a->tbl[x1a->co
23d20 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64  unt++]);.  np->d
23d30 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66  ata = data;.  if
23d40 28 20 78 31 61 2d 3e 68 74 5b 68 5d 20 29 20 78  ( x1a->ht[h] ) x
23d50 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  1a->ht[h]->from 
23d60 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  = &(np->next);. 
23d70 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 31 61 2d   np->next = x1a-
23d80 3e 68 74 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e 68  >ht[h];.  x1a->h
23d90 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d  t[h] = np;.  np-
23da0 3e 66 72 6f 6d 20 3d 20 26 28 78 31 61 2d 3e 68  >from = &(x1a->h
23db0 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  t[h]);.  return 
23dc0 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  1;.}../* Return 
23dd0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
23de0 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  a assigned to th
23df0 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65  e given key.  Re
23e00 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
23e10 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a  no such key. */.
23e20 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73  const char *Strs
23e30 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63  afe_find(const c
23e40 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e  har *key).{.  un
23e50 73 69 67 6e 65 64 20 68 3b 0a 20 20 78 31 6e 6f  signed h;.  x1no
23e60 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78  de *np;..  if( x
23e70 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  1a==0 ) return 0
23e80 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68 28  ;.  h = strhash(
23e90 6b 65 79 29 20 26 20 28 78 31 61 2d 3e 73 69 7a  key) & (x1a->siz
23ea0 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61  e-1);.  np = x1a
23eb0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
23ec0 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
23ed0 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c  strcmp(np->data,
23ee0 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  key)==0 ) break;
23ef0 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
23f00 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
23f10 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a   np ? np->data :
23f20 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   0;.}../* Return
23f30 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
23f40 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e  e (terminal or n
23f50 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73 79 6d 62  onterminal) symb
23f60 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72 65 61 74  ol "x"..** Creat
23f70 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 20 69  e a new symbol i
23f80 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
23f90 72 73 74 20 74 69 6d 65 20 22 78 22 20 68 61 73  rst time "x" has
23fa0 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73   been seen..*/.s
23fb0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
23fc0 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74 20 63  mbol_new(const c
23fd0 68 61 72 20 2a 78 29 0a 7b 0a 20 20 73 74 72 75  har *x).{.  stru
23fe0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a  ct symbol *sp;..
23ff0 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69    sp = Symbol_fi
24000 6e 64 28 78 29 3b 0a 20 20 69 66 28 20 73 70 3d  nd(x);.  if( sp=
24010 3d 30 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 28  =0 ){.    sp = (
24020 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29  struct symbol *)
24030 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66  calloc(1, sizeof
24040 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 29 20  (struct symbol) 
24050 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65  );.    MemoryChe
24060 63 6b 28 73 70 29 3b 0a 20 20 20 20 73 70 2d 3e  ck(sp);.    sp->
24070 6e 61 6d 65 20 3d 20 53 74 72 73 61 66 65 28 78  name = Strsafe(x
24080 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79 70 65 20  );.    sp->type 
24090 3d 20 49 53 55 50 50 45 52 28 2a 78 29 20 3f 20  = ISUPPER(*x) ? 
240a0 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45  TERMINAL : NONTE
240b0 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73 70 2d 3e  RMINAL;.    sp->
240c0 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73 70  rule = 0;.    sp
240d0 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ->fallback = 0;.
240e0 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 2d      sp->prec = -
240f0 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73 73 6f 63  1;.    sp->assoc
24100 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e   = UNK;.    sp->
24110 66 69 72 73 74 73 65 74 20 3d 20 30 3b 0a 20 20  firstset = 0;.  
24120 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c    sp->lambda = L
24130 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 20 20  EMON_FALSE;.    
24140 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 3d  sp->destructor =
24150 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73 74   0;.    sp->dest
24160 4c 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  Lineno = 0;.    
24170 73 70 2d 3e 64 61 74 61 74 79 70 65 20 3d 20 30  sp->datatype = 0
24180 3b 0a 20 20 20 20 73 70 2d 3e 75 73 65 43 6e 74  ;.    sp->useCnt
24190 20 3d 20 30 3b 0a 20 20 20 20 53 79 6d 62 6f 6c   = 0;.    Symbol
241a0 5f 69 6e 73 65 72 74 28 73 70 2c 73 70 2d 3e 6e  _insert(sp,sp->n
241b0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 70 2d 3e  ame);.  }.  sp->
241c0 75 73 65 43 6e 74 2b 2b 3b 0a 20 20 72 65 74 75  useCnt++;.  retu
241d0 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  rn sp;.}../* Com
241e0 70 61 72 65 20 74 77 6f 20 73 79 6d 62 6f 6c 73  pare two symbols
241f0 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72   for sorting pur
24200 70 6f 73 65 73 2e 20 20 52 65 74 75 72 6e 20 6e  poses.  Return n
24210 65 67 61 74 69 76 65 2c 0a 2a 2a 20 7a 65 72 6f  egative,.** zero
24220 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
24230 20 61 20 69 73 20 6c 65 73 73 20 74 68 65 6e 2c   a is less then,
24240 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
24250 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 62 2e  eater.** than b.
24260 0a 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 73 20 74  .**.** Symbols t
24270 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 75  hat begin with u
24280 70 70 65 72 20 63 61 73 65 20 6c 65 74 74 65 72  pper case letter
24290 73 20 28 74 65 72 6d 69 6e 61 6c 73 20 6f 72 20  s (terminals or 
242a0 74 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75 73 74 20  tokens).** must 
242b0 73 6f 72 74 20 62 65 66 6f 72 65 20 73 79 6d 62  sort before symb
242c0 6f 6c 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  ols that begin w
242d0 69 74 68 20 6c 6f 77 65 72 20 63 61 73 65 20 6c  ith lower case l
242e0 65 74 74 65 72 73 0a 2a 2a 20 28 6e 6f 6e 2d 74  etters.** (non-t
242f0 65 72 6d 69 6e 61 6c 73 29 2e 20 20 41 6e 64 20  erminals).  And 
24300 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 73 79  MULTITERMINAL sy
24310 6d 62 6f 6c 73 20 28 63 72 65 61 74 65 64 20 75  mbols (created u
24320 73 69 6e 67 20 74 68 65 0a 2a 2a 20 25 74 6f 6b  sing the.** %tok
24330 65 6e 5f 63 6c 61 73 73 20 64 69 72 65 63 74 69  en_class directi
24340 76 65 29 20 6d 75 73 74 20 73 6f 72 74 20 61 74  ve) must sort at
24350 20 74 68 65 20 76 65 72 79 20 65 6e 64 2e 20 4f   the very end. O
24360 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 61  ther than.** tha
24370 74 2c 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65  t, the order doe
24380 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 0a 2a 2a  s not matter..**
24390 0a 2a 2a 20 57 65 20 66 69 6e 64 20 65 78 70 65  .** We find expe
243a0 72 69 6d 65 6e 74 61 6c 6c 79 20 74 68 61 74 20  rimentally that 
243b0 6c 65 61 76 69 6e 67 20 74 68 65 20 73 79 6d 62  leaving the symb
243c0 6f 6c 73 20 69 6e 20 74 68 65 69 72 20 6f 72 69  ols in their ori
243d0 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65 72 20 28  ginal.** order (
243e0 74 68 65 20 6f 72 64 65 72 20 74 68 65 79 20 61  the order they a
243f0 70 70 65 61 72 65 64 20 69 6e 20 74 68 65 20 67  ppeared in the g
24400 72 61 6d 6d 61 72 20 66 69 6c 65 29 20 67 69 76  rammar file) giv
24410 65 73 20 74 68 65 0a 2a 2a 20 73 6d 61 6c 6c 65  es the.** smalle
24420 73 74 20 70 61 72 73 65 72 20 74 61 62 6c 65 73  st parser tables
24430 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 69   in SQLite..*/.i
24440 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63 6f  nt Symbolcmpp(co
24450 6e 73 74 20 76 6f 69 64 20 2a 5f 61 2c 20 63 6f  nst void *_a, co
24460 6e 73 74 20 76 6f 69 64 20 2a 5f 62 29 0a 7b 0a  nst void *_b).{.
24470 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
24480 79 6d 62 6f 6c 20 2a 61 20 3d 20 2a 28 63 6f 6e  ymbol *a = *(con
24490 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  st struct symbol
244a0 20 2a 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e 73 74   **) _a;.  const
244b0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
244c0 62 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75  b = *(const stru
244d0 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 5f 62  ct symbol **) _b
244e0 3b 0a 20 20 69 6e 74 20 69 31 20 3d 20 61 2d 3e  ;.  int i1 = a->
244f0 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
24500 4e 41 4c 20 3f 20 33 20 3a 20 61 2d 3e 6e 61 6d  NAL ? 3 : a->nam
24510 65 5b 30 5d 3e 27 5a 27 20 3f 20 32 20 3a 20 31  e[0]>'Z' ? 2 : 1
24520 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 62 2d 3e  ;.  int i2 = b->
24530 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
24540 4e 41 4c 20 3f 20 33 20 3a 20 62 2d 3e 6e 61 6d  NAL ? 3 : b->nam
24550 65 5b 30 5d 3e 27 5a 27 20 3f 20 32 20 3a 20 31  e[0]>'Z' ? 2 : 1
24560 3b 0a 20 20 72 65 74 75 72 6e 20 69 31 3d 3d 69  ;.  return i1==i
24570 32 20 3f 20 61 2d 3e 69 6e 64 65 78 20 2d 20 62  2 ? a->index - b
24580 2d 3e 69 6e 64 65 78 20 3a 20 69 31 20 2d 20 69  ->index : i1 - i
24590 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  2;.}../* There i
245a0 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
245b0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
245c0 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
245d0 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
245e0 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
245f0 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x2"..*/.struct 
24600 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x2 {.  int siz
24610 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
24620 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
24630 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
24640 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
24650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24660 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
24670 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
24680 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
24690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246a0 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
246b0 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
246c0 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
246d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
246e0 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
246f0 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
24700 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 74 62  uct s_x2node *tb
24710 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
24720 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
24730 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
24740 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
24750 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
24760 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
24770 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
24780 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
24790 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
247a0 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
247b0 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
247c0 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
247d0 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  2"..*/.typedef s
247e0 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 7b  truct s_x2node {
247f0 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
24800 20 2a 64 61 74 61 3b 20 20 20 20 20 2f 2a 20 54   *data;     /* T
24810 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 63 6f 6e  he data */.  con
24820 73 74 20 63 68 61 72 20 2a 6b 65 79 3b 20 20 20  st char *key;   
24830 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79        /* The key
24840 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
24850 32 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f  2node *next;   /
24860 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74  * Next entry wit
24870 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20  h the same hash 
24880 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32  */.  struct s_x2
24890 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a  node **from;  /*
248a0 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a   Previous link *
248b0 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20  /.} x2node;../* 
248c0 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e  There is only on
248d0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
248e0 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69  e array, which i
248f0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
24900 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
24910 20 73 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20   s_x2 *x2a;../* 
24920 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61  Allocate a new a
24930 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
24940 20 2a 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f   */.void Symbol_
24950 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 32  init(){.  if( x2
24960 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 32  a ) return;.  x2
24970 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 32  a = (struct s_x2
24980 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
24990 28 73 74 72 75 63 74 20 73 5f 78 32 29 20 29 3b  (struct s_x2) );
249a0 0a 20 20 69 66 28 20 78 32 61 20 29 7b 0a 20 20  .  if( x2a ){.  
249b0 20 20 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32    x2a->size = 12
249c0 38 3b 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e  8;.    x2a->coun
249d0 74 20 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e  t = 0;.    x2a->
249e0 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 63  tbl = (x2node*)c
249f0 61 6c 6c 6f 63 28 31 32 38 2c 20 73 69 7a 65 6f  alloc(128, sizeo
24a00 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x2node) + size
24a10 6f 66 28 78 32 6e 6f 64 65 2a 29 29 3b 0a 20 20  of(x2node*));.  
24a20 20 20 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d    if( x2a->tbl==
24a30 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
24a40 78 32 61 29 3b 0a 20 20 20 20 20 20 78 32 61 20  x2a);.      x2a 
24a50 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
24a60 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
24a70 20 20 20 78 32 61 2d 3e 68 74 20 3d 20 28 78 32     x2a->ht = (x2
24a80 6e 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62  node**)&(x2a->tb
24a90 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66  l[128]);.      f
24aa0 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69  or(i=0; i<128; i
24ab0 2b 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x2a->ht[i] =
24ac0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
24ad0 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
24ae0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
24af0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
24b00 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
24b10 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
24b20 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
24b30 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
24b40 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d  itten */.int Sym
24b50 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72 75 63  bol_insert(struc
24b60 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 2c 20  t symbol *data, 
24b70 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29  const char *key)
24b80 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b  .{.  x2node *np;
24b90 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20  .  unsigned h;. 
24ba0 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20   unsigned ph;.. 
24bb0 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65   if( x2a==0 ) re
24bc0 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73  turn 0;.  ph = s
24bd0 74 72 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68  trhash(key);.  h
24be0 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69   = ph & (x2a->si
24bf0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32  ze-1);.  np = x2
24c00 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
24c10 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
24c20 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c   strcmp(np->key,
24c30 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  key)==0 ){.     
24c40 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
24c50 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
24c60 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64  ame key is found
24c70 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61  . */.      /* Fa
24c80 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77  il because overw
24c90 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  rite is not allo
24ca0 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ws. */.      ret
24cb0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
24cc0 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
24cd0 20 20 7d 0a 20 20 69 66 28 20 78 32 61 2d 3e 63    }.  if( x2a->c
24ce0 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a 65 20  ount>=x2a->size 
24cf0 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  ){.    /* Need t
24d00 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
24d10 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a  table bigger */.
24d20 20 20 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a      int i,arrSiz
24d30 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f  e;.    struct s_
24d40 78 32 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72  x2 array;.    ar
24d50 72 61 79 2e 73 69 7a 65 20 3d 20 61 72 72 53 69  ray.size = arrSi
24d60 7a 65 20 3d 20 78 32 61 2d 3e 73 69 7a 65 2a 32  ze = x2a->size*2
24d70 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e  ;.    array.coun
24d80 74 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a  t = x2a->count;.
24d90 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20      array.tbl = 
24da0 28 78 32 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28  (x2node*)calloc(
24db0 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28  arrSize, sizeof(
24dc0 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x2node) + sizeof
24dd0 28 78 32 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20  (x2node*));.    
24de0 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30  if( array.tbl==0
24df0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
24e00 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c   Fail due to mal
24e10 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  loc failure */. 
24e20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78     array.ht = (x
24e30 32 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e  2node**)&(array.
24e40 74 62 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20  tbl[arrSize]);. 
24e50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72     for(i=0; i<ar
24e60 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  rSize; i++) arra
24e70 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  y.ht[i] = 0;.   
24e80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d   for(i=0; i<x2a-
24e90 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  >count; i++){.  
24ea0 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e      x2node *oldn
24eb0 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20  p, *newnp;.     
24ec0 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e   oldnp = &(x2a->
24ed0 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68  tbl[i]);.      h
24ee0 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70   = strhash(oldnp
24ef0 2d 3e 6b 65 79 29 20 26 20 28 61 72 72 53 69 7a  ->key) & (arrSiz
24f00 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
24f10 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
24f20 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
24f30 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
24f40 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
24f50 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
24f60 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
24f70 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
24f80 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b  ;.      newnp->k
24f90 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b  ey = oldnp->key;
24fa0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
24fb0 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
24fc0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
24fd0 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
24fe0 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
24ff0 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
25000 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
25010 78 32 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x2a->tbl);.    *
25020 78 32 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x2a = array;.  }
25030 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
25040 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
25050 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69   = ph & (x2a->si
25060 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
25070 78 32 61 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f  x2a->tbl[x2a->co
25080 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b  unt++]);.  np->k
25090 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e  ey = key;.  np->
250a0 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
250b0 66 28 20 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x2a->ht[h] ) 
250c0 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x2a->ht[h]->from
250d0 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
250e0 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61    np->next = x2a
250f0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e  ->ht[h];.  x2a->
25100 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
25110 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e  ->from = &(x2a->
25120 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
25130 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
25140 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
25150 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
25160 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
25170 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
25180 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
25190 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
251a0 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73  Symbol_find(cons
251b0 74 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20  t char *key).{. 
251c0 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 78   unsigned h;.  x
251d0 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  2node *np;..  if
251e0 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x2a==0 ) retur
251f0 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61  n 0;.  h = strha
25200 73 68 28 6b 65 79 29 20 26 20 28 78 32 61 2d 3e  sh(key) & (x2a->
25210 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
25220 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x2a->ht[h];.  wh
25230 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
25240 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65  f( strcmp(np->ke
25250 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61  y,key)==0 ) brea
25260 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e  k;.    np = np->
25270 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  next;.  }.  retu
25280 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61  rn np ? np->data
25290 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75   : 0;.}../* Retu
252a0 72 6e 20 74 68 65 20 6e 2d 74 68 20 64 61 74 61  rn the n-th data
252b0 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
252c0 66 20 6e 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f n is out of ra
252d0 6e 67 65 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  nge. */.struct s
252e0 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74  ymbol *Symbol_Nt
252f0 68 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73 74 72  h(int n).{.  str
25300 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61  uct symbol *data
25310 3b 0a 20 20 69 66 28 20 78 32 61 20 26 26 20 6e  ;.  if( x2a && n
25320 3e 30 20 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f  >0 && n<=x2a->co
25330 75 6e 74 20 29 7b 0a 20 20 20 20 64 61 74 61 20  unt ){.    data 
25340 3d 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e  = x2a->tbl[n-1].
25350 64 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  data;.  }else{. 
25360 20 20 20 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d     data = 0;.  }
25370 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61 3b 0a  .  return data;.
25380 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
25390 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
253a0 61 79 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c  ay */.int Symbol
253b0 5f 63 6f 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74  _count().{.  ret
253c0 75 72 6e 20 78 32 61 20 3f 20 78 32 61 2d 3e 63  urn x2a ? x2a->c
253d0 6f 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  ount : 0;.}../* 
253e0 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20  Return an array 
253f0 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  of pointers to a
25400 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  ll data in the t
25410 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72  able..** The arr
25420 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ay is obtained f
25430 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74  rom malloc.  Ret
25440 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f  urn NULL if memo
25450 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
25460 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66   problems, or if
25470 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65 6d   the array is em
25480 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  pty. */.struct s
25490 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61  ymbol **Symbol_a
254a0 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72  rrayof().{.  str
254b0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72  uct symbol **arr
254c0 61 79 3b 0a 20 20 69 6e 74 20 69 2c 61 72 72 53  ay;.  int i,arrS
254d0 69 7a 65 3b 0a 20 20 69 66 28 20 78 32 61 3d 3d  ize;.  if( x2a==
254e0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
254f0 61 72 72 53 69 7a 65 20 3d 20 78 32 61 2d 3e 63  arrSize = x2a->c
25500 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20  ount;.  array = 
25510 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
25520 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65  *)calloc(arrSize
25530 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  , sizeof(struct 
25540 73 79 6d 62 6f 6c 20 2a 29 29 3b 0a 20 20 69 66  symbol *));.  if
25550 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66  ( array ){.    f
25560 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a  or(i=0; i<arrSiz
25570 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d  e; i++) array[i]
25580 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64   = x2a->tbl[i].d
25590 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ata;.  }.  retur
255a0 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43  n array;.}../* C
255b0 6f 6d 70 61 72 65 20 74 77 6f 20 63 6f 6e 66 69  ompare two confi
255c0 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74  gurations */.int
255d0 20 43 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73 74   Configcmp(const
255e0 20 63 68 61 72 20 2a 5f 61 2c 63 6f 6e 73 74 20   char *_a,const 
255f0 63 68 61 72 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f  char *_b).{.  co
25600 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6e 66 69  nst struct confi
25610 67 20 2a 61 20 3d 20 28 73 74 72 75 63 74 20 63  g *a = (struct c
25620 6f 6e 66 69 67 20 2a 29 20 5f 61 3b 0a 20 20 63  onfig *) _a;.  c
25630 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6e 66  onst struct conf
25640 69 67 20 2a 62 20 3d 20 28 73 74 72 75 63 74 20  ig *b = (struct 
25650 63 6f 6e 66 69 67 20 2a 29 20 5f 62 3b 0a 20 20  config *) _b;.  
25660 69 6e 74 20 78 3b 0a 20 20 78 20 3d 20 61 2d 3e  int x;.  x = a->
25670 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72  rp->index - b->r
25680 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  p->index;.  if( 
25690 78 3d 3d 30 20 29 20 78 20 3d 20 61 2d 3e 64 6f  x==0 ) x = a->do
256a0 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 72 65  t - b->dot;.  re
256b0 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f  turn x;.}../* Co
256c0 6d 70 61 72 65 20 74 77 6f 20 73 74 61 74 65 73  mpare two states
256d0 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20   */.PRIVATE int 
256e0 73 74 61 74 65 63 6d 70 28 73 74 72 75 63 74 20  statecmp(struct 
256f0 63 6f 6e 66 69 67 20 2a 61 2c 20 73 74 72 75 63  config *a, struc
25700 74 20 63 6f 6e 66 69 67 20 2a 62 29 0a 7b 0a 20  t config *b).{. 
25710 20 69 6e 74 20 72 63 3b 0a 20 20 66 6f 72 28 72   int rc;.  for(r
25720 63 3d 30 3b 20 72 63 3d 3d 30 20 26 26 20 61 20  c=0; rc==0 && a 
25730 26 26 20 62 3b 20 20 61 3d 61 2d 3e 62 70 2c 20  && b;  a=a->bp, 
25740 62 3d 62 2d 3e 62 70 29 7b 0a 20 20 20 20 72 63  b=b->bp){.    rc
25750 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20   = a->rp->index 
25760 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a  - b->rp->index;.
25770 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
25780 72 63 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d  rc = a->dot - b-
25790 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >dot;.  }.  if( 
257a0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
257b0 20 61 20 29 20 72 63 20 3d 20 31 3b 0a 20 20 20   a ) rc = 1;.   
257c0 20 69 66 28 20 62 20 29 20 72 63 20 3d 20 2d 31   if( b ) rc = -1
257d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
257e0 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20  c;.}../* Hash a 
257f0 73 74 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45  state */.PRIVATE
25800 20 75 6e 73 69 67 6e 65 64 20 73 74 61 74 65 68   unsigned stateh
25810 61 73 68 28 73 74 72 75 63 74 20 63 6f 6e 66 69  ash(struct confi
25820 67 20 2a 61 29 0a 7b 0a 20 20 75 6e 73 69 67 6e  g *a).{.  unsign
25830 65 64 20 68 3d 30 3b 0a 20 20 77 68 69 6c 65 28  ed h=0;.  while(
25840 20 61 20 29 7b 0a 20 20 20 20 68 20 3d 20 68 2a   a ){.    h = h*
25850 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64  571 + a->rp->ind
25860 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a  ex*37 + a->dot;.
25870 20 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b 0a 20      a = a->bp;. 
25880 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d   }.  return h;.}
25890 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
258a0 6e 65 77 20 73 74 61 74 65 20 73 74 72 75 63 74  new state struct
258b0 75 72 65 20 2a 2f 0a 73 74 72 75 63 74 20 73 74  ure */.struct st
258c0 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 29  ate *State_new()
258d0 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  .{.  struct stat
258e0 65 20 2a 6e 65 77 73 74 61 74 65 3b 0a 20 20 6e  e *newstate;.  n
258f0 65 77 73 74 61 74 65 20 3d 20 28 73 74 72 75 63  ewstate = (struc
25900 74 20 73 74 61 74 65 20 2a 29 63 61 6c 6c 6f 63  t state *)calloc
25910 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63  (1, sizeof(struc
25920 74 20 73 74 61 74 65 29 20 29 3b 0a 20 20 4d 65  t state) );.  Me
25930 6d 6f 72 79 43 68 65 63 6b 28 6e 65 77 73 74 61  moryCheck(newsta
25940 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65  te);.  return ne
25950 77 73 74 61 74 65 3b 0a 7d 0a 0a 2f 2a 20 54 68  wstate;.}../* Th
25960 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
25970 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
25980 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
25990 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
259a0 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
259b0 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73 74  type "x3"..*/.st
259c0 72 75 63 74 20 73 5f 78 33 20 7b 0a 20 20 69 6e  ruct s_x3 {.  in
259d0 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
259e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
259f0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
25a00 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
25a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
25a30 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
25a40 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
25a50 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
25a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
25a70 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
25a80 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
25a90 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
25aa0 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
25ab0 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
25ac0 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
25ad0 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
25ae0 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
25af0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
25b00 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  3node **ht;  /* 
25b10 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
25b20 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
25b30 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
25b40 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
25b50 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
25b60 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
25b70 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
25b80 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
25b90 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x3"..*/.type
25ba0 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 33 6e  def struct s_x3n
25bb0 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ode {.  struct s
25bc0 74 61 74 65 20 2a 64 61 74 61 3b 20 20 20 20 20  tate *data;     
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25be0 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74  The data */.  st
25bf0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
25c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25c10 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
25c20 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
25c30 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
25c40 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
25c50 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
25c60 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  .  struct s_x3no
25c70 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
25c80 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
25c90 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x3node;../* Th
25ca0 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
25cb0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
25cc0 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
25cd0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
25ce0 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
25cf0 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c  _x3 *x3a;../* Al
25d00 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
25d10 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
25d20 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69  /.void State_ini
25d30 74 28 29 7b 0a 20 20 69 66 28 20 78 33 61 20 29  t(){.  if( x3a )
25d40 20 72 65 74 75 72 6e 3b 0a 20 20 78 33 61 20 3d   return;.  x3a =
25d50 20 28 73 74 72 75 63 74 20 73 5f 78 33 2a 29 6d   (struct s_x3*)m
25d60 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
25d70 72 75 63 74 20 73 5f 78 33 29 20 29 3b 0a 20 20  ruct s_x3) );.  
25d80 69 66 28 20 78 33 61 20 29 7b 0a 20 20 20 20 78  if( x3a ){.    x
25d90 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a  3a->size = 128;.
25da0 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e 74 20 3d      x3a->count =
25db0 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e 74 62 6c   0;.    x3a->tbl
25dc0 20 3d 20 28 78 33 6e 6f 64 65 2a 29 63 61 6c 6c   = (x3node*)call
25dd0 6f 63 28 31 32 38 2c 20 73 69 7a 65 6f 66 28 78  oc(128, sizeof(x
25de0 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  3node) + sizeof(
25df0 78 33 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69  x3node*));.    i
25e00 66 28 20 78 33 61 2d 3e 74 62 6c 3d 3d 30 20 29  f( x3a->tbl==0 )
25e10 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 33 61  {.      free(x3a
25e20 29 3b 0a 20 20 20 20 20 20 78 33 61 20 3d 20 30  );.      x3a = 0
25e30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25e40 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
25e50 78 33 61 2d 3e 68 74 20 3d 20 28 78 33 6e 6f 64  x3a->ht = (x3nod
25e60 65 2a 2a 29 26 28 78 33 61 2d 3e 74 62 6c 5b 31  e**)&(x3a->tbl[1
25e70 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  28]);.      for(
25e80 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29  i=0; i<128; i++)
25e90 20 78 33 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b   x3a->ht[i] = 0;
25ea0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20  .    }.  }.}./* 
25eb0 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
25ec0 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72  ord into the arr
25ed0 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ay.  Return TRUE
25ee0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
25ef0 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69  ** Prior data wi
25f00 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
25f10 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74  is NOT overwritt
25f20 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 61 74 65 5f  en */.int State_
25f30 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 73 74  insert(struct st
25f40 61 74 65 20 2a 64 61 74 61 2c 20 73 74 72 75 63  ate *data, struc
25f50 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b  t config *key).{
25f60 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 20  .  x3node *np;. 
25f70 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75   unsigned h;.  u
25f80 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69  nsigned ph;..  i
25f90 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75  f( x3a==0 ) retu
25fa0 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 61  rn 0;.  ph = sta
25fb0 74 65 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68  tehash(key);.  h
25fc0 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73 69   = ph & (x3a->si
25fd0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33  ze-1);.  np = x3
25fe0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
25ff0 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
26000 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65   statecmp(np->ke
26010 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  y,key)==0 ){.   
26020 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
26030 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  g entry with the
26040 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75   same key is fou
26050 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  nd. */.      /* 
26060 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65  Fail because ove
26070 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c  rwrite is not al
26080 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lows. */.      r
26090 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
260a0 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
260b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 33 61 2d  ;.  }.  if( x3a-
260c0 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d 3e 73 69 7a  >count>=x3a->siz
260d0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  e ){.    /* Need
260e0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
260f0 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a  h table bigger *
26100 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61 72 72 53  /.    int i,arrS
26110 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ize;.    struct 
26120 73 5f 78 33 20 61 72 72 61 79 3b 0a 20 20 20 20  s_x3 array;.    
26130 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 61 72 72  array.size = arr
26140 53 69 7a 65 20 3d 20 78 33 61 2d 3e 73 69 7a 65  Size = x3a->size
26150 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f  *2;.    array.co
26160 75 6e 74 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74  unt = x3a->count
26170 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20  ;.    array.tbl 
26180 3d 20 28 78 33 6e 6f 64 65 2a 29 63 61 6c 6c 6f  = (x3node*)callo
26190 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f  c(arrSize, sizeo
261a0 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x3node) + size
261b0 6f 66 28 78 33 6e 6f 64 65 2a 29 29 3b 0a 20 20  of(x3node*));.  
261c0 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d    if( array.tbl=
261d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
261e0 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d  /* Fail due to m
261f0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f  alloc failure */
26200 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20  .    array.ht = 
26210 28 78 33 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61  (x3node**)&(arra
26220 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d 29 3b  y.tbl[arrSize]);
26230 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
26240 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72  arrSize; i++) ar
26250 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  ray.ht[i] = 0;. 
26260 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 33     for(i=0; i<x3
26270 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a  a->count; i++){.
26280 20 20 20 20 20 20 78 33 6e 6f 64 65 20 2a 6f 6c        x3node *ol
26290 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20  dnp, *newnp;.   
262a0 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 33 61     oldnp = &(x3a
262b0 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  ->tbl[i]);.     
262c0 20 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6f   h = statehash(o
262d0 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 61 72  ldnp->key) & (ar
262e0 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  rSize-1);.      
262f0 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e  newnp = &(array.
26300 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  tbl[i]);.      i
26310 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29  f( array.ht[h] )
26320 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72   array.ht[h]->fr
26330 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65  om = &(newnp->ne
26340 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  xt);.      newnp
26350 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68  ->next = array.h
26360 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e  t[h];.      newn
26370 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e  p->key = oldnp->
26380 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  key;.      newnp
26390 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e  ->data = oldnp->
263a0 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e  data;.      newn
263b0 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61  p->from = &(arra
263c0 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20  y.ht[h]);.      
263d0 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65  array.ht[h] = ne
263e0 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  wnp;.    }.    f
263f0 72 65 65 28 78 33 61 2d 3e 74 62 6c 29 3b 0a 20  ree(x3a->tbl);. 
26400 20 20 20 2a 78 33 61 20 3d 20 61 72 72 61 79 3b     *x3a = array;
26410 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74  .  }.  /* Insert
26420 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f   the new data */
26430 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33 61  .  h = ph & (x3a
26440 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
26450 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 78 33 61  = &(x3a->tbl[x3a
26460 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e  ->count++]);.  n
26470 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20  p->key = key;.  
26480 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b  np->data = data;
26490 0a 20 20 69 66 28 20 78 33 61 2d 3e 68 74 5b 68  .  if( x3a->ht[h
264a0 5d 20 29 20 78 33 61 2d 3e 68 74 5b 68 5d 2d 3e  ] ) x3a->ht[h]->
264b0 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78  from = &(np->nex
264c0 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d  t);.  np->next =
264d0 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78   x3a->ht[h];.  x
264e0 33 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a  3a->ht[h] = np;.
264f0 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78    np->from = &(x
26500 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65  3a->ht[h]);.  re
26510 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65  turn 1;.}../* Re
26520 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
26530 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20  o data assigned 
26540 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79  to the given key
26550 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a  .  Return NULL.*
26560 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79  * if no such key
26570 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74  . */.struct stat
26580 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 73 74  e *State_find(st
26590 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
265a0 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68  ).{.  unsigned h
265b0 3b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a  ;.  x3node *np;.
265c0 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20  .  if( x3a==0 ) 
265d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20  return 0;.  h = 
265e0 73 74 61 74 65 68 61 73 68 28 6b 65 79 29 20 26  statehash(key) &
265f0 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x3a->size-1);.
26600 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68    np = x3a->ht[h
26610 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
26620 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74 65 63  {.    if( statec
26630 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d  mp(np->key,key)=
26640 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
26650 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
26660 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f   }.  return np ?
26670 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d   np->data : 0;.}
26680 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  ../* Return an a
26690 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
266a0 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e 20   to all data in 
266b0 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  the table..** Th
266c0 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69  e array is obtai
266d0 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
266e0 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
266f0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
26700 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20  on.** problems, 
26710 6f 72 20 69 66 20 74 68 65 20 61 72 72 61 79 20  or if the array 
26720 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72  is empty. */.str
26730 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74  uct state **Stat
26740 65 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20  e_arrayof().{.  
26750 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 61  struct state **a
26760 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 61 72  rray;.  int i,ar
26770 72 53 69 7a 65 3b 0a 20 20 69 66 28 20 78 33 61  rSize;.  if( x3a
26780 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
26790 20 20 61 72 72 53 69 7a 65 20 3d 20 78 33 61 2d    arrSize = x3a-
267a0 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20  >count;.  array 
267b0 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20  = (struct state 
267c0 2a 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a  **)calloc(arrSiz
267d0 65 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  e, sizeof(struct
267e0 20 73 74 61 74 65 20 2a 29 29 3b 0a 20 20 69 66   state *));.  if
267f0 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66  ( array ){.    f
26800 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a  or(i=0; i<arrSiz
26810 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d  e; i++) array[i]
26820 20 3d 20 78 33 61 2d 3e 74 62 6c 5b 69 5d 2e 64   = x3a->tbl[i].d
26830 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ata;.  }.  retur
26840 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 48  n array;.}../* H
26850 61 73 68 20 61 20 63 6f 6e 66 69 67 75 72 61 74  ash a configurat
26860 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 75  ion */.PRIVATE u
26870 6e 73 69 67 6e 65 64 20 63 6f 6e 66 69 67 68 61  nsigned configha
26880 73 68 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  sh(struct config
26890 20 2a 61 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65   *a).{.  unsigne
268a0 64 20 68 3d 30 3b 0a 20 20 68 20 3d 20 68 2a 35  d h=0;.  h = h*5
268b0 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65  71 + a->rp->inde
268c0 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20  x*37 + a->dot;. 
268d0 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a   return h;.}../*
268e0 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
268f0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
26900 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
26910 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73  e for each.** as
26920 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
26930 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f  of type "x4"..*/
26940 0a 73 74 72 75 63 74 20 73 5f 78 34 20 7b 0a 20  .struct s_x4 {. 
26950 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
26960 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26970 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
26980 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20  ble slots. */.  
26990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269a0 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73          /*   Mus
269b0 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
269c0 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  2 greater than o
269d0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  r */.           
269e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
269f0 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a  *   equal to 1 *
26a00 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20  /.  int count;  
26a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26a20 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74  umber of current
26a30 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20  ly slots filled 
26a40 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34  */.  struct s_x4
26a50 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54  node *tbl;  /* T
26a60 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68  he data stored h
26a70 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ere */.  struct 
26a80 73 5f 78 34 6e 6f 64 65 20 2a 2a 68 74 3b 20 20  s_x4node **ht;  
26a90 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f  /* Hash table fo
26aa0 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a  r lookups */.};.
26ab0 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
26ac0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
26ad0 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  s structure for 
26ae0 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65  every data eleme
26af0 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f  nt.** in an asso
26b00 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
26b10 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 74   type "x4"..*/.t
26b20 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f  ypedef struct s_
26b30 78 34 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63  x4node {.  struc
26b40 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b 20  t config *data; 
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b60 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
26b70 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64    struct s_x4nod
26b80 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65  e *next;   /* Ne
26b90 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  xt entry with th
26ba0 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20  e same hash */. 
26bb0 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65   struct s_x4node
26bc0 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65   **from;  /* Pre
26bd0 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20  vious link */.} 
26be0 78 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72  x4node;../* Ther
26bf0 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e  e is only one in
26c00 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72  stance of the ar
26c10 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68  ray, which is th
26c20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
26c30 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78  tatic struct s_x
26c40 34 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f  4 *x4a;../* Allo
26c50 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63  cate a new assoc
26c60 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a  iative array */.
26c70 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65  void Configtable
26c80 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78  _init(){.  if( x
26c90 34 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  4a ) return;.  x
26ca0 34 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78  4a = (struct s_x
26cb0 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  4*)malloc( sizeo
26cc0 66 28 73 74 72 75 63 74 20 73 5f 78 34 29 20 29  f(struct s_x4) )
26cd0 3b 0a 20 20 69 66 28 20 78 34 61 20 29 7b 0a 20  ;.  if( x4a ){. 
26ce0 20 20 20 78 34 61 2d 3e 73 69 7a 65 20 3d 20 36     x4a->size = 6
26cf0 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63 6f 75 6e  4;.    x4a->coun
26d00 74 20 3d 20 30 3b 0a 20 20 20 20 78 34 61 2d 3e  t = 0;.    x4a->
26d10 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 63  tbl = (x4node*)c
26d20 61 6c 6c 6f 63 28 36 34 2c 20 73 69 7a 65 6f 66  alloc(64, sizeof
26d30 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x4node) + sizeo
26d40 66 28 78 34 6e 6f 64 65 2a 29 29 3b 0a 20 20 20  f(x4node*));.   
26d50 20 69 66 28 20 78 34 61 2d 3e 74 62 6c 3d 3d 30   if( x4a->tbl==0
26d60 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78   ){.      free(x
26d70 34 61 29 3b 0a 20 20 20 20 20 20 78 34 61 20 3d  4a);.      x4a =
26d80 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
26d90 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
26da0 20 20 78 34 61 2d 3e 68 74 20 3d 20 28 78 34 6e    x4a->ht = (x4n
26db0 6f 64 65 2a 2a 29 26 28 78 34 61 2d 3e 74 62 6c  ode**)&(x4a->tbl
26dc0 5b 36 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  [64]);.      for
26dd0 28 69 3d 30 3b 20 69 3c 36 34 3b 20 69 2b 2b 29  (i=0; i<64; i++)
26de0 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b   x4a->ht[i] = 0;
26df0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20  .    }.  }.}./* 
26e00 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
26e10 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72  ord into the arr
26e20 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ay.  Return TRUE
26e30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
26e40 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69  ** Prior data wi
26e50 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
26e60 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74  is NOT overwritt
26e70 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67  en */.int Config
26e80 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 73 74 72  table_insert(str
26e90 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61  uct config *data
26ea0 29 0a 7b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70  ).{.  x4node *np
26eb0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a  ;.  unsigned h;.
26ec0 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a    unsigned ph;..
26ed0 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72    if( x4a==0 ) r
26ee0 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20  eturn 0;.  ph = 
26ef0 63 6f 6e 66 69 67 68 61 73 68 28 64 61 74 61 29  confighash(data)
26f00 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 34  ;.  h = ph & (x4
26f10 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
26f20 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x4a->ht[h];. 
26f30 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
26f40 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28    if( Configcmp(
26f50 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6e  (const char *) n
26f60 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20 63  p->data,(const c
26f70 68 61 72 20 2a 29 20 64 61 74 61 29 3d 3d 30 20  har *) data)==0 
26f80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ){.      /* An e
26f90 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69  xisting entry wi
26fa0 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
26fb0 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20  is found. */.   
26fc0 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75     /* Fail becau
26fd0 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20  se overwrite is 
26fe0 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20  not allows. */. 
26ff0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
27000 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70     }.    np = np
27010 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  ->next;.  }.  if
27020 28 20 78 34 61 2d 3e 63 6f 75 6e 74 3e 3d 78 34  ( x4a->count>=x4
27030 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f  a->size ){.    /
27040 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74  * Need to make t
27050 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69  he hash table bi
27060 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  gger */.    int 
27070 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20 20 73  i,arrSize;.    s
27080 74 72 75 63 74 20 73 5f 78 34 20 61 72 72 61 79  truct s_x4 array
27090 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65  ;.    array.size
270a0 20 3d 20 61 72 72 53 69 7a 65 20 3d 20 78 34 61   = arrSize = x4a
270b0 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72  ->size*2;.    ar
270c0 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 34 61 2d  ray.count = x4a-
270d0 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61  >count;.    arra
270e0 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a  y.tbl = (x4node*
270f0 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c  )calloc(arrSize,
27100 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20   sizeof(x4node) 
27110 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a  + sizeof(x4node*
27120 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61  ));.    if( arra
27130 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72  y.tbl==0 ) retur
27140 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75  n 0;  /* Fail du
27150 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e to malloc fail
27160 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79  ure */.    array
27170 2e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29  .ht = (x4node**)
27180 26 28 61 72 72 61 79 2e 74 62 6c 5b 61 72 72 53  &(array.tbl[arrS
27190 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  ize]);.    for(i
271a0 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69  =0; i<arrSize; i
271b0 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20  ++) array.ht[i] 
271c0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
271d0 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x4a->count; 
271e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 34 6e 6f  i++){.      x4no
271f0 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e  de *oldnp, *newn
27200 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d  p;.      oldnp =
27210 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 29 3b   &(x4a->tbl[i]);
27220 0a 20 20 20 20 20 20 68 20 3d 20 63 6f 6e 66 69  .      h = confi
27230 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74  ghash(oldnp->dat
27240 61 29 20 26 20 28 61 72 72 53 69 7a 65 2d 31 29  a) & (arrSize-1)
27250 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20  ;.      newnp = 
27260 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b  &(array.tbl[i]);
27270 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79  .      if( array
27280 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68  .ht[h] ) array.h
27290 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
272a0 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  ewnp->next);.   
272b0 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d     newnp->next =
272c0 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20   array.ht[h];.  
272d0 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
272e0 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
272f0 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
27300 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
27310 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
27320 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
27330 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 34 61    }.    free(x4a
27340 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34 61  ->tbl);.    *x4a
27350 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
27360 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
27370 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
27380 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d  ph & (x4a->size-
27390 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34 61  1);.  np = &(x4a
273a0 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74  ->tbl[x4a->count
273b0 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61  ++]);.  np->data
273c0 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78   = data;.  if( x
273d0 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61 2d  4a->ht[h] ) x4a-
273e0 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  >ht[h]->from = &
273f0 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70  (np->next);.  np
27400 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68 74  ->next = x4a->ht
27410 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b 68  [h];.  x4a->ht[h
27420 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72  ] = np;.  np->fr
27430 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b 68  om = &(x4a->ht[h
27440 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ]);.  return 1;.
27450 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
27460 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61  ointer to data a
27470 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67  ssigned to the g
27480 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72  iven key.  Retur
27490 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20  n NULL.** if no 
274a0 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72  such key. */.str
274b0 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
274c0 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74 72  igtable_find(str
274d0 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29  uct config *key)
274e0 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 34  .{.  int h;.  x4
274f0 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28  node *np;..  if(
27500 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x4a==0 ) return
27510 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69 67   0;.  h = config
27520 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 34 61  hash(key) & (x4a
27530 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
27540 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x4a->ht[h];.  
27550 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
27560 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 28   if( Configcmp((
27570 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6e 70  const char *) np
27580 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20 63 68  ->data,(const ch
27590 61 72 20 2a 29 20 6b 65 79 29 3d 3d 30 20 29 20  ar *) key)==0 ) 
275a0 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20  break;.    np = 
275b0 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
275c0 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e  return np ? np->
275d0 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  data : 0;.}../* 
275e0 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61 20  Remove all data 
275f0 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e 20  from the table. 
27600 20 50 61 73 73 20 65 61 63 68 20 64 61 74 61 20   Pass each data 
27610 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
27620 22 66 22 0a 2a 2a 20 61 73 20 69 74 20 69 73 20  "f".** as it is 
27630 72 65 6d 6f 76 65 64 2e 20 20 28 22 66 22 20 6d  removed.  ("f" m
27640 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61 76  ay be null to av
27650 6f 69 64 20 74 68 69 73 20 73 74 65 70 2e 29 20  oid this step.) 
27660 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  */.void Configta
27670 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74 28 2a 66  ble_clear(int(*f
27680 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  )(struct config 
27690 2a 29 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *)).{.  int i;. 
276a0 20 69 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20 78   if( x4a==0 || x
276b0 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20 72  4a->count==0 ) r
276c0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 66 20 29  eturn;.  if( f )
276d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d   for(i=0; i<x4a-
276e0 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a 66  >count; i++) (*f
276f0 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61  )(x4a->tbl[i].da
27700 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ta);.  for(i=0; 
27710 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b  i<x4a->size; i++
27720 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x4a->ht[i] = 0
27730 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d  ;.  x4a->count =
27740 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.