/ Hex Artifact Content
Login

Artifact d92031adf63377ff5055441c9d26a41a03378e8cac8dbcc1cd6ef7190f51aa6a:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0190: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
01a0: 0a 23 64 65 66 69 6e 65 20 49 53 53 50 41 43 45  .#define ISSPACE
01b0: 28 58 29 20 69 73 73 70 61 63 65 28 28 75 6e 73  (X) isspace((uns
01c0: 69 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a  igned char)(X)).
01d0: 23 64 65 66 69 6e 65 20 49 53 44 49 47 49 54 28  #define ISDIGIT(
01e0: 58 29 20 69 73 64 69 67 69 74 28 28 75 6e 73 69  X) isdigit((unsi
01f0: 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23  gned char)(X)).#
0200: 64 65 66 69 6e 65 20 49 53 41 4c 4e 55 4d 28 58  define ISALNUM(X
0210: 29 20 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67  ) isalnum((unsig
0220: 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64  ned char)(X)).#d
0230: 65 66 69 6e 65 20 49 53 41 4c 50 48 41 28 58 29  efine ISALPHA(X)
0240: 20 69 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e   isalpha((unsign
0250: 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65  ed char)(X)).#de
0260: 66 69 6e 65 20 49 53 55 50 50 45 52 28 58 29 20  fine ISUPPER(X) 
0270: 69 73 75 70 70 65 72 28 28 75 6e 73 69 67 6e 65  isupper((unsigne
0280: 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65 66  d char)(X)).#def
0290: 69 6e 65 20 49 53 4c 4f 57 45 52 28 58 29 20 69  ine ISLOWER(X) i
02a0: 73 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65 64  slower((unsigned
02b0: 20 63 68 61 72 29 28 58 29 29 0a 0a 0a 23 69 66   char)(X))...#if
02c0: 6e 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  ndef __WIN32__.#
02d0: 20 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 57     if defined(_W
02e0: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
02f0: 28 57 49 4e 33 32 29 0a 23 20 20 20 20 20 20 20  (WIN32).#       
0300: 64 65 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f  define __WIN32__
0310: 0a 23 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  .#   endif.#endi
0320: 66 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33  f..#ifdef __WIN3
0330: 32 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c  2__.#ifdef __cpl
0340: 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20 22 43  usplus.extern "C
0350: 22 20 7b 0a 23 65 6e 64 69 66 0a 65 78 74 65 72  " {.#endif.exter
0360: 6e 20 69 6e 74 20 61 63 63 65 73 73 28 63 6f 6e  n int access(con
0370: 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 69  st char *path, i
0380: 6e 74 20 6d 6f 64 65 29 3b 0a 23 69 66 64 65 66  nt mode);.#ifdef
0390: 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 7d 0a 23   __cplusplus.}.#
03a0: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 6e 63  endif.#else.#inc
03b0: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
03c0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66 69  #endif../* #defi
03d0: 6e 65 20 50 52 49 56 41 54 45 20 73 74 61 74 69  ne PRIVATE stati
03e0: 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 49  c */.#define PRI
03f0: 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54 45 53  VATE..#ifdef TES
0400: 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48 53  T.#define MAXRHS
0410: 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20   5       /* Set 
0420: 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73 65 20  low to exercise 
0430: 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65 20 2a  exception code *
0440: 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  /.#else.#define 
0450: 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65 6e 64  MAXRHS 1000.#end
0460: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  if..static int s
0470: 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e  howPrecedenceCon
0480: 66 6c 69 63 74 20 3d 20 30 3b 0a 73 74 61 74 69  flict = 0;.stati
0490: 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 63 68  c char *msort(ch
04a0: 61 72 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 28 2a  ar*,char**,int(*
04b0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
04c0: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a  nst char*));../*
04d0: 0a 2a 2a 20 43 6f 6d 70 69 6c 65 72 73 20 61 72  .** Compilers ar
04e0: 65 20 67 65 74 74 69 6e 67 20 69 6e 63 72 65 61  e getting increa
04f0: 73 69 6e 67 6c 79 20 70 65 64 61 6e 74 69 63 20  singly pedantic 
0500: 61 62 6f 75 74 20 74 79 70 65 20 63 6f 6e 76 65  about type conve
0510: 72 73 69 6f 6e 73 0a 2a 2a 20 61 73 20 43 20 65  rsions.** as C e
0520: 76 6f 6c 76 65 73 20 65 76 65 72 20 63 6c 6f 73  volves ever clos
0530: 65 72 20 74 6f 20 41 64 61 2e 2e 2e 2e 20 20 54  er to Ada....  T
0540: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
0550: 65 20 6c 61 74 65 73 74 20 70 72 6f 62 6c 65 6d  e latest problem
0560: 73 0a 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20  s.** we have to 
0570: 64 65 66 69 6e 65 20 74 68 65 20 66 6f 6c 6c 6f  define the follo
0580: 77 69 6e 67 20 76 61 72 69 61 6e 74 20 6f 66 20  wing variant of 
0590: 73 74 72 6c 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65  strlen()..*/.#de
05a0: 66 69 6e 65 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  fine lemonStrlen
05b0: 28 58 29 20 20 20 28 28 69 6e 74 29 73 74 72 6c  (X)   ((int)strl
05c0: 65 6e 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f  en(X))../*.** Co
05d0: 6d 70 69 6c 65 72 73 20 61 72 65 20 73 74 61 72  mpilers are star
05e0: 74 69 6e 67 20 74 6f 20 63 6f 6d 70 6c 61 69 6e  ting to complain
05f0: 20 61 62 6f 75 74 20 74 68 65 20 75 73 65 20 6f   about the use o
0600: 66 20 73 70 72 69 6e 74 66 28 29 20 61 6e 64 20  f sprintf() and 
0610: 73 74 72 63 70 79 28 29 2c 0a 2a 2a 20 73 61 79  strcpy(),.** say
0620: 69 6e 67 20 74 68 65 79 20 61 72 65 20 75 6e 73  ing they are uns
0630: 61 66 65 2e 20 20 53 6f 20 77 65 20 64 65 66 69  afe.  So we defi
0640: 6e 65 20 6f 75 72 20 6f 77 6e 20 76 65 72 73 69  ne our own versi
0650: 6f 6e 73 20 6f 66 20 74 68 6f 73 65 20 72 6f 75  ons of those rou
0660: 74 69 6e 65 73 20 74 6f 6f 2e 0a 2a 2a 0a 2a 2a  tines too..**.**
0670: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
0680: 20 72 6f 75 74 69 6e 65 73 20 68 65 72 65 3a 20   routines here: 
0690: 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 29   lemon_sprintf()
06a0: 2c 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74 66  , lemon_vsprintf
06b0: 28 29 2c 20 61 6e 64 0a 2a 2a 20 6c 65 6d 6f 6e  (), and.** lemon
06c0: 5f 61 64 64 74 65 78 74 28 29 2e 20 54 68 65 20  _addtext(). The 
06d0: 66 69 72 73 74 20 74 77 6f 20 61 72 65 20 72 65  first two are re
06e0: 70 6c 61 63 65 6d 65 6e 74 73 20 66 6f 72 20 73  placements for s
06f0: 70 72 69 6e 74 66 28 29 20 61 6e 64 20 76 73 70  printf() and vsp
0700: 72 69 6e 74 66 28 29 2e 0a 2a 2a 20 54 68 65 20  rintf()..** The 
0710: 74 68 69 72 64 20 69 73 20 61 20 68 65 6c 70 65  third is a helpe
0720: 72 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 76 73  r routine for vs
0730: 6e 70 72 69 6e 74 66 28 29 20 74 68 61 74 20 61  nprintf() that a
0740: 64 64 73 20 74 65 78 74 73 20 74 6f 20 74 68 65  dds texts to the
0750: 20 65 6e 64 20 6f 66 20 61 0a 2a 2a 20 62 75 66   end of a.** buf
0760: 66 65 72 2c 20 6d 61 6b 69 6e 67 20 73 75 72 65  fer, making sure
0770: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 61   the buffer is a
0780: 6c 77 61 79 73 20 7a 65 72 6f 2d 74 65 72 6d 69  lways zero-termi
0790: 6e 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nated..**.** The
07a0: 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 65   string formatte
07b0: 72 20 69 73 20 61 20 6d 69 6e 69 6d 61 6c 20 73  r is a minimal s
07c0: 75 62 73 65 74 20 6f 66 20 73 74 64 6c 69 62 20  ubset of stdlib 
07d0: 73 70 72 69 6e 74 66 28 29 20 73 75 70 70 6f 72  sprintf() suppor
07e0: 74 69 6e 67 20 6f 6e 6c 79 0a 2a 2a 20 61 20 66  ting only.** a f
07f0: 65 77 20 73 69 6d 70 6c 79 20 63 6f 6e 76 65 72  ew simply conver
0800: 73 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 25  sions:.**.**   %
0810: 64 0a 2a 2a 20 20 20 25 73 0a 2a 2a 20 20 20 25  d.**   %s.**   %
0820: 2e 2a 73 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  .*s.**.*/.static
0830: 20 76 6f 69 64 20 6c 65 6d 6f 6e 5f 61 64 64 74   void lemon_addt
0840: 65 78 74 28 0a 20 20 63 68 61 72 20 2a 7a 42 75  ext(.  char *zBu
0850: 66 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  f,           /* 
0860: 54 68 65 20 62 75 66 66 65 72 20 74 6f 20 77 68  The buffer to wh
0870: 69 63 68 20 74 65 78 74 20 69 73 20 61 64 64 65  ich text is adde
0880: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 55 73  d */.  int *pnUs
0890: 65 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed,          /* 
08a0: 53 6c 6f 74 73 20 6f 66 20 74 68 65 20 62 75 66  Slots of the buf
08b0: 66 65 72 20 75 73 65 64 20 73 6f 20 66 61 72 20  fer used so far 
08c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
08d0: 2a 7a 49 6e 2c 20 20 20 20 20 20 2f 2a 20 54 65  *zIn,      /* Te
08e0: 78 74 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69  xt to add */.  i
08f0: 6e 74 20 6e 49 6e 2c 20 20 20 20 20 20 20 20 20  nt nIn,         
0900: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
0910: 20 74 65 78 74 20 74 6f 20 61 64 64 2e 20 20 2d   text to add.  -
0920: 31 20 74 6f 20 75 73 65 20 73 74 72 6c 65 6e 28  1 to use strlen(
0930: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 57 69 64 74  ) */.  int iWidt
0940: 68 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h            /* 
0950: 46 69 65 6c 64 20 77 69 64 74 68 2e 20 20 4e 65  Field width.  Ne
0960: 67 61 74 69 76 65 20 74 6f 20 6c 65 66 74 20 6a  gative to left j
0970: 75 73 74 69 66 79 20 2a 2f 0a 29 7b 0a 20 20 69  ustify */.){.  i
0980: 66 28 20 6e 49 6e 3c 30 20 29 20 66 6f 72 28 6e  f( nIn<0 ) for(n
0990: 49 6e 3d 30 3b 20 7a 49 6e 5b 6e 49 6e 5d 3b 20  In=0; zIn[nIn]; 
09a0: 6e 49 6e 2b 2b 29 7b 7d 0a 20 20 77 68 69 6c 65  nIn++){}.  while
09b0: 28 20 69 57 69 64 74 68 3e 6e 49 6e 20 29 7b 20  ( iWidth>nIn ){ 
09c0: 7a 42 75 66 5b 28 2a 70 6e 55 73 65 64 29 2b 2b  zBuf[(*pnUsed)++
09d0: 5d 20 3d 20 27 20 27 3b 20 69 57 69 64 74 68 2d  ] = ' '; iWidth-
09e0: 2d 3b 20 7d 0a 20 20 69 66 28 20 6e 49 6e 3d 3d  -; }.  if( nIn==
09f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  0 ) return;.  me
0a00: 6d 63 70 79 28 26 7a 42 75 66 5b 2a 70 6e 55 73  mcpy(&zBuf[*pnUs
0a10: 65 64 5d 2c 20 7a 49 6e 2c 20 6e 49 6e 29 3b 0a  ed], zIn, nIn);.
0a20: 20 20 2a 70 6e 55 73 65 64 20 2b 3d 20 6e 49 6e    *pnUsed += nIn
0a30: 3b 0a 20 20 77 68 69 6c 65 28 20 28 2d 69 57 69  ;.  while( (-iWi
0a40: 64 74 68 29 3e 6e 49 6e 20 29 7b 20 7a 42 75 66  dth)>nIn ){ zBuf
0a50: 5b 28 2a 70 6e 55 73 65 64 29 2b 2b 5d 20 3d 20  [(*pnUsed)++] = 
0a60: 27 20 27 3b 20 69 57 69 64 74 68 2b 2b 3b 20 7d  ' '; iWidth++; }
0a70: 0a 20 20 7a 42 75 66 5b 2a 70 6e 55 73 65 64 5d  .  zBuf[*pnUsed]
0a80: 20 3d 20 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69   = 0;.}.static i
0a90: 6e 74 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74  nt lemon_vsprint
0aa0: 66 28 63 68 61 72 20 2a 73 74 72 2c 20 63 6f 6e  f(char *str, con
0ab0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
0ac0: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
0ad0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 63 3b   int i, j, k, c;
0ae0: 0a 20 20 69 6e 74 20 6e 55 73 65 64 20 3d 20 30  .  int nUsed = 0
0af0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
0b00: 7a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  z;.  char zTemp[
0b10: 35 30 5d 3b 0a 20 20 73 74 72 5b 30 5d 20 3d 20  50];.  str[0] = 
0b20: 30 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  0;.  for(i=j=0; 
0b30: 28 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 69 5d 29  (c = zFormat[i])
0b40: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  !=0; i++){.    i
0b50: 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a 20 20 20  f( c=='%' ){.   
0b60: 20 20 20 69 6e 74 20 69 57 69 64 74 68 20 3d 20     int iWidth = 
0b70: 30 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  0;.      lemon_a
0b80: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0b90: 65 64 2c 20 26 7a 46 6f 72 6d 61 74 5b 6a 5d 2c  ed, &zFormat[j],
0ba0: 20 69 2d 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20   i-j, 0);.      
0bb0: 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 2b 2b 69 5d  c = zFormat[++i]
0bc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 44 49  ;.      if( ISDI
0bd0: 47 49 54 28 63 29 20 7c 7c 20 28 63 3d 3d 27 2d  GIT(c) || (c=='-
0be0: 27 20 26 26 20 49 53 44 49 47 49 54 28 7a 46 6f  ' && ISDIGIT(zFo
0bf0: 72 6d 61 74 5b 69 2b 31 5d 29 29 20 29 7b 0a 20  rmat[i+1])) ){. 
0c00: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2d         if( c=='-
0c10: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) i++;.       
0c20: 20 77 68 69 6c 65 28 20 49 53 44 49 47 49 54 28   while( ISDIGIT(
0c30: 7a 46 6f 72 6d 61 74 5b 69 5d 29 20 29 20 69 57  zFormat[i]) ) iW
0c40: 69 64 74 68 20 3d 20 69 57 69 64 74 68 2a 31 30  idth = iWidth*10
0c50: 20 2b 20 7a 46 6f 72 6d 61 74 5b 69 2b 2b 5d 20   + zFormat[i++] 
0c60: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69  - '0';.        i
0c70: 66 28 20 63 3d 3d 27 2d 27 20 29 20 69 57 69 64  f( c=='-' ) iWid
0c80: 74 68 20 3d 20 2d 69 57 69 64 74 68 3b 0a 20 20  th = -iWidth;.  
0c90: 20 20 20 20 20 20 63 20 3d 20 7a 46 6f 72 6d 61        c = zForma
0ca0: 74 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t[i];.      }.  
0cb0: 20 20 20 20 69 66 28 20 63 3d 3d 27 64 27 20 29      if( c=='d' )
0cc0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76 20  {.        int v 
0cd0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
0ce0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
0cf0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
0d00: 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74  lemon_addtext(st
0d10: 72 2c 20 26 6e 55 73 65 64 2c 20 22 2d 22 2c 20  r, &nUsed, "-", 
0d20: 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20 20 20  1, iWidth);.    
0d30: 20 20 20 20 20 20 76 20 3d 20 2d 76 3b 0a 20 20        v = -v;.  
0d40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
0d50: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  v==0 ){.        
0d60: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0d70: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 22 30 22  str, &nUsed, "0"
0d80: 2c 20 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20  , 1, iWidth);.  
0d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0da0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77  k = 0;.        w
0db0: 68 69 6c 65 28 20 76 3e 30 20 29 7b 0a 20 20 20  hile( v>0 ){.   
0dc0: 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20         k++;.    
0dd0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 73 69 7a 65        zTemp[size
0de0: 6f 66 28 7a 54 65 6d 70 29 2d 6b 5d 20 3d 20 28  of(zTemp)-k] = (
0df0: 76 25 31 30 29 20 2b 20 27 30 27 3b 0a 20 20 20  v%10) + '0';.   
0e00: 20 20 20 20 20 20 20 76 20 2f 3d 20 31 30 3b 0a         v /= 10;.
0e10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0e20: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0e30: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 26 7a 54  str, &nUsed, &zT
0e40: 65 6d 70 5b 73 69 7a 65 6f 66 28 7a 54 65 6d 70  emp[sizeof(zTemp
0e50: 29 2d 6b 5d 2c 20 6b 2c 20 69 57 69 64 74 68 29  )-k], k, iWidth)
0e60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
0e70: 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20  ( c=='s' ){.    
0e80: 20 20 20 20 7a 20 3d 20 76 61 5f 61 72 67 28 61      z = va_arg(a
0e90: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
0ea0: 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  .        lemon_a
0eb0: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0ec0: 65 64 2c 20 7a 2c 20 2d 31 2c 20 69 57 69 64 74  ed, z, -1, iWidt
0ed0: 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  h);.      }else 
0ee0: 69 66 28 20 63 3d 3d 27 2e 27 20 26 26 20 6d 65  if( c=='.' && me
0ef0: 6d 63 6d 70 28 26 7a 46 6f 72 6d 61 74 5b 69 5d  mcmp(&zFormat[i]
0f00: 2c 20 22 2e 2a 73 22 2c 20 33 29 3d 3d 30 20 29  , ".*s", 3)==0 )
0f10: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  {.        i += 2
0f20: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 76 61  ;.        k = va
0f30: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
0f40: 20 20 20 20 20 20 20 7a 20 3d 20 76 61 5f 61 72         z = va_ar
0f50: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
0f60: 2a 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f  *);.        lemo
0f70: 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20 26  n_addtext(str, &
0f80: 6e 55 73 65 64 2c 20 7a 2c 20 6b 2c 20 69 57 69  nUsed, z, k, iWi
0f90: 64 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dth);.      }els
0fa0: 65 20 69 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a  e if( c=='%' ){.
0fb0: 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64          lemon_ad
0fc0: 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65  dtext(str, &nUse
0fd0: 64 2c 20 22 25 22 2c 20 31 2c 20 30 29 3b 0a 20  d, "%", 1, 0);. 
0fe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
0ff0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1000: 72 72 2c 20 22 69 6c 6c 65 67 61 6c 20 66 6f 72  rr, "illegal for
1010: 6d 61 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  mat\n");.       
1020: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
1030: 7d 0a 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b  }.      j = i+1;
1040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 65 6d  .    }.  }.  lem
1050: 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20  on_addtext(str, 
1060: 26 6e 55 73 65 64 2c 20 26 7a 46 6f 72 6d 61 74  &nUsed, &zFormat
1070: 5b 6a 5d 2c 20 69 2d 6a 2c 20 30 29 3b 0a 20 20  [j], i-j, 0);.  
1080: 72 65 74 75 72 6e 20 6e 55 73 65 64 3b 0a 7d 0a  return nUsed;.}.
1090: 73 74 61 74 69 63 20 69 6e 74 20 6c 65 6d 6f 6e  static int lemon
10a0: 5f 73 70 72 69 6e 74 66 28 63 68 61 72 20 2a 73  _sprintf(char *s
10b0: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
10c0: 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  format, ...){.  
10d0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
10e0: 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  t rc;.  va_start
10f0: 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20  (ap, format);.  
1100: 72 63 20 3d 20 6c 65 6d 6f 6e 5f 76 73 70 72 69  rc = lemon_vspri
1110: 6e 74 66 28 73 74 72 2c 20 66 6f 72 6d 61 74 2c  ntf(str, format,
1120: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1130: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1140: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
1150: 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63 68 61 72  emon_strcpy(char
1160: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
1170: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
1180: 65 28 20 28 2a 28 64 65 73 74 2b 2b 29 20 3d 20  e( (*(dest++) = 
1190: 2a 28 73 72 63 2b 2b 29 29 21 3d 30 20 29 7b 7d  *(src++))!=0 ){}
11a0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
11b0: 65 6d 6f 6e 5f 73 74 72 63 61 74 28 63 68 61 72  emon_strcat(char
11c0: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
11d0: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
11e0: 65 28 20 2a 64 65 73 74 20 29 20 64 65 73 74 2b  e( *dest ) dest+
11f0: 2b 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70  +;.  lemon_strcp
1200: 79 28 64 65 73 74 2c 20 73 72 63 29 3b 0a 7d 0a  y(dest, src);.}.
1210: 0a 0a 2f 2a 20 61 20 66 65 77 20 66 6f 72 77 61  ../* a few forwa
1220: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e  rd declarations.
1230: 2e 2e 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c  .. */.struct rul
1240: 65 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 3b  e;.struct lemon;
1250: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 3b 0a  .struct action;.
1260: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
1270: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65  ction *Action_ne
1280: 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63 20  w(void);.static 
1290: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
12a0: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72 75 63  ction_sort(struc
12b0: 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a  t action *);../*
12c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
12d0: 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 68  he file "build.h
12e0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
12f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1300: 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e  ******/.void Fin
1310: 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73  dRulePrecedences
1320: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a 29 3b  (struct lemon*);
1330: 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53  .void FindFirstS
1340: 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ets(struct lemon
1350: 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64 53 74 61  *);.void FindSta
1360: 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  tes(struct lemon
1370: 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e  *);.void FindLin
1380: 6b 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a  ks(struct lemon*
1390: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c  );.void FindFoll
13a0: 6f 77 53 65 74 73 28 73 74 72 75 63 74 20 6c 65  owSets(struct le
13b0: 6d 6f 6e 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64  mon*);.void Find
13c0: 41 63 74 69 6f 6e 73 28 73 74 72 75 63 74 20 6c  Actions(struct l
13d0: 65 6d 6f 6e 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  emon*);../******
13e0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
13f0: 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 68 22  e "configlist.h"
1400: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1420: 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  **/.void Configl
1430: 69 73 74 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a  ist_init(void);.
1440: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
1450: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 73 74  onfiglist_add(st
1460: 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74  ruct rule *, int
1470: 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  );.struct config
1480: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   *Configlist_add
1490: 62 61 73 69 73 28 73 74 72 75 63 74 20 72 75 6c  basis(struct rul
14a0: 65 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20  e *, int);.void 
14b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75  Configlist_closu
14c0: 72 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  re(struct lemon 
14d0: 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  *);.void Configl
14e0: 69 73 74 5f 73 6f 72 74 28 76 6f 69 64 29 3b 0a  ist_sort(void);.
14f0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1500: 73 6f 72 74 62 61 73 69 73 28 76 6f 69 64 29 3b  sortbasis(void);
1510: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1520: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72  Configlist_retur
1530: 6e 28 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20  n(void);.struct 
1540: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
1550: 73 74 5f 62 61 73 69 73 28 76 6f 69 64 29 3b 0a  st_basis(void);.
1560: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1570: 65 61 74 28 73 74 72 75 63 74 20 63 6f 6e 66 69  eat(struct confi
1580: 67 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  g *);.void Confi
1590: 67 6c 69 73 74 5f 72 65 73 65 74 28 76 6f 69 64  glist_reset(void
15a0: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  );../********* F
15b0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 65 72  rom the file "er
15c0: 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ror.h" *********
15d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
15f0: 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f  void ErrorMsg(co
1600: 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c  nst char *, int,
1610: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 2e 2e  const char *, ..
1620: 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 20 46 72 6f  .);../****** Fro
1630: 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69  m the file "opti
1640: 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on.h" **********
1650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1670: 2f 0a 65 6e 75 6d 20 6f 70 74 69 6f 6e 5f 74 79  /.enum option_ty
1680: 70 65 20 7b 20 4f 50 54 5f 46 4c 41 47 3d 31 2c  pe { OPT_FLAG=1,
1690: 20 20 4f 50 54 5f 49 4e 54 2c 20 20 4f 50 54 5f    OPT_INT,  OPT_
16a0: 44 42 4c 2c 20 20 4f 50 54 5f 53 54 52 2c 0a 20  DBL,  OPT_STR,. 
16b0: 20 20 20 20 20 20 20 20 4f 50 54 5f 46 46 4c 41          OPT_FFLA
16c0: 47 2c 20 4f 50 54 5f 46 49 4e 54 2c 20 4f 50 54  G, OPT_FINT, OPT
16d0: 5f 46 44 42 4c 2c 20 4f 50 54 5f 46 53 54 52 7d  _FDBL, OPT_FSTR}
16e0: 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  ;.struct s_optio
16f0: 6e 73 20 7b 0a 20 20 65 6e 75 6d 20 6f 70 74 69  ns {.  enum opti
1700: 6f 6e 5f 74 79 70 65 20 74 79 70 65 3b 0a 20 20  on_type type;.  
1710: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 61 62 65  const char *labe
1720: 6c 3b 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 0a  l;.  char *arg;.
1730: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 65    const char *me
1740: 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e 74 20 20 20  ssage;.};.int   
1750: 20 4f 70 74 49 6e 69 74 28 63 68 61 72 2a 2a 2c   OptInit(char**,
1760: 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73  struct s_options
1770: 2a 2c 46 49 4c 45 2a 29 3b 0a 69 6e 74 20 20 20  *,FILE*);.int   
1780: 20 4f 70 74 4e 41 72 67 73 28 76 6f 69 64 29 3b   OptNArgs(void);
1790: 0a 63 68 61 72 20 20 2a 4f 70 74 41 72 67 28 69  .char  *OptArg(i
17a0: 6e 74 29 3b 0a 76 6f 69 64 20 20 20 4f 70 74 45  nt);.void   OptE
17b0: 72 72 28 69 6e 74 29 3b 0a 76 6f 69 64 20 20 20  rr(int);.void   
17c0: 4f 70 74 50 72 69 6e 74 28 76 6f 69 64 29 3b 0a  OptPrint(void);.
17d0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ./******** From 
17e0: 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e  the file "parse.
17f0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
1800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1820: 69 64 20 50 61 72 73 65 28 73 74 72 75 63 74 20  id Parse(struct 
1830: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 3b 0a 0a 2f  lemon *lemp);../
1840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
1850: 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 68  he file "plink.h
1860: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
1870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63  *********/.struc
1890: 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e  t plink *Plink_n
18a0: 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 50  ew(void);.void P
18b0: 6c 69 6e 6b 5f 61 64 64 28 73 74 72 75 63 74 20  link_add(struct 
18c0: 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63 74  plink **, struct
18d0: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64   config *);.void
18e0: 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74 72 75   Plink_copy(stru
18f0: 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72  ct plink **, str
1900: 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b 0a 76 6f  uct plink *);.vo
1910: 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28  id Plink_delete(
1920: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b  struct plink *);
1930: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
1940: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70  om the file "rep
1950: 6f 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ort.h" *********
1960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1980: 69 64 20 52 65 70 72 69 6e 74 28 73 74 72 75 63  id Reprint(struc
1990: 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64  t lemon *);.void
19a0: 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 73 74   ReportOutput(st
19b0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76  ruct lemon *);.v
19c0: 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28  oid ReportTable(
19d0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20  struct lemon *, 
19e0: 69 6e 74 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72  int);.void Repor
19f0: 74 48 65 61 64 65 72 28 73 74 72 75 63 74 20 6c  tHeader(struct l
1a00: 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 43 6f  emon *);.void Co
1a10: 6d 70 72 65 73 73 54 61 62 6c 65 73 28 73 74 72  mpressTables(str
1a20: 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f  uct lemon *);.vo
1a30: 69 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28  id ResortStates(
1a40: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b  struct lemon *);
1a50: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
1a60: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 65 74  om the file "set
1a70: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1aa0: 69 64 20 20 53 65 74 53 69 7a 65 28 69 6e 74 29  id  SetSize(int)
1ab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ac0: 20 41 6c 6c 20 73 65 74 73 20 77 69 6c 6c 20 62   All sets will b
1ad0: 65 20 6f 66 20 73 69 7a 65 20 4e 20 2a 2f 0a 63  e of size N */.c
1ae0: 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f 69 64  har *SetNew(void
1af0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1b00: 20 2f 2a 20 41 20 6e 65 77 20 73 65 74 20 66 6f   /* A new set fo
1b10: 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e 4e 20 2a  r element 0..N *
1b20: 2f 0a 76 6f 69 64 20 20 53 65 74 46 72 65 65 28  /.void  SetFree(
1b30: 63 68 61 72 2a 29 3b 20 20 20 20 20 20 20 20 20  char*);         
1b40: 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74      /* Deallocat
1b50: 65 20 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53  e a set */.int S
1b60: 65 74 41 64 64 28 63 68 61 72 2a 2c 69 6e 74 29  etAdd(char*,int)
1b70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b80: 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f 20 61  Add element to a
1b90: 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65 74 55   set */.int SetU
1ba0: 6e 69 6f 6e 28 63 68 61 72 20 2a 2c 63 68 61 72  nion(char *,char
1bb0: 20 2a 29 3b 20 20 20 20 2f 2a 20 41 20 3c 2d 20   *);    /* A <- 
1bc0: 41 20 55 20 42 2c 20 74 68 72 75 20 65 6c 65 6d  A U B, thru elem
1bd0: 65 6e 74 20 4e 20 2a 2f 0a 23 64 65 66 69 6e 65  ent N */.#define
1be0: 20 53 65 74 46 69 6e 64 28 58 2c 59 29 20 28 58   SetFind(X,Y) (X
1bf0: 5b 59 5d 29 20 20 20 20 20 20 20 2f 2a 20 54 72  [Y])       /* Tr
1c00: 75 65 20 69 66 20 59 20 69 73 20 69 6e 20 73 65  ue if Y is in se
1c10: 74 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  t X */../*******
1c20: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1c30: 65 20 22 73 74 72 75 63 74 2e 68 22 20 2a 2a 2a  e "struct.h" ***
1c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c60: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 63 69  **/./*.** Princi
1c70: 70 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  pal data structu
1c80: 72 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f  res for the LEMO
1c90: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
1ca0: 6f 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20  or..*/..typedef 
1cb0: 65 6e 75 6d 20 7b 4c 45 4d 4f 4e 5f 46 41 4c 53  enum {LEMON_FALS
1cc0: 45 3d 30 2c 20 4c 45 4d 4f 4e 5f 54 52 55 45 7d  E=0, LEMON_TRUE}
1cd0: 20 42 6f 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20 53 79   Boolean;../* Sy
1ce0: 6d 62 6f 6c 73 20 28 74 65 72 6d 69 6e 61 6c 73  mbols (terminals
1cf0: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
1d00: 73 29 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  s) of the gramma
1d10: 72 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20  r are stored.** 
1d20: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1d30: 3a 20 2a 2f 0a 65 6e 75 6d 20 73 79 6d 62 6f 6c  : */.enum symbol
1d40: 5f 74 79 70 65 20 7b 0a 20 20 54 45 52 4d 49 4e  _type {.  TERMIN
1d50: 41 4c 2c 0a 20 20 4e 4f 4e 54 45 52 4d 49 4e 41  AL,.  NONTERMINA
1d60: 4c 2c 0a 20 20 4d 55 4c 54 49 54 45 52 4d 49 4e  L,.  MULTITERMIN
1d70: 41 4c 0a 7d 3b 0a 65 6e 75 6d 20 65 5f 61 73 73  AL.};.enum e_ass
1d80: 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c 0a 20  oc {.    LEFT,. 
1d90: 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20 4e 4f     RIGHT,.    NO
1da0: 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 7d 3b 0a 73  NE,.    UNK.};.s
1db0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 7b 0a 20  truct symbol {. 
1dc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d   const char *nam
1dd0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  e;        /* Nam
1de0: 65 20 6f 66 20 74 68 65 20 73 79 6d 62 6f 6c 20  e of the symbol 
1df0: 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20  */.  int index; 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e10: 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f   Index number fo
1e20: 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f  r this symbol */
1e30: 0a 20 20 65 6e 75 6d 20 73 79 6d 62 6f 6c 5f 74  .  enum symbol_t
1e40: 79 70 65 20 74 79 70 65 3b 20 20 20 2f 2a 20 53  ype type;   /* S
1e50: 79 6d 62 6f 6c 73 20 61 72 65 20 61 6c 6c 20 65  ymbols are all e
1e60: 69 74 68 65 72 20 54 45 52 4d 49 4e 41 4c 53 20  ither TERMINALS 
1e70: 6f 72 20 4e 54 73 20 2a 2f 0a 20 20 73 74 72 75  or NTs */.  stru
1e80: 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20  ct rule *rule;  
1e90: 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c       /* Linked l
1ea0: 69 73 74 20 6f 66 20 72 75 6c 65 73 20 6f 66 20  ist of rules of 
1eb0: 74 68 69 73 20 28 69 66 20 61 6e 20 4e 54 29 20  this (if an NT) 
1ec0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
1ed0: 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 2f 2a  ol *fallback; /*
1ee0: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20   fallback token 
1ef0: 69 6e 20 63 61 73 65 20 74 68 69 73 20 74 6f 6b  in case this tok
1f00: 65 6e 20 64 6f 65 73 6e 27 74 20 70 61 72 73 65  en doesn't parse
1f10: 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63 3b 20   */.  int prec; 
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f30: 2a 20 50 72 65 63 65 64 65 6e 63 65 20 69 66 20  * Precedence if 
1f40: 64 65 66 69 6e 65 64 20 28 2d 31 20 6f 74 68 65  defined (-1 othe
1f50: 72 77 69 73 65 29 20 2a 2f 0a 20 20 65 6e 75 6d  rwise) */.  enum
1f60: 20 65 5f 61 73 73 6f 63 20 61 73 73 6f 63 3b 20   e_assoc assoc; 
1f70: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
1f80: 69 76 69 74 79 20 69 66 20 70 72 65 63 65 64 65  ivity if precede
1f90: 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64 20 2a  nce is defined *
1fa0: 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73 74 73  /.  char *firsts
1fb0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
1fc0: 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20 61 6c  First-set for al
1fd0: 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73 20  l rules of this 
1fe0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f 6f 6c  symbol */.  Bool
1ff0: 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20 20 20  ean lambda;     
2000: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2010: 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e 65 72  NT and can gener
2020: 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72  ate an empty str
2030: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ing */.  int use
2040: 43 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cnt;            
2050: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2060: 69 6d 65 73 20 75 73 65 64 20 2a 2f 0a 20 20 63  imes used */.  c
2070: 68 61 72 20 2a 64 65 73 74 72 75 63 74 6f 72 3b  har *destructor;
2080: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2090: 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
20a0: 68 65 6e 65 76 65 72 20 74 68 69 73 20 73 79 6d  henever this sym
20b0: 62 6f 6c 20 69 73 0a 20 20 20 20 20 20 20 20 20  bol is.         
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 2a 2a 20 70 6f 70 70 65 64 20 66 72 6f 6d    ** popped from
20e0: 20 74 68 65 20 73 74 61 63 6b 20 64 75 72 69 6e   the stack durin
20f0: 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73 73 69  g error processi
2100: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  ng */.  int dest
2110: 4c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20  Lineno;         
2120: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
2130: 66 6f 72 20 73 74 61 72 74 20 6f 66 20 64 65 73  for start of des
2140: 74 72 75 63 74 6f 72 2e 20 20 53 65 74 20 74 6f  tructor.  Set to
2150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2160: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 2d              ** -
2170: 31 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  1 for duplicate 
2180: 64 65 73 74 72 75 63 74 6f 72 73 2e 20 2a 2f 0a  destructors. */.
2190: 20 20 63 68 61 72 20 2a 64 61 74 61 74 79 70 65    char *datatype
21a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
21b0: 65 20 64 61 74 61 20 74 79 70 65 20 6f 66 20 69  e data type of i
21c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c 64 20  nformation held 
21d0: 62 79 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  by this.        
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e     ** object. On
2200: 6c 79 20 75 73 65 64 20 69 66 20 74 79 70 65 3d  ly used if type=
2210: 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a  =NONTERMINAL */.
2220: 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20 20 20    int dtnum;    
2230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2240: 65 20 64 61 74 61 20 74 79 70 65 20 6e 75 6d 62  e data type numb
2250: 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61 72 73  er.  In the pars
2260: 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a 20 20  er, the value.  
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 63           ** stac
2290: 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20 20 54  k is a union.  T
22a0: 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65 6e 74  he .yy%d element
22b0: 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20 20 20   of this.       
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69 73 20      ** union is 
22e0: 74 68 65 20 63 6f 72 72 65 63 74 20 64 61 74 61  the correct data
22f0: 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20 6f   type for this o
2300: 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a 20 54 68  bject */.  /* Th
2310: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
2320: 64 73 20 61 72 65 20 75 73 65 64 20 62 79 20 4d  ds are used by M
2330: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73 20 6f 6e  ULTITERMINALs on
2340: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 75 62  ly */.  int nsub
2350: 73 79 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sym;            
2360: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
2370: 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c  nstituent symbol
2380: 73 20 69 6e 20 74 68 65 20 4d 55 4c 54 49 20 2a  s in the MULTI *
2390: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
23a0: 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20 2f 2a 20  l **subsym;  /* 
23b0: 41 72 72 61 79 20 6f 66 20 63 6f 6e 73 74 69 74  Array of constit
23c0: 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  uent symbols */.
23d0: 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64  };../* Each prod
23e0: 75 63 74 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74  uction rule in t
23f0: 68 65 20 67 72 61 6d 6d 61 72 20 69 73 20 73 74  he grammar is st
2400: 6f 72 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ored in the foll
2410: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
2420: 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63 74 20 72  re.  */.struct r
2430: 75 6c 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ule {.  struct s
2440: 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20  ymbol *lhs;     
2450: 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69   /* Left-hand si
2460: 64 65 20 6f 66 20 74 68 65 20 72 75 6c 65 20 2a  de of the rule *
2470: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2480: 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 2f 2a 20  lhsalias;    /* 
2490: 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48  Alias for the LH
24a0: 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29  S (NULL if none)
24b0: 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73 53 74 61   */.  int lhsSta
24c0: 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rt;            /
24d0: 2a 20 54 72 75 65 20 69 66 20 6c 65 66 74 2d 68  * True if left-h
24e0: 61 6e 64 20 73 69 64 65 20 69 73 20 74 68 65 20  and side is the 
24f0: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a  start symbol */.
2500: 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20    int ruleline; 
2510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2520: 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ne number for th
2530: 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e rule */.  int 
2540: 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  nrhs;           
2550: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2560: 66 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f  f RHS symbols */
2570: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
2580: 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20 54   **rhs;     /* T
2590: 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  he RHS symbols *
25a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
25b0: 2a 72 68 73 61 6c 69 61 73 3b 20 20 20 2f 2a 20  *rhsalias;   /* 
25c0: 41 6e 20 61 6c 69 61 73 20 66 6f 72 20 65 61 63  An alias for eac
25d0: 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55  h RHS symbol (NU
25e0: 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20  LL if none) */. 
25f0: 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20 20   int line;      
2600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
2610: 65 20 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63  e number at whic
2620: 68 20 63 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f  h code begins */
2630: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  .  const char *c
2640: 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ode;        /* T
2650: 68 65 20 63 6f 64 65 20 65 78 65 63 75 74 65 64  he code executed
2660: 20 77 68 65 6e 20 74 68 69 73 20 72 75 6c 65 20   when this rule 
2670: 69 73 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20  is reduced */.  
2680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65  const char *code
2690: 50 72 65 66 69 78 3b 20 20 2f 2a 20 53 65 74 75  Prefix;  /* Setu
26a0: 70 20 63 6f 64 65 20 62 65 66 6f 72 65 20 63 6f  p code before co
26b0: 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f 0a 20 20  de[] above */.  
26c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65  const char *code
26d0: 53 75 66 66 69 78 3b 20 20 2f 2a 20 42 72 65 61  Suffix;  /* Brea
26e0: 6b 64 6f 77 6e 20 63 6f 64 65 20 61 66 74 65 72  kdown code after
26f0: 20 63 6f 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f   code[] above */
2700: 0a 20 20 69 6e 74 20 6e 6f 43 6f 64 65 3b 20 20  .  int noCode;  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2720: 72 75 65 20 69 66 20 74 68 69 73 20 72 75 6c 65  rue if this rule
2730: 20 68 61 73 20 6e 6f 20 61 73 73 6f 63 69 61 74   has no associat
2740: 65 64 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 69  ed C code */.  i
2750: 6e 74 20 63 6f 64 65 45 6d 69 74 74 65 64 3b 20  nt codeEmitted; 
2760: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2770: 69 66 20 74 68 65 20 63 6f 64 65 20 68 61 73 20  if the code has 
2780: 62 65 65 6e 20 65 6d 69 74 74 65 64 20 61 6c 72  been emitted alr
2790: 65 61 64 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  eady */.  struct
27a0: 20 73 79 6d 62 6f 6c 20 2a 70 72 65 63 73 79 6d   symbol *precsym
27b0: 3b 20 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65  ;  /* Precedence
27c0: 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 69 73   symbol for this
27d0: 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   rule */.  int i
27e0: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
27f0: 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
2800: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
2810: 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  rule */.  int iR
2820: 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ule;            
2830: 20 20 20 2f 2a 20 52 75 6c 65 20 6e 75 6d 62 65     /* Rule numbe
2840: 72 20 61 73 20 75 73 65 64 20 69 6e 20 74 68 65  r as used in the
2850: 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
2860: 73 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 63  s */.  Boolean c
2870: 61 6e 52 65 64 75 63 65 3b 20 20 20 20 20 20 20  anReduce;       
2880: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2890: 72 75 6c 65 20 69 73 20 65 76 65 72 20 72 65 64  rule is ever red
28a0: 75 63 65 64 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61  uced */.  Boolea
28b0: 6e 20 64 6f 65 73 52 65 64 75 63 65 3b 20 20 20  n doesReduce;   
28c0: 20 20 20 2f 2a 20 52 65 64 75 63 65 20 61 63 74     /* Reduce act
28d0: 69 6f 6e 73 20 6f 63 63 75 72 20 61 66 74 65 72  ions occur after
28e0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f   optimization */
28f0: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
2900: 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e  nextlhs;    /* N
2910: 65 78 74 20 72 75 6c 65 20 77 69 74 68 20 74 68  ext rule with th
2920: 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20  e same LHS */.  
2930: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78  struct rule *nex
2940: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  t;       /* Next
2950: 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f   rule in the glo
2960: 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a  bal list */.};..
2970: 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72 61 74 69  /* A configurati
2980: 6f 6e 20 69 73 20 61 20 70 72 6f 64 75 63 74 69  on is a producti
2990: 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68 65 20 67  on rule of the g
29a0: 72 61 6d 6d 61 72 20 74 6f 67 65 74 68 65 72 20  rammar together 
29b0: 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28  with.** a mark (
29c0: 64 6f 74 29 20 73 68 6f 77 69 6e 67 20 68 6f 77  dot) showing how
29d0: 20 6d 75 63 68 20 6f 66 20 74 68 61 74 20 72 75   much of that ru
29e0: 6c 65 20 68 61 73 20 62 65 65 6e 20 70 72 6f 63  le has been proc
29f0: 65 73 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a  essed so far..**
2a00: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   Configurations 
2a10: 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66  also contain a f
2a20: 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63 68 20  ollow-set which 
2a30: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 65 72  is a list of ter
2a40: 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73  minal.** symbols
2a50: 20 77 68 69 63 68 20 61 72 65 20 61 6c 6c 6f 77   which are allow
2a60: 65 64 20 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c  ed to immediatel
2a70: 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64  y follow the end
2a80: 20 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a   of the rule..**
2a90: 20 45 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61   Every configura
2aa0: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
2ab0: 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   as an instance 
2ac0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2ad0: 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67 73 74 61  : */.enum cfgsta
2ae0: 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c 45 54 45  tus {.  COMPLETE
2af0: 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54 45 0a 7d  ,.  INCOMPLETE.}
2b00: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
2b10: 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  {.  struct rule 
2b20: 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  *rp;         /* 
2b30: 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77 68  The rule upon wh
2b40: 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ich the configur
2b50: 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20 2a  ation is based *
2b60: 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20 20  /.  int dot;    
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b80: 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74 20  The parse point 
2b90: 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b 20  */.  char *fws; 
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bb0: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 20   Follow-set for 
2bc0: 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  this configurati
2bd0: 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  on only */.  str
2be0: 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b  uct plink *fplp;
2bf0: 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d        /* Follow-
2c00: 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f 70  set forward prop
2c10: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f  agation links */
2c20: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
2c30: 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46  *bplp;      /* F
2c40: 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77 61  ollow-set backwa
2c50: 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  rds propagation 
2c60: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63  links */.  struc
2c70: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20  t state *stp;   
2c80: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2c90: 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63 6f  o state which co
2ca0: 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a 20  ntains this */. 
2cb0: 20 65 6e 75 6d 20 63 66 67 73 74 61 74 75 73 20   enum cfgstatus 
2cc0: 73 74 61 74 75 73 3b 20 20 20 2f 2a 20 75 73 65  status;   /* use
2cd0: 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f 77 73  d during follows
2ce0: 65 74 20 61 6e 64 20 73 68 69 66 74 20 63 6f 6d  et and shift com
2cf0: 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  putations */.  s
2d00: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
2d10: 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  xt;     /* Next 
2d20: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e  configuration in
2d30: 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a 20 20   the state */.  
2d40: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
2d50: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
2d60: 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e 66 69  next basis confi
2d70: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a  guration */.};..
2d80: 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 7b 0a  enum e_action {.
2d90: 20 20 53 48 49 46 54 2c 0a 20 20 41 43 43 45 50    SHIFT,.  ACCEP
2da0: 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a 20 20 45  T,.  REDUCE,.  E
2db0: 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e 46 4c 49  RROR,.  SSCONFLI
2dc0: 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CT,             
2dd0: 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68 69 66   /* A shift/shif
2de0: 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  t conflict */.  
2df0: 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20  SRCONFLICT,     
2e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20           /* Was 
2e10: 61 20 72 65 64 75 63 65 2c 20 62 75 74 20 70 61  a reduce, but pa
2e20: 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63 74  rt of a conflict
2e30: 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c 49 43 54   */.  RRCONFLICT
2e40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2e50: 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c 20  * Was a reduce, 
2e60: 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  but part of a co
2e70: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 48 5f 52  nflict */.  SH_R
2e80: 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20  ESOLVED,        
2e90: 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 73 68       /* Was a sh
2ea0: 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e 63 65  ift.  Precedence
2eb0: 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69   resolved confli
2ec0: 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45 53 4f 4c  ct */.  RD_RESOL
2ed0: 56 45 44 2c 20 20 20 20 20 20 20 20 20 20 20 20  VED,            
2ee0: 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65 2e 20   /* Was reduce. 
2ef0: 20 50 72 65 63 65 64 65 6e 63 65 20 72 65 73 6f   Precedence reso
2f00: 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  lved conflict */
2f10: 0a 20 20 4e 4f 54 5f 55 53 45 44 2c 20 20 20 20  .  NOT_USED,    
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2f30: 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70 72 65  eleted by compre
2f40: 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 48 49 46 54  ssion */.  SHIFT
2f50: 52 45 44 55 43 45 20 20 20 20 20 20 20 20 20 20  REDUCE          
2f60: 20 20 20 20 2f 2a 20 53 68 69 66 74 20 66 69 72      /* Shift fir
2f70: 73 74 2c 20 74 68 65 6e 20 72 65 64 75 63 65 20  st, then reduce 
2f80: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79 20  */.};../* Every 
2f90: 73 68 69 66 74 20 6f 72 20 72 65 64 75 63 65 20  shift or reduce 
2fa0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 74 6f  operation is sto
2fb0: 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20 74 68  red as one of th
2fc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
2fd0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a 20  truct action {. 
2fe0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
2ff0: 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  sp;       /* The
3000: 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d 62   look-ahead symb
3010: 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61  ol */.  enum e_a
3020: 63 74 69 6f 6e 20 74 79 70 65 3b 0a 20 20 75 6e  ction type;.  un
3030: 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75 63 74  ion {.    struct
3040: 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 20   state *stp;    
3050: 20 2f 2a 20 54 68 65 20 6e 65 77 20 73 74 61 74   /* The new stat
3060: 65 2c 20 69 66 20 61 20 73 68 69 66 74 20 2a 2f  e, if a shift */
3070: 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65  .    struct rule
3080: 20 2a 72 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *rp;       /* T
3090: 68 65 20 72 75 6c 65 2c 20 69 66 20 61 20 72 65  he rule, if a re
30a0: 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a 20  duce */.  } x;. 
30b0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
30c0: 73 70 4f 70 74 3b 20 20 20 20 2f 2a 20 53 48 49  spOpt;    /* SHI
30d0: 46 54 52 45 44 55 43 45 20 6f 70 74 69 6d 69 7a  FTREDUCE optimiz
30e0: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 73 79  ation to this sy
30f0: 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74  mbol */.  struct
3100: 20 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20   action *next;  
3110: 20 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f     /* Next actio
3120: 6e 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  n for this state
3130: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74   */.  struct act
3140: 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f  ion *collide;  /
3150: 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69  * Next action wi
3160: 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
3170: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20   */.};../* Each 
3180: 73 74 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e  state of the gen
3190: 65 72 61 74 65 64 20 70 61 72 73 65 72 27 73 20  erated parser's 
31a0: 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63  finite state mac
31b0: 68 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64  hine.** is encod
31c0: 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63  ed as an instanc
31d0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
31e0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ng structure. */
31f0: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a  .struct state {.
3200: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
3210: 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *bp;       /* Th
3220: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
3230: 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20  ations for this 
3240: 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  state */.  struc
3250: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20  t config *cfp;  
3260: 20 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69      /* All confi
3270: 67 75 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  gurations in thi
3280: 73 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73  s set */.  int s
3290: 74 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20  tatenum;        
32a0: 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 74 69 61      /* Sequentia
32b0: 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  l number for thi
32c0: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  s state */.  str
32d0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20  uct action *ap; 
32e0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
32f0: 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69   actions for thi
3300: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  s state */.  int
3310: 20 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63 74   nTknAct, nNtAct
3320: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
3330: 6f 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74 65  of actions on te
3340: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74  rminals and nont
3350: 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e  erminals */.  in
3360: 74 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74 4f  t iTknOfst, iNtO
3370: 66 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63 74  fst;   /* yy_act
3380: 69 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f 72  ion[] offset for
3390: 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e   terminals and n
33a0: 6f 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  onterms */.  int
33b0: 20 69 44 66 6c 74 52 65 64 75 63 65 3b 20 20 20   iDfltReduce;   
33c0: 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74        /* Default
33d0: 20 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 52 45   action is to RE
33e0: 44 55 43 45 20 62 79 20 74 68 69 73 20 72 75 6c  DUCE by this rul
33f0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  e */.  struct ru
3400: 6c 65 20 2a 70 44 66 6c 74 52 65 64 75 63 65 3b  le *pDfltReduce;
3410: 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 52  /* The default R
3420: 45 44 55 43 45 20 72 75 6c 65 2e 20 2a 2f 0a 20  EDUCE rule. */. 
3430: 20 69 6e 74 20 61 75 74 6f 52 65 64 75 63 65 3b   int autoReduce;
3440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3450: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
3460: 61 75 74 6f 2d 72 65 64 75 63 65 20 73 74 61 74  auto-reduce stat
3470: 65 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20  e */.};.#define 
3480: 4e 4f 5f 4f 46 46 53 45 54 20 28 2d 32 31 34 37  NO_OFFSET (-2147
3490: 34 38 33 36 34 37 29 0a 0a 2f 2a 20 41 20 66 6f  483647)../* A fo
34a0: 6c 6c 6f 77 73 65 74 20 70 72 6f 70 61 67 61 74  llowset propagat
34b0: 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64 69 63 61 74  ion link indicat
34c0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
34d0: 65 6e 74 73 20 6f 66 20 6f 6e 65 0a 2a 2a 20 63  ents of one.** c
34e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f 6c  onfiguration fol
34f0: 6c 6f 77 73 65 74 20 73 68 6f 75 6c 64 20 62 65  lowset should be
3500: 20 70 72 6f 70 61 67 61 74 65 64 20 74 6f 20 61   propagated to a
3510: 6e 6f 74 68 65 72 20 77 68 65 6e 65 76 65 72 0a  nother whenever.
3520: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 68 61  ** the first cha
3530: 6e 67 65 73 2e 20 2a 2f 0a 73 74 72 75 63 74 20  nges. */.struct 
3540: 70 6c 69 6e 6b 20 7b 0a 20 20 73 74 72 75 63 74  plink {.  struct
3550: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 20   config *cfp;   
3560: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67     /* The config
3570: 75 72 61 74 69 6f 6e 20 74 6f 20 77 68 69 63 68  uration to which
3580: 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20 20 73 74 72   linked */.  str
3590: 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 3b  uct plink *next;
35a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
35b0: 74 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e 6b  t propagate link
35c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20 73   */.};../* The s
35d0: 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f 72 20  tate vector for 
35e0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 73 65  the entire parse
35f0: 72 20 67 65 6e 65 72 61 74 6f 72 20 69 73 20 72  r generator is r
3600: 65 63 6f 72 64 65 64 20 61 73 0a 2a 2a 20 66 6f  ecorded as.** fo
3610: 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d 4f 4e 20 75  llows.  (LEMON u
3620: 73 65 73 20 6e 6f 20 67 6c 6f 62 61 6c 20 76 61  ses no global va
3630: 72 69 61 62 6c 65 73 20 61 6e 64 20 6d 61 6b 65  riables and make
3640: 73 20 6c 69 74 74 6c 65 20 75 73 65 20 6f 66 0a  s little use of.
3650: 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69 61 62  ** static variab
3660: 6c 65 73 2e 20 20 46 69 65 6c 64 73 20 69 6e 20  les.  Fields in 
3670: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3680: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 74  ructure can be t
3690: 68 6f 75 67 68 74 0a 2a 2a 20 6f 66 20 61 73 20  hought.** of as 
36a0: 62 65 67 69 6e 20 67 6c 6f 62 61 6c 20 76 61 72  begin global var
36b0: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 72  iables in the pr
36c0: 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73 74 72 75 63  ogram.) */.struc
36d0: 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20 73 74 72 75  t lemon {.  stru
36e0: 63 74 20 73 74 61 74 65 20 2a 2a 73 6f 72 74 65  ct state **sorte
36f0: 64 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 66  d;   /* Table of
3700: 20 73 74 61 74 65 73 20 73 6f 72 74 65 64 20 62   states sorted b
3710: 79 20 73 74 61 74 65 20 6e 75 6d 62 65 72 20 2a  y state number *
3720: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
3730: 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  *rule;       /* 
3740: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 72 75 6c 65  List of all rule
3750: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  s */.  struct ru
3760: 6c 65 20 2a 73 74 61 72 74 52 75 6c 65 3b 20 20  le *startRule;  
3770: 2f 2a 20 46 69 72 73 74 20 72 75 6c 65 20 2a 2f  /* First rule */
3780: 0a 20 20 69 6e 74 20 6e 73 74 61 74 65 3b 20 20  .  int nstate;  
3790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37a0: 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 73 20  umber of states 
37b0: 2a 2f 0a 20 20 69 6e 74 20 6e 78 73 74 61 74 65  */.  int nxstate
37c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
37d0: 20 6e 73 74 61 74 65 20 77 69 74 68 20 74 61 69   nstate with tai
37e0: 6c 20 64 65 67 65 6e 65 72 61 74 65 20 73 74 61  l degenerate sta
37f0: 74 65 73 20 72 65 6d 6f 76 65 64 20 2a 2f 0a 20  tes removed */. 
3800: 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20 20   int nrule;     
3810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3820: 62 65 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a  ber of rules */.
3830: 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20    int nsymbol;  
3840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3850: 6d 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c  mber of terminal
3860: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
3870: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e   symbols */.  in
3880: 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20  t nterminal;    
3890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
38a0: 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d   of terminal sym
38b0: 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 69  bols */.  int mi
38c0: 6e 53 68 69 66 74 52 65 64 75 63 65 3b 20 20 20  nShiftReduce;   
38d0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 73 68     /* Minimum sh
38e0: 69 66 74 2d 72 65 64 75 63 65 20 61 63 74 69 6f  ift-reduce actio
38f0: 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  n value */.  int
3900: 20 65 72 72 41 63 74 69 6f 6e 3b 20 20 20 20 20   errAction;     
3910: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 61        /* Error a
3920: 63 74 69 6f 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  ction value */. 
3930: 20 69 6e 74 20 61 63 63 41 63 74 69 6f 6e 3b 20   int accAction; 
3940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63            /* Acc
3950: 65 70 74 20 61 63 74 69 6f 6e 20 76 61 6c 75 65  ept action value
3960: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 41 63 74 69   */.  int noActi
3970: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  on;            /
3980: 2a 20 4e 6f 2d 6f 70 20 61 63 74 69 6f 6e 20 76  * No-op action v
3990: 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 69  alue */.  int mi
39a0: 6e 52 65 64 75 63 65 3b 20 20 20 20 20 20 20 20  nReduce;        
39b0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65     /* Minimum re
39c0: 64 75 63 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  duce action */. 
39d0: 20 69 6e 74 20 6d 61 78 41 63 74 69 6f 6e 3b 20   int maxAction; 
39e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
39f0: 69 6d 75 6d 20 61 63 74 69 6f 6e 20 76 61 6c 75  imum action valu
3a00: 65 20 6f 66 20 61 6e 79 20 6b 69 6e 64 20 2a 2f  e of any kind */
3a10: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
3a20: 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20 2f 2a 20 53   **symbols; /* S
3a30: 6f 72 74 65 64 20 61 72 72 61 79 20 6f 66 20 70  orted array of p
3a40: 6f 69 6e 74 65 72 73 20 74 6f 20 73 79 6d 62 6f  ointers to symbo
3a50: 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f  ls */.  int erro
3a60: 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rcnt;           
3a70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
3a80: 72 6f 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  rors */.  struct
3a90: 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b   symbol *errsym;
3aa0: 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20     /* The error 
3ab0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75  symbol */.  stru
3ac0: 63 74 20 73 79 6d 62 6f 6c 20 2a 77 69 6c 64 63  ct symbol *wildc
3ad0: 61 72 64 3b 20 2f 2a 20 54 6f 6b 65 6e 20 74 68  ard; /* Token th
3ae0: 61 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68  at matches anyth
3af0: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e  ing */.  char *n
3b00: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
3b10: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3b20: 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
3b30: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67  r */.  char *arg
3b40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3b50: 2f 2a 20 44 65 63 6c 61 72 61 74 69 6f 6e 20 6f  /* Declaration o
3b60: 66 20 74 68 65 20 33 74 68 20 61 72 67 75 6d 65  f the 3th argume
3b70: 6e 74 20 74 6f 20 70 61 72 73 65 72 20 2a 2f 0a  nt to parser */.
3b80: 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 74 79 70    char *tokentyp
3b90: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79  e;         /* Ty
3ba0: 70 65 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73  pe of terminal s
3bb0: 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 70 61  ymbols in the pa
3bc0: 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20  rser stack */.  
3bd0: 63 68 61 72 20 2a 76 61 72 74 79 70 65 3b 20 20  char *vartype;  
3be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3bf0: 64 65 66 61 75 6c 74 20 74 79 70 65 20 6f 66 20  default type of 
3c00: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 73 79 6d  non-terminal sym
3c10: 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  bols */.  char *
3c20: 73 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  start;          
3c30: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3c40: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 66  e start symbol f
3c50: 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  or the grammar *
3c60: 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 63 6b 73  /.  char *stacks
3c70: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ize;         /* 
3c80: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73  Size of the pars
3c90: 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68  er stack */.  ch
3ca0: 61 72 20 2a 69 6e 63 6c 75 64 65 3b 20 20 20 20  ar *include;    
3cb0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
3cc0: 6f 20 70 75 74 20 61 74 20 74 68 65 20 73 74 61  o put at the sta
3cd0: 72 74 20 6f 66 20 74 68 65 20 43 20 66 69 6c 65  rt of the C file
3ce0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 72 72 6f   */.  char *erro
3cf0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
3d00: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
3d10: 65 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20  e when an error 
3d20: 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 63 68 61  is seen */.  cha
3d30: 72 20 2a 6f 76 65 72 66 6c 6f 77 3b 20 20 20 20  r *overflow;    
3d40: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
3d50: 20 65 78 65 63 75 74 65 20 6f 6e 20 61 20 73 74   execute on a st
3d60: 61 63 6b 20 6f 76 65 72 66 6c 6f 77 20 2a 2f 0a  ack overflow */.
3d70: 20 20 63 68 61 72 20 2a 66 61 69 6c 75 72 65 3b    char *failure;
3d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3d90: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e  de to execute on
3da0: 20 70 61 72 73 65 72 20 66 61 69 6c 75 72 65 20   parser failure 
3db0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 63 63 65 70  */.  char *accep
3dc0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
3dd0: 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65   Code to execute
3de0: 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   when the parser
3df0: 20 65 78 63 65 70 74 73 20 2a 2f 0a 20 20 63 68   excepts */.  ch
3e00: 61 72 20 2a 65 78 74 72 61 63 6f 64 65 3b 20 20  ar *extracode;  
3e10: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 61         /* Code a
3e20: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 67  ppended to the g
3e30: 65 6e 65 72 61 74 65 64 20 66 69 6c 65 20 2a 2f  enerated file */
3e40: 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 64 65  .  char *tokende
3e50: 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  st;         /* C
3e60: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 74  ode to execute t
3e70: 6f 20 64 65 73 74 72 6f 79 20 74 6f 6b 65 6e 20  o destroy token 
3e80: 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a  data */.  char *
3e90: 76 61 72 64 65 73 74 3b 20 20 20 20 20 20 20 20  vardest;        
3ea0: 20 20 20 2f 2a 20 43 6f 64 65 20 66 6f 72 20 74     /* Code for t
3eb0: 68 65 20 64 65 66 61 75 6c 74 20 6e 6f 6e 2d 74  he default non-t
3ec0: 65 72 6d 69 6e 61 6c 20 64 65 73 74 72 75 63 74  erminal destruct
3ed0: 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69  or */.  char *fi
3ee0: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
3ef0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3f00: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
3f10: 63 68 61 72 20 2a 6f 75 74 6e 61 6d 65 3b 20 20  char *outname;  
3f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3f30: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
3f40: 6f 75 74 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20  output file */. 
3f50: 20 63 68 61 72 20 2a 74 6f 6b 65 6e 70 72 65 66   char *tokenpref
3f60: 69 78 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 70  ix;       /* A p
3f70: 72 65 66 69 78 20 61 64 64 65 64 20 74 6f 20 74  refix added to t
3f80: 6f 6b 65 6e 20 6e 61 6d 65 73 20 69 6e 20 74 68  oken names in th
3f90: 65 20 2e 68 20 66 69 6c 65 20 2a 2f 0a 20 20 69  e .h file */.  i
3fa0: 6e 74 20 6e 63 6f 6e 66 6c 69 63 74 3b 20 20 20  nt nconflict;   
3fb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3fc0: 72 20 6f 66 20 70 61 72 73 69 6e 67 20 63 6f 6e  r of parsing con
3fd0: 66 6c 69 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20  flicts */.  int 
3fe0: 6e 61 63 74 69 6f 6e 74 61 62 3b 20 20 20 20 20  nactiontab;     
3ff0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4000: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
4010: 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62   yy_action[] tab
4020: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6c 6f 6f  le */.  int nloo
4030: 6b 61 68 65 61 64 74 61 62 3b 20 20 20 20 20 20  kaheadtab;      
4040: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
4050: 74 72 69 65 73 20 69 6e 20 79 79 5f 6c 6f 6f 6b  tries in yy_look
4060: 61 68 65 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ahead[] */.  int
4070: 20 74 61 62 6c 65 73 69 7a 65 3b 20 20 20 20 20   tablesize;     
4080: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 74        /* Total t
4090: 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c  able size of all
40a0: 20 74 61 62 6c 65 73 20 69 6e 20 62 79 74 65 73   tables in bytes
40b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 69 73 66   */.  int basisf
40c0: 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f  lag;           /
40d0: 2a 20 50 72 69 6e 74 20 6f 6e 6c 79 20 62 61 73  * Print only bas
40e0: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
40f0: 73 20 2a 2f 0a 20 20 69 6e 74 20 68 61 73 5f 66  s */.  int has_f
4100: 61 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  allback;        
4110: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 25  /* True if any %
4120: 66 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 65 6e  fallback is seen
4130: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
4140: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e  */.  int nolinen
4150: 6f 73 66 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  osflag;       /*
4160: 20 54 72 75 65 20 69 66 20 23 6c 69 6e 65 20 73   True if #line s
4170: 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64  tatements should
4180: 20 6e 6f 74 20 62 65 20 70 72 69 6e 74 65 64 20   not be printed 
4190: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 76 30  */.  char *argv0
41a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
41b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
41c0: 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  gram */.};..#def
41d0: 69 6e 65 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28  ine MemoryCheck(
41e0: 58 29 20 69 66 28 28 58 29 3d 3d 30 29 7b 20 5c  X) if((X)==0){ \
41f0: 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d  .  extern void m
4200: 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c  emory_error(); \
4210: 0a 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  .  memory_error(
4220: 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ); \.}../*******
4230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
4240: 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 68  he file "table.h
4250: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
4260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4270: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63  ***/./*.** All c
4280: 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
4290: 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61   has been automa
42a0: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
42b0: 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63  d.** from a spec
42c0: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65  ification in the
42d0: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20   file.**        
42e0: 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a        "table.q".
42f0: 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69  ** by the associ
4300: 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65  ative array code
4310: 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61   building progra
4320: 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f  m "aagen"..** Do
4330: 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66   not edit this f
4340: 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65  ile!  Instead, e
4350: 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63  dit the specific
4360: 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74  ation.** file, t
4370: 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e  hen rerun aagen.
4380: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66  .*/./*.** Code f
4390: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61  or processing ta
43a0: 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  bles in the LEMO
43b0: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
43c0: 6f 72 2e 0a 2a 2f 0a 2f 2a 20 52 6f 75 74 69 6e  or..*/./* Routin
43d0: 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20  es for handling 
43e0: 61 20 73 74 72 69 6e 67 73 20 2a 2f 0a 0a 63 6f  a strings */..co
43f0: 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66  nst char *Strsaf
4400: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  e(const char *);
4410: 0a 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69  ..void Strsafe_i
4420: 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53  nit(void);.int S
4430: 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 63 6f  trsafe_insert(co
4440: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 63 6f 6e  nst char *);.con
4450: 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65  st char *Strsafe
4460: 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72  _find(const char
4470: 20 2a 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65   *);../* Routine
4480: 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 73  s for handling s
4490: 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72  ymbols of the gr
44a0: 61 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75 63 74  ammar */..struct
44b0: 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
44c0: 6e 65 77 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  new(const char *
44d0: 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70  );.int Symbolcmp
44e0: 70 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2c 20  p(const void *, 
44f0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 76  const void *);.v
4500: 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28  oid Symbol_init(
4510: 76 6f 69 64 29 3b 0a 69 6e 74 20 53 79 6d 62 6f  void);.int Symbo
4520: 6c 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20  l_insert(struct 
4530: 73 79 6d 62 6f 6c 20 2a 2c 20 63 6f 6e 73 74 20  symbol *, const 
4540: 63 68 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20  char *);.struct 
4550: 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66  symbol *Symbol_f
4560: 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ind(const char *
4570: 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  );.struct symbol
4580: 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74   *Symbol_Nth(int
4590: 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f  );.int Symbol_co
45a0: 75 6e 74 28 76 6f 69 64 29 3b 0a 73 74 72 75 63  unt(void);.struc
45b0: 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f  t symbol **Symbo
45c0: 6c 5f 61 72 72 61 79 6f 66 28 76 6f 69 64 29 3b  l_arrayof(void);
45d0: 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  ../* Routines to
45e0: 20 6d 61 6e 61 67 65 20 74 68 65 20 73 74 61 74   manage the stat
45f0: 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e 74 20  e table */..int 
4600: 43 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73 74 20  Configcmp(const 
4610: 63 68 61 72 20 2a 2c 20 63 6f 6e 73 74 20 63 68  char *, const ch
4620: 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74  ar *);.struct st
4630: 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 76  ate *State_new(v
4640: 6f 69 64 29 3b 0a 76 6f 69 64 20 53 74 61 74 65  oid);.void State
4650: 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74  _init(void);.int
4660: 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74   State_insert(st
4670: 72 75 63 74 20 73 74 61 74 65 20 2a 2c 20 73 74  ruct state *, st
4680: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a  ruct config *);.
4690: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74  struct state *St
46a0: 61 74 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20  ate_find(struct 
46b0: 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75 63  config *);.struc
46c0: 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f  t state **State_
46d0: 61 72 72 61 79 6f 66 28 76 6f 69 64 29 3b 0a 0a  arrayof(void);..
46e0: 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64  /* Routines used
46f0: 20 66 6f 72 20 65 66 66 69 63 69 65 6e 63 79 20   for efficiency 
4700: 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  in Configlist_ad
4710: 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69  d */..void Confi
4720: 67 74 61 62 6c 65 5f 69 6e 69 74 28 76 6f 69 64  gtable_init(void
4730: 29 3b 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62  );.int Configtab
4740: 6c 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74  le_insert(struct
4750: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75   config *);.stru
4760: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
4770: 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74 72 75  gtable_find(stru
4780: 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f  ct config *);.vo
4790: 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63  id Configtable_c
47a0: 6c 65 61 72 28 69 6e 74 28 2a 29 28 73 74 72 75  lear(int(*)(stru
47b0: 63 74 20 63 6f 6e 66 69 67 20 2a 29 29 3b 0a 0a  ct config *));..
47c0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
47d0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
47e0: 65 20 22 61 63 74 69 6f 6e 2e 63 22 20 2a 2a 2a  e "action.c" ***
47f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
4810: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f  .** Routines pro
4820: 63 65 73 73 69 6e 67 20 70 61 72 73 65 72 20 61  cessing parser a
4830: 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 45  ctions in the LE
4840: 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
4850: 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 41 6c 6c  ator..*/../* All
4860: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 72 73  ocate a new pars
4870: 65 72 20 61 63 74 69 6f 6e 20 2a 2f 0a 73 74 61  er action */.sta
4880: 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f  tic struct actio
4890: 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77 28 76 6f  n *Action_new(vo
48a0: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74  id){.  static st
48b0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 66 72 65  ruct action *fre
48c0: 65 6c 69 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  elist = 0;.  str
48d0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 61  uct action *newa
48e0: 63 74 69 6f 6e 3b 0a 0a 20 20 69 66 28 20 66 72  ction;..  if( fr
48f0: 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
4900: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
4910: 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 66  amt = 100;.    f
4920: 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63  reelist = (struc
4930: 74 20 61 63 74 69 6f 6e 20 2a 29 63 61 6c 6c 6f  t action *)callo
4940: 63 28 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74  c(amt, sizeof(st
4950: 72 75 63 74 20 61 63 74 69 6f 6e 29 29 3b 0a 20  ruct action));. 
4960: 20 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d     if( freelist=
4970: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
4980: 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62  ntf(stderr,"Unab
4990: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
49a0: 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20  emory for a new 
49b0: 70 61 72 73 65 72 20 61 63 74 69 6f 6e 2e 22 29  parser action.")
49c0: 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
49d0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
49e0: 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b  =0; i<amt-1; i++
49f0: 29 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65  ) freelist[i].ne
4a00: 78 74 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69  xt = &freelist[i
4a10: 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  +1];.    freelis
4a20: 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20  t[amt-1].next = 
4a30: 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 61 63 74 69  0;.  }.  newacti
4a40: 6f 6e 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20  on = freelist;. 
4a50: 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65 65   freelist = free
4a60: 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65  list->next;.  re
4a70: 74 75 72 6e 20 6e 65 77 61 63 74 69 6f 6e 3b 0a  turn newaction;.
4a80: 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77  }../* Compare tw
4a90: 6f 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 73 6f  o actions for so
4aa0: 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  rting purposes. 
4ab0: 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
4ac0: 2c 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20 70 6f  , zero, or.** po
4ad0: 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
4ae0: 72 73 74 20 61 63 74 69 6f 6e 20 69 73 20 6c 65  rst action is le
4af0: 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
4b00: 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
4b10: 61 6e 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 0a  an.** the first.
4b20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
4b30: 74 69 6f 6e 63 6d 70 28 0a 20 20 73 74 72 75 63  tioncmp(.  struc
4b40: 74 20 61 63 74 69 6f 6e 20 2a 61 70 31 2c 0a 20  t action *ap1,. 
4b50: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
4b60: 61 70 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ap2.){.  int rc;
4b70: 0a 20 20 72 63 20 3d 20 61 70 31 2d 3e 73 70 2d  .  rc = ap1->sp-
4b80: 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e 73 70  >index - ap2->sp
4b90: 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 72  ->index;.  if( r
4ba0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==0 ){.    rc =
4bb0: 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70 65 20   (int)ap1->type 
4bc0: 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79 70 65  - (int)ap2->type
4bd0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
4be0: 30 20 26 26 20 28 61 70 31 2d 3e 74 79 70 65 3d  0 && (ap1->type=
4bf0: 3d 52 45 44 55 43 45 20 7c 7c 20 61 70 31 2d 3e  =REDUCE || ap1->
4c00: 74 79 70 65 3d 3d 53 48 49 46 54 52 45 44 55 43  type==SHIFTREDUC
4c10: 45 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61  E) ){.    rc = a
4c20: 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20  p1->x.rp->index 
4c30: 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64  - ap2->x.rp->ind
4c40: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ex;.  }.  if( rc
4c50: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
4c60: 28 69 6e 74 29 20 28 61 70 32 20 2d 20 61 70 31  (int) (ap2 - ap1
4c70: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4c80: 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 70  rc;.}../* Sort p
4c90: 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20 2a 2f  arser actions */
4ca0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
4cb0: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f  ction *Action_so
4cc0: 72 74 28 0a 20 20 73 74 72 75 63 74 20 61 63 74  rt(.  struct act
4cd0: 69 6f 6e 20 2a 61 70 0a 29 7b 0a 20 20 61 70 20  ion *ap.){.  ap 
4ce0: 3d 20 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  = (struct action
4cf0: 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a   *)msort((char *
4d00: 29 61 70 2c 28 63 68 61 72 20 2a 2a 29 26 61 70  )ap,(char **)&ap
4d10: 2d 3e 6e 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ->next,.        
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 20 20 20 20 20 20 28 69 6e 74 28 2a 29 28 63 6f        (int(*)(co
4d40: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
4d50: 63 68 61 72 2a 29 29 61 63 74 69 6f 6e 63 6d 70  char*))actioncmp
4d60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 70 3b 0a  );.  return ap;.
4d70: 7d 0a 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61  }..void Action_a
4d80: 64 64 28 0a 20 20 73 74 72 75 63 74 20 61 63 74  dd(.  struct act
4d90: 69 6f 6e 20 2a 2a 61 70 70 2c 0a 20 20 65 6e 75  ion **app,.  enu
4da0: 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79 70 65 2c  m e_action type,
4db0: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
4dc0: 20 2a 73 70 2c 0a 20 20 63 68 61 72 20 2a 61 72   *sp,.  char *ar
4dd0: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 61 63  g.){.  struct ac
4de0: 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f 6e 3b  tion *newaction;
4df0: 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d 20 41  .  newaction = A
4e00: 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a 20 20 6e  ction_new();.  n
4e10: 65 77 61 63 74 69 6f 6e 2d 3e 6e 65 78 74 20 3d  ewaction->next =
4e20: 20 2a 61 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20   *app;.  *app = 
4e30: 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e 65 77  newaction;.  new
4e40: 61 63 74 69 6f 6e 2d 3e 74 79 70 65 20 3d 20 74  action->type = t
4e50: 79 70 65 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e  ype;.  newaction
4e60: 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 6e 65 77  ->sp = sp;.  new
4e70: 61 63 74 69 6f 6e 2d 3e 73 70 4f 70 74 20 3d 20  action->spOpt = 
4e80: 30 3b 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53  0;.  if( type==S
4e90: 48 49 46 54 20 29 7b 0a 20 20 20 20 6e 65 77 61  HIFT ){.    newa
4ea0: 63 74 69 6f 6e 2d 3e 78 2e 73 74 70 20 3d 20 28  ction->x.stp = (
4eb0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 61  struct state *)a
4ec0: 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rg;.  }else{.   
4ed0: 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78 2e 72 70   newaction->x.rp
4ee0: 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65 20   = (struct rule 
4ef0: 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a  *)arg;.  }.}./**
4f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f10: 2a 2a 2a 2a 20 4e 65 77 20 63 6f 64 65 20 74 6f  **** New code to
4f20: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 22   implement the "
4f30: 61 63 74 74 61 62 22 20 6d 6f 64 75 6c 65 20 2a  acttab" module *
4f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
4f50: 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 6d  * This module im
4f60: 70 6c 65 6d 65 6e 74 73 20 72 6f 75 74 69 6e 65  plements routine
4f70: 73 20 75 73 65 20 74 6f 20 63 6f 6e 73 74 72 75  s use to constru
4f80: 63 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  ct the yy_action
4f90: 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  [] table..*/../*
4fa0: 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66  .** The state of
4fb0: 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74   the yy_action t
4fc0: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
4fd0: 72 75 63 74 69 6f 6e 20 69 73 20 61 6e 20 69 6e  ruction is an in
4fe0: 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65  stance of.** the
4ff0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
5000: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ture..**.** The 
5010: 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  yy_action table 
5020: 6d 61 70 73 20 74 68 65 20 70 61 69 72 20 28 73  maps the pair (s
5030: 74 61 74 65 5f 6e 75 6d 62 65 72 2c 20 6c 6f 6f  tate_number, loo
5040: 6b 61 68 65 61 64 29 20 69 6e 74 6f 20 61 6e 0a  kahead) into an.
5050: 2a 2a 20 61 63 74 69 6f 6e 5f 6e 75 6d 62 65 72  ** action_number
5060: 2e 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  .  The table is 
5070: 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65  an array of inte
5080: 67 65 72 73 20 70 61 69 72 73 2e 20 20 54 68 65  gers pairs.  The
5090: 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 0a 2a 2a   state_number.**
50a0: 20 64 65 74 65 72 6d 69 6e 65 73 20 61 6e 20 69   determines an i
50b0: 6e 69 74 69 61 6c 20 6f 66 66 73 65 74 20 69 6e  nitial offset in
50c0: 74 6f 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  to the yy_action
50d0: 20 61 72 72 61 79 2e 20 20 54 68 65 20 6c 6f 6f   array.  The loo
50e0: 6b 61 68 65 61 64 0a 2a 2a 20 76 61 6c 75 65 20  kahead.** value 
50f0: 69 73 20 74 68 65 6e 20 61 64 64 65 64 20 74 6f  is then added to
5100: 20 74 68 69 73 20 69 6e 69 74 69 61 6c 20 6f 66   this initial of
5110: 66 73 65 74 20 74 6f 20 67 65 74 20 61 6e 20 69  fset to get an i
5120: 6e 64 65 78 20 58 20 69 6e 74 6f 20 74 68 65 0a  ndex X into the.
5130: 2a 2a 20 79 79 5f 61 63 74 69 6f 6e 20 61 72 72  ** yy_action arr
5140: 61 79 2e 20 49 66 20 74 68 65 20 61 41 63 74 69  ay. If the aActi
5150: 6f 6e 5b 58 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  on[X].lookahead 
5160: 65 71 75 61 6c 73 20 74 68 65 20 76 61 6c 75 65  equals the value
5170: 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 66 20 74 68   of the.** of th
5180: 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e 70 75  e lookahead inpu
5190: 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  t, then the valu
51a0: 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 5f  e of the action_
51b0: 6e 75 6d 62 65 72 20 6f 75 74 70 75 74 20 69 73  number output is
51c0: 0a 2a 2a 20 61 41 63 74 69 6f 6e 5b 58 5d 2e 61  .** aAction[X].a
51d0: 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 6c  ction.  If the l
51e0: 6f 6f 6b 61 68 65 61 64 73 20 64 6f 20 6e 6f 74  ookaheads do not
51f0: 20 6d 61 74 63 68 20 74 68 65 6e 20 74 68 65 0a   match then the.
5200: 2a 2a 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f  ** default actio
5210: 6e 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 5f  n for the state_
5220: 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75 72 6e  number is return
5230: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 61 63  ed..**.** All ac
5240: 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
5250: 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 73   with a single s
5260: 74 61 74 65 5f 6e 75 6d 62 65 72 20 61 72 65 20  tate_number are 
5270: 66 69 72 73 74 20 65 6e 74 65 72 65 64 0a 2a 2a  first entered.**
5280: 20 69 6e 74 6f 20 61 4c 6f 6f 6b 61 68 65 61 64   into aLookahead
5290: 5b 5d 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c  [] using multipl
52a0: 65 20 63 61 6c 6c 73 20 74 6f 20 61 63 74 74 61  e calls to actta
52b0: 62 5f 61 63 74 69 6f 6e 28 29 2e 20 20 54 68 65  b_action().  The
52c0: 6e 20 74 68 65 0a 2a 2a 20 61 63 74 69 6f 6e 73  n the.** actions
52d0: 20 66 6f 72 20 74 68 61 74 20 73 69 6e 67 6c 65   for that single
52e0: 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 61 72   state_number ar
52f0: 65 20 70 6c 61 63 65 64 20 69 6e 74 6f 20 74 68  e placed into th
5300: 65 20 61 41 63 74 69 6f 6e 5b 5d 0a 2a 2a 20 61  e aAction[].** a
5310: 72 72 61 79 20 77 69 74 68 20 61 20 73 69 6e 67  rray with a sing
5320: 6c 65 20 63 61 6c 6c 20 74 6f 20 61 63 74 74 61  le call to actta
5330: 62 5f 69 6e 73 65 72 74 28 29 2e 20 20 54 68 65  b_insert().  The
5340: 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 29   acttab_insert()
5350: 20 63 61 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 72 65   call.** also re
5360: 73 65 74 73 20 74 68 65 20 61 4c 6f 6f 6b 61 68  sets the aLookah
5370: 65 61 64 5b 5d 20 61 72 72 61 79 20 69 6e 20 70  ead[] array in p
5380: 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 74  reparation for t
5390: 68 65 20 6e 65 78 74 0a 2a 2a 20 73 74 61 74 65  he next.** state
53a0: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 72 75   number..*/.stru
53b0: 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74  ct lookahead_act
53c0: 69 6f 6e 20 7b 0a 20 20 69 6e 74 20 6c 6f 6f 6b  ion {.  int look
53d0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
53e0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74     /* Value of t
53f0: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 74 6f 6b  he lookahead tok
5400: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 63 74 69  en */.  int acti
5410: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
5420: 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20     /* Action to 
5430: 74 61 6b 65 20 6f 6e 20 74 68 65 20 67 69 76 65  take on the give
5440: 6e 20 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 7d  n lookahead */.}
5450: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
5460: 20 61 63 74 74 61 62 20 61 63 74 74 61 62 3b 0a   acttab acttab;.
5470: 73 74 72 75 63 74 20 61 63 74 74 61 62 20 7b 0a  struct acttab {.
5480: 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20    int nAction;  
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
54a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 64  * Number of used
54b0: 20 73 6c 6f 74 73 20 69 6e 20 61 41 63 74 69 6f   slots in aActio
54c0: 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63  n[] */.  int nAc
54d0: 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20  tionAlloc;      
54e0: 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61        /* Slots a
54f0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 41 63  llocated for aAc
5500: 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 73 74 72 75  tion[] */.  stru
5510: 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74  ct lookahead_act
5520: 69 6f 6e 0a 20 20 20 20 2a 61 41 63 74 69 6f 6e  ion.    *aAction
5530: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5540: 20 20 20 2f 2a 20 54 68 65 20 79 79 5f 61 63 74     /* The yy_act
5550: 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 75 6e 64 65  ion[] table unde
5560: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
5570: 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b 61 68 65 61  /.    *aLookahea
5580: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
5590: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e 65 77   /* A single new
55a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
55b0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f 6f 6b   */.  int mnLook
55c0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
55d0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 4c     /* Minimum aL
55e0: 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61  ookahead[].looka
55f0: 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e  head */.  int mn
5600: 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Action;         
5610: 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e         /* Action
5620: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
5630: 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a   mnLookahead */.
5640: 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68 65 61    int mxLookahea
5650: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
5660: 2a 20 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f 6b 61  * Maximum aLooka
5670: 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64  head[].lookahead
5680: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61   */.  int nLooka
5690: 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  head;           
56a0: 20 20 20 2f 2a 20 55 73 65 64 20 73 6c 6f 74 73     /* Used slots
56b0: 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d   in aLookahead[]
56c0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61   */.  int nLooka
56d0: 68 65 61 64 41 6c 6c 6f 63 3b 20 20 20 20 20 20  headAlloc;      
56e0: 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f     /* Slots allo
56f0: 63 61 74 65 64 20 69 6e 20 61 4c 6f 6f 6b 61 68  cated in aLookah
5700: 65 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ead[] */.  int n
5710: 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20 20  terminal;       
5720: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5730: 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79  r of terminal sy
5740: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  mbols */.  int n
5750: 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20 20 20 20  symbol;         
5760: 20 20 20 20 20 20 20 20 2f 2a 20 74 6f 74 61 6c          /* total
5770: 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6d 62 6f   number of symbo
5780: 6c 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65 74  ls */.};../* Ret
5790: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
57a0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
57b0: 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65   yy_action table
57c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74   */.#define actt
57d0: 61 62 5f 6c 6f 6f 6b 61 68 65 61 64 5f 73 69 7a  ab_lookahead_siz
57e0: 65 28 58 29 20 28 28 58 29 2d 3e 6e 41 63 74 69  e(X) ((X)->nActi
57f0: 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75  on)../* The valu
5800: 65 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 65  e for the N-th e
5810: 6e 74 72 79 20 69 6e 20 79 79 5f 61 63 74 69 6f  ntry in yy_actio
5820: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74  n */.#define act
5830: 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 58 2c 4e  tab_yyaction(X,N
5840: 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e  )  ((X)->aAction
5850: 5b 4e 5d 2e 61 63 74 69 6f 6e 29 0a 0a 2f 2a 20  [N].action)../* 
5860: 54 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  The value for th
5870: 65 20 4e 2d 74 68 20 65 6e 74 72 79 20 69 6e 20  e N-th entry in 
5880: 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a  yy_lookahead */.
5890: 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79  #define acttab_y
58a0: 79 6c 6f 6f 6b 61 68 65 61 64 28 58 2c 4e 29 20  ylookahead(X,N) 
58b0: 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e   ((X)->aAction[N
58c0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 29 0a 0a 2f 2a  ].lookahead)../*
58d0: 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
58e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
58f0: 20 74 68 65 20 67 69 76 65 6e 20 61 63 74 74 61   the given actta
5900: 62 20 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62  b */.void acttab
5910: 5f 66 72 65 65 28 61 63 74 74 61 62 20 2a 70 29  _free(acttab *p)
5920: 7b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 41 63  {.  free( p->aAc
5930: 74 69 6f 6e 20 29 3b 0a 20 20 66 72 65 65 28 20  tion );.  free( 
5940: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 29 3b  p->aLookahead );
5950: 0a 20 20 66 72 65 65 28 20 70 20 29 3b 0a 7d 0a  .  free( p );.}.
5960: 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
5970: 65 77 20 61 63 74 74 61 62 20 73 74 72 75 63 74  ew acttab struct
5980: 75 72 65 20 2a 2f 0a 61 63 74 74 61 62 20 2a 61  ure */.acttab *a
5990: 63 74 74 61 62 5f 61 6c 6c 6f 63 28 69 6e 74 20  cttab_alloc(int 
59a0: 6e 73 79 6d 62 6f 6c 2c 20 69 6e 74 20 6e 74 65  nsymbol, int nte
59b0: 72 6d 69 6e 61 6c 29 7b 0a 20 20 61 63 74 74 61  rminal){.  actta
59c0: 62 20 2a 70 20 3d 20 28 61 63 74 74 61 62 20 2a  b *p = (acttab *
59d0: 29 20 63 61 6c 6c 6f 63 28 20 31 2c 20 73 69 7a  ) calloc( 1, siz
59e0: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
59f0: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72   p==0 ){.    fpr
5a00: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61  intf(stderr,"Una
5a10: 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
5a20: 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77  memory for a new
5a30: 20 61 63 74 74 61 62 2e 22 29 3b 0a 20 20 20 20   acttab.");.    
5a40: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d  exit(1);.  }.  m
5a50: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
5a60: 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d 3e 6e 73  of(*p));.  p->ns
5a70: 79 6d 62 6f 6c 20 3d 20 6e 73 79 6d 62 6f 6c 3b  ymbol = nsymbol;
5a80: 0a 20 20 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  .  p->nterminal 
5a90: 3d 20 6e 74 65 72 6d 69 6e 61 6c 3b 0a 20 20 72  = nterminal;.  r
5aa0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 20 41  eturn p;.}../* A
5ab0: 64 64 20 61 20 6e 65 77 20 61 63 74 69 6f 6e 20  dd a new action 
5ac0: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  to the current t
5ad0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 0a  ransaction set..
5ae0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5af0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
5b00: 65 20 66 6f 72 20 65 61 63 68 20 6c 6f 6f 6b 61  e for each looka
5b10: 68 65 61 64 20 66 6f 72 20 61 20 70 61 72 74 69  head for a parti
5b20: 63 75 6c 61 72 0a 2a 2a 20 73 74 61 74 65 2e 0a  cular.** state..
5b30: 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 61  */.void acttab_a
5b40: 63 74 69 6f 6e 28 61 63 74 74 61 62 20 2a 70 2c  ction(acttab *p,
5b50: 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 2c 20   int lookahead, 
5b60: 69 6e 74 20 61 63 74 69 6f 6e 29 7b 0a 20 20 69  int action){.  i
5b70: 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  f( p->nLookahead
5b80: 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41  >=p->nLookaheadA
5b90: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
5ba0: 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 2b  LookaheadAlloc +
5bb0: 3d 20 32 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 6f  = 25;.    p->aLo
5bc0: 6f 6b 61 68 65 61 64 20 3d 20 28 73 74 72 75 63  okahead = (struc
5bd0: 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74 69  t lookahead_acti
5be0: 6f 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28 20 70  on *) realloc( p
5bf0: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 2c 0a 20 20  ->aLookahead,.  
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
5c20: 66 28 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  f(p->aLookahead[
5c30: 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  0])*p->nLookahea
5c40: 64 41 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 69 66  dAlloc );.    if
5c50: 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 3d  ( p->aLookahead=
5c60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
5c70: 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c  ntf(stderr,"mall
5c80: 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20  oc failed\n");. 
5c90: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
5ca0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
5cb0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29  >nLookahead==0 )
5cc0: 7b 0a 20 20 20 20 70 2d 3e 6d 78 4c 6f 6f 6b 61  {.    p->mxLooka
5cd0: 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64  head = lookahead
5ce0: 3b 0a 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61  ;.    p->mnLooka
5cf0: 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64  head = lookahead
5d00: 3b 0a 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f  ;.    p->mnActio
5d10: 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 7d 65  n = action;.  }e
5d20: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  lse{.    if( p->
5d30: 6d 78 4c 6f 6f 6b 61 68 65 61 64 3c 6c 6f 6f 6b  mxLookahead<look
5d40: 61 68 65 61 64 20 29 20 70 2d 3e 6d 78 4c 6f 6f  ahead ) p->mxLoo
5d50: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
5d60: 61 64 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d  ad;.    if( p->m
5d70: 6e 4c 6f 6f 6b 61 68 65 61 64 3e 6c 6f 6f 6b 61  nLookahead>looka
5d80: 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  head ){.      p-
5d90: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  >mnLookahead = l
5da0: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 20 20  ookahead;.      
5db0: 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63  p->mnAction = ac
5dc0: 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tion;.    }.  }.
5dd0: 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b    p->aLookahead[
5de0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 6c  p->nLookahead].l
5df0: 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61  ookahead = looka
5e00: 68 65 61 64 3b 0a 20 20 70 2d 3e 61 4c 6f 6f 6b  head;.  p->aLook
5e10: 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68  ahead[p->nLookah
5e20: 65 61 64 5d 2e 61 63 74 69 6f 6e 20 3d 20 61 63  ead].action = ac
5e30: 74 69 6f 6e 3b 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b  tion;.  p->nLook
5e40: 61 68 65 61 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  ahead++;.}../*.*
5e50: 2a 20 41 64 64 20 74 68 65 20 74 72 61 6e 73 61  * Add the transa
5e60: 63 74 69 6f 6e 20 73 65 74 20 62 75 69 6c 74 20  ction set built 
5e70: 75 70 20 77 69 74 68 20 70 72 69 6f 72 20 63 61  up with prior ca
5e80: 6c 6c 73 20 74 6f 20 61 63 74 74 61 62 5f 61 63  lls to acttab_ac
5e90: 74 69 6f 6e 28 29 0a 2a 2a 20 69 6e 74 6f 20 74  tion().** into t
5ea0: 68 65 20 63 75 72 72 65 6e 74 20 61 63 74 69 6f  he current actio
5eb0: 6e 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 72  n table.  Then r
5ec0: 65 73 65 74 20 74 68 65 20 74 72 61 6e 73 61 63  eset the transac
5ed0: 74 69 6f 6e 20 73 65 74 20 62 61 63 6b 0a 2a 2a  tion set back.**
5ee0: 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 73 65 74   to an empty set
5ef0: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20   in preparation 
5f00: 66 6f 72 20 61 20 6e 65 77 20 72 6f 75 6e 64 20  for a new round 
5f10: 6f 66 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e  of acttab_action
5f20: 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  () calls..**.** 
5f30: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
5f40: 74 20 69 6e 74 6f 20 74 68 65 20 61 63 74 69 6f  t into the actio
5f50: 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6e  n table of the n
5f60: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
5f70: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 6b  **.** If the mak
5f80: 65 49 74 53 61 66 65 20 70 61 72 61 6d 65 74 65  eItSafe paramete
5f90: 72 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  r is true, then 
5fa0: 74 68 65 20 6f 66 66 73 65 74 20 69 73 20 63 68  the offset is ch
5fb0: 6f 73 65 6e 20 73 6f 20 74 68 61 74 0a 2a 2a 20  osen so that.** 
5fc0: 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  it is impossible
5fd0: 20 74 6f 20 6f 76 65 72 72 65 61 64 20 74 68 65   to overread the
5fe0: 20 79 79 5f 6c 6f 6f 6b 61 73 69 64 65 5b 5d 20   yy_lookaside[] 
5ff0: 74 61 62 6c 65 20 72 65 67 61 72 64 6c 65 73 73  table regardless
6000: 20 6f 66 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61   of.** the looka
6010: 73 69 64 65 20 74 6f 6b 65 6e 2e 20 20 54 68 69  side token.  Thi
6020: 73 20 69 73 20 64 6f 6e 65 20 66 6f 72 20 74 68  s is done for th
6030: 65 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  e terminal symbo
6040: 6c 73 2c 20 61 73 20 74 68 65 79 0a 2a 2a 20 63  ls, as they.** c
6050: 6f 6d 65 20 66 72 6f 6d 20 65 78 74 65 72 6e 61  ome from externa
6060: 6c 20 69 6e 70 75 74 73 20 61 6e 64 20 63 61 6e  l inputs and can
6070: 20 63 6f 6e 74 61 69 6e 20 73 79 6e 74 61 78 20   contain syntax 
6080: 65 72 72 6f 72 73 2e 20 20 57 68 65 6e 20 6d 61  errors.  When ma
6090: 6b 65 49 74 53 61 66 65 0a 2a 2a 20 69 73 20 66  keItSafe.** is f
60a0: 61 6c 73 65 2c 20 74 68 65 72 65 20 69 73 20 6d  alse, there is m
60b0: 6f 72 65 20 66 6c 65 78 69 62 69 6c 69 74 79 20  ore flexibility 
60c0: 69 6e 20 73 65 6c 65 63 74 69 6e 67 20 6f 66 66  in selecting off
60d0: 73 65 74 73 2c 20 72 65 73 75 6c 74 69 6e 67 20  sets, resulting 
60e0: 69 6e 0a 2a 2a 20 61 20 73 6d 61 6c 6c 65 72 20  in.** a smaller 
60f0: 74 61 62 6c 65 2e 20 20 46 6f 72 20 6e 6f 6e 2d  table.  For non-
6100: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
6110: 2c 20 77 68 69 63 68 20 61 72 65 20 6e 65 76 65  , which are neve
6120: 72 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73 2c  r syntax errors,
6130: 0a 2a 2a 20 6d 61 6b 65 49 74 53 61 66 65 20 63  .** makeItSafe c
6140: 61 6e 20 62 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a  an be false..*/.
6150: 69 6e 74 20 61 63 74 74 61 62 5f 69 6e 73 65 72  int acttab_inser
6160: 74 28 61 63 74 74 61 62 20 2a 70 2c 20 69 6e 74  t(acttab *p, int
6170: 20 6d 61 6b 65 49 74 53 61 66 65 29 7b 0a 20 20   makeItSafe){.  
6180: 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 2c 20  int i, j, k, n, 
6190: 65 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  end;.  assert( p
61a0: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 30 20 29  ->nLookahead>0 )
61b0: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
61c0: 65 20 77 65 20 68 61 76 65 20 65 6e 6f 75 67 68  e we have enough
61d0: 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   space to hold t
61e0: 68 65 20 65 78 70 61 6e 64 65 64 20 61 63 74 69  he expanded acti
61f0: 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  on table.  ** in
6200: 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e   the worst case.
6210: 20 20 54 68 65 20 77 6f 72 73 74 20 63 61 73 65    The worst case
6220: 20 6f 63 63 75 72 73 20 69 66 20 74 68 65 20 74   occurs if the t
6230: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a 20  ransaction set. 
6240: 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 70 70 65   ** must be appe
6250: 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72  nded to the curr
6260: 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ent action table
6270: 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 70 2d 3e 6e  .  */.  n = p->n
6280: 73 79 6d 62 6f 6c 20 2b 20 31 3b 0a 20 20 69 66  symbol + 1;.  if
6290: 28 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e  ( p->nAction + n
62a0: 20 3e 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c   >= p->nActionAl
62b0: 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  loc ){.    int o
62c0: 6c 64 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63  ldAlloc = p->nAc
62d0: 74 69 6f 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 70  tionAlloc;.    p
62e0: 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 3d  ->nActionAlloc =
62f0: 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e 20   p->nAction + n 
6300: 2b 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  + p->nActionAllo
6310: 63 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 61  c + 20;.    p->a
6320: 41 63 74 69 6f 6e 20 3d 20 28 73 74 72 75 63 74  Action = (struct
6330: 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74 69 6f   lookahead_actio
6340: 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28 20 70 2d  n *) realloc( p-
6350: 3e 61 41 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20  >aAction,.      
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6370: 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 41      sizeof(p->aA
6380: 63 74 69 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63  ction[0])*p->nAc
6390: 74 69 6f 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  tionAlloc);.    
63a0: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d  if( p->aAction==
63b0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
63c0: 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f  tf(stderr,"mallo
63d0: 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20  c failed\n");.  
63e0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
63f0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6f 6c 64   }.    for(i=old
6400: 41 6c 6c 6f 63 3b 20 69 3c 70 2d 3e 6e 41 63 74  Alloc; i<p->nAct
6410: 69 6f 6e 41 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a  ionAlloc; i++){.
6420: 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e        p->aAction
6430: 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20  [i].lookahead = 
6440: 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 61 41 63  -1;.      p->aAc
6450: 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d  tion[i].action =
6460: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   -1;.    }.  }..
6470: 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 65 78    /* Scan the ex
6480: 69 73 74 69 6e 67 20 61 63 74 69 6f 6e 20 74 61  isting action ta
6490: 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ble looking for 
64a0: 61 6e 20 6f 66 66 73 65 74 20 74 68 61 74 20 69  an offset that i
64b0: 73 20 61 0a 20 20 2a 2a 20 64 75 70 6c 69 63 61  s a.  ** duplica
64c0: 74 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  te of the curren
64d0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  t transaction se
64e0: 74 2e 20 20 46 61 6c 6c 20 6f 75 74 20 6f 66 20  t.  Fall out of 
64f0: 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2a 20 69 66  the loop.  ** if
6500: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 64 75   and when the du
6510: 70 6c 69 63 61 74 65 20 69 73 20 66 6f 75 6e 64  plicate is found
6520: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 20 69 73  ..  **.  ** i is
6530: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 2d   the index in p-
6540: 3e 61 41 63 74 69 6f 6e 5b 5d 20 77 68 65 72 65  >aAction[] where
6550: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
6560: 69 73 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a  is inserted..  *
6570: 2f 0a 20 20 65 6e 64 20 3d 20 6d 61 6b 65 49 74  /.  end = makeIt
6580: 53 61 66 65 20 3f 20 70 2d 3e 6d 6e 4c 6f 6f 6b  Safe ? p->mnLook
6590: 61 68 65 61 64 20 3a 20 30 3b 0a 20 20 66 6f 72  ahead : 0;.  for
65a0: 28 69 3d 70 2d 3e 6e 41 63 74 69 6f 6e 2d 31 3b  (i=p->nAction-1;
65b0: 20 69 3e 3d 65 6e 64 3b 20 69 2d 2d 29 7b 0a 20   i>=end; i--){. 
65c0: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
65d0: 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d  n[i].lookahead==
65e0: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  p->mnLookahead )
65f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6c  {.      /* All l
6600: 6f 6f 6b 61 68 65 61 64 73 20 61 6e 64 20 61 63  ookaheads and ac
6610: 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 61 4c 6f  tions in the aLo
6620: 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61  okahead[] transa
6630: 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6d  ction.      ** m
6640: 75 73 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73  ust match agains
6650: 74 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  t the candidate 
6660: 61 41 63 74 69 6f 6e 5b 69 5d 20 65 6e 74 72 79  aAction[i] entry
6670: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
6680: 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74  ->aAction[i].act
6690: 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63 74 69 6f 6e  ion!=p->mnAction
66a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
66b0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
66c0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b  >nLookahead; j++
66d0: 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 70  ){.        k = p
66e0: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e  ->aLookahead[j].
66f0: 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d  lookahead - p->m
6700: 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a  nLookahead + i;.
6710: 20 20 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20          if( k<0 
6720: 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e  || k>=p->nAction
6730: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
6740: 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68    if( p->aLookah
6750: 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ead[j].lookahead
6760: 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e  !=p->aAction[k].
6770: 6c 6f 6f 6b 61 68 65 61 64 20 29 20 62 72 65 61  lookahead ) brea
6780: 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
6790: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e  ->aLookahead[j].
67a0: 61 63 74 69 6f 6e 21 3d 70 2d 3e 61 41 63 74 69  action!=p->aActi
67b0: 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e 20 29 20 62  on[k].action ) b
67c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
67d0: 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f      if( j<p->nLo
67e0: 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74 69 6e  okahead ) contin
67f0: 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  ue;..      /* No
6800: 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 61 68   possible lookah
6810: 65 61 64 20 76 61 6c 75 65 20 74 68 61 74 20 69  ead value that i
6820: 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 61 4c 6f  s not in the aLo
6830: 6f 6b 61 68 65 61 64 5b 5d 0a 20 20 20 20 20 20  okahead[].      
6840: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
6850: 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74  s allowed to mat
6860: 63 68 20 61 41 63 74 69 6f 6e 5b 69 5d 20 2a 2f  ch aAction[i] */
6870: 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20  .      n = 0;.  
6880: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
6890: 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b  ->nAction; j++){
68a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
68b0: 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61  aAction[j].looka
68c0: 68 65 61 64 3c 30 20 29 20 63 6f 6e 74 69 6e 75  head<0 ) continu
68d0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
68e0: 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f  ->aAction[j].loo
68f0: 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c  kahead==j+p->mnL
6900: 6f 6f 6b 61 68 65 61 64 2d 69 20 29 20 6e 2b 2b  ookahead-i ) n++
6910: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6920: 69 66 28 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61  if( n==p->nLooka
6930: 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  head ){.        
6940: 62 72 65 61 6b 3b 20 20 2f 2a 20 41 6e 20 65 78  break;  /* An ex
6950: 61 63 74 20 6d 61 74 63 68 20 69 73 20 66 6f 75  act match is fou
6960: 6e 64 20 61 74 20 6f 66 66 73 65 74 20 69 20 2a  nd at offset i *
6970: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
6980: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20    }..  /* If no 
6990: 65 78 69 73 74 69 6e 67 20 6f 66 66 73 65 74 73  existing offsets
69a0: 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 20 74   exactly match t
69b0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
69c0: 61 63 74 69 6f 6e 2c 20 66 69 6e 64 20 61 6e 0a  action, find an.
69d0: 20 20 2a 2a 20 61 6e 20 65 6d 70 74 79 20 6f 66    ** an empty of
69e0: 66 73 65 74 20 69 6e 20 74 68 65 20 61 41 63 74  fset in the aAct
69f0: 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 69 6e 20 77  ion[] table in w
6a00: 68 69 63 68 20 77 65 20 63 61 6e 20 61 64 64 20  hich we can add 
6a10: 74 68 65 0a 20 20 2a 2a 20 61 4c 6f 6f 6b 61 68  the.  ** aLookah
6a20: 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74 69 6f  ead[] transactio
6a30: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 3c  n..  */.  if( i<
6a40: 65 6e 64 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 6f  end ){.    /* Lo
6a50: 6f 6b 20 66 6f 72 20 68 6f 6c 65 73 20 69 6e 20  ok for holes in 
6a60: 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 74 61  the aAction[] ta
6a70: 62 6c 65 20 74 68 61 74 20 66 69 74 20 74 68 65  ble that fit the
6a80: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
6a90: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61  aLookahead[] tra
6aa0: 6e 73 61 63 74 69 6f 6e 2e 20 20 4c 65 61 76 65  nsaction.  Leave
6ab0: 20 69 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66   i set to the of
6ac0: 66 73 65 74 20 6f 66 20 74 68 65 20 68 6f 6c 65  fset of the hole
6ad0: 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 20 68  ..    ** If no h
6ae0: 6f 6c 65 73 20 61 72 65 20 66 6f 75 6e 64 2c 20  oles are found, 
6af0: 69 20 69 73 20 6c 65 66 74 20 61 74 20 70 2d 3e  i is left at p->
6b00: 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63 68 20 6d  nAction, which m
6b10: 65 61 6e 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  eans the.    ** 
6b20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
6b30: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 2a 2f   be appended. */
6b40: 0a 20 20 20 20 69 20 3d 20 6d 61 6b 65 49 74 53  .    i = makeItS
6b50: 61 66 65 20 3f 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61  afe ? p->mnLooka
6b60: 68 65 61 64 20 3a 20 30 3b 0a 20 20 20 20 66 6f  head : 0;.    fo
6b70: 72 28 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e  r(; i<p->nAction
6b80: 41 6c 6c 6f 63 20 2d 20 70 2d 3e 6d 78 4c 6f 6f  Alloc - p->mxLoo
6b90: 6b 61 68 65 61 64 3b 20 69 2b 2b 29 7b 0a 20 20  kahead; i++){.  
6ba0: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
6bb0: 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c  on[i].lookahead<
6bc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
6bd0: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b  (j=0; j<p->nLook
6be0: 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ahead; j++){.   
6bf0: 20 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c         k = p->aL
6c00: 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b  ookahead[j].look
6c10: 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f  ahead - p->mnLoo
6c20: 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20  kahead + i;.    
6c30: 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20 29 20        if( k<0 ) 
6c40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
6c50: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
6c60: 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e 3d 30 20  k].lookahead>=0 
6c70: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
6c80: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
6c90: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  <p->nLookahead )
6ca0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6cb0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
6cc0: 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a  >nAction; j++){.
6cd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
6ce0: 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b  >aAction[j].look
6cf0: 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f  ahead==j+p->mnLo
6d00: 6f 6b 61 68 65 61 64 2d 69 20 29 20 62 72 65 61  okahead-i ) brea
6d10: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
6d20: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e       if( j==p->n
6d30: 41 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Action ){.      
6d40: 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 46      break;  /* F
6d50: 69 74 73 20 69 6e 20 65 6d 70 74 79 20 73 6c 6f  its in empty slo
6d60: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ts */.        }.
6d70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6d80: 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 72  }.  /* Insert tr
6d90: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 61 74  ansaction set at
6da0: 20 69 6e 64 65 78 20 69 2e 20 2a 2f 0a 23 69 66   index i. */.#if
6db0: 20 30 0a 20 20 70 72 69 6e 74 66 28 22 41 63 74   0.  printf("Act
6dc0: 74 61 62 3a 22 29 3b 0a 20 20 66 6f 72 28 6a 3d  tab:");.  for(j=
6dd0: 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  0; j<p->nLookahe
6de0: 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 70 72  ad; j++){.    pr
6df0: 69 6e 74 66 28 22 20 25 64 22 2c 20 70 2d 3e 61  intf(" %d", p->a
6e00: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f  Lookahead[j].loo
6e10: 6b 61 68 65 61 64 29 3b 0a 20 20 7d 0a 20 20 70  kahead);.  }.  p
6e20: 72 69 6e 74 66 28 22 20 69 6e 73 65 72 74 65 64  rintf(" inserted
6e30: 20 61 74 20 25 64 5c 6e 22 2c 20 69 29 3b 0a 23   at %d\n", i);.#
6e40: 65 6e 64 69 66 0a 20 20 66 6f 72 28 6a 3d 30 3b  endif.  for(j=0;
6e50: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
6e60: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d 20  ; j++){.    k = 
6e70: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
6e80: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
6e90: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
6ea0: 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b  .    p->aAction[
6eb0: 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65  k] = p->aLookahe
6ec0: 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b  ad[j];.    if( k
6ed0: 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 70  >=p->nAction ) p
6ee0: 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b  ->nAction = k+1;
6ef0: 0a 20 20 7d 0a 20 20 69 66 28 20 6d 61 6b 65 49  .  }.  if( makeI
6f00: 74 53 61 66 65 20 26 26 20 69 2b 70 2d 3e 6e 74  tSafe && i+p->nt
6f10: 65 72 6d 69 6e 61 6c 3e 70 2d 3e 6e 41 63 74 69  erminal>p->nActi
6f20: 6f 6e 20 29 20 70 2d 3e 6e 41 63 74 69 6f 6e 20  on ) p->nAction 
6f30: 3d 20 69 2b 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  = i+p->nterminal
6f40: 3b 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ;.  p->nLookahea
6f50: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74  d = 0;..  /* Ret
6f60: 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 74  urn the offset t
6f70: 68 61 74 20 69 73 20 61 64 64 65 64 20 74 6f 20  hat is added to 
6f80: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e  the lookahead in
6f90: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
6fa0: 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74  e.  ** index int
6fb0: 6f 20 79 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74  o yy_action of t
6fc0: 68 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72  he action */.  r
6fd0: 65 74 75 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c  eturn i - p->mnL
6fe0: 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a  ookahead;.}../*.
6ff0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
7000: 7a 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e  ze of the action
7010: 20 74 61 62 6c 65 20 77 69 74 68 6f 75 74 20 74   table without t
7020: 68 65 20 74 72 61 69 6c 69 6e 67 20 73 79 6e 74  he trailing synt
7030: 61 78 20 65 72 72 6f 72 0a 2a 2a 20 65 6e 74 72  ax error.** entr
7040: 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74 74  ies..*/.int actt
7050: 61 62 5f 61 63 74 69 6f 6e 5f 73 69 7a 65 28 61  ab_action_size(a
7060: 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 69 6e 74  cttab *p){.  int
7070: 20 6e 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 3b   n = p->nAction;
7080: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
7090: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6e 2d 31 5d   p->aAction[n-1]
70a0: 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b 20  .lookahead<0 ){ 
70b0: 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20  n--; }.  return 
70c0: 6e 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  n;.}../*********
70d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
70e0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 62 75 69  om the file "bui
70f0: 6c 64 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ld.c" **********
7100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7110: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ***/./*.** Routi
7120: 6e 65 73 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  nes to construct
7130: 69 6f 6e 20 74 68 65 20 66 69 6e 69 74 65 20 73  ion the finite s
7140: 74 61 74 65 20 6d 61 63 68 69 6e 65 20 66 6f 72  tate machine for
7150: 20 74 68 65 20 4c 45 4d 4f 4e 0a 2a 2a 20 70 61   the LEMON.** pa
7160: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
7170: 2a 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61 20 70 72  */../* Find a pr
7180: 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20  ecedence symbol 
7190: 6f 66 20 65 76 65 72 79 20 72 75 6c 65 20 69 6e  of every rule in
71a0: 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 0a 2a 2a   the grammar..**
71b0: 0a 2a 2a 20 54 68 6f 73 65 20 72 75 6c 65 73 20  .** Those rules 
71c0: 77 68 69 63 68 20 68 61 76 65 20 61 20 70 72 65  which have a pre
71d0: 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 63  cedence symbol c
71e0: 6f 64 65 64 20 69 6e 20 74 68 65 20 69 6e 70 75  oded in the inpu
71f0: 74 0a 2a 2a 20 67 72 61 6d 6d 61 72 20 75 73 69  t.** grammar usi
7200: 6e 67 20 74 68 65 20 22 5b 73 79 6d 62 6f 6c 5d  ng the "[symbol]
7210: 22 20 63 6f 6e 73 74 72 75 63 74 20 77 69 6c 6c  " construct will
7220: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 74 68   already have th
7230: 65 0a 2a 2a 20 72 70 2d 3e 70 72 65 63 73 79 6d  e.** rp->precsym
7240: 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 2e 20 20   field filled.  
7250: 4f 74 68 65 72 20 72 75 6c 65 73 20 74 61 6b 65  Other rules take
7260: 20 61 73 20 74 68 65 69 72 20 70 72 65 63 65 64   as their preced
7270: 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 74  ence.** symbol t
7280: 68 65 20 66 69 72 73 74 20 52 48 53 20 73 79 6d  he first RHS sym
7290: 62 6f 6c 20 77 69 74 68 20 61 20 64 65 66 69 6e  bol with a defin
72a0: 65 64 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20  ed precedence.  
72b0: 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
72c0: 6e 6f 74 20 52 48 53 20 73 79 6d 62 6f 6c 73 20  not RHS symbols 
72d0: 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 70  with a defined p
72e0: 72 65 63 65 64 65 6e 63 65 2c 20 74 68 65 20 70  recedence, the p
72f0: 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d  recedence.** sym
7300: 62 6f 6c 20 66 69 65 6c 64 20 69 73 20 6c 65 66  bol field is lef
7310: 74 20 62 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64  t blank..*/.void
7320: 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65   FindRulePrecede
7330: 6e 63 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f  nces(struct lemo
7340: 6e 20 2a 78 70 29 0a 7b 0a 20 20 73 74 72 75 63  n *xp).{.  struc
7350: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 66 6f  t rule *rp;.  fo
7360: 72 28 72 70 3d 78 70 2d 3e 72 75 6c 65 3b 20 72  r(rp=xp->rule; r
7370: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
7380: 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72 65  .    if( rp->pre
7390: 63 73 79 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  csym==0 ){.     
73a0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20   int i, j;.     
73b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
73c0: 6e 72 68 73 20 26 26 20 72 70 2d 3e 70 72 65 63  nrhs && rp->prec
73d0: 73 79 6d 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  sym==0; i++){.  
73e0: 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
73f0: 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68  bol *sp = rp->rh
7400: 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  s[i];.        if
7410: 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54  ( sp->type==MULT
7420: 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
7430: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
7440: 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a  j<sp->nsubsym; j
7450: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
7460: 20 69 66 28 20 73 70 2d 3e 73 75 62 73 79 6d 5b   if( sp->subsym[
7470: 6a 5d 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20  j]->prec>=0 ){. 
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d               rp-
7490: 3e 70 72 65 63 73 79 6d 20 3d 20 73 70 2d 3e 73  >precsym = sp->s
74a0: 75 62 73 79 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20  ubsym[j];.      
74b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
74c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
74d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
74e0: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 70   }else if( sp->p
74f0: 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rec>=0 ){.      
7500: 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20      rp->precsym 
7510: 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20  = rp->rhs[i];.  
7520: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
7530: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7540: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61  rn;.}../* Find a
7550: 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20  ll nonterminals 
7560: 77 68 69 63 68 20 77 69 6c 6c 20 67 65 6e 65 72  which will gener
7570: 61 74 65 20 74 68 65 20 65 6d 70 74 79 20 73 74  ate the empty st
7580: 72 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e 20 67 6f  ring..** Then go
7590: 20 62 61 63 6b 20 61 6e 64 20 63 6f 6d 70 75 74   back and comput
75a0: 65 20 74 68 65 20 66 69 72 73 74 20 73 65 74 73  e the first sets
75b0: 20 6f 66 20 65 76 65 72 79 20 6e 6f 6e 74 65 72   of every nonter
75c0: 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 66 69  minal..** The fi
75d0: 72 73 74 20 73 65 74 20 69 73 20 74 68 65 20 73  rst set is the s
75e0: 65 74 20 6f 66 20 61 6c 6c 20 74 65 72 6d 69 6e  et of all termin
75f0: 61 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68  al symbols which
7600: 20 63 61 6e 20 62 65 67 69 6e 0a 2a 2a 20 61 20   can begin.** a 
7610: 73 74 72 69 6e 67 20 67 65 6e 65 72 61 74 65 64  string generated
7620: 20 62 79 20 74 68 61 74 20 6e 6f 6e 74 65 72 6d   by that nonterm
7630: 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  inal..*/.void Fi
7640: 6e 64 46 69 72 73 74 53 65 74 73 28 73 74 72 75  ndFirstSets(stru
7650: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
7660: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
7670: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
7680: 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b  .  int progress;
7690: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ..  for(i=0; i<l
76a0: 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
76b0: 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79  +){.    lemp->sy
76c0: 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61  mbols[i]->lambda
76d0: 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a   = LEMON_FALSE;.
76e0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6c 65 6d 70    }.  for(i=lemp
76f0: 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 3c 6c  ->nterminal; i<l
7700: 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
7710: 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79  +){.    lemp->sy
7720: 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69 72 73 74 73  mbols[i]->firsts
7730: 65 74 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20  et = SetNew();. 
7740: 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 63   }..  /* First c
7750: 6f 6d 70 75 74 65 20 61 6c 6c 20 6c 61 6d 62 64  ompute all lambd
7760: 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20  as */.  do{.    
7770: 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
7780: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
7790: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
77a0: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
77b0: 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61   rp->lhs->lambda
77c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
77d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
77e0: 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
77f0: 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
7800: 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68  bol *sp = rp->rh
7810: 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  s[i];.        as
7820: 73 65 72 74 28 20 73 70 2d 3e 74 79 70 65 3d 3d  sert( sp->type==
7830: 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73  NONTERMINAL || s
7840: 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e  p->lambda==LEMON
7850: 5f 46 41 4c 53 45 20 29 3b 0a 20 20 20 20 20 20  _FALSE );.      
7860: 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61    if( sp->lambda
7870: 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20  ==LEMON_FALSE ) 
7880: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
7890: 20 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e       if( i==rp->
78a0: 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  nrhs ){.        
78b0: 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20  rp->lhs->lambda 
78c0: 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20  = LEMON_TRUE;.  
78d0: 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d        progress =
78e0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
78f0: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67  }.  }while( prog
7900: 72 65 73 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  ress );..  /* No
7910: 77 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69  w compute all fi
7920: 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f  rst sets */.  do
7930: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  {.    struct sym
7940: 62 6f 6c 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20  bol *s1, *s2;.  
7950: 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a    progress = 0;.
7960: 20 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d      for(rp=lemp-
7970: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
7980: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 73  ->next){.      s
7990: 31 20 3d 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20  1 = rp->lhs;.   
79a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
79b0: 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
79c0: 20 20 20 20 20 20 73 32 20 3d 20 72 70 2d 3e 72        s2 = rp->r
79d0: 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hs[i];.        i
79e0: 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52  f( s2->type==TER
79f0: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
7a00: 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53     progress += S
7a10: 65 74 41 64 64 28 73 31 2d 3e 66 69 72 73 74 73  etAdd(s1->firsts
7a20: 65 74 2c 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20  et,s2->index);. 
7a30: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7a40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
7a50: 28 20 73 32 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54  ( s2->type==MULT
7a60: 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
7a70: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
7a80: 6a 3c 73 32 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a  j<s2->nsubsym; j
7a90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
7aa0: 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74   progress += Set
7ab0: 41 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74  Add(s1->firstset
7ac0: 2c 73 32 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e  ,s2->subsym[j]->
7ad0: 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20  index);.        
7ae0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
7af0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
7b00: 73 65 20 69 66 28 20 73 31 3d 3d 73 32 20 29 7b  se if( s1==s2 ){
7b10: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
7b20: 31 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e  1->lambda==LEMON
7b30: 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a  _FALSE ) break;.
7b40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
7b50: 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73           progres
7b60: 73 20 2b 3d 20 53 65 74 55 6e 69 6f 6e 28 73 31  s += SetUnion(s1
7b70: 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 66  ->firstset,s2->f
7b80: 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20 20  irstset);.      
7b90: 20 20 20 20 69 66 28 20 73 32 2d 3e 6c 61 6d 62      if( s2->lamb
7ba0: 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20  da==LEMON_FALSE 
7bb0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
7bc0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
7bd0: 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72  .  }while( progr
7be0: 65 73 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 3b  ess );.  return;
7bf0: 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61  .}../* Compute a
7c00: 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65 73 20  ll LR(0) states 
7c10: 66 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72 2e  for the grammar.
7c20: 20 20 4c 69 6e 6b 73 0a 2a 2a 20 61 72 65 20 61    Links.** are a
7c30: 64 64 65 64 20 74 6f 20 62 65 74 77 65 65 6e 20  dded to between 
7c40: 73 6f 6d 65 20 73 74 61 74 65 73 20 73 6f 20 74  some states so t
7c50: 68 61 74 20 74 68 65 20 4c 52 28 31 29 20 66 6f  hat the LR(1) fo
7c60: 6c 6c 6f 77 20 73 65 74 73 0a 2a 2a 20 63 61 6e  llow sets.** can
7c70: 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61 74   be computed lat
7c80: 65 72 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 73  er..*/.PRIVATE s
7c90: 74 72 75 63 74 20 73 74 61 74 65 20 2a 67 65 74  truct state *get
7ca0: 73 74 61 74 65 28 73 74 72 75 63 74 20 6c 65 6d  state(struct lem
7cb0: 6f 6e 20 2a 29 3b 20 20 2f 2a 20 66 6f 72 77 61  on *);  /* forwa
7cc0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
7cd0: 76 6f 69 64 20 46 69 6e 64 53 74 61 74 65 73 28  void FindStates(
7ce0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
7cf0: 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  mp).{.  struct s
7d00: 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72  ymbol *sp;.  str
7d10: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20  uct rule *rp;.. 
7d20: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74   Configlist_init
7d30: 28 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74  ();..  /* Find t
7d40: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
7d50: 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73  */.  if( lemp->s
7d60: 74 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20 3d  tart ){.    sp =
7d70: 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d   Symbol_find(lem
7d80: 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 69  p->start);.    i
7d90: 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20  f( sp==0 ){.    
7da0: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
7db0: 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68  >filename,0,."Th
7dc0: 65 20 73 70 65 63 69 66 69 65 64 20 73 74 61 72  e specified star
7dd0: 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20  t symbol \"%s\" 
7de0: 69 73 20 6e 6f 74 20 5c 0a 69 6e 20 61 20 6e 6f  is not \.in a no
7df0: 6e 74 65 72 6d 69 6e 61 6c 20 6f 66 20 74 68 65  nterminal of the
7e00: 20 67 72 61 6d 6d 61 72 2e 20 20 5c 22 25 73 5c   grammar.  \"%s\
7e10: 22 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61  " will be used a
7e20: 73 20 74 68 65 20 73 74 61 72 74 20 5c 0a 73 79  s the start \.sy
7e30: 6d 62 6f 6c 20 69 6e 73 74 65 61 64 2e 22 2c 6c  mbol instead.",l
7e40: 65 6d 70 2d 3e 73 74 61 72 74 2c 6c 65 6d 70 2d  emp->start,lemp-
7e50: 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73 2d  >startRule->lhs-
7e60: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65  >name);.      le
7e70: 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
7e80: 20 20 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d        sp = lemp-
7e90: 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73 3b  >startRule->lhs;
7ea0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
7eb0: 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73      sp = lemp->s
7ec0: 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20  tartRule->lhs;. 
7ed0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
7ee0: 72 65 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  re the start sym
7ef0: 62 6f 6c 20 64 6f 65 73 6e 27 74 20 6f 63 63 75  bol doesn't occu
7f00: 72 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  r on the right-h
7f10: 61 6e 64 20 73 69 64 65 20 6f 66 0a 20 20 2a 2a  and side of.  **
7f20: 20 61 6e 79 20 72 75 6c 65 2e 20 20 52 65 70 6f   any rule.  Repo
7f30: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69  rt an error if i
7f40: 74 20 64 6f 65 73 2e 20 20 28 59 41 43 43 20 77  t does.  (YACC w
7f50: 6f 75 6c 64 20 67 65 6e 65 72 61 74 65 20 61 20  ould generate a 
7f60: 6e 65 77 0a 20 20 2a 2a 20 73 74 61 72 74 20 73  new.  ** start s
7f70: 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73 20 63 61  ymbol in this ca
7f80: 73 65 2e 29 20 2a 2f 0a 20 20 66 6f 72 28 72 70  se.) */.  for(rp
7f90: 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
7fa0: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
7fb0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
7fc0: 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
7fd0: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  s; i++){.      i
7fe0: 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73  f( rp->rhs[i]==s
7ff0: 70 20 29 7b 20 20 20 2f 2a 20 46 49 58 20 4d 45  p ){   /* FIX ME
8000: 3a 20 20 44 65 61 6c 20 77 69 74 68 20 6d 75 6c  :  Deal with mul
8010: 74 69 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20  titerminals */. 
8020: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
8030: 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30  lemp->filename,0
8040: 2c 0a 22 54 68 65 20 73 74 61 72 74 20 73 79 6d  ,."The start sym
8050: 62 6f 6c 20 5c 22 25 73 5c 22 20 6f 63 63 75 72  bol \"%s\" occur
8060: 73 20 6f 6e 20 74 68 65 20 5c 0a 72 69 67 68 74  s on the \.right
8070: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20  -hand side of a 
8080: 72 75 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20  rule. This will 
8090: 72 65 73 75 6c 74 20 69 6e 20 61 20 70 61 72 73  result in a pars
80a0: 65 72 20 77 68 69 63 68 20 5c 0a 64 6f 65 73 20  er which \.does 
80b0: 6e 6f 74 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c  not work properl
80c0: 79 2e 22 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  y.",sp->name);. 
80d0: 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72         lemp->err
80e0: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
80f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
8100: 20 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69   The basis confi
8110: 67 75 72 61 74 69 6f 6e 20 73 65 74 20 66 6f 72  guration set for
8120: 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65   the first state
8130: 0a 20 20 2a 2a 20 69 73 20 61 6c 6c 20 72 75 6c  .  ** is all rul
8140: 65 73 20 77 68 69 63 68 20 68 61 76 65 20 74 68  es which have th
8150: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 61  e start symbol a
8160: 73 20 74 68 65 69 72 0a 20 20 2a 2a 20 6c 65 66  s their.  ** lef
8170: 74 2d 68 61 6e 64 20 73 69 64 65 20 2a 2f 0a 20  t-hand side */. 
8180: 20 66 6f 72 28 72 70 3d 73 70 2d 3e 72 75 6c 65   for(rp=sp->rule
8190: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
81a0: 74 6c 68 73 29 7b 0a 20 20 20 20 73 74 72 75 63  tlhs){.    struc
81b0: 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 70  t config *newcfp
81c0: 3b 0a 20 20 20 20 72 70 2d 3e 6c 68 73 53 74 61  ;.    rp->lhsSta
81d0: 72 74 20 3d 20 31 3b 0a 20 20 20 20 6e 65 77 63  rt = 1;.    newc
81e0: 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f  fp = Configlist_
81f0: 61 64 64 62 61 73 69 73 28 72 70 2c 30 29 3b 0a  addbasis(rp,0);.
8200: 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66      SetAdd(newcf
8210: 70 2d 3e 66 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a  p->fws,0);.  }..
8220: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
8230: 20 66 69 72 73 74 20 73 74 61 74 65 2e 20 20 41   first state.  A
8240: 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 20  ll other states 
8250: 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 6f 6d  will be.  ** com
8260: 70 75 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61  puted automatica
8270: 6c 6c 79 20 64 75 72 69 6e 67 20 74 68 65 20 63  lly during the c
8280: 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 74 68  omputation of th
8290: 65 20 66 69 72 73 74 20 6f 6e 65 2e 0a 20 20 2a  e first one..  *
82a0: 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70  * The returned p
82b0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69  ointer to the fi
82c0: 72 73 74 20 73 74 61 74 65 20 69 73 20 6e 6f 74  rst state is not
82d0: 20 75 73 65 64 2e 20 2a 2f 0a 20 20 28 76 6f 69   used. */.  (voi
82e0: 64 29 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29  d)getstate(lemp)
82f0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
8300: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
8310: 65 72 20 74 6f 20 61 20 73 74 61 74 65 20 77 68  er to a state wh
8320: 69 63 68 20 69 73 20 64 65 73 63 72 69 62 65 64  ich is described
8330: 20 62 79 20 74 68 65 20 63 6f 6e 66 69 67 75 72   by the configur
8340: 61 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 77 68  ation.** list wh
8350: 69 63 68 20 68 61 73 20 62 65 65 6e 20 62 75 69  ich has been bui
8360: 6c 74 20 66 72 6f 6d 20 63 61 6c 6c 73 20 74 6f  lt from calls to
8370: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 2e   Configlist_add.
8380: 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64  .*/.PRIVATE void
8390: 20 62 75 69 6c 64 73 68 69 66 74 73 28 73 74 72   buildshifts(str
83a0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72  uct lemon *, str
83b0: 75 63 74 20 73 74 61 74 65 20 2a 29 3b 20 2f 2a  uct state *); /*
83c0: 20 46 6f 72 77 64 20 72 65 66 20 2a 2f 0a 50 52   Forwd ref */.PR
83d0: 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74 61  IVATE struct sta
83e0: 74 65 20 2a 67 65 74 73 74 61 74 65 28 73 74 72  te *getstate(str
83f0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
8400: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
8410: 69 67 20 2a 63 66 70 2c 20 2a 62 70 3b 0a 20 20  ig *cfp, *bp;.  
8420: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
8430: 70 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74  p;..  /* Extract
8440: 20 74 68 65 20 73 6f 72 74 65 64 20 62 61 73 69   the sorted basi
8450: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 73 74 61  s of the new sta
8460: 74 65 2e 20 20 54 68 65 20 62 61 73 69 73 20 77  te.  The basis w
8470: 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20  as constructed. 
8480: 20 2a 2a 20 62 79 20 70 72 69 6f 72 20 63 61 6c   ** by prior cal
8490: 6c 73 20 74 6f 20 22 43 6f 6e 66 69 67 6c 69 73  ls to "Configlis
84a0: 74 5f 61 64 64 62 61 73 69 73 28 29 22 2e 20 2a  t_addbasis()". *
84b0: 2f 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73  /.  Configlist_s
84c0: 6f 72 74 62 61 73 69 73 28 29 3b 0a 20 20 62 70  ortbasis();.  bp
84d0: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61   = Configlist_ba
84e0: 73 69 73 28 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  sis();..  /* Get
84f0: 20 61 20 73 74 61 74 65 20 77 69 74 68 20 74 68   a state with th
8500: 65 20 73 61 6d 65 20 62 61 73 69 73 20 2a 2f 0a  e same basis */.
8510: 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f 66 69    stp = State_fi
8520: 6e 64 28 62 70 29 3b 0a 20 20 69 66 28 20 73 74  nd(bp);.  if( st
8530: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 73 74  p ){.    /* A st
8540: 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ate with the sam
8550: 65 20 62 61 73 69 73 20 61 6c 72 65 61 64 79 20  e basis already 
8560: 65 78 69 73 74 73 21 20 20 43 6f 70 79 20 61 6c  exists!  Copy al
8570: 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74  l the follow-set
8580: 0a 20 20 20 20 2a 2a 20 70 72 6f 70 61 67 61 74  .    ** propagat
8590: 69 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f 6d 20 74  ion links from t
85a0: 68 65 20 73 74 61 74 65 20 75 6e 64 65 72 20 63  he state under c
85b0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 74 6f  onstruction into
85c0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 65 65   the.    ** pree
85d0: 78 69 73 74 69 6e 67 20 73 74 61 74 65 2c 20 74  xisting state, t
85e0: 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
85f0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 65  nter to the pree
8600: 78 69 73 74 69 6e 67 20 73 74 61 74 65 20 2a 2f  xisting state */
8610: 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .    struct conf
8620: 69 67 20 2a 78 2c 20 2a 79 3b 0a 20 20 20 20 66  ig *x, *y;.    f
8630: 6f 72 28 78 3d 62 70 2c 20 79 3d 73 74 70 2d 3e  or(x=bp, y=stp->
8640: 62 70 3b 20 78 20 26 26 20 79 3b 20 78 3d 78 2d  bp; x && y; x=x-
8650: 3e 62 70 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a 20  >bp, y=y->bp){. 
8660: 20 20 20 20 20 50 6c 69 6e 6b 5f 63 6f 70 79 28       Plink_copy(
8670: 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c 70  &y->bplp,x->bplp
8680: 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 64  );.      Plink_d
8690: 65 6c 65 74 65 28 78 2d 3e 66 70 6c 70 29 3b 0a  elete(x->fplp);.
86a0: 20 20 20 20 20 20 78 2d 3e 66 70 6c 70 20 3d 20        x->fplp = 
86b0: 78 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20  x->bplp = 0;.   
86c0: 20 7d 0a 20 20 20 20 63 66 70 20 3d 20 43 6f 6e   }.    cfp = Con
86d0: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29  figlist_return()
86e0: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74  ;.    Configlist
86f0: 5f 65 61 74 28 63 66 70 29 3b 0a 20 20 7d 65 6c  _eat(cfp);.  }el
8700: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
8710: 72 65 61 6c 6c 79 20 69 73 20 61 20 6e 65 77 20  really is a new 
8720: 73 74 61 74 65 2e 20 20 43 6f 6e 73 74 72 75 63  state.  Construc
8730: 74 20 61 6c 6c 20 74 68 65 20 64 65 74 61 69 6c  t all the detail
8740: 73 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c  s */.    Configl
8750: 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d 70  ist_closure(lemp
8760: 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  );    /* Compute
8770: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
8780: 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20  on closure */.  
8790: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72    Configlist_sor
87a0: 74 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f  t();           /
87b0: 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69  * Sort the confi
87c0: 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65  guration closure
87d0: 20 2a 2f 0a 20 20 20 20 63 66 70 20 3d 20 43 6f   */.    cfp = Co
87e0: 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28  nfiglist_return(
87f0: 29 3b 20 20 20 2f 2a 20 47 65 74 20 61 20 70 6f  );   /* Get a po
8800: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6e  inter to the con
8810: 66 69 67 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  fig list */.    
8820: 73 74 70 20 3d 20 53 74 61 74 65 5f 6e 65 77 28  stp = State_new(
8830: 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );           /* 
8840: 41 20 6e 65 77 20 73 74 61 74 65 20 73 74 72 75  A new state stru
8850: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 4d 65 6d  cture */.    Mem
8860: 6f 72 79 43 68 65 63 6b 28 73 74 70 29 3b 0a 20  oryCheck(stp);. 
8870: 20 20 20 73 74 70 2d 3e 62 70 20 3d 20 62 70 3b     stp->bp = bp;
8880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8890: 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  /* Remember the 
88a0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 61  configuration ba
88b0: 73 69 73 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e  sis */.    stp->
88c0: 63 66 70 20 3d 20 63 66 70 3b 20 20 20 20 20 20  cfp = cfp;      
88d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d          /* Remem
88e0: 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ber the configur
88f0: 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f  ation closure */
8900: 0a 20 20 20 20 73 74 70 2d 3e 73 74 61 74 65 6e  .    stp->staten
8910: 75 6d 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  um = lemp->nstat
8920: 65 2b 2b 3b 20 2f 2a 20 45 76 65 72 79 20 73 74  e++; /* Every st
8930: 61 74 65 20 67 65 74 73 20 61 20 73 65 71 75 65  ate gets a seque
8940: 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  nce number */.  
8950: 20 20 73 74 70 2d 3e 61 70 20 3d 20 30 3b 20 20    stp->ap = 0;  
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8970: 2a 20 4e 6f 20 61 63 74 69 6f 6e 73 2c 20 79 65  * No actions, ye
8980: 74 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 5f  t. */.    State_
8990: 69 6e 73 65 72 74 28 73 74 70 2c 73 74 70 2d 3e  insert(stp,stp->
89a0: 62 70 29 3b 20 20 20 2f 2a 20 41 64 64 20 74 6f  bp);   /* Add to
89b0: 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c 65   the state table
89c0: 20 2a 2f 0a 20 20 20 20 62 75 69 6c 64 73 68 69   */.    buildshi
89d0: 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 3b 20 20  fts(lemp,stp);  
89e0: 20 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69 76       /* Recursiv
89f0: 65 6c 79 20 63 6f 6d 70 75 74 65 20 73 75 63 63  ely compute succ
8a00: 65 73 73 6f 72 20 73 74 61 74 65 73 20 2a 2f 0a  essor states */.
8a10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 74 70    }.  return stp
8a20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8a30: 6e 20 74 72 75 65 20 69 66 20 74 77 6f 20 73 79  n true if two sy
8a40: 6d 62 6f 6c 73 20 61 72 65 20 74 68 65 20 73 61  mbols are the sa
8a50: 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 61 6d 65 5f  me..*/.int same_
8a60: 73 79 6d 62 6f 6c 28 73 74 72 75 63 74 20 73 79  symbol(struct sy
8a70: 6d 62 6f 6c 20 2a 61 2c 20 73 74 72 75 63 74 20  mbol *a, struct 
8a80: 73 79 6d 62 6f 6c 20 2a 62 29 0a 7b 0a 20 20 69  symbol *b).{.  i
8a90: 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 3d 3d 62  nt i;.  if( a==b
8aa0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
8ab0: 66 28 20 61 2d 3e 74 79 70 65 21 3d 4d 55 4c 54  f( a->type!=MULT
8ac0: 49 54 45 52 4d 49 4e 41 4c 20 29 20 72 65 74 75  ITERMINAL ) retu
8ad0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 62 2d 3e 74  rn 0;.  if( b->t
8ae0: 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype!=MULTITERMIN
8af0: 41 4c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  AL ) return 0;. 
8b00: 20 69 66 28 20 61 2d 3e 6e 73 75 62 73 79 6d 21   if( a->nsubsym!
8b10: 3d 62 2d 3e 6e 73 75 62 73 79 6d 20 29 20 72 65  =b->nsubsym ) re
8b20: 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
8b30: 30 3b 20 69 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b  0; i<a->nsubsym;
8b40: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
8b50: 2d 3e 73 75 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e  ->subsym[i]!=b->
8b60: 73 75 62 73 79 6d 5b 69 5d 20 29 20 72 65 74 75  subsym[i] ) retu
8b70: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
8b80: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73  rn 1;.}../* Cons
8b90: 74 72 75 63 74 20 61 6c 6c 20 73 75 63 63 65 73  truct all succes
8ba0: 73 6f 72 20 73 74 61 74 65 73 20 74 6f 20 74 68  sor states to th
8bb0: 65 20 67 69 76 65 6e 20 73 74 61 74 65 2e 20 20  e given state.  
8bc0: 41 20 22 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a  A "successor".**
8bd0: 20 73 74 61 74 65 20 69 73 20 61 6e 79 20 73 74   state is any st
8be0: 61 74 65 20 77 68 69 63 68 20 63 61 6e 20 62 65  ate which can be
8bf0: 20 72 65 61 63 68 65 64 20 62 79 20 61 20 73 68   reached by a sh
8c00: 69 66 74 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50  ift action..*/.P
8c10: 52 49 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c  RIVATE void buil
8c20: 64 73 68 69 66 74 73 28 73 74 72 75 63 74 20 6c  dshifts(struct l
8c30: 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75  emon *lemp, stru
8c40: 63 74 20 73 74 61 74 65 20 2a 73 74 70 29 0a 7b  ct state *stp).{
8c50: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
8c60: 20 2a 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20 6c   *cfp;  /* For l
8c70: 6f 6f 70 69 6e 67 20 74 68 72 75 20 74 68 65 20  ooping thru the 
8c80: 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f  config closure o
8c90: 66 20 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72  f "stp" */.  str
8ca0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 63 66 70  uct config *bcfp
8cb0: 3b 20 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e 6e  ; /* For the inn
8cc0: 65 72 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69  er loop on confi
8cd0: 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74  g closure of "st
8ce0: 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63  p" */.  struct c
8cf0: 6f 6e 66 69 67 20 2a 6e 65 77 63 66 67 3b 20 20  onfig *newcfg;  
8d00: 2f 2a 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  /* */.  struct s
8d10: 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 2f 2a 20  ymbol *sp;   /* 
8d20: 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67  Symbol following
8d30: 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66   the dot in conf
8d40: 69 67 75 72 61 74 69 6f 6e 20 22 63 66 70 22 20  iguration "cfp" 
8d50: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
8d60: 6f 6c 20 2a 62 73 70 3b 20 20 2f 2a 20 53 79 6d  ol *bsp;  /* Sym
8d70: 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  bol following th
8d80: 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75  e dot in configu
8d90: 72 61 74 69 6f 6e 20 22 62 63 66 70 22 20 2a 2f  ration "bcfp" */
8da0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
8db0: 2a 6e 65 77 73 74 70 3b 20 2f 2a 20 41 20 70 6f  *newstp; /* A po
8dc0: 69 6e 74 65 72 20 74 6f 20 61 20 73 75 63 63 65  inter to a succe
8dd0: 73 73 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20  ssor state */.. 
8de0: 20 2f 2a 20 45 61 63 68 20 63 6f 6e 66 69 67 75   /* Each configu
8df0: 72 61 74 69 6f 6e 20 62 65 63 6f 6d 65 73 20 63  ration becomes c
8e00: 6f 6d 70 6c 65 74 65 20 61 66 74 65 72 20 69 74  omplete after it
8e10: 20 63 6f 6e 74 69 62 75 74 65 73 20 74 6f 20 61   contibutes to a
8e20: 20 73 75 63 63 65 73 73 6f 72 0a 20 20 2a 2a 20   successor.  ** 
8e30: 73 74 61 74 65 2e 20 20 49 6e 69 74 69 61 6c 6c  state.  Initiall
8e40: 79 2c 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61  y, all configura
8e50: 74 69 6f 6e 73 20 61 72 65 20 69 6e 63 6f 6d 70  tions are incomp
8e60: 6c 65 74 65 20 2a 2f 0a 20 20 66 6f 72 28 63 66  lete */.  for(cf
8e70: 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b  p=stp->cfp; cfp;
8e80: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 20   cfp=cfp->next) 
8e90: 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e  cfp->status = IN
8ea0: 43 4f 4d 50 4c 45 54 45 3b 0a 0a 20 20 2f 2a 20  COMPLETE;..  /* 
8eb0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
8ec0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
8ed0: 6f 66 20 74 68 65 20 73 74 61 74 65 20 22 73 74  of the state "st
8ee0: 70 22 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d  p" */.  for(cfp=
8ef0: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
8f00: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
8f10: 20 20 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74     if( cfp->stat
8f20: 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63  us==COMPLETE ) c
8f30: 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41  ontinue;    /* A
8f40: 6c 72 65 61 64 79 20 75 73 65 64 20 62 79 20 69  lready used by i
8f50: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nner loop */.   
8f60: 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3e 3d 63   if( cfp->dot>=c
8f70: 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63  fp->rp->nrhs ) c
8f80: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 43 61 6e  ontinue;  /* Can
8f90: 27 74 20 73 68 69 66 74 20 74 68 69 73 20 63 6f  't shift this co
8fa0: 6e 66 69 67 20 2a 2f 0a 20 20 20 20 43 6f 6e 66  nfig */.    Conf
8fb0: 69 67 6c 69 73 74 5f 72 65 73 65 74 28 29 3b 20  iglist_reset(); 
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8fd0: 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68       /* Reset th
8fe0: 65 20 6e 65 77 20 63 6f 6e 66 69 67 20 73 65 74  e new config set
8ff0: 20 2a 2f 0a 20 20 20 20 73 70 20 3d 20 63 66 70   */.    sp = cfp
9000: 2d 3e 72 70 2d 3e 72 68 73 5b 63 66 70 2d 3e 64  ->rp->rhs[cfp->d
9010: 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  ot];            
9020: 20 2f 2a 20 53 79 6d 62 6f 6c 20 61 66 74 65 72   /* Symbol after
9030: 20 74 68 65 20 64 6f 74 20 2a 2f 0a 0a 20 20 20   the dot */..   
9040: 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 63 6f   /* For every co
9050: 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e 20 74  nfiguration in t
9060: 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20 77  he state "stp" w
9070: 68 69 63 68 20 68 61 73 20 74 68 65 20 73 79 6d  hich has the sym
9080: 62 6f 6c 20 22 73 70 22 0a 20 20 20 20 2a 2a 20  bol "sp".    ** 
9090: 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 73 20 64 6f  following its do
90a0: 74 2c 20 61 64 64 20 74 68 65 20 73 61 6d 65 20  t, add the same 
90b0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f  configuration to
90c0: 20 74 68 65 20 62 61 73 69 73 20 73 65 74 20 75   the basis set u
90d0: 6e 64 65 72 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  nder.    ** cons
90e0: 74 72 75 63 74 69 6f 6e 20 62 75 74 20 77 69 74  truction but wit
90f0: 68 20 74 68 65 20 64 6f 74 20 73 68 69 66 74 65  h the dot shifte
9100: 64 20 6f 6e 65 20 73 79 6d 62 6f 6c 20 74 6f 20  d one symbol to 
9110: 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  the right. */.  
9120: 20 20 66 6f 72 28 62 63 66 70 3d 63 66 70 3b 20    for(bcfp=cfp; 
9130: 62 63 66 70 3b 20 62 63 66 70 3d 62 63 66 70 2d  bcfp; bcfp=bcfp-
9140: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
9150: 28 20 62 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d  ( bcfp->status==
9160: 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69  COMPLETE ) conti
9170: 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61  nue;    /* Alrea
9180: 64 79 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20  dy used */.     
9190: 20 69 66 28 20 62 63 66 70 2d 3e 64 6f 74 3e 3d   if( bcfp->dot>=
91a0: 62 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29  bcfp->rp->nrhs )
91b0: 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 43 61   continue; /* Ca
91c0: 6e 27 74 20 73 68 69 66 74 20 74 68 69 73 20 6f  n't shift this o
91d0: 6e 65 20 2a 2f 0a 20 20 20 20 20 20 62 73 70 20  ne */.      bsp 
91e0: 3d 20 62 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b  = bcfp->rp->rhs[
91f0: 62 63 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20  bcfp->dot];     
9200: 20 20 20 20 20 20 2f 2a 20 47 65 74 20 73 79 6d        /* Get sym
9210: 62 6f 6c 20 61 66 74 65 72 20 64 6f 74 20 2a 2f  bol after dot */
9220: 0a 20 20 20 20 20 20 69 66 28 20 21 73 61 6d 65  .      if( !same
9230: 5f 73 79 6d 62 6f 6c 28 62 73 70 2c 73 70 29 20  _symbol(bsp,sp) 
9240: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20  ) continue;     
9250: 20 2f 2a 20 4d 75 73 74 20 62 65 20 73 61 6d 65   /* Must be same
9260: 20 61 73 20 66 6f 72 20 22 63 66 70 22 20 2a 2f   as for "cfp" */
9270: 0a 20 20 20 20 20 20 62 63 66 70 2d 3e 73 74 61  .      bcfp->sta
9280: 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 20  tus = COMPLETE; 
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92a0: 20 2f 2a 20 4d 61 72 6b 20 74 68 69 73 20 63 6f   /* Mark this co
92b0: 6e 66 69 67 20 61 73 20 75 73 65 64 20 2a 2f 0a  nfig as used */.
92c0: 20 20 20 20 20 20 6e 65 77 63 66 67 20 3d 20 43        newcfg = C
92d0: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
92e0: 69 73 28 62 63 66 70 2d 3e 72 70 2c 62 63 66 70  is(bcfp->rp,bcfp
92f0: 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20 20 20 20 20  ->dot+1);.      
9300: 50 6c 69 6e 6b 5f 61 64 64 28 26 6e 65 77 63 66  Plink_add(&newcf
9310: 67 2d 3e 62 70 6c 70 2c 62 63 66 70 29 3b 0a 20  g->bplp,bcfp);. 
9320: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
9330: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
9340: 65 20 73 74 61 74 65 20 64 65 73 63 72 69 62 65  e state describe
9350: 64 20 62 79 20 74 68 65 20 62 61 73 69 73 20 63  d by the basis c
9360: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74  onfiguration set
9370: 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63  .    ** construc
9380: 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 63 65  ted in the prece
9390: 64 69 6e 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  ding loop */.   
93a0: 20 6e 65 77 73 74 70 20 3d 20 67 65 74 73 74 61   newstp = getsta
93b0: 74 65 28 6c 65 6d 70 29 3b 0a 0a 20 20 20 20 2f  te(lemp);..    /
93c0: 2a 20 54 68 65 20 73 74 61 74 65 20 22 6e 65 77  * The state "new
93d0: 73 74 70 22 20 69 73 20 72 65 61 63 68 65 64 20  stp" is reached 
93e0: 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20 22  from the state "
93f0: 73 74 70 22 20 62 79 20 61 20 73 68 69 66 74 20  stp" by a shift 
9400: 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e  action.    ** on
9410: 20 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22   the symbol "sp"
9420: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 70 2d 3e   */.    if( sp->
9430: 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
9440: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  NAL ){.      int
9450: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
9460: 30 3b 20 69 3c 73 70 2d 3e 6e 73 75 62 73 79 6d  0; i<sp->nsubsym
9470: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
9480: 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d  Action_add(&stp-
9490: 3e 61 70 2c 53 48 49 46 54 2c 73 70 2d 3e 73 75  >ap,SHIFT,sp->su
94a0: 62 73 79 6d 5b 69 5d 2c 28 63 68 61 72 2a 29 6e  bsym[i],(char*)n
94b0: 65 77 73 74 70 29 3b 0a 20 20 20 20 20 20 7d 0a  ewstp);.      }.
94c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
94d0: 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70   Action_add(&stp
94e0: 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70 2c 28 63  ->ap,SHIFT,sp,(c
94f0: 68 61 72 20 2a 29 6e 65 77 73 74 70 29 3b 0a 20  har *)newstp);. 
9500: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
9510: 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
9520: 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
9530: 73 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 4c 69  s.*/.void FindLi
9540: 6e 6b 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  nks(struct lemon
9550: 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20   *lemp).{.  int 
9560: 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  i;.  struct conf
9570: 69 67 20 2a 63 66 70 2c 20 2a 6f 74 68 65 72 3b  ig *cfp, *other;
9580: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
9590: 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 70  *stp;.  struct p
95a0: 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a  link *plp;..  /*
95b0: 20 48 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65   Housekeeping de
95c0: 74 61 69 6c 3a 0a 20 20 2a 2a 20 41 64 64 20 74  tail:.  ** Add t
95d0: 6f 20 65 76 65 72 79 20 70 72 6f 70 61 67 61 74  o every propagat
95e0: 65 20 6c 69 6e 6b 20 61 20 70 6f 69 6e 74 65 72  e link a pointer
95f0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61   back to the sta
9600: 74 65 20 74 6f 0a 20 20 2a 2a 20 77 68 69 63 68  te to.  ** which
9610: 20 74 68 65 20 6c 69 6e 6b 20 69 73 20 61 74 74   the link is att
9620: 61 63 68 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28  ached. */.  for(
9630: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
9640: 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
9650: 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
9660: 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66  d[i];.    for(cf
9670: 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b  p=stp->cfp; cfp;
9680: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
9690: 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74 70 20  .      cfp->stp 
96a0: 3d 20 73 74 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  = stp;.    }.  }
96b0: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61  ..  /* Convert a
96c0: 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73 20 69 6e 74  ll backlinks int
96d0: 6f 20 66 6f 72 77 61 72 64 20 6c 69 6e 6b 73 2e  o forward links.
96e0: 20 20 4f 6e 6c 79 20 74 68 65 20 66 6f 72 77 61    Only the forwa
96f0: 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b 73 20 61 72  rd.  ** links ar
9700: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 66 6f  e used in the fo
9710: 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d 70 75 74 61  llow-set computa
9720: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  tion. */.  for(i
9730: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
9740: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
9750: 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
9760: 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70  [i];.    for(cfp
9770: 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20  =stp->cfp; cfp; 
9780: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
9790: 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63 66        for(plp=cf
97a0: 70 2d 3e 62 70 6c 70 3b 20 70 6c 70 3b 20 70 6c  p->bplp; plp; pl
97b0: 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=plp->next){.  
97c0: 20 20 20 20 20 20 6f 74 68 65 72 20 3d 20 70 6c        other = pl
97d0: 70 2d 3e 63 66 70 3b 0a 20 20 20 20 20 20 20 20  p->cfp;.        
97e0: 50 6c 69 6e 6b 5f 61 64 64 28 26 6f 74 68 65 72  Plink_add(&other
97f0: 2d 3e 66 70 6c 70 2c 63 66 70 29 3b 0a 20 20 20  ->fplp,cfp);.   
9800: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
9810: 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c  ../* Compute all
9820: 20 66 6f 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a   followsets..**.
9830: 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 69  ** A followset i
9840: 73 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c  s the set of all
9850: 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63   symbols which c
9860: 61 6e 20 63 6f 6d 65 20 69 6d 6d 65 64 69 61 74  an come immediat
9870: 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 61 20 63  ely.** after a c
9880: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f  onfiguration..*/
9890: 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77  .void FindFollow
98a0: 53 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f  Sets(struct lemo
98b0: 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74  n *lemp).{.  int
98c0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   i;.  struct con
98d0: 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75  fig *cfp;.  stru
98e0: 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 20  ct plink *plp;. 
98f0: 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 20   int progress;. 
9900: 20 69 6e 74 20 63 68 61 6e 67 65 3b 0a 0a 20 20   int change;..  
9910: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
9920: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
9930: 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d     for(cfp=lemp-
9940: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b  >sorted[i]->cfp;
9950: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
9960: 65 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d  ext){.      cfp-
9970: 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50  >status = INCOMP
9980: 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LETE;.    }.  }.
9990: 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72  .  do{.    progr
99a0: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ess = 0;.    for
99b0: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
99c0: 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
99d0: 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e    for(cfp=lemp->
99e0: 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20  sorted[i]->cfp; 
99f0: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
9a00: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  xt){.        if(
9a10: 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f   cfp->status==CO
9a20: 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75  MPLETE ) continu
9a30: 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  e;.        for(p
9a40: 6c 70 3d 63 66 70 2d 3e 66 70 6c 70 3b 20 70 6c  lp=cfp->fplp; pl
9a50: 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74  p; plp=plp->next
9a60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
9a70: 6e 67 65 20 3d 20 53 65 74 55 6e 69 6f 6e 28 70  nge = SetUnion(p
9a80: 6c 70 2d 3e 63 66 70 2d 3e 66 77 73 2c 63 66 70  lp->cfp->fws,cfp
9a90: 2d 3e 66 77 73 29 3b 0a 20 20 20 20 20 20 20 20  ->fws);.        
9aa0: 20 20 69 66 28 20 63 68 61 6e 67 65 20 29 7b 0a    if( change ){.
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 70 2d              plp-
9ac0: 3e 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49  >cfp->status = I
9ad0: 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20  NCOMPLETE;.     
9ae0: 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20         progress 
9af0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
9b00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9b10: 20 20 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d     cfp->status =
9b20: 20 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20   COMPLETE;.     
9b30: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
9b40: 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d  e( progress );.}
9b50: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  ..static int res
9b60: 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 73 74  olve_conflict(st
9b70: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2c 73 74  ruct action *,st
9b80: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a  ruct action *);.
9b90: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  ./* Compute the 
9ba0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c 20  reduce actions, 
9bb0: 61 6e 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66  and resolve conf
9bc0: 6c 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46  licts..*/.void F
9bd0: 69 6e 64 41 63 74 69 6f 6e 73 28 73 74 72 75 63  indActions(struc
9be0: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
9bf0: 0a 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74  .  int i,j;.  st
9c00: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
9c10: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
9c20: 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
9c30: 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74  symbol *sp;.  st
9c40: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a  ruct rule *rp;..
9c50: 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20    /* Add all of 
9c60: 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f  the reduce actio
9c70: 6e 73 0a 20 20 2a 2a 20 41 20 72 65 64 75 63 65  ns.  ** A reduce
9c80: 20 61 63 74 69 6f 6e 20 69 73 20 61 64 64 65 64   action is added
9c90: 20 66 6f 72 20 65 61 63 68 20 65 6c 65 6d 65 6e   for each elemen
9ca0: 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 73  t of the follows
9cb0: 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f 6e  et of.  ** a con
9cc0: 66 69 67 75 72 61 74 69 6f 6e 20 77 68 69 63 68  figuration which
9cd0: 20 68 61 73 20 69 74 73 20 64 6f 74 20 61 74 20   has its dot at 
9ce0: 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68  the extreme righ
9cf0: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  t..  */.  for(i=
9d00: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
9d10: 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f  e; i++){   /* Lo
9d20: 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 74 61 74  op over all stat
9d30: 65 73 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20  es */.    stp = 
9d40: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
9d50: 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70  .    for(cfp=stp
9d60: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
9d70: 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a 20  cfp->next){  /* 
9d80: 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63 6f  Loop over all co
9d90: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a  nfigurations */.
9da0: 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e 72        if( cfp->r
9db0: 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64 6f  p->nrhs==cfp->do
9dc0: 74 20 29 7b 20 20 20 20 20 20 20 20 2f 2a 20 49  t ){        /* I
9dd0: 73 20 64 6f 74 20 61 74 20 65 78 74 72 65 6d 65  s dot at extreme
9de0: 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20 20   right? */.     
9df0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65     for(j=0; j<le
9e00: 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a  mp->nterminal; j
9e10: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
9e20: 66 28 20 53 65 74 46 69 6e 64 28 63 66 70 2d 3e  f( SetFind(cfp->
9e30: 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20 20  fws,j) ){.      
9e40: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 72        /* Add a r
9e50: 65 64 75 63 65 20 61 63 74 69 6f 6e 20 74 6f 20  educe action to 
9e60: 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20  the state "stp" 
9e70: 77 68 69 63 68 20 77 69 6c 6c 20 72 65 64 75 63  which will reduc
9e80: 65 20 62 79 20 74 68 65 0a 20 20 20 20 20 20 20  e by the.       
9e90: 20 20 20 20 20 2a 2a 20 72 75 6c 65 20 22 63 66       ** rule "cf
9ea0: 70 2d 3e 72 70 22 20 69 66 20 74 68 65 20 6c 6f  p->rp" if the lo
9eb0: 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 69  okahead symbol i
9ec0: 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  s "lemp->symbols
9ed0: 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  [j]" */.        
9ee0: 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26      Action_add(&
9ef0: 73 74 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c 6c  stp->ap,REDUCE,l
9f00: 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c  emp->symbols[j],
9f10: 28 63 68 61 72 20 2a 29 63 66 70 2d 3e 72 70 29  (char *)cfp->rp)
9f20: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9f30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9f40: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9f50: 41 64 64 20 74 68 65 20 61 63 63 65 70 74 69 6e  Add the acceptin
9f60: 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66 28  g token */.  if(
9f70: 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a   lemp->start ){.
9f80: 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f      sp = Symbol_
9f90: 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74  find(lemp->start
9fa0: 29 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30  );.    if( sp==0
9fb0: 20 29 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 74   ) sp = lemp->st
9fc0: 61 72 74 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20  artRule->lhs;.  
9fd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20  }else{.    sp = 
9fe0: 6c 65 6d 70 2d 3e 73 74 61 72 74 52 75 6c 65 2d  lemp->startRule-
9ff0: 3e 6c 68 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41  >lhs;.  }.  /* A
a000: 64 64 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  dd to the first 
a010: 73 74 61 74 65 20 28 77 68 69 63 68 20 69 73 20  state (which is 
a020: 61 6c 77 61 79 73 20 74 68 65 20 73 74 61 72 74  always the start
a030: 69 6e 67 20 73 74 61 74 65 20 6f 66 20 74 68 65  ing state of the
a040: 0a 20 20 2a 2a 20 66 69 6e 69 74 65 20 73 74 61  .  ** finite sta
a050: 74 65 20 6d 61 63 68 69 6e 65 29 20 61 6e 20 61  te machine) an a
a060: 63 74 69 6f 6e 20 74 6f 20 41 43 43 45 50 54 20  ction to ACCEPT 
a070: 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  if the lookahead
a080: 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 73 74 61   is the.  ** sta
a090: 72 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20  rt nonterminal. 
a0a0: 20 2a 2f 0a 20 20 41 63 74 69 6f 6e 5f 61 64 64   */.  Action_add
a0b0: 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30  (&lemp->sorted[0
a0c0: 5d 2d 3e 61 70 2c 41 43 43 45 50 54 2c 73 70 2c  ]->ap,ACCEPT,sp,
a0d0: 30 29 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76  0);..  /* Resolv
a0e0: 65 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20  e conflicts */. 
a0f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
a100: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
a110: 20 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f      struct actio
a120: 6e 20 2a 61 70 2c 20 2a 6e 61 70 3b 0a 20 20 20  n *ap, *nap;.   
a130: 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
a140: 74 65 64 5b 69 5d 3b 0a 20 20 20 20 2f 2a 20 61  ted[i];.    /* a
a150: 73 73 65 72 74 28 20 73 74 70 2d 3e 61 70 20 29  ssert( stp->ap )
a160: 3b 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 61 70  ; */.    stp->ap
a170: 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73   = Action_sort(s
a180: 74 70 2d 3e 61 70 29 3b 0a 20 20 20 20 66 6f 72  tp->ap);.    for
a190: 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 20  (ap=stp->ap; ap 
a1a0: 26 26 20 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3d  && ap->next; ap=
a1b0: 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
a1c0: 20 66 6f 72 28 6e 61 70 3d 61 70 2d 3e 6e 65 78   for(nap=ap->nex
a1d0: 74 3b 20 6e 61 70 20 26 26 20 6e 61 70 2d 3e 73  t; nap && nap->s
a1e0: 70 3d 3d 61 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e  p==ap->sp; nap=n
a1f0: 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
a200: 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 61      /* The two a
a210: 63 74 69 6f 6e 73 20 22 61 70 22 20 61 6e 64 20  ctions "ap" and 
a220: 22 6e 61 70 22 20 68 61 76 65 20 74 68 65 20 73  "nap" have the s
a230: 61 6d 65 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20  ame lookahead.. 
a240: 20 20 20 20 20 20 20 20 2a 2a 20 46 69 67 75 72          ** Figur
a250: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
a260: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 2a  should be used *
a270: 2f 0a 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d  /.         lemp-
a280: 3e 6e 63 6f 6e 66 6c 69 63 74 20 2b 3d 20 72 65  >nconflict += re
a290: 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61  solve_conflict(a
a2a0: 70 2c 6e 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a  p,nap);.      }.
a2b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
a2c0: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
a2d0: 66 6f 72 20 65 61 63 68 20 72 75 6c 65 20 74 68  for each rule th
a2e0: 61 74 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  at can never be 
a2f0: 72 65 64 75 63 65 64 2e 20 2a 2f 0a 20 20 66 6f  reduced. */.  fo
a300: 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
a310: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
a320: 29 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20  ) rp->canReduce 
a330: 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20  = LEMON_FALSE;. 
a340: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
a350: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
a360: 20 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f      struct actio
a370: 6e 20 2a 61 70 3b 0a 20 20 20 20 66 6f 72 28 61  n *ap;.    for(a
a380: 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  p=lemp->sorted[i
a390: 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  ]->ap; ap; ap=ap
a3a0: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
a3b0: 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44  f( ap->type==RED
a3c0: 55 43 45 20 29 20 61 70 2d 3e 78 2e 72 70 2d 3e  UCE ) ap->x.rp->
a3d0: 63 61 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f  canReduce = LEMO
a3e0: 4e 5f 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  N_TRUE;.    }.  
a3f0: 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  }.  for(rp=lemp-
a400: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
a410: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  ->next){.    if(
a420: 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 29   rp->canReduce )
a430: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 45   continue;.    E
a440: 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
a450: 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c  lename,rp->rulel
a460: 69 6e 65 2c 22 54 68 69 73 20 72 75 6c 65 20 63  ine,"This rule c
a470: 61 6e 20 6e 6f 74 20 62 65 20 72 65 64 75 63 65  an not be reduce
a480: 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c 65 6d 70  d.\n");.    lemp
a490: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
a4a0: 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20  }.}../* Resolve 
a4b0: 61 20 63 6f 6e 66 6c 69 63 74 20 62 65 74 77 65  a conflict betwe
a4c0: 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e  en the two given
a4d0: 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68   actions.  If th
a4e0: 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 63 61  e.** conflict ca
a4f0: 6e 27 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2c  n't be resolved,
a500: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
a510: 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47 45  ..**.** NO LONGE
a520: 52 20 54 52 55 45 3a 0a 2a 2a 20 20 20 54 6f 20  R TRUE:.**   To 
a530: 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69  resolve a confli
a540: 63 74 2c 20 66 69 72 73 74 20 6c 6f 6f 6b 20 74  ct, first look t
a550: 6f 20 73 65 65 20 69 66 20 65 69 74 68 65 72 20  o see if either 
a560: 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20 6f  action.**   is o
a570: 6e 20 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2e  n an error rule.
a580: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
a590: 74 61 6b 65 20 74 68 65 20 61 63 74 69 6f 6e 20  take the action 
a5a0: 77 68 69 63 68 0a 2a 2a 20 20 20 69 73 20 6e 6f  which.**   is no
a5b0: 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
a5c0: 68 20 74 68 65 20 65 72 72 6f 72 20 72 75 6c 65  h the error rule
a5d0: 2e 20 20 49 66 20 6e 65 69 74 68 65 72 20 6f 72  .  If neither or
a5e0: 20 62 6f 74 68 0a 2a 2a 20 20 20 61 63 74 69 6f   both.**   actio
a5f0: 6e 73 20 61 72 65 20 61 73 73 6f 63 69 61 74 65  ns are associate
a600: 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
a610: 72 75 6c 65 2c 20 74 68 65 6e 20 74 72 79 20 74  rule, then try t
a620: 6f 0a 2a 2a 20 20 20 75 73 65 20 70 72 65 63 65  o.**   use prece
a630: 64 65 6e 63 65 20 74 6f 20 72 65 73 6f 6c 76 65  dence to resolve
a640: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2e 0a 2a   the conflict..*
a650: 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 61  *.** If either a
a660: 63 74 69 6f 6e 20 69 73 20 61 20 53 48 49 46 54  ction is a SHIFT
a670: 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62  , then it must b
a680: 65 20 61 70 78 2e 20 20 54 68 69 73 0a 2a 2a 20  e apx.  This.** 
a690: 66 75 6e 63 74 69 6f 6e 20 77 6f 6e 27 74 20 77  function won't w
a6a0: 6f 72 6b 20 69 66 20 61 70 78 2d 3e 74 79 70 65  ork if apx->type
a6b0: 3d 3d 52 45 44 55 43 45 20 61 6e 64 20 61 70 79  ==REDUCE and apy
a6c0: 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 2e 0a 2a  ->type==SHIFT..*
a6d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
a6e0: 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 0a 20  olve_conflict(. 
a6f0: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
a700: 61 70 78 2c 0a 20 20 73 74 72 75 63 74 20 61 63  apx,.  struct ac
a710: 74 69 6f 6e 20 2a 61 70 79 0a 29 7b 0a 20 20 73  tion *apy.){.  s
a720: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
a730: 78 2c 20 2a 73 70 79 3b 0a 20 20 69 6e 74 20 65  x, *spy;.  int e
a740: 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 73 73  rrcnt = 0;.  ass
a750: 65 72 74 28 20 61 70 78 2d 3e 73 70 3d 3d 61 70  ert( apx->sp==ap
a760: 79 2d 3e 73 70 20 29 3b 20 20 2f 2a 20 4f 74 68  y->sp );  /* Oth
a770: 65 72 77 69 73 65 20 74 68 65 72 65 20 77 6f 75  erwise there wou
a780: 6c 64 20 62 65 20 6e 6f 20 63 6f 6e 66 6c 69 63  ld be no conflic
a790: 74 20 2a 2f 0a 20 20 69 66 28 20 61 70 78 2d 3e  t */.  if( apx->
a7a0: 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61  type==SHIFT && a
a7b0: 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20  py->type==SHIFT 
a7c0: 29 7b 0a 20 20 20 20 61 70 79 2d 3e 74 79 70 65  ){.    apy->type
a7d0: 20 3d 20 53 53 43 4f 4e 46 4c 49 43 54 3b 0a 20   = SSCONFLICT;. 
a7e0: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d     errcnt++;.  }
a7f0: 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65  .  if( apx->type
a800: 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79 2d 3e  ==SHIFT && apy->
a810: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a  type==REDUCE ){.
a820: 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 73      spx = apx->s
a830: 70 3b 0a 20 20 20 20 73 70 79 20 3d 20 61 70 79  p;.    spy = apy
a840: 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b  ->x.rp->precsym;
a850: 0a 20 20 20 20 69 66 28 20 73 70 79 3d 3d 30 20  .    if( spy==0 
a860: 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c  || spx->prec<0 |
a870: 7c 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 29 7b  | spy->prec<0 ){
a880: 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 65 6e  .      /* Not en
a890: 6f 75 67 68 20 70 72 65 63 65 64 65 6e 63 65 20  ough precedence 
a8a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a  information. */.
a8b0: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20        apy->type 
a8c0: 3d 20 53 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20  = SRCONFLICT;.  
a8d0: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
a8e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
a8f0: 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20  >prec>spy->prec 
a900: 29 7b 20 20 20 20 2f 2a 20 68 69 67 68 65 72 20  ){    /* higher 
a910: 70 72 65 63 65 64 65 6e 63 65 20 77 69 6e 73 20  precedence wins 
a920: 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  */.      apy->ty
a930: 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44  pe = RD_RESOLVED
a940: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a950: 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70  spx->prec<spy->p
a960: 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78  rec ){.      apx
a970: 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52 45 53 4f  ->type = SH_RESO
a980: 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LVED;.    }else 
a990: 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73  if( spx->prec==s
a9a0: 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d  py->prec && spx-
a9b0: 3e 61 73 73 6f 63 3d 3d 52 49 47 48 54 20 29 7b  >assoc==RIGHT ){
a9c0: 20 2f 2a 20 55 73 65 20 6f 70 65 72 61 74 6f 72   /* Use operator
a9d0: 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   */.      apy->t
a9e0: 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45  ype = RD_RESOLVE
a9f0: 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D;              
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa10: 2a 20 61 73 73 6f 63 69 61 74 69 76 69 74 79 20  * associativity 
aa20: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  */.    }else if(
aa30: 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d   spx->prec==spy-
aa40: 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73  >prec && spx->as
aa50: 73 6f 63 3d 3d 4c 45 46 54 20 29 7b 20 20 2f 2a  soc==LEFT ){  /*
aa60: 20 74 6f 20 62 72 65 61 6b 20 74 69 65 20 2a 2f   to break tie */
aa70: 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65  .      apx->type
aa80: 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a   = SH_RESOLVED;.
aa90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aaa0: 20 61 73 73 65 72 74 28 20 73 70 78 2d 3e 70 72   assert( spx->pr
aab0: 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26  ec==spy->prec &&
aac0: 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f 4e   spx->assoc==NON
aad0: 45 20 29 3b 0a 20 20 20 20 20 20 61 70 78 2d 3e  E );.      apx->
aae0: 74 79 70 65 20 3d 20 45 52 52 4f 52 3b 0a 20 20  type = ERROR;.  
aaf0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
ab00: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43  apx->type==REDUC
ab10: 45 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d  E && apy->type==
ab20: 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70  REDUCE ){.    sp
ab30: 78 20 3d 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70  x = apx->x.rp->p
ab40: 72 65 63 73 79 6d 3b 0a 20 20 20 20 73 70 79 20  recsym;.    spy 
ab50: 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65  = apy->x.rp->pre
ab60: 63 73 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70  csym;.    if( sp
ab70: 78 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c  x==0 || spy==0 |
ab80: 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c  | spx->prec<0 ||
ab90: 0a 20 20 20 20 73 70 79 2d 3e 70 72 65 63 3c 30  .    spy->prec<0
aba0: 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73   || spx->prec==s
abb0: 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20  py->prec ){.    
abc0: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 52    apy->type = RR
abd0: 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20  CONFLICT;.      
abe0: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65  errcnt++;.    }e
abf0: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
ac00: 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  c>spy->prec ){. 
ac10: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
ac20: 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   RD_RESOLVED;.  
ac30: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
ac40: 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20  >prec<spy->prec 
ac50: 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  ){.      apx->ty
ac60: 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44  pe = RD_RESOLVED
ac70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
ac80: 0a 20 20 20 20 61 73 73 65 72 74 28 0a 20 20 20  .    assert(.   
ac90: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48     apx->type==SH
aca0: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
acb0: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44     apx->type==RD
acc0: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
acd0: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 53     apx->type==SS
ace0: 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20  CONFLICT ||.    
acf0: 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 52 43    apx->type==SRC
ad00: 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20  ONFLICT ||.     
ad10: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 52 43 4f   apx->type==RRCO
ad20: 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20  NFLICT ||.      
ad30: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45  apy->type==SH_RE
ad40: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
ad50: 61 70 79 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45  apy->type==RD_RE
ad60: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
ad70: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e  apy->type==SSCON
ad80: 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61  FLICT ||.      a
ad90: 70 79 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46  py->type==SRCONF
ada0: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
adb0: 79 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c  y->type==RRCONFL
adc0: 49 43 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f  ICT.    );.    /
add0: 2a 20 54 68 65 20 52 45 44 55 43 45 2f 53 48 49  * The REDUCE/SHI
ade0: 46 54 20 63 61 73 65 20 63 61 6e 6e 6f 74 20 68  FT case cannot h
adf0: 61 70 70 65 6e 20 62 65 63 61 75 73 65 20 53 48  appen because SH
ae00: 49 46 54 73 20 63 6f 6d 65 20 62 65 66 6f 72 65  IFTs come before
ae10: 0a 20 20 20 20 2a 2a 20 52 45 44 55 43 45 73 20  .    ** REDUCEs 
ae20: 6f 6e 20 74 68 65 20 6c 69 73 74 2e 20 20 49 66  on the list.  If
ae30: 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
ae40: 6f 69 6e 74 20 69 74 20 6d 75 73 74 20 62 65 20  oint it must be 
ae50: 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74  because.    ** t
ae60: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 66 6c 69  he parser confli
ae70: 63 74 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  ct had already b
ae80: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f  een resolved. */
ae90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72  .  }.  return er
aea0: 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  rcnt;.}./*******
aeb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
aec0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 63 6f  rom the file "co
aed0: 6e 66 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a  nfiglist.c" ****
aee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aef0: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75  *****/./*.** Rou
af00: 74 69 6e 65 73 20 74 6f 20 70 72 6f 63 65 73 73  tines to process
af10: 69 6e 67 20 61 20 63 6f 6e 66 69 67 75 72 61 74  ing a configurat
af20: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 62 75 69  ion list and bui
af30: 6c 64 69 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a  lding a state.**
af40: 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
af50: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
af60: 2a 2f 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63  */..static struc
af70: 74 20 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69  t config *freeli
af80: 73 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  st = 0;      /* 
af90: 4c 69 73 74 20 6f 66 20 66 72 65 65 20 63 6f 6e  List of free con
afa0: 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  figurations */.s
afb0: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
afc0: 66 69 67 20 2a 63 75 72 72 65 6e 74 20 3d 20 30  fig *current = 0
afd0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f  ;       /* Top o
afe0: 66 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67  f list of config
aff0: 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  urations */.stat
b000: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
b010: 20 2a 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20   **currentend = 
b020: 30 3b 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20  0;   /* Last on 
b030: 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 73 20  list of configs 
b040: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
b050: 20 63 6f 6e 66 69 67 20 2a 62 61 73 69 73 20 3d   config *basis =
b060: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
b070: 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61  op of list of ba
b080: 73 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73  sis configs */.s
b090: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
b0a0: 66 69 67 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d  fig **basisend =
b0b0: 20 30 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f   0;     /* End o
b0c0: 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20  f list of basis 
b0d0: 63 6f 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52  configs */../* R
b0e0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
b0f0: 74 6f 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75  to a new configu
b100: 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54  ration */.PRIVAT
b110: 45 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  E struct config 
b120: 2a 6e 65 77 63 6f 6e 66 69 67 28 76 6f 69 64 29  *newconfig(void)
b130: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
b140: 67 20 2a 6e 65 77 63 66 67 3b 0a 20 20 69 66 28  g *newcfg;.  if(
b150: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
b160: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
b170: 6e 74 20 61 6d 74 20 3d 20 33 3b 0a 20 20 20 20  nt amt = 3;.    
b180: 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75  freelist = (stru
b190: 63 74 20 63 6f 6e 66 69 67 20 2a 29 63 61 6c 6c  ct config *)call
b1a0: 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28  oc( amt, sizeof(
b1b0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 29 20 29  struct config) )
b1c0: 3b 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c 69  ;.    if( freeli
b1d0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  st==0 ){.      f
b1e0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55  printf(stderr,"U
b1f0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
b200: 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e  e memory for a n
b210: 65 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ew configuration
b220: 2e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  .");.      exit(
b230: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
b240: 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20  r(i=0; i<amt-1; 
b250: 69 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69 5d  i++) freelist[i]
b260: 2e 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69 73  .next = &freelis
b270: 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65  t[i+1];.    free
b280: 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74  list[amt-1].next
b290: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 63   = 0;.  }.  newc
b2a0: 66 67 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20  fg = freelist;. 
b2b0: 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65 65   freelist = free
b2c0: 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65  list->next;.  re
b2d0: 74 75 72 6e 20 6e 65 77 63 66 67 3b 0a 7d 0a 0a  turn newcfg;.}..
b2e0: 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61  /* The configura
b2f0: 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73 20 6e 6f  tion "old" is no
b300: 20 6c 6f 6e 67 65 72 20 75 73 65 64 20 2a 2f 0a   longer used */.
b310: 50 52 49 56 41 54 45 20 76 6f 69 64 20 64 65 6c  PRIVATE void del
b320: 65 74 65 63 6f 6e 66 69 67 28 73 74 72 75 63 74  eteconfig(struct
b330: 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 29 0a 7b 0a   config *old).{.
b340: 20 20 6f 6c 64 2d 3e 6e 65 78 74 20 3d 20 66 72    old->next = fr
b350: 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69  eelist;.  freeli
b360: 73 74 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20  st = old;.}../* 
b370: 49 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20  Initialized the 
b380: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
b390: 73 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f  st builder */.vo
b3a0: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e  id Configlist_in
b3b0: 69 74 28 76 6f 69 64 29 7b 0a 20 20 63 75 72 72  it(void){.  curr
b3c0: 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65  ent = 0;.  curre
b3d0: 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74  ntend = &current
b3e0: 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20  ;.  basis = 0;. 
b3f0: 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73   basisend = &bas
b400: 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c  is;.  Configtabl
b410: 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72 65 74 75  e_init();.  retu
b420: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61  rn;.}../* Initia
b430: 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69 67  lized the config
b440: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75 69  uration list bui
b450: 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  lder */.void Con
b460: 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 76 6f  figlist_reset(vo
b470: 69 64 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d  id){.  current =
b480: 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64   0;.  currentend
b490: 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20 62   = &current;.  b
b4a0: 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69  asis = 0;.  basi
b4b0: 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a 20  send = &basis;. 
b4c0: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65   Configtable_cle
b4d0: 61 72 28 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b  ar(0);.  return;
b4e0: 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f 74 68  .}../* Add anoth
b4f0: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  er configuration
b500: 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72   to the configur
b510: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74  ation list */.st
b520: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
b530: 66 69 67 6c 69 73 74 5f 61 64 64 28 0a 20 20 73  figlist_add(.  s
b540: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20  truct rule *rp, 
b550: 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 20 2a     /* The rule *
b560: 2f 0a 20 20 69 6e 74 20 64 6f 74 20 20 20 20 20  /.  int dot     
b570: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
b580: 20 69 6e 74 6f 20 74 68 65 20 52 48 53 20 6f 66   into the RHS of
b590: 20 74 68 65 20 72 75 6c 65 20 77 68 65 72 65 20   the rule where 
b5a0: 74 68 65 20 64 6f 74 20 67 6f 65 73 20 2a 2f 0a  the dot goes */.
b5b0: 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  ){.  struct conf
b5c0: 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a  ig *cfp, model;.
b5d0: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65  .  assert( curre
b5e0: 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f  ntend!=0 );.  mo
b5f0: 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d  del.rp = rp;.  m
b600: 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a  odel.dot = dot;.
b610: 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61    cfp = Configta
b620: 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29  ble_find(&model)
b630: 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29  ;.  if( cfp==0 )
b640: 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63  {.    cfp = newc
b650: 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70  onfig();.    cfp
b660: 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63  ->rp = rp;.    c
b670: 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20  fp->dot = dot;. 
b680: 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65     cfp->fws = Se
b690: 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d  tNew();.    cfp-
b6a0: 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66  >stp = 0;.    cf
b6b0: 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62  p->fplp = cfp->b
b6c0: 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  plp = 0;.    cfp
b6d0: 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ->next = 0;.    
b6e0: 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20  cfp->bp = 0;.   
b6f0: 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63   *currentend = c
b700: 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65  fp;.    currente
b710: 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b  nd = &cfp->next;
b720: 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c 65  .    Configtable
b730: 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20 20  _insert(cfp);.  
b740: 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b 0a  }.  return cfp;.
b750: 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62 61 73 69  }../* Add a basi
b760: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
b770: 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  to the configura
b780: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72  tion list */.str
b790: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
b7a0: 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28  iglist_addbasis(
b7b0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
b7c0: 20 69 6e 74 20 64 6f 74 29 0a 7b 0a 20 20 73 74   int dot).{.  st
b7d0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
b7e0: 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65  , model;..  asse
b7f0: 72 74 28 20 62 61 73 69 73 65 6e 64 21 3d 30 20  rt( basisend!=0 
b800: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
b810: 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20  rentend!=0 );.  
b820: 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20  model.rp = rp;. 
b830: 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74   model.dot = dot
b840: 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67  ;.  cfp = Config
b850: 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65  table_find(&mode
b860: 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30  l);.  if( cfp==0
b870: 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65   ){.    cfp = ne
b880: 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63  wconfig();.    c
b890: 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20  fp->rp = rp;.   
b8a0: 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b   cfp->dot = dot;
b8b0: 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20  .    cfp->fws = 
b8c0: 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66  SetNew();.    cf
b8d0: 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20  p->stp = 0;.    
b8e0: 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d  cfp->fplp = cfp-
b8f0: 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63  >bplp = 0;.    c
b900: 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  fp->next = 0;.  
b910: 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20    cfp->bp = 0;. 
b920: 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d     *currentend =
b930: 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e   cfp;.    curren
b940: 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78  tend = &cfp->nex
b950: 74 3b 0a 20 20 20 20 2a 62 61 73 69 73 65 6e 64  t;.    *basisend
b960: 20 3d 20 63 66 70 3b 0a 20 20 20 20 62 61 73 69   = cfp;.    basi
b970: 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e 62 70 3b  send = &cfp->bp;
b980: 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c 65  .    Configtable
b990: 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20 20  _insert(cfp);.  
b9a0: 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b 0a  }.  return cfp;.
b9b0: 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  }../* Compute th
b9c0: 65 20 63 6c 6f 73 75 72 65 20 6f 66 20 74 68 65  e closure of the
b9d0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
b9e0: 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  ist */.void Conf
b9f0: 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 73  iglist_closure(s
ba00: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
ba10: 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  p).{.  struct co
ba20: 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6e 65 77 63  nfig *cfp, *newc
ba30: 66 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  fp;.  struct rul
ba40: 65 20 2a 72 70 2c 20 2a 6e 65 77 72 70 3b 0a 20  e *rp, *newrp;. 
ba50: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
ba60: 73 70 2c 20 2a 78 73 70 3b 0a 20 20 69 6e 74 20  sp, *xsp;.  int 
ba70: 69 2c 20 64 6f 74 3b 0a 0a 20 20 61 73 73 65 72  i, dot;..  asser
ba80: 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30  t( currentend!=0
ba90: 20 29 3b 0a 20 20 66 6f 72 28 63 66 70 3d 63 75   );.  for(cfp=cu
baa0: 72 72 65 6e 74 3b 20 63 66 70 3b 20 63 66 70 3d  rrent; cfp; cfp=
bab0: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
bac0: 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20  rp = cfp->rp;.  
bad0: 20 20 64 6f 74 20 3d 20 63 66 70 2d 3e 64 6f 74    dot = cfp->dot
bae0: 3b 0a 20 20 20 20 69 66 28 20 64 6f 74 3e 3d 72  ;.    if( dot>=r
baf0: 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e  p->nrhs ) contin
bb00: 75 65 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d  ue;.    sp = rp-
bb10: 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20 20 20 20 69  >rhs[dot];.    i
bb20: 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e  f( sp->type==NON
bb30: 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
bb40: 20 20 69 66 28 20 73 70 2d 3e 72 75 6c 65 3d 3d    if( sp->rule==
bb50: 30 20 26 26 20 73 70 21 3d 6c 65 6d 70 2d 3e 65  0 && sp!=lemp->e
bb60: 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 20  rrsym ){.       
bb70: 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
bb80: 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e  filename,rp->lin
bb90: 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c  e,"Nonterminal \
bba0: 22 25 73 5c 22 20 68 61 73 20 6e 6f 20 72 75 6c  "%s\" has no rul
bbb0: 65 73 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  es.",.          
bbc0: 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
bbd0: 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
bbe0: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
bbf0: 20 20 20 66 6f 72 28 6e 65 77 72 70 3d 73 70 2d     for(newrp=sp-
bc00: 3e 72 75 6c 65 3b 20 6e 65 77 72 70 3b 20 6e 65  >rule; newrp; ne
bc10: 77 72 70 3d 6e 65 77 72 70 2d 3e 6e 65 78 74 6c  wrp=newrp->nextl
bc20: 68 73 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  hs){.        new
bc30: 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74  cfp = Configlist
bc40: 5f 61 64 64 28 6e 65 77 72 70 2c 30 29 3b 0a 20  _add(newrp,0);. 
bc50: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 64 6f 74         for(i=dot
bc60: 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  +1; i<rp->nrhs; 
bc70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
bc80: 78 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d  xsp = rp->rhs[i]
bc90: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
bca0: 78 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49  xsp->type==TERMI
bcb0: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
bcc0: 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70     SetAdd(newcfp
bcd0: 2d 3e 66 77 73 2c 78 73 70 2d 3e 69 6e 64 65 78  ->fws,xsp->index
bce0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
bcf0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
bd00: 7d 65 6c 73 65 20 69 66 28 20 78 73 70 2d 3e 74  }else if( xsp->t
bd10: 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype==MULTITERMIN
bd20: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
bd30: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
bd40: 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
bd50: 78 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b  xsp->nsubsym; k+
bd60: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
bd70: 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d    SetAdd(newcfp-
bd80: 3e 66 77 73 2c 20 78 73 70 2d 3e 73 75 62 73 79  >fws, xsp->subsy
bd90: 6d 5b 6b 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20  m[k]->index);.  
bda0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
bdb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bdc0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74 55              SetU
bde0: 6e 69 6f 6e 28 6e 65 77 63 66 70 2d 3e 66 77 73  nion(newcfp->fws
bdf0: 2c 78 73 70 2d 3e 66 69 72 73 74 73 65 74 29 3b  ,xsp->firstset);
be00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
be10: 20 78 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45   xsp->lambda==LE
be20: 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61  MON_FALSE ) brea
be30: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
be40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
be50: 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73   if( i==rp->nrhs
be60: 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28 26 63 66   ) Plink_add(&cf
be70: 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66 70 29 3b  p->fplp,newcfp);
be80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
be90: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
bea0: 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66  /* Sort the conf
beb0: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a  iguration list *
bec0: 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  /.void Configlis
bed0: 74 5f 73 6f 72 74 28 76 6f 69 64 29 7b 0a 20 20  t_sort(void){.  
bee0: 63 75 72 72 65 6e 74 20 3d 20 28 73 74 72 75 63  current = (struc
bef0: 74 20 63 6f 6e 66 69 67 2a 29 6d 73 6f 72 74 28  t config*)msort(
bf00: 28 63 68 61 72 2a 29 63 75 72 72 65 6e 74 2c 28  (char*)current,(
bf10: 63 68 61 72 2a 2a 29 26 28 63 75 72 72 65 6e 74  char**)&(current
bf20: 2d 3e 6e 65 78 74 29 2c 0a 20 20 20 20 20 20 20  ->next),.       
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 66 69             Confi
bf50: 67 63 6d 70 29 3b 0a 20 20 63 75 72 72 65 6e 74  gcmp);.  current
bf60: 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  end = 0;.  retur
bf70: 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68  n;.}../* Sort th
bf80: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
bf90: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f  ation list */.vo
bfa0: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f  id Configlist_so
bfb0: 72 74 62 61 73 69 73 28 76 6f 69 64 29 7b 0a 20  rtbasis(void){. 
bfc0: 20 62 61 73 69 73 20 3d 20 28 73 74 72 75 63 74   basis = (struct
bfd0: 20 63 6f 6e 66 69 67 2a 29 6d 73 6f 72 74 28 28   config*)msort((
bfe0: 63 68 61 72 2a 29 63 75 72 72 65 6e 74 2c 28 63  char*)current,(c
bff0: 68 61 72 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d  har**)&(current-
c000: 3e 62 70 29 2c 0a 20 20 20 20 20 20 20 20 20 20  >bp),.          
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c020: 20 20 20 20 20 20 43 6f 6e 66 69 67 63 6d 70 29        Configcmp)
c030: 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 30  ;.  basisend = 0
c040: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
c050: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
c060: 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
c070: 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  f the configurat
c080: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  ion list and.** 
c090: 72 65 73 65 74 20 74 68 65 20 6c 69 73 74 20 2a  reset the list *
c0a0: 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  /.struct config 
c0b0: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75  *Configlist_retu
c0c0: 72 6e 28 76 6f 69 64 29 7b 0a 20 20 73 74 72 75  rn(void){.  stru
c0d0: 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a  ct config *old;.
c0e0: 20 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e 74 3b    old = current;
c0f0: 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a  .  current = 0;.
c100: 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30    currentend = 0
c110: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a  ;.  return old;.
c120: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
c130: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
c140: 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67  ad of the config
c150: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64  uration list and
c160: 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69  .** reset the li
c170: 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e  st */.struct con
c180: 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f  fig *Configlist_
c190: 62 61 73 69 73 28 76 6f 69 64 29 7b 0a 20 20 73  basis(void){.  s
c1a0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c  truct config *ol
c1b0: 64 3b 0a 20 20 6f 6c 64 20 3d 20 62 61 73 69 73  d;.  old = basis
c1c0: 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20  ;.  basis = 0;. 
c1d0: 20 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20   basisend = 0;. 
c1e0: 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a   return old;.}..
c1f0: 2f 2a 20 46 72 65 65 20 61 6c 6c 20 65 6c 65 6d  /* Free all elem
c200: 65 6e 74 73 20 6f 66 20 74 68 65 20 67 69 76 65  ents of the give
c210: 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  n configuration 
c220: 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  list */.void Con
c230: 66 69 67 6c 69 73 74 5f 65 61 74 28 73 74 72 75  figlist_eat(stru
c240: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a  ct config *cfp).
c250: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
c260: 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f  g *nextcfp;.  fo
c270: 72 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65 78  r(; cfp; cfp=nex
c280: 74 63 66 70 29 7b 0a 20 20 20 20 6e 65 78 74 63  tcfp){.    nextc
c290: 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a  fp = cfp->next;.
c2a0: 20 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d      assert( cfp-
c2b0: 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20  >fplp==0 );.    
c2c0: 61 73 73 65 72 74 28 20 63 66 70 2d 3e 62 70 6c  assert( cfp->bpl
c2d0: 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  p==0 );.    if( 
c2e0: 63 66 70 2d 3e 66 77 73 20 29 20 53 65 74 46 72  cfp->fws ) SetFr
c2f0: 65 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20  ee(cfp->fws);.  
c300: 20 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 63    deleteconfig(c
c310: 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fp);.  }.  retur
c320: 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n;.}./**********
c330: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
c340: 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 63 22 20   file "error.c" 
c350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c370: 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f  */./*.** Code fo
c380: 72 20 70 72 69 6e 74 69 6e 67 20 65 72 72 6f 72  r printing error
c390: 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 76 6f   message..*/..vo
c3a0: 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73  id ErrorMsg(cons
c3b0: 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65  t char *filename
c3c0: 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f  , int lineno, co
c3d0: 6e 73 74 20 63 68 61 72 20 2a 66 6f 72 6d 61 74  nst char *format
c3e0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
c3f0: 74 20 61 70 3b 0a 20 20 66 70 72 69 6e 74 66 28  t ap;.  fprintf(
c400: 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20  stderr, "%s:%d: 
c410: 22 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 6c 69 6e  ", filename, lin
c420: 65 6e 6f 29 3b 0a 20 20 76 61 5f 73 74 61 72 74  eno);.  va_start
c430: 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20  (ap, format);.  
c440: 76 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  vfprintf(stderr,
c450: 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76 61  format,ap);.  va
c460: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 70 72 69  _end(ap);.  fpri
c470: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22  ntf(stderr, "\n"
c480: 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}./**********
c490: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
c4a0: 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a 2a  file "main.c" **
c4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4d0: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20 70  **/./*.** Main p
c4e0: 72 6f 67 72 61 6d 20 66 69 6c 65 20 66 6f 72 20  rogram file for 
c4f0: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
c500: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
c510: 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75 74  /* Report an out
c520: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69  -of-memory condi
c530: 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e 20  tion and abort. 
c540: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
c550: 2a 20 69 73 20 75 73 65 64 20 6d 6f 73 74 6c 79  * is used mostly
c560: 20 62 79 20 74 68 65 20 22 4d 65 6d 6f 72 79 43   by the "MemoryC
c570: 68 65 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20 73  heck" macro in s
c580: 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64 20  truct.h.*/.void 
c590: 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 76 6f 69  memory_error(voi
c5a0: 64 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  d){.  fprintf(st
c5b0: 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d  derr,"Out of mem
c5c0: 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e  ory.  Aborting..
c5d0: 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29  .\n");.  exit(1)
c5e0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
c5f0: 6e 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 20 20  nDefine = 0;    
c600: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 2d    /* Number of -
c610: 44 20 6f 70 74 69 6f 6e 73 20 6f 6e 20 74 68 65  D options on the
c620: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f   command line */
c630: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 61  .static char **a
c640: 7a 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 2f 2a  zDefine = 0;  /*
c650: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 2d 44 20   Name of the -D 
c660: 6d 61 63 72 6f 73 20 2a 2f 0a 0a 2f 2a 20 54 68  macros */../* Th
c670: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
c680: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 61 72  lled with the ar
c690: 67 75 6d 65 6e 74 20 74 6f 20 65 61 63 68 20 2d  gument to each -
c6a0: 44 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  D command-line o
c6b0: 70 74 69 6f 6e 2e 0a 2a 2a 20 41 64 64 20 74 68  ption..** Add th
c6c0: 65 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 20  e macro defined 
c6d0: 74 6f 20 74 68 65 20 61 7a 44 65 66 69 6e 65 20  to the azDefine 
c6e0: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
c6f0: 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f 44 5f 6f   void handle_D_o
c700: 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a  ption(char *z){.
c710: 20 20 63 68 61 72 20 2a 2a 70 61 7a 3b 0a 20 20    char **paz;.  
c720: 6e 44 65 66 69 6e 65 2b 2b 3b 0a 20 20 61 7a 44  nDefine++;.  azD
c730: 65 66 69 6e 65 20 3d 20 28 63 68 61 72 20 2a 2a  efine = (char **
c740: 29 20 72 65 61 6c 6c 6f 63 28 61 7a 44 65 66 69  ) realloc(azDefi
c750: 6e 65 2c 20 73 69 7a 65 6f 66 28 61 7a 44 65 66  ne, sizeof(azDef
c760: 69 6e 65 5b 30 5d 29 2a 6e 44 65 66 69 6e 65 29  ine[0])*nDefine)
c770: 3b 0a 20 20 69 66 28 20 61 7a 44 65 66 69 6e 65  ;.  if( azDefine
c780: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
c790: 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20 6f  tf(stderr,"out o
c7a0: 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
c7b0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
c7c0: 20 70 61 7a 20 3d 20 26 61 7a 44 65 66 69 6e 65   paz = &azDefine
c7d0: 5b 6e 44 65 66 69 6e 65 2d 31 5d 3b 0a 20 20 2a  [nDefine-1];.  *
c7e0: 70 61 7a 20 3d 20 28 63 68 61 72 20 2a 29 20 6d  paz = (char *) m
c7f0: 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
c800: 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28  en(z)+1 );.  if(
c810: 20 2a 70 61 7a 3d 3d 30 20 29 7b 0a 20 20 20 20   *paz==0 ){.    
c820: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
c830: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
c840: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
c850: 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63    }.  lemon_strc
c860: 70 79 28 2a 70 61 7a 2c 20 7a 29 3b 0a 20 20 66  py(*paz, z);.  f
c870: 6f 72 28 7a 3d 2a 70 61 7a 3b 20 2a 7a 20 26 26  or(z=*paz; *z &&
c880: 20 2a 7a 21 3d 27 3d 27 3b 20 7a 2b 2b 29 7b 7d   *z!='='; z++){}
c890: 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 73 74  .  *z = 0;.}..st
c8a0: 61 74 69 63 20 63 68 61 72 20 2a 75 73 65 72 5f  atic char *user_
c8b0: 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20 3d 20 4e  templatename = N
c8c0: 55 4c 4c 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  ULL;.static void
c8d0: 20 68 61 6e 64 6c 65 5f 54 5f 6f 70 74 69 6f 6e   handle_T_option
c8e0: 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 73 65  (char *z){.  use
c8f0: 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20 3d  r_templatename =
c900: 20 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63   (char *) malloc
c910: 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29  ( lemonStrlen(z)
c920: 2b 31 20 29 3b 0a 20 20 69 66 28 20 75 73 65 72  +1 );.  if( user
c930: 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 3d 3d 30  _templatename==0
c940: 20 29 7b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65   ){.    memory_e
c950: 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 6c 65  rror();.  }.  le
c960: 6d 6f 6e 5f 73 74 72 63 70 79 28 75 73 65 72 5f  mon_strcpy(user_
c970: 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 20 7a 29  templatename, z)
c980: 3b 0a 7d 0a 0a 2f 2a 20 4d 65 72 67 65 20 74 6f  ;.}../* Merge to
c990: 67 65 74 68 65 72 20 74 6f 20 6c 69 73 74 73 20  gether to lists 
c9a0: 6f 66 20 72 75 6c 65 73 20 6f 72 64 65 72 65 64  of rules ordered
c9b0: 20 62 79 20 72 75 6c 65 2e 69 52 75 6c 65 20 2a   by rule.iRule *
c9c0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
c9d0: 72 75 6c 65 20 2a 52 75 6c 65 5f 6d 65 72 67 65  rule *Rule_merge
c9e0: 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 41  (struct rule *pA
c9f0: 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70  , struct rule *p
ca00: 42 29 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  B){.  struct rul
ca10: 65 20 2a 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  e *pFirst = 0;. 
ca20: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 2a 70   struct rule **p
ca30: 70 50 72 65 76 20 3d 20 26 70 46 69 72 73 74 3b  pPrev = &pFirst;
ca40: 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26 26 20  .  while( pA && 
ca50: 70 42 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  pB ){.    if( pA
ca60: 2d 3e 69 52 75 6c 65 3c 70 42 2d 3e 69 52 75 6c  ->iRule<pB->iRul
ca70: 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 72  e ){.      *ppPr
ca80: 65 76 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  ev = pA;.      p
ca90: 70 50 72 65 76 20 3d 20 26 70 41 2d 3e 6e 65 78  pPrev = &pA->nex
caa0: 74 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41  t;.      pA = pA
cab0: 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  ->next;.    }els
cac0: 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 76  e{.      *ppPrev
cad0: 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 70 50   = pB;.      ppP
cae0: 72 65 76 20 3d 20 26 70 42 2d 3e 6e 65 78 74 3b  rev = &pB->next;
caf0: 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e  .      pB = pB->
cb00: 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  next;.    }.  }.
cb10: 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20 20    if( pA ){.    
cb20: 2a 70 70 50 72 65 76 20 3d 20 70 41 3b 0a 20 20  *ppPrev = pA;.  
cb30: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 72  }else{.    *ppPr
cb40: 65 76 20 3d 20 70 42 3b 0a 20 20 7d 0a 20 20 72  ev = pB;.  }.  r
cb50: 65 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a  eturn pFirst;.}.
cb60: 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 61 20 6c 69  ./*.** Sort a li
cb70: 73 74 20 6f 66 20 72 75 6c 65 73 20 69 6e 20 6f  st of rules in o
cb80: 72 64 65 72 20 6f 66 20 69 6e 63 72 65 61 73 69  rder of increasi
cb90: 6e 67 20 69 52 75 6c 65 20 76 61 6c 75 65 0a 2a  ng iRule value.*
cba0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
cbb0: 72 75 6c 65 20 2a 52 75 6c 65 5f 73 6f 72 74 28  rule *Rule_sort(
cbc0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29  struct rule *rp)
cbd0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
cbe0: 75 63 74 20 72 75 6c 65 20 2a 70 4e 65 78 74 3b  uct rule *pNext;
cbf0: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
cc00: 78 5b 33 32 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  x[32];.  memset(
cc10: 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29  x, 0, sizeof(x))
cc20: 3b 0a 20 20 77 68 69 6c 65 28 20 72 70 20 29 7b  ;.  while( rp ){
cc30: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 72 70 2d  .    pNext = rp-
cc40: 3e 6e 65 78 74 3b 0a 20 20 20 20 72 70 2d 3e 6e  >next;.    rp->n
cc50: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ext = 0;.    for
cc60: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 78  (i=0; i<sizeof(x
cc70: 29 2f 73 69 7a 65 6f 66 28 78 5b 30 5d 29 20 26  )/sizeof(x[0]) &
cc80: 26 20 78 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  & x[i]; i++){.  
cc90: 20 20 20 20 72 70 20 3d 20 52 75 6c 65 5f 6d 65      rp = Rule_me
cca0: 72 67 65 28 78 5b 69 5d 2c 20 72 70 29 3b 0a 20  rge(x[i], rp);. 
ccb0: 20 20 20 20 20 78 5b 69 5d 20 3d 20 30 3b 0a 20       x[i] = 0;. 
ccc0: 20 20 20 7d 0a 20 20 20 20 78 5b 69 5d 20 3d 20     }.    x[i] = 
ccd0: 72 70 3b 0a 20 20 20 20 72 70 20 3d 20 70 4e 65  rp;.    rp = pNe
cce0: 78 74 3b 0a 20 20 7d 0a 20 20 72 70 20 3d 20 30  xt;.  }.  rp = 0
ccf0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
cd00: 69 7a 65 6f 66 28 78 29 2f 73 69 7a 65 6f 66 28  izeof(x)/sizeof(
cd10: 78 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  x[0]); i++){.   
cd20: 20 72 70 20 3d 20 52 75 6c 65 5f 6d 65 72 67 65   rp = Rule_merge
cd30: 28 78 5b 69 5d 2c 20 72 70 29 3b 0a 20 20 7d 0a  (x[i], rp);.  }.
cd40: 20 20 72 65 74 75 72 6e 20 72 70 3b 0a 7d 0a 0a    return rp;.}..
cd50: 2f 2a 20 66 6f 72 77 61 72 64 20 72 65 66 65 72  /* forward refer
cd60: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 63  ence */.static c
cd70: 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d  onst char *minim
cd80: 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74  um_size_type(int
cd90: 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 2c 20 69   lwr, int upr, i
cda0: 6e 74 20 2a 70 6e 42 79 74 65 29 3b 0a 0a 2f 2a  nt *pnByte);../*
cdb0: 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20   Print a single 
cdc0: 6c 69 6e 65 20 6f 66 20 74 68 65 20 22 50 61 72  line of the "Par
cdd0: 73 65 72 20 53 74 61 74 73 22 20 6f 75 74 70 75  ser Stats" outpu
cde0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
cdf0: 20 73 74 61 74 73 5f 6c 69 6e 65 28 63 6f 6e 73   stats_line(cons
ce00: 74 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20  t char *zLabel, 
ce10: 69 6e 74 20 69 56 61 6c 75 65 29 7b 0a 20 20 69  int iValue){.  i
ce20: 6e 74 20 6e 4c 61 62 65 6c 20 3d 20 6c 65 6d 6f  nt nLabel = lemo
ce30: 6e 53 74 72 6c 65 6e 28 7a 4c 61 62 65 6c 29 3b  nStrlen(zLabel);
ce40: 0a 20 20 70 72 69 6e 74 66 28 22 20 20 25 73 25  .  printf("  %s%
ce50: 2e 2a 73 20 25 35 64 5c 6e 22 2c 20 7a 4c 61 62  .*s %5d\n", zLab
ce60: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 33 35 2d  el,.         35-
ce70: 6e 4c 61 62 65 6c 2c 20 22 2e 2e 2e 2e 2e 2e 2e  nLabel, ".......
ce80: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
ce90: 2e 2e 2e 2e 2e 2e 2e 2e 2e 22 2c 0a 20 20 20 20  .........",.    
cea0: 20 20 20 20 20 69 56 61 6c 75 65 29 3b 0a 7d 0a       iValue);.}.
ceb0: 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70 72 6f  ./* The main pro
cec0: 67 72 61 6d 2e 20 20 50 61 72 73 65 20 74 68 65  gram.  Parse the
ced0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e   command line an
cee0: 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69 6e  d do it... */.in
cef0: 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c  t main(int argc,
cf00: 20 63 68 61 72 20 2a 2a 61 72 67 76 29 0a 7b 0a   char **argv).{.
cf10: 20 20 73 74 61 74 69 63 20 69 6e 74 20 76 65 72    static int ver
cf20: 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74  sion = 0;.  stat
cf30: 69 63 20 69 6e 74 20 72 70 66 6c 61 67 20 3d 20  ic int rpflag = 
cf40: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
cf50: 62 61 73 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20  basisflag = 0;. 
cf60: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d 70   static int comp
cf70: 72 65 73 73 20 3d 20 30 3b 0a 20 20 73 74 61 74  ress = 0;.  stat
cf80: 69 63 20 69 6e 74 20 71 75 69 65 74 20 3d 20 30  ic int quiet = 0
cf90: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 73  ;.  static int s
cfa0: 74 61 74 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  tatistics = 0;. 
cfb0: 20 73 74 61 74 69 63 20 69 6e 74 20 6d 68 66 6c   static int mhfl
cfc0: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
cfd0: 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c   int nolinenosfl
cfe0: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
cff0: 20 69 6e 74 20 6e 6f 52 65 73 6f 72 74 20 3d 20   int noResort = 
d000: 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  0;.  static stru
d010: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70 74  ct s_options opt
d020: 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  ions[] = {.    {
d030: 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20 28  OPT_FLAG, "b", (
d040: 63 68 61 72 2a 29 26 62 61 73 69 73 66 6c 61 67  char*)&basisflag
d050: 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74 68  , "Print only th
d060: 65 20 62 61 73 69 73 20 69 6e 20 72 65 70 6f 72  e basis in repor
d070: 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  t."},.    {OPT_F
d080: 4c 41 47 2c 20 22 63 22 2c 20 28 63 68 61 72 2a  LAG, "c", (char*
d090: 29 26 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f 6e  )&compress, "Don
d0a0: 27 74 20 63 6f 6d 70 72 65 73 73 20 74 68 65 20  't compress the 
d0b0: 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c  action table."},
d0c0: 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20  .    {OPT_FSTR, 
d0d0: 22 44 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64  "D", (char*)hand
d0e0: 6c 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22 44 65  le_D_option, "De
d0f0: 66 69 6e 65 20 61 6e 20 25 69 66 64 65 66 20 6d  fine an %ifdef m
d100: 61 63 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  acro."},.    {OP
d110: 54 5f 46 53 54 52 2c 20 22 66 22 2c 20 30 2c 20  T_FSTR, "f", 0, 
d120: 22 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63  "Ignored.  (Plac
d130: 65 68 6f 6c 64 65 72 20 66 6f 72 20 2d 66 20 63  eholder for -f c
d140: 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e  ompiler options.
d150: 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  )"},.    {OPT_FL
d160: 41 47 2c 20 22 67 22 2c 20 28 63 68 61 72 2a 29  AG, "g", (char*)
d170: 26 72 70 66 6c 61 67 2c 20 22 50 72 69 6e 74 20  &rpflag, "Print 
d180: 67 72 61 6d 6d 61 72 20 77 69 74 68 6f 75 74 20  grammar without 
d190: 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20  actions."},.    
d1a0: 7b 4f 50 54 5f 46 53 54 52 2c 20 22 49 22 2c 20  {OPT_FSTR, "I", 
d1b0: 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20 20 28 50  0, "Ignored.  (P
d1c0: 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 27  laceholder for '
d1d0: 2d 49 27 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  -I' compiler opt
d1e0: 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f  ions.)"},.    {O
d1f0: 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63  PT_FLAG, "m", (c
d200: 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f  har*)&mhflag, "O
d210: 75 74 70 75 74 20 61 20 6d 61 6b 65 68 65 61 64  utput a makehead
d220: 65 72 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 66  ers compatible f
d230: 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ile."},.    {OPT
d240: 5f 46 4c 41 47 2c 20 22 6c 22 2c 20 28 63 68 61  _FLAG, "l", (cha
d250: 72 2a 29 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  r*)&nolinenosfla
d260: 67 2c 20 22 44 6f 20 6e 6f 74 20 70 72 69 6e 74  g, "Do not print
d270: 20 23 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e 74   #line statement
d280: 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  s."},.    {OPT_F
d290: 53 54 52 2c 20 22 4f 22 2c 20 30 2c 20 22 49 67  STR, "O", 0, "Ig
d2a0: 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63 65 68 6f  nored.  (Placeho
d2b0: 6c 64 65 72 20 66 6f 72 20 27 2d 4f 27 20 63 6f  lder for '-O' co
d2c0: 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29  mpiler options.)
d2d0: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
d2e0: 47 2c 20 22 70 22 2c 20 28 63 68 61 72 2a 29 26  G, "p", (char*)&
d2f0: 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f  showPrecedenceCo
d300: 6e 66 6c 69 63 74 2c 0a 20 20 20 20 20 20 20 20  nflict,.        
d310: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 68 6f              "Sho
d320: 77 20 63 6f 6e 66 6c 69 63 74 73 20 72 65 73 6f  w conflicts reso
d330: 6c 76 65 64 20 62 79 20 70 72 65 63 65 64 65 6e  lved by preceden
d340: 63 65 20 72 75 6c 65 73 22 7d 2c 0a 20 20 20 20  ce rules"},.    
d350: 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20  {OPT_FLAG, "q", 
d360: 28 63 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22  (char*)&quiet, "
d370: 28 51 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72  (Quiet) Don't pr
d380: 69 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20 66  int the report f
d390: 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ile."},.    {OPT
d3a0: 5f 46 4c 41 47 2c 20 22 72 22 2c 20 28 63 68 61  _FLAG, "r", (cha
d3b0: 72 2a 29 26 6e 6f 52 65 73 6f 72 74 2c 20 22 44  r*)&noResort, "D
d3c0: 6f 20 6e 6f 74 20 73 6f 72 74 20 6f 72 20 72 65  o not sort or re
d3d0: 6e 75 6d 62 65 72 20 73 74 61 74 65 73 22 7d 2c  number states"},
d3e0: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
d3f0: 22 73 22 2c 20 28 63 68 61 72 2a 29 26 73 74 61  "s", (char*)&sta
d400: 74 69 73 74 69 63 73 2c 0a 20 20 20 20 20 20 20  tistics,.       
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d420: 20 20 20 20 20 20 20 20 20 20 20 20 22 50 72 69              "Pri
d430: 6e 74 20 70 61 72 73 65 72 20 73 74 61 74 73 20  nt parser stats 
d440: 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70  to standard outp
d450: 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ut."},.    {OPT_
d460: 46 4c 41 47 2c 20 22 78 22 2c 20 28 63 68 61 72  FLAG, "x", (char
d470: 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22 50 72 69  *)&version, "Pri
d480: 6e 74 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  nt the version n
d490: 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f  umber."},.    {O
d4a0: 50 54 5f 46 53 54 52 2c 20 22 54 22 2c 20 28 63  PT_FSTR, "T", (c
d4b0: 68 61 72 2a 29 68 61 6e 64 6c 65 5f 54 5f 6f 70  har*)handle_T_op
d4c0: 74 69 6f 6e 2c 20 22 53 70 65 63 69 66 79 20 61  tion, "Specify a
d4d0: 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 2e 22   template file."
d4e0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52  },.    {OPT_FSTR
d4f0: 2c 20 22 57 22 2c 20 30 2c 20 22 49 67 6e 6f 72  , "W", 0, "Ignor
d500: 65 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64 65  ed.  (Placeholde
d510: 72 20 66 6f 72 20 27 2d 57 27 20 63 6f 6d 70 69  r for '-W' compi
d520: 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c  ler options.)"},
d530: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 30  .    {OPT_FLAG,0
d540: 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  ,0,0}.  };.  int
d550: 20 69 3b 0a 20 20 69 6e 74 20 65 78 69 74 63 6f   i;.  int exitco
d560: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 6c 65 6d  de;.  struct lem
d570: 6f 6e 20 6c 65 6d 3b 0a 20 20 73 74 72 75 63 74  on lem;.  struct
d580: 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 4f 70   rule *rp;..  Op
d590: 74 49 6e 69 74 28 61 72 67 76 2c 6f 70 74 69 6f  tInit(argv,optio
d5a0: 6e 73 2c 73 74 64 65 72 72 29 3b 0a 20 20 69 66  ns,stderr);.  if
d5b0: 28 20 76 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20  ( version ){.   
d5c0: 20 20 70 72 69 6e 74 66 28 22 4c 65 6d 6f 6e 20    printf("Lemon 
d5d0: 76 65 72 73 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b  version 1.0\n");
d5e0: 0a 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a 20  .     exit(0);. 
d5f0: 20 7d 0a 20 20 69 66 28 20 4f 70 74 4e 41 72 67   }.  if( OptNArg
d600: 73 28 29 21 3d 31 20 29 7b 0a 20 20 20 20 66 70  s()!=1 ){.    fp
d610: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 78  rintf(stderr,"Ex
d620: 61 63 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e 61  actly one filena
d630: 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72  me argument is r
d640: 65 71 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20 20  equired.\n");.  
d650: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
d660: 20 6d 65 6d 73 65 74 28 26 6c 65 6d 2c 20 30 2c   memset(&lem, 0,
d670: 20 73 69 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a 20   sizeof(lem));. 
d680: 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d 20   lem.errorcnt = 
d690: 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  0;..  /* Initial
d6a0: 69 7a 65 20 74 68 65 20 6d 61 63 68 69 6e 65 20  ize the machine 
d6b0: 2a 2f 0a 20 20 53 74 72 73 61 66 65 5f 69 6e 69  */.  Strsafe_ini
d6c0: 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e  t();.  Symbol_in
d6d0: 69 74 28 29 3b 0a 20 20 53 74 61 74 65 5f 69 6e  it();.  State_in
d6e0: 69 74 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67 76  it();.  lem.argv
d6f0: 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6c  0 = argv[0];.  l
d700: 65 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f 70  em.filename = Op
d710: 74 41 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e 62  tArg(0);.  lem.b
d720: 61 73 69 73 66 6c 61 67 20 3d 20 62 61 73 69 73  asisflag = basis
d730: 66 6c 61 67 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c 69  flag;.  lem.noli
d740: 6e 65 6e 6f 73 66 6c 61 67 20 3d 20 6e 6f 6c 69  nenosflag = noli
d750: 6e 65 6e 6f 73 66 6c 61 67 3b 0a 20 20 53 79 6d  nenosflag;.  Sym
d760: 62 6f 6c 5f 6e 65 77 28 22 24 22 29 3b 0a 20 20  bol_new("$");.  
d770: 6c 65 6d 2e 65 72 72 73 79 6d 20 3d 20 53 79 6d  lem.errsym = Sym
d780: 62 6f 6c 5f 6e 65 77 28 22 65 72 72 6f 72 22 29  bol_new("error")
d790: 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 2d 3e  ;.  lem.errsym->
d7a0: 75 73 65 43 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f  useCnt = 0;..  /
d7b0: 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75  * Parse the inpu
d7c0: 74 20 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72 73  t file */.  Pars
d7d0: 65 28 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20 6c  e(&lem);.  if( l
d7e0: 65 6d 2e 65 72 72 6f 72 63 6e 74 20 29 20 65 78  em.errorcnt ) ex
d7f0: 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 29  it(lem.errorcnt)
d800: 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 72 75 6c  ;.  if( lem.nrul
d810: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  e==0 ){.    fpri
d820: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 6d 70 74  ntf(stderr,"Empt
d830: 79 20 67 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a  y grammar.\n");.
d840: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
d850: 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 61 6e 64  ..  /* Count and
d860: 20 69 6e 64 65 78 20 74 68 65 20 73 79 6d 62 6f   index the symbo
d870: 6c 73 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  ls of the gramma
d880: 72 20 2a 2f 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65  r */.  Symbol_ne
d890: 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a  w("{default}");.
d8a0: 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20    lem.nsymbol = 
d8b0: 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a  Symbol_count();.
d8c0: 20 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20    lem.symbols = 
d8d0: 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29  Symbol_arrayof()
d8e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
d8f0: 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  em.nsymbol; i++)
d900: 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d   lem.symbols[i]-
d910: 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 71 73  >index = i;.  qs
d920: 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c  ort(lem.symbols,
d930: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2c 73 69 7a 65  lem.nsymbol,size
d940: 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
d950: 2a 29 2c 20 53 79 6d 62 6f 6c 63 6d 70 70 29 3b  *), Symbolcmpp);
d960: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
d970: 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20  m.nsymbol; i++) 
d980: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  lem.symbols[i]->
d990: 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 77 68 69  index = i;.  whi
d9a0: 6c 65 28 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b  le( lem.symbols[
d9b0: 69 2d 31 5d 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54  i-1]->type==MULT
d9c0: 49 54 45 52 4d 49 4e 41 4c 20 29 7b 20 69 2d 2d  ITERMINAL ){ i--
d9d0: 3b 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 74  ; }.  assert( st
d9e0: 72 63 6d 70 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73  rcmp(lem.symbols
d9f0: 5b 69 2d 31 5d 2d 3e 6e 61 6d 65 2c 22 7b 64 65  [i-1]->name,"{de
da00: 66 61 75 6c 74 7d 22 29 3d 3d 30 20 29 3b 0a 20  fault}")==0 );. 
da10: 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 69   lem.nsymbol = i
da20: 20 2d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b   - 1;.  for(i=1;
da30: 20 49 53 55 50 50 45 52 28 6c 65 6d 2e 73 79 6d   ISUPPER(lem.sym
da40: 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30 5d  bols[i]->name[0]
da50: 29 3b 20 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e 6e  ); i++);.  lem.n
da60: 74 65 72 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a 20  terminal = i;.. 
da70: 20 2f 2a 20 41 73 73 69 67 6e 20 73 65 71 75 65   /* Assign seque
da80: 6e 74 69 61 6c 20 72 75 6c 65 20 6e 75 6d 62 65  ntial rule numbe
da90: 72 73 2e 20 20 53 74 61 72 74 20 77 69 74 68 20  rs.  Start with 
daa0: 30 2e 20 20 50 75 74 20 72 75 6c 65 73 20 74 68  0.  Put rules th
dab0: 61 74 20 68 61 76 65 20 6e 6f 0a 20 20 2a 2a 20  at have no.  ** 
dac0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 43 2d  reduce action C-
dad0: 63 6f 64 65 20 61 73 73 6f 63 69 61 74 65 64 20  code associated 
dae0: 77 69 74 68 20 74 68 65 6d 20 6c 61 73 74 2c 20  with them last, 
daf0: 73 6f 20 74 68 61 74 20 74 68 65 20 73 77 69 74  so that the swit
db00: 63 68 28 29 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch().  ** statem
db10: 65 6e 74 20 74 68 61 74 20 73 65 6c 65 63 74 73  ent that selects
db20: 20 72 65 64 75 63 74 69 6f 6e 20 61 63 74 69 6f   reduction actio
db30: 6e 73 20 77 69 6c 6c 20 68 61 76 65 20 61 20 73  ns will have a s
db40: 6d 61 6c 6c 65 72 20 6a 75 6d 70 20 74 61 62 6c  maller jump tabl
db50: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
db60: 30 2c 20 72 70 3d 6c 65 6d 2e 72 75 6c 65 3b 20  0, rp=lem.rule; 
db70: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
db80: 7b 0a 20 20 20 20 72 70 2d 3e 69 52 75 6c 65 20  {.    rp->iRule 
db90: 3d 20 72 70 2d 3e 63 6f 64 65 20 3f 20 69 2b 2b  = rp->code ? i++
dba0: 20 3a 20 2d 31 3b 0a 20 20 7d 0a 20 20 66 6f 72   : -1;.  }.  for
dbb0: 28 72 70 3d 6c 65 6d 2e 72 75 6c 65 3b 20 72 70  (rp=lem.rule; rp
dbc0: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
dbd0: 20 20 20 20 69 66 28 20 72 70 2d 3e 69 52 75 6c      if( rp->iRul
dbe0: 65 3c 30 20 29 20 72 70 2d 3e 69 52 75 6c 65 20  e<0 ) rp->iRule 
dbf0: 3d 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6c 65 6d  = i++;.  }.  lem
dc00: 2e 73 74 61 72 74 52 75 6c 65 20 3d 20 6c 65 6d  .startRule = lem
dc10: 2e 72 75 6c 65 3b 0a 20 20 6c 65 6d 2e 72 75 6c  .rule;.  lem.rul
dc20: 65 20 3d 20 52 75 6c 65 5f 73 6f 72 74 28 6c 65  e = Rule_sort(le
dc30: 6d 2e 72 75 6c 65 29 3b 0a 0a 20 20 2f 2a 20 47  m.rule);..  /* G
dc40: 65 6e 65 72 61 74 65 20 61 20 72 65 70 72 69 6e  enerate a reprin
dc50: 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72  t of the grammar
dc60: 2c 20 69 66 20 72 65 71 75 65 73 74 65 64 20 6f  , if requested o
dc70: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
dc80: 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c  ne */.  if( rpfl
dc90: 61 67 20 29 7b 0a 20 20 20 20 52 65 70 72 69 6e  ag ){.    Reprin
dca0: 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65  t(&lem);.  }else
dcb0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
dcc0: 69 7a 65 20 74 68 65 20 73 69 7a 65 20 66 6f 72  ize the size for
dcd0: 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20   all follow and 
dce0: 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20  first sets */.  
dcf0: 20 20 53 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74    SetSize(lem.nt
dd00: 65 72 6d 69 6e 61 6c 2b 31 29 3b 0a 0a 20 20 20  erminal+1);..   
dd10: 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 70 72 65   /* Find the pre
dd20: 63 65 64 65 6e 63 65 20 66 6f 72 20 65 76 65 72  cedence for ever
dd30: 79 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c  y production rul
dd40: 65 20 28 74 68 61 74 20 68 61 73 20 6f 6e 65 29  e (that has one)
dd50: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 52 75 6c 65   */.    FindRule
dd60: 50 72 65 63 65 64 65 6e 63 65 73 28 26 6c 65 6d  Precedences(&lem
dd70: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  );..    /* Compu
dd80: 74 65 20 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f  te the lambda-no
dd90: 6e 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74  nterminals and t
dda0: 68 65 20 66 69 72 73 74 2d 73 65 74 73 20 66 6f  he first-sets fo
ddb0: 72 20 65 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e  r every.    ** n
ddc0: 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20  onterminal */.  
ddd0: 20 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28    FindFirstSets(
dde0: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
ddf0: 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29  ompute all LR(0)
de00: 20 73 74 61 74 65 73 2e 20 20 41 6c 73 6f 20 72   states.  Also r
de10: 65 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74  ecord follow-set
de20: 20 70 72 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20   propagation.   
de30: 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61   ** links so tha
de40: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74  t the follow-set
de50: 20 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64   can be computed
de60: 20 6c 61 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65   later */.    le
de70: 6d 2e 6e 73 74 61 74 65 20 3d 20 30 3b 0a 20 20  m.nstate = 0;.  
de80: 20 20 46 69 6e 64 53 74 61 74 65 73 28 26 6c 65    FindStates(&le
de90: 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74  m);.    lem.sort
dea0: 65 64 20 3d 20 53 74 61 74 65 5f 61 72 72 61 79  ed = State_array
deb0: 6f 66 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69  of();..    /* Ti
dec0: 65 20 75 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20  e up loose ends 
ded0: 6f 6e 20 74 68 65 20 70 72 6f 70 61 67 61 74 69  on the propagati
dee0: 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20  on links */.    
def0: 46 69 6e 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b  FindLinks(&lem);
df00: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
df10: 20 74 68 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20   the follow set 
df20: 6f 66 20 65 76 65 72 79 20 72 65 64 75 63 69 62  of every reducib
df30: 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  le configuration
df40: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c   */.    FindFoll
df50: 6f 77 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20  owSets(&lem);.. 
df60: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
df70: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20  e action tables 
df80: 2a 2f 0a 20 20 20 20 46 69 6e 64 41 63 74 69 6f  */.    FindActio
df90: 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  ns(&lem);..    /
dfa0: 2a 20 43 6f 6d 70 72 65 73 73 20 74 68 65 20 61  * Compress the a
dfb0: 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a  ction tables */.
dfc0: 20 20 20 20 69 66 28 20 63 6f 6d 70 72 65 73 73      if( compress
dfd0: 3d 3d 30 20 29 20 43 6f 6d 70 72 65 73 73 54 61  ==0 ) CompressTa
dfe0: 62 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  bles(&lem);..   
dff0: 20 2f 2a 20 52 65 6f 72 64 65 72 20 61 6e 64 20   /* Reorder and 
e000: 72 65 6e 75 6d 62 65 72 20 74 68 65 20 73 74 61  renumber the sta
e010: 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61 74  tes so that stat
e020: 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63 68  es with fewer ch
e030: 6f 69 63 65 73 0a 20 20 20 20 2a 2a 20 6f 63 63  oices.    ** occ
e040: 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ur at the end.  
e050: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
e060: 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 68 65 6c  ization that hel
e070: 70 73 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20  ps make the.    
e080: 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 70 61 72  ** generated par
e090: 73 65 72 20 74 61 62 6c 65 73 20 73 6d 61 6c 6c  ser tables small
e0a0: 65 72 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  er. */.    if( n
e0b0: 6f 52 65 73 6f 72 74 3d 3d 30 20 29 20 52 65 73  oResort==0 ) Res
e0c0: 6f 72 74 53 74 61 74 65 73 28 26 6c 65 6d 29 3b  ortStates(&lem);
e0d0: 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
e0e0: 65 20 61 20 72 65 70 6f 72 74 20 6f 66 20 74 68  e a report of th
e0f0: 65 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  e parser generat
e100: 65 64 2e 20 20 28 74 68 65 20 22 79 2e 6f 75 74  ed.  (the "y.out
e110: 70 75 74 22 20 66 69 6c 65 29 20 2a 2f 0a 20 20  put" file) */.  
e120: 20 20 69 66 28 20 21 71 75 69 65 74 20 29 20 52    if( !quiet ) R
e130: 65 70 6f 72 74 4f 75 74 70 75 74 28 26 6c 65 6d  eportOutput(&lem
e140: 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  );..    /* Gener
e150: 61 74 65 20 74 68 65 20 73 6f 75 72 63 65 20 63  ate the source c
e160: 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ode for the pars
e170: 65 72 20 2a 2f 0a 20 20 20 20 52 65 70 6f 72 74  er */.    Report
e180: 54 61 62 6c 65 28 26 6c 65 6d 2c 20 6d 68 66 6c  Table(&lem, mhfl
e190: 61 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  ag);..    /* Pro
e1a0: 64 75 63 65 20 61 20 68 65 61 64 65 72 20 66 69  duce a header fi
e1b0: 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  le for use by th
e1c0: 65 20 73 63 61 6e 6e 65 72 2e 20 20 28 54 68 69  e scanner.  (Thi
e1d0: 73 20 73 74 65 70 20 69 73 0a 20 20 20 20 2a 2a  s step is.    **
e1e0: 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 20   omitted if the 
e1f0: 22 2d 6d 22 20 6f 70 74 69 6f 6e 20 69 73 20 75  "-m" option is u
e200: 73 65 64 20 62 65 63 61 75 73 65 20 6d 61 6b 65  sed because make
e210: 68 65 61 64 65 72 73 20 77 69 6c 6c 0a 20 20 20  headers will.   
e220: 20 2a 2a 20 67 65 6e 65 72 61 74 65 20 74 68 65   ** generate the
e230: 20 66 69 6c 65 20 66 6f 72 20 75 73 2e 29 20 2a   file for us.) *
e240: 2f 0a 20 20 20 20 69 66 28 20 21 6d 68 66 6c 61  /.    if( !mhfla
e250: 67 20 29 20 52 65 70 6f 72 74 48 65 61 64 65 72  g ) ReportHeader
e260: 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66  (&lem);.  }.  if
e270: 28 20 73 74 61 74 69 73 74 69 63 73 20 29 7b 0a  ( statistics ){.
e280: 20 20 20 20 70 72 69 6e 74 66 28 22 50 61 72 73      printf("Pars
e290: 65 72 20 73 74 61 74 69 73 74 69 63 73 3a 5c 6e  er statistics:\n
e2a0: 22 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69  ");.    stats_li
e2b0: 6e 65 28 22 74 65 72 6d 69 6e 61 6c 20 73 79 6d  ne("terminal sym
e2c0: 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e 74 65 72 6d  bols", lem.nterm
e2d0: 69 6e 61 6c 29 3b 0a 20 20 20 20 73 74 61 74 73  inal);.    stats
e2e0: 5f 6c 69 6e 65 28 22 6e 6f 6e 2d 74 65 72 6d 69  _line("non-termi
e2f0: 6e 61 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c 65  nal symbols", le
e300: 6d 2e 6e 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d 2e  m.nsymbol - lem.
e310: 6e 74 65 72 6d 69 6e 61 6c 29 3b 0a 20 20 20 20  nterminal);.    
e320: 73 74 61 74 73 5f 6c 69 6e 65 28 22 74 6f 74 61  stats_line("tota
e330: 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e  l symbols", lem.
e340: 6e 73 79 6d 62 6f 6c 29 3b 0a 20 20 20 20 73 74  nsymbol);.    st
e350: 61 74 73 5f 6c 69 6e 65 28 22 72 75 6c 65 73 22  ats_line("rules"
e360: 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20  , lem.nrule);.  
e370: 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 73 74    stats_line("st
e380: 61 74 65 73 22 2c 20 6c 65 6d 2e 6e 78 73 74 61  ates", lem.nxsta
e390: 74 65 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c  te);.    stats_l
e3a0: 69 6e 65 28 22 63 6f 6e 66 6c 69 63 74 73 22 2c  ine("conflicts",
e3b0: 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b   lem.nconflict);
e3c0: 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28  .    stats_line(
e3d0: 22 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 65 6e  "action table en
e3e0: 74 72 69 65 73 22 2c 20 6c 65 6d 2e 6e 61 63 74  tries", lem.nact
e3f0: 69 6f 6e 74 61 62 29 3b 0a 20 20 20 20 73 74 61  iontab);.    sta
e400: 74 73 5f 6c 69 6e 65 28 22 6c 6f 6f 6b 61 68 65  ts_line("lookahe
e410: 61 64 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  ad table entries
e420: 22 2c 20 6c 65 6d 2e 6e 6c 6f 6f 6b 61 68 65 61  ", lem.nlookahea
e430: 64 74 61 62 29 3b 0a 20 20 20 20 73 74 61 74 73  dtab);.    stats
e440: 5f 6c 69 6e 65 28 22 74 6f 74 61 6c 20 74 61 62  _line("total tab
e450: 6c 65 20 73 69 7a 65 20 28 62 79 74 65 73 29 22  le size (bytes)"
e460: 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a 65 29  , lem.tablesize)
e470: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 2e  ;.  }.  if( lem.
e480: 6e 63 6f 6e 66 6c 69 63 74 20 3e 20 30 20 29 7b  nconflict > 0 ){
e490: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
e4a0: 65 72 72 2c 22 25 64 20 70 61 72 73 69 6e 67 20  err,"%d parsing 
e4b0: 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c 65  conflicts.\n",le
e4c0: 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20  m.nconflict);.  
e4d0: 7d 0a 0a 20 20 2f 2a 20 72 65 74 75 72 6e 20 30  }..  /* return 0
e4e0: 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 31 20 6f   on success, 1 o
e4f0: 6e 20 66 61 69 6c 75 72 65 2e 20 2a 2f 0a 20 20  n failure. */.  
e500: 65 78 69 74 63 6f 64 65 20 3d 20 28 28 6c 65 6d  exitcode = ((lem
e510: 2e 65 72 72 6f 72 63 6e 74 20 3e 20 30 29 20 7c  .errorcnt > 0) |
e520: 7c 20 28 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74  | (lem.nconflict
e530: 20 3e 20 30 29 29 20 3f 20 31 20 3a 20 30 3b 0a   > 0)) ? 1 : 0;.
e540: 20 20 65 78 69 74 28 65 78 69 74 63 6f 64 65 29    exit(exitcode)
e550: 3b 0a 20 20 72 65 74 75 72 6e 20 28 65 78 69 74  ;.  return (exit
e560: 63 6f 64 65 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  code);.}./******
e570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
e580: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6d 73  rom the file "ms
e590: 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ort.c" *********
e5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5b0: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20  ******/./*.** A 
e5c0: 67 65 6e 65 72 69 63 20 6d 65 72 67 65 2d 73 6f  generic merge-so
e5d0: 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a  rt program..**.*
e5e0: 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c 65 74 20  * USAGE:.** Let 
e5f0: 22 70 74 72 22 20 62 65 20 61 20 70 6f 69 6e 74  "ptr" be a point
e600: 65 72 20 74 6f 20 73 6f 6d 65 20 73 74 72 75 63  er to some struc
e610: 74 75 72 65 20 77 68 69 63 68 20 69 73 20 61 74  ture which is at
e620: 20 74 68 65 20 68 65 61 64 20 6f 66 0a 2a 2a 20   the head of.** 
e630: 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65  a null-terminate
e640: 64 20 6c 69 73 74 2e 20 20 54 68 65 6e 20 74 6f  d list.  Then to
e650: 20 73 6f 72 74 20 74 68 65 20 6c 69 73 74 20 63   sort the list c
e660: 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  all:.**.**     p
e670: 74 72 20 3d 20 6d 73 6f 72 74 28 70 74 72 2c 26  tr = msort(ptr,&
e680: 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63 6d 70 66  (ptr->next),cmpf
e690: 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  nc);.**.** In th
e6a0: 65 20 61 62 6f 76 65 2c 20 22 63 6d 70 66 6e 63  e above, "cmpfnc
e6b0: 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  " is a pointer t
e6c0: 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 68 69  o a function whi
e6d0: 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a 2a 20 74  ch compares.** t
e6e0: 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  wo instances of 
e6f0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  the structure an
e700: 64 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74  d returns an int
e710: 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a 2a 20 73  eger, as in.** s
e720: 74 72 63 6d 70 2e 20 20 54 68 65 20 73 65 63 6f  trcmp.  The seco
e730: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
e740: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
e750: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
e760: 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  * second element
e770: 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   of the linked l
e780: 69 73 74 2e 20 20 54 68 69 73 20 61 64 64 72 65  ist.  This addre
e790: 73 73 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  ss is used to co
e7a0: 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 6f 66 66  mpute.** the off
e7b0: 73 65 74 20 74 6f 20 74 68 65 20 22 6e 65 78 74  set to the "next
e7c0: 22 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74  " field within t
e7d0: 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  he structure.  T
e7e0: 68 65 20 6f 66 66 73 65 74 20 74 6f 0a 2a 2a 20  he offset to.** 
e7f0: 74 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64  the "next" field
e800: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
e810: 74 20 66 6f 72 20 61 6c 6c 20 73 74 72 75 63 74  t for all struct
e820: 75 72 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ures in the list
e830: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e 63  ..**.** The func
e840: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 6e  tion returns a n
e850: 65 77 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68  ew pointer which
e860: 20 69 73 20 74 68 65 20 68 65 61 64 20 6f 66 20   is the head of 
e870: 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61 66 74 65  the list.** afte
e880: 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r sorting..**.**
e890: 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a 20 4d   ALGORITHM:.** M
e8a0: 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f  erge-sort..*/../
e8b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
e8c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  inter to the nex
e8d0: 74 20 73 74 72 75 63 74 75 72 65 20 69 6e 20 74  t structure in t
e8e0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a  he linked list..
e8f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45 58 54 28  */.#define NEXT(
e900: 41 29 20 28 2a 28 63 68 61 72 2a 2a 29 28 28 28  A) (*(char**)(((
e910: 63 68 61 72 2a 29 41 29 2b 6f 66 66 73 65 74 29  char*)A)+offset)
e920: 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a  )../*.** Inputs:
e930: 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20 20 20 41  .**   a:       A
e940: 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65   sorted, null-te
e950: 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20  rminated linked 
e960: 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e  list.  (May be n
e970: 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a 20 20 20  ull)..**   b:   
e980: 20 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75      A sorted, nu
e990: 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69  ll-terminated li
e9a0: 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79  nked list.  (May
e9b0: 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20   be null)..**   
e9c0: 63 6d 70 3a 20 20 20 20 20 41 20 70 6f 69 6e 74  cmp:     A point
e9d0: 65 72 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72  er to the compar
e9e0: 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ison function..*
e9f0: 2a 20 20 20 6f 66 66 73 65 74 3a 20 20 4f 66 66  *   offset:  Off
ea00: 73 65 74 20 69 6e 20 74 68 65 20 73 74 72 75 63  set in the struc
ea10: 74 75 72 65 20 74 6f 20 74 68 65 20 22 6e 65 78  ture to the "nex
ea20: 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  t" field..**.** 
ea30: 52 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a  Return Value:.**
ea40: 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20     A pointer to 
ea50: 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f  the head of a so
ea60: 72 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69  rted list contai
ea70: 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74  ning the element
ea80: 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74 68 20 61  s.**   of both a
ea90: 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69   and b..**.** Si
eaa0: 64 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20  de effects:.**  
eab0: 20 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e   The "next" poin
eac0: 74 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74  ters for element
ead0: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 73 20 61  s in the lists a
eae0: 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a 20 20 20   and b are.**   
eaf0: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74  changed..*/.stat
eb00: 69 63 20 63 68 61 72 20 2a 6d 65 72 67 65 28 0a  ic char *merge(.
eb10: 20 20 63 68 61 72 20 2a 61 2c 0a 20 20 63 68 61    char *a,.  cha
eb20: 72 20 2a 62 2c 0a 20 20 69 6e 74 20 28 2a 63 6d  r *b,.  int (*cm
eb30: 70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  p)(const char*,c
eb40: 6f 6e 73 74 20 63 68 61 72 2a 29 2c 0a 20 20 69  onst char*),.  i
eb50: 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 63  nt offset.){.  c
eb60: 68 61 72 20 2a 70 74 72 2c 20 2a 68 65 61 64 3b  har *ptr, *head;
eb70: 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a  ..  if( a==0 ){.
eb80: 20 20 20 20 68 65 61 64 20 3d 20 62 3b 0a 20 20      head = b;.  
eb90: 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d 30 20 29  }else if( b==0 )
eba0: 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 61 3b 0a  {.    head = a;.
ebb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
ebc0: 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c 3d 30 20   (*cmp)(a,b)<=0 
ebd0: 29 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 61  ){.      ptr = a
ebe0: 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54  ;.      a = NEXT
ebf0: 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (a);.    }else{.
ec00: 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20        ptr = b;. 
ec10: 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29       b = NEXT(b)
ec20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 65 61 64  ;.    }.    head
ec30: 20 3d 20 70 74 72 3b 0a 20 20 20 20 77 68 69 6c   = ptr;.    whil
ec40: 65 28 20 61 20 26 26 20 62 20 29 7b 0a 20 20 20  e( a && b ){.   
ec50: 20 20 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c     if( (*cmp)(a,
ec60: 62 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)<=0 ){.       
ec70: 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b 0a   NEXT(ptr) = a;.
ec80: 20 20 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b          ptr = a;
ec90: 0a 20 20 20 20 20 20 20 20 61 20 3d 20 4e 45 58  .        a = NEX
eca0: 54 28 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  T(a);.      }els
ecb0: 65 7b 0a 20 20 20 20 20 20 20 20 4e 45 58 54 28  e{.        NEXT(
ecc0: 70 74 72 29 20 3d 20 62 3b 0a 20 20 20 20 20 20  ptr) = b;.      
ecd0: 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20 20    ptr = b;.     
ece0: 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a     b = NEXT(b);.
ecf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ed00: 20 20 69 66 28 20 61 20 29 20 4e 45 58 54 28 70    if( a ) NEXT(p
ed10: 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 65 6c 73  tr) = a;.    els
ed20: 65 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d  e    NEXT(ptr) =
ed30: 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   b;.  }.  return
ed40: 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   head;.}../*.** 
ed50: 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c 69 73  Inputs:.**   lis
ed60: 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20  t:      Pointer 
ed70: 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69 6e 6b  to a singly-link
ed80: 65 64 20 6c 69 73 74 20 6f 66 20 73 74 72 75 63  ed list of struc
ed90: 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65 78 74  tures..**   next
eda0: 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74  :      Pointer t
edb0: 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  o pointer to the
edc0: 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20   second element 
edd0: 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 20  of the list..** 
ede0: 20 20 63 6d 70 3a 20 20 20 20 20 20 20 41 20 63    cmp:       A c
edf0: 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
ee00: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  on..**.** Return
ee10: 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70   Value:.**   A p
ee20: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
ee30: 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20 6c  ad of a sorted l
ee40: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ist containing t
ee50: 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20  he elements.**  
ee60: 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20 6c 69   orginally in li
ee70: 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65  st..**.** Side e
ee80: 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65  ffects:.**   The
ee90: 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 73   "next" pointers
eea0: 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e   for elements in
eeb0: 20 6c 69 73 74 20 61 72 65 20 63 68 61 6e 67 65   list are change
eec0: 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 49  d..*/.#define LI
eed0: 53 54 53 49 5a 45 20 33 30 0a 73 74 61 74 69 63  STSIZE 30.static
eee0: 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 0a 20 20   char *msort(.  
eef0: 63 68 61 72 20 2a 6c 69 73 74 2c 0a 20 20 63 68  char *list,.  ch
ef00: 61 72 20 2a 2a 6e 65 78 74 2c 0a 20 20 69 6e 74  ar **next,.  int
ef10: 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68   (*cmp)(const ch
ef20: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
ef30: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  .){.  unsigned l
ef40: 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20 20 63 68  ong offset;.  ch
ef50: 61 72 20 2a 65 70 3b 0a 20 20 63 68 61 72 20 2a  ar *ep;.  char *
ef60: 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a 20  set[LISTSIZE];. 
ef70: 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66 73 65 74   int i;.  offset
ef80: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   = (unsigned lon
ef90: 67 29 28 28 63 68 61 72 2a 29 6e 65 78 74 20 2d  g)((char*)next -
efa0: 20 28 63 68 61 72 2a 29 6c 69 73 74 29 3b 0a 20   (char*)list);. 
efb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54   for(i=0; i<LIST
efc0: 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65 74 5b 69  SIZE; i++) set[i
efd0: 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  ] = 0;.  while( 
efe0: 6c 69 73 74 20 29 7b 0a 20 20 20 20 65 70 20 3d  list ){.    ep =
eff0: 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69 73 74 20   list;.    list 
f000: 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b 0a 20 20  = NEXT(list);.  
f010: 20 20 4e 45 58 54 28 65 70 29 20 3d 20 30 3b 0a    NEXT(ep) = 0;.
f020: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c      for(i=0; i<L
f030: 49 53 54 53 49 5a 45 2d 31 20 26 26 20 73 65 74  ISTSIZE-1 && set
f040: 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  [i]!=0; i++){.  
f050: 20 20 20 20 65 70 20 3d 20 6d 65 72 67 65 28 65      ep = merge(e
f060: 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66  p,set[i],cmp,off
f070: 73 65 74 29 3b 0a 20 20 20 20 20 20 73 65 74 5b  set);.      set[
f080: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
f090: 20 20 73 65 74 5b 69 5d 20 3d 20 65 70 3b 0a 20    set[i] = ep;. 
f0a0: 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a 20 20 66   }.  ep = 0;.  f
f0b0: 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49  or(i=0; i<LISTSI
f0c0: 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20 73 65 74  ZE; i++) if( set
f0d0: 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65 72 67 65  [i] ) ep = merge
f0e0: 28 73 65 74 5b 69 5d 2c 65 70 2c 63 6d 70 2c 6f  (set[i],ep,cmp,o
f0f0: 66 66 73 65 74 29 3b 0a 20 20 72 65 74 75 72 6e  ffset);.  return
f100: 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   ep;.}./********
f110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f120: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
f130: 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a  option.c" ******
f140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f150: 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ****/.static cha
f160: 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61 74 69 63  r **argv;.static
f170: 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e   struct s_option
f180: 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63 20 46 49  s *op;.static FI
f190: 4c 45 20 2a 65 72 72 73 74 72 65 61 6d 3b 0a 0a  LE *errstream;..
f1a0: 23 64 65 66 69 6e 65 20 49 53 4f 50 54 28 58 29  #define ISOPT(X)
f1b0: 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28   ((X)[0]=='-'||(
f1c0: 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63  X)[0]=='+'||strc
f1d0: 68 72 28 28 58 29 2c 27 3d 27 29 21 3d 30 29 0a  hr((X),'=')!=0).
f1e0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
f1f0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 69   command line wi
f200: 74 68 20 61 20 63 61 72 72 6f 74 20 70 6f 69 6e  th a carrot poin
f210: 74 69 6e 67 20 74 6f 20 74 68 65 20 6b 2d 74 68  ting to the k-th
f220: 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66   character.** of
f230: 20 74 68 65 20 6e 2d 74 68 20 66 69 65 6c 64 2e   the n-th field.
f240: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f250: 65 72 72 6c 69 6e 65 28 69 6e 74 20 6e 2c 20 69  errline(int n, i
f260: 6e 74 20 6b 2c 20 46 49 4c 45 20 2a 65 72 72 29  nt k, FILE *err)
f270: 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e 74 2c 20  .{.  int spcnt, 
f280: 69 3b 0a 20 20 69 66 28 20 61 72 67 76 5b 30 5d  i;.  if( argv[0]
f290: 20 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22   ) fprintf(err,"
f2a0: 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20 20  %s",argv[0]);.  
f2b0: 73 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e 53 74 72  spcnt = lemonStr
f2c0: 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20 31  len(argv[0]) + 1
f2d0: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e  ;.  for(i=1; i<n
f2e0: 20 26 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b   && argv[i]; i++
f2f0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65  ){.    fprintf(e
f300: 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d  rr," %s",argv[i]
f310: 29 3b 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d 20  );.    spcnt += 
f320: 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76  lemonStrlen(argv
f330: 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20 73 70  [i])+1;.  }.  sp
f340: 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28  cnt += k;.  for(
f350: 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 20  ; argv[i]; i++) 
f360: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73  fprintf(err," %s
f370: 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 69 66  ",argv[i]);.  if
f380: 28 20 73 70 63 6e 74 3c 32 30 20 29 7b 0a 20 20  ( spcnt<20 ){.  
f390: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c    fprintf(err,"\
f3a0: 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c  n%*s^-- here\n",
f3b0: 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20 7d 65 6c  spcnt,"");.  }el
f3c0: 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
f3d0: 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72 65 20 2d  err,"\n%*shere -
f3e0: 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c 22 22  -^\n",spcnt-7,""
f3f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
f400: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
f410: 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 6e 6f 6e   of the N-th non
f420: 2d 73 77 69 74 63 68 20 61 72 67 75 6d 65 6e 74  -switch argument
f430: 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20  .  Return -1.** 
f440: 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72  if N is out of r
f450: 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ange..*/.static 
f460: 69 6e 74 20 61 72 67 69 6e 64 65 78 28 69 6e 74  int argindex(int
f470: 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   n).{.  int i;. 
f480: 20 69 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20   int dashdash = 
f490: 30 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30  0;.  if( argv!=0
f4a0: 20 26 26 20 2a 61 72 67 76 21 3d 30 20 29 7b 0a   && *argv!=0 ){.
f4b0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67      for(i=1; arg
f4c0: 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  v[i]; i++){.    
f4d0: 20 20 69 66 28 20 64 61 73 68 64 61 73 68 20 7c    if( dashdash |
f4e0: 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d  | !ISOPT(argv[i]
f4f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
f500: 20 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69   n==0 ) return i
f510: 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20  ;.        n--;. 
f520: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f530: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c   strcmp(argv[i],
f540: 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64  "--")==0 ) dashd
f550: 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ash = 1;.    }. 
f560: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
f570: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 65  }..static char e
f580: 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64  msg[] = "Command
f590: 20 6c 69 6e 65 20 73 79 6e 74 61 78 20 65 72 72   line syntax err
f5a0: 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72  or: ";../*.** Pr
f5b0: 6f 63 65 73 73 20 61 20 66 6c 61 67 20 63 6f 6d  ocess a flag com
f5c0: 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65  mand line argume
f5d0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
f5e0: 74 20 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 6e  t handleflags(in
f5f0: 74 20 69 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a  t i, FILE *err).
f600: 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e 74  {.  int v;.  int
f610: 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 69   errcnt = 0;.  i
f620: 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  nt j;.  for(j=0;
f630: 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b   op[j].label; j+
f640: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e  +){.    if( strn
f650: 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b 31 5d 2c  cmp(&argv[i][1],
f660: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c 65 6d 6f  op[j].label,lemo
f670: 6e 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d 2e 6c 61  nStrlen(op[j].la
f680: 62 65 6c 29 29 3d 3d 30 20 29 20 62 72 65 61 6b  bel))==0 ) break
f690: 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61 72 67 76  ;.  }.  v = argv
f6a0: 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31 20  [i][0]=='-' ? 1 
f6b0: 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d  : 0;.  if( op[j]
f6c0: 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20  .label==0 ){.   
f6d0: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
f6e0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
f6f0: 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f  sundefined optio
f700: 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20  n.\n",emsg);.   
f710: 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65     errline(i,1,e
f720: 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  rr);.    }.    e
f730: 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rrcnt++;.  }else
f740: 20 69 66 28 20 6f 70 5b 6a 5d 2e 61 72 67 3d 3d   if( op[j].arg==
f750: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f  0 ){.    /* Igno
f760: 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 2a  re this option *
f770: 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  /.  }else if( op
f780: 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c  [j].type==OPT_FL
f790: 41 47 20 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74  AG ){.    *((int
f7a0: 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76  *)op[j].arg) = v
f7b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
f7c0: 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46  [j].type==OPT_FF
f7d0: 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f  LAG ){.    (*(vo
f7e0: 69 64 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b 6a  id(*)(int))(op[j
f7f0: 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20 20 7d 65  ].arg))(v);.  }e
f800: 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79  lse if( op[j].ty
f810: 70 65 3d 3d 4f 50 54 5f 46 53 54 52 20 29 7b 0a  pe==OPT_FSTR ){.
f820: 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 63      (*(void(*)(c
f830: 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72  har *))(op[j].ar
f840: 67 29 29 28 26 61 72 67 76 5b 69 5d 5b 32 5d 29  g))(&argv[i][2])
f850: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
f860: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
f870: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6d  fprintf(err,"%sm
f880: 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20  issing argument 
f890: 6f 6e 20 73 77 69 74 63 68 2e 5c 6e 22 2c 65 6d  on switch.\n",em
f8a0: 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69  sg);.      errli
f8b0: 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20  ne(i,1,err);.   
f8c0: 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b   }.    errcnt++;
f8d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72  .  }.  return er
f8e0: 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rcnt;.}../*.** P
f8f0: 72 6f 63 65 73 73 20 61 20 63 6f 6d 6d 61 6e 64  rocess a command
f900: 20 6c 69 6e 65 20 73 77 69 74 63 68 20 77 68 69   line switch whi
f910: 63 68 20 68 61 73 20 61 6e 20 61 72 67 75 6d 65  ch has an argume
f920: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
f930: 74 20 68 61 6e 64 6c 65 73 77 69 74 63 68 28 69  t handleswitch(i
f940: 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72 72 29  nt i, FILE *err)
f950: 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d 20 30 3b  .{.  int lv = 0;
f960: 0a 20 20 64 6f 75 62 6c 65 20 64 76 20 3d 20 30  .  double dv = 0
f970: 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73 76 20 3d  .0;.  char *sv =
f980: 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63 68 61 72   0, *end;.  char
f990: 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   *cp;.  int j;. 
f9a0: 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b   int errcnt = 0;
f9b0: 0a 20 20 63 70 20 3d 20 73 74 72 63 68 72 28 61  .  cp = strchr(a
f9c0: 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20 20 61  rgv[i],'=');.  a
f9d0: 73 73 65 72 74 28 20 63 70 21 3d 30 20 29 3b 0a  ssert( cp!=0 );.
f9e0: 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 66 6f 72    *cp = 0;.  for
f9f0: 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65  (j=0; op[j].labe
fa00: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; j++){.    if(
fa10: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c   strcmp(argv[i],
fa20: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20  op[j].label)==0 
fa30: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a  ) break;.  }.  *
fa40: 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69 66 28 20  cp = '=';.  if( 
fa50: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29  op[j].label==0 )
fa60: 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20 29 7b  {.    if( err ){
fa70: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65  .      fprintf(e
fa80: 72 72 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20  rr,"%sundefined 
fa90: 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29  option.\n",emsg)
faa0: 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28  ;.      errline(
fab0: 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a  i,0,err);.    }.
fac0: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
fad0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70 2b 2b 3b  }else{.    cp++;
fae0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b  .    switch( op[
faf0: 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20  j].type ){.     
fb00: 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a   case OPT_FLAG:.
fb10: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
fb20: 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 69 66  FLAG:.        if
fb30: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20  ( err ){.       
fb40: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
fb50: 25 73 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65  %soption require
fb60: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 5c 6e  s an argument.\n
fb70: 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  ",emsg);.       
fb80: 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65     errline(i,0,e
fb90: 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rr);.        }. 
fba0: 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b         errcnt++;
fbb0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
fbc0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44        case OPT_D
fbd0: 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  BL:.      case O
fbe0: 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20  PT_FDBL:.       
fbf0: 20 64 76 20 3d 20 73 74 72 74 6f 64 28 63 70 2c   dv = strtod(cp,
fc00: 26 65 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 69  &end);.        i
fc10: 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20  f( *end ){.     
fc20: 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a       if( err ){.
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
fc40: 6e 74 66 28 65 72 72 2c 0a 20 20 20 20 20 20 20  ntf(err,.       
fc50: 20 20 20 20 20 20 20 20 22 25 73 69 6c 6c 65 67          "%silleg
fc60: 61 6c 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  al character in 
fc70: 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 61  floating-point a
fc80: 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67  rgument.\n",emsg
fc90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  );.            e
fca0: 72 72 6c 69 6e 65 28 69 2c 28 69 6e 74 29 28 28  rrline(i,(int)((
fcb0: 63 68 61 72 2a 29 65 6e 64 2d 28 63 68 61 72 2a  char*)end-(char*
fcc0: 29 61 72 67 76 5b 69 5d 29 2c 65 72 72 29 3b 0a  )argv[i]),err);.
fcd0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
fce0: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
fcf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fd00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
fd10: 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20  ase OPT_INT:.   
fd20: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54     case OPT_FINT
fd30: 3a 0a 20 20 20 20 20 20 20 20 6c 76 20 3d 20 73  :.        lv = s
fd40: 74 72 74 6f 6c 28 63 70 2c 26 65 6e 64 2c 30 29  trtol(cp,&end,0)
fd50: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 65  ;.        if( *e
fd60: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
fd70: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
fd80: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65         fprintf(e
fd90: 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68  rr,"%sillegal ch
fda0: 61 72 61 63 74 65 72 20 69 6e 20 69 6e 74 65 67  aracter in integ
fdb0: 65 72 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c  er argument.\n",
fdc0: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  emsg);.         
fdd0: 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 69 6e     errline(i,(in
fde0: 74 29 28 28 63 68 61 72 2a 29 65 6e 64 2d 28 63  t)((char*)end-(c
fdf0: 68 61 72 2a 29 61 72 67 76 5b 69 5d 29 2c 65 72  har*)argv[i]),er
fe00: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
fe10: 20 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74            errcnt
fe20: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
fe30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fe40: 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a     case OPT_STR:
fe50: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
fe60: 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 73 76  FSTR:.        sv
fe70: 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 20 20 62   = cp;.        b
fe80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
fe90: 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79  switch( op[j].ty
fea0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
feb0: 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20   OPT_FLAG:.     
fec0: 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a   case OPT_FFLAG:
fed0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
fee0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44        case OPT_D
fef0: 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28 64 6f  BL:.        *(do
ff00: 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67  uble*)(op[j].arg
ff10: 29 20 3d 20 64 76 3b 0a 20 20 20 20 20 20 20 20  ) = dv;.        
ff20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ff30: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
ff40: 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 64      (*(void(*)(d
ff50: 6f 75 62 6c 65 29 29 28 6f 70 5b 6a 5d 2e 61 72  ouble))(op[j].ar
ff60: 67 29 29 28 64 76 29 3b 0a 20 20 20 20 20 20 20  g))(dv);.       
ff70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ff80: 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20  se OPT_INT:.    
ff90: 20 20 20 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a      *(int*)(op[j
ffa0: 5d 2e 61 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20  ].arg) = lv;.   
ffb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ffc0: 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a    case OPT_FINT:
ffd0: 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64  .        (*(void
ffe0: 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e  (*)(int))(op[j].
fff0: 61 72 67 29 29 28 28 69 6e 74 29 6c 76 29 3b 0a  arg))((int)lv);.
10000 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10010 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54       case OPT_ST
10020 52 3a 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61  R:.        *(cha
10030 72 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20  r**)(op[j].arg) 
10040 3d 20 73 76 3b 0a 20 20 20 20 20 20 20 20 62 72  = sv;.        br
10050 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
10060 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20  OPT_FSTR:.      
10070 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 63 68 61    (*(void(*)(cha
10080 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  r *))(op[j].arg)
10090 29 28 73 76 29 3b 0a 20 20 20 20 20 20 20 20 62  )(sv);.        b
100a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
100b0 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b    return errcnt;
100c0 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69 74 28  .}..int OptInit(
100d0 63 68 61 72 20 2a 2a 61 2c 20 73 74 72 75 63 74  char **a, struct
100e0 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 2c 20 46   s_options *o, F
100f0 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e  ILE *err).{.  in
10100 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20  t errcnt = 0;.  
10110 61 72 67 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d  argv = a;.  op =
10120 20 6f 3b 0a 20 20 65 72 72 73 74 72 65 61 6d 20   o;.  errstream 
10130 3d 20 65 72 72 3b 0a 20 20 69 66 28 20 61 72 67  = err;.  if( arg
10140 76 20 26 26 20 2a 61 72 67 76 20 26 26 20 6f 70  v && *argv && op
10150 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
10160 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76     for(i=1; argv
10170 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
10180 20 69 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d   if( argv[i][0]=
10190 3d 27 2b 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b  ='+' || argv[i][
101a0 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
101b0 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e     errcnt += han
101c0 64 6c 65 66 6c 61 67 73 28 69 2c 65 72 72 29 3b  dleflags(i,err);
101d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
101e0 20 73 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c   strchr(argv[i],
101f0 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '=') ){.        
10200 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65  errcnt += handle
10210 73 77 69 74 63 68 28 69 2c 65 72 72 29 3b 0a 20  switch(i,err);. 
10220 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10230 0a 20 20 69 66 28 20 65 72 72 63 6e 74 3e 30 20  .  if( errcnt>0 
10240 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65  ){.    fprintf(e
10250 72 72 2c 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e  rr,"Valid comman
10260 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66  d line options f
10270 6f 72 20 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e  or \"%s\" are:\n
10280 22 2c 2a 61 29 3b 0a 20 20 20 20 4f 70 74 50 72  ",*a);.    OptPr
10290 69 6e 74 28 29 3b 0a 20 20 20 20 65 78 69 74 28  int();.    exit(
102a0 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
102b0 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41   0;.}..int OptNA
102c0 72 67 73 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  rgs(void){.  int
102d0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
102e0 64 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20  dashdash = 0;.  
102f0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67  int i;.  if( arg
10300 76 21 3d 30 20 26 26 20 61 72 67 76 5b 30 5d 21  v!=0 && argv[0]!
10310 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
10320 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29  1; argv[i]; i++)
10330 7b 0a 20 20 20 20 20 20 69 66 28 20 64 61 73 68  {.      if( dash
10340 64 61 73 68 20 7c 7c 20 21 49 53 4f 50 54 28 61  dash || !ISOPT(a
10350 72 67 76 5b 69 5d 29 20 29 20 63 6e 74 2b 2b 3b  rgv[i]) ) cnt++;
10360 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
10370 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d  p(argv[i],"--")=
10380 3d 30 20 29 20 64 61 73 68 64 61 73 68 20 3d 20  =0 ) dashdash = 
10390 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
103a0 65 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 63 68  eturn cnt;.}..ch
103b0 61 72 20 2a 4f 70 74 41 72 67 28 69 6e 74 20 6e  ar *OptArg(int n
103c0 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ).{.  int i;.  i
103d0 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a   = argindex(n);.
103e0 20 20 72 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20    return i>=0 ? 
103f0 61 72 67 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a  argv[i] : 0;.}..
10400 76 6f 69 64 20 4f 70 74 45 72 72 28 69 6e 74 20  void OptErr(int 
10410 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  n).{.  int i;.  
10420 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b  i = argindex(n);
10430 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 65 72  .  if( i>=0 ) er
10440 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 73 74 72  rline(i,0,errstr
10450 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70  eam);.}..void Op
10460 74 50 72 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20  tPrint(void){.  
10470 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 61 78  int i;.  int max
10480 2c 20 6c 65 6e 3b 0a 20 20 6d 61 78 20 3d 20 30  , len;.  max = 0
10490 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b  ;.  for(i=0; op[
104a0 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a  i].label; i++){.
104b0 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53      len = lemonS
104c0 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65  trlen(op[i].labe
104d0 6c 29 20 2b 20 31 3b 0a 20 20 20 20 73 77 69 74  l) + 1;.    swit
104e0 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29  ch( op[i].type )
104f0 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  {.      case OPT
10500 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73  _FLAG:.      cas
10510 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20  e OPT_FFLAG:.   
10520 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10530 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a    case OPT_INT:.
10540 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
10550 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e  INT:.        len
10560 20 2b 3d 20 39 3b 20 20 20 20 20 20 20 2f 2a 20   += 9;       /* 
10570 6c 65 6e 67 74 68 20 6f 66 20 22 3c 69 6e 74 65  length of "<inte
10580 67 65 72 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20  ger>" */.       
10590 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
105a0 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20  se OPT_DBL:.    
105b0 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a    case OPT_FDBL:
105c0 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20  .        len += 
105d0 36 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67  6;       /* leng
105e0 74 68 20 6f 66 20 22 3c 72 65 61 6c 3e 22 20 2a  th of "<real>" *
105f0 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
10600 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
10610 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20  STR:.      case 
10620 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20  OPT_FSTR:.      
10630 20 20 6c 65 6e 20 2b 3d 20 38 3b 20 20 20 20 20    len += 8;     
10640 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22    /* length of "
10650 3c 73 74 72 69 6e 67 3e 22 20 2a 2f 0a 20 20 20  <string>" */.   
10660 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10670 7d 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61  }.    if( len>ma
10680 78 20 29 20 6d 61 78 20 3d 20 6c 65 6e 3b 0a 20  x ) max = len;. 
10690 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 6f 70   }.  for(i=0; op
106a0 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b  [i].label; i++){
106b0 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b  .    switch( op[
106c0 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20  i].type ){.     
106d0 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a   case OPT_FLAG:.
106e0 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
106f0 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 66 70  FLAG:.        fp
10700 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c  rintf(errstream,
10710 22 20 20 2d 25 2d 2a 73 20 20 25 73 5c 6e 22 2c  "  -%-*s  %s\n",
10720 6d 61 78 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c  max,op[i].label,
10730 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a  op[i].message);.
10740 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10750 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e       case OPT_IN
10760 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  T:.      case OP
10770 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20  T_FINT:.        
10780 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61  fprintf(errstrea
10790 6d 2c 22 20 20 2d 25 73 3c 69 6e 74 65 67 65 72  m,"  -%s<integer
107a0 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69  >%*s  %s\n",op[i
107b0 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  ].label,.       
107c0 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d     (int)(max-lem
107d0 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c  onStrlen(op[i].l
107e0 61 62 65 6c 29 2d 39 29 2c 22 22 2c 6f 70 5b 69  abel)-9),"",op[i
107f0 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  ].message);.    
10800 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10810 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20   case OPT_DBL:. 
10820 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44       case OPT_FD
10830 42 4c 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69  BL:.        fpri
10840 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20  ntf(errstream," 
10850 20 2d 25 73 3c 72 65 61 6c 3e 25 2a 73 20 20 25   -%s<real>%*s  %
10860 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c  s\n",op[i].label
10870 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e 74  ,.          (int
10880 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65  )(max-lemonStrle
10890 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36  n(op[i].label)-6
108a0 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61  ),"",op[i].messa
108b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
108c0 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
108d0 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61  PT_STR:.      ca
108e0 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20  se OPT_FSTR:.   
108f0 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
10900 73 74 72 65 61 6d 2c 22 20 20 2d 25 73 3c 73 74  stream,"  -%s<st
10910 72 69 6e 67 3e 25 2a 73 20 20 25 73 5c 6e 22 2c  ring>%*s  %s\n",
10920 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20  op[i].label,.   
10930 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78         (int)(max
10940 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b  -lemonStrlen(op[
10950 69 5d 2e 6c 61 62 65 6c 29 2d 38 29 2c 22 22 2c  i].label)-8),"",
10960 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a  op[i].message);.
10970 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10980 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a     }.  }.}./****
10990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109a0 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
109b0 65 20 22 70 61 72 73 65 2e 63 22 20 2a 2a 2a 2a  e "parse.c" ****
109c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109d0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
109e0 49 6e 70 75 74 20 66 69 6c 65 20 70 61 72 73 65  Input file parse
109f0 72 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20  r for the LEMON 
10a00 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
10a10 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68 65 20 73 74 61  ..*/../* The sta
10a20 74 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  te of the parser
10a30 20 2a 2f 0a 65 6e 75 6d 20 65 5f 73 74 61 74 65   */.enum e_state
10a40 20 7b 0a 20 20 49 4e 49 54 49 41 4c 49 5a 45 2c   {.  INITIALIZE,
10a50 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44  .  WAITING_FOR_D
10a60 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a 20 20 57  ECL_OR_RULE,.  W
10a70 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
10a80 4b 45 59 57 4f 52 44 2c 0a 20 20 57 41 49 54 49  KEYWORD,.  WAITI
10a90 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 2c  NG_FOR_DECL_ARG,
10aa0 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50  .  WAITING_FOR_P
10ab0 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c  RECEDENCE_SYMBOL
10ac0 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ,.  WAITING_FOR_
10ad0 41 52 52 4f 57 2c 0a 20 20 49 4e 5f 52 48 53 2c  ARROW,.  IN_RHS,
10ae0 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f 31 2c 0a  .  LHS_ALIAS_1,.
10af0 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20    LHS_ALIAS_2,. 
10b00 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c 0a 20 20   LHS_ALIAS_3,.  
10b10 52 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 52  RHS_ALIAS_1,.  R
10b20 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 50 52  HS_ALIAS_2,.  PR
10b30 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 2c  ECEDENCE_MARK_1,
10b40 0a 20 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41  .  PRECEDENCE_MA
10b50 52 4b 5f 32 2c 0a 20 20 52 45 53 59 4e 43 5f 41  RK_2,.  RESYNC_A
10b60 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 2c  FTER_RULE_ERROR,
10b70 0a 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f  .  RESYNC_AFTER_
10b80 44 45 43 4c 5f 45 52 52 4f 52 2c 0a 20 20 57 41  DECL_ERROR,.  WA
10b90 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55  ITING_FOR_DESTRU
10ba0 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57  CTOR_SYMBOL,.  W
10bb0 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54  AITING_FOR_DATAT
10bc0 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41  YPE_SYMBOL,.  WA
10bd0 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41  ITING_FOR_FALLBA
10be0 43 4b 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e 47  CK_ID,.  WAITING
10bf0 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44  _FOR_WILDCARD_ID
10c00 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ,.  WAITING_FOR_
10c10 43 4c 41 53 53 5f 49 44 2c 0a 20 20 57 41 49 54  CLASS_ID,.  WAIT
10c20 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 54 4f  ING_FOR_CLASS_TO
10c30 4b 45 4e 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  KEN,.  WAITING_F
10c40 4f 52 5f 54 4f 4b 45 4e 5f 4e 41 4d 45 0a 7d 3b  OR_TOKEN_NAME.};
10c50 0a 73 74 72 75 63 74 20 70 73 74 61 74 65 20 7b  .struct pstate {
10c60 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  .  char *filenam
10c70 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e;       /* Name
10c80 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69   of the input fi
10c90 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65  le */.  int toke
10ca0 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 2f 2a  nlineno;      /*
10cb0 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61 74 20 77   Linenumber at w
10cc0 68 69 63 68 20 63 75 72 72 65 6e 74 20 74 6f 6b  hich current tok
10cd0 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a 20 20 69  en starts */.  i
10ce0 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20  nt errorcnt;    
10cf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10d00 66 20 65 72 72 6f 72 73 20 73 6f 20 66 61 72 20  f errors so far 
10d10 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e  */.  char *token
10d20 73 74 61 72 74 3b 20 20 20 20 20 2f 2a 20 54 65  start;     /* Te
10d30 78 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74 6f  xt of current to
10d40 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ken */.  struct 
10d50 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20 20 20 2f  lemon *gp;     /
10d60 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74 65 20 76  * Global state v
10d70 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d 20  ector */.  enum 
10d80 65 5f 73 74 61 74 65 20 73 74 61 74 65 3b 20 20  e_state state;  
10d90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61        /* The sta
10da0 74 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  te of the parser
10db0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
10dc0 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 20  bol *fallback;  
10dd0 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61 63 6b   /* The fallback
10de0 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75   token */.  stru
10df0 63 74 20 73 79 6d 62 6f 6c 20 2a 74 6b 63 6c 61  ct symbol *tkcla
10e00 73 73 3b 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  ss;    /* Token 
10e10 63 6c 61 73 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a  class symbol */.
10e20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
10e30 2a 6c 68 73 3b 20 20 20 20 20 20 20 20 2f 2a 20  *lhs;        /* 
10e40 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  Left-hand side o
10e50 66 20 63 75 72 72 65 6e 74 20 72 75 6c 65 20 2a  f current rule *
10e60 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10e70 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 20 20 2f  lhsalias;      /
10e80 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20  * Alias for the 
10e90 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68  LHS */.  int nrh
10ea0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
10eb0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10ec0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
10ed0 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e 20 2a 2f   symbols seen */
10ee0 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
10ef0 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d 3b 20 20   *rhs[MAXRHS];  
10f00 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  /* RHS symbols *
10f10 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10f20 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d 3b 20 2f  alias[MAXRHS]; /
10f30 2a 20 41 6c 69 61 73 65 73 20 66 6f 72 20 65 61  * Aliases for ea
10f40 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 6f  ch RHS symbol (o
10f50 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 74 72  r NULL) */.  str
10f60 75 63 74 20 72 75 6c 65 20 2a 70 72 65 76 72 75  uct rule *prevru
10f70 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72 65 76 69  le;     /* Previ
10f80 6f 75 73 20 72 75 6c 65 20 70 61 72 73 65 64 20  ous rule parsed 
10f90 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
10fa0 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b 20 20 20  *declkeyword;   
10fb0 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66 20 61 20  /* Keyword of a 
10fc0 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 20  declaration */. 
10fd0 20 63 68 61 72 20 2a 2a 64 65 63 6c 61 72 67 73   char **declargs
10fe0 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  lot;        /* W
10ff0 68 65 72 65 20 74 68 65 20 64 65 63 6c 61 72 61  here the declara
11000 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 73 68  tion argument sh
11010 6f 75 6c 64 20 62 65 20 70 75 74 20 2a 2f 0a 20  ould be put */. 
11020 20 69 6e 74 20 69 6e 73 65 72 74 4c 69 6e 65 4d   int insertLineM
11030 61 63 72 6f 3b 20 20 20 20 20 20 20 2f 2a 20 41  acro;       /* A
11040 64 64 20 23 6c 69 6e 65 20 62 65 66 6f 72 65 20  dd #line before 
11050 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 73 65  declaration inse
11060 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64 65 63  rt */.  int *dec
11070 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20 20 20 20  llinenoslot;    
11080 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
11090 72 69 74 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  rite declaration
110a0 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
110b0 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64    enum e_assoc d
110c0 65 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20  eclassoc;    /* 
110d0 41 73 73 69 67 6e 20 74 68 69 73 20 61 73 73 6f  Assign this asso
110e0 63 69 61 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20  ciation to decl 
110f0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69  arguments */.  i
11100 6e 74 20 70 72 65 63 63 6f 75 6e 74 65 72 3b 20  nt preccounter; 
11110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
11120 69 67 6e 20 74 68 69 73 20 70 72 65 63 65 64 65  ign this precede
11130 6e 63 65 20 74 6f 20 64 65 63 6c 20 61 72 67 75  nce to decl argu
11140 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75 63  ments */.  struc
11150 74 20 72 75 6c 65 20 2a 66 69 72 73 74 72 75 6c  t rule *firstrul
11160 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  e;    /* Pointer
11170 20 74 6f 20 66 69 72 73 74 20 72 75 6c 65 20 69   to first rule i
11180 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f  n the grammar */
11190 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
111a0 6c 61 73 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a  lastrule;     /*
111b0 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
111c0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
111d0 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a  rsed rule */.};.
111e0 0a 2f 2a 20 50 61 72 73 65 20 61 20 73 69 6e 67  ./* Parse a sing
111f0 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74  le token */.stat
11200 69 63 20 76 6f 69 64 20 70 61 72 73 65 6f 6e 65  ic void parseone
11210 74 6f 6b 65 6e 28 73 74 72 75 63 74 20 70 73 74  token(struct pst
11220 61 74 65 20 2a 70 73 70 29 0a 7b 0a 20 20 63 6f  ate *psp).{.  co
11230 6e 73 74 20 63 68 61 72 20 2a 78 3b 0a 20 20 78  nst char *x;.  x
11240 20 3d 20 53 74 72 73 61 66 65 28 70 73 70 2d 3e   = Strsafe(psp->
11250 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20 20 20  tokenstart);    
11260 20 2f 2a 20 53 61 76 65 20 74 68 65 20 74 6f 6b   /* Save the tok
11270 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a  en permanently *
11280 2f 0a 23 69 66 20 30 0a 20 20 70 72 69 6e 74 66  /.#if 0.  printf
11290 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b  ("%s:%d: Token=[
112a0 25 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c  %s] state=%d\n",
112b0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
112c0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
112d0 20 20 20 20 78 2c 70 73 70 2d 3e 73 74 61 74 65      x,psp->state
112e0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74  );.#endif.  swit
112f0 63 68 28 20 70 73 70 2d 3e 73 74 61 74 65 20 29  ch( psp->state )
11300 7b 0a 20 20 20 20 63 61 73 65 20 49 4e 49 54 49  {.    case INITI
11310 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70 73 70  ALIZE:.      psp
11320 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a  ->prevrule = 0;.
11330 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63        psp->precc
11340 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  ounter = 0;.    
11350 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65    psp->firstrule
11360 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65   = psp->lastrule
11370 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d   = 0;.      psp-
11380 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a  >gp->nrule = 0;.
11390 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
113a0 72 75 20 74 6f 20 6e 65 78 74 20 63 61 73 65 20  ru to next case 
113b0 2a 2f 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  */.    case WAIT
113c0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
113d0 52 55 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  RULE:.      if( 
113e0 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20  x[0]=='%' ){.   
113f0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11400 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
11410 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20  CL_KEYWORD;.    
11420 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 4c 4f    }else if( ISLO
11430 57 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  WER(x[0]) ){.   
11440 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20       psp->lhs = 
11450 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
11460 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73         psp->nrhs
11470 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
11480 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b  p->lhsalias = 0;
11490 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
114a0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
114b0 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d  R_ARROW;.      }
114c0 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
114d0 7b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  {' ){.        if
114e0 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d  ( psp->prevrule=
114f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11500 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
11510 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
11520 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20  nlineno,."There 
11530 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65  is no prior rule
11540 20 75 70 6f 6e 20 77 68 69 63 68 20 74 6f 20 61   upon which to a
11550 74 74 61 63 68 20 74 68 65 20 63 6f 64 65 20 5c  ttach the code \
11560 0a 66 72 61 67 6d 65 6e 74 20 77 68 69 63 68 20  .fragment which 
11570 62 65 67 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c  begins on this l
11580 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ine.");.        
11590 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
115a0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
115b0 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75   if( psp->prevru
115c0 6c 65 2d 3e 63 6f 64 65 21 3d 30 20 29 7b 0a 20  le->code!=0 ){. 
115d0 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
115e0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
115f0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
11600 2c 0a 22 43 6f 64 65 20 66 72 61 67 6d 65 6e 74  ,."Code fragment
11610 20 62 65 67 69 6e 6e 69 6e 67 20 6f 6e 20 74 68   beginning on th
11620 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
11630 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f  he first \.to fo
11640 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75  llow the previou
11650 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20  s rule.");.     
11660 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11670 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  nt++;.        }e
11680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
11690 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 6c 69  sp->prevrule->li
116a0 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ne = psp->tokenl
116b0 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  ineno;.         
116c0 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e   psp->prevrule->
116d0 63 6f 64 65 20 3d 20 26 78 5b 31 5d 3b 0a 20 20  code = &x[1];.  
116e0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
116f0 76 72 75 6c 65 2d 3e 6e 6f 43 6f 64 65 20 3d 20  vrule->noCode = 
11700 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
11710 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30     }else if( x[0
11720 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  ]=='[' ){.      
11730 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50    psp->state = P
11740 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31  RECEDENCE_MARK_1
11750 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11760 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11770 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
11780 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
11790 20 20 20 20 20 20 20 20 20 20 22 54 6f 6b 65 6e            "Token
117a0 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62   \"%s\" should b
117b0 65 20 65 69 74 68 65 72 20 5c 22 25 25 5c 22 20  e either \"%%\" 
117c0 6f 72 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  or a nonterminal
117d0 20 6e 61 6d 65 2e 22 2c 0a 20 20 20 20 20 20 20   name.",.       
117e0 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70     x);.        p
117f0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
11810 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52  eak;.    case PR
11820 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a  ECEDENCE_MARK_1:
11830 0a 20 20 20 20 20 20 69 66 28 20 21 49 53 55 50  .      if( !ISUP
11840 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  PER(x[0]) ){.   
11850 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
11860 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
11870 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
11880 20 20 20 20 20 20 20 20 22 54 68 65 20 70 72 65          "The pre
11890 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6d  cedence symbol m
118a0 75 73 74 20 62 65 20 61 20 74 65 72 6d 69 6e 61  ust be a termina
118b0 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  l.");.        ps
118c0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
118d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
118e0 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20  sp->prevrule==0 
118f0 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
11900 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
11910 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
11920 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54  no,.          "T
11930 68 65 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72  here is no prior
11940 20 72 75 6c 65 20 74 6f 20 61 73 73 69 67 6e 20   rule to assign 
11950 70 72 65 63 65 64 65 6e 63 65 20 5c 22 5b 25 73  precedence \"[%s
11960 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  ]\".",x);.      
11970 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11980 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
11990 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65  f( psp->prevrule
119a0 2d 3e 70 72 65 63 73 79 6d 21 3d 30 20 29 7b 0a  ->precsym!=0 ){.
119b0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
119c0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
119d0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
119e0 0a 22 50 72 65 63 65 64 65 6e 63 65 20 6d 61 72  ."Precedence mar
119f0 6b 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69  k on this line i
11a00 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 20  s not the first 
11a10 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20  \.to follow the 
11a20 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22 29  previous rule.")
11a30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
11a40 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
11a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11a60 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70  psp->prevrule->p
11a70 72 65 63 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f  recsym = Symbol_
11a80 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a  new(x);.      }.
11a90 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11aa0 20 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41   = PRECEDENCE_MA
11ab0 52 4b 5f 32 3b 0a 20 20 20 20 20 20 62 72 65 61  RK_2;.      brea
11ac0 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45 43  k;.    case PREC
11ad0 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20  EDENCE_MARK_2:. 
11ae0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 21 3d 27       if( x[0]!='
11af0 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]' ){.        Er
11b00 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
11b10 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
11b20 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
11b30 20 22 4d 69 73 73 69 6e 67 20 5c 22 5d 5c 22 20   "Missing \"]\" 
11b40 6f 6e 20 70 72 65 63 65 64 65 6e 63 65 20 6d 61  on precedence ma
11b50 72 6b 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  rk.");.        p
11b60 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11b70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 73        }.      ps
11b80 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11b90 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
11ba0 55 4c 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ULE;.      break
11bb0 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
11bc0 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3a 0a 20 20  NG_FOR_ARROW:.  
11bd0 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a      if( x[0]==':
11be0 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26  ' && x[1]==':' &
11bf0 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20  & x[2]=='=' ){. 
11c00 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11c10 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20  e = IN_RHS;.    
11c20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
11c30 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20  =='(' ){.       
11c40 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48   psp->state = LH
11c50 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20  S_ALIAS_1;.     
11c60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11c70 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
11c80 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
11c90 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
11ca0 20 20 20 22 45 78 70 65 63 74 65 64 20 74 6f 20     "Expected to 
11cb0 73 65 65 20 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c  see a \":\" foll
11cc0 6f 77 69 6e 67 20 74 68 65 20 4c 48 53 20 73 79  owing the LHS sy
11cd0 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a 20  mbol \"%s\".",. 
11ce0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68           psp->lh
11cf0 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  s->name);.      
11d00 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11d10 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
11d20 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
11d30 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
11d40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11d50 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c  reak;.    case L
11d60 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20  HS_ALIAS_1:.    
11d70 20 20 69 66 28 20 49 53 41 4c 50 48 41 28 78 5b    if( ISALPHA(x[
11d80 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
11d90 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 78  sp->lhsalias = x
11da0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
11db0 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53  tate = LHS_ALIAS
11dc0 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _2;.      }else{
11dd0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
11de0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
11df0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
11e00 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 25  ,.          "\"%
11e10 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  s\" is not a val
11e20 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  id alias for the
11e30 20 4c 48 53 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a   LHS \"%s\"\n",.
11e40 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d            x,psp-
11e50 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  >lhs->name);.   
11e60 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11e70 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
11e80 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11e90 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
11ea0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
11eb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11ec0 65 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20  e LHS_ALIAS_2:. 
11ed0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
11ee0 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  )' ){.        ps
11ef0 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41  p->state = LHS_A
11f00 4c 49 41 53 5f 33 3b 0a 20 20 20 20 20 20 7d 65  LIAS_3;.      }e
11f10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
11f20 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11f30 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
11f40 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
11f50 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20 66  "Missing \")\" f
11f60 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69  ollowing LHS ali
11f70 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22  as name \"%s\"."
11f80 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b  ,psp->lhsalias);
11f90 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
11fa0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
11fb0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
11fc0 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
11fd0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
11fe0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11ff0 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f   case LHS_ALIAS_
12000 33 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  3:.      if( x[0
12010 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d  ]==':' && x[1]==
12020 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27  ':' && x[2]=='='
12030 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
12040 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b  >state = IN_RHS;
12050 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12060 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
12070 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
12080 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
12090 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
120a0 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69  g \"->\" followi
120b0 6e 67 3a 20 5c 22 25 73 28 25 73 29 5c 22 2e 22  ng: \"%s(%s)\"."
120c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 73 70  ,.           psp
120d0 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d  ->lhs->name,psp-
120e0 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20  >lhsalias);.    
120f0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
12100 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
12110 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
12120 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
12130 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
12140 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
12150 20 49 4e 5f 52 48 53 3a 0a 20 20 20 20 20 20 69   IN_RHS:.      i
12160 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  f( x[0]=='.' ){.
12170 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 72          struct r
12180 75 6c 65 20 2a 72 70 3b 0a 20 20 20 20 20 20 20  ule *rp;.       
12190 20 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75   rp = (struct ru
121a0 6c 65 20 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a  le *)calloc( siz
121b0 65 6f 66 28 73 74 72 75 63 74 20 72 75 6c 65 29  eof(struct rule)
121c0 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
121d0 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79  sizeof(struct sy
121e0 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68 73  mbol*)*psp->nrhs
121f0 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29   + sizeof(char*)
12200 2a 70 73 70 2d 3e 6e 72 68 73 2c 20 31 29 3b 0a  *psp->nrhs, 1);.
12210 20 20 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d          if( rp==
12220 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
12230 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
12240 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
12250 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
12260 20 20 20 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63      "Can't alloc
12270 61 74 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72  ate enough memor
12280 79 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65 2e  y for this rule.
12290 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ");.          ps
122a0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
122b0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
122c0 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20  evrule = 0;.    
122d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
122e0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
122f0 20 20 20 20 20 20 72 70 2d 3e 72 75 6c 65 6c 69        rp->ruleli
12300 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ne = psp->tokenl
12310 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  ineno;.         
12320 20 72 70 2d 3e 72 68 73 20 3d 20 28 73 74 72 75   rp->rhs = (stru
12330 63 74 20 73 79 6d 62 6f 6c 2a 2a 29 26 72 70 5b  ct symbol**)&rp[
12340 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  1];.          rp
12350 2d 3e 72 68 73 61 6c 69 61 73 20 3d 20 28 63 6f  ->rhsalias = (co
12360 6e 73 74 20 63 68 61 72 2a 2a 29 26 28 72 70 2d  nst char**)&(rp-
12370 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 29  >rhs[psp->nrhs])
12380 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
12390 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e 72 68 73  i=0; i<psp->nrhs
123a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
123b0 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 20 3d      rp->rhs[i] =
123c0 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20   psp->rhs[i];.  
123d0 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
123e0 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70 73 70 2d  salias[i] = psp-
123f0 3e 61 6c 69 61 73 5b 69 5d 3b 0a 20 20 20 20 20  >alias[i];.     
12400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12410 20 72 70 2d 3e 6c 68 73 20 3d 20 70 73 70 2d 3e   rp->lhs = psp->
12420 6c 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72  lhs;.          r
12430 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 70 73  p->lhsalias = ps
12440 70 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a 20 20 20  p->lhsalias;.   
12450 20 20 20 20 20 20 20 72 70 2d 3e 6e 72 68 73 20         rp->nrhs 
12460 3d 20 70 73 70 2d 3e 6e 72 68 73 3b 0a 20 20 20  = psp->nrhs;.   
12470 20 20 20 20 20 20 20 72 70 2d 3e 63 6f 64 65 20         rp->code 
12480 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
12490 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 31 3b 0a 20  p->noCode = 1;. 
124a0 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65           rp->pre
124b0 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  csym = 0;.      
124c0 20 20 20 20 72 70 2d 3e 69 6e 64 65 78 20 3d 20      rp->index = 
124d0 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b 2b  psp->gp->nrule++
124e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
124f0 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e 6c 68  nextlhs = rp->lh
12500 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20 20 20  s->rule;.       
12510 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65     rp->lhs->rule
12520 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20   = rp;.         
12530 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20   rp->next = 0;. 
12540 20 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70           if( psp
12550 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30 20 29  ->firstrule==0 )
12560 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73  {.            ps
12570 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70  p->firstrule = p
12580 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72  sp->lastrule = r
12590 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  p;.          }el
125a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
125b0 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 2d 3e 6e  psp->lastrule->n
125c0 65 78 74 20 3d 20 72 70 3b 0a 20 20 20 20 20 20  ext = rp;.      
125d0 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72        psp->lastr
125e0 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20  ule = rp;.      
125f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12600 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20  psp->prevrule = 
12610 72 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rp;.        }.  
12620 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
12630 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
12640 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20  ECL_OR_RULE;.   
12650 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41     }else if( ISA
12660 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20 20  LPHA(x[0]) ){.  
12670 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 6e        if( psp->n
12680 72 68 73 3e 3d 4d 41 58 52 48 53 20 29 7b 0a 20  rhs>=MAXRHS ){. 
12690 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
126a0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
126b0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
126c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 54  ,.            "T
126d0 6f 6f 20 6d 61 6e 79 20 73 79 6d 62 6f 6c 73 20  oo many symbols 
126e0 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 20 62  on RHS of rule b
126f0 65 67 69 6e 6e 69 6e 67 20 61 74 20 5c 22 25 73  eginning at \"%s
12700 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  \".",.          
12710 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20    x);.          
12720 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
12730 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12740 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
12750 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
12760 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
12770 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72            psp->r
12780 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20  hs[psp->nrhs] = 
12790 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
127a0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c           psp->al
127b0 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d  ias[psp->nrhs] =
127c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73   0;.          ps
127d0 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 20 20 20 20 20  p->nrhs++;.     
127e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
127f0 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7c 27 20   if( (x[0]=='|' 
12800 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20 26 26  || x[0]=='/') &&
12810 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a   psp->nrhs>0 ){.
12820 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
12830 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70  ymbol *msp = psp
12840 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d  ->rhs[psp->nrhs-
12850 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1];.        if( 
12860 6d 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49  msp->type!=MULTI
12870 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
12880 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
12890 62 6f 6c 20 2a 6f 72 69 67 73 70 20 3d 20 6d 73  bol *origsp = ms
128a0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70  p;.          msp
128b0 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f   = (struct symbo
128c0 6c 20 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69  l *) calloc(1,si
128d0 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20 20 20  zeof(*msp));.   
128e0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 6d 73         memset(ms
128f0 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6d 73  p, 0, sizeof(*ms
12900 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  p));.          m
12910 73 70 2d 3e 74 79 70 65 20 3d 20 4d 55 4c 54 49  sp->type = MULTI
12920 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 20 20  TERMINAL;.      
12930 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d      msp->nsubsym
12940 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
12950 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73  msp->subsym = (s
12960 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29  truct symbol **)
12970 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66   calloc(1,sizeof
12980 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29  (struct symbol*)
12990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70  );.          msp
129a0 2d 3e 73 75 62 73 79 6d 5b 30 5d 20 3d 20 6f 72  ->subsym[0] = or
129b0 69 67 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20  igsp;.          
129c0 6d 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f 72 69 67  msp->name = orig
129d0 73 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 20 20  sp->name;.      
129e0 20 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73 70      psp->rhs[psp
129f0 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d 73 70 3b  ->nrhs-1] = msp;
12a00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12a10 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b     msp->nsubsym+
12a20 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e  +;.        msp->
12a30 73 75 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74  subsym = (struct
12a40 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c   symbol **) real
12a50 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c  loc(msp->subsym,
12a60 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f  .          sizeo
12a70 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a  f(struct symbol*
12a80 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b  )*msp->nsubsym);
12a90 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75  .        msp->su
12aa0 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79  bsym[msp->nsubsy
12ab0 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  m-1] = Symbol_ne
12ac0 77 28 26 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20  w(&x[1]);.      
12ad0 20 20 69 66 28 20 49 53 4c 4f 57 45 52 28 78 5b    if( ISLOWER(x[
12ae0 31 5d 29 20 7c 7c 20 49 53 4c 4f 57 45 52 28 6d  1]) || ISLOWER(m
12af0 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e  sp->subsym[0]->n
12b00 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  ame[0]) ){.     
12b10 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
12b20 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
12b30 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
12b40 20 20 20 20 20 20 20 20 20 20 22 43 61 6e 6e 6f            "Canno
12b50 74 20 66 6f 72 6d 20 61 20 63 6f 6d 70 6f 75 6e  t form a compoun
12b60 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 6e  d containing a n
12b70 6f 6e 2d 74 65 72 6d 69 6e 61 6c 22 29 3b 0a 20  on-terminal");. 
12b80 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
12b90 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
12ba0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
12bb0 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 26 26  if( x[0]=='(' &&
12bc0 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a   psp->nrhs>0 ){.
12bd0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
12be0 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 31  te = RHS_ALIAS_1
12bf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12c00 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
12c10 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
12c20 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
12c30 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67            "Illeg
12c40 61 6c 20 63 68 61 72 61 63 74 65 72 20 6f 6e 20  al character on 
12c50 52 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c 22 25  RHS of rule: \"%
12c60 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  s\".",x);.      
12c70 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
12c80 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
12c90 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
12ca0 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
12cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
12cc0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
12cd0 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20  HS_ALIAS_1:.    
12ce0 20 20 69 66 28 20 49 53 41 4c 50 48 41 28 78 5b    if( ISALPHA(x[
12cf0 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
12d00 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e  sp->alias[psp->n
12d10 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20 20 20  rhs-1] = x;.    
12d20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
12d30 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20   RHS_ALIAS_2;.  
12d40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12d50 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
12d60 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
12d70 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
12d80 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73        "\"%s\" is
12d90 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69   not a valid ali
12da0 61 73 20 66 6f 72 20 74 68 65 20 52 48 53 20 73  as for the RHS s
12db0 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22 2c  ymbol \"%s\"\n",
12dc0 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70  .          x,psp
12dd0 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d  ->rhs[psp->nrhs-
12de0 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  1]->name);.     
12df0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
12e00 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
12e10 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
12e20 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
12e30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12e40 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
12e50 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20  RHS_ALIAS_2:.   
12e60 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27     if( x[0]==')'
12e70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
12e80 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b  >state = IN_RHS;
12e90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12ea0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
12eb0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
12ec0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
12ed0 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
12ee0 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e  g \")\" followin
12ef0 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65  g LHS alias name
12f00 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c   \"%s\".",psp->l
12f10 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  hsalias);.      
12f20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
12f30 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
12f40 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
12f50 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
12f60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
12f70 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
12f80 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
12f90 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20 69  KEYWORD:.      i
12fa0 66 28 20 49 53 41 4c 50 48 41 28 78 5b 30 5d 29  f( ISALPHA(x[0])
12fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
12fc0 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d 20 78  >declkeyword = x
12fd0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64  ;.        psp->d
12fe0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30 3b 0a  eclargslot = 0;.
12ff0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
13000 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20 30 3b  llinenoslot = 0;
13010 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e  .        psp->in
13020 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
13030 31 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  1;.        psp->
13040 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
13050 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20  FOR_DECL_ARG;.  
13060 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
13070 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30 20 29 7b  (x,"name")==0 ){
13080 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13090 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
130a0 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65 29 3b 0a  psp->gp->name);.
130b0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69            psp->i
130c0 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
130d0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
130e0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
130f0 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20 29 7b 0a  include")==0 ){.
13100 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
13110 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
13120 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 29  sp->gp->include)
13130 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
13140 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 63 6f  if( strcmp(x,"co
13150 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  de")==0 ){.     
13160 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
13170 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
13180 70 2d 3e 65 78 74 72 61 63 6f 64 65 29 3b 0a 20  p->extracode);. 
13190 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
131a0 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e   strcmp(x,"token
131b0 5f 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30  _destructor")==0
131c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
131d0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
131e0 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e   &psp->gp->token
131f0 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  dest;.        }e
13200 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
13210 2c 22 64 65 66 61 75 6c 74 5f 64 65 73 74 72 75  ,"default_destru
13220 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ctor")==0 ){.   
13230 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
13240 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  argslot = &psp->
13250 67 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20  gp->vardest;.   
13260 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
13270 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 70  trcmp(x,"token_p
13280 72 65 66 69 78 22 29 3d 3d 30 20 29 7b 0a 20 20  refix")==0 ){.  
13290 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
132a0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d  largslot = &psp-
132b0 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78  >gp->tokenprefix
132c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
132d0 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
132e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
132f0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
13300 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f 72 22 29  ,"syntax_error")
13310 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13320 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
13330 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65  t = &(psp->gp->e
13340 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  rror);.        }
13350 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13360 78 2c 22 70 61 72 73 65 5f 61 63 63 65 70 74 22  x,"parse_accept"
13370 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
13380 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
13390 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
133a0 61 63 63 65 70 74 29 3b 0a 20 20 20 20 20 20 20  accept);.       
133b0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
133c0 70 28 78 2c 22 70 61 72 73 65 5f 66 61 69 6c 75  p(x,"parse_failu
133d0 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  re")==0 ){.     
133e0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
133f0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
13400 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 20 20 20  p->failure);.   
13410 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
13420 74 72 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f 6f  trcmp(x,"stack_o
13430 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20 29 7b 0a  verflow")==0 ){.
13440 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
13450 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
13460 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c 6f 77  sp->gp->overflow
13470 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
13480 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 65   if( strcmp(x,"e
13490 78 74 72 61 5f 61 72 67 75 6d 65 6e 74 22 29 3d  xtra_argument")=
134a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
134b0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
134c0 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61 72   = &(psp->gp->ar
134d0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  g);.          ps
134e0 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
134f0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
13500 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13510 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70 65 22 29  (x,"token_type")
13520 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13530 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
13540 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 74  t = &(psp->gp->t
13550 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20 20 20 20  okentype);.     
13560 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74       psp->insert
13570 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20  LineMacro = 0;. 
13580 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
13590 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61 75   strcmp(x,"defau
135a0 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a  lt_type")==0 ){.
135b0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
135c0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
135d0 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79 70 65 29  sp->gp->vartype)
135e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
135f0 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
13600 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
13610 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
13620 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22 29 3d 3d  ,"stack_size")==
13630 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
13640 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
13650 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61  = &(psp->gp->sta
13660 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  cksize);.       
13670 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
13680 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20  neMacro = 0;.   
13690 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
136a0 74 72 63 6d 70 28 78 2c 22 73 74 61 72 74 5f 73  trcmp(x,"start_s
136b0 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  ymbol")==0 ){.  
136c0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
136d0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
136e0 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20  ->gp->start);.  
136f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
13700 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30  ertLineMacro = 0
13710 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
13720 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6c 65  if( strcmp(x,"le
13730 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ft")==0 ){.     
13740 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f       psp->precco
13750 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20  unter++;.       
13760 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f     psp->declasso
13770 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20 20 20 20  c = LEFT;.      
13780 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
13790 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45   WAITING_FOR_PRE
137a0 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a  CEDENCE_SYMBOL;.
137b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
137c0 28 20 73 74 72 63 6d 70 28 78 2c 22 72 69 67 68  ( strcmp(x,"righ
137d0 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
137e0 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75      psp->preccou
137f0 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nter++;.        
13800 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63    psp->declassoc
13810 20 3d 20 52 49 47 48 54 3b 0a 20 20 20 20 20 20   = RIGHT;.      
13820 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
13830 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45   WAITING_FOR_PRE
13840 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a  CEDENCE_SYMBOL;.
13850 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
13860 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 6f 6e 61  ( strcmp(x,"nona
13870 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ssoc")==0 ){.   
13880 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63         psp->prec
13890 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20  counter++;.     
138a0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73       psp->declas
138b0 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20 20 20 20  soc = NONE;.    
138c0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
138d0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50   = WAITING_FOR_P
138e0 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c  RECEDENCE_SYMBOL
138f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
13900 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65  if( strcmp(x,"de
13910 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b  structor")==0 ){
13920 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13930 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
13940 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53  FOR_DESTRUCTOR_S
13950 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
13960 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13970 78 2c 22 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a  x,"type")==0 ){.
13980 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
13990 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
139a0 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42  OR_DATATYPE_SYMB
139b0 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OL;.        }els
139c0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
139d0 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30 20 29 7b  fallback")==0 ){
139e0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
139f0 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  fallback = 0;.  
13a00 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
13a10 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
13a20 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b 0a 20 20  _FALLBACK_ID;.  
13a30 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13a40 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 22  strcmp(x,"token"
13a50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
13a60 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
13a70 41 49 54 49 4e 47 5f 46 4f 52 5f 54 4f 4b 45 4e  AITING_FOR_TOKEN
13a80 5f 4e 41 4d 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NAME;.        }
13a90 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13aa0 78 2c 22 77 69 6c 64 63 61 72 64 22 29 3d 3d 30  x,"wildcard")==0
13ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
13ac0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
13ad0 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f  NG_FOR_WILDCARD_
13ae0 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ID;.        }els
13af0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
13b00 74 6f 6b 65 6e 5f 63 6c 61 73 73 22 29 3d 3d 30  token_class")==0
13b10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
13b20 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
13b30 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 49 44 3b  NG_FOR_CLASS_ID;
13b40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
13b50 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
13b60 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
13b70 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
13b80 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  o,.            "
13b90 55 6e 6b 6e 6f 77 6e 20 64 65 63 6c 61 72 61 74  Unknown declarat
13ba0 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25  ion keyword: \"%
13bb0 25 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20  %%s\".",x);.    
13bc0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
13bd0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
13be0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
13bf0 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
13c00 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
13c10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13c20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
13c30 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
13c40 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
13c50 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
13c60 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65  l declaration ke
13c70 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22 2e 22 2c  yword: \"%s\".",
13c80 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
13c90 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
13ca0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
13cb0 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
13cc0 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
13cd0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
13ce0 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
13cf0 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f  _FOR_DESTRUCTOR_
13d00 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66  SYMBOL:.      if
13d10 28 20 21 49 53 41 4c 50 48 41 28 78 5b 30 5d 29  ( !ISALPHA(x[0])
13d20 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
13d30 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
13d40 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
13d50 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
13d60 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73  Symbol name miss
13d70 69 6e 67 20 61 66 74 65 72 20 25 25 64 65 73 74  ing after %%dest
13d80 72 75 63 74 6f 72 20 6b 65 79 77 6f 72 64 22 29  ructor keyword")
13d90 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
13da0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
13db0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
13dc0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
13dd0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
13de0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
13df0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
13e00 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
13e10 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
13e20 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d  clargslot = &sp-
13e30 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 20  >destructor;.   
13e40 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69       psp->declli
13e50 6e 65 6e 6f 73 6c 6f 74 20 3d 20 26 73 70 2d 3e  nenoslot = &sp->
13e60 64 65 73 74 4c 69 6e 65 6e 6f 3b 0a 20 20 20 20  destLineno;.    
13e70 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
13e80 69 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20  ineMacro = 1;.  
13e90 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
13ea0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
13eb0 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d  ECL_ARG;.      }
13ec0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13ed0 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
13ee0 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42  OR_DATATYPE_SYMB
13ef0 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 49  OL:.      if( !I
13f00 53 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a  SALPHA(x[0]) ){.
13f10 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
13f20 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
13f30 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
13f40 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62  .          "Symb
13f50 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20  ol name missing 
13f60 61 66 74 65 72 20 25 25 74 79 70 65 20 6b 65 79  after %%type key
13f70 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20  word");.        
13f80 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
13f90 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
13fa0 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
13fb0 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
13fc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13fd0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
13fe0 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66  l *sp = Symbol_f
13ff0 69 6e 64 28 78 29 3b 0a 20 20 20 20 20 20 20 20  ind(x);.        
14000 69 66 28 28 73 70 29 20 26 26 20 28 73 70 2d 3e  if((sp) && (sp->
14010 64 61 74 61 74 79 70 65 29 29 7b 0a 20 20 20 20  datatype)){.    
14020 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
14030 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
14040 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
14050 20 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62             "Symb
14060 6f 6c 20 25 25 74 79 70 65 20 5c 22 25 73 5c 22  ol %%type \"%s\"
14070 20 61 6c 72 65 61 64 79 20 64 65 66 69 6e 65 64   already defined
14080 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20  ", x);.         
14090 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
140a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
140b0 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
140c0 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
140d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
140e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21  .          if (!
140f0 73 70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  sp){.           
14100 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77   sp = Symbol_new
14110 28 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (x);.          }
14120 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
14130 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73  declargslot = &s
14140 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20  p->datatype;.   
14150 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
14160 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
14170 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
14180 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
14190 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20  FOR_DECL_ARG;.  
141a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
141b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
141c0 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
141d0 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
141e0 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 78  BOL:.      if( x
141f0 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
14200 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
14210 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
14220 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
14230 20 7d 65 6c 73 65 20 69 66 28 20 49 53 55 50 50   }else if( ISUPP
14240 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ER(x[0]) ){.    
14250 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
14260 6c 20 2a 73 70 3b 0a 20 20 20 20 20 20 20 20 73  l *sp;.        s
14270 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  p = Symbol_new(x
14280 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
14290 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20  p->prec>=0 ){.  
142a0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
142b0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
142c0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
142d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53 79  .            "Sy
142e0 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 68 61 73 20  mbol \"%s\" has 
142f0 61 6c 72 65 61 64 79 20 62 65 20 67 69 76 65 6e  already be given
14300 20 61 20 70 72 65 63 65 64 65 6e 63 65 2e 22 2c   a precedence.",
14310 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
14320 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
14330 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
14340 20 20 20 20 20 20 20 20 73 70 2d 3e 70 72 65 63          sp->prec
14350 20 3d 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e   = psp->preccoun
14360 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ter;.          s
14370 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73 70 2d 3e  p->assoc = psp->
14380 64 65 63 6c 61 73 73 6f 63 3b 0a 20 20 20 20 20  declassoc;.     
14390 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
143a0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
143b0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
143c0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
143d0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 61  o,.          "Ca
143e0 6e 27 74 20 61 73 73 69 67 6e 20 61 20 70 72 65  n't assign a pre
143f0 63 65 64 65 6e 63 65 20 74 6f 20 5c 22 25 73 5c  cedence to \"%s\
14400 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20  ".",x);.        
14410 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
14420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
14430 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
14440 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
14450 41 52 47 3a 0a 20 20 20 20 20 20 69 66 28 20 78  ARG:.      if( x
14460 5b 30 5d 3d 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d  [0]=='{' || x[0]
14470 3d 3d 27 5c 22 27 20 7c 7c 20 49 53 41 4c 4e 55  =='\"' || ISALNU
14480 4d 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  M(x[0]) ){.     
14490 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
144a0 4f 6c 64 2c 20 2a 7a 4e 65 77 3b 0a 20 20 20 20  Old, *zNew;.    
144b0 20 20 20 20 63 68 61 72 20 2a 7a 42 75 66 2c 20      char *zBuf, 
144c0 2a 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  *z;.        int 
144d0 6e 4f 6c 64 2c 20 6e 2c 20 6e 4c 69 6e 65 20 3d  nOld, n, nLine =
144e0 20 30 2c 20 6e 4e 65 77 2c 20 6e 42 61 63 6b 3b   0, nNew, nBack;
144f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64  .        int add
14500 4c 69 6e 65 4d 61 63 72 6f 3b 0a 20 20 20 20 20  LineMacro;.     
14510 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 35 30     char zLine[50
14520 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 20  ];.        zNew 
14530 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = x;.        if(
14540 20 7a 4e 65 77 5b 30 5d 3d 3d 27 22 27 20 7c 7c   zNew[0]=='"' ||
14550 20 7a 4e 65 77 5b 30 5d 3d 3d 27 7b 27 20 29 20   zNew[0]=='{' ) 
14560 7a 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20  zNew++;.        
14570 6e 4e 65 77 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c  nNew = lemonStrl
14580 65 6e 28 7a 4e 65 77 29 3b 0a 20 20 20 20 20 20  en(zNew);.      
14590 20 20 69 66 28 20 2a 70 73 70 2d 3e 64 65 63 6c    if( *psp->decl
145a0 61 72 67 73 6c 6f 74 20 29 7b 0a 20 20 20 20 20  argslot ){.     
145b0 20 20 20 20 20 7a 4f 6c 64 20 3d 20 2a 70 73 70       zOld = *psp
145c0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 3b 0a 20  ->declargslot;. 
145d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
145e0 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20 22          zOld = "
145f0 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
14600 20 20 20 20 20 6e 4f 6c 64 20 3d 20 6c 65 6d 6f       nOld = lemo
14610 6e 53 74 72 6c 65 6e 28 7a 4f 6c 64 29 3b 0a 20  nStrlen(zOld);. 
14620 20 20 20 20 20 20 20 6e 20 3d 20 6e 4f 6c 64 20         n = nOld 
14630 2b 20 6e 4e 65 77 20 2b 20 32 30 3b 0a 20 20 20  + nNew + 20;.   
14640 20 20 20 20 20 61 64 64 4c 69 6e 65 4d 61 63 72       addLineMacr
14650 6f 20 3d 20 21 70 73 70 2d 3e 67 70 2d 3e 6e 6f  o = !psp->gp->no
14660 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 26 26 20 70  linenosflag && p
14670 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
14680 63 72 6f 20 26 26 0a 20 20 20 20 20 20 20 20 20  cro &&.         
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
146a0 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73  psp->decllinenos
146b0 6c 6f 74 3d 3d 30 20 7c 7c 20 70 73 70 2d 3e 64  lot==0 || psp->d
146c0 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d  ecllinenoslot[0]
146d0 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  !=0);.        if
146e0 28 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 29  ( addLineMacro )
146f0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
14700 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  z=psp->filename,
14710 20 6e 42 61 63 6b 3d 30 3b 20 2a 7a 3b 20 7a 2b   nBack=0; *z; z+
14720 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
14730 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29 20 6e  if( *z=='\\' ) n
14740 42 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Back++;.        
14750 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6c 65    }.          le
14760 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a 4c 69 6e  mon_sprintf(zLin
14770 65 2c 20 22 23 6c 69 6e 65 20 25 64 20 22 2c 20  e, "#line %d ", 
14780 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
14790 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 69  );.          nLi
147a0 6e 65 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  ne = lemonStrlen
147b0 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20  (zLine);.       
147c0 20 20 20 6e 20 2b 3d 20 6e 4c 69 6e 65 20 2b 20     n += nLine + 
147d0 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 73 70 2d  lemonStrlen(psp-
147e0 3e 66 69 6c 65 6e 61 6d 65 29 20 2b 20 6e 42 61  >filename) + nBa
147f0 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
14800 20 20 20 20 20 20 2a 70 73 70 2d 3e 64 65 63 6c        *psp->decl
14810 61 72 67 73 6c 6f 74 20 3d 20 28 63 68 61 72 20  argslot = (char 
14820 2a 29 20 72 65 61 6c 6c 6f 63 28 2a 70 73 70 2d  *) realloc(*psp-
14830 3e 64 65 63 6c 61 72 67 73 6c 6f 74 2c 20 6e 29  >declargslot, n)
14840 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 20 3d  ;.        zBuf =
14850 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c   *psp->declargsl
14860 6f 74 20 2b 20 6e 4f 6c 64 3b 0a 20 20 20 20 20  ot + nOld;.     
14870 20 20 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61     if( addLineMa
14880 63 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  cro ){.         
14890 20 69 66 28 20 6e 4f 6c 64 20 26 26 20 7a 42 75   if( nOld && zBu
148a0 66 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20  f[-1]!='\n' ){. 
148b0 20 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75             *(zBu
148c0 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20  f++) = '\n';.   
148d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
148e0 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
148f0 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20  zLine, nLine);. 
14900 20 20 20 20 20 20 20 20 20 7a 42 75 66 20 2b 3d           zBuf +=
14910 20 6e 4c 69 6e 65 3b 0a 20 20 20 20 20 20 20 20   nLine;.        
14920 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22    *(zBuf++) = '"
14930 27 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ';.          for
14940 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  (z=psp->filename
14950 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20  ; *z; z++){.    
14960 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d          if( *z==
14970 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\\' ){.        
14980 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20        *(zBuf++) 
14990 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20 20 20 20  = '\\';.        
149a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
149b0 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 2a 7a    *(zBuf++) = *z
149c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
149d0 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b          *(zBuf++
149e0 29 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 20  ) = '"';.       
149f0 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27     *(zBuf++) = '
14a00 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  \n';.        }. 
14a10 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e         if( psp->
14a20 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 26  decllinenoslot &
14a30 26 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e  & psp->decllinen
14a40 6f 73 6c 6f 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20  oslot[0]==0 ){. 
14a50 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
14a60 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 20  cllinenoslot[0] 
14a70 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  = psp->tokenline
14a80 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  no;.        }.  
14a90 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
14aa0 66 2c 20 7a 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a  f, zNew, nNew);.
14ab0 20 20 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20          zBuf += 
14ac0 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 2a 7a  nNew;.        *z
14ad0 42 75 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Buf = 0;.       
14ae0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
14af0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
14b00 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65  R_RULE;.      }e
14b10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
14b20 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
14b30 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
14b40 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
14b50 22 49 6c 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e  "Illegal argumen
14b60 74 20 74 6f 20 25 25 25 73 3a 20 25 73 22 2c 70  t to %%%s: %s",p
14b70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 2c  sp->declkeyword,
14b80 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
14b90 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
14ba0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
14bb0 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
14bc0 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
14bd0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
14be0 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
14bf0 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44  _FOR_FALLBACK_ID
14c00 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
14c10 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='.' ){.       
14c20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
14c30 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
14c40 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65  R_RULE;.      }e
14c50 6c 73 65 20 69 66 28 20 21 49 53 55 50 50 45 52  lse if( !ISUPPER
14c60 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
14c70 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
14c80 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74  filename, psp->t
14c90 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
14ca0 20 20 20 20 20 20 22 25 25 66 61 6c 6c 62 61 63        "%%fallbac
14cb0 6b 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c  k argument \"%s\
14cc0 22 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f  " should be a to
14cd0 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20  ken", x);.      
14ce0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
14cf0 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
14d00 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
14d10 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62  ymbol *sp = Symb
14d20 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
14d30 20 20 20 69 66 28 20 70 73 70 2d 3e 66 61 6c 6c     if( psp->fall
14d40 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  back==0 ){.     
14d50 20 20 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61       psp->fallba
14d60 63 6b 20 3d 20 73 70 3b 0a 20 20 20 20 20 20 20  ck = sp;.       
14d70 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 66   }else if( sp->f
14d80 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
14d90 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
14da0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70  p->filename, psp
14db0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
14dc0 20 20 20 20 20 20 20 20 20 20 20 22 4d 6f 72 65             "More
14dd0 20 74 68 61 6e 20 6f 6e 65 20 66 61 6c 6c 62 61   than one fallba
14de0 63 6b 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ck assigned to t
14df0 6f 6b 65 6e 20 25 73 22 2c 20 78 29 3b 0a 20 20  oken %s", x);.  
14e00 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
14e10 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
14e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14e30 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d    sp->fallback =
14e40 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3b 0a   psp->fallback;.
14e50 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67            psp->g
14e60 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20  p->has_fallback 
14e70 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
14e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14e90 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
14ea0 54 49 4e 47 5f 46 4f 52 5f 54 4f 4b 45 4e 5f 4e  TING_FOR_TOKEN_N
14eb0 41 4d 45 3a 0a 20 20 20 20 20 20 2f 2a 20 54 6f  AME:.      /* To
14ec0 6b 65 6e 73 20 64 6f 20 6e 6f 74 20 68 61 76 65  kens do not have
14ed0 20 74 6f 20 62 65 20 64 65 63 6c 61 72 65 64 20   to be declared 
14ee0 62 65 66 6f 72 65 20 75 73 65 2e 20 20 42 75 74  before use.  But
14ef0 20 74 68 65 79 20 63 61 6e 20 62 65 0a 20 20 20   they can be.   
14f00 20 20 20 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74     ** in order t
14f10 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 69 72 20  o control their 
14f20 61 73 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  assigned integer
14f30 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6e 75   number.  The nu
14f40 6d 62 65 72 20 66 6f 72 0a 20 20 20 20 20 20 2a  mber for.      *
14f50 2a 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 73 20  * each token is 
14f60 61 73 73 69 67 6e 65 64 20 77 68 65 6e 20 69 74  assigned when it
14f70 20 69 73 20 66 69 72 73 74 20 73 65 65 6e 2e 20   is first seen. 
14f80 20 53 6f 20 62 79 20 69 6e 63 6c 75 64 69 6e 67   So by including
14f90 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
14fa0 2a 2a 20 20 20 20 20 25 74 6f 6b 65 6e 20 4f 4e  **     %token ON
14fb0 45 20 54 57 4f 20 54 48 52 45 45 0a 20 20 20 20  E TWO THREE.    
14fc0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 65 61    **.      ** ea
14fd0 72 6c 79 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  rly in the gramm
14fe0 61 72 20 66 69 6c 65 2c 20 74 68 61 74 20 61 73  ar file, that as
14ff0 73 69 67 6e 73 20 73 6d 61 6c 6c 20 63 6f 6e 73  signs small cons
15000 65 63 75 74 69 76 65 20 76 61 6c 75 65 73 0a 20  ecutive values. 
15010 20 20 20 20 20 2a 2a 20 74 6f 20 65 61 63 68 20       ** to each 
15020 6f 66 20 74 68 65 20 74 6f 6b 65 6e 73 20 4f 4e  of the tokens ON
15030 45 20 54 57 4f 20 61 6e 64 20 54 48 52 45 45 2e  E TWO and THREE.
15040 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15050 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b  if( x[0]=='.' ){
15060 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
15070 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
15080 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
15090 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
150a0 21 49 53 55 50 50 45 52 28 78 5b 30 5d 29 20 29  !ISUPPER(x[0]) )
150b0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
150c0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
150d0 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  , psp->tokenline
150e0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25  no,.          "%
150f0 25 74 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74 20  %token argument 
15100 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65  \"%s\" should be
15110 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20   a token", x);. 
15120 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
15130 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  rcnt++;.      }e
15140 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 28 76 6f  lse{.        (vo
15150 69 64 29 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29  id)Symbol_new(x)
15160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15170 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
15180 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44  WAITING_FOR_WILD
15190 43 41 52 44 5f 49 44 3a 0a 20 20 20 20 20 20 69  CARD_ID:.      i
151a0 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  f( x[0]=='.' ){.
151b0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
151c0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
151d0 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
151e0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
151f0 49 53 55 50 50 45 52 28 78 5b 30 5d 29 20 29 7b  ISUPPER(x[0]) ){
15200 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
15210 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
15220 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
15230 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 25  o,.          "%%
15240 77 69 6c 64 63 61 72 64 20 61 72 67 75 6d 65 6e  wildcard argumen
15250 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20  t \"%s\" should 
15260 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b  be a token", x);
15270 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
15280 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
15290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
152a0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
152b0 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
152c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  ;.        if( ps
152d0 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61 72 64 3d  p->gp->wildcard=
152e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
152f0 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61 72  psp->gp->wildcar
15300 64 20 3d 20 73 70 3b 0a 20 20 20 20 20 20 20 20  d = sp;.        
15310 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
15320 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
15330 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f  ilename, psp->to
15340 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
15350 20 20 20 20 20 20 20 22 45 78 74 72 61 20 77 69         "Extra wi
15360 6c 64 63 61 72 64 20 74 6f 20 74 6f 6b 65 6e 3a  ldcard to token:
15370 20 25 73 22 2c 20 78 29 3b 0a 20 20 20 20 20 20   %s", x);.      
15380 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
15390 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
153a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
153b0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
153c0 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 49  TING_FOR_CLASS_I
153d0 44 3a 0a 20 20 20 20 20 20 69 66 28 20 21 49 53  D:.      if( !IS
153e0 4c 4f 57 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20  LOWER(x[0]) ){. 
153f0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
15400 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70  psp->filename, p
15410 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
15420 0a 20 20 20 20 20 20 20 20 20 20 22 25 25 74 6f  .          "%%to
15430 6b 65 6e 5f 63 6c 61 73 73 20 6d 75 73 74 20 62  ken_class must b
15440 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  e followed by an
15450 20 69 64 65 6e 74 69 66 69 65 72 3a 20 22 2c 20   identifier: ", 
15460 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
15470 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
15480 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
15490 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
154a0 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
154b0 7d 65 6c 73 65 20 69 66 28 20 53 79 6d 62 6f 6c  }else if( Symbol
154c0 5f 66 69 6e 64 28 78 29 20 29 7b 0a 20 20 20 20  _find(x) ){.    
154d0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
154e0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
154f0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
15500 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20          "Symbol 
15510 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20 75  \"%s\" already u
15520 73 65 64 22 2c 20 78 29 3b 0a 20 20 20 20 20 20  sed", x);.      
15530 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
15540 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
15550 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
15560 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
15570 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15580 20 20 20 20 20 20 70 73 70 2d 3e 74 6b 63 6c 61        psp->tkcla
15590 73 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  ss = Symbol_new(
155a0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
155b0 3e 74 6b 63 6c 61 73 73 2d 3e 74 79 70 65 20 3d  >tkclass->type =
155c0 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 3b 0a   MULTITERMINAL;.
155d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
155e0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
155f0 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 3b 0a 20 20  _CLASS_TOKEN;.  
15600 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
15610 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
15620 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 54 4f  ING_FOR_CLASS_TO
15630 4b 45 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 78  KEN:.      if( x
15640 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
15650 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
15660 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
15670 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
15680 20 7d 65 6c 73 65 20 69 66 28 20 49 53 55 50 50   }else if( ISUPP
15690 45 52 28 78 5b 30 5d 29 20 7c 7c 20 28 28 78 5b  ER(x[0]) || ((x[
156a0 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78 5b 30 5d 3d  0]=='|' || x[0]=
156b0 3d 27 2f 27 29 20 26 26 20 49 53 55 50 50 45 52  ='/') && ISUPPER
156c0 28 78 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 20  (x[1])) ){.     
156d0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
156e0 20 2a 6d 73 70 20 3d 20 70 73 70 2d 3e 74 6b 63   *msp = psp->tkc
156f0 6c 61 73 73 3b 0a 20 20 20 20 20 20 20 20 6d 73  lass;.        ms
15700 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b 3b 0a 20 20  p->nsubsym++;.  
15710 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79        msp->subsy
15720 6d 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  m = (struct symb
15730 6f 6c 20 2a 2a 29 20 72 65 61 6c 6c 6f 63 28 6d  ol **) realloc(m
15740 73 70 2d 3e 73 75 62 73 79 6d 2c 0a 20 20 20 20  sp->subsym,.    
15750 20 20 20 20 20 20 73 69 7a 65 6f 66 28 73 74 72        sizeof(str
15760 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a 6d 73 70  uct symbol*)*msp
15770 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a 20 20 20 20  ->nsubsym);.    
15780 20 20 20 20 69 66 28 20 21 49 53 55 50 50 45 52      if( !ISUPPER
15790 28 78 5b 30 5d 29 20 29 20 78 2b 2b 3b 0a 20 20  (x[0]) ) x++;.  
157a0 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79        msp->subsy
157b0 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2d 31  m[msp->nsubsym-1
157c0 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  ] = Symbol_new(x
157d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
157e0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
157f0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
15800 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
15810 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 25 74  ,.          "%%t
15820 6f 6b 65 6e 5f 63 6c 61 73 73 20 61 72 67 75 6d  oken_class argum
15830 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c  ent \"%s\" shoul
15840 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78  d be a token", x
15850 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
15860 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
15870 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
15880 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
15890 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
158a0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
158b0 20 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41     case RESYNC_A
158c0 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3a  FTER_RULE_ERROR:
158d0 0a 2f 2a 20 20 20 20 20 20 69 66 28 20 78 5b 30  ./*      if( x[0
158e0 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74  ]=='.' ) psp->st
158f0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
15900 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
15910 2a 2a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2a  **      break; *
15920 2f 0a 20 20 20 20 63 61 73 65 20 52 45 53 59 4e  /.    case RESYN
15930 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
15940 4f 52 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  OR:.      if( x[
15950 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73  0]=='.' ) psp->s
15960 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
15970 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
15980 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
15990 3d 27 25 27 20 29 20 70 73 70 2d 3e 73 74 61 74  ='%' ) psp->stat
159a0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
159b0 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20  DECL_KEYWORD;.  
159c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d      break;.  }.}
159d0 0a 0a 2f 2a 20 52 75 6e 20 74 68 65 20 70 72 65  ../* Run the pre
159e0 70 72 6f 63 65 73 73 6f 72 20 6f 76 65 72 20 74  processor over t
159f0 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 74 65  he input file te
15a00 78 74 2e 20 20 54 68 65 20 67 6c 6f 62 61 6c 20  xt.  The global 
15a10 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 61 7a 44  variables.** azD
15a20 65 66 69 6e 65 5b 30 5d 20 74 68 72 6f 75 67 68  efine[0] through
15a30 20 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e   azDefine[nDefin
15a40 65 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68  e-1] contains th
15a50 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 64  e names of all d
15a60 65 66 69 6e 65 64 0a 2a 2a 20 6d 61 63 72 6f 73  efined.** macros
15a70 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
15a80 6c 6f 6f 6b 73 20 66 6f 72 20 22 25 69 66 64 65  looks for "%ifde
15a90 66 22 20 61 6e 64 20 22 25 69 66 6e 64 65 66 22  f" and "%ifndef"
15aa0 20 61 6e 64 20 22 25 65 6e 64 69 66 22 20 61 6e   and "%endif" an
15ab0 64 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73 20 74 68  d.** comments th
15ac0 65 6d 20 6f 75 74 2e 20 20 54 65 78 74 20 69 6e  em out.  Text in
15ad0 20 62 65 74 77 65 65 6e 20 69 73 20 61 6c 73 6f   between is also
15ae0 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 20 61   commented out a
15af0 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  s appropriate..*
15b00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
15b10 65 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 63  eprocess_input(c
15b20 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
15b30 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74  , j, k, n;.  int
15b40 20 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20   exclude = 0;.  
15b50 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20  int start = 0;. 
15b60 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b   int lineno = 1;
15b70 0a 20 20 69 6e 74 20 73 74 61 72 74 5f 6c 69 6e  .  int start_lin
15b80 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69  eno = 1;.  for(i
15b90 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
15ba0 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c      if( z[i]=='\
15bb0 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n' ) lineno++;. 
15bc0 20 20 20 69 66 28 20 7a 5b 69 5d 21 3d 27 25 27     if( z[i]!='%'
15bd0 20 7c 7c 20 28 69 3e 30 20 26 26 20 7a 5b 69 2d   || (i>0 && z[i-
15be0 31 5d 21 3d 27 5c 6e 27 29 20 29 20 63 6f 6e 74  1]!='\n') ) cont
15bf0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74  inue;.    if( st
15c00 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 65 6e  rncmp(&z[i],"%en
15c10 64 69 66 22 2c 36 29 3d 3d 30 20 26 26 20 49 53  dif",6)==0 && IS
15c20 53 50 41 43 45 28 7a 5b 69 2b 36 5d 29 20 29 7b  SPACE(z[i+6]) ){
15c30 0a 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75  .      if( exclu
15c40 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78  de ){.        ex
15c50 63 6c 75 64 65 2d 2d 3b 0a 20 20 20 20 20 20 20  clude--;.       
15c60 20 69 66 28 20 65 78 63 6c 75 64 65 3d 3d 30 20   if( exclude==0 
15c70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
15c80 28 6a 3d 73 74 61 72 74 3b 20 6a 3c 69 3b 20 6a  (j=start; j<i; j
15c90 2b 2b 29 20 69 66 28 20 7a 5b 6a 5d 21 3d 27 5c  ++) if( z[j]!='\
15ca0 6e 27 20 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b  n' ) z[j] = ' ';
15cb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15cc0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69   }.      for(j=i
15cd0 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d  ; z[j] && z[j]!=
15ce0 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20  '\n'; j++) z[j] 
15cf0 3d 20 27 20 27 3b 0a 20 20 20 20 7d 65 6c 73 65  = ' ';.    }else
15d00 20 69 66 28 20 28 73 74 72 6e 63 6d 70 28 26 7a   if( (strncmp(&z
15d10 5b 69 5d 2c 22 25 69 66 64 65 66 22 2c 36 29 3d  [i],"%ifdef",6)=
15d20 3d 30 20 26 26 20 49 53 53 50 41 43 45 28 7a 5b  =0 && ISSPACE(z[
15d30 69 2b 36 5d 29 29 0a 20 20 20 20 20 20 20 20 20  i+6])).         
15d40 20 7c 7c 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b   || (strncmp(&z[
15d50 69 5d 2c 22 25 69 66 6e 64 65 66 22 2c 37 29 3d  i],"%ifndef",7)=
15d60 3d 30 20 26 26 20 49 53 53 50 41 43 45 28 7a 5b  =0 && ISSPACE(z[
15d70 69 2b 37 5d 29 29 20 29 7b 0a 20 20 20 20 20 20  i+7])) ){.      
15d80 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20  if( exclude ){. 
15d90 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 2b 2b         exclude++
15da0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15db0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 37         for(j=i+7
15dc0 3b 20 49 53 53 50 41 43 45 28 7a 5b 6a 5d 29 3b  ; ISSPACE(z[j]);
15dd0 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   j++){}.        
15de0 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b 6e 5d 20  for(n=0; z[j+n] 
15df0 26 26 20 21 49 53 53 50 41 43 45 28 7a 5b 6a 2b  && !ISSPACE(z[j+
15e00 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  n]); n++){}.    
15e10 20 20 20 20 65 78 63 6c 75 64 65 20 3d 20 31 3b      exclude = 1;
15e20 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  .        for(k=0
15e30 3b 20 6b 3c 6e 44 65 66 69 6e 65 3b 20 6b 2b 2b  ; k<nDefine; k++
15e40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
15e50 20 73 74 72 6e 63 6d 70 28 61 7a 44 65 66 69 6e   strncmp(azDefin
15e60 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29 3d 3d 30  e[k],&z[j],n)==0
15e70 20 26 26 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28   && lemonStrlen(
15e80 61 7a 44 65 66 69 6e 65 5b 6b 5d 29 3d 3d 6e 20  azDefine[k])==n 
15e90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  ){.            e
15ea0 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 20 20  xclude = 0;.    
15eb0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15ec0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15ed0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
15ee0 20 7a 5b 69 2b 33 5d 3d 3d 27 6e 27 20 29 20 65   z[i+3]=='n' ) e
15ef0 78 63 6c 75 64 65 20 3d 20 21 65 78 63 6c 75 64  xclude = !exclud
15f00 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  e;.        if( e
15f10 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20  xclude ){.      
15f20 20 20 20 20 73 74 61 72 74 20 3d 20 69 3b 0a 20      start = i;. 
15f30 20 20 20 20 20 20 20 20 20 73 74 61 72 74 5f 6c           start_l
15f40 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a  ineno = lineno;.
15f50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15f60 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b  }.      for(j=i;
15f70 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27   z[j] && z[j]!='
15f80 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d  \n'; j++) z[j] =
15f90 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   ' ';.    }.  }.
15fa0 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b    if( exclude ){
15fb0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
15fc0 65 72 72 2c 22 75 6e 74 65 72 6d 69 6e 61 74 65  err,"unterminate
15fd0 64 20 25 25 69 66 64 65 66 20 73 74 61 72 74 69  d %%ifdef starti
15fe0 6e 67 20 6f 6e 20 6c 69 6e 65 20 25 64 5c 6e 22  ng on line %d\n"
15ff0 2c 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 29 3b  , start_lineno);
16000 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
16010 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70 69 74 65  }.}../* In spite
16020 20 6f 66 20 69 74 73 20 6e 61 6d 65 2c 20 74 68   of its name, th
16030 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  is function is r
16040 65 61 6c 6c 79 20 61 20 73 63 61 6e 6e 65 72 2e  eally a scanner.
16050 20 20 49 74 20 72 65 61 64 0a 2a 2a 20 69 6e 20    It read.** in 
16060 74 68 65 20 65 6e 74 69 72 65 20 69 6e 70 75 74  the entire input
16070 20 66 69 6c 65 20 28 61 6c 6c 20 61 74 20 6f 6e   file (all at on
16080 63 65 29 20 74 68 65 6e 20 74 6f 6b 65 6e 69 7a  ce) then tokeniz
16090 65 73 20 69 74 2e 20 20 45 61 63 68 0a 2a 2a 20  es it.  Each.** 
160a0 74 6f 6b 65 6e 20 69 73 20 70 61 73 73 65 64 20  token is passed 
160b0 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
160c0 22 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 22 20  "parseonetoken" 
160d0 77 68 69 63 68 20 62 75 69 6c 64 73 20 61 6c 6c  which builds all
160e0 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
160f0 61 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ate data structu
16100 72 65 73 20 69 6e 20 74 68 65 20 67 6c 6f 62 61  res in the globa
16110 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 22  l state vector "
16120 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20 50 61 72  gp"..*/.void Par
16130 73 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  se(struct lemon 
16140 2a 67 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  *gp).{.  struct 
16150 70 73 74 61 74 65 20 70 73 3b 0a 20 20 46 49 4c  pstate ps;.  FIL
16160 45 20 2a 66 70 3b 0a 20 20 63 68 61 72 20 2a 66  E *fp;.  char *f
16170 69 6c 65 62 75 66 3b 0a 20 20 75 6e 73 69 67 6e  ilebuf;.  unsign
16180 65 64 20 69 6e 74 20 66 69 6c 65 73 69 7a 65 3b  ed int filesize;
16190 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a 20  .  int lineno;. 
161a0 20 69 6e 74 20 63 3b 0a 20 20 63 68 61 72 20 2a   int c;.  char *
161b0 63 70 2c 20 2a 6e 65 78 74 63 70 3b 0a 20 20 69  cp, *nextcp;.  i
161c0 6e 74 20 73 74 61 72 74 6c 69 6e 65 20 3d 20 30  nt startline = 0
161d0 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 70 73 2c  ;..  memset(&ps,
161e0 20 27 5c 30 27 2c 20 73 69 7a 65 6f 66 28 70 73   '\0', sizeof(ps
161f0 29 29 3b 0a 20 20 70 73 2e 67 70 20 3d 20 67 70  ));.  ps.gp = gp
16200 3b 0a 20 20 70 73 2e 66 69 6c 65 6e 61 6d 65 20  ;.  ps.filename 
16210 3d 20 67 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b 0a  = gp->filename;.
16220 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 20 3d 20    ps.errorcnt = 
16230 30 3b 0a 20 20 70 73 2e 73 74 61 74 65 20 3d 20  0;.  ps.state = 
16240 49 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a 20 20 2f  INITIALIZE;..  /
16250 2a 20 42 65 67 69 6e 20 62 79 20 72 65 61 64 69  * Begin by readi
16260 6e 67 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  ng the input fil
16270 65 20 2a 2f 0a 20 20 66 70 20 3d 20 66 6f 70 65  e */.  fp = fope
16280 6e 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 22 72  n(ps.filename,"r
16290 62 22 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30  b");.  if( fp==0
162a0 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67   ){.    ErrorMsg
162b0 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22  (ps.filename,0,"
162c0 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 69 73 20  Can't open this 
162d0 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67  file for reading
162e0 2e 22 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72  .");.    gp->err
162f0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
16300 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b  urn;.  }.  fseek
16310 28 66 70 2c 30 2c 32 29 3b 0a 20 20 66 69 6c 65  (fp,0,2);.  file
16320 73 69 7a 65 20 3d 20 66 74 65 6c 6c 28 66 70 29  size = ftell(fp)
16330 3b 0a 20 20 72 65 77 69 6e 64 28 66 70 29 3b 0a  ;.  rewind(fp);.
16340 20 20 66 69 6c 65 62 75 66 20 3d 20 28 63 68 61    filebuf = (cha
16350 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 66 69 6c 65  r *)malloc( file
16360 73 69 7a 65 2b 31 20 29 3b 0a 20 20 69 66 28 20  size+1 );.  if( 
16370 66 69 6c 65 73 69 7a 65 3e 31 30 30 30 30 30 30  filesize>1000000
16380 30 30 20 7c 7c 20 66 69 6c 65 62 75 66 3d 3d 30  00 || filebuf==0
16390 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67   ){.    ErrorMsg
163a0 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22  (ps.filename,0,"
163b0 49 6e 70 75 74 20 66 69 6c 65 20 74 6f 6f 20 6c  Input file too l
163c0 61 72 67 65 2e 22 29 3b 0a 20 20 20 20 67 70 2d  arge.");.    gp-
163d0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
163e0 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 20   fclose(fp);.   
163f0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
16400 66 28 20 66 72 65 61 64 28 66 69 6c 65 62 75 66  f( fread(filebuf
16410 2c 31 2c 66 69 6c 65 73 69 7a 65 2c 66 70 29 21  ,1,filesize,fp)!
16420 3d 66 69 6c 65 73 69 7a 65 20 29 7b 0a 20 20 20  =filesize ){.   
16430 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c   ErrorMsg(ps.fil
16440 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 72  ename,0,"Can't r
16450 65 61 64 20 69 6e 20 61 6c 6c 20 25 64 20 62 79  ead in all %d by
16460 74 65 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65  tes of this file
16470 2e 22 2c 0a 20 20 20 20 20 20 66 69 6c 65 73 69  .",.      filesi
16480 7a 65 29 3b 0a 20 20 20 20 66 72 65 65 28 66 69  ze);.    free(fi
16490 6c 65 62 75 66 29 3b 0a 20 20 20 20 67 70 2d 3e  lebuf);.    gp->
164a0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
164b0 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 20 20  fclose(fp);.    
164c0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 63  return;.  }.  fc
164d0 6c 6f 73 65 28 66 70 29 3b 0a 20 20 66 69 6c 65  lose(fp);.  file
164e0 62 75 66 5b 66 69 6c 65 73 69 7a 65 5d 20 3d 20  buf[filesize] = 
164f0 30 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 6e  0;..  /* Make an
16500 20 69 6e 69 74 69 61 6c 20 70 61 73 73 20 74 68   initial pass th
16510 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 20 74  rough the file t
16520 6f 20 68 61 6e 64 6c 65 20 25 69 66 64 65 66 20  o handle %ifdef 
16530 61 6e 64 20 25 69 66 6e 64 65 66 20 2a 2f 0a 20  and %ifndef */. 
16540 20 70 72 65 70 72 6f 63 65 73 73 5f 69 6e 70 75   preprocess_inpu
16550 74 28 66 69 6c 65 62 75 66 29 3b 0a 0a 20 20 2f  t(filebuf);..  /
16560 2a 20 4e 6f 77 20 73 63 61 6e 20 74 68 65 20 74  * Now scan the t
16570 65 78 74 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ext of the input
16580 20 66 69 6c 65 20 2a 2f 0a 20 20 6c 69 6e 65 6e   file */.  linen
16590 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28 63 70 3d  o = 1;.  for(cp=
165a0 66 69 6c 65 62 75 66 3b 20 28 63 3d 20 2a 63 70  filebuf; (c= *cp
165b0 29 21 3d 30 3b 20 29 7b 0a 20 20 20 20 69 66 28  )!=0; ){.    if(
165c0 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e   c=='\n' ) linen
165d0 6f 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20  o++;            
165e0 20 20 2f 2a 20 4b 65 65 70 20 74 72 61 63 6b 20    /* Keep track 
165f0 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62  of the line numb
16600 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53  er */.    if( IS
16610 53 50 41 43 45 28 63 29 20 29 7b 20 63 70 2b 2b  SPACE(c) ){ cp++
16620 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 20 20 2f  ; continue; }  /
16630 2a 20 53 6b 69 70 20 61 6c 6c 20 77 68 69 74 65  * Skip all white
16640 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 66   space */.    if
16650 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31  ( c=='/' && cp[1
16660 5d 3d 3d 27 2f 27 20 29 7b 20 20 20 20 20 20 20  ]=='/' ){       
16670 20 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73     /* Skip C++ s
16680 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f  tyle comments */
16690 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20  .      cp+=2;.  
166a0 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a      while( (c= *
166b0 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e  cp)!=0 && c!='\n
166c0 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20  ' ) cp++;.      
166d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
166e0 20 20 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26      if( c=='/' &
166f0 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20  & cp[1]=='*' ){ 
16700 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70           /* Skip
16710 20 43 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74   C style comment
16720 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32  s */.      cp+=2
16730 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  ;.      while( (
16740 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63  c= *cp)!=0 && (c
16750 21 3d 27 2f 27 20 7c 7c 20 63 70 5b 2d 31 5d 21  !='/' || cp[-1]!
16760 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='*') ){.       
16770 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
16780 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
16790 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20   cp++;.      }. 
167a0 20 20 20 20 20 69 66 28 20 63 20 29 20 63 70 2b       if( c ) cp+
167b0 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  +;.      continu
167c0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 73 2e  e;.    }.    ps.
167d0 74 6f 6b 65 6e 73 74 61 72 74 20 3d 20 63 70 3b  tokenstart = cp;
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167f0 2f 2a 20 4d 61 72 6b 20 74 68 65 20 62 65 67 69  /* Mark the begi
16800 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 6f 6b  nning of the tok
16810 65 6e 20 2a 2f 0a 20 20 20 20 70 73 2e 74 6f 6b  en */.    ps.tok
16820 65 6e 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e  enlineno = linen
16830 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
16840 4c 69 6e 65 6e 75 6d 62 65 72 20 6f 6e 20 77 68  Linenumber on wh
16850 69 63 68 20 74 6f 6b 65 6e 20 62 65 67 69 6e 73  ich token begins
16860 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   */.    if( c=='
16870 5c 22 27 20 29 7b 20 20 20 20 20 20 20 20 20 20  \"' ){          
16880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
16890 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 20 2a 2f  ring literals */
168a0 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20  .      cp++;.   
168b0 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63     while( (c= *c
168c0 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 22 27  p)!=0 && c!='\"'
168d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
168e0 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  c=='\n' ) lineno
168f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b 2b  ++;.        cp++
16900 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16910 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
16920 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e      ErrorMsg(ps.
16930 66 69 6c 65 6e 61 6d 65 2c 73 74 61 72 74 6c 69  filename,startli
16940 6e 65 2c 0a 22 53 74 72 69 6e 67 20 73 74 61 72  ne,."String star
16950 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e  ting on this lin
16960 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61  e is not termina
16970 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 65  ted before the e
16980 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 22  nd of the file."
16990 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e 65 72  );.        ps.er
169a0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
169b0 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20    nextcp = cp;. 
169c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
169d0 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 2b      nextcp = cp+
169e0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
169f0 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20  else if( c=='{' 
16a00 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
16a10 20 2f 2a 20 41 20 62 6c 6f 63 6b 20 6f 66 20 43   /* A block of C
16a20 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 69   code */.      i
16a30 6e 74 20 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20  nt level;.      
16a40 63 70 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28  cp++;.      for(
16a50 6c 65 76 65 6c 3d 31 3b 20 28 63 3d 20 2a 63 70  level=1; (c= *cp
16a60 29 21 3d 30 20 26 26 20 28 6c 65 76 65 6c 3e 31  )!=0 && (level>1
16a70 20 7c 7c 20 63 21 3d 27 7d 27 29 3b 20 63 70 2b   || c!='}'); cp+
16a80 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
16a90 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  c=='\n' ) lineno
16aa0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65  ++;.        else
16ab0 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 20 6c 65   if( c=='{' ) le
16ac0 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65  vel++;.        e
16ad0 6c 73 65 20 69 66 28 20 63 3d 3d 27 7d 27 20 29  lse if( c=='}' )
16ae0 20 6c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20   level--;.      
16af0 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f    else if( c=='/
16b00 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20  ' && cp[1]=='*' 
16b10 29 7b 20 20 2f 2a 20 53 6b 69 70 20 63 6f 6d 6d  ){  /* Skip comm
16b20 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ents */.        
16b30 20 20 69 6e 74 20 70 72 65 76 63 3b 0a 20 20 20    int prevc;.   
16b40 20 20 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b         cp = &cp[
16b50 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72  2];.          pr
16b60 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  evc = 0;.       
16b70 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63     while( (c= *c
16b80 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f 27  p)!=0 && (c!='/'
16b90 20 7c 7c 20 70 72 65 76 63 21 3d 27 2a 27 29 20   || prevc!='*') 
16ba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
16bb0 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
16bc0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  eno++;.         
16bd0 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 20 20     prevc = c;.  
16be0 20 20 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a            cp++;.
16bf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16c00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
16c10 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
16c20 2f 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 43  /' ){  /* Skip C
16c30 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74  ++ style comment
16c40 73 20 74 6f 6f 20 2a 2f 0a 20 20 20 20 20 20 20  s too */.       
16c50 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a     cp = &cp[2];.
16c60 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
16c70 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
16c80 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a  c!='\n' ) cp++;.
16c90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 20            if( c 
16ca0 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
16cb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
16cc0 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 5c 22 27  ='\'' || c=='\"'
16cd0 20 29 7b 20 20 20 20 2f 2a 20 53 74 72 69 6e 67   ){    /* String
16ce0 20 61 20 63 68 61 72 61 63 74 65 72 20 6c 69 74   a character lit
16cf0 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20  erals */.       
16d00 20 20 20 69 6e 74 20 73 74 61 72 74 63 68 61 72     int startchar
16d10 2c 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20  , prevc;.       
16d20 20 20 20 73 74 61 72 74 63 68 61 72 20 3d 20 63     startchar = c
16d30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76  ;.          prev
16d40 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
16d50 20 66 6f 72 28 63 70 2b 2b 3b 20 28 63 3d 20 2a   for(cp++; (c= *
16d60 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 73 74  cp)!=0 && (c!=st
16d70 61 72 74 63 68 61 72 20 7c 7c 20 70 72 65 76 63  artchar || prevc
16d80 3d 3d 27 5c 5c 27 29 3b 20 63 70 2b 2b 29 7b 0a  =='\\'); cp++){.
16d90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
16da0 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  c=='\n' ) lineno
16db0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
16dc0 69 66 28 20 70 72 65 76 63 3d 3d 27 5c 5c 27 20  if( prevc=='\\' 
16dd0 29 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20  ) prevc = 0;.   
16de0 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 20 20           else   
16df0 20 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63             prevc
16e00 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
16e10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
16e20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
16e30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  =0 ){.        Er
16e40 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
16e50 6d 65 2c 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e  me,ps.tokenlinen
16e60 6f 2c 0a 22 43 20 63 6f 64 65 20 73 74 61 72 74  o,."C code start
16e70 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65  ing on this line
16e80 20 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74   is not terminat
16e90 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e  ed before the en
16ea0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 22 29  d of the file.")
16eb0 3b 0a 20 20 20 20 20 20 20 20 70 73 2e 65 72 72  ;.        ps.err
16ec0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
16ed0 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20   nextcp = cp;.  
16ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16ef0 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 2b 31     nextcp = cp+1
16f00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
16f10 6c 73 65 20 69 66 28 20 49 53 41 4c 4e 55 4d 28  lse if( ISALNUM(
16f20 63 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  c) ){          /
16f30 2a 20 49 64 65 6e 74 69 66 69 65 72 73 20 2a 2f  * Identifiers */
16f40 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
16f50 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 49 53  = *cp)!=0 && (IS
16f60 41 4c 4e 55 4d 28 63 29 20 7c 7c 20 63 3d 3d 27  ALNUM(c) || c=='
16f70 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20  _') ) cp++;.    
16f80 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20    nextcp = cp;. 
16f90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
16fa0 27 3a 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 3a  ':' && cp[1]==':
16fb0 27 20 26 26 20 63 70 5b 32 5d 3d 3d 27 3d 27 20  ' && cp[2]=='=' 
16fc0 29 7b 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74  ){ /* The operat
16fd0 6f 72 20 22 3a 3a 3d 22 20 2a 2f 0a 20 20 20 20  or "::=" */.    
16fe0 20 20 63 70 20 2b 3d 20 33 3b 0a 20 20 20 20 20    cp += 3;.     
16ff0 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20   nextcp = cp;.  
17000 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d    }else if( (c==
17010 27 2f 27 20 7c 7c 20 63 3d 3d 27 7c 27 29 20 26  '/' || c=='|') &
17020 26 20 49 53 41 4c 50 48 41 28 63 70 5b 31 5d 29  & ISALPHA(cp[1])
17030 20 29 7b 0a 20 20 20 20 20 20 63 70 20 2b 3d 20   ){.      cp += 
17040 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  2;.      while( 
17050 28 63 20 3d 20 2a 63 70 29 21 3d 30 20 26 26 20  (c = *cp)!=0 && 
17060 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c 7c 20 63  (ISALNUM(c) || c
17070 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20  =='_') ) cp++;. 
17080 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
17090 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20  ;.    }else{    
170a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170b0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6f 74 68        /* All oth
170c0 65 72 20 28 6f 6e 65 20 63 68 61 72 61 63 74 65  er (one characte
170d0 72 29 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  r) operators */.
170e0 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
170f0 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20    nextcp = cp;. 
17100 20 20 20 7d 0a 20 20 20 20 63 20 3d 20 2a 63 70     }.    c = *cp
17110 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 20 20  ;.    *cp = 0;  
17120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17130 20 20 20 20 20 20 2f 2a 20 4e 75 6c 6c 20 74 65        /* Null te
17140 72 6d 69 6e 61 74 65 20 74 68 65 20 74 6f 6b 65  rminate the toke
17150 6e 20 2a 2f 0a 20 20 20 20 70 61 72 73 65 6f 6e  n */.    parseon
17160 65 74 6f 6b 65 6e 28 26 70 73 29 3b 20 20 20 20  etoken(&ps);    
17170 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
17180 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20  e the token */. 
17190 20 20 20 2a 63 70 20 3d 20 28 63 68 61 72 29 63     *cp = (char)c
171a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
171b0 20 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68     /* Restore th
171c0 65 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  e buffer */.    
171d0 63 70 20 3d 20 6e 65 78 74 63 70 3b 0a 20 20 7d  cp = nextcp;.  }
171e0 0a 20 20 66 72 65 65 28 66 69 6c 65 62 75 66 29  .  free(filebuf)
171f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17200 20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20       /* Release 
17210 74 68 65 20 62 75 66 66 65 72 20 61 66 74 65 72  the buffer after
17220 20 70 61 72 73 69 6e 67 20 2a 2f 0a 20 20 67 70   parsing */.  gp
17230 2d 3e 72 75 6c 65 20 3d 20 70 73 2e 66 69 72 73  ->rule = ps.firs
17240 74 72 75 6c 65 3b 0a 20 20 67 70 2d 3e 65 72 72  trule;.  gp->err
17250 6f 72 63 6e 74 20 3d 20 70 73 2e 65 72 72 6f 72  orcnt = ps.error
17260 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  cnt;.}./********
17270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17280 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
17290 65 20 22 70 6c 69 6e 6b 2e 63 22 20 2a 2a 2a 2a  e "plink.c" ****
172a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172b0 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  */./*.** Routine
172c0 73 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e  s processing con
172d0 66 69 67 75 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f  figuration follo
172e0 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f  w-set propagatio
172f0 6e 20 6c 69 6e 6b 73 0a 2a 2a 20 69 6e 20 74 68  n links.** in th
17300 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
17310 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61  enerator..*/.sta
17320 74 69 63 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  tic struct plink
17330 20 2a 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74   *plink_freelist
17340 20 3d 20 30 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61   = 0;../* Alloca
17350 74 65 20 61 20 6e 65 77 20 70 6c 69 6e 6b 20 2a  te a new plink *
17360 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  /.struct plink *
17370 50 6c 69 6e 6b 5f 6e 65 77 28 76 6f 69 64 29 7b  Plink_new(void){
17380 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
17390 2a 6e 65 77 6c 69 6e 6b 3b 0a 0a 20 20 69 66 28  *newlink;..  if(
173a0 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d   plink_freelist=
173b0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
173c0 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31  .    int amt = 1
173d0 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72  00;.    plink_fr
173e0 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74  eelist = (struct
173f0 20 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c 6f 63 28   plink *)calloc(
17400 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72   amt, sizeof(str
17410 75 63 74 20 70 6c 69 6e 6b 29 20 29 3b 0a 20 20  uct plink) );.  
17420 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65    if( plink_free
17430 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  list==0 ){.     
17440 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
17450 0a 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74  .      "Unable t
17460 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
17470 79 20 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c  y for a new foll
17480 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69  ow-set propagati
17490 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20  on link.\n");.  
174a0 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
174b0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
174c0 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c  i<amt-1; i++) pl
174d0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e  ink_freelist[i].
174e0 6e 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72  next = &plink_fr
174f0 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20  eelist[i+1];.   
17500 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b   plink_freelist[
17510 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b  amt-1].next = 0;
17520 0a 20 20 7d 0a 20 20 6e 65 77 6c 69 6e 6b 20 3d  .  }.  newlink =
17530 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b   plink_freelist;
17540 0a 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  .  plink_freelis
17550 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  t = plink_freeli
17560 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75  st->next;.  retu
17570 72 6e 20 6e 65 77 6c 69 6e 6b 3b 0a 7d 0a 0a 2f  rn newlink;.}../
17580 2a 20 41 64 64 20 61 20 70 6c 69 6e 6b 20 74 6f  * Add a plink to
17590 20 61 20 70 6c 69 6e 6b 20 6c 69 73 74 20 2a 2f   a plink list */
175a0 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28  .void Plink_add(
175b0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 70  struct plink **p
175c0 6c 70 70 2c 20 73 74 72 75 63 74 20 63 6f 6e 66  lpp, struct conf
175d0 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73 74 72  ig *cfp).{.  str
175e0 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 6c 69  uct plink *newli
175f0 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b 20 3d 20  nk;.  newlink = 
17600 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b 0a 20 20 6e  Plink_new();.  n
17610 65 77 6c 69 6e 6b 2d 3e 6e 65 78 74 20 3d 20 2a  ewlink->next = *
17620 70 6c 70 70 3b 0a 20 20 2a 70 6c 70 70 20 3d 20  plpp;.  *plpp = 
17630 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69  newlink;.  newli
17640 6e 6b 2d 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d  nk->cfp = cfp;.}
17650 0a 0a 2f 2a 20 54 72 61 6e 73 66 65 72 20 65 76  ../* Transfer ev
17660 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65  ery plink on the
17670 20 6c 69 73 74 20 22 66 72 6f 6d 22 20 74 6f 20   list "from" to 
17680 74 68 65 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f  the list "to" */
17690 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79  .void Plink_copy
176a0 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a  (struct plink **
176b0 74 6f 2c 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  to, struct plink
176c0 20 2a 66 72 6f 6d 29 0a 7b 0a 20 20 73 74 72 75   *from).{.  stru
176d0 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c  ct plink *nextpl
176e0 3b 0a 20 20 77 68 69 6c 65 28 20 66 72 6f 6d 20  ;.  while( from 
176f0 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d 20  ){.    nextpl = 
17700 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a 20 20 20 20  from->next;.    
17710 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d 20 2a 74 6f  from->next = *to
17720 3b 0a 20 20 20 20 2a 74 6f 20 3d 20 66 72 6f 6d  ;.    *to = from
17730 3b 0a 20 20 20 20 66 72 6f 6d 20 3d 20 6e 65 78  ;.    from = nex
17740 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44  tpl;.  }.}../* D
17750 65 6c 65 74 65 20 65 76 65 72 79 20 70 6c 69 6e  elete every plin
17760 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  k on the list */
17770 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65  .void Plink_dele
17780 74 65 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  te(struct plink 
17790 2a 70 6c 70 29 0a 7b 0a 20 20 73 74 72 75 63 74  *plp).{.  struct
177a0 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a   plink *nextpl;.
177b0 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b  .  while( plp ){
177c0 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d 20 70 6c  .    nextpl = pl
177d0 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 70 6c 70  p->next;.    plp
177e0 2d 3e 6e 65 78 74 20 3d 20 70 6c 69 6e 6b 5f 66  ->next = plink_f
177f0 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 6c 69  reelist;.    pli
17800 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70 6c  nk_freelist = pl
17810 70 3b 0a 20 20 20 20 70 6c 70 20 3d 20 6e 65 78  p;.    plp = nex
17820 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a  tpl;.  }.}./****
17830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17840 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
17850 65 20 22 72 65 70 6f 72 74 2e 63 22 20 2a 2a 2a  e "report.c" ***
17860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17870 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50  *******/./*.** P
17880 72 6f 63 65 64 75 72 65 73 20 66 6f 72 20 67 65  rocedures for ge
17890 6e 65 72 61 74 69 6e 67 20 72 65 70 6f 72 74 73  nerating reports
178a0 20 61 6e 64 20 74 61 62 6c 65 73 20 69 6e 20 74   and tables in t
178b0 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
178c0 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f  generator..*/../
178d0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 66 69 6c  * Generate a fil
178e0 65 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20 67  ename with the g
178f0 69 76 65 6e 20 73 75 66 66 69 78 2e 20 20 53 70  iven suffix.  Sp
17900 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ace to hold the.
17910 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65 73 20 66 72  ** name comes fr
17920 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  om malloc() and 
17930 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
17940 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
17950 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49  function..*/.PRI
17960 56 41 54 45 20 63 68 61 72 20 2a 66 69 6c 65 5f  VATE char *file_
17970 6d 61 6b 65 6e 61 6d 65 28 73 74 72 75 63 74 20  makename(struct 
17980 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 6f 6e  lemon *lemp, con
17990 73 74 20 63 68 61 72 20 2a 73 75 66 66 69 78 29  st char *suffix)
179a0 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b  .{.  char *name;
179b0 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20  .  char *cp;..  
179c0 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 6d 61  name = (char*)ma
179d0 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65  lloc( lemonStrle
179e0 6e 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  n(lemp->filename
179f0 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  ) + lemonStrlen(
17a00 73 75 66 66 69 78 29 20 2b 20 35 20 29 3b 0a 20  suffix) + 5 );. 
17a10 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a   if( name==0 ){.
17a20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
17a30 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61  rr,"Can't alloca
17a40 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 66  te space for a f
17a50 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20  ilename.\n");.  
17a60 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
17a70 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 6e 61   lemon_strcpy(na
17a80 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  me,lemp->filenam
17a90 65 29 3b 0a 20 20 63 70 20 3d 20 73 74 72 72 63  e);.  cp = strrc
17aa0 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20  hr(name,'.');.  
17ab0 69 66 28 20 63 70 20 29 20 2a 63 70 20 3d 20 30  if( cp ) *cp = 0
17ac0 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 61 74  ;.  lemon_strcat
17ad0 28 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b 0a 20  (name,suffix);. 
17ae0 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d 0a   return name;.}.
17af0 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20  ./* Open a file 
17b00 77 69 74 68 20 61 20 6e 61 6d 65 20 62 61 73 65  with a name base
17b10 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  d on the name of
17b20 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 2c   the input file,
17b30 0a 2a 2a 20 62 75 74 20 77 69 74 68 20 61 20 64  .** but with a d
17b40 69 66 66 65 72 65 6e 74 20 28 73 70 65 63 69 66  ifferent (specif
17b50 69 65 64 29 20 73 75 66 66 69 78 2c 20 61 6e 64  ied) suffix, and
17b60 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
17b70 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 72 65  r.** to the stre
17b80 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49  am */.PRIVATE FI
17b90 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28 0a 20  LE *file_open(. 
17ba0 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c   struct lemon *l
17bb0 65 6d 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  emp,.  const cha
17bc0 72 20 2a 73 75 66 66 69 78 2c 0a 20 20 63 6f 6e  r *suffix,.  con
17bd0 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 0a 29 7b  st char *mode.){
17be0 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20  .  FILE *fp;..  
17bf0 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  if( lemp->outnam
17c00 65 20 29 20 66 72 65 65 28 6c 65 6d 70 2d 3e 6f  e ) free(lemp->o
17c10 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d 70 2d  utname);.  lemp-
17c20 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c 65 5f  >outname = file_
17c30 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 73  makename(lemp, s
17c40 75 66 66 69 78 29 3b 0a 20 20 66 70 20 3d 20 66  uffix);.  fp = f
17c50 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61  open(lemp->outna
17c60 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66 28 20  me,mode);.  if( 
17c70 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65 3d 3d  fp==0 && *mode==
17c80 27 77 27 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  'w' ){.    fprin
17c90 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74  tf(stderr,"Can't
17ca0 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73 5c   open file \"%s\
17cb0 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74 6e  ".\n",lemp->outn
17cc0 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e  ame);.    lemp->
17cd0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
17ce0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
17cf0 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a  return fp;.}../*
17d00 20 50 72 69 6e 74 20 74 68 65 20 74 65 78 74 20   Print the text 
17d10 6f 66 20 61 20 72 75 6c 65 0a 2a 2f 0a 76 6f 69  of a rule.*/.voi
17d20 64 20 72 75 6c 65 5f 70 72 69 6e 74 28 46 49 4c  d rule_print(FIL
17d30 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 72  E *out, struct r
17d40 75 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e 74 20  ule *rp){.  int 
17d50 69 2c 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28  i, j;.  fprintf(
17d60 6f 75 74 2c 20 22 25 73 22 2c 72 70 2d 3e 6c 68  out, "%s",rp->lh
17d70 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 2f 2a 20 20  s->name);.  /*  
17d80 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69    if( rp->lhsali
17d90 61 73 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  as ) fprintf(out
17da0 2c 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61  ,"(%s)",rp->lhsa
17db0 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 66 70 72 69  lias); */.  fpri
17dc0 6e 74 66 28 6f 75 74 2c 22 20 3a 3a 3d 22 29 3b  ntf(out," ::=");
17dd0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70  .  for(i=0; i<rp
17de0 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
17df0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
17e00 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d  *sp = rp->rhs[i]
17e10 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  ;.    if( sp->ty
17e20 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
17e30 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  L ){.      fprin
17e40 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73 70  tf(out," %s", sp
17e50 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d  ->subsym[0]->nam
17e60 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  e);.      for(j=
17e70 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d  1; j<sp->nsubsym
17e80 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
17e90 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c 25 73  fprintf(out,"|%s
17ea0 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d  ", sp->subsym[j]
17eb0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  ->name);.      }
17ec0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17ed0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
17ee0 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  %s", sp->name);.
17ef0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69 66 28      }.    /* if(
17f00 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
17f10 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
17f20 28 25 73 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69  (%s)",rp->rhsali
17f30 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20 7d 0a 7d  as[i]); */.  }.}
17f40 0a 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74  ../* Duplicate t
17f50 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69  he input file wi
17f60 74 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61  thout comments a
17f70 6e 64 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f  nd without actio
17f80 6e 73 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a  ns.** on rules *
17f90 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73  /.void Reprint(s
17fa0 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
17fb0 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75  p).{.  struct ru
17fc0 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74  le *rp;.  struct
17fd0 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69   symbol *sp;.  i
17fe0 6e 74 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c  nt i, j, maxlen,
17ff0 20 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20   len, ncolumns, 
18000 73 6b 69 70 3b 0a 20 20 70 72 69 6e 74 66 28 22  skip;.  printf("
18010 2f 2f 20 52 65 70 72 69 6e 74 20 6f 66 20 69 6e  // Reprint of in
18020 70 75 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e  put file \"%s\".
18030 5c 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22  \n// Symbols:\n"
18040 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
18050 3b 0a 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b  ;.  maxlen = 10;
18060 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
18070 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
18080 29 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70  ){.    sp = lemp
18090 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
180a0 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72    len = lemonStr
180b0 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  len(sp->name);. 
180c0 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65     if( len>maxle
180d0 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e  n ) maxlen = len
180e0 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73  ;.  }.  ncolumns
180f0 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29   = 76/(maxlen+5)
18100 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73  ;.  if( ncolumns
18110 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20  <1 ) ncolumns = 
18120 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d  1;.  skip = (lem
18130 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f  p->nsymbol + nco
18140 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75  lumns - 1)/ncolu
18150 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  mns;.  for(i=0; 
18160 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20  i<skip; i++){.  
18170 20 20 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a    printf("//");.
18180 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c      for(j=i; j<l
18190 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b  emp->nsymbol; j+
181a0 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20 20 73 70  =skip){.      sp
181b0 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
181c0 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [j];.      asser
181d0 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20  t( sp->index==j 
181e0 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  );.      printf(
181f0 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c  " %3d %-*.*s",j,
18200 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70  maxlen,maxlen,sp
18210 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  ->name);.    }. 
18220 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
18230 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65  .  }.  for(rp=le
18240 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
18250 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
18260 72 75 6c 65 5f 70 72 69 6e 74 28 73 74 64 6f 75  rule_print(stdou
18270 74 2c 20 72 70 29 3b 0a 20 20 20 20 70 72 69 6e  t, rp);.    prin
18280 74 66 28 22 2e 22 29 3b 0a 20 20 20 20 69 66 28  tf(".");.    if(
18290 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 29 20 70   rp->precsym ) p
182a0 72 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72 70  rintf(" [%s]",rp
182b0 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29  ->precsym->name)
182c0 3b 0a 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d  ;.    /* if( rp-
182d0 3e 63 6f 64 65 20 29 20 70 72 69 6e 74 66 28 22  >code ) printf("
182e0 5c 6e 20 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f  \n    %s",rp->co
182f0 64 65 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e  de); */.    prin
18300 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a  tf("\n");.  }.}.
18310 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  ./* Print a sing
18320 6c 65 20 72 75 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  le rule..*/.void
18330 20 52 75 6c 65 50 72 69 6e 74 28 46 49 4c 45 20   RulePrint(FILE 
18340 2a 66 70 2c 20 73 74 72 75 63 74 20 72 75 6c 65  *fp, struct rule
18350 20 2a 72 70 2c 20 69 6e 74 20 69 43 75 72 73 6f   *rp, int iCurso
18360 72 29 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  r){.  struct sym
18370 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69  bol *sp;.  int i
18380 2c 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28 66  , j;.  fprintf(f
18390 70 2c 22 25 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c  p,"%s ::=",rp->l
183a0 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  hs->name);.  for
183b0 28 69 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68  (i=0; i<=rp->nrh
183c0 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  s; i++){.    if(
183d0 20 69 3d 3d 69 43 75 72 73 6f 72 20 29 20 66 70   i==iCursor ) fp
183e0 72 69 6e 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a  rintf(fp," *");.
183f0 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e      if( i==rp->n
18400 72 68 73 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  rhs ) break;.   
18410 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d   sp = rp->rhs[i]
18420 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  ;.    if( sp->ty
18430 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
18440 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  L ){.      fprin
18450 74 66 28 66 70 2c 22 20 25 73 22 2c 20 73 70 2d  tf(fp," %s", sp-
18460 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65  >subsym[0]->name
18470 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31  );.      for(j=1
18480 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; j<sp->nsubsym;
18490 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   j++){.        f
184a0 70 72 69 6e 74 66 28 66 70 2c 22 7c 25 73 22 2c  printf(fp,"|%s",
184b0 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e  sp->subsym[j]->n
184c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
184d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
184e0 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22 2c  printf(fp," %s",
184f0 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
18500 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72 69 6e  }.  }.}../* Prin
18510 74 20 74 68 65 20 72 75 6c 65 20 66 6f 72 20 61  t the rule for a
18520 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a   configuration..
18530 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 50 72  */.void ConfigPr
18540 69 6e 74 28 46 49 4c 45 20 2a 66 70 2c 20 73 74  int(FILE *fp, st
18550 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
18560 29 7b 0a 20 20 52 75 6c 65 50 72 69 6e 74 28 66  ){.  RulePrint(f
18570 70 2c 20 63 66 70 2d 3e 72 70 2c 20 63 66 70 2d  p, cfp->rp, cfp-
18580 3e 64 6f 74 29 3b 0a 7d 0a 0a 2f 2a 20 23 64 65  >dot);.}../* #de
18590 66 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69 66  fine TEST */.#if
185a0 20 30 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 65   0./* Print a se
185b0 74 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  t */.PRIVATE voi
185c0 64 20 53 65 74 50 72 69 6e 74 28 6f 75 74 2c 73  d SetPrint(out,s
185d0 65 74 2c 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f  et,lemp).FILE *o
185e0 75 74 3b 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73  ut;.char *set;.s
185f0 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
18600 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p;.{.  int i;.  
18610 63 68 61 72 20 2a 73 70 61 63 65 72 3b 0a 20 20  char *spacer;.  
18620 73 70 61 63 65 72 20 3d 20 22 22 3b 0a 20 20 66  spacer = "";.  f
18630 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73  printf(out,"%12s
18640 5b 22 2c 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d  [","");.  for(i=
18650 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  0; i<lemp->nterm
18660 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  inal; i++){.    
18670 69 66 28 20 53 65 74 46 69 6e 64 28 73 65 74 2c  if( SetFind(set,
18680 69 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  i) ){.      fpri
18690 6e 74 66 28 6f 75 74 2c 22 25 73 25 73 22 2c 73  ntf(out,"%s%s",s
186a0 70 61 63 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62  pacer,lemp->symb
186b0 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  ols[i]->name);. 
186c0 20 20 20 20 20 73 70 61 63 65 72 20 3d 20 22 20       spacer = " 
186d0 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  ";.    }.  }.  f
186e0 70 72 69 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22  printf(out,"]\n"
186f0 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61  );.}../* Print a
18700 20 70 6c 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a   plink chain */.
18710 50 52 49 56 41 54 45 20 76 6f 69 64 20 50 6c 69  PRIVATE void Pli
18720 6e 6b 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c  nkPrint(out,plp,
18730 74 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a  tag).FILE *out;.
18740 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c  struct plink *pl
18750 70 3b 0a 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a  p;.char *tag;.{.
18760 20 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a    while( plp ){.
18770 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
18780 22 25 31 32 73 25 73 20 28 73 74 61 74 65 20 25  "%12s%s (state %
18790 32 64 29 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70  2d) ","",tag,plp
187a0 2d 3e 63 66 70 2d 3e 73 74 70 2d 3e 73 74 61 74  ->cfp->stp->stat
187b0 65 6e 75 6d 29 3b 0a 20 20 20 20 43 6f 6e 66 69  enum);.    Confi
187c0 67 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e  gPrint(out,plp->
187d0 63 66 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  cfp);.    fprint
187e0 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20  f(out,"\n");.   
187f0 20 70 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65 78 74   plp = plp->next
18800 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
18810 2f 2a 20 50 72 69 6e 74 20 61 6e 20 61 63 74 69  /* Print an acti
18820 6f 6e 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  on to the given 
18830 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
18840 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
18850 66 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 77 61 73  f.** nothing was
18860 20 61 63 74 75 61 6c 6c 79 20 70 72 69 6e 74 65   actually printe
18870 64 2e 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e 74 41  d..*/.int PrintA
18880 63 74 69 6f 6e 28 0a 20 20 73 74 72 75 63 74 20  ction(.  struct 
18890 61 63 74 69 6f 6e 20 2a 61 70 2c 20 20 20 20 20  action *ap,     
188a0 20 20 20 20 20 2f 2a 20 54 68 65 20 61 63 74 69       /* The acti
188b0 6f 6e 20 74 6f 20 70 72 69 6e 74 20 2a 2f 0a 20  on to print */. 
188c0 20 46 49 4c 45 20 2a 66 70 2c 20 20 20 20 20 20   FILE *fp,      
188d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
188e0 50 72 69 6e 74 20 74 68 65 20 61 63 74 69 6f 6e  Print the action
188f0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69   here */.  int i
18900 6e 64 65 6e 74 20 20 20 20 20 20 20 20 20 20 20  ndent           
18910 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 6e 74         /* Indent
18920 20 62 79 20 74 68 69 73 20 61 6d 6f 75 6e 74 20   by this amount 
18930 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65 73 75  */.){.  int resu
18940 6c 74 20 3d 20 31 3b 0a 20 20 73 77 69 74 63 68  lt = 1;.  switch
18950 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20  ( ap->type ){.  
18960 20 20 63 61 73 65 20 53 48 49 46 54 3a 20 7b 0a    case SHIFT: {.
18970 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
18980 74 65 20 2a 73 74 70 20 3d 20 61 70 2d 3e 78 2e  te *stp = ap->x.
18990 73 74 70 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  stp;.      fprin
189a0 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74  tf(fp,"%*s shift
189b0 20 20 20 20 20 20 20 20 25 2d 37 64 22 2c 69 6e          %-7d",in
189c0 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
189d0 65 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29  e,stp->statenum)
189e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
189f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 52 45     }.    case RE
18a00 44 55 43 45 3a 20 7b 0a 20 20 20 20 20 20 73 74  DUCE: {.      st
18a10 72 75 63 74 20 72 75 6c 65 20 2a 72 70 20 3d 20  ruct rule *rp = 
18a20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20  ap->x.rp;.      
18a30 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
18a40 72 65 64 75 63 65 20 20 20 20 20 20 20 25 2d 37  reduce       %-7
18a50 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70  d",indent,ap->sp
18a60 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 69 52 75 6c 65  ->name,rp->iRule
18a70 29 3b 0a 20 20 20 20 20 20 52 75 6c 65 50 72 69  );.      RulePri
18a80 6e 74 28 66 70 2c 20 72 70 2c 20 2d 31 29 3b 0a  nt(fp, rp, -1);.
18a90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18aa0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 48 49 46   }.    case SHIF
18ab0 54 52 45 44 55 43 45 3a 20 7b 0a 20 20 20 20 20  TREDUCE: {.     
18ac0 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
18ad0 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20   = ap->x.rp;.   
18ae0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
18af0 2a 73 20 73 68 69 66 74 2d 72 65 64 75 63 65 20  *s shift-reduce 
18b00 25 2d 37 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d  %-7d",indent,ap-
18b10 3e 73 70 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 69 52  >sp->name,rp->iR
18b20 75 6c 65 29 3b 0a 20 20 20 20 20 20 52 75 6c 65  ule);.      Rule
18b30 50 72 69 6e 74 28 66 70 2c 20 72 70 2c 20 2d 31  Print(fp, rp, -1
18b40 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
18b50 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 41      }.    case A
18b60 43 43 45 50 54 3a 0a 20 20 20 20 20 20 66 70 72  CCEPT:.      fpr
18b70 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 61 63 63  intf(fp,"%*s acc
18b80 65 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  ept",indent,ap->
18b90 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
18ba0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
18bb0 20 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 66 70   ERROR:.      fp
18bc0 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 65 72  rintf(fp,"%*s er
18bd0 72 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  ror",indent,ap->
18be0 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
18bf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
18c00 20 53 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20   SRCONFLICT:.   
18c10 20 63 61 73 65 20 52 52 43 4f 4e 46 4c 49 43 54   case RRCONFLICT
18c20 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
18c30 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 20  fp,"%*s reduce  
18c40 20 20 20 20 20 25 2d 37 64 20 2a 2a 20 50 61 72       %-7d ** Par
18c50 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a  sing conflict **
18c60 22 2c 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e  ",.        inden
18c70 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61  t,ap->sp->name,a
18c80 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 29 3b  p->x.rp->iRule);
18c90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18ca0 20 20 63 61 73 65 20 53 53 43 4f 4e 46 4c 49 43    case SSCONFLIC
18cb0 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  T:.      fprintf
18cc0 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20  (fp,"%*s shift  
18cd0 20 20 20 20 20 20 25 2d 37 64 20 2a 2a 20 50 61        %-7d ** Pa
18ce0 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a  rsing conflict *
18cf0 2a 22 2c 0a 20 20 20 20 20 20 20 20 69 6e 64 65  *",.        inde
18d00 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
18d10 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65  ap->x.stp->state
18d20 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  num);.      brea
18d30 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52  k;.    case SH_R
18d40 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20 69  ESOLVED:.      i
18d50 66 28 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63  f( showPrecedenc
18d60 65 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20  eConflict ){.   
18d70 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
18d80 22 25 2a 73 20 73 68 69 66 74 20 20 20 20 20 20  "%*s shift      
18d90 20 20 25 2d 37 64 20 2d 2d 20 64 72 6f 70 70 65    %-7d -- droppe
18da0 64 20 62 79 20 70 72 65 63 65 64 65 6e 63 65 22  d by precedence"
18db0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18dc0 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d    indent,ap->sp-
18dd0 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d  >name,ap->x.stp-
18de0 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20  >statenum);.    
18df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18e00 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20   result = 0;.   
18e10 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
18e20 3b 0a 20 20 20 20 63 61 73 65 20 52 44 5f 52 45  ;.    case RD_RE
18e30 53 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20 69 66  SOLVED:.      if
18e40 28 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65  ( showPrecedence
18e50 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20  Conflict ){.    
18e60 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
18e70 25 2a 73 20 72 65 64 75 63 65 20 25 2d 37 64 20  %*s reduce %-7d 
18e80 2d 2d 20 64 72 6f 70 70 65 64 20 62 79 20 70 72  -- dropped by pr
18e90 65 63 65 64 65 6e 63 65 22 2c 0a 20 20 20 20 20  ecedence",.     
18ea0 20 20 20 20 20 20 20 20 20 20 20 69 6e 64 65 6e             inden
18eb0 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61  t,ap->sp->name,a
18ec0 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 29 3b  p->x.rp->iRule);
18ed0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18ee0 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30        result = 0
18ef0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18f00 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
18f10 4e 4f 54 5f 55 53 45 44 3a 0a 20 20 20 20 20 20  NOT_USED:.      
18f20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20  result = 0;.    
18f30 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69    break;.  }.  i
18f40 66 28 20 72 65 73 75 6c 74 20 26 26 20 61 70 2d  f( result && ap-
18f50 3e 73 70 4f 70 74 20 29 7b 0a 20 20 20 20 66 70  >spOpt ){.    fp
18f60 72 69 6e 74 66 28 66 70 2c 22 20 20 2f 2a 20 62  rintf(fp,"  /* b
18f70 65 63 61 75 73 65 20 25 73 3d 3d 25 73 20 2a 2f  ecause %s==%s */
18f80 22 2c 20 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  ", ap->sp->name,
18f90 20 61 70 2d 3e 73 70 4f 70 74 2d 3e 6e 61 6d 65   ap->spOpt->name
18fa0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18fb0 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65  result;.}../* Ge
18fc0 6e 65 72 61 74 65 20 74 68 65 20 22 2a 2e 6f 75  nerate the "*.ou
18fd0 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76  t" log file */.v
18fe0 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74  oid ReportOutput
18ff0 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
19000 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp).{.  int i;.
19010 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
19020 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 63 6f  stp;.  struct co
19030 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72  nfig *cfp;.  str
19040 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
19050 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 66    FILE *fp;..  f
19060 70 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  p = file_open(le
19070 6d 70 2c 22 2e 6f 75 74 22 2c 22 77 62 22 29 3b  mp,".out","wb");
19080 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 29 20 72  .  if( fp==0 ) r
19090 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
190a0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  ; i<lemp->nxstat
190b0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
190c0 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
190d0 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i];.    fprintf(
190e0 66 70 2c 22 53 74 61 74 65 20 25 64 3a 5c 6e 22  fp,"State %d:\n"
190f0 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b  ,stp->statenum);
19100 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62  .    if( lemp->b
19110 61 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d 73  asisflag ) cfp=s
19120 74 70 2d 3e 62 70 3b 0a 20 20 20 20 65 6c 73 65  tp->bp;.    else
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19140 20 20 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 0a    cfp=stp->cfp;.
19150 20 20 20 20 77 68 69 6c 65 28 20 63 66 70 20 29      while( cfp )
19160 7b 0a 20 20 20 20 20 20 63 68 61 72 20 62 75 66  {.      char buf
19170 5b 32 30 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  [20];.      if( 
19180 63 66 70 2d 3e 64 6f 74 3d 3d 63 66 70 2d 3e 72  cfp->dot==cfp->r
19190 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20  p->nrhs ){.     
191a0 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66     lemon_sprintf
191b0 28 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d  (buf,"(%d)",cfp-
191c0 3e 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20  >rp->iRule);.   
191d0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
191e0 22 20 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b  "    %5s ",buf);
191f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19200 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
19210 2c 22 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a  ,"          ");.
19220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f        }.      Co
19230 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70  nfigPrint(fp,cfp
19240 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
19250 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20 30  (fp,"\n");.#if 0
19260 0a 20 20 20 20 20 20 53 65 74 50 72 69 6e 74 28  .      SetPrint(
19270 66 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70  fp,cfp->fws,lemp
19280 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72  );.      PlinkPr
19290 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70  int(fp,cfp->fplp
192a0 2c 22 54 6f 20 20 22 29 3b 0a 20 20 20 20 20 20  ,"To  ");.      
192b0 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66  PlinkPrint(fp,cf
192c0 70 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b  p->bplp,"From");
192d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
192e0 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61  ( lemp->basisfla
192f0 67 20 29 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b  g ) cfp=cfp->bp;
19300 0a 20 20 20 20 20 20 65 6c 73 65 20 20 20 20 20  .      else     
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 63 66 70               cfp
19320 3d 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20  =cfp->next;.    
19330 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70  }.    fprintf(fp
19340 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28  ,"\n");.    for(
19350 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
19360 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
19370 20 20 20 20 69 66 28 20 50 72 69 6e 74 41 63 74      if( PrintAct
19380 69 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20 29 20  ion(ap,fp,30) ) 
19390 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29  fprintf(fp,"\n")
193a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
193b0 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20  ntf(fp,"\n");.  
193c0 7d 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20  }.  fprintf(fp, 
193d0 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  "---------------
193e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
193f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19400 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70 72  -----\n");.  fpr
19410 69 6e 74 66 28 66 70 2c 20 22 53 79 6d 62 6f 6c  intf(fp, "Symbol
19420 73 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 3d  s:\n");.  for(i=
19430 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
19440 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ol; i++){.    in
19450 74 20 6a 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t j;.    struct 
19460 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 20  symbol *sp;..   
19470 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   sp = lemp->symb
19480 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69  ols[i];.    fpri
19490 6e 74 66 28 66 70 2c 20 22 20 20 25 33 64 3a 20  ntf(fp, "  %3d: 
194a0 25 73 22 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d 65  %s", i, sp->name
194b0 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74  );.    if( sp->t
194c0 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c  ype==NONTERMINAL
194d0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
194e0 66 28 66 70 2c 20 22 3a 22 29 3b 0a 20 20 20 20  f(fp, ":");.    
194f0 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61    if( sp->lambda
19500 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
19510 6e 74 66 28 66 70 2c 20 22 20 3c 6c 61 6d 62 64  ntf(fp, " <lambd
19520 61 3e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  a>");.      }.  
19530 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
19540 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
19550 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
19560 28 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20 26  ( sp->firstset &
19570 26 20 53 65 74 46 69 6e 64 28 73 70 2d 3e 66 69  & SetFind(sp->fi
19580 72 73 74 73 65 74 2c 20 6a 29 20 29 7b 0a 20 20  rstset, j) ){.  
19590 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
195a0 66 70 2c 20 22 20 25 73 22 2c 20 6c 65 6d 70 2d  fp, " %s", lemp-
195b0 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d  >symbols[j]->nam
195c0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
195d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
195e0 66 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 6e 22  fprintf(fp, "\n"
195f0 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  );.  }.  fclose(
19600 66 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fp);.  return;.}
19610 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20  ../* Search for 
19620 74 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20  the file "name" 
19630 77 68 69 63 68 20 69 73 20 69 6e 20 74 68 65 20  which is in the 
19640 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
19650 73 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61  s.** the exacuta
19660 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63  ble */.PRIVATE c
19670 68 61 72 20 2a 70 61 74 68 73 65 61 72 63 68 28  har *pathsearch(
19680 63 68 61 72 20 2a 61 72 67 76 30 2c 20 63 68 61  char *argv0, cha
19690 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 20 6d 6f 64  r *name, int mod
196a0 65 6d 61 73 6b 29 0a 7b 0a 20 20 63 6f 6e 73 74  emask).{.  const
196b0 20 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b   char *pathlist;
196c0 0a 20 20 63 68 61 72 20 2a 70 61 74 68 62 75 66  .  char *pathbuf
196d0 70 74 72 3b 0a 20 20 63 68 61 72 20 2a 70 61 74  ptr;.  char *pat
196e0 68 62 75 66 3b 0a 20 20 63 68 61 72 20 2a 70 61  hbuf;.  char *pa
196f0 74 68 2c 2a 63 70 3b 0a 20 20 63 68 61 72 20 63  th,*cp;.  char c
19700 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33  ;..#ifdef __WIN3
19710 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72 72 63  2__.  cp = strrc
19720 68 72 28 61 72 67 76 30 2c 27 5c 5c 27 29 3b 0a  hr(argv0,'\\');.
19730 23 65 6c 73 65 0a 20 20 63 70 20 3d 20 73 74 72  #else.  cp = str
19740 72 63 68 72 28 61 72 67 76 30 2c 27 2f 27 29 3b  rchr(argv0,'/');
19750 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 63 70  .#endif.  if( cp
19760 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63 70 3b   ){.    c = *cp;
19770 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20  .    *cp = 0;.  
19780 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20 2a    path = (char *
19790 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74  )malloc( lemonSt
197a0 72 6c 65 6e 28 61 72 67 76 30 29 20 2b 20 6c 65  rlen(argv0) + le
197b0 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29 20  monStrlen(name) 
197c0 2b 20 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  + 2 );.    if( p
197d0 61 74 68 20 29 20 6c 65 6d 6f 6e 5f 73 70 72 69  ath ) lemon_spri
197e0 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25 73 22  ntf(path,"%s/%s"
197f0 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b 0a 20 20  ,argv0,name);.  
19800 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 7d 65 6c    *cp = c;.  }el
19810 73 65 7b 0a 20 20 20 20 70 61 74 68 6c 69 73 74  se{.    pathlist
19820 20 3d 20 67 65 74 65 6e 76 28 22 50 41 54 48 22   = getenv("PATH"
19830 29 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 6c  );.    if( pathl
19840 69 73 74 3d 3d 30 20 29 20 70 61 74 68 6c 69 73  ist==0 ) pathlis
19850 74 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72  t = ".:/bin:/usr
19860 2f 62 69 6e 22 3b 0a 20 20 20 20 70 61 74 68 62  /bin";.    pathb
19870 75 66 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61  uf = (char *) ma
19880 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65  lloc( lemonStrle
19890 6e 28 70 61 74 68 6c 69 73 74 29 20 2b 20 31 20  n(pathlist) + 1 
198a0 29 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63  );.    path = (c
198b0 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65  har *)malloc( le
198c0 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c 69  monStrlen(pathli
198d0 73 74 29 2b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  st)+lemonStrlen(
198e0 6e 61 6d 65 29 2b 32 20 29 3b 0a 20 20 20 20 69  name)+2 );.    i
198f0 66 28 20 28 70 61 74 68 62 75 66 20 21 3d 20 30  f( (pathbuf != 0
19900 29 20 26 26 20 28 70 61 74 68 21 3d 30 29 20 29  ) && (path!=0) )
19910 7b 0a 20 20 20 20 20 20 70 61 74 68 62 75 66 70  {.      pathbufp
19920 74 72 20 3d 20 70 61 74 68 62 75 66 3b 0a 20 20  tr = pathbuf;.  
19930 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79      lemon_strcpy
19940 28 70 61 74 68 62 75 66 2c 20 70 61 74 68 6c 69  (pathbuf, pathli
19950 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
19960 28 20 2a 70 61 74 68 62 75 66 20 29 7b 0a 20 20  ( *pathbuf ){.  
19970 20 20 20 20 20 20 63 70 20 3d 20 73 74 72 63 68        cp = strch
19980 72 28 70 61 74 68 62 75 66 2c 27 3a 27 29 3b 0a  r(pathbuf,':');.
19990 20 20 20 20 20 20 20 20 69 66 28 20 63 70 3d 3d          if( cp==
199a0 30 20 29 20 63 70 20 3d 20 26 70 61 74 68 62 75  0 ) cp = &pathbu
199b0 66 5b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61  f[lemonStrlen(pa
199c0 74 68 62 75 66 29 5d 3b 0a 20 20 20 20 20 20 20  thbuf)];.       
199d0 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20   c = *cp;.      
199e0 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20    *cp = 0;.     
199f0 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66     lemon_sprintf
19a00 28 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 70 61  (path,"%s/%s",pa
19a10 74 68 62 75 66 2c 6e 61 6d 65 29 3b 0a 20 20 20  thbuf,name);.   
19a20 20 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20       *cp = c;.  
19a30 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
19a40 20 70 61 74 68 62 75 66 5b 30 5d 20 3d 20 30 3b   pathbuf[0] = 0;
19a50 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 70 61  .        else pa
19a60 74 68 62 75 66 20 3d 20 26 63 70 5b 31 5d 3b 0a  thbuf = &cp[1];.
19a70 20 20 20 20 20 20 20 20 69 66 28 20 61 63 63 65          if( acce
19a80 73 73 28 70 61 74 68 2c 6d 6f 64 65 6d 61 73 6b  ss(path,modemask
19a90 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
19aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65      }.      free
19ab0 28 70 61 74 68 62 75 66 70 74 72 29 3b 0a 20 20  (pathbufptr);.  
19ac0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19ad0 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69 76   path;.}../* Giv
19ae0 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20 63 6f  en an action, co
19af0 6d 70 75 74 65 20 74 68 65 20 69 6e 74 65 67 65  mpute the intege
19b00 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61 74  r value for that
19b10 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68   action.** which
19b20 20 69 73 20 74 6f 20 62 65 20 70 75 74 20 69 6e   is to be put in
19b30 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
19b40 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74  e of the generat
19b50 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 52  ed machine..** R
19b60 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69  eturn negative i
19b70 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68 6f 75  f no action shou
19b80 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65 64 2e  ld be generated.
19b90 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20  .*/.PRIVATE int 
19ba0 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 73  compute_action(s
19bb0 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
19bc0 70 2c 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  p, struct action
19bd0 20 2a 61 70 29 0a 7b 0a 20 20 69 6e 74 20 61 63   *ap).{.  int ac
19be0 74 3b 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d  t;.  switch( ap-
19bf0 3e 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  >type ){.    cas
19c00 65 20 53 48 49 46 54 3a 20 20 61 63 74 20 3d 20  e SHIFT:  act = 
19c10 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65  ap->x.stp->state
19c20 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  num;            
19c30 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
19c40 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48 49 46  k;.    case SHIF
19c50 54 52 45 44 55 43 45 3a 20 7b 0a 20 20 20 20 20  TREDUCE: {.     
19c60 20 2f 2a 20 53 69 6e 63 65 20 61 20 53 48 49 46   /* Since a SHIF
19c70 54 20 69 73 20 69 6e 68 65 72 69 65 6e 74 20 61  T is inherient a
19c80 66 74 65 72 20 61 20 70 72 69 6f 72 20 52 45 44  fter a prior RED
19c90 55 43 45 2c 20 63 6f 6e 76 65 72 74 20 61 6e 79  UCE, convert any
19ca0 0a 20 20 20 20 20 20 2a 2a 20 53 48 49 46 54 52  .      ** SHIFTR
19cb0 45 44 55 43 45 20 61 63 74 69 6f 6e 20 77 69 74  EDUCE action wit
19cc0 68 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20  h a nonterminal 
19cd0 6f 6e 20 74 68 65 20 4c 48 53 20 69 6e 74 6f 20  on the LHS into 
19ce0 61 20 73 69 6d 70 6c 65 0a 20 20 20 20 20 20 2a  a simple.      *
19cf0 2a 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 3a  * REDUCE action:
19d00 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 61 70   */.      if( ap
19d10 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d  ->sp->index>=lem
19d20 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a  p->nterminal ){.
19d30 20 20 20 20 20 20 20 20 61 63 74 20 3d 20 6c 65          act = le
19d40 6d 70 2d 3e 6d 69 6e 52 65 64 75 63 65 20 2b 20  mp->minReduce + 
19d50 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 3b  ap->x.rp->iRule;
19d60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19d70 20 20 20 20 20 20 61 63 74 20 3d 20 6c 65 6d 70        act = lemp
19d80 2d 3e 6d 69 6e 53 68 69 66 74 52 65 64 75 63 65  ->minShiftReduce
19d90 20 2b 20 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75   + ap->x.rp->iRu
19da0 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  le;.      }.    
19db0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19dc0 20 20 20 63 61 73 65 20 52 45 44 55 43 45 3a 20     case REDUCE: 
19dd0 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 52  act = lemp->minR
19de0 65 64 75 63 65 20 2b 20 61 70 2d 3e 78 2e 72 70  educe + ap->x.rp
19df0 2d 3e 69 52 75 6c 65 3b 20 20 20 20 20 20 20 20  ->iRule;        
19e00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
19e10 65 20 45 52 52 4f 52 3a 20 20 61 63 74 20 3d 20  e ERROR:  act = 
19e20 6c 65 6d 70 2d 3e 65 72 72 41 63 74 69 6f 6e 3b  lemp->errAction;
19e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e40 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
19e50 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43 45  k;.    case ACCE
19e60 50 54 3a 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e  PT: act = lemp->
19e70 61 63 63 41 63 74 69 6f 6e 3b 20 20 20 20 20 20  accAction;      
19e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19ea0 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 61 63   default:     ac
19eb0 74 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20  t = -1; break;. 
19ec0 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 63 74 3b   }.  return act;
19ed0 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45  .}..#define LINE
19ee0 53 49 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68 65  SIZE 1000./* The
19ef0 20 6e 65 78 74 20 63 6c 75 73 74 65 72 20 6f 66   next cluster of
19f00 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 66 6f   routines are fo
19f10 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 65  r reading the te
19f20 6d 70 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61  mplate file.** a
19f30 6e 64 20 77 72 69 74 69 6e 67 20 74 68 65 20 72  nd writing the r
19f40 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 67 65  esults to the ge
19f50 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 20 2a  nerated parser *
19f60 2f 0a 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66  /./* The first f
19f70 75 6e 63 74 69 6f 6e 20 74 72 61 6e 73 66 65 72  unction transfer
19f80 73 20 64 61 74 61 20 66 72 6f 6d 20 22 69 6e 22  s data from "in"
19f90 20 74 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a   to "out" until.
19fa0 2a 2a 20 61 20 6c 69 6e 65 20 69 73 20 73 65 65  ** a line is see
19fb0 6e 20 77 68 69 63 68 20 62 65 67 69 6e 73 20 77  n which begins w
19fc0 69 74 68 20 22 25 25 22 2e 20 20 54 68 65 20 6c  ith "%%".  The l
19fd0 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ine number is.**
19fe0 20 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20   tracked..**.** 
19ff0 69 66 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e  if name!=0, then
1a000 20 61 6e 79 20 77 6f 72 64 20 74 68 61 74 20 62   any word that b
1a010 65 67 69 6e 20 77 69 74 68 20 22 50 61 72 73 65  egin with "Parse
1a020 22 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a  " is changed to.
1a030 2a 2a 20 62 65 67 69 6e 20 77 69 74 68 20 2a 6e  ** begin with *n
1a040 61 6d 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a  ame instead..*/.
1a050 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c  PRIVATE void tpl
1a060 74 5f 78 66 65 72 28 63 68 61 72 20 2a 6e 61 6d  t_xfer(char *nam
1a070 65 2c 20 46 49 4c 45 20 2a 69 6e 2c 20 46 49 4c  e, FILE *in, FIL
1a080 45 20 2a 6f 75 74 2c 20 69 6e 74 20 2a 6c 69 6e  E *out, int *lin
1a090 65 6e 6f 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20  eno).{.  int i, 
1a0a0 69 53 74 61 72 74 3b 0a 20 20 63 68 61 72 20 6c  iStart;.  char l
1a0b0 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20  ine[LINESIZE];. 
1a0c0 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 6c 69   while( fgets(li
1a0d0 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 20  ne,LINESIZE,in) 
1a0e0 26 26 20 28 6c 69 6e 65 5b 30 5d 21 3d 27 25 27  && (line[0]!='%'
1a0f0 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d 27 25 27   || line[1]!='%'
1a100 29 20 29 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e  ) ){.    (*linen
1a110 6f 29 2b 2b 3b 0a 20 20 20 20 69 53 74 61 72 74  o)++;.    iStart
1a120 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 61   = 0;.    if( na
1a130 6d 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  me ){.      for(
1a140 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b 20 69 2b  i=0; line[i]; i+
1a150 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1a160 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27 20 26 26 20  line[i]=='P' && 
1a170 73 74 72 6e 63 6d 70 28 26 6c 69 6e 65 5b 69 5d  strncmp(&line[i]
1a180 2c 22 50 61 72 73 65 22 2c 35 29 3d 3d 30 0a 20  ,"Parse",5)==0. 
1a190 20 20 20 20 20 20 20 20 20 26 26 20 28 69 3d 3d           && (i==
1a1a0 30 20 7c 7c 20 21 49 53 41 4c 50 48 41 28 6c 69  0 || !ISALPHA(li
1a1b0 6e 65 5b 69 2d 31 5d 29 29 0a 20 20 20 20 20 20  ne[i-1])).      
1a1c0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
1a1d0 66 28 20 69 3e 69 53 74 61 72 74 20 29 20 66 70  f( i>iStart ) fp
1a1e0 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22  rintf(out,"%.*s"
1a1f0 2c 69 2d 69 53 74 61 72 74 2c 26 6c 69 6e 65 5b  ,i-iStart,&line[
1a200 69 53 74 61 72 74 5d 29 3b 0a 20 20 20 20 20 20  iStart]);.      
1a210 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1a220 22 25 73 22 2c 6e 61 6d 65 29 3b 0a 20 20 20 20  "%s",name);.    
1a230 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20        i += 4;.  
1a240 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
1a250 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   i+1;.        }.
1a260 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a270 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
1a280 73 22 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d  s",&line[iStart]
1a290 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 54 68 65  );.  }.}../* The
1a2a0 20 6e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 66   next function f
1a2b0 69 6e 64 73 20 74 68 65 20 74 65 6d 70 6c 61 74  inds the templat
1a2c0 65 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 73  e file and opens
1a2d0 20 69 74 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a   it, returning.*
1a2e0 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
1a2f0 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 2e 20  he opened file. 
1a300 2a 2f 0a 50 52 49 56 41 54 45 20 46 49 4c 45 20  */.PRIVATE FILE 
1a310 2a 74 70 6c 74 5f 6f 70 65 6e 28 73 74 72 75 63  *tplt_open(struc
1a320 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
1a330 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 74  .  static char t
1a340 65 6d 70 6c 61 74 65 6e 61 6d 65 5b 5d 20 3d 20  emplatename[] = 
1a350 22 6c 65 6d 70 61 72 2e 63 22 3b 0a 20 20 63 68  "lempar.c";.  ch
1a360 61 72 20 62 75 66 5b 31 30 30 30 5d 3b 0a 20 20  ar buf[1000];.  
1a370 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72  FILE *in;.  char
1a380 20 2a 74 70 6c 74 6e 61 6d 65 3b 0a 20 20 63 68   *tpltname;.  ch
1a390 61 72 20 2a 63 70 3b 0a 0a 20 20 2f 2a 20 66 69  ar *cp;..  /* fi
1a3a0 72 73 74 2c 20 73 65 65 20 69 66 20 75 73 65 72  rst, see if user
1a3b0 20 73 70 65 63 69 66 69 65 64 20 61 20 74 65 6d   specified a tem
1a3c0 70 6c 61 74 65 20 66 69 6c 65 6e 61 6d 65 20 6f  plate filename o
1a3d0 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
1a3e0 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28 75 73 65  ne. */.  if (use
1a3f0 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20 21  r_templatename !
1a400 3d 20 30 29 20 7b 0a 20 20 20 20 69 66 28 20 61  = 0) {.    if( a
1a410 63 63 65 73 73 28 75 73 65 72 5f 74 65 6d 70 6c  ccess(user_templ
1a420 61 74 65 6e 61 6d 65 2c 30 30 34 29 3d 3d 2d 31  atename,004)==-1
1a430 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1a440 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
1a450 66 69 6e 64 20 74 68 65 20 70 61 72 73 65 72 20  find the parser 
1a460 64 72 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20  driver template 
1a470 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c  file \"%s\".\n",
1a480 0a 20 20 20 20 20 20 20 20 75 73 65 72 5f 74 65  .        user_te
1a490 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20  mplatename);.   
1a4a0 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
1a4b0 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t++;.      retur
1a4c0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
1a4d0 6e 20 3d 20 66 6f 70 65 6e 28 75 73 65 72 5f 74  n = fopen(user_t
1a4e0 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 22 72 62 22  emplatename,"rb"
1a4f0 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30  );.    if( in==0
1a500 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1a510 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
1a520 6f 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  open the templat
1a530 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e  e file \"%s\".\n
1a540 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1a550 20 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61   user_templatena
1a560 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d  me);.      lemp-
1a570 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
1a580 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1a590 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69 6e   }.    return in
1a5a0 3b 0a 20 20 7d 0a 0a 20 20 63 70 20 3d 20 73 74  ;.  }..  cp = st
1a5b0 72 72 63 68 72 28 6c 65 6d 70 2d 3e 66 69 6c 65  rrchr(lemp->file
1a5c0 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28  name,'.');.  if(
1a5d0 20 63 70 20 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e   cp ){.    lemon
1a5e0 5f 73 70 72 69 6e 74 66 28 62 75 66 2c 22 25 2e  _sprintf(buf,"%.
1a5f0 2a 73 2e 6c 74 22 2c 28 69 6e 74 29 28 63 70 2d  *s.lt",(int)(cp-
1a600 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c  lemp->filename),
1a610 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
1a620 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 65  .  }else{.    le
1a630 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 62 75 66 2c  mon_sprintf(buf,
1a640 22 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69  "%s.lt",lemp->fi
1a650 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69  lename);.  }.  i
1a660 66 28 20 61 63 63 65 73 73 28 62 75 66 2c 30 30  f( access(buf,00
1a670 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c  4)==0 ){.    tpl
1a680 74 6e 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d  tname = buf;.  }
1a690 65 6c 73 65 20 69 66 28 20 61 63 63 65 73 73 28  else if( access(
1a6a0 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34  templatename,004
1a6b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74  )==0 ){.    tplt
1a6c0 6e 61 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e  name = templaten
1a6d0 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
1a6e0 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74    tpltname = pat
1a6f0 68 73 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72  hsearch(lemp->ar
1a700 67 76 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65  gv0,templatename
1a710 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  ,0);.  }.  if( t
1a720 70 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  pltname==0 ){.  
1a730 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1a740 2c 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65  ,"Can't find the
1a750 20 70 61 72 73 65 72 20 64 72 69 76 65 72 20 74   parser driver t
1a760 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25  emplate file \"%
1a770 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d  s\".\n",.    tem
1a780 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20  platename);.    
1a790 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
1a7a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1a7b0 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e    }.  in = fopen
1a7c0 28 74 70 6c 74 6e 61 6d 65 2c 22 72 62 22 29 3b  (tpltname,"rb");
1a7d0 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
1a7e0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1a7f0 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74  rr,"Can't open t
1a800 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
1a810 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70   \"%s\".\n",temp
1a820 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c  latename);.    l
1a830 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
1a840 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1a850 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a   }.  return in;.
1a860 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 23 6c  }../* Print a #l
1a870 69 6e 65 20 64 69 72 65 63 74 69 76 65 20 6c 69  ine directive li
1a880 6e 65 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ne to the output
1a890 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54   file. */.PRIVAT
1a8a0 45 20 76 6f 69 64 20 74 70 6c 74 5f 6c 69 6e 65  E void tplt_line
1a8b0 64 69 72 28 46 49 4c 45 20 2a 6f 75 74 2c 20 69  dir(FILE *out, i
1a8c0 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 68 61 72 20  nt lineno, char 
1a8d0 2a 66 69 6c 65 6e 61 6d 65 29 0a 7b 0a 20 20 66  *filename).{.  f
1a8e0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e  printf(out,"#lin
1a8f0 65 20 25 64 20 5c 22 22 2c 6c 69 6e 65 6e 6f 29  e %d \"",lineno)
1a900 3b 0a 20 20 77 68 69 6c 65 28 20 2a 66 69 6c 65  ;.  while( *file
1a910 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69 66 28 20  name ){.    if( 
1a920 2a 66 69 6c 65 6e 61 6d 65 20 3d 3d 20 27 5c 5c  *filename == '\\
1a930 27 20 29 20 70 75 74 63 28 27 5c 5c 27 2c 6f 75  ' ) putc('\\',ou
1a940 74 29 3b 0a 20 20 20 20 70 75 74 63 28 2a 66 69  t);.    putc(*fi
1a950 6c 65 6e 61 6d 65 2c 6f 75 74 29 3b 0a 20 20 20  lename,out);.   
1a960 20 66 69 6c 65 6e 61 6d 65 2b 2b 3b 0a 20 20 7d   filename++;.  }
1a970 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1a980 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72  \"\n");.}../* Pr
1a990 69 6e 74 20 61 20 73 74 72 69 6e 67 20 74 6f 20  int a string to 
1a9a0 74 68 65 20 66 69 6c 65 20 61 6e 64 20 6b 65 65  the file and kee
1a9b0 70 20 74 68 65 20 6c 69 6e 65 6e 75 6d 62 65 72  p the linenumber
1a9c0 20 75 70 20 74 6f 20 64 61 74 65 20 2a 2f 0a 50   up to date */.P
1a9d0 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74  RIVATE void tplt
1a9e0 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74  _print(FILE *out
1a9f0 2c 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  , struct lemon *
1aa00 6c 65 6d 70 2c 20 63 68 61 72 20 2a 73 74 72 2c  lemp, char *str,
1aa10 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a   int *lineno).{.
1aa20 20 20 69 66 28 20 73 74 72 3d 3d 30 20 29 20 72    if( str==0 ) r
1aa30 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20  eturn;.  while( 
1aa40 2a 73 74 72 20 29 7b 0a 20 20 20 20 70 75 74 63  *str ){.    putc
1aa50 28 2a 73 74 72 2c 6f 75 74 29 3b 0a 20 20 20 20  (*str,out);.    
1aa60 69 66 28 20 2a 73 74 72 3d 3d 27 5c 6e 27 20 29  if( *str=='\n' )
1aa70 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
1aa80 20 20 73 74 72 2b 2b 3b 0a 20 20 7d 0a 20 20 69    str++;.  }.  i
1aa90 66 28 20 73 74 72 5b 2d 31 5d 21 3d 27 5c 6e 27  f( str[-1]!='\n'
1aaa0 20 29 7b 0a 20 20 20 20 70 75 74 63 28 27 5c 6e   ){.    putc('\n
1aab0 27 2c 6f 75 74 29 3b 0a 20 20 20 20 28 2a 6c 69  ',out);.    (*li
1aac0 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 7d 0a 20 20 69  neno)++;.  }.  i
1aad0 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65  f (!lemp->noline
1aae0 6e 6f 73 66 6c 61 67 29 20 7b 0a 20 20 20 20 28  nosflag) {.    (
1aaf0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74  *lineno)++; tplt
1ab00 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69  _linedir(out,*li
1ab10 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  neno,lemp->outna
1ab20 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  me);.  }.  retur
1ab30 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  n;.}../*.** The 
1ab40 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
1ab50 65 20 65 6d 69 74 73 20 63 6f 64 65 20 66 6f 72  e emits code for
1ab60 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
1ab70 66 6f 72 20 74 68 65 0a 2a 2a 20 73 79 6d 62 6f  for the.** symbo
1ab80 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64 20 65 6d 69  l sp.*/.void emi
1ab90 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64  t_destructor_cod
1aba0 65 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a  e(.  FILE *out,.
1abb0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1abc0 2a 73 70 2c 0a 20 20 73 74 72 75 63 74 20 6c 65  *sp,.  struct le
1abd0 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74  mon *lemp,.  int
1abe0 20 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a 20 63 68 61   *lineno.){. cha
1abf0 72 20 2a 63 70 20 3d 20 30 3b 0a 0a 20 69 66 28  r *cp = 0;.. if(
1ac00 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   sp->type==TERMI
1ac10 4e 41 4c 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c  NAL ){.   cp = l
1ac20 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a  emp->tokendest;.
1ac30 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72     if( cp==0 ) r
1ac40 65 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74  eturn;.   fprint
1ac50 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a  f(out,"{\n"); (*
1ac60 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73  lineno)++;. }els
1ac70 65 20 69 66 28 20 73 70 2d 3e 64 65 73 74 72 75  e if( sp->destru
1ac80 63 74 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d 20  ctor ){.   cp = 
1ac90 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a  sp->destructor;.
1aca0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1acb0 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29  {\n"); (*lineno)
1acc0 2b 2b 3b 0a 20 20 20 69 66 28 20 21 6c 65 6d 70  ++;.   if( !lemp
1acd0 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20  ->nolinenosflag 
1ace0 29 7b 0a 20 20 20 20 20 28 2a 6c 69 6e 65 6e 6f  ){.     (*lineno
1acf0 29 2b 2b 3b 0a 20 20 20 20 20 74 70 6c 74 5f 6c  )++;.     tplt_l
1ad00 69 6e 65 64 69 72 28 6f 75 74 2c 73 70 2d 3e 64  inedir(out,sp->d
1ad10 65 73 74 4c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e  estLineno,lemp->
1ad20 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a  filename);.   }.
1ad30 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 6d 70 2d   }else if( lemp-
1ad40 3e 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20 63  >vardest ){.   c
1ad50 70 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73  p = lemp->vardes
1ad60 74 3b 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20  t;.   if( cp==0 
1ad70 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 66 70 72  ) return;.   fpr
1ad80 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b  intf(out,"{\n");
1ad90 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d   (*lineno)++;. }
1ada0 65 6c 73 65 7b 0a 20 20 20 61 73 73 65 72 74 28  else{.   assert(
1adb0 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74   0 );  /* Cannot
1adc0 20 68 61 70 70 65 6e 20 2a 2f 0a 20 7d 0a 20 66   happen */. }. f
1add0 6f 72 28 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b  or(; *cp; cp++){
1ade0 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d 27 24 27  .   if( *cp=='$'
1adf0 20 26 26 20 63 70 5b 31 5d 3d 3d 27 24 27 20 29   && cp[1]=='$' )
1ae00 7b 0a 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  {.     fprintf(o
1ae10 75 74 2c 22 28 79 79 70 6d 69 6e 6f 72 2d 3e 79  ut,"(yypminor->y
1ae20 79 25 64 29 22 2c 73 70 2d 3e 64 74 6e 75 6d 29  y%d)",sp->dtnum)
1ae30 3b 0a 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20  ;.     cp++;.   
1ae40 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 7d    continue;.   }
1ae50 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e  .   if( *cp=='\n
1ae60 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ' ) (*lineno)++;
1ae70 0a 20 20 20 66 70 75 74 63 28 2a 63 70 2c 6f 75  .   fputc(*cp,ou
1ae80 74 29 3b 0a 20 7d 0a 20 66 70 72 69 6e 74 66 28  t);. }. fprintf(
1ae90 6f 75 74 2c 22 5c 6e 22 29 3b 20 28 2a 6c 69 6e  out,"\n"); (*lin
1aea0 65 6e 6f 29 2b 2b 3b 0a 20 69 66 20 28 21 6c 65  eno)++;. if (!le
1aeb0 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  mp->nolinenosfla
1aec0 67 29 20 7b 0a 20 20 20 28 2a 6c 69 6e 65 6e 6f  g) {.   (*lineno
1aed0 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69  )++; tplt_linedi
1aee0 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65  r(out,*lineno,le
1aef0 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 7d  mp->outname);. }
1af00 0a 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d  . fprintf(out,"}
1af10 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n"); (*lineno)+
1af20 2b 3b 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  +;. return;.}../
1af30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1af40 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74   (non-zero) if t
1af50 68 65 20 67 69 76 65 6e 20 73 79 6d 62 6f 6c 20  he given symbol 
1af60 68 61 73 20 61 20 64 65 73 74 72 75 63 74 6f 72  has a destructor
1af70 2e 0a 2a 2f 0a 69 6e 74 20 68 61 73 5f 64 65 73  ..*/.int has_des
1af80 74 72 75 63 74 6f 72 28 73 74 72 75 63 74 20 73  tructor(struct s
1af90 79 6d 62 6f 6c 20 2a 73 70 2c 20 73 74 72 75 63  ymbol *sp, struc
1afa0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
1afb0 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 69 66  .  int ret;.  if
1afc0 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  ( sp->type==TERM
1afd0 49 4e 41 4c 20 29 7b 0a 20 20 20 20 72 65 74 20  INAL ){.    ret 
1afe0 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73  = lemp->tokendes
1aff0 74 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  t!=0;.  }else{. 
1b000 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 76     ret = lemp->v
1b010 61 72 64 65 73 74 21 3d 30 20 7c 7c 20 73 70 2d  ardest!=0 || sp-
1b020 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30 3b 0a  >destructor!=0;.
1b030 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
1b040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1b050 64 20 74 65 78 74 20 74 6f 20 61 20 64 79 6e 61  d text to a dyna
1b060 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
1b070 64 20 73 74 72 69 6e 67 2e 20 20 49 66 20 7a 54  d string.  If zT
1b080 65 78 74 20 69 73 20 30 20 74 68 65 6e 0a 2a 2a  ext is 0 then.**
1b090 20 72 65 73 65 74 20 74 68 65 20 73 74 72 69 6e   reset the strin
1b0a0 67 20 74 6f 20 62 65 20 65 6d 70 74 79 20 61 67  g to be empty ag
1b0b0 61 69 6e 2e 20 20 41 6c 77 61 79 73 20 72 65 74  ain.  Always ret
1b0c0 75 72 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  urn the complete
1b0d0 20 74 65 78 74 0a 2a 2a 20 6f 66 20 74 68 65 20   text.** of the 
1b0e0 73 74 72 69 6e 67 20 28 77 68 69 63 68 20 69 73  string (which is
1b0f0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74   overwritten wit
1b100 68 20 65 61 63 68 20 63 61 6c 6c 29 2e 0a 2a 2a  h each call)..**
1b110 0a 2a 2a 20 6e 20 62 79 74 65 73 20 6f 66 20 7a  .** n bytes of z
1b120 54 65 78 74 20 61 72 65 20 73 74 6f 72 65 64 2e  Text are stored.
1b130 20 20 49 66 20 6e 3d 3d 30 20 74 68 65 6e 20 61    If n==0 then a
1b140 6c 6c 20 6f 66 20 7a 54 65 78 74 20 75 70 20 74  ll of zText up t
1b150 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 5c  o the first.** \
1b160 30 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 69  000 terminator i
1b170 73 20 73 74 6f 72 65 64 2e 20 20 7a 54 65 78 74  s stored.  zText
1b180 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20 75 70 20   can contain up 
1b190 74 6f 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73  to two instances
1b1a0 20 6f 66 0a 2a 2a 20 25 64 2e 20 20 54 68 65 20   of.** %d.  The 
1b1b0 76 61 6c 75 65 73 20 6f 66 20 70 31 20 61 6e 64  values of p1 and
1b1c0 20 70 32 20 61 72 65 20 77 72 69 74 74 65 6e 20   p2 are written 
1b1d0 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 20 61  into the first a
1b1e0 6e 64 20 73 65 63 6f 6e 64 0a 2a 2a 20 25 64 2e  nd second.** %d.
1b1f0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 2d 31 2c  .**.** If n==-1,
1b200 20 74 68 65 6e 20 74 68 65 20 70 72 65 76 69 6f   then the previo
1b210 75 73 20 63 68 61 72 61 63 74 65 72 20 69 73 20  us character is 
1b220 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a  overwritten..*/.
1b230 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 61 70  PRIVATE char *ap
1b240 70 65 6e 64 5f 73 74 72 28 63 6f 6e 73 74 20 63  pend_str(const c
1b250 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20  har *zText, int 
1b260 6e 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  n, int p1, int p
1b270 32 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  2){.  static cha
1b280 72 20 65 6d 70 74 79 5b 31 5d 20 3d 20 7b 20 30  r empty[1] = { 0
1b290 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61   };.  static cha
1b2a0 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 73 74 61 74  r *z = 0;.  stat
1b2b0 69 63 20 69 6e 74 20 61 6c 6c 6f 63 65 64 20 3d  ic int alloced =
1b2c0 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
1b2d0 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74   used = 0;.  int
1b2e0 20 63 3b 0a 20 20 63 68 61 72 20 7a 49 6e 74 5b   c;.  char zInt[
1b2f0 34 30 5d 3b 0a 20 20 69 66 28 20 7a 54 65 78 74  40];.  if( zText
1b300 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 75  ==0 ){.    if( u
1b310 73 65 64 3d 3d 30 20 26 26 20 7a 21 3d 30 20 29  sed==0 && z!=0 )
1b320 20 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 75   z[0] = 0;.    u
1b330 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  sed = 0;.    ret
1b340 75 72 6e 20 7a 3b 0a 20 20 7d 0a 20 20 69 66 28  urn z;.  }.  if(
1b350 20 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28   n<=0 ){.    if(
1b360 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 73   n<0 ){.      us
1b370 65 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 61  ed += n;.      a
1b380 73 73 65 72 74 28 20 75 73 65 64 3e 3d 30 20 29  ssert( used>=0 )
1b390 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
1b3a0 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 54 65 78  lemonStrlen(zTex
1b3b0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69  t);.  }.  if( (i
1b3c0 6e 74 29 20 28 6e 2b 73 69 7a 65 6f 66 28 7a 49  nt) (n+sizeof(zI
1b3d0 6e 74 29 2a 32 2b 75 73 65 64 29 20 3e 3d 20 61  nt)*2+used) >= a
1b3e0 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 61 6c  lloced ){.    al
1b3f0 6c 6f 63 65 64 20 3d 20 6e 20 2b 20 73 69 7a 65  loced = n + size
1b400 6f 66 28 7a 49 6e 74 29 2a 32 20 2b 20 75 73 65  of(zInt)*2 + use
1b410 64 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 20 3d  d + 200;.    z =
1b420 20 28 63 68 61 72 20 2a 29 20 72 65 61 6c 6c 6f   (char *) reallo
1b430 63 28 7a 2c 20 20 61 6c 6c 6f 63 65 64 29 3b 0a  c(z,  alloced);.
1b440 20 20 7d 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29    }.  if( z==0 )
1b450 20 72 65 74 75 72 6e 20 65 6d 70 74 79 3b 0a 20   return empty;. 
1b460 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20   while( n-- > 0 
1b470 29 7b 0a 20 20 20 20 63 20 3d 20 2a 28 7a 54 65  ){.    c = *(zTe
1b480 78 74 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63  xt++);.    if( c
1b490 3d 3d 27 25 27 20 26 26 20 6e 3e 30 20 26 26 20  =='%' && n>0 && 
1b4a0 7a 54 65 78 74 5b 30 5d 3d 3d 27 64 27 20 29 7b  zText[0]=='d' ){
1b4b0 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72  .      lemon_spr
1b4c0 69 6e 74 66 28 7a 49 6e 74 2c 20 22 25 64 22 2c  intf(zInt, "%d",
1b4d0 20 70 31 29 3b 0a 20 20 20 20 20 20 70 31 20 3d   p1);.      p1 =
1b4e0 20 70 32 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e   p2;.      lemon
1b4f0 5f 73 74 72 63 70 79 28 26 7a 5b 75 73 65 64 5d  _strcpy(&z[used]
1b500 2c 20 7a 49 6e 74 29 3b 0a 20 20 20 20 20 20 75  , zInt);.      u
1b510 73 65 64 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c  sed += lemonStrl
1b520 65 6e 28 26 7a 5b 75 73 65 64 5d 29 3b 0a 20 20  en(&z[used]);.  
1b530 20 20 20 20 7a 54 65 78 74 2b 2b 3b 0a 20 20 20      zText++;.   
1b540 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73     n--;.    }els
1b550 65 7b 0a 20 20 20 20 20 20 7a 5b 75 73 65 64 2b  e{.      z[used+
1b560 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a 20 20  +] = (char)c;.  
1b570 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b 75 73 65 64    }.  }.  z[used
1b580 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
1b590 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  z;.}../*.** Writ
1b5a0 65 20 61 6e 64 20 74 72 61 6e 73 66 6f 72 6d 20  e and transform 
1b5b0 74 68 65 20 72 70 2d 3e 63 6f 64 65 20 73 74 72  the rp->code str
1b5c0 69 6e 67 20 73 6f 20 74 68 61 74 20 73 79 6d 62  ing so that symb
1b5d0 6f 6c 73 20 61 72 65 20 65 78 70 61 6e 64 65 64  ols are expanded
1b5e0 2e 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68  ..** Populate th
1b5f0 65 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78  e rp->codePrefix
1b600 20 61 6e 64 20 72 70 2d 3e 63 6f 64 65 53 75 66   and rp->codeSuf
1b610 66 69 78 20 73 74 72 69 6e 67 73 2c 20 61 73 20  fix strings, as 
1b620 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 0a  appropriate..**.
1b630 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  ** Return 1 if t
1b640 68 65 20 65 78 70 61 6e 64 65 64 20 63 6f 64 65  he expanded code
1b650 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 22   requires that "
1b660 79 79 6c 68 73 6d 69 6e 6f 72 22 20 6c 6f 63 61  yylhsminor" loca
1b670 6c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 6f  l variable.** to
1b680 20 62 65 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   be defined..*/.
1b690 50 52 49 56 41 54 45 20 69 6e 74 20 74 72 61 6e  PRIVATE int tran
1b6a0 73 6c 61 74 65 5f 63 6f 64 65 28 73 74 72 75 63  slate_code(struc
1b6b0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73  t lemon *lemp, s
1b6c0 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b  truct rule *rp){
1b6d0 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 78 70  .  char *cp, *xp
1b6e0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
1b6f0 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1b700 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 79      /* True if y
1b710 79 6c 68 73 6d 69 6e 6f 72 20 69 73 20 75 73 65  ylhsminor is use
1b720 64 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 6e 74 55  d */.  int dontU
1b730 73 65 52 68 73 30 20 3d 20 30 3b 20 20 20 2f 2a  seRhs0 = 0;   /*
1b740 20 49 66 20 74 72 75 65 2c 20 75 73 65 20 6f 66   If true, use of
1b750 20 6c 65 66 74 2d 6d 6f 73 74 20 52 48 53 20 6c   left-most RHS l
1b760 61 62 65 6c 20 69 73 20 69 6c 6c 65 67 61 6c 20  abel is illegal 
1b770 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1b780 2a 7a 53 6b 69 70 20 3d 20 30 3b 20 2f 2a 20 54  *zSkip = 0; /* T
1b790 68 65 20 7a 4f 76 77 72 74 20 63 6f 6d 6d 65 6e  he zOvwrt commen
1b7a0 74 20 77 69 74 68 69 6e 20 72 70 2d 3e 63 6f 64  t within rp->cod
1b7b0 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
1b7c0 63 68 61 72 20 6c 68 73 75 73 65 64 20 3d 20 30  char lhsused = 0
1b7d0 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ;      /* True i
1b7e0 66 20 74 68 65 20 4c 48 53 20 65 6c 65 6d 65 6e  f the LHS elemen
1b7f0 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20  t has been used 
1b800 2a 2f 0a 20 20 63 68 61 72 20 6c 68 73 64 69 72  */.  char lhsdir
1b810 65 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ect;        /* T
1b820 72 75 65 20 69 66 20 4c 48 53 20 77 72 69 74 65  rue if LHS write
1b830 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
1b840 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20  stack */.  char 
1b850 75 73 65 64 5b 4d 41 58 52 48 53 5d 3b 20 20 20  used[MAXRHS];   
1b860 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 65 61    /* True for ea
1b870 63 68 20 52 48 53 20 65 6c 65 6d 65 6e 74 20 77  ch RHS element w
1b880 68 69 63 68 20 69 73 20 75 73 65 64 20 2a 2f 0a  hich is used */.
1b890 20 20 63 68 61 72 20 7a 4c 68 73 5b 35 30 5d 3b    char zLhs[50];
1b8a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76           /* Conv
1b8b0 65 72 74 20 74 68 65 20 4c 48 53 20 73 79 6d 62  ert the LHS symb
1b8c0 6f 6c 20 69 6e 74 6f 20 74 68 69 73 20 73 74 72  ol into this str
1b8d0 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4f  ing */.  char zO
1b8e0 76 77 72 74 5b 39 30 30 5d 3b 20 20 20 20 20 20  vwrt[900];      
1b8f0 2f 2a 20 43 6f 6d 6d 65 6e 74 20 74 68 61 74 20  /* Comment that 
1b900 74 6f 20 61 6c 6c 6f 77 20 4c 48 53 20 74 6f 20  to allow LHS to 
1b910 6f 76 65 72 77 72 69 74 65 20 52 48 53 20 2a 2f  overwrite RHS */
1b920 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72  ..  for(i=0; i<r
1b930 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75 73  p->nrhs; i++) us
1b940 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 6c 68 73  ed[i] = 0;.  lhs
1b950 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28  used = 0;..  if(
1b960 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 7b 0a   rp->code==0 ){.
1b970 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
1b980 6e 65 77 6c 69 6e 65 73 74 72 5b 32 5d 20 3d 20  newlinestr[2] = 
1b990 7b 20 27 5c 6e 27 2c 20 27 5c 30 27 20 7d 3b 0a  { '\n', '\0' };.
1b9a0 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 6e      rp->code = n
1b9b0 65 77 6c 69 6e 65 73 74 72 3b 0a 20 20 20 20 72  ewlinestr;.    r
1b9c0 70 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d 3e 72 75  p->line = rp->ru
1b9d0 6c 65 6c 69 6e 65 3b 0a 20 20 20 20 72 70 2d 3e  leline;.    rp->
1b9e0 6e 6f 43 6f 64 65 20 3d 20 31 3b 0a 20 20 7d 65  noCode = 1;.  }e
1b9f0 6c 73 65 7b 0a 20 20 20 20 72 70 2d 3e 6e 6f 43  lse{.    rp->noC
1ba00 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 0a 20  ode = 0;.  }... 
1ba10 20 69 66 28 20 72 70 2d 3e 6e 72 68 73 3d 3d 30   if( rp->nrhs==0
1ba20 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1ba30 65 72 65 20 61 72 65 20 6e 6f 20 52 48 53 20 73  ere are no RHS s
1ba40 79 6d 62 6f 6c 73 2c 20 74 68 65 6e 20 77 72 69  ymbols, then wri
1ba50 74 69 6e 67 20 64 69 72 65 63 74 6c 79 20 74 6f  ting directly to
1ba60 20 74 68 65 20 4c 48 53 20 69 73 20 6f 6b 20 2a   the LHS is ok *
1ba70 2f 0a 20 20 20 20 6c 68 73 64 69 72 65 63 74 20  /.    lhsdirect 
1ba80 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
1ba90 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d   rp->rhsalias[0]
1baa0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1bab0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 52 48 53 20  e left-most RHS 
1bac0 73 79 6d 62 6f 6c 20 68 61 73 20 6e 6f 20 76 61  symbol has no va
1bad0 6c 75 65 2e 20 20 4c 48 53 20 64 69 72 65 63 74  lue.  LHS direct
1bae0 20 69 73 20 6f 6b 2e 20 20 42 75 74 0a 20 20 20   is ok.  But.   
1baf0 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 63   ** we have to c
1bb00 61 6c 6c 20 74 68 65 20 64 69 73 74 72 75 63 74  all the distruct
1bb10 6f 72 20 6f 6e 20 74 68 65 20 52 48 53 20 73 79  or on the RHS sy
1bb20 6d 62 6f 6c 20 66 69 72 73 74 2e 20 2a 2f 0a 20  mbol first. */. 
1bb30 20 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20 31     lhsdirect = 1
1bb40 3b 0a 20 20 20 20 69 66 28 20 68 61 73 5f 64 65  ;.    if( has_de
1bb50 73 74 72 75 63 74 6f 72 28 72 70 2d 3e 72 68 73  structor(rp->rhs
1bb60 5b 30 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20 20  [0],lemp) ){.   
1bb70 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c     append_str(0,
1bb80 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 61 70  0,0,0);.      ap
1bb90 70 65 6e 64 5f 73 74 72 28 22 20 20 79 79 5f 64  pend_str("  yy_d
1bba0 65 73 74 72 75 63 74 6f 72 28 79 79 70 50 61 72  estructor(yypPar
1bbb0 73 65 72 2c 25 64 2c 26 79 79 6d 73 70 5b 25 64  ser,%d,&yymsp[%d
1bbc0 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e 22 2c 20 30 2c  ].minor);\n", 0,
1bbd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bbe0 20 20 72 70 2d 3e 72 68 73 5b 30 5d 2d 3e 69 6e    rp->rhs[0]->in
1bbf0 64 65 78 2c 31 2d 72 70 2d 3e 6e 72 68 73 29 3b  dex,1-rp->nrhs);
1bc00 0a 20 20 20 20 20 20 72 70 2d 3e 63 6f 64 65 50  .      rp->codeP
1bc10 72 65 66 69 78 20 3d 20 53 74 72 73 61 66 65 28  refix = Strsafe(
1bc20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30  append_str(0,0,0
1bc30 2c 30 29 29 3b 0a 20 20 20 20 20 20 72 70 2d 3e  ,0));.      rp->
1bc40 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  noCode = 0;.    
1bc50 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70  }.  }else if( rp
1bc60 2d 3e 6c 68 73 61 6c 69 61 73 3d 3d 30 20 29 7b  ->lhsalias==0 ){
1bc70 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73  .    /* There is
1bc80 20 6e 6f 20 4c 48 53 20 76 61 6c 75 65 20 73 79   no LHS value sy
1bc90 6d 62 6f 6c 2e 20 2a 2f 0a 20 20 20 20 6c 68 73  mbol. */.    lhs
1bca0 64 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 7d 65  direct = 1;.  }e
1bcb0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 72  lse if( strcmp(r
1bcc0 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e  p->lhsalias,rp->
1bcd0 72 68 73 61 6c 69 61 73 5b 30 5d 29 3d 3d 30 20  rhsalias[0])==0 
1bce0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4c 48  ){.    /* The LH
1bcf0 53 20 73 79 6d 62 6f 6c 20 61 6e 64 20 74 68 65  S symbol and the
1bd00 20 6c 65 66 74 2d 6d 6f 73 74 20 52 48 53 20 73   left-most RHS s
1bd10 79 6d 62 6f 6c 20 61 72 65 20 74 68 65 20 73 61  ymbol are the sa
1bd20 6d 65 2c 20 73 6f 0a 20 20 20 20 2a 2a 20 64 69  me, so.    ** di
1bd30 72 65 63 74 20 77 72 69 74 69 6e 67 20 69 73 20  rect writing is 
1bd40 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20 6c  allowed */.    l
1bd50 68 73 64 69 72 65 63 74 20 3d 20 31 3b 0a 20 20  hsdirect = 1;.  
1bd60 20 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a 20    lhsused = 1;. 
1bd70 20 20 20 75 73 65 64 5b 30 5d 20 3d 20 31 3b 0a     used[0] = 1;.
1bd80 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 2d      if( rp->lhs-
1bd90 3e 64 74 6e 75 6d 21 3d 72 70 2d 3e 72 68 73 5b  >dtnum!=rp->rhs[
1bda0 30 5d 2d 3e 64 74 6e 75 6d 20 29 7b 0a 20 20 20  0]->dtnum ){.   
1bdb0 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
1bdc0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72  ->filename,rp->r
1bdd0 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20  uleline,.       
1bde0 20 22 25 73 28 25 73 29 20 61 6e 64 20 25 73 28   "%s(%s) and %s(
1bdf0 25 73 29 20 73 68 61 72 65 20 74 68 65 20 73 61  %s) share the sa
1be00 6d 65 20 6c 61 62 65 6c 20 62 75 74 20 68 61 76  me label but hav
1be10 65 20 22 0a 20 20 20 20 20 20 20 20 22 64 69 66  e ".        "dif
1be20 66 65 72 65 6e 74 20 64 61 74 61 74 79 70 65 73  ferent datatypes
1be30 2e 22 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e  .",.        rp->
1be40 6c 68 73 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 6c  lhs->name, rp->l
1be50 68 73 61 6c 69 61 73 2c 20 72 70 2d 3e 72 68 73  hsalias, rp->rhs
1be60 5b 30 5d 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e 72  [0]->name, rp->r
1be70 68 73 61 6c 69 61 73 5b 30 5d 29 3b 0a 20 20 20  hsalias[0]);.   
1be80 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
1be90 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  t++;.    }.  }el
1bea0 73 65 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70  se{.    lemon_sp
1beb0 72 69 6e 74 66 28 7a 4f 76 77 72 74 2c 20 22 2f  rintf(zOvwrt, "/
1bec0 2a 25 73 2d 6f 76 65 72 77 72 69 74 65 73 2d 25  *%s-overwrites-%
1bed0 73 2a 2f 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s*/",.          
1bee0 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61          rp->lhsa
1bef0 6c 69 61 73 2c 20 72 70 2d 3e 72 68 73 61 6c 69  lias, rp->rhsali
1bf00 61 73 5b 30 5d 29 3b 0a 20 20 20 20 7a 53 6b 69  as[0]);.    zSki
1bf10 70 20 3d 20 73 74 72 73 74 72 28 72 70 2d 3e 63  p = strstr(rp->c
1bf20 6f 64 65 2c 20 7a 4f 76 77 72 74 29 3b 0a 20 20  ode, zOvwrt);.  
1bf30 20 20 69 66 28 20 7a 53 6b 69 70 21 3d 30 20 29    if( zSkip!=0 )
1bf40 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
1bf50 6f 64 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  ode contains a s
1bf60 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 20 74  pecial comment t
1bf70 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68  hat indicates th
1bf80 61 74 20 69 74 20 69 73 20 73 61 66 65 0a 20 20  at it is safe.  
1bf90 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 4c      ** for the L
1bfa0 48 53 20 6c 61 62 65 6c 20 74 6f 20 6f 76 65 72  HS label to over
1bfb0 77 72 69 74 65 20 6c 65 66 74 2d 6d 6f 73 74 20  write left-most 
1bfc0 52 48 53 20 6c 61 62 65 6c 2e 20 2a 2f 0a 20 20  RHS label. */.  
1bfd0 20 20 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20      lhsdirect = 
1bfe0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1bff0 20 20 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20      lhsdirect = 
1c000 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
1c010 66 28 20 6c 68 73 64 69 72 65 63 74 20 29 7b 0a  f( lhsdirect ){.
1c020 20 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 68 73      sprintf(zLhs
1c030 2c 20 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e  , "yymsp[%d].min
1c040 6f 72 2e 79 79 25 64 22 2c 31 2d 72 70 2d 3e 6e  or.yy%d",1-rp->n
1c050 72 68 73 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e  rhs,rp->lhs->dtn
1c060 75 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  um);.  }else{.  
1c070 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 70    rc = 1;.    sp
1c080 72 69 6e 74 66 28 7a 4c 68 73 2c 20 22 79 79 6c  rintf(zLhs, "yyl
1c090 68 73 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 72 70  hsminor.yy%d",rp
1c0a0 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20  ->lhs->dtnum);. 
1c0b0 20 7d 0a 0a 20 20 61 70 70 65 6e 64 5f 73 74 72   }..  append_str
1c0c0 28 30 2c 30 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a  (0,0,0,0);..  /*
1c0d0 20 54 68 69 73 20 63 6f 6e 73 74 20 63 61 73 74   This const cast
1c0e0 20 69 73 20 77 72 6f 6e 67 20 62 75 74 20 68 61   is wrong but ha
1c0f0 72 6d 6c 65 73 73 2c 20 69 66 20 77 65 27 72 65  rmless, if we're
1c100 20 63 61 72 65 66 75 6c 2e 20 2a 2f 0a 20 20 66   careful. */.  f
1c110 6f 72 28 63 70 3d 28 63 68 61 72 20 2a 29 72 70  or(cp=(char *)rp
1c120 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b  ->code; *cp; cp+
1c130 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 70 3d 3d  +){.    if( cp==
1c140 7a 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 61  zSkip ){.      a
1c150 70 70 65 6e 64 5f 73 74 72 28 7a 4f 76 77 72 74  ppend_str(zOvwrt
1c160 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 63  ,0,0,0);.      c
1c170 70 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  p += lemonStrlen
1c180 28 7a 4f 76 77 72 74 29 2d 31 3b 0a 20 20 20 20  (zOvwrt)-1;.    
1c190 20 20 64 6f 6e 74 55 73 65 52 68 73 30 20 3d 20    dontUseRhs0 = 
1c1a0 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  1;.      continu
1c1b0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
1c1c0 20 49 53 41 4c 50 48 41 28 2a 63 70 29 20 26 26   ISALPHA(*cp) &&
1c1d0 20 28 63 70 3d 3d 72 70 2d 3e 63 6f 64 65 20 7c   (cp==rp->code |
1c1e0 7c 20 28 21 49 53 41 4c 4e 55 4d 28 63 70 5b 2d  | (!ISALNUM(cp[-
1c1f0 31 5d 29 20 26 26 20 63 70 5b 2d 31 5d 21 3d 27  1]) && cp[-1]!='
1c200 5f 27 29 29 20 29 7b 0a 20 20 20 20 20 20 63 68  _')) ){.      ch
1c210 61 72 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20  ar saved;.      
1c220 66 6f 72 28 78 70 3d 20 26 63 70 5b 31 5d 3b 20  for(xp= &cp[1]; 
1c230 49 53 41 4c 4e 55 4d 28 2a 78 70 29 20 7c 7c 20  ISALNUM(*xp) || 
1c240 2a 78 70 3d 3d 27 5f 27 3b 20 78 70 2b 2b 29 3b  *xp=='_'; xp++);
1c250 0a 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a  .      saved = *
1c260 78 70 3b 0a 20 20 20 20 20 20 2a 78 70 20 3d 20  xp;.      *xp = 
1c270 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d  0;.      if( rp-
1c280 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 73 74 72  >lhsalias && str
1c290 63 6d 70 28 63 70 2c 72 70 2d 3e 6c 68 73 61 6c  cmp(cp,rp->lhsal
1c2a0 69 61 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ias)==0 ){.     
1c2b0 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 7a 4c     append_str(zL
1c2c0 68 73 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20  hs,0,0,0);.     
1c2d0 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20     cp = xp;.    
1c2e0 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20 31 3b      lhsused = 1;
1c2f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c300 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1c310 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
1c320 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1c330 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26  p->rhsalias[i] &
1c340 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e  & strcmp(cp,rp->
1c350 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20  rhsalias[i])==0 
1c360 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
1c370 66 28 20 69 3d 3d 30 20 26 26 20 64 6f 6e 74 55  f( i==0 && dontU
1c380 73 65 52 68 73 30 20 29 7b 0a 20 20 20 20 20 20  seRhs0 ){.      
1c390 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
1c3a0 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
1c3b0 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20  rp->ruleline,.  
1c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1c3d0 4c 61 62 65 6c 20 25 73 20 75 73 65 64 20 61 66  Label %s used af
1c3e0 74 65 72 20 27 25 73 27 2e 22 2c 0a 20 20 20 20  ter '%s'.",.    
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d               rp-
1c400 3e 72 68 73 61 6c 69 61 73 5b 30 5d 2c 20 7a 4f  >rhsalias[0], zO
1c410 76 77 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20  vwrt);.         
1c420 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
1c430 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
1c440 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 70 21     }else if( cp!
1c450 3d 72 70 2d 3e 63 6f 64 65 20 26 26 20 63 70 5b  =rp->code && cp[
1c460 2d 31 5d 3d 3d 27 40 27 20 29 7b 0a 20 20 20 20  -1]=='@' ){.    
1c470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1c480 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  the argument is 
1c490 6f 66 20 74 68 65 20 66 6f 72 6d 20 40 58 20 74  of the form @X t
1c4a0 68 65 6e 20 73 75 62 73 74 69 74 75 74 65 64 0a  hen substituted.
1c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1c4c0 20 74 68 65 20 74 6f 6b 65 6e 20 6e 75 6d 62 65   the token numbe
1c4d0 72 20 6f 66 20 58 2c 20 6e 6f 74 20 74 68 65 20  r of X, not the 
1c4e0 76 61 6c 75 65 20 6f 66 20 58 20 2a 2f 0a 20 20  value of X */.  
1c4f0 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65              appe
1c500 6e 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25 64  nd_str("yymsp[%d
1c510 5d 2e 6d 61 6a 6f 72 22 2c 2d 31 2c 69 2d 72 70  ].major",-1,i-rp
1c520 2d 3e 6e 72 68 73 2b 31 2c 30 29 3b 0a 20 20 20  ->nrhs+1,0);.   
1c530 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
1c550 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
1c560 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20  = rp->rhs[i];.  
1c570 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1c580 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  dtnum;.         
1c590 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70       if( sp->typ
1c5a0 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
1c5b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1c5c0 20 20 20 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e      dtnum = sp->
1c5d0 73 75 62 73 79 6d 5b 30 5d 2d 3e 64 74 6e 75 6d  subsym[0]->dtnum
1c5e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1c5f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1c600 20 20 20 20 20 20 20 64 74 6e 75 6d 20 3d 20 73         dtnum = s
1c610 70 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20  p->dtnum;.      
1c620 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c630 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73          append_s
1c640 74 72 28 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69  tr("yymsp[%d].mi
1c650 6e 6f 72 2e 79 79 25 64 22 2c 30 2c 69 2d 72 70  nor.yy%d",0,i-rp
1c660 2d 3e 6e 72 68 73 2b 31 2c 20 64 74 6e 75 6d 29  ->nrhs+1, dtnum)
1c670 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1c680 20 20 20 20 20 20 20 20 20 20 20 20 63 70 20 3d              cp =
1c690 20 78 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20   xp;.           
1c6a0 20 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20   used[i] = 1;.  
1c6b0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c6c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c6d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c6e0 20 20 20 20 20 2a 78 70 20 3d 20 73 61 76 65 64       *xp = saved
1c6f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 70 70 65  ;.    }.    appe
1c700 6e 64 5f 73 74 72 28 63 70 2c 20 31 2c 20 30 2c  nd_str(cp, 1, 0,
1c710 20 30 29 3b 0a 20 20 7d 20 2f 2a 20 45 6e 64 20   0);.  } /* End 
1c720 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61  loop */..  /* Ma
1c730 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  in code generati
1c740 6f 6e 20 63 6f 6d 70 6c 65 74 65 64 20 2a 2f 0a  on completed */.
1c750 20 20 63 70 20 3d 20 61 70 70 65 6e 64 5f 73 74    cp = append_st
1c760 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 69 66  r(0,0,0,0);.  if
1c770 28 20 63 70 20 26 26 20 63 70 5b 30 5d 20 29 20  ( cp && cp[0] ) 
1c780 72 70 2d 3e 63 6f 64 65 20 3d 20 53 74 72 73 61  rp->code = Strsa
1c790 66 65 28 63 70 29 3b 0a 20 20 61 70 70 65 6e 64  fe(cp);.  append
1c7a0 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 0a  _str(0,0,0,0);..
1c7b0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    /* Check to ma
1c7c0 6b 65 20 73 75 72 65 20 74 68 65 20 4c 48 53 20  ke sure the LHS 
1c7d0 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f  has been used */
1c7e0 0a 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c  .  if( rp->lhsal
1c7f0 69 61 73 20 26 26 20 21 6c 68 73 75 73 65 64 20  ias && !lhsused 
1c800 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28  ){.    ErrorMsg(
1c810 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72  lemp->filename,r
1c820 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20  p->ruleline,.   
1c830 20 20 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c 22     "Label \"%s\"
1c840 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22 20   for \"%s(%s)\" 
1c850 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22 2c  is never used.",
1c860 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73  .        rp->lhs
1c870 61 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e 6e  alias,rp->lhs->n
1c880 61 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73  ame,rp->lhsalias
1c890 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  );.    lemp->err
1c8a0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  orcnt++;.  }..  
1c8b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 64 65 73 74  /* Generate dest
1c8c0 72 75 63 74 6f 72 20 63 6f 64 65 20 66 6f 72 20  ructor code for 
1c8d0 52 48 53 20 6d 69 6e 6f 72 20 76 61 6c 75 65 73  RHS minor values
1c8e0 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 72   which are not r
1c8f0 65 66 65 72 65 6e 63 65 64 2e 0a 20 20 2a 2a 20  eferenced..  ** 
1c900 47 65 6e 65 72 61 74 65 20 65 72 72 6f 72 20 6d  Generate error m
1c910 65 73 73 61 67 65 73 20 66 6f 72 20 75 6e 75 73  essages for unus
1c920 65 64 20 6c 61 62 65 6c 73 20 61 6e 64 20 64 75  ed labels and du
1c930 70 6c 69 63 61 74 65 20 6c 61 62 65 6c 73 2e 0a  plicate labels..
1c940 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
1c950 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
1c960 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68  {.    if( rp->rh
1c970 73 61 6c 69 61 73 5b 69 5d 20 29 7b 0a 20 20 20  salias[i] ){.   
1c980 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
1c990 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
1c9a0 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73       if( rp->lhs
1c9b0 61 6c 69 61 73 20 26 26 20 73 74 72 63 6d 70 28  alias && strcmp(
1c9c0 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d  rp->lhsalias,rp-
1c9d0 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30  >rhsalias[i])==0
1c9e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
1c9f0 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
1ca00 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69  ename,rp->ruleli
1ca10 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ne,.            
1ca20 22 25 73 28 25 73 29 20 68 61 73 20 74 68 65 20  "%s(%s) has the 
1ca30 73 61 6d 65 20 6c 61 62 65 6c 20 61 73 20 74 68  same label as th
1ca40 65 20 4c 48 53 20 62 75 74 20 69 73 20 6e 6f 74  e LHS but is not
1ca50 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 22   the left-most "
1ca60 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73 79  .            "sy
1ca70 6d 62 6f 6c 20 6f 6e 20 74 68 65 20 52 48 53 2e  mbol on the RHS.
1ca80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ",.            r
1ca90 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c  p->rhs[i]->name,
1caa0 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 29 3b 0a   rp->rhsalias);.
1cab0 20 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e            lemp->
1cac0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
1cad0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
1cae0 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  r(j=0; j<i; j++)
1caf0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1cb00 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 6a 5d 20  rp->rhsalias[j] 
1cb10 26 26 20 73 74 72 63 6d 70 28 72 70 2d 3e 72 68  && strcmp(rp->rh
1cb20 73 61 6c 69 61 73 5b 6a 5d 2c 72 70 2d 3e 72 68  salias[j],rp->rh
1cb30 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20 29 7b  salias[i])==0 ){
1cb40 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 72 72  .            Err
1cb50 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
1cb60 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e  name,rp->rulelin
1cb70 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1cb80 20 22 4c 61 62 65 6c 20 25 73 20 75 73 65 64 20   "Label %s used 
1cb90 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20 73 79 6d  for multiple sym
1cba0 62 6f 6c 73 20 6f 6e 20 74 68 65 20 52 48 53 20  bols on the RHS 
1cbb0 6f 66 20 61 20 72 75 6c 65 2e 22 2c 0a 20 20 20  of a rule.",.   
1cbc0 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72             rp->r
1cbd0 68 73 61 6c 69 61 73 5b 69 5d 29 3b 0a 20 20 20  hsalias[i]);.   
1cbe0 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65           lemp->e
1cbf0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
1cc00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1cc10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cc20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1cc30 20 20 69 66 28 20 21 75 73 65 64 5b 69 5d 20 29    if( !used[i] )
1cc40 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
1cc50 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  sg(lemp->filenam
1cc60 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a  e,rp->ruleline,.
1cc70 20 20 20 20 20 20 20 20 20 20 22 4c 61 62 65 6c            "Label
1cc80 20 25 73 20 66 6f 72 20 5c 22 25 73 28 25 73 29   %s for \"%s(%s)
1cc90 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  \" is never used
1cca0 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 72 70  .",.          rp
1ccb0 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 2c 72 70  ->rhsalias[i],rp
1ccc0 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 72  ->rhs[i]->name,r
1ccd0 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b  p->rhsalias[i]);
1cce0 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65  .        lemp->e
1ccf0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
1cd00 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
1cd10 20 69 3e 30 20 26 26 20 68 61 73 5f 64 65 73 74   i>0 && has_dest
1cd20 72 75 63 74 6f 72 28 72 70 2d 3e 72 68 73 5b 69  ructor(rp->rhs[i
1cd30 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20 20 20 20  ],lemp) ){.     
1cd40 20 61 70 70 65 6e 64 5f 73 74 72 28 22 20 20 79   append_str("  y
1cd50 79 5f 64 65 73 74 72 75 63 74 6f 72 28 79 79 70  y_destructor(yyp
1cd60 50 61 72 73 65 72 2c 25 64 2c 26 79 79 6d 73 70  Parser,%d,&yymsp
1cd70 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e 22 2c  [%d].minor);\n",
1cd80 20 30 2c 0a 20 20 20 20 20 20 20 20 20 72 70 2d   0,.         rp-
1cd90 3e 72 68 73 5b 69 5d 2d 3e 69 6e 64 65 78 2c 69  >rhs[i]->index,i
1cda0 2d 72 70 2d 3e 6e 72 68 73 2b 31 29 3b 0a 20 20  -rp->nrhs+1);.  
1cdb0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1cdc0 20 75 6e 61 62 6c 65 20 74 6f 20 77 72 69 74 65   unable to write
1cdd0 20 4c 48 53 20 76 61 6c 75 65 73 20 64 69 72 65   LHS values dire
1cde0 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 73 74  ctly into the st
1cdf0 61 63 6b 2c 20 77 72 69 74 65 20 74 68 65 0a 20  ack, write the. 
1ce00 20 2a 2a 20 73 61 76 65 64 20 4c 48 53 20 76 61   ** saved LHS va
1ce10 6c 75 65 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66  lue now. */.  if
1ce20 28 20 6c 68 73 64 69 72 65 63 74 3d 3d 30 20 29  ( lhsdirect==0 )
1ce30 7b 0a 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72  {.    append_str
1ce40 28 22 20 20 79 79 6d 73 70 5b 25 64 5d 2e 6d 69  ("  yymsp[%d].mi
1ce50 6e 6f 72 2e 79 79 25 64 20 3d 20 22 2c 20 30 2c  nor.yy%d = ", 0,
1ce60 20 31 2d 72 70 2d 3e 6e 72 68 73 2c 20 72 70 2d   1-rp->nrhs, rp-
1ce70 3e 6c 68 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20  >lhs->dtnum);.  
1ce80 20 20 61 70 70 65 6e 64 5f 73 74 72 28 7a 4c 68    append_str(zLh
1ce90 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  s, 0, 0, 0);.   
1cea0 20 61 70 70 65 6e 64 5f 73 74 72 28 22 3b 5c 6e   append_str(";\n
1ceb0 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
1cec0 0a 0a 20 20 2f 2a 20 53 75 66 66 69 78 20 63 6f  ..  /* Suffix co
1ced0 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f  de generation co
1cee0 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 63 70 20 3d  mplete */.  cp =
1cef0 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c   append_str(0,0,
1cf00 30 2c 30 29 3b 0a 20 20 69 66 28 20 63 70 20 26  0,0);.  if( cp &
1cf10 26 20 63 70 5b 30 5d 20 29 7b 0a 20 20 20 20 72  & cp[0] ){.    r
1cf20 70 2d 3e 63 6f 64 65 53 75 66 66 69 78 20 3d 20  p->codeSuffix = 
1cf30 53 74 72 73 61 66 65 28 63 70 29 3b 0a 20 20 20  Strsafe(cp);.   
1cf40 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 30 3b   rp->noCode = 0;
1cf50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1cf60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  c;.}../*.** Gene
1cf70 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
1cf80 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 74 68  executes when th
1cf90 65 20 72 75 6c 65 20 22 72 70 22 20 69 73 20 72  e rule "rp" is r
1cfa0 65 64 75 63 65 64 2e 20 20 57 72 69 74 65 0a 2a  educed.  Write.*
1cfb0 2a 20 74 68 65 20 63 6f 64 65 20 74 6f 20 22 6f  * the code to "o
1cfc0 75 74 22 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ut".  Make sure 
1cfd0 6c 69 6e 65 6e 6f 20 73 74 61 79 73 20 75 70 2d  lineno stays up-
1cfe0 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56  to-date..*/.PRIV
1cff0 41 54 45 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f  ATE void emit_co
1d000 64 65 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c  de(.  FILE *out,
1d010 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
1d020 72 70 2c 0a 20 20 73 74 72 75 63 74 20 6c 65 6d  rp,.  struct lem
1d030 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20  on *lemp,.  int 
1d040 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a 20 63 6f 6e 73  *lineno.){. cons
1d050 74 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a  t char *cp;.. /*
1d060 20 53 65 74 75 70 20 63 6f 64 65 20 70 72 69 6f   Setup code prio
1d070 72 20 74 6f 20 74 68 65 20 23 6c 69 6e 65 20 64  r to the #line d
1d080 69 72 65 63 74 69 76 65 20 2a 2f 0a 20 69 66 28  irective */. if(
1d090 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 20   rp->codePrefix 
1d0a0 26 26 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69  && rp->codePrefi
1d0b0 78 5b 30 5d 20 29 7b 0a 20 20 20 66 70 72 69 6e  x[0] ){.   fprin
1d0c0 74 66 28 6f 75 74 2c 20 22 7b 25 73 22 2c 20 72  tf(out, "{%s", r
1d0d0 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 29 3b 0a  p->codePrefix);.
1d0e0 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f     for(cp=rp->co
1d0f0 64 65 50 72 65 66 69 78 3b 20 2a 63 70 3b 20 63  dePrefix; *cp; c
1d100 70 2b 2b 29 7b 20 69 66 28 20 2a 63 70 3d 3d 27  p++){ if( *cp=='
1d110 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n' ) (*lineno)+
1d120 2b 3b 20 7d 0a 20 7d 0a 0a 20 2f 2a 20 47 65 6e  +; }. }.. /* Gen
1d130 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f  erate code to do
1d140 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69   the reduce acti
1d150 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63  on */. if( rp->c
1d160 6f 64 65 20 29 7b 0a 20 20 20 69 66 28 20 21 6c  ode ){.   if( !l
1d170 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c  emp->nolinenosfl
1d180 61 67 20 29 7b 0a 20 20 20 20 20 28 2a 6c 69 6e  ag ){.     (*lin
1d190 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 74 70 6c  eno)++;.     tpl
1d1a0 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 72 70  t_linedir(out,rp
1d1b0 2d 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66 69 6c  ->line,lemp->fil
1d1c0 65 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a 20 20 20  ename);.   }.   
1d1d0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 25 73  fprintf(out,"{%s
1d1e0 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 0a 20 20 20  ",rp->code);.   
1d1f0 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b  for(cp=rp->code;
1d200 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 20 69 66 28   *cp; cp++){ if(
1d210 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c   *cp=='\n' ) (*l
1d220 69 6e 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 66  ineno)++; }.   f
1d230 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22  printf(out,"}\n"
1d240 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a  ); (*lineno)++;.
1d250 20 20 20 69 66 28 20 21 6c 65 6d 70 2d 3e 6e 6f     if( !lemp->no
1d260 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 29 7b 0a 20  linenosflag ){. 
1d270 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b      (*lineno)++;
1d280 0a 20 20 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64  .     tplt_lined
1d290 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c  ir(out,*lineno,l
1d2a0 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20  emp->outname);. 
1d2b0 20 20 7d 0a 20 7d 0a 0a 20 2f 2a 20 47 65 6e 65    }. }.. /* Gene
1d2c0 72 61 74 65 20 62 72 65 61 6b 64 6f 77 6e 20 63  rate breakdown c
1d2d0 6f 64 65 20 74 68 61 74 20 6f 63 63 75 72 73 20  ode that occurs 
1d2e0 61 66 74 65 72 20 74 68 65 20 23 6c 69 6e 65 20  after the #line 
1d2f0 64 69 72 65 63 74 69 76 65 20 2a 2f 0a 20 69 66  directive */. if
1d300 28 20 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78  ( rp->codeSuffix
1d310 20 26 26 20 72 70 2d 3e 63 6f 64 65 53 75 66 66   && rp->codeSuff
1d320 69 78 5b 30 5d 20 29 7b 0a 20 20 20 66 70 72 69  ix[0] ){.   fpri
1d330 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 72  ntf(out, "%s", r
1d340 70 2d 3e 63 6f 64 65 53 75 66 66 69 78 29 3b 0a  p->codeSuffix);.
1d350 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f     for(cp=rp->co
1d360 64 65 53 75 66 66 69 78 3b 20 2a 63 70 3b 20 63  deSuffix; *cp; c
1d370 70 2b 2b 29 7b 20 69 66 28 20 2a 63 70 3d 3d 27  p++){ if( *cp=='
1d380 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n' ) (*lineno)+
1d390 2b 3b 20 7d 0a 20 7d 0a 0a 20 69 66 28 20 72 70  +; }. }.. if( rp
1d3a0 2d 3e 63 6f 64 65 50 72 65 66 69 78 20 29 7b 0a  ->codePrefix ){.
1d3b0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1d3c0 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f  "}\n"); (*lineno
1d3d0 29 2b 2b 3b 0a 20 7d 0a 0a 20 72 65 74 75 72 6e  )++;. }.. return
1d3e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ;.}../*.** Print
1d3f0 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20   the definition 
1d400 6f 66 20 74 68 65 20 75 6e 69 6f 6e 20 75 73 65  of the union use
1d410 64 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72  d for the parser
1d420 27 73 20 64 61 74 61 20 73 74 61 63 6b 2e 0a 2a  's data stack..*
1d430 2a 20 54 68 69 73 20 75 6e 69 6f 6e 20 63 6f 6e  * This union con
1d440 74 61 69 6e 73 20 66 69 65 6c 64 73 20 66 6f 72  tains fields for
1d450 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20   every possible 
1d460 64 61 74 61 20 74 79 70 65 20 66 6f 72 20 74 6f  data type for to
1d470 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f 6e 74  kens.** and nont
1d480 65 72 6d 69 6e 61 6c 73 2e 20 20 49 6e 20 74 68  erminals.  In th
1d490 65 20 70 72 6f 63 65 73 73 20 6f 66 20 63 6f 6d  e process of com
1d4a0 70 75 74 69 6e 67 20 61 6e 64 20 70 72 69 6e 74  puting and print
1d4b0 69 6e 67 20 74 68 69 73 0a 2a 2a 20 75 6e 69 6f  ing this.** unio
1d4c0 6e 2c 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20  n, also set the 
1d4d0 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f  ".dtnum" field o
1d4e0 66 20 65 76 65 72 79 20 74 65 72 6d 69 6e 61 6c  f every terminal
1d4f0 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
1d500 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f 0a 76  .** symbol..*/.v
1d510 6f 69 64 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f  oid print_stack_
1d520 75 6e 69 6f 6e 28 0a 20 20 46 49 4c 45 20 2a 6f  union(.  FILE *o
1d530 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
1d540 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70       /* The outp
1d550 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 73  ut stream */.  s
1d560 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
1d570 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  p,         /* Th
1d580 65 20 6d 61 69 6e 20 69 6e 66 6f 20 73 74 72 75  e main info stru
1d590 63 74 75 72 65 20 66 6f 72 20 74 68 69 73 20 70  cture for this p
1d5a0 61 72 73 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  arser */.  int *
1d5b0 70 6c 69 6e 65 6e 6f 2c 20 20 20 20 20 20 20 20  plineno,        
1d5c0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1d5d0 72 20 74 6f 20 74 68 65 20 6c 69 6e 65 20 6e 75  r to the line nu
1d5e0 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 68  mber */.  int mh
1d5f0 66 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  flag            
1d600 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1d610 20 67 65 6e 65 72 61 74 69 6e 67 20 6d 61 6b 65   generating make
1d620 68 65 61 64 65 72 73 20 6f 75 74 70 75 74 20 2a  headers output *
1d630 2f 0a 29 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e  /.){.  int linen
1d640 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20  o = *plineno;   
1d650 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d   /* The line num
1d660 62 65 72 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ber of the outpu
1d670 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 74 79  t */.  char **ty
1d680 70 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  pes;            
1d690 20 2f 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65   /* A hash table
1d6a0 20 6f 66 20 64 61 74 61 74 79 70 65 73 20 2a 2f   of datatypes */
1d6b0 0a 20 20 69 6e 74 20 61 72 72 61 79 73 69 7a 65  .  int arraysize
1d6c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1d6d0 53 69 7a 65 20 6f 66 20 74 68 65 20 22 74 79 70  Size of the "typ
1d6e0 65 73 22 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  es" array */.  i
1d6f0 6e 74 20 6d 61 78 64 74 6c 65 6e 67 74 68 3b 20  nt maxdtlength; 
1d700 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
1d710 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e  mum length of an
1d720 79 20 22 2e 64 61 74 61 74 79 70 65 22 20 66 69  y ".datatype" fi
1d730 65 6c 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  eld. */.  char *
1d740 73 74 64 64 74 3b 20 20 20 20 20 20 20 20 20 20  stddt;          
1d750 20 20 20 20 2f 2a 20 53 74 61 6e 64 61 72 64 69      /* Standardi
1d760 7a 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 64  zed name for a d
1d770 61 74 61 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74  atatype */.  int
1d780 20 69 2c 6a 3b 20 20 20 20 20 20 20 20 20 20 20   i,j;           
1d790 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1d7a0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75 6e 73  ounters */.  uns
1d7b0 69 67 6e 65 64 20 68 61 73 68 3b 20 20 20 20 20  igned hash;     
1d7c0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 68 61         /* For ha
1d7d0 73 68 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f  shing the name o
1d7e0 66 20 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 6f  f a type */.  co
1d7f0 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20  nst char *name; 
1d800 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1d810 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  of the parser */
1d820 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1d830 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
1d840 79 70 65 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f 63  ypes[] and alloc
1d850 61 74 65 20 73 74 64 64 74 5b 5d 20 2a 2f 0a 20  ate stddt[] */. 
1d860 20 61 72 72 61 79 73 69 7a 65 20 3d 20 6c 65 6d   arraysize = lem
1d870 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b 0a  p->nsymbol * 2;.
1d880 20 20 74 79 70 65 73 20 3d 20 28 63 68 61 72 2a    types = (char*
1d890 2a 29 63 61 6c 6c 6f 63 28 20 61 72 72 61 79 73  *)calloc( arrays
1d8a0 69 7a 65 2c 20 73 69 7a 65 6f 66 28 63 68 61 72  ize, sizeof(char
1d8b0 2a 29 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65  *) );.  if( type
1d8c0 73 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  s==0 ){.    fpri
1d8d0 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20  ntf(stderr,"Out 
1d8e0 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a  of memory.\n");.
1d8f0 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
1d900 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
1d910 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29 20 74 79  raysize; i++) ty
1d920 70 65 73 5b 69 5d 20 3d 20 30 3b 0a 20 20 6d 61  pes[i] = 0;.  ma
1d930 78 64 74 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20  xdtlength = 0;. 
1d940 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 74 79   if( lemp->varty
1d950 70 65 20 29 7b 0a 20 20 20 20 6d 61 78 64 74 6c  pe ){.    maxdtl
1d960 65 6e 67 74 68 20 3d 20 6c 65 6d 6f 6e 53 74 72  ength = lemonStr
1d970 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70  len(lemp->vartyp
1d980 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  e);.  }.  for(i=
1d990 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
1d9a0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ol; i++){.    in
1d9b0 74 20 6c 65 6e 3b 0a 20 20 20 20 73 74 72 75 63  t len;.    struc
1d9c0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
1d9d0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
1d9e0 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 64 61 74  .    if( sp->dat
1d9f0 61 74 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69  atype==0 ) conti
1da00 6e 75 65 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c  nue;.    len = l
1da10 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 70 2d 3e 64  emonStrlen(sp->d
1da20 61 74 61 74 79 70 65 29 3b 0a 20 20 20 20 69 66  atatype);.    if
1da30 28 20 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74  ( len>maxdtlengt
1da40 68 20 29 20 6d 61 78 64 74 6c 65 6e 67 74 68 20  h ) maxdtlength 
1da50 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64  = len;.  }.  std
1da60 64 74 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c  dt = (char*)mall
1da70 6f 63 28 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a  oc( maxdtlength*
1da80 32 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 73  2 + 1 );.  if( s
1da90 74 64 64 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66  tddt==0 ){.    f
1daa0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
1dab0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22  ut of memory.\n"
1dac0 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
1dad0 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20    }..  /* Build 
1dae0 61 20 68 61 73 68 20 74 61 62 6c 65 20 6f 66 20  a hash table of 
1daf0 64 61 74 61 74 79 70 65 73 2e 20 54 68 65 20 22  datatypes. The "
1db00 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66  .dtnum" field of
1db10 20 65 61 63 68 20 73 79 6d 62 6f 6c 0a 20 20 2a   each symbol.  *
1db20 2a 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77  * is filled in w
1db30 69 74 68 20 74 68 65 20 68 61 73 68 20 69 6e 64  ith the hash ind
1db40 65 78 20 70 6c 75 73 20 31 2e 20 20 41 20 22 2e  ex plus 1.  A ".
1db50 64 74 6e 75 6d 22 20 76 61 6c 75 65 20 6f 66 20  dtnum" value of 
1db60 30 20 69 73 0a 20 20 2a 2a 20 75 73 65 64 20 66  0 is.  ** used f
1db70 6f 72 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  or terminal symb
1db80 6f 6c 73 2e 20 20 49 66 20 74 68 65 72 65 20 69  ols.  If there i
1db90 73 20 6e 6f 20 25 64 65 66 61 75 6c 74 5f 74 79  s no %default_ty
1dba0 70 65 20 64 65 66 69 6e 65 64 20 74 68 65 6e 0a  pe defined then.
1dbb0 20 20 2a 2a 20 30 20 69 73 20 61 6c 73 6f 20 75    ** 0 is also u
1dbc0 73 65 64 20 61 73 20 74 68 65 20 2e 64 74 6e 75  sed as the .dtnu
1dbd0 6d 20 76 61 6c 75 65 20 66 6f 72 20 6e 6f 6e 74  m value for nont
1dbe0 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 64  erminals which d
1dbf0 6f 20 6e 6f 74 20 73 70 65 63 69 66 79 0a 20 20  o not specify.  
1dc00 2a 2a 20 61 20 64 61 74 61 74 79 70 65 20 75 73  ** a datatype us
1dc10 69 6e 67 20 74 68 65 20 25 74 79 70 65 20 64 69  ing the %type di
1dc20 72 65 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20  rective..  */.  
1dc30 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1dc40 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
1dc50 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
1dc60 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  l *sp = lemp->sy
1dc70 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 63 68  mbols[i];.    ch
1dc80 61 72 20 2a 63 70 3b 0a 20 20 20 20 69 66 28 20  ar *cp;.    if( 
1dc90 73 70 3d 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  sp==lemp->errsym
1dca0 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74   ){.      sp->dt
1dcb0 6e 75 6d 20 3d 20 61 72 72 61 79 73 69 7a 65 2b  num = arraysize+
1dcc0 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  1;.      continu
1dcd0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
1dce0 20 73 70 2d 3e 74 79 70 65 21 3d 4e 4f 4e 54 45   sp->type!=NONTE
1dcf0 52 4d 49 4e 41 4c 20 7c 7c 20 28 73 70 2d 3e 64  RMINAL || (sp->d
1dd00 61 74 61 74 79 70 65 3d 3d 30 20 26 26 20 6c 65  atatype==0 && le
1dd10 6d 70 2d 3e 76 61 72 74 79 70 65 3d 3d 30 29 20  mp->vartype==0) 
1dd20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e  ){.      sp->dtn
1dd30 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  um = 0;.      co
1dd40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1dd50 20 20 63 70 20 3d 20 73 70 2d 3e 64 61 74 61 74    cp = sp->datat
1dd60 79 70 65 3b 0a 20 20 20 20 69 66 28 20 63 70 3d  ype;.    if( cp=
1dd70 3d 30 20 29 20 63 70 20 3d 20 6c 65 6d 70 2d 3e  =0 ) cp = lemp->
1dd80 76 61 72 74 79 70 65 3b 0a 20 20 20 20 6a 20 3d  vartype;.    j =
1dd90 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 49   0;.    while( I
1dda0 53 53 50 41 43 45 28 2a 63 70 29 20 29 20 63 70  SSPACE(*cp) ) cp
1ddb0 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  ++;.    while( *
1ddc0 63 70 20 29 20 73 74 64 64 74 5b 6a 2b 2b 5d 20  cp ) stddt[j++] 
1ddd0 3d 20 2a 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69  = *cp++;.    whi
1dde0 6c 65 28 20 6a 3e 30 20 26 26 20 49 53 53 50 41  le( j>0 && ISSPA
1ddf0 43 45 28 73 74 64 64 74 5b 6a 2d 31 5d 29 20 29  CE(stddt[j-1]) )
1de00 20 6a 2d 2d 3b 0a 20 20 20 20 73 74 64 64 74 5b   j--;.    stddt[
1de10 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  j] = 0;.    if( 
1de20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 20  lemp->tokentype 
1de30 26 26 20 73 74 72 63 6d 70 28 73 74 64 64 74 2c  && strcmp(stddt,
1de40 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65   lemp->tokentype
1de50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70  )==0 ){.      sp
1de60 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  ->dtnum = 0;.   
1de70 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1de80 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20 30 3b   }.    hash = 0;
1de90 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 73 74  .    for(j=0; st
1dea0 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ddt[j]; j++){.  
1deb0 20 20 20 20 68 61 73 68 20 3d 20 68 61 73 68 2a      hash = hash*
1dec0 35 33 20 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a 20  53 + stddt[j];. 
1ded0 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20     }.    hash = 
1dee0 28 68 61 73 68 20 26 20 30 78 37 66 66 66 66 66  (hash & 0x7fffff
1def0 66 66 29 25 61 72 72 61 79 73 69 7a 65 3b 0a 20  ff)%arraysize;. 
1df00 20 20 20 77 68 69 6c 65 28 20 74 79 70 65 73 5b     while( types[
1df10 68 61 73 68 5d 20 29 7b 0a 20 20 20 20 20 20 69  hash] ){.      i
1df20 66 28 20 73 74 72 63 6d 70 28 74 79 70 65 73 5b  f( strcmp(types[
1df30 68 61 73 68 5d 2c 73 74 64 64 74 29 3d 3d 30 20  hash],stddt)==0 
1df40 29 7b 0a 20 20 20 20 20 20 20 20 73 70 2d 3e 64  ){.        sp->d
1df50 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b  tnum = hash + 1;
1df60 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1df70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 68 61        }.      ha
1df80 73 68 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  sh++;.      if( 
1df90 68 61 73 68 3e 3d 28 75 6e 73 69 67 6e 65 64 29  hash>=(unsigned)
1dfa0 61 72 72 61 79 73 69 7a 65 20 29 20 68 61 73 68  arraysize ) hash
1dfb0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1dfc0 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d  if( types[hash]=
1dfd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e  =0 ){.      sp->
1dfe0 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31  dtnum = hash + 1
1dff0 3b 0a 20 20 20 20 20 20 74 79 70 65 73 5b 68 61  ;.      types[ha
1e000 73 68 5d 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c  sh] = (char*)mal
1e010 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  loc( lemonStrlen
1e020 28 73 74 64 64 74 29 2b 31 20 29 3b 0a 20 20 20  (stddt)+1 );.   
1e030 20 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73     if( types[has
1e040 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  h]==0 ){.       
1e050 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1e060 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c  "Out of memory.\
1e070 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69  n");.        exi
1e080 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t(1);.      }.  
1e090 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79      lemon_strcpy
1e0a0 28 74 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64  (types[hash],std
1e0b0 64 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dt);.    }.  }..
1e0c0 20 20 2f 2a 20 50 72 69 6e 74 20 6f 75 74 20 74    /* Print out t
1e0d0 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
1e0e0 20 59 59 54 4f 4b 45 4e 54 59 50 45 20 61 6e 64   YYTOKENTYPE and
1e0f0 20 59 59 4d 49 4e 4f 52 54 59 50 45 20 2a 2f 0a   YYMINORTYPE */.
1e100 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e    name = lemp->n
1e110 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65  ame ? lemp->name
1e120 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 6c 69   : "Parse";.  li
1e130 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b  neno = *plineno;
1e140 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
1e150 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
1e160 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b  f INTERFACE\n");
1e170 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66   lineno++; }.  f
1e180 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1e190 69 6e 65 20 25 73 54 4f 4b 45 4e 54 59 50 45 20  ine %sTOKENTYPE 
1e1a0 25 73 5c 6e 22 2c 6e 61 6d 65 2c 0a 20 20 20 20  %s\n",name,.    
1e1b0 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3f  lemp->tokentype?
1e1c0 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3a  lemp->tokentype:
1e1d0 22 76 6f 69 64 2a 22 29 3b 20 20 6c 69 6e 65 6e  "void*");  linen
1e1e0 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61  o++;.  if( mhfla
1e1f0 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74  g ){ fprintf(out
1e200 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69  ,"#endif\n"); li
1e210 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69  neno++; }.  fpri
1e220 6e 74 66 28 6f 75 74 2c 22 74 79 70 65 64 65 66  ntf(out,"typedef
1e230 20 75 6e 69 6f 6e 20 7b 5c 6e 22 29 3b 20 6c 69   union {\n"); li
1e240 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1e250 66 28 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 69  f(out,"  int yyi
1e260 6e 69 74 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  nit;\n"); lineno
1e270 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1e280 74 2c 22 20 20 25 73 54 4f 4b 45 4e 54 59 50 45  t,"  %sTOKENTYPE
1e290 20 79 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20   yy0;\n",name); 
1e2a0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28  lineno++;.  for(
1e2b0 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65  i=0; i<arraysize
1e2c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1e2d0 74 79 70 65 73 5b 69 5d 3d 3d 30 20 29 20 63 6f  types[i]==0 ) co
1e2e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69  ntinue;.    fpri
1e2f0 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 20 79 79  ntf(out,"  %s yy
1e300 25 64 3b 5c 6e 22 2c 74 79 70 65 73 5b 69 5d 2c  %d;\n",types[i],
1e310 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i+1); lineno++;.
1e320 20 20 20 20 66 72 65 65 28 74 79 70 65 73 5b 69      free(types[i
1e330 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65  ]);.  }.  if( le
1e340 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43  mp->errsym->useC
1e350 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  nt ){.    fprint
1e360 66 28 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 25  f(out,"  int yy%
1e370 64 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73  d;\n",lemp->errs
1e380 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65  ym->dtnum); line
1e390 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 72 65 65  no++;.  }.  free
1e3a0 28 73 74 64 64 74 29 3b 0a 20 20 66 72 65 65 28  (stddt);.  free(
1e3b0 74 79 70 65 73 29 3b 0a 20 20 66 70 72 69 6e 74  types);.  fprint
1e3c0 66 28 6f 75 74 2c 22 7d 20 59 59 4d 49 4e 4f 52  f(out,"} YYMINOR
1e3d0 54 59 50 45 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  TYPE;\n"); linen
1e3e0 6f 2b 2b 3b 0a 20 20 2a 70 6c 69 6e 65 6e 6f 20  o++;.  *plineno 
1e3f0 3d 20 6c 69 6e 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  = lineno;.}../*.
1e400 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
1e410 6d 65 20 6f 66 20 61 20 43 20 64 61 74 61 74 79  me of a C dataty
1e420 70 65 20 61 62 6c 65 20 74 6f 20 72 65 70 72 65  pe able to repre
1e430 73 65 6e 74 20 76 61 6c 75 65 73 20 62 65 74 77  sent values betw
1e440 65 65 6e 0a 2a 2a 20 6c 77 72 20 61 6e 64 20 75  een.** lwr and u
1e450 70 72 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20  pr, inclusive.  
1e460 49 66 20 70 6e 42 79 74 65 21 3d 4e 55 4c 4c 20  If pnByte!=NULL 
1e470 74 68 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 20  then also write 
1e480 74 68 65 20 73 69 7a 65 6f 66 0a 2a 2a 20 66 6f  the sizeof.** fo
1e490 72 20 74 68 61 74 20 74 79 70 65 20 28 31 2c 20  r that type (1, 
1e4a0 32 2c 20 6f 72 20 34 29 20 69 6e 74 6f 20 2a 70  2, or 4) into *p
1e4b0 6e 42 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  nByte..*/.static
1e4c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e   const char *min
1e4d0 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69  imum_size_type(i
1e4e0 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 2c  nt lwr, int upr,
1e4f0 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20   int *pnByte){. 
1e500 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
1e510 70 65 20 3d 20 22 69 6e 74 22 3b 0a 20 20 69 6e  pe = "int";.  in
1e520 74 20 6e 42 79 74 65 20 3d 20 34 3b 0a 20 20 69  t nByte = 4;.  i
1e530 66 28 20 6c 77 72 3e 3d 30 20 29 7b 0a 20 20 20  f( lwr>=0 ){.   
1e540 20 69 66 28 20 75 70 72 3c 3d 32 35 35 20 29 7b   if( upr<=255 ){
1e550 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
1e560 75 6e 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a  unsigned char";.
1e570 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 31 3b        nByte = 1;
1e580 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75  .    }else if( u
1e590 70 72 3c 36 35 35 33 35 20 29 7b 0a 20 20 20 20  pr<65535 ){.    
1e5a0 20 20 7a 54 79 70 65 20 3d 20 22 75 6e 73 69 67    zType = "unsig
1e5b0 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 22 3b 0a  ned short int";.
1e5c0 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 32 3b        nByte = 2;
1e5d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e5e0 20 20 7a 54 79 70 65 20 3d 20 22 75 6e 73 69 67    zType = "unsig
1e5f0 6e 65 64 20 69 6e 74 22 3b 0a 20 20 20 20 20 20  ned int";.      
1e600 6e 42 79 74 65 20 3d 20 34 3b 0a 20 20 20 20 7d  nByte = 4;.    }
1e610 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72  .  }else if( lwr
1e620 3e 3d 2d 31 32 37 20 26 26 20 75 70 72 3c 3d 31  >=-127 && upr<=1
1e630 32 37 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  27 ){.    zType 
1e640 3d 20 22 73 69 67 6e 65 64 20 63 68 61 72 22 3b  = "signed char";
1e650 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a  .    nByte = 1;.
1e660 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e    }else if( lwr>
1e670 3d 2d 33 32 37 36 37 20 26 26 20 75 70 72 3c 33  =-32767 && upr<3
1e680 32 37 36 37 20 29 7b 0a 20 20 20 20 7a 54 79 70  2767 ){.    zTyp
1e690 65 20 3d 20 22 73 68 6f 72 74 22 3b 0a 20 20 20  e = "short";.   
1e6a0 20 6e 42 79 74 65 20 3d 20 32 3b 0a 20 20 7d 0a   nByte = 2;.  }.
1e6b0 20 20 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a    if( pnByte ) *
1e6c0 70 6e 42 79 74 65 20 3d 20 6e 42 79 74 65 3b 0a  pnByte = nByte;.
1e6d0 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
1e6e0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 73 74  }../*.** Each st
1e6f0 61 74 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  ate contains a s
1e700 65 74 20 6f 66 20 74 6f 6b 65 6e 20 74 72 61 6e  et of token tran
1e710 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 73 65  saction and a se
1e720 74 20 6f 66 0a 2a 2a 20 6e 6f 6e 74 65 72 6d 69  t of.** nontermi
1e730 6e 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  nal transactions
1e740 2e 20 20 45 61 63 68 20 6f 66 20 74 68 65 73 65  .  Each of these
1e750 20 73 65 74 73 20 6d 61 6b 65 73 20 61 6e 20 69   sets makes an i
1e760 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68  nstance.** of th
1e770 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1e780 63 74 75 72 65 2e 20 20 41 6e 20 61 72 72 61 79  cture.  An array
1e790 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74   of these struct
1e7a0 75 72 65 73 20 69 73 20 75 73 65 64 0a 2a 2a 20  ures is used.** 
1e7b0 74 6f 20 6f 72 64 65 72 20 74 68 65 20 63 72 65  to order the cre
1e7c0 61 74 69 6f 6e 20 6f 66 20 65 6e 74 72 69 65 73  ation of entries
1e7d0 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f   in the yy_actio
1e7e0 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  n[] table..*/.st
1e7f0 72 75 63 74 20 61 78 73 65 74 20 7b 0a 20 20 73  ruct axset {.  s
1e800 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
1e810 3b 20 20 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72  ;   /* A pointer
1e820 20 74 6f 20 61 20 73 74 61 74 65 20 2a 2f 0a 20   to a state */. 
1e830 20 69 6e 74 20 69 73 54 6b 6e 3b 20 20 20 20 20   int isTkn;     
1e840 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1e850 20 75 73 65 20 74 6f 6b 65 6e 73 2e 20 20 46 61   use tokens.  Fa
1e860 6c 73 65 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d  lse for non-term
1e870 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  inals */.  int n
1e880 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Action;         
1e890 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74  /* Number of act
1e8a0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  ions */.  int iO
1e8b0 72 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f  rder;          /
1e8c0 2a 20 4f 72 69 67 69 6e 61 6c 20 6f 72 64 65 72  * Original order
1e8d0 20 6f 66 20 61 63 74 69 6f 6e 20 73 65 74 73 20   of action sets 
1e8e0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  */.};../*.** Com
1e8f0 70 61 72 65 20 74 6f 20 61 78 73 65 74 20 73 74  pare to axset st
1e900 72 75 63 74 75 72 65 73 20 66 6f 72 20 73 6f 72  ructures for sor
1e910 74 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f  ting purposes.*/
1e920 0a 73 74 61 74 69 63 20 69 6e 74 20 61 78 73 65  .static int axse
1e930 74 5f 63 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  t_compare(const 
1e940 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76  void *a, const v
1e950 6f 69 64 20 2a 62 29 7b 0a 20 20 73 74 72 75 63  oid *b){.  struc
1e960 74 20 61 78 73 65 74 20 2a 70 31 20 3d 20 28 73  t axset *p1 = (s
1e970 74 72 75 63 74 20 61 78 73 65 74 2a 29 61 3b 0a  truct axset*)a;.
1e980 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a    struct axset *
1e990 70 32 20 3d 20 28 73 74 72 75 63 74 20 61 78 73  p2 = (struct axs
1e9a0 65 74 2a 29 62 3b 0a 20 20 69 6e 74 20 63 3b 0a  et*)b;.  int c;.
1e9b0 20 20 63 20 3d 20 70 32 2d 3e 6e 41 63 74 69 6f    c = p2->nActio
1e9c0 6e 20 2d 20 70 31 2d 3e 6e 41 63 74 69 6f 6e 3b  n - p1->nAction;
1e9d0 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20  .  if( c==0 ){. 
1e9e0 20 20 20 63 20 3d 20 70 31 2d 3e 69 4f 72 64 65     c = p1->iOrde
1e9f0 72 20 2d 20 70 32 2d 3e 69 4f 72 64 65 72 3b 0a  r - p2->iOrder;.
1ea00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 21    }.  assert( c!
1ea10 3d 30 20 7c 7c 20 70 31 3d 3d 70 32 20 29 3b 0a  =0 || p1==p2 );.
1ea20 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f    return c;.}../
1ea30 2a 0a 2a 2a 20 57 72 69 74 65 20 74 65 78 74 20  *.** Write text 
1ea40 6f 6e 20 22 6f 75 74 22 20 74 68 61 74 20 64 65  on "out" that de
1ea50 73 63 72 69 62 65 73 20 74 68 65 20 72 75 6c 65  scribes the rule
1ea60 20 22 72 70 22 2e 0a 2a 2f 0a 73 74 61 74 69 63   "rp"..*/.static
1ea70 20 76 6f 69 64 20 77 72 69 74 65 52 75 6c 65 54   void writeRuleT
1ea80 65 78 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73  ext(FILE *out, s
1ea90 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b  truct rule *rp){
1eaa0 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 70 72 69  .  int j;.  fpri
1eab0 6e 74 66 28 6f 75 74 2c 22 25 73 20 3a 3a 3d 22  ntf(out,"%s ::="
1eac0 2c 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29  , rp->lhs->name)
1ead0 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72  ;.  for(j=0; j<r
1eae0 70 2d 3e 6e 72 68 73 3b 20 6a 2b 2b 29 7b 0a 20  p->nrhs; j++){. 
1eaf0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1eb00 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 6a   *sp = rp->rhs[j
1eb10 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74  ];.    if( sp->t
1eb20 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype!=MULTITERMIN
1eb30 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  AL ){.      fpri
1eb40 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73  ntf(out," %s", s
1eb50 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  p->name);.    }e
1eb60 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  lse{.      int k
1eb70 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
1eb80 6f 75 74 2c 22 20 25 73 22 2c 20 73 70 2d 3e 73  out," %s", sp->s
1eb90 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29 3b  ubsym[0]->name);
1eba0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20  .      for(k=1; 
1ebb0 6b 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b  k<sp->nsubsym; k
1ebc0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
1ebd0 69 6e 74 66 28 6f 75 74 2c 22 7c 25 73 22 2c 73  intf(out,"|%s",s
1ebe0 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 6e 61  p->subsym[k]->na
1ebf0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
1ec00 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65   }.  }.}.../* Ge
1ec10 6e 65 72 61 74 65 20 43 20 73 6f 75 72 63 65 20  nerate C source 
1ec20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61 72  code for the par
1ec30 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f  ser */.void Repo
1ec40 72 74 54 61 62 6c 65 28 0a 20 20 73 74 72 75 63  rtTable(.  struc
1ec50 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20  t lemon *lemp,. 
1ec60 20 69 6e 74 20 6d 68 66 6c 61 67 20 20 20 20 20   int mhflag     
1ec70 2f 2a 20 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b  /* Output in mak
1ec80 65 68 65 61 64 65 72 73 20 66 6f 72 6d 61 74 20  eheaders format 
1ec90 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
1eca0 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a  FILE *out, *in;.
1ecb0 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45    char line[LINE
1ecc0 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 20 6c 69  SIZE];.  int  li
1ecd0 6e 65 6e 6f 3b 0a 20 20 73 74 72 75 63 74 20 73  neno;.  struct s
1ece0 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
1ecf0 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
1ed00 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
1ed10 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 74  p;.  struct actt
1ed20 61 62 20 2a 70 41 63 74 74 61 62 3b 0a 20 20 69  ab *pActtab;.  i
1ed30 6e 74 20 69 2c 20 6a 2c 20 6e 2c 20 73 7a 3b 0a  nt i, j, n, sz;.
1ed40 20 20 69 6e 74 20 73 7a 41 63 74 69 6f 6e 54 79    int szActionTy
1ed50 70 65 3b 20 20 20 20 20 2f 2a 20 73 69 7a 65 6f  pe;     /* sizeo
1ed60 66 28 59 59 41 43 54 49 4f 4e 54 59 50 45 29 20  f(YYACTIONTYPE) 
1ed70 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 6f 64 65 54  */.  int szCodeT
1ed80 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 73 69  ype;       /* si
1ed90 7a 65 6f 66 28 59 59 43 4f 44 45 54 59 50 45 29  zeof(YYCODETYPE)
1eda0 20 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68     */.  const ch
1edb0 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e 74 20  ar *name;.  int 
1edc0 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e  mnTknOfst, mxTkn
1edd0 4f 66 73 74 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74  Ofst;.  int mnNt
1ede0 4f 66 73 74 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a  Ofst, mxNtOfst;.
1edf0 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a    struct axset *
1ee00 61 78 3b 0a 0a 20 20 6c 65 6d 70 2d 3e 6d 69 6e  ax;..  lemp->min
1ee10 53 68 69 66 74 52 65 64 75 63 65 20 3d 20 6c 65  ShiftReduce = le
1ee20 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 6c 65  mp->nstate;.  le
1ee30 6d 70 2d 3e 65 72 72 41 63 74 69 6f 6e 20 3d 20  mp->errAction = 
1ee40 6c 65 6d 70 2d 3e 6d 69 6e 53 68 69 66 74 52 65  lemp->minShiftRe
1ee50 64 75 63 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75  duce + lemp->nru
1ee60 6c 65 3b 0a 20 20 6c 65 6d 70 2d 3e 61 63 63 41  le;.  lemp->accA
1ee70 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 65 72  ction = lemp->er
1ee80 72 41 63 74 69 6f 6e 20 2b 20 31 3b 0a 20 20 6c  rAction + 1;.  l
1ee90 65 6d 70 2d 3e 6e 6f 41 63 74 69 6f 6e 20 3d 20  emp->noAction = 
1eea0 6c 65 6d 70 2d 3e 61 63 63 41 63 74 69 6f 6e 20  lemp->accAction 
1eeb0 2b 20 31 3b 0a 20 20 6c 65 6d 70 2d 3e 6d 69 6e  + 1;.  lemp->min
1eec0 52 65 64 75 63 65 20 3d 20 6c 65 6d 70 2d 3e 6e  Reduce = lemp->n
1eed0 6f 41 63 74 69 6f 6e 20 2b 20 31 3b 0a 20 20 6c  oAction + 1;.  l
1eee0 65 6d 70 2d 3e 6d 61 78 41 63 74 69 6f 6e 20 3d  emp->maxAction =
1eef0 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64 75 63 65   lemp->minReduce
1ef00 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a   + lemp->nrule;.
1ef10 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f 6f 70 65  .  in = tplt_ope
1ef20 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66 28 20 69  n(lemp);.  if( i
1ef30 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
1ef40 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e   out = file_open
1ef50 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77 62 22 29  (lemp,".c","wb")
1ef60 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29  ;.  if( out==0 )
1ef70 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  {.    fclose(in)
1ef80 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1ef90 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a  }.  lineno = 1;.
1efa0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1efb0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1efc0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1efd0 6e 65 72 61 74 65 20 74 68 65 20 69 6e 63 6c 75  nerate the inclu
1efe0 64 65 20 63 6f 64 65 2c 20 69 66 20 61 6e 79 20  de code, if any 
1eff0 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
1f000 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69  out,lemp,lemp->i
1f010 6e 63 6c 75 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b  nclude,&lineno);
1f020 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
1f030 0a 20 20 20 20 63 68 61 72 20 2a 69 6e 63 4e 61  .    char *incNa
1f040 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61  me = file_makena
1f050 6d 65 28 6c 65 6d 70 2c 20 22 2e 68 22 29 3b 0a  me(lemp, ".h");.
1f060 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1f070 22 23 69 6e 63 6c 75 64 65 20 5c 22 25 73 5c 22  "#include \"%s\"
1f080 5c 6e 22 2c 20 69 6e 63 4e 61 6d 65 29 3b 20 6c  \n", incName); l
1f090 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65  ineno++;.    fre
1f0a0 65 28 69 6e 63 4e 61 6d 65 29 3b 0a 20 20 7d 0a  e(incName);.  }.
1f0b0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1f0c0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1f0d0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1f0e0 6e 65 72 61 74 65 20 23 64 65 66 69 6e 65 73 20  nerate #defines 
1f0f0 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 2a  for all tokens *
1f100 2f 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29  /.  if( mhflag )
1f110 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
1f120 20 2a 70 72 65 66 69 78 3b 0a 20 20 20 20 66 70   *prefix;.    fp
1f130 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49  rintf(out,"#if I
1f140 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69  NTERFACE\n"); li
1f150 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20  neno++;.    if( 
1f160 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
1f170 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d  x ) prefix = lem
1f180 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a  p->tokenprefix;.
1f190 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20      else        
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66              pref
1f1b0 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72  ix = "";.    for
1f1c0 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74  (i=1; i<lemp->nt
1f1d0 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20  erminal; i++){. 
1f1e0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1f1f0 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30  ,"#define %s%-30
1f200 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c  s %2d\n",prefix,
1f210 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1f220 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20  ->name,i);.     
1f230 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
1f240 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1f250 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69  ,"#endif\n"); li
1f260 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70  neno++;.  }.  tp
1f270 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1f280 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
1f290 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1f2a0 74 65 20 74 68 65 20 64 65 66 69 6e 65 73 20 2a  te the defines *
1f2b0 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
1f2c0 22 23 64 65 66 69 6e 65 20 59 59 43 4f 44 45 54  "#define YYCODET
1f2d0 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d  YPE %s\n",.    m
1f2e0 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65  inimum_size_type
1f2f0 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  (0, lemp->nsymbo
1f300 6c 2b 31 2c 20 26 73 7a 43 6f 64 65 54 79 70 65  l+1, &szCodeType
1f310 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  )); lineno++;.  
1f320 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1f330 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20 25 64  fine YYNOCODE %d
1f340 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  \n",lemp->nsymbo
1f350 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  l+1);  lineno++;
1f360 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1f370 23 64 65 66 69 6e 65 20 59 59 41 43 54 49 4f 4e  #define YYACTION
1f380 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20  TYPE %s\n",.    
1f390 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
1f3a0 65 28 30 2c 6c 65 6d 70 2d 3e 6d 61 78 41 63 74  e(0,lemp->maxAct
1f3b0 69 6f 6e 2c 26 73 7a 41 63 74 69 6f 6e 54 79 70  ion,&szActionTyp
1f3c0 65 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e)); lineno++;. 
1f3d0 20 69 66 28 20 6c 65 6d 70 2d 3e 77 69 6c 64 63   if( lemp->wildc
1f3e0 61 72 64 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ard ){.    fprin
1f3f0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1f400 59 59 57 49 4c 44 43 41 52 44 20 25 64 5c 6e 22  YYWILDCARD %d\n"
1f410 2c 0a 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 77  ,.       lemp->w
1f420 69 6c 64 63 61 72 64 2d 3e 69 6e 64 65 78 29 3b  ildcard->index);
1f430 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1f440 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69   print_stack_uni
1f450 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e  on(out,lemp,&lin
1f460 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20 66  eno,mhflag);.  f
1f470 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 69 66  printf(out, "#if
1f480 6e 64 65 66 20 59 59 53 54 41 43 4b 44 45 50 54  ndef YYSTACKDEPT
1f490 48 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  H\n"); lineno++;
1f4a0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61  .  if( lemp->sta
1f4b0 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20 66 70  cksize ){.    fp
1f4c0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1f4d0 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48 20  ne YYSTACKDEPTH 
1f4e0 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61 63  %s\n",lemp->stac
1f4f0 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ksize);  lineno+
1f500 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1f510 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1f520 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54  fine YYSTACKDEPT
1f530 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65  H 100\n");  line
1f540 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69  no++;.  }.  fpri
1f550 6e 74 66 28 6f 75 74 2c 20 22 23 65 6e 64 69 66  ntf(out, "#endif
1f560 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1f570 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a    if( mhflag ){.
1f580 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1f590 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e  "#if INTERFACE\n
1f5a0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1f5b0 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d  }.  name = lemp-
1f5c0 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61  >name ? lemp->na
1f5d0 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20  me : "Parse";.  
1f5e0 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26 26  if( lemp->arg &&
1f5f0 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29 7b   lemp->arg[0] ){
1f600 0a 20 20 20 20 69 20 3d 20 6c 65 6d 6f 6e 53 74  .    i = lemonSt
1f610 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29 3b  rlen(lemp->arg);
1f620 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31  .    while( i>=1
1f630 20 26 26 20 49 53 53 50 41 43 45 28 6c 65 6d 70   && ISSPACE(lemp
1f640 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20 69 2d  ->arg[i-1]) ) i-
1f650 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e  -;.    while( i>
1f660 3d 31 20 26 26 20 28 49 53 41 4c 4e 55 4d 28 6c  =1 && (ISALNUM(l
1f670 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 7c  emp->arg[i-1]) |
1f680 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d  | lemp->arg[i-1]
1f690 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20  =='_') ) i--;.  
1f6a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1f6b0 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45  define %sARG_SDE
1f6c0 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c  CL %s;\n",name,l
1f6d0 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65  emp->arg);  line
1f6e0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1f6f0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1f700 73 41 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c 6e  sARG_PDECL ,%s\n
1f710 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67  ",name,lemp->arg
1f720 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1f730 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1f740 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54  define %sARG_FET
1f750 43 48 20 25 73 20 3d 20 79 79 70 50 61 72 73 65  CH %s = yypParse
1f760 72 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  r->%s\n",.      
1f770 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c             name,
1f780 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d  lemp->arg,&lemp-
1f790 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e  >arg[i]);  linen
1f7a0 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1f7b0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1f7c0 41 52 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72  ARG_STORE yypPar
1f7d0 73 65 72 2d 3e 25 73 20 3d 20 25 73 5c 6e 22 2c  ser->%s = %s\n",
1f7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f7f0 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72    name,&lemp->ar
1f800 67 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b  g[i],&lemp->arg[
1f810 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i]);  lineno++;.
1f820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
1f830 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1f840 65 20 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22  e %sARG_SDECL\n"
1f850 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ,name);  lineno+
1f860 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
1f870 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1f880 47 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29  G_PDECL\n",name)
1f890 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1f8a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1f8b0 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43  efine %sARG_FETC
1f8c0 48 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65  H\n",name); line
1f8d0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1f8e0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1f8f0 73 41 52 47 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61  sARG_STORE\n",na
1f900 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
1f910 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20   }.  if( mhflag 
1f920 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1f930 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  ut,"#endif\n"); 
1f940 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1f950 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  if( lemp->errsym
1f960 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20  ->useCnt ){.    
1f970 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1f980 66 69 6e 65 20 59 59 45 52 52 4f 52 53 59 4d 42  fine YYERRORSYMB
1f990 4f 4c 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65  OL %d\n",lemp->e
1f9a0 72 72 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 6c  rrsym->index); l
1f9b0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
1f9c0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1f9d0 65 20 59 59 45 52 52 53 59 4d 44 54 20 79 79 25  e YYERRSYMDT yy%
1f9e0 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79  d\n",lemp->errsy
1f9f0 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e  m->dtnum); linen
1fa00 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  o++;.  }.  if( l
1fa10 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63  emp->has_fallbac
1fa20 6b 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  k ){.    fprintf
1fa30 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1fa40 46 41 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20  FALLBACK 1\n"); 
1fa50 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 0a   lineno++;.  }..
1fa60 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
1fa70 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2c 20 62   action table, b
1fa80 75 74 20 64 6f 20 6e 6f 74 20 6f 75 74 70 75 74  ut do not output
1fa90 20 69 74 20 79 65 74 2e 20 20 54 68 65 20 61 63   it yet.  The ac
1faa0 74 69 6f 6e 0a 20 20 2a 2a 20 74 61 62 6c 65 20  tion.  ** table 
1fab0 6d 75 73 74 20 62 65 20 63 6f 6d 70 75 74 65 64  must be computed
1fac0 20 62 65 66 6f 72 65 20 67 65 6e 65 72 61 74 69   before generati
1fad0 6e 67 20 74 68 65 20 59 59 4e 53 54 41 54 45 20  ng the YYNSTATE 
1fae0 6d 61 63 72 6f 20 62 65 63 61 75 73 65 0a 20 20  macro because.  
1faf0 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e  ** we need to kn
1fb00 6f 77 20 68 6f 77 20 6d 61 6e 79 20 73 74 61 74  ow how many stat
1fb10 65 73 20 63 61 6e 20 62 65 20 65 6c 69 6d 69 6e  es can be elimin
1fb20 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 78 20  ated..  */.  ax 
1fb30 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74 20  = (struct axset 
1fb40 2a 29 20 63 61 6c 6c 6f 63 28 6c 65 6d 70 2d 3e  *) calloc(lemp->
1fb50 6e 78 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f  nxstate*2, sizeo
1fb60 66 28 61 78 5b 30 5d 29 29 3b 0a 20 20 69 66 28  f(ax[0]));.  if(
1fb70 20 61 78 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70   ax==0 ){.    fp
1fb80 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61  rintf(stderr,"ma
1fb90 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b  lloc failed\n");
1fba0 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
1fbb0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  }.  for(i=0; i<l
1fbc0 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 20 69 2b  emp->nxstate; i+
1fbd0 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  +){.    stp = le
1fbe0 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
1fbf0 20 20 20 61 78 5b 69 2a 32 5d 2e 73 74 70 20 3d     ax[i*2].stp =
1fc00 20 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32   stp;.    ax[i*2
1fc10 5d 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a 20 20 20  ].isTkn = 1;.   
1fc20 20 61 78 5b 69 2a 32 5d 2e 6e 41 63 74 69 6f 6e   ax[i*2].nAction
1fc30 20 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 3b   = stp->nTknAct;
1fc40 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 73  .    ax[i*2+1].s
1fc50 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78  tp = stp;.    ax
1fc60 5b 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e 20 3d 20  [i*2+1].isTkn = 
1fc70 30 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d  0;.    ax[i*2+1]
1fc80 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e  .nAction = stp->
1fc90 6e 4e 74 41 63 74 3b 0a 20 20 7d 0a 20 20 6d 78  nNtAct;.  }.  mx
1fca0 54 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f  TknOfst = mnTknO
1fcb0 66 73 74 20 3d 20 30 3b 0a 20 20 6d 78 4e 74 4f  fst = 0;.  mxNtO
1fcc0 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 3d  fst = mnNtOfst =
1fcd0 20 30 3b 0a 20 20 2f 2a 20 49 6e 20 61 6e 20 65   0;.  /* In an e
1fce0 66 66 6f 72 74 20 74 6f 20 6d 69 6e 69 6d 69 7a  ffort to minimiz
1fcf0 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  e the action tab
1fd00 6c 65 20 73 69 7a 65 2c 20 75 73 65 20 74 68 65  le size, use the
1fd10 20 68 65 75 72 69 73 74 69 63 0a 20 20 2a 2a 20   heuristic.  ** 
1fd20 6f 66 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6c  of placing the l
1fd30 61 72 67 65 73 74 20 61 63 74 69 6f 6e 20 73 65  argest action se
1fd40 74 73 20 66 69 72 73 74 20 2a 2f 0a 20 20 66 6f  ts first */.  fo
1fd50 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1fd60 78 73 74 61 74 65 2a 32 3b 20 69 2b 2b 29 20 61  xstate*2; i++) a
1fd70 78 5b 69 5d 2e 69 4f 72 64 65 72 20 3d 20 69 3b  x[i].iOrder = i;
1fd80 0a 20 20 71 73 6f 72 74 28 61 78 2c 20 6c 65 6d  .  qsort(ax, lem
1fd90 70 2d 3e 6e 78 73 74 61 74 65 2a 32 2c 20 73 69  p->nxstate*2, si
1fda0 7a 65 6f 66 28 61 78 5b 30 5d 29 2c 20 61 78 73  zeof(ax[0]), axs
1fdb0 65 74 5f 63 6f 6d 70 61 72 65 29 3b 0a 20 20 70  et_compare);.  p
1fdc0 41 63 74 74 61 62 20 3d 20 61 63 74 74 61 62 5f  Acttab = acttab_
1fdd0 61 6c 6c 6f 63 28 6c 65 6d 70 2d 3e 6e 73 79 6d  alloc(lemp->nsym
1fde0 62 6f 6c 2c 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d  bol, lemp->nterm
1fdf0 69 6e 61 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30  inal);.  for(i=0
1fe00 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  ; i<lemp->nxstat
1fe10 65 2a 32 20 26 26 20 61 78 5b 69 5d 2e 6e 41 63  e*2 && ax[i].nAc
1fe20 74 69 6f 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20 20  tion>0; i++){.  
1fe30 20 20 73 74 70 20 3d 20 61 78 5b 69 5d 2e 73 74    stp = ax[i].st
1fe40 70 3b 0a 20 20 20 20 69 66 28 20 61 78 5b 69 5d  p;.    if( ax[i]
1fe50 2e 69 73 54 6b 6e 20 29 7b 0a 20 20 20 20 20 20  .isTkn ){.      
1fe60 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
1fe70 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
1fe80 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 63  {.        int ac
1fe90 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  tion;.        if
1fea0 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e  ( ap->sp->index>
1feb0 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  =lemp->nterminal
1fec0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1fed0 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f       action = co
1fee0 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d  mpute_action(lem
1fef0 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20  p, ap);.        
1ff00 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63  if( action<0 ) c
1ff10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1ff20 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70   acttab_action(p
1ff30 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e  Acttab, ap->sp->
1ff40 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a  index, action);.
1ff50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
1ff60 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 61 63  p->iTknOfst = ac
1ff70 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41 63 74  ttab_insert(pAct
1ff80 74 61 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  tab, 1);.      i
1ff90 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74  f( stp->iTknOfst
1ffa0 3c 6d 6e 54 6b 6e 4f 66 73 74 20 29 20 6d 6e 54  <mnTknOfst ) mnT
1ffb0 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54  knOfst = stp->iT
1ffc0 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66  knOfst;.      if
1ffd0 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3e  ( stp->iTknOfst>
1ffe0 6d 78 54 6b 6e 4f 66 73 74 20 29 20 6d 78 54 6b  mxTknOfst ) mxTk
1fff0 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b  nOfst = stp->iTk
20000 6e 4f 66 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65  nOfst;.    }else
20010 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73  {.      for(ap=s
20020 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
20030 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
20040 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20    int action;.  
20050 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70        if( ap->sp
20060 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74  ->index<lemp->nt
20070 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e  erminal ) contin
20080 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
20090 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c  ap->sp->index==l
200a0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 20 63  emp->nsymbol ) c
200b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
200c0 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74   action = comput
200d0 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61  e_action(lemp, a
200e0 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
200f0 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69  action<0 ) conti
20100 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74  nue;.        act
20110 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74  tab_action(pActt
20120 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  ab, ap->sp->inde
20130 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20  x, action);.    
20140 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69    }.      stp->i
20150 4e 74 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f  NtOfst = acttab_
20160 69 6e 73 65 72 74 28 70 41 63 74 74 61 62 2c 20  insert(pActtab, 
20170 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  0);.      if( st
20180 70 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f  p->iNtOfst<mnNtO
20190 66 73 74 20 29 20 6d 6e 4e 74 4f 66 73 74 20 3d  fst ) mnNtOfst =
201a0 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20   stp->iNtOfst;. 
201b0 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e       if( stp->iN
201c0 74 4f 66 73 74 3e 6d 78 4e 74 4f 66 73 74 20 29  tOfst>mxNtOfst )
201d0 20 6d 78 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d   mxNtOfst = stp-
201e0 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 7d 0a  >iNtOfst;.    }.
201f0 23 69 66 20 30 20 20 2f 2a 20 55 6e 63 6f 6d 6d  #if 0  /* Uncomm
20200 65 6e 74 20 66 6f 72 20 61 20 74 72 61 63 65 20  ent for a trace 
20210 6f 66 20 68 6f 77 20 74 68 65 20 79 79 5f 61 63  of how the yy_ac
20220 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 66 69 6c  tion[] table fil
20230 6c 73 20 6f 75 74 20 2a 2f 0a 20 20 20 20 7b 20  ls out */.    { 
20240 69 6e 74 20 6a 6a 2c 20 6e 6e 3b 0a 20 20 20 20  int jj, nn;.    
20250 20 20 66 6f 72 28 6a 6a 3d 6e 6e 3d 30 3b 20 6a    for(jj=nn=0; j
20260 6a 3c 70 41 63 74 74 61 62 2d 3e 6e 41 63 74 69  j<pActtab->nActi
20270 6f 6e 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  on; jj++){.     
20280 20 20 20 69 66 28 20 70 41 63 74 74 61 62 2d 3e     if( pActtab->
20290 61 41 63 74 69 6f 6e 5b 6a 6a 5d 2e 61 63 74 69  aAction[jj].acti
202a0 6f 6e 3c 30 20 29 20 6e 6e 2b 2b 3b 0a 20 20 20  on<0 ) nn++;.   
202b0 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74     }.      print
202c0 66 28 22 25 34 64 3a 20 53 74 61 74 65 20 25 33  f("%4d: State %3
202d0 64 20 25 73 20 6e 3a 20 25 32 64 20 73 69 7a 65  d %s n: %2d size
202e0 3a 20 25 35 64 20 66 72 65 65 73 70 61 63 65 3a  : %5d freespace:
202f0 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
20300 20 20 20 20 20 69 2c 20 73 74 70 2d 3e 73 74 61       i, stp->sta
20310 74 65 6e 75 6d 2c 20 61 78 5b 69 5d 2e 69 73 54  tenum, ax[i].isT
20320 6b 6e 20 3f 20 22 54 6f 6b 65 6e 22 20 3a 20 22  kn ? "Token" : "
20330 56 61 72 20 20 22 2c 0a 20 20 20 20 20 20 20 20  Var  ",.        
20340 20 20 20 20 20 61 78 5b 69 5d 2e 6e 41 63 74 69       ax[i].nActi
20350 6f 6e 2c 20 70 41 63 74 74 61 62 2d 3e 6e 41 63  on, pActtab->nAc
20360 74 69 6f 6e 2c 20 6e 6e 29 3b 0a 20 20 20 20 7d  tion, nn);.    }
20370 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 66 72  .#endif.  }.  fr
20380 65 65 28 61 78 29 3b 0a 0a 20 20 2f 2a 20 4d 61  ee(ax);..  /* Ma
20390 72 6b 20 72 75 6c 65 73 20 74 68 61 74 20 61 72  rk rules that ar
203a0 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20  e actually used 
203b0 66 6f 72 20 72 65 64 75 63 65 20 61 63 74 69 6f  for reduce actio
203c0 6e 73 20 61 66 74 65 72 20 61 6c 6c 0a 20 20 2a  ns after all.  *
203d0 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  * optimizations 
203e0 68 61 76 65 20 62 65 65 6e 20 61 70 70 6c 69 65  have been applie
203f0 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d  d.  */.  for(rp=
20400 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
20410 72 70 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d  rp=rp->next) rp-
20420 3e 64 6f 65 73 52 65 64 75 63 65 20 3d 20 4c 45  >doesReduce = LE
20430 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 66 6f 72  MON_FALSE;.  for
20440 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78  (i=0; i<lemp->nx
20450 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
20460 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f   for(ap=lemp->so
20470 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b  rted[i]->ap; ap;
20480 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
20490 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
204a0 65 3d 3d 52 45 44 55 43 45 20 7c 7c 20 61 70 2d  e==REDUCE || ap-
204b0 3e 74 79 70 65 3d 3d 53 48 49 46 54 52 45 44 55  >type==SHIFTREDU
204c0 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  CE ){.        ap
204d0 2d 3e 78 2e 72 70 2d 3e 64 6f 65 73 52 65 64 75  ->x.rp->doesRedu
204e0 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ce = 1;.      }.
204f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
20500 46 69 6e 69 73 68 20 72 65 6e 64 65 72 69 6e 67  Finish rendering
20510 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 73 20 6e   the constants n
20520 6f 77 20 74 68 61 74 20 74 68 65 20 61 63 74 69  ow that the acti
20530 6f 6e 20 74 61 62 6c 65 20 68 61 73 0a 20 20 2a  on table has.  *
20540 2a 20 62 65 65 6e 20 63 6f 6d 70 75 74 65 64 20  * been computed 
20550 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
20560 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 53 54 41  ,"#define YYNSTA
20570 54 45 20 20 20 20 20 20 20 20 20 20 20 20 20 25  TE             %
20580 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 78 73 74 61  d\n",lemp->nxsta
20590 74 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  te);  lineno++;.
205a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
205b0 64 65 66 69 6e 65 20 59 59 4e 52 55 4c 45 20 20  define YYNRULE  
205c0 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
205d0 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20  ",lemp->nrule); 
205e0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
205f0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
20600 65 20 59 59 4e 54 4f 4b 45 4e 20 20 20 20 20 20  e YYNTOKEN      
20610 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 6c 65 6d         %d\n",lem
20620 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 29 3b 20 6c  p->nterminal); l
20630 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
20640 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
20650 59 59 5f 4d 41 58 5f 53 48 49 46 54 20 20 20 20  YY_MAX_SHIFT    
20660 20 20 20 20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d       %d\n",lemp-
20670 3e 6e 78 73 74 61 74 65 2d 31 29 3b 20 6c 69 6e  >nxstate-1); lin
20680 65 6e 6f 2b 2b 3b 0a 20 20 69 20 3d 20 6c 65 6d  eno++;.  i = lem
20690 70 2d 3e 6d 69 6e 53 68 69 66 74 52 65 64 75 63  p->minShiftReduc
206a0 65 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  e;.  fprintf(out
206b0 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 4d 49 4e  ,"#define YY_MIN
206c0 5f 53 48 49 46 54 52 45 44 55 43 45 20 20 20 25  _SHIFTREDUCE   %
206d0 64 5c 6e 22 2c 69 29 3b 20 6c 69 6e 65 6e 6f 2b  d\n",i); lineno+
206e0 2b 3b 0a 20 20 69 20 2b 3d 20 6c 65 6d 70 2d 3e  +;.  i += lemp->
206f0 6e 72 75 6c 65 3b 0a 20 20 66 70 72 69 6e 74 66  nrule;.  fprintf
20700 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
20710 5f 4d 41 58 5f 53 48 49 46 54 52 45 44 55 43 45  _MAX_SHIFTREDUCE
20720 20 20 20 25 64 5c 6e 22 2c 20 69 2d 31 29 3b 20     %d\n", i-1); 
20730 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
20740 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
20750 20 59 59 5f 45 52 52 4f 52 5f 41 43 54 49 4f 4e   YY_ERROR_ACTION
20760 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 6c 65 6d        %d\n", lem
20770 70 2d 3e 65 72 72 41 63 74 69 6f 6e 29 3b 20 6c  p->errAction); l
20780 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
20790 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
207a0 59 59 5f 41 43 43 45 50 54 5f 41 43 54 49 4f 4e  YY_ACCEPT_ACTION
207b0 20 20 20 20 20 25 64 5c 6e 22 2c 20 6c 65 6d 70       %d\n", lemp
207c0 2d 3e 61 63 63 41 63 74 69 6f 6e 29 3b 20 6c 69  ->accAction); li
207d0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
207e0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
207f0 59 5f 4e 4f 5f 41 43 54 49 4f 4e 20 20 20 20 20  Y_NO_ACTION     
20800 20 20 20 20 25 64 5c 6e 22 2c 20 6c 65 6d 70 2d      %d\n", lemp-
20810 3e 6e 6f 41 63 74 69 6f 6e 29 3b 20 6c 69 6e 65  >noAction); line
20820 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
20830 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f  out,"#define YY_
20840 4d 49 4e 5f 52 45 44 55 43 45 20 20 20 20 20 20  MIN_REDUCE      
20850 20 20 25 64 5c 6e 22 2c 20 6c 65 6d 70 2d 3e 6d    %d\n", lemp->m
20860 69 6e 52 65 64 75 63 65 29 3b 20 6c 69 6e 65 6e  inReduce); linen
20870 6f 2b 2b 3b 0a 20 20 69 20 3d 20 6c 65 6d 70 2d  o++;.  i = lemp-
20880 3e 6d 69 6e 52 65 64 75 63 65 20 2b 20 6c 65 6d  >minReduce + lem
20890 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 66 70 72 69  p->nrule;.  fpri
208a0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
208b0 20 59 59 5f 4d 41 58 5f 52 45 44 55 43 45 20 20   YY_MAX_REDUCE  
208c0 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 2d 31        %d\n", i-1
208d0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74  ); lineno++;.  t
208e0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
208f0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
20900 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6f  no);..  /* Now o
20910 75 74 70 75 74 20 74 68 65 20 61 63 74 69 6f 6e  utput the action
20920 20 74 61 62 6c 65 20 61 6e 64 20 69 74 73 20 61   table and its a
20930 73 73 6f 63 69 61 74 65 73 3a 0a 20 20 2a 2a 0a  ssociates:.  **.
20940 20 20 2a 2a 20 20 79 79 5f 61 63 74 69 6f 6e 5b    **  yy_action[
20950 5d 20 20 20 20 20 20 20 20 41 20 73 69 6e 67 6c  ]        A singl
20960 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  e table containi
20970 6e 67 20 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a  ng all actions..
20980 20 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68 65    **  yy_lookahe
20990 61 64 5b 5d 20 20 20 20 20 41 20 74 61 62 6c 65  ad[]     A table
209a0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
209b0 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 65 61  lookahead for ea
209c0 63 68 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a  ch entry in.  **
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209e0 20 20 20 20 20 79 79 5f 61 63 74 69 6f 6e 2e 20       yy_action. 
209f0 20 55 73 65 64 20 74 6f 20 64 65 74 65 63 74 20   Used to detect 
20a00 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e  hash collisions.
20a10 0a 20 20 2a 2a 20 20 79 79 5f 73 68 69 66 74 5f  .  **  yy_shift_
20a20 6f 66 73 74 5b 5d 20 20 20 20 46 6f 72 20 65 61  ofst[]    For ea
20a30 63 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66  ch state, the of
20a40 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74  fset into yy_act
20a50 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20  ion for.  **    
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a70 20 73 68 69 66 74 69 6e 67 20 74 65 72 6d 69 6e   shifting termin
20a80 61 6c 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 72 65  als..  **  yy_re
20a90 64 75 63 65 5f 6f 66 73 74 5b 5d 20 20 20 46 6f  duce_ofst[]   Fo
20aa0 72 20 65 61 63 68 20 73 74 61 74 65 2c 20 74 68  r each state, th
20ab0 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79  e offset into yy
20ac0 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a  _action for.  **
20ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ae0 20 20 20 20 20 73 68 69 66 74 69 6e 67 20 6e 6f       shifting no
20af0 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 61 66 74 65  n-terminals afte
20b00 72 20 61 20 72 65 64 75 63 65 2e 0a 20 20 2a 2a  r a reduce..  **
20b10 20 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 20    yy_default[]  
20b20 20 20 20 20 20 44 65 66 61 75 6c 74 20 61 63 74       Default act
20b30 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 73 74 61  ion for each sta
20b40 74 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  te..  */..  /* O
20b50 75 74 70 75 74 20 74 68 65 20 79 79 5f 61 63 74  utput the yy_act
20b60 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6c  ion table */.  l
20b70 65 6d 70 2d 3e 6e 61 63 74 69 6f 6e 74 61 62 20  emp->nactiontab 
20b80 3d 20 6e 20 3d 20 61 63 74 74 61 62 5f 61 63 74  = n = acttab_act
20b90 69 6f 6e 5f 73 69 7a 65 28 70 41 63 74 74 61 62  ion_size(pActtab
20ba0 29 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65  );.  lemp->table
20bb0 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 41 63 74 69  size += n*szActi
20bc0 6f 6e 54 79 70 65 3b 0a 20 20 66 70 72 69 6e 74  onType;.  fprint
20bd0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
20be0 59 5f 41 43 54 54 41 42 5f 43 4f 55 4e 54 20 28  Y_ACTTAB_COUNT (
20bf0 25 64 29 5c 6e 22 2c 20 6e 29 3b 20 6c 69 6e 65  %d)\n", n); line
20c00 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
20c10 6f 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73  out,"static cons
20c20 74 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79  t YYACTIONTYPE y
20c30 79 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e  y_action[] = {\n
20c40 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
20c50 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
20c60 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 63  i++){.    int ac
20c70 74 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79 79  tion = acttab_yy
20c80 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20  action(pActtab, 
20c90 69 29 3b 0a 20 20 20 20 69 66 28 20 61 63 74 69  i);.    if( acti
20ca0 6f 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d 20  on<0 ) action = 
20cb0 6c 65 6d 70 2d 3e 6e 6f 41 63 74 69 6f 6e 3b 0a  lemp->noAction;.
20cc0 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
20cd0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
20ce0 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
20cf0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
20d00 20 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b   %4d,", action);
20d10 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
20d20 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
20d30 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
20d40 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
20d50 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
20d60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
20d70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
20d80 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
20d90 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
20da0 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79   /* Output the y
20db0 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c  y_lookahead tabl
20dc0 65 20 2a 2f 0a 20 20 6c 65 6d 70 2d 3e 6e 6c 6f  e */.  lemp->nlo
20dd0 6f 6b 61 68 65 61 64 74 61 62 20 3d 20 6e 20 3d  okaheadtab = n =
20de0 20 61 63 74 74 61 62 5f 6c 6f 6f 6b 61 68 65 61   acttab_lookahea
20df0 64 5f 73 69 7a 65 28 70 41 63 74 74 61 62 29 3b  d_size(pActtab);
20e00 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69  .  lemp->tablesi
20e10 7a 65 20 2b 3d 20 6e 2a 73 7a 43 6f 64 65 54 79  ze += n*szCodeTy
20e20 70 65 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  pe;.  fprintf(ou
20e30 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20  t,"static const 
20e40 59 59 43 4f 44 45 54 59 50 45 20 79 79 5f 6c 6f  YYCODETYPE yy_lo
20e50 6f 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e 22  okahead[] = {\n"
20e60 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
20e70 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
20e80 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61 20  ++){.    int la 
20e90 3d 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61  = acttab_yylooka
20ea0 68 65 61 64 28 70 41 63 74 74 61 62 2c 20 69 29  head(pActtab, i)
20eb0 3b 0a 20 20 20 20 69 66 28 20 6c 61 3c 30 20 29  ;.    if( la<0 )
20ec0 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d   la = lemp->nsym
20ed0 62 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  bol;.    if( j==
20ee0 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
20ef0 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
20f00 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
20f10 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61 29  ut, " %4d,", la)
20f20 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c  ;.    if( j==9 |
20f30 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20  | i==n-1 ){.    
20f40 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
20f50 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
20f60 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
20f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b   }else{.      j+
20f80 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  +;.    }.  }.  f
20f90 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c  printf(out, "};\
20fa0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a  n"); lineno++;..
20fb0 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
20fc0 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20  yy_shift_ofst[] 
20fd0 74 61 62 6c 65 20 2a 2f 0a 20 20 6e 20 3d 20 6c  table */.  n = l
20fe0 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 0a 20 20  emp->nxstate;.  
20ff0 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65  while( n>0 && le
21000 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d  mp->sorted[n-1]-
21010 3e 69 54 6b 6e 4f 66 73 74 3d 3d 4e 4f 5f 4f 46  >iTknOfst==NO_OF
21020 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70  FSET ) n--;.  fp
21030 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
21040 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 43 4f 55  ine YY_SHIFT_COU
21050 4e 54 20 20 20 20 28 25 64 29 5c 6e 22 2c 20 6e  NT    (%d)\n", n
21060 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  -1); lineno++;. 
21070 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
21080 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f  define YY_SHIFT_
21090 4d 49 4e 20 20 20 20 20 20 28 25 64 29 5c 6e 22  MIN      (%d)\n"
210a0 2c 20 6d 6e 54 6b 6e 4f 66 73 74 29 3b 20 6c 69  , mnTknOfst); li
210b0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
210c0 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
210d0 59 59 5f 53 48 49 46 54 5f 4d 41 58 20 20 20 20  YY_SHIFT_MAX    
210e0 20 20 28 25 64 29 5c 6e 22 2c 20 6d 78 54 6b 6e    (%d)\n", mxTkn
210f0 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  Ofst); lineno++;
21100 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
21110 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73  "static const %s
21120 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d   yy_shift_ofst[]
21130 20 3d 20 7b 5c 6e 22 2c 0a 20 20 20 20 20 20 20   = {\n",.       
21140 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
21150 65 28 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6c 65 6d  e(mnTknOfst, lem
21160 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 2b 6c 65 6d  p->nterminal+lem
21170 70 2d 3e 6e 61 63 74 69 6f 6e 74 61 62 2c 20 26  p->nactiontab, &
21180 73 7a 29 29 3b 0a 20 20 20 20 20 20 20 6c 69 6e  sz));.       lin
21190 65 6e 6f 2b 2b 3b 0a 20 20 6c 65 6d 70 2d 3e 74  eno++;.  lemp->t
211a0 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a  ablesize += n*sz
211b0 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
211c0 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  <n; i++){.    in
211d0 74 20 6f 66 73 74 3b 0a 20 20 20 20 73 74 70 20  t ofst;.    stp 
211e0 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
211f0 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20 73 74  ];.    ofst = st
21200 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20  p->iTknOfst;.   
21210 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46   if( ofst==NO_OF
21220 46 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6c 65  FSET ) ofst = le
21230 6d 70 2d 3e 6e 61 63 74 69 6f 6e 74 61 62 3b 0a  mp->nactiontab;.
21240 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
21250 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
21260 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
21270 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
21280 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20   %4d,", ofst);. 
21290 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69     if( j==9 || i
212a0 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  ==n-1 ){.      f
212b0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
212c0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
212d0 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65     j = 0;.    }e
212e0 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  lse{.      j++;.
212f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69      }.  }.  fpri
21300 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29  ntf(out, "};\n")
21310 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f  ; lineno++;..  /
21320 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f  * Output the yy_
21330 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 74 61  reduce_ofst[] ta
21340 62 6c 65 20 2a 2f 0a 20 20 6e 20 3d 20 6c 65 6d  ble */.  n = lem
21350 70 2d 3e 6e 78 73 74 61 74 65 3b 0a 20 20 77 68  p->nxstate;.  wh
21360 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70  ile( n>0 && lemp
21370 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69  ->sorted[n-1]->i
21380 4e 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45  NtOfst==NO_OFFSE
21390 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e  T ) n--;.  fprin
213a0 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65  tf(out, "#define
213b0 20 59 59 5f 52 45 44 55 43 45 5f 43 4f 55 4e 54   YY_REDUCE_COUNT
213c0 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20   (%d)\n", n-1); 
213d0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
213e0 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
213f0 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 49 4e 20  e YY_REDUCE_MIN 
21400 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f    (%d)\n", mnNtO
21410 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  fst); lineno++;.
21420 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
21430 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43  #define YY_REDUC
21440 45 5f 4d 41 58 20 20 20 28 25 64 29 5c 6e 22 2c  E_MAX   (%d)\n",
21450 20 6d 78 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65   mxNtOfst); line
21460 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
21470 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e  out, "static con
21480 73 74 20 25 73 20 79 79 5f 72 65 64 75 63 65 5f  st %s yy_reduce_
21490 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 0a 20  ofst[] = {\n",. 
214a0 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d           minimum
214b0 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e 74 4f  _size_type(mnNtO
214c0 66 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73 74 2c  fst-1, mxNtOfst,
214d0 20 26 73 7a 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   &sz)); lineno++
214e0 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73  ;.  lemp->tables
214f0 69 7a 65 20 2b 3d 20 6e 2a 73 7a 3b 0a 20 20 66  ize += n*sz;.  f
21500 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
21510 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73  ++){.    int ofs
21520 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  t;.    stp = lem
21530 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
21540 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e    ofst = stp->iN
21550 74 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f  tOfst;.    if( o
21560 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
21570 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74   ofst = mnNtOfst
21580 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d   - 1;.    if( j=
21590 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
215a0 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
215b0 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
215c0 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66  out, " %4d,", of
215d0 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  st);.    if( j==
215e0 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
215f0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
21600 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
21610 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
21620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21630 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
21640 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
21650 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
21660 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
21670 68 65 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f  he default actio
21680 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72  n table */.  fpr
21690 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69  intf(out, "stati
216a0 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e  c const YYACTION
216b0 54 59 50 45 20 79 79 5f 64 65 66 61 75 6c 74 5b  TYPE yy_default[
216c0 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ] = {\n"); linen
216d0 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d  o++;.  n = lemp-
216e0 3e 6e 78 73 74 61 74 65 3b 0a 20 20 6c 65 6d 70  >nxstate;.  lemp
216f0 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e  ->tablesize += n
21700 2a 73 7a 41 63 74 69 6f 6e 54 79 70 65 3b 0a 20  *szActionType;. 
21710 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
21720 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
21730 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
21740 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29  ;.    if( j==0 )
21750 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
21760 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a  * %5d */ ", i);.
21770 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 44 66      if( stp->iDf
21780 6c 74 52 65 64 75 63 65 3c 30 20 29 7b 0a 20 20  ltReduce<0 ){.  
21790 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
217a0 20 22 20 25 34 64 2c 22 2c 20 6c 65 6d 70 2d 3e   " %4d,", lemp->
217b0 65 72 72 41 63 74 69 6f 6e 29 3b 0a 20 20 20 20  errAction);.    
217c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72  }else{.      fpr
217d0 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c  intf(out, " %4d,
217e0 22 2c 20 73 74 70 2d 3e 69 44 66 6c 74 52 65 64  ", stp->iDfltRed
217f0 75 63 65 20 2b 20 6c 65 6d 70 2d 3e 6d 69 6e 52  uce + lemp->minR
21800 65 64 75 63 65 29 3b 0a 20 20 20 20 7d 0a 20 20  educe);.    }.  
21810 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d    if( j==9 || i=
21820 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70  =n-1 ){.      fp
21830 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
21840 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
21850 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c    j = 0;.    }el
21860 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  se{.      j++;. 
21870 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e     }.  }.  fprin
21880 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b  tf(out, "};\n");
21890 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c   lineno++;.  tpl
218a0 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
218b0 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
218c0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
218d0 65 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 66  e the table of f
218e0 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a  allback tokens..
218f0 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d    */.  if( lemp-
21900 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b  >has_fallback ){
21910 0a 20 20 20 20 69 6e 74 20 6d 78 20 3d 20 6c 65  .    int mx = le
21920 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 2d 20  mp->nterminal - 
21930 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6d 78  1;.    while( mx
21940 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62  >0 && lemp->symb
21950 6f 6c 73 5b 6d 78 5d 2d 3e 66 61 6c 6c 62 61 63  ols[mx]->fallbac
21960 6b 3d 3d 30 20 29 7b 20 6d 78 2d 2d 3b 20 7d 0a  k==0 ){ mx--; }.
21970 20 20 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73      lemp->tables
21980 69 7a 65 20 2b 3d 20 28 6d 78 2b 31 29 2a 73 7a  ize += (mx+1)*sz
21990 43 6f 64 65 54 79 70 65 3b 0a 20 20 20 20 66 6f  CodeType;.    fo
219a0 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 3b 20 69 2b  r(i=0; i<=mx; i+
219b0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
219c0 20 73 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d   symbol *p = lem
219d0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
219e0 20 20 20 20 20 69 66 28 20 70 2d 3e 66 61 6c 6c       if( p->fall
219f0 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  back==0 ){.     
21a00 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
21a10 22 20 20 20 20 30 2c 20 20 2f 2a 20 25 31 30 73  "    0,  /* %10s
21a20 20 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e   => nothing */\n
21a30 22 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ", p->name);.   
21a40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21a50 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
21a60 20 20 25 33 64 2c 20 20 2f 2a 20 25 31 30 73 20    %3d,  /* %10s 
21a70 3d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e  => %s */\n", p->
21a80 66 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65 78 2c  fallback->index,
21a90 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 61  .          p->na
21aa0 6d 65 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d  me, p->fallback-
21ab0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  >name);.      }.
21ac0 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a        lineno++;.
21ad0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74      }.  }.  tplt
21ae0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
21af0 2c 20 69 6e 2c 20 6f 75 74 2c 20 26 6c 69 6e 65  , in, out, &line
21b00 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
21b10 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74  ate a table cont
21b20 61 69 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f  aining the symbo
21b30 6c 69 63 20 6e 61 6d 65 20 6f 66 20 65 76 65 72  lic name of ever
21b40 79 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20  y symbol.  */.  
21b50 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
21b60 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
21b70 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74      lemon_sprint
21b80 66 28 6c 69 6e 65 2c 22 5c 22 25 73 5c 22 2c 22  f(line,"\"%s\","
21b90 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
21ba0 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 70  ]->name);.    fp
21bb0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 2f 2a 20  rintf(out,"  /* 
21bc0 25 34 64 20 2a 2f 20 5c 22 25 73 5c 22 2c 5c 6e  %4d */ \"%s\",\n
21bd0 22 2c 69 2c 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  ",i, lemp->symbo
21be0 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 20 6c 69  ls[i]->name); li
21bf0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70  neno++;.  }.  tp
21c00 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
21c10 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
21c20 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
21c30 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  te a table conta
21c40 69 6e 69 6e 67 20 61 20 74 65 78 74 20 73 74 72  ining a text str
21c50 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
21c60 65 73 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 75  es every.  ** ru
21c70 6c 65 20 69 6e 20 74 68 65 20 72 75 6c 65 20 73  le in the rule s
21c80 65 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  et of the gramma
21c90 72 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  r.  This informa
21ca0 74 69 6f 6e 20 69 73 20 75 73 65 64 0a 20 20 2a  tion is used.  *
21cb0 2a 20 77 68 65 6e 20 74 72 61 63 69 6e 67 20 52  * when tracing R
21cc0 45 44 55 43 45 20 61 63 74 69 6f 6e 73 2e 0a 20  EDUCE actions.. 
21cd0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72   */.  for(i=0, r
21ce0 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
21cf0 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 2c 20 69  ; rp=rp->next, i
21d00 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
21d10 20 72 70 2d 3e 69 52 75 6c 65 3d 3d 69 20 29 3b   rp->iRule==i );
21d20 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
21d30 2c 22 20 2f 2a 20 25 33 64 20 2a 2f 20 5c 22 22  ," /* %3d */ \""
21d40 2c 20 69 29 3b 0a 20 20 20 20 77 72 69 74 65 52  , i);.    writeR
21d50 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29  uleText(out, rp)
21d60 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
21d70 74 2c 22 5c 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65  t,"\",\n"); line
21d80 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  no++;.  }.  tplt
21d90 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
21da0 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
21db0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
21dc0 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
21dd0 75 74 65 73 20 65 76 65 72 79 20 74 69 6d 65 20  utes every time 
21de0 61 20 73 79 6d 62 6f 6c 20 69 73 20 70 6f 70 70  a symbol is popp
21df0 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  ed from.  ** the
21e00 20 73 74 61 63 6b 20 77 68 69 6c 65 20 70 72 6f   stack while pro
21e10 63 65 73 73 69 6e 67 20 65 72 72 6f 72 73 20 6f  cessing errors o
21e20 72 20 77 68 69 6c 65 20 64 65 73 74 72 6f 79 69  r while destroyi
21e30 6e 67 20 74 68 65 20 70 61 72 73 65 72 2e 0a 20  ng the parser.. 
21e40 20 2a 2a 20 28 49 6e 20 6f 74 68 65 72 20 77 6f   ** (In other wo
21e50 72 64 73 2c 20 67 65 6e 65 72 61 74 65 20 74 68  rds, generate th
21e60 65 20 25 64 65 73 74 72 75 63 74 6f 72 20 61 63  e %destructor ac
21e70 74 69 6f 6e 73 29 0a 20 20 2a 2f 0a 20 20 69 66  tions).  */.  if
21e80 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73  ( lemp->tokendes
21e90 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6e 63  t ){.    int onc
21ea0 65 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  e = 1;.    for(i
21eb0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
21ec0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  bol; i++){.     
21ed0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
21ee0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
21ef0 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ls[i];.      if(
21f00 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79   sp==0 || sp->ty
21f10 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 29 20 63  pe!=TERMINAL ) c
21f20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
21f30 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20  f( once ){.     
21f40 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
21f50 22 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 49 4e  "      /* TERMIN
21f60 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a 2f  AL Destructor */
21f70 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
21f80 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30          once = 0
21f90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21fa0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
21fb0 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20   case %d: /* %s 
21fc0 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78  */\n", sp->index
21fd0 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e  , sp->name); lin
21fe0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  eno++;.    }.   
21ff0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
22000 2d 3e 6e 73 79 6d 62 6f 6c 20 26 26 20 6c 65 6d  ->nsymbol && lem
22010 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74  p->symbols[i]->t
22020 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 3b 20 69  ype!=TERMINAL; i
22030 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 6c  ++);.    if( i<l
22040 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a  emp->nsymbol ){.
22050 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72        emit_destr
22060 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c  uctor_code(out,l
22070 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c  emp->symbols[i],
22080 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lemp,&lineno);. 
22090 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
220a0 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e  ,"      break;\n
220b0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
220c0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65    }.  }.  if( le
220d0 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a 20  mp->vardest ){. 
220e0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
220f0 20 2a 64 66 6c 74 5f 73 70 20 3d 20 30 3b 0a 20   *dflt_sp = 0;. 
22100 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b     int once = 1;
22110 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
22120 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
22130 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
22140 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
22150 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
22160 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30  .      if( sp==0
22170 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45   || sp->type==TE
22180 52 4d 49 4e 41 4c 20 7c 7c 0a 20 20 20 20 20 20  RMINAL ||.      
22190 20 20 20 20 73 70 2d 3e 69 6e 64 65 78 3c 3d 30      sp->index<=0
221a0 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74   || sp->destruct
221b0 6f 72 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  or!=0 ) continue
221c0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
221d0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
221e0 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 20 20  ntf(out, "      
221f0 2f 2a 20 44 65 66 61 75 6c 74 20 4e 4f 4e 2d 54  /* Default NON-T
22200 45 52 4d 49 4e 41 4c 20 44 65 73 74 72 75 63 74  ERMINAL Destruct
22210 6f 72 20 2a 2f 5c 6e 22 29 3b 6c 69 6e 65 6e 6f  or */\n");lineno
22220 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65  ++;.        once
22230 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
22240 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
22250 22 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a  "    case %d: /*
22260 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69   %s */\n", sp->i
22270 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b  ndex, sp->name);
22280 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
22290 20 64 66 6c 74 5f 73 70 20 3d 20 73 70 3b 0a 20   dflt_sp = sp;. 
222a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 66 6c     }.    if( dfl
222b0 74 5f 73 70 21 3d 30 20 29 7b 0a 20 20 20 20 20  t_sp!=0 ){.     
222c0 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72   emit_destructor
222d0 5f 63 6f 64 65 28 6f 75 74 2c 64 66 6c 74 5f 73  _code(out,dflt_s
222e0 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b  p,lemp,&lineno);
222f0 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
22300 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72  tf(out,"      br
22310 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  eak;\n"); lineno
22320 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ++;.  }.  for(i=
22330 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
22340 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  ol; i++){.    st
22350 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
22360 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
22370 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d  i];.    if( sp==
22380 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54  0 || sp->type==T
22390 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64  ERMINAL || sp->d
223a0 65 73 74 72 75 63 74 6f 72 3d 3d 30 20 29 20 63  estructor==0 ) c
223b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
223c0 20 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 3c   sp->destLineno<
223d0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f  0 ) continue;  /
223e0 2a 20 41 6c 72 65 61 64 79 20 65 6d 69 74 74 65  * Already emitte
223f0 64 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66  d */.    fprintf
22400 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25  (out,"    case %
22410 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20  d: /* %s */\n", 
22420 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e  sp->index, sp->n
22430 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
22440 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20  .    /* Combine 
22450 64 75 70 6c 69 63 61 74 65 20 64 65 73 74 72 75  duplicate destru
22460 63 74 6f 72 73 20 69 6e 74 6f 20 61 20 73 69 6e  ctors into a sin
22470 67 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  gle case */.    
22480 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65 6d  for(j=i+1; j<lem
22490 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b 29  p->nsymbol; j++)
224a0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
224b0 79 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c 65 6d  ymbol *sp2 = lem
224c0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20  p->symbols[j];. 
224d0 20 20 20 20 20 69 66 28 20 73 70 32 20 26 26 20       if( sp2 && 
224e0 73 70 32 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49  sp2->type!=TERMI
224f0 4e 41 4c 20 26 26 20 73 70 32 2d 3e 64 65 73 74  NAL && sp2->dest
22500 72 75 63 74 6f 72 0a 20 20 20 20 20 20 20 20 20  ructor.         
22510 20 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d 3d 3d   && sp2->dtnum==
22520 73 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20 20 20  sp->dtnum.      
22530 20 20 20 20 26 26 20 73 74 72 63 6d 70 28 73 70      && strcmp(sp
22540 2d 3e 64 65 73 74 72 75 63 74 6f 72 2c 73 70 32  ->destructor,sp2
22550 2d 3e 64 65 73 74 72 75 63 74 6f 72 29 3d 3d 30  ->destructor)==0
22560 20 29 7b 0a 20 20 20 20 20 20 20 20 20 66 70 72   ){.         fpr
22570 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61  intf(out,"    ca
22580 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c  se %d: /* %s */\
22590 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
225a0 20 20 20 20 20 73 70 32 2d 3e 69 6e 64 65 78 2c       sp2->index,
225b0 20 73 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e   sp2->name); lin
225c0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  eno++;.         
225d0 73 70 32 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 20  sp2->destLineno 
225e0 3d 20 2d 31 3b 20 20 2f 2a 20 41 76 6f 69 64 20  = -1;  /* Avoid 
225f0 65 6d 69 74 74 69 6e 67 20 74 68 69 73 20 64 65  emitting this de
22600 73 74 72 75 63 74 6f 72 20 61 67 61 69 6e 20 2a  structor again *
22610 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
22620 0a 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75  .    emit_destru
22630 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65  ctor_code(out,le
22640 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c  mp->symbols[i],l
22650 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  emp,&lineno);.  
22660 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
22670 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b       break;\n");
22680 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
22690 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
226a0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
226b0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
226c0 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
226d0 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 65 76   executes whenev
226e0 65 72 20 74 68 65 20 70 61 72 73 65 72 20 73 74  er the parser st
226f0 61 63 6b 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f  ack overflows */
22700 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
22710 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 6f 76 65  t,lemp,lemp->ove
22720 72 66 6c 6f 77 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  rflow,&lineno);.
22730 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
22740 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
22750 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
22760 6e 65 72 61 74 65 20 74 68 65 20 74 61 62 6c 65  nerate the table
22770 20 6f 66 20 72 75 6c 65 20 69 6e 66 6f 72 6d 61   of rule informa
22780 74 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  tion.  **.  ** N
22790 6f 74 65 3a 20 54 68 69 73 20 63 6f 64 65 20 64  ote: This code d
227a0 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
227b0 63 74 20 74 68 61 74 20 72 75 6c 65 73 20 61 72  ct that rules ar
227c0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 65  e number.  ** se
227d0 71 75 65 6e 74 75 61 6c 6c 79 20 62 65 67 69 6e  quentually begin
227e0 6e 69 6e 67 20 77 69 74 68 20 30 2e 0a 20 20 2a  ning with 0..  *
227f0 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d  /.  for(i=0, rp=
22800 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
22810 72 70 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b  rp=rp->next, i++
22820 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
22830 75 74 2c 22 20 20 7b 20 25 34 64 2c 20 25 34 64  ut,"  { %4d, %4d
22840 20 7d 2c 20 2f 2a 20 28 25 64 29 20 22 2c 72 70   }, /* (%d) ",rp
22850 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c 2d 72 70  ->lhs->index,-rp
22860 2d 3e 6e 72 68 73 2c 69 29 3b 0a 20 20 20 20 72  ->nrhs,i);.    r
22870 75 6c 65 5f 70 72 69 6e 74 28 6f 75 74 2c 20 72  ule_print(out, r
22880 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  p);.    fprintf(
22890 6f 75 74 2c 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69  out," */\n"); li
228a0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70  neno++;.  }.  tp
228b0 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
228c0 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
228d0 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
228e0 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
228f0 65 63 75 74 69 6f 6e 20 64 75 72 69 6e 67 20 65  ecution during e
22900 61 63 68 20 52 45 44 55 43 45 20 61 63 74 69 6f  ach REDUCE actio
22910 6e 20 2a 2f 0a 20 20 69 20 3d 20 30 3b 0a 20 20  n */.  i = 0;.  
22920 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
22930 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
22940 78 74 29 7b 0a 20 20 20 20 69 20 2b 3d 20 74 72  xt){.    i += tr
22950 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28 6c 65 6d  anslate_code(lem
22960 70 2c 20 72 70 29 3b 0a 20 20 7d 0a 20 20 69 66  p, rp);.  }.  if
22970 28 20 69 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ( i ){.    fprin
22980 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20  tf(out,"        
22990 59 59 4d 49 4e 4f 52 54 59 50 45 20 79 79 6c 68  YYMINORTYPE yylh
229a0 73 6d 69 6e 6f 72 3b 5c 6e 22 29 3b 20 6c 69 6e  sminor;\n"); lin
229b0 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  eno++;.  }.  /* 
229c0 46 69 72 73 74 20 6f 75 74 70 75 74 20 72 75 6c  First output rul
229d0 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  es other than th
229e0 65 20 64 65 66 61 75 6c 74 3a 20 72 75 6c 65 20  e default: rule 
229f0 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
22a00 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
22a10 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 73 74  p->next){.    st
22a20 72 75 63 74 20 72 75 6c 65 20 2a 72 70 32 3b 20  ruct rule *rp2; 
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22a40 20 4f 74 68 65 72 20 72 75 6c 65 73 20 77 69 74   Other rules wit
22a50 68 20 74 68 65 20 73 61 6d 65 20 61 63 74 69 6f  h the same actio
22a60 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 70 2d  n */.    if( rp-
22a70 3e 63 6f 64 65 45 6d 69 74 74 65 64 20 29 20 63  >codeEmitted ) c
22a80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
22a90 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 29 7b 0a 20   rp->noCode ){. 
22aa0 20 20 20 20 20 2f 2a 20 4e 6f 20 43 20 63 6f 64       /* No C cod
22ab0 65 20 61 63 74 69 6f 6e 73 2c 20 73 6f 20 74 68  e actions, so th
22ac0 69 73 20 77 69 6c 6c 20 62 65 20 70 61 72 74 20  is will be part 
22ad0 6f 66 20 74 68 65 20 22 64 65 66 61 75 6c 74 3a  of the "default:
22ae0 22 20 72 75 6c 65 20 2a 2f 0a 20 20 20 20 20 20  " rule */.      
22af0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
22b00 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
22b10 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a 20  "      case %d: 
22b20 2f 2a 20 22 2c 20 72 70 2d 3e 69 52 75 6c 65 29  /* ", rp->iRule)
22b30 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54  ;.    writeRuleT
22b40 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20  ext(out, rp);.  
22b50 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
22b60 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b   */\n"); lineno+
22b70 2b 3b 0a 20 20 20 20 66 6f 72 28 72 70 32 3d 72  +;.    for(rp2=r
22b80 70 2d 3e 6e 65 78 74 3b 20 72 70 32 3b 20 72 70  p->next; rp2; rp
22b90 32 3d 72 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20  2=rp2->next){.  
22ba0 20 20 20 20 69 66 28 20 72 70 32 2d 3e 63 6f 64      if( rp2->cod
22bb0 65 3d 3d 72 70 2d 3e 63 6f 64 65 20 26 26 20 72  e==rp->code && r
22bc0 70 32 2d 3e 63 6f 64 65 50 72 65 66 69 78 3d 3d  p2->codePrefix==
22bd0 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 0a 20  rp->codePrefix. 
22be0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 72              && r
22bf0 70 32 2d 3e 63 6f 64 65 53 75 66 66 69 78 3d 3d  p2->codeSuffix==
22c00 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78 20 29  rp->codeSuffix )
22c10 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
22c20 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73  f(out,"      cas
22c30 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70 32 2d  e %d: /* ", rp2-
22c40 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20 20  >iRule);.       
22c50 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f   writeRuleText(o
22c60 75 74 2c 20 72 70 32 29 3b 0a 20 20 20 20 20 20  ut, rp2);.      
22c70 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
22c80 2a 2f 20 79 79 74 65 73 74 63 61 73 65 28 79 79  */ yytestcase(yy
22c90 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c  ruleno==%d);\n",
22ca0 20 72 70 32 2d 3e 69 52 75 6c 65 29 3b 20 6c 69   rp2->iRule); li
22cb0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
22cc0 72 70 32 2d 3e 63 6f 64 65 45 6d 69 74 74 65 64  rp2->codeEmitted
22cd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
22ce0 20 20 7d 0a 20 20 20 20 65 6d 69 74 5f 63 6f 64    }.    emit_cod
22cf0 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c  e(out,rp,lemp,&l
22d00 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69  ineno);.    fpri
22d10 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20  ntf(out,"       
22d20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
22d30 65 6e 6f 2b 2b 3b 0a 20 20 20 20 72 70 2d 3e 63  eno++;.    rp->c
22d40 6f 64 65 45 6d 69 74 74 65 64 20 3d 20 31 3b 0a  odeEmitted = 1;.
22d50 20 20 7d 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79    }.  /* Finally
22d60 2c 20 6f 75 74 70 75 74 20 74 68 65 20 64 65 66  , output the def
22d70 61 75 6c 74 3a 20 72 75 6c 65 2e 20 20 57 65 20  ault: rule.  We 
22d80 63 68 6f 6f 73 65 20 61 73 20 74 68 65 20 64 65  choose as the de
22d90 66 61 75 6c 74 3a 20 61 6c 6c 0a 20 20 2a 2a 20  fault: all.  ** 
22da0 65 6d 70 74 79 20 61 63 74 69 6f 6e 73 2e 20 2a  empty actions. *
22db0 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
22dc0 22 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 5c  "      default:\
22dd0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
22de0 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
22df0 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
22e00 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70  ext){.    if( rp
22e10 2d 3e 63 6f 64 65 45 6d 69 74 74 65 64 20 29 20  ->codeEmitted ) 
22e20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
22e30 73 65 72 74 28 20 72 70 2d 3e 6e 6f 43 6f 64 65  sert( rp->noCode
22e40 20 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   );.    fprintf(
22e50 6f 75 74 2c 22 20 20 20 20 20 20 2f 2a 20 28 25  out,"      /* (%
22e60 64 29 20 22 2c 20 72 70 2d 3e 69 52 75 6c 65 29  d) ", rp->iRule)
22e70 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54  ;.    writeRuleT
22e80 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20  ext(out, rp);.  
22e90 20 20 69 66 28 20 72 70 2d 3e 64 6f 65 73 52 65    if( rp->doesRe
22ea0 64 75 63 65 20 29 7b 0a 20 20 20 20 20 20 66 70  duce ){.      fp
22eb0 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f 20  rintf(out, " */ 
22ec0 79 79 74 65 73 74 63 61 73 65 28 79 79 72 75 6c  yytestcase(yyrul
22ed0 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72 70  eno==%d);\n", rp
22ee0 2d 3e 69 52 75 6c 65 29 3b 20 6c 69 6e 65 6e 6f  ->iRule); lineno
22ef0 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
22f00 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
22f10 2c 20 22 20 28 4f 50 54 49 4d 49 5a 45 44 20 4f  , " (OPTIMIZED O
22f20 55 54 29 20 2a 2f 20 61 73 73 65 72 74 28 79 79  UT) */ assert(yy
22f30 72 75 6c 65 6e 6f 21 3d 25 64 29 3b 5c 6e 22 2c  ruleno!=%d);\n",
22f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
22f50 70 2d 3e 69 52 75 6c 65 29 3b 20 6c 69 6e 65 6e  p->iRule); linen
22f60 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  o++;.    }.  }. 
22f70 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
22f80 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29        break;\n")
22f90 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70  ; lineno++;.  tp
22fa0 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
22fb0 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
22fc0 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
22fd0 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
22fe0 65 63 75 74 65 73 20 69 66 20 61 20 70 61 72 73  ecutes if a pars
22ff0 65 20 66 61 69 6c 73 20 2a 2f 0a 20 20 74 70 6c  e fails */.  tpl
23000 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
23010 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65 2c 26  ,lemp->failure,&
23020 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f  lineno);.  tplt_
23030 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
23040 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
23050 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
23060 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
23070 74 65 73 20 77 68 65 6e 20 61 20 73 79 6e 74 61  tes when a synta
23080 78 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a  x error occurs *
23090 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  /.  tplt_print(o
230a0 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 72  ut,lemp,lemp->er
230b0 72 6f 72 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  ror,&lineno);.  
230c0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
230d0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
230e0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
230f0 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
23100 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 74 68  executes when th
23110 65 20 70 61 72 73 65 72 20 61 63 63 65 70 74 73  e parser accepts
23120 20 69 74 73 20 69 6e 70 75 74 20 2a 2f 0a 20 20   its input */.  
23130 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
23140 65 6d 70 2c 6c 65 6d 70 2d 3e 61 63 63 65 70 74  emp,lemp->accept
23150 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c  ,&lineno);.  tpl
23160 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
23170 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
23180 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20  );..  /* Append 
23190 61 6e 79 20 61 64 64 69 74 69 6f 6e 20 63 6f 64  any addition cod
231a0 65 20 74 68 65 20 75 73 65 72 20 64 65 73 69 72  e the user desir
231b0 65 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  es */.  tplt_pri
231c0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
231d0 2d 3e 65 78 74 72 61 63 6f 64 65 2c 26 6c 69 6e  ->extracode,&lin
231e0 65 6e 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73 65 28  eno);..  fclose(
231f0 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75  in);.  fclose(ou
23200 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
23210 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  ./* Generate a h
23220 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20 74  eader file for t
23230 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69  he parser */.voi
23240 64 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 73  d ReportHeader(s
23250 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
23260 70 29 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74  p).{.  FILE *out
23270 2c 20 2a 69 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  , *in;.  const c
23280 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 63  har *prefix;.  c
23290 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a  har line[LINESIZ
232a0 45 5d 3b 0a 20 20 63 68 61 72 20 70 61 74 74 65  E];.  char patte
232b0 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20  rn[LINESIZE];.  
232c0 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6c 65  int i;..  if( le
232d0 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20  mp->tokenprefix 
232e0 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d  ) prefix = lemp-
232f0 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20  >tokenprefix;.  
23300 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
23310 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d          prefix =
23320 20 22 22 3b 0a 20 20 69 6e 20 3d 20 66 69 6c 65   "";.  in = file
23330 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c  _open(lemp,".h",
23340 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 20  "rb");.  if( in 
23350 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 43  ){.    int nextC
23360 68 61 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  har;.    for(i=1
23370 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; i<lemp->ntermi
23380 6e 61 6c 20 26 26 20 66 67 65 74 73 28 6c 69 6e  nal && fgets(lin
23390 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 3b 20  e,LINESIZE,in); 
233a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6c 65 6d 6f  i++){.      lemo
233b0 6e 5f 73 70 72 69 6e 74 66 28 70 61 74 74 65 72  n_sprintf(patter
233c0 6e 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33  n,"#define %s%-3
233d0 30 73 20 25 33 64 5c 6e 22 2c 0a 20 20 20 20 20  0s %3d\n",.     
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
233f0 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62  refix,lemp->symb
23400 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b  ols[i]->name,i);
23410 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
23420 70 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e 29 20  p(line,pattern) 
23430 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
23440 20 20 20 6e 65 78 74 43 68 61 72 20 3d 20 66 67     nextChar = fg
23450 65 74 63 28 69 6e 29 3b 0a 20 20 20 20 66 63 6c  etc(in);.    fcl
23460 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 69 66 28  ose(in);.    if(
23470 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69   i==lemp->ntermi
23480 6e 61 6c 20 26 26 20 6e 65 78 74 43 68 61 72 3d  nal && nextChar=
23490 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 2f 2a  =EOF ){.      /*
234a0 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20 74 68   No change in th
234b0 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74 20 72  e file.  Don't r
234c0 65 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a 20 20  ewrite it. */.  
234d0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
234e0 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20 66 69  }.  }.  out = fi
234f0 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68  le_open(lemp,".h
23500 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f  ","wb");.  if( o
23510 75 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ut ){.    for(i=
23520 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  1; i<lemp->nterm
23530 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  inal; i++){.    
23540 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
23550 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25  define %s%-30s %
23560 33 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d  3d\n",prefix,lem
23570 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
23580 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a 20 20  ame,i);.    }.  
23590 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
235a0 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
235b0 2f 2a 20 52 65 64 75 63 65 20 74 68 65 20 73 69  /* Reduce the si
235c0 7a 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e  ze of the action
235d0 20 74 61 62 6c 65 73 2c 20 69 66 20 70 6f 73 73   tables, if poss
235e0 69 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e 67 20  ible, by making 
235f0 75 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61 75 6c  use.** of defaul
23600 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  ts..**.** In thi
23610 73 20 76 65 72 73 69 6f 6e 2c 20 77 65 20 74 61  s version, we ta
23620 6b 65 20 74 68 65 20 6d 6f 73 74 20 66 72 65 71  ke the most freq
23630 75 65 6e 74 20 52 45 44 55 43 45 20 61 63 74 69  uent REDUCE acti
23640 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69  on and make.** i
23650 74 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  t the default.  
23660 45 78 63 65 70 74 2c 20 74 68 65 72 65 20 69 73  Except, there is
23670 20 6e 6f 20 64 65 66 61 75 6c 74 20 69 66 20 74   no default if t
23680 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65  he wildcard toke
23690 6e 0a 2a 2a 20 69 73 20 61 20 70 6f 73 73 69 62  n.** is a possib
236a0 6c 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 2e 0a 2a  le look-ahead..*
236b0 2f 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73 54  /.void CompressT
236c0 61 62 6c 65 73 28 73 74 72 75 63 74 20 6c 65 6d  ables(struct lem
236d0 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74  on *lemp).{.  st
236e0 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
236f0 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
23700 20 2a 61 70 2c 20 2a 61 70 32 2c 20 2a 6e 65 78   *ap, *ap2, *nex
23710 74 61 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75  tap;.  struct ru
23720 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c 20 2a 72  le *rp, *rp2, *r
23730 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e 62 65 73  best;.  int nbes
23740 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  t, n;.  int i;. 
23750 20 69 6e 74 20 75 73 65 73 57 69 6c 64 63 61 72   int usesWildcar
23760 64 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  d;..  for(i=0; i
23770 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
23780 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
23790 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
237a0 20 20 20 20 6e 62 65 73 74 20 3d 20 30 3b 0a 20      nbest = 0;. 
237b0 20 20 20 72 62 65 73 74 20 3d 20 30 3b 0a 20 20     rbest = 0;.  
237c0 20 20 75 73 65 73 57 69 6c 64 63 61 72 64 20 3d    usesWildcard =
237d0 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28 61 70 3d   0;..    for(ap=
237e0 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
237f0 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
23800 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 53   if( ap->type==S
23810 48 49 46 54 20 26 26 20 61 70 2d 3e 73 70 3d 3d  HIFT && ap->sp==
23820 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 20 29  lemp->wildcard )
23830 7b 0a 20 20 20 20 20 20 20 20 75 73 65 73 57 69  {.        usesWi
23840 6c 64 63 61 72 64 20 3d 20 31 3b 0a 20 20 20 20  ldcard = 1;.    
23850 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 70    }.      if( ap
23860 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20 29  ->type!=REDUCE )
23870 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
23880 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a   rp = ap->x.rp;.
23890 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68        if( rp->lh
238a0 73 53 74 61 72 74 20 29 20 63 6f 6e 74 69 6e 75  sStart ) continu
238b0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 3d  e;.      if( rp=
238c0 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75  =rbest ) continu
238d0 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a  e;.      n = 1;.
238e0 20 20 20 20 20 20 66 6f 72 28 61 70 32 3d 61 70        for(ap2=ap
238f0 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20 61 70 32  ->next; ap2; ap2
23900 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =ap2->next){.   
23910 20 20 20 20 20 69 66 28 20 61 70 32 2d 3e 74 79       if( ap2->ty
23920 70 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e  pe!=REDUCE ) con
23930 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 72  tinue;.        r
23940 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72 70 3b 0a  p2 = ap2->x.rp;.
23950 20 20 20 20 20 20 20 20 69 66 28 20 72 70 32 3d          if( rp2=
23960 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75  =rbest ) continu
23970 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  e;.        if( r
23980 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a 20 20  p2==rp ) n++;.  
23990 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
239a0 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20 20 20 20  n>nbest ){.     
239b0 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b 0a 20 20     nbest = n;.  
239c0 20 20 20 20 20 20 72 62 65 73 74 20 3d 20 72 70        rbest = rp
239d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
239e0 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d  .    /* Do not m
239f0 61 6b 65 20 61 20 64 65 66 61 75 6c 74 20 69 66  ake a default if
23a00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
23a10 75 6c 65 73 20 74 6f 20 64 65 66 61 75 6c 74 0a  ules to default.
23a20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 74      ** is not at
23a30 20 6c 65 61 73 74 20 31 20 6f 72 20 69 66 20 74   least 1 or if t
23a40 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65  he wildcard toke
23a50 6e 20 69 73 20 61 20 70 6f 73 73 69 62 6c 65 0a  n is a possible.
23a60 20 20 20 20 2a 2a 20 6c 6f 6f 6b 61 68 65 61 64      ** lookahead
23a70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
23a80 20 6e 62 65 73 74 3c 31 20 7c 7c 20 75 73 65 73   nbest<1 || uses
23a90 57 69 6c 64 63 61 72 64 20 29 20 63 6f 6e 74 69  Wildcard ) conti
23aa0 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 6f  nue;...    /* Co
23ab0 6d 62 69 6e 65 20 6d 61 74 63 68 69 6e 67 20 52  mbine matching R
23ac0 45 44 55 43 45 20 61 63 74 69 6f 6e 73 20 69 6e  EDUCE actions in
23ad0 74 6f 20 61 20 73 69 6e 67 6c 65 20 64 65 66 61  to a single defa
23ae0 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 61  ult */.    for(a
23af0 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
23b00 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
23b10 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
23b20 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78  =REDUCE && ap->x
23b30 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 62 72 65  .rp==rbest ) bre
23b40 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ak;.    }.    as
23b50 73 65 72 74 28 20 61 70 20 29 3b 0a 20 20 20 20  sert( ap );.    
23b60 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ap->sp = Symbol_
23b70 6e 65 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29  new("{default}")
23b80 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 61 70 2d  ;.    for(ap=ap-
23b90 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70 3d 61 70  >next; ap; ap=ap
23ba0 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
23bb0 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44  f( ap->type==RED
23bc0 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d  UCE && ap->x.rp=
23bd0 3d 72 62 65 73 74 20 29 20 61 70 2d 3e 74 79 70  =rbest ) ap->typ
23be0 65 20 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a 20 20  e = NOT_USED;.  
23bf0 20 20 7d 0a 20 20 20 20 73 74 70 2d 3e 61 70 20    }.    stp->ap 
23c00 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74  = Action_sort(st
23c10 70 2d 3e 61 70 29 3b 0a 0a 20 20 20 20 66 6f 72  p->ap);..    for
23c20 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
23c30 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
23c40 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
23c50 65 3d 3d 53 48 49 46 54 20 29 20 62 72 65 61 6b  e==SHIFT ) break
23c60 3b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  ;.      if( ap->
23c70 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20  type==REDUCE && 
23c80 61 70 2d 3e 78 2e 72 70 21 3d 72 62 65 73 74 20  ap->x.rp!=rbest 
23c90 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
23ca0 20 20 20 69 66 28 20 61 70 3d 3d 30 20 29 7b 0a     if( ap==0 ){.
23cb0 20 20 20 20 20 20 73 74 70 2d 3e 61 75 74 6f 52        stp->autoR
23cc0 65 64 75 63 65 20 3d 20 31 3b 0a 20 20 20 20 20  educe = 1;.     
23cd0 20 73 74 70 2d 3e 70 44 66 6c 74 52 65 64 75 63   stp->pDfltReduc
23ce0 65 20 3d 20 72 62 65 73 74 3b 0a 20 20 20 20 7d  e = rbest;.    }
23cf0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
23d00 61 20 73 65 63 6f 6e 64 20 70 61 73 73 20 6f 76  a second pass ov
23d10 65 72 20 61 6c 6c 20 73 74 61 74 65 73 20 61 6e  er all states an
23d20 64 20 61 63 74 69 6f 6e 73 2e 20 20 43 6f 6e 76  d actions.  Conv
23d30 65 72 74 0a 20 20 2a 2a 20 65 76 65 72 79 20 61  ert.  ** every a
23d40 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 61 20  ction that is a 
23d50 53 48 49 46 54 20 74 6f 20 61 6e 20 61 75 74 6f  SHIFT to an auto
23d60 52 65 64 75 63 65 20 73 74 61 74 65 20 69 6e 74  Reduce state int
23d70 6f 0a 20 20 2a 2a 20 61 20 53 48 49 46 54 52 45  o.  ** a SHIFTRE
23d80 44 55 43 45 20 61 63 74 69 6f 6e 2e 0a 20 20 2a  DUCE action..  *
23d90 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
23da0 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
23db0 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
23dc0 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
23dd0 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
23de0 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
23df0 74 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  t){.      struct
23e00 20 73 74 61 74 65 20 2a 70 4e 65 78 74 53 74 61   state *pNextSta
23e10 74 65 3b 0a 20 20 20 20 20 20 69 66 28 20 61 70  te;.      if( ap
23e20 2d 3e 74 79 70 65 21 3d 53 48 49 46 54 20 29 20  ->type!=SHIFT ) 
23e30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23e40 70 4e 65 78 74 53 74 61 74 65 20 3d 20 61 70 2d  pNextState = ap-
23e50 3e 78 2e 73 74 70 3b 0a 20 20 20 20 20 20 69 66  >x.stp;.      if
23e60 28 20 70 4e 65 78 74 53 74 61 74 65 2d 3e 61 75  ( pNextState->au
23e70 74 6f 52 65 64 75 63 65 20 26 26 20 70 4e 65 78  toReduce && pNex
23e80 74 53 74 61 74 65 2d 3e 70 44 66 6c 74 52 65 64  tState->pDfltRed
23e90 75 63 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  uce!=0 ){.      
23ea0 20 20 61 70 2d 3e 74 79 70 65 20 3d 20 53 48 49    ap->type = SHI
23eb0 46 54 52 45 44 55 43 45 3b 0a 20 20 20 20 20 20  FTREDUCE;.      
23ec0 20 20 61 70 2d 3e 78 2e 72 70 20 3d 20 70 4e 65    ap->x.rp = pNe
23ed0 78 74 53 74 61 74 65 2d 3e 70 44 66 6c 74 52 65  xtState->pDfltRe
23ee0 64 75 63 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  duce;.      }.  
23ef0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
23f00 20 61 20 53 48 49 46 54 52 45 44 55 43 45 20 61   a SHIFTREDUCE a
23f10 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 73 20  ction specifies 
23f20 61 20 72 75 6c 65 20 74 68 61 74 20 68 61 73 20  a rule that has 
23f30 61 20 73 69 6e 67 6c 65 20 52 48 53 20 74 65 72  a single RHS ter
23f40 6d 0a 20 20 2a 2a 20 28 6d 65 61 6e 69 6e 67 20  m.  ** (meaning 
23f50 74 68 61 74 20 74 68 65 20 53 48 49 46 54 52 45  that the SHIFTRE
23f60 44 55 43 45 20 77 69 6c 6c 20 6c 61 6e 64 20 62  DUCE will land b
23f70 61 63 6b 20 69 6e 20 74 68 65 20 73 74 61 74 65  ack in the state
23f80 20 77 68 65 72 65 20 69 74 0a 20 20 2a 2a 20 73   where it.  ** s
23f90 74 61 72 74 65 64 29 20 61 6e 64 20 69 66 20 74  tarted) and if t
23fa0 68 65 72 65 20 69 73 20 6e 6f 20 43 2d 63 6f 64  here is no C-cod
23fb0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
23fc0 68 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74  h the reduce act
23fd0 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77  ion,.  ** then w
23fe0 65 20 63 61 6e 20 67 6f 20 61 68 65 61 64 20 61  e can go ahead a
23ff0 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20 61  nd convert the a
24000 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
24010 73 61 6d 65 20 61 73 20 74 68 65 0a 20 20 2a 2a  same as the.  **
24020 20 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   action for the 
24030 52 48 53 20 6f 66 20 74 68 65 20 72 75 6c 65 2e  RHS of the rule.
24040 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
24050 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
24060 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
24070 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
24080 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  ;.    for(ap=stp
24090 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 6e 65 78  ->ap; ap; ap=nex
240a0 74 61 70 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  tap){.      next
240b0 61 70 20 3d 20 61 70 2d 3e 6e 65 78 74 3b 0a 20  ap = ap->next;. 
240c0 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
240d0 65 21 3d 53 48 49 46 54 52 45 44 55 43 45 20 29  e!=SHIFTREDUCE )
240e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
240f0 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a   rp = ap->x.rp;.
24100 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6e 6f        if( rp->no
24110 43 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Code==0 ) contin
24120 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70  ue;.      if( rp
24130 2d 3e 6e 72 68 73 21 3d 31 20 29 20 63 6f 6e 74  ->nrhs!=1 ) cont
24140 69 6e 75 65 3b 0a 23 69 66 20 31 0a 20 20 20 20  inue;.#if 1.    
24150 20 20 2f 2a 20 4f 6e 6c 79 20 61 70 70 6c 79 20    /* Only apply 
24160 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
24170 6e 20 74 6f 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  n to non-termina
24180 6c 73 2e 20 20 49 74 20 77 6f 75 6c 64 20 62 65  ls.  It would be
24190 20 4f 4b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20   OK to.      ** 
241a0 61 70 70 6c 79 20 69 74 20 74 6f 20 74 65 72 6d  apply it to term
241b0 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 74 6f 6f  inal symbols too
241c0 2c 20 62 75 74 20 74 68 61 74 20 6d 61 6b 65 73  , but that makes
241d0 20 74 68 65 20 70 61 72 73 65 72 20 74 61 62 6c   the parser tabl
241e0 65 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67  es.      ** larg
241f0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  er. */.      if(
24200 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c   ap->sp->index<l
24210 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29  emp->nterminal )
24220 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6e 64 69   continue;.#endi
24230 66 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65  f.      /* If we
24240 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
24250 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  t, it means the 
24260 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
24270 20 62 65 20 61 70 70 6c 69 65 64 20 2a 2f 0a 20   be applied */. 
24280 20 20 20 20 20 6e 65 78 74 61 70 20 3d 20 61 70       nextap = ap
24290 3b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 32 3d  ;.      for(ap2=
242a0 73 74 70 2d 3e 61 70 3b 20 61 70 32 20 26 26 20  stp->ap; ap2 && 
242b0 28 61 70 32 3d 3d 61 70 20 7c 7c 20 61 70 32 2d  (ap2==ap || ap2-
242c0 3e 73 70 21 3d 72 70 2d 3e 6c 68 73 29 3b 20 61  >sp!=rp->lhs); a
242d0 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 7d 0a  p2=ap2->next){}.
242e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70        assert( ap
242f0 32 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 70  2!=0 );.      ap
24300 2d 3e 73 70 4f 70 74 20 3d 20 61 70 32 2d 3e 73  ->spOpt = ap2->s
24310 70 3b 0a 20 20 20 20 20 20 61 70 2d 3e 74 79 70  p;.      ap->typ
24320 65 20 3d 20 61 70 32 2d 3e 74 79 70 65 3b 0a 20  e = ap2->type;. 
24330 20 20 20 20 20 61 70 2d 3e 78 20 3d 20 61 70 32       ap->x = ap2
24340 2d 3e 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ->x;.    }.  }.}
24350 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  .../*.** Compare
24360 20 74 77 6f 20 73 74 61 74 65 73 20 66 6f 72 20   two states for 
24370 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
24380 2e 20 20 54 68 65 20 73 6d 61 6c 6c 65 72 20 73  .  The smaller s
24390 74 61 74 65 20 69 73 20 74 68 65 0a 2a 2a 20 6f  tate is the.** o
243a0 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74  ne with the most
243b0 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63   non-terminal ac
243c0 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 79 20  tions.  If they 
243d0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
243e0 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f 6e 2d 74  mber.** of non-t
243f0 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2c  erminal actions,
24400 20 74 68 65 6e 20 74 68 65 20 73 6d 61 6c 6c 65   then the smalle
24410 72 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  r is the one wit
24420 68 20 74 68 65 20 6d 6f 73 74 0a 2a 2a 20 74 6f  h the most.** to
24430 6b 65 6e 20 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  ken actions..*/.
24440 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 65  static int state
24450 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 28 63 6f  ResortCompare(co
24460 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e  nst void *a, con
24470 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 63  st void *b){.  c
24480 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74  onst struct stat
24490 65 20 2a 70 41 20 3d 20 2a 28 63 6f 6e 73 74 20  e *pA = *(const 
244a0 73 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29 61  struct state**)a
244b0 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  ;.  const struct
244c0 20 73 74 61 74 65 20 2a 70 42 20 3d 20 2a 28 63   state *pB = *(c
244d0 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74  onst struct stat
244e0 65 2a 2a 29 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a  e**)b;.  int n;.
244f0 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e 74 41 63  .  n = pB->nNtAc
24500 74 20 2d 20 70 41 2d 3e 6e 4e 74 41 63 74 3b 0a  t - pA->nNtAct;.
24510 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
24520 20 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b 6e 41 63    n = pB->nTknAc
24530 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41 63 74 3b  t - pA->nTknAct;
24540 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  .    if( n==0 ){
24550 0a 20 20 20 20 20 20 6e 20 3d 20 70 42 2d 3e 73  .      n = pB->s
24560 74 61 74 65 6e 75 6d 20 2d 20 70 41 2d 3e 73 74  tatenum - pA->st
24570 61 74 65 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20  atenum;.    }.  
24580 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 21 3d 30  }.  assert( n!=0
24590 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a   );.  return n;.
245a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 75 6d 62  }.../*.** Renumb
245b0 65 72 20 61 6e 64 20 72 65 73 6f 72 74 20 73 74  er and resort st
245c0 61 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61  ates so that sta
245d0 74 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63  tes with fewer c
245e0 68 6f 69 63 65 73 0a 2a 2a 20 6f 63 63 75 72 20  hoices.** occur 
245f0 61 74 20 74 68 65 20 65 6e 64 2e 20 20 45 78 63  at the end.  Exc
24600 65 70 74 2c 20 6b 65 65 70 20 73 74 61 74 65 20  ept, keep state 
24610 30 20 61 73 20 74 68 65 20 66 69 72 73 74 20 73  0 as the first s
24620 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 52 65  tate..*/.void Re
24630 73 6f 72 74 53 74 61 74 65 73 28 73 74 72 75 63  sortStates(struc
24640 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
24650 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
24660 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
24670 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
24680 61 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ap;..  for(i=0; 
24690 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
246a0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
246b0 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
246c0 0a 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63  .    stp->nTknAc
246d0 74 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 20  t = stp->nNtAct 
246e0 3d 20 30 3b 0a 20 20 20 20 73 74 70 2d 3e 69 44  = 0;.    stp->iD
246f0 66 6c 74 52 65 64 75 63 65 20 3d 20 2d 31 3b 20  fltReduce = -1; 
24700 2f 2a 20 49 6e 69 74 20 64 66 6c 74 20 61 63 74  /* Init dflt act
24710 69 6f 6e 20 74 6f 20 22 73 79 6e 74 61 78 20 65  ion to "syntax e
24720 72 72 6f 72 22 20 2a 2f 0a 20 20 20 20 73 74 70  rror" */.    stp
24730 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f  ->iTknOfst = NO_
24740 4f 46 46 53 45 54 3b 0a 20 20 20 20 73 74 70 2d  OFFSET;.    stp-
24750 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46  >iNtOfst = NO_OF
24760 46 53 45 54 3b 0a 20 20 20 20 66 6f 72 28 61 70  FSET;.    for(ap
24770 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
24780 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
24790 20 20 69 6e 74 20 69 41 63 74 69 6f 6e 20 3d 20    int iAction = 
247a0 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c  compute_action(l
247b0 65 6d 70 2c 61 70 29 3b 0a 20 20 20 20 20 20 69  emp,ap);.      i
247c0 66 28 20 69 41 63 74 69 6f 6e 3e 3d 30 20 29 7b  f( iAction>=0 ){
247d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d  .        if( ap-
247e0 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d  >sp->index<lemp-
247f0 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20  >nterminal ){.  
24800 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 54 6b          stp->nTk
24810 6e 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nAct++;.        
24820 7d 65 6c 73 65 20 69 66 28 20 61 70 2d 3e 73 70  }else if( ap->sp
24830 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73  ->index<lemp->ns
24840 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  ymbol ){.       
24850 20 20 20 73 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b     stp->nNtAct++
24860 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
24870 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
24880 74 28 20 73 74 70 2d 3e 61 75 74 6f 52 65 64 75  t( stp->autoRedu
24890 63 65 3d 3d 30 20 7c 7c 20 73 74 70 2d 3e 70 44  ce==0 || stp->pD
248a0 66 6c 74 52 65 64 75 63 65 3d 3d 61 70 2d 3e 78  fltReduce==ap->x
248b0 2e 72 70 20 29 3b 0a 20 20 20 20 20 20 20 20 20  .rp );.         
248c0 20 73 74 70 2d 3e 69 44 66 6c 74 52 65 64 75 63   stp->iDfltReduc
248d0 65 20 3d 20 69 41 63 74 69 6f 6e 3b 0a 20 20 20  e = iAction;.   
248e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
248f0 20 20 20 7d 0a 20 20 7d 0a 20 20 71 73 6f 72 74     }.  }.  qsort
24900 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 31  (&lemp->sorted[1
24910 5d 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2d  ], lemp->nstate-
24920 31 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 70 2d 3e  1, sizeof(lemp->
24930 73 6f 72 74 65 64 5b 30 5d 29 2c 0a 20 20 20 20  sorted[0]),.    
24940 20 20 20 20 73 74 61 74 65 52 65 73 6f 72 74 43      stateResortC
24950 6f 6d 70 61 72 65 29 3b 0a 20 20 66 6f 72 28 69  ompare);.  for(i
24960 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
24970 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65  te; i++){.    le
24980 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 73  mp->sorted[i]->s
24990 74 61 74 65 6e 75 6d 20 3d 20 69 3b 0a 20 20 7d  tatenum = i;.  }
249a0 0a 20 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65  .  lemp->nxstate
249b0 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   = lemp->nstate;
249c0 0a 20 20 77 68 69 6c 65 28 20 6c 65 6d 70 2d 3e  .  while( lemp->
249d0 6e 78 73 74 61 74 65 3e 31 20 26 26 20 6c 65 6d  nxstate>1 && lem
249e0 70 2d 3e 73 6f 72 74 65 64 5b 6c 65 6d 70 2d 3e  p->sorted[lemp->
249f0 6e 78 73 74 61 74 65 2d 31 5d 2d 3e 61 75 74 6f  nxstate-1]->auto
24a00 52 65 64 75 63 65 20 29 7b 0a 20 20 20 20 6c 65  Reduce ){.    le
24a10 6d 70 2d 3e 6e 78 73 74 61 74 65 2d 2d 3b 0a 20  mp->nxstate--;. 
24a20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   }.}.../********
24a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
24a40 68 65 20 66 69 6c 65 20 22 73 65 74 2e 63 22 20  he file "set.c" 
24a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a70 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ****/./*.** Set 
24a80 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 20 72 6f 75  manipulation rou
24a90 74 69 6e 65 73 20 66 6f 72 20 74 68 65 20 4c 45  tines for the LE
24aa0 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
24ab0 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ator..*/..static
24ac0 20 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b 0a 0a   int size = 0;..
24ad0 2f 2a 20 53 65 74 20 74 68 65 20 73 65 74 20 73  /* Set the set s
24ae0 69 7a 65 20 2a 2f 0a 76 6f 69 64 20 53 65 74 53  ize */.void SetS
24af0 69 7a 65 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73  ize(int n).{.  s
24b00 69 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a  ize = n+1;.}../*
24b10 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
24b20 73 65 74 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74  set */.char *Set
24b30 4e 65 77 28 76 6f 69 64 29 7b 0a 20 20 63 68 61  New(void){.  cha
24b40 72 20 2a 73 3b 0a 20 20 73 20 3d 20 28 63 68 61  r *s;.  s = (cha
24b50 72 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 2c  r*)calloc( size,
24b60 20 31 29 3b 0a 20 20 69 66 28 20 73 3d 3d 30 20   1);.  if( s==0 
24b70 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f  ){.    extern vo
24b80 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  id memory_error(
24b90 29 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72  );.    memory_er
24ba0 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ror();.  }.  ret
24bb0 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61  urn s;.}../* Dea
24bc0 6c 6c 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f  llocate a set */
24bd0 0a 76 6f 69 64 20 53 65 74 46 72 65 65 28 63 68  .void SetFree(ch
24be0 61 72 20 2a 73 29 0a 7b 0a 20 20 66 72 65 65 28  ar *s).{.  free(
24bf0 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20  s);.}../* Add a 
24c00 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
24c10 68 65 20 73 65 74 2e 20 20 52 65 74 75 72 6e 20  he set.  Return 
24c20 54 52 55 45 20 69 66 20 74 68 65 20 65 6c 65 6d  TRUE if the elem
24c30 65 6e 74 20 77 61 73 20 61 64 64 65 64 0a 2a 2a  ent was added.**
24c40 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 69 74   and FALSE if it
24c50 20 77 61 73 20 61 6c 72 65 61 64 79 20 74 68 65   was already the
24c60 72 65 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 41 64  re. */.int SetAd
24c70 64 28 63 68 61 72 20 2a 73 2c 20 69 6e 74 20 65  d(char *s, int e
24c80 29 0a 7b 0a 20 20 69 6e 74 20 72 76 3b 0a 20 20  ).{.  int rv;.  
24c90 61 73 73 65 72 74 28 20 65 3e 3d 30 20 26 26 20  assert( e>=0 && 
24ca0 65 3c 73 69 7a 65 20 29 3b 0a 20 20 72 76 20 3d  e<size );.  rv =
24cb0 20 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20   s[e];.  s[e] = 
24cc0 31 3b 0a 20 20 72 65 74 75 72 6e 20 21 72 76 3b  1;.  return !rv;
24cd0 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65 76 65 72 79  .}../* Add every
24ce0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 73 32 20 74   element of s2 t
24cf0 6f 20 73 31 2e 20 20 52 65 74 75 72 6e 20 54 52  o s1.  Return TR
24d00 55 45 20 69 66 20 73 31 20 63 68 61 6e 67 65 73  UE if s1 changes
24d10 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f  . */.int SetUnio
24d20 6e 28 63 68 61 72 20 2a 73 31 2c 20 63 68 61 72  n(char *s1, char
24d30 20 2a 73 32 29 0a 7b 0a 20 20 69 6e 74 20 69 2c   *s2).{.  int i,
24d40 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 70 72 6f   progress;.  pro
24d50 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 66 6f 72  gress = 0;.  for
24d60 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
24d70 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 32 5b 69  +){.    if( s2[i
24d80 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
24d90 0a 20 20 20 20 69 66 28 20 73 31 5b 69 5d 3d 3d  .    if( s1[i]==
24da0 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 67 72  0 ){.      progr
24db0 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  ess = 1;.      s
24dc0 31 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  1[i] = 1;.    }.
24dd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 6f    }.  return pro
24de0 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  gress;.}./******
24df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24e00 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
24e10 74 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  table.c" *******
24e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24e30 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c  *****/./*.** All
24e40 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69   code in this fi
24e50 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f  le has been auto
24e60 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61  matically genera
24e70 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70  ted.** from a sp
24e80 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74  ecification in t
24e90 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20  he file.**      
24ea0 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71          "table.q
24eb0 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f  ".** by the asso
24ec0 63 69 61 74 69 76 65 20 61 72 72 61 79 20 63 6f  ciative array co
24ed0 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67  de building prog
24ee0 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20  ram "aagen"..** 
24ef0 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73  Do not edit this
24f00 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c   file!  Instead,
24f10 20 65 64 69 74 20 74 68 65 20 73 70 65 63 69 66   edit the specif
24f20 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c  ication.** file,
24f30 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65   then rerun aage
24f40 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  n..*/./*.** Code
24f50 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
24f60 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45  tables in the LE
24f70 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
24f80 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56 41 54  ator..*/..PRIVAT
24f90 45 20 75 6e 73 69 67 6e 65 64 20 73 74 72 68 61  E unsigned strha
24fa0 73 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 78  sh(const char *x
24fb0 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68  ).{.  unsigned h
24fc0 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a   = 0;.  while( *
24fd0 78 20 29 20 68 20 3d 20 68 2a 31 33 20 2b 20 2a  x ) h = h*13 + *
24fe0 28 78 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e 20  (x++);.  return 
24ff0 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b 73 20 6c  h;.}../* Works l
25000 69 6b 65 20 73 74 72 64 75 70 2c 20 73 6f 72 74  ike strdup, sort
25010 20 6f 66 2e 20 20 53 61 76 65 20 61 20 73 74 72   of.  Save a str
25020 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63 65 64 20  ing in malloced 
25030 6d 65 6d 6f 72 79 2c 20 62 75 74 0a 2a 2a 20 6b  memory, but.** k
25040 65 65 70 20 73 74 72 69 6e 67 73 20 69 6e 20 61  eep strings in a
25050 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20 74   table so that t
25060 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67 20 69  he same string i
25070 73 20 6e 6f 74 20 69 6e 20 6d 6f 72 65 0a 2a 2a  s not in more.**
25080 20 74 68 61 6e 20 6f 6e 65 20 70 6c 61 63 65 2e   than one place.
25090 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
250a0 53 74 72 73 61 66 65 28 63 6f 6e 73 74 20 63 68  Strsafe(const ch
250b0 61 72 20 2a 79 29 0a 7b 0a 20 20 63 6f 6e 73 74  ar *y).{.  const
250c0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72   char *z;.  char
250d0 20 2a 63 70 79 3b 0a 0a 20 20 69 66 28 20 79 3d   *cpy;..  if( y=
250e0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
250f0 20 7a 20 3d 20 53 74 72 73 61 66 65 5f 66 69 6e   z = Strsafe_fin
25100 64 28 79 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  d(y);.  if( z==0
25110 20 26 26 20 28 63 70 79 3d 28 63 68 61 72 20 2a   && (cpy=(char *
25120 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74  )malloc( lemonSt
25130 72 6c 65 6e 28 79 29 2b 31 20 29 29 21 3d 30 20  rlen(y)+1 ))!=0 
25140 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72  ){.    lemon_str
25150 63 70 79 28 63 70 79 2c 79 29 3b 0a 20 20 20 20  cpy(cpy,y);.    
25160 7a 20 3d 20 63 70 79 3b 0a 20 20 20 20 53 74 72  z = cpy;.    Str
25170 73 61 66 65 5f 69 6e 73 65 72 74 28 7a 29 3b 0a  safe_insert(z);.
25180 20 20 7d 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63    }.  MemoryChec
25190 6b 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  k(z);.  return z
251a0 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  ;.}../* There is
251b0 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
251c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
251d0 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63  tructure for eac
251e0 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65  h.** associative
251f0 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
25200 78 31 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73  x1"..*/.struct s
25210 5f 78 31 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65  _x1 {.  int size
25220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25230 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
25240 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73   available slots
25250 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25270 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f  *   Must be a po
25280 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72  wer of 2 greater
25290 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20   than or */.    
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c        /*   equal
252c0 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63   to 1 */.  int c
252d0 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ount;           
252e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
252f0 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20  currently slots 
25300 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75  filled */.  stru
25310 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 74 62 6c  ct s_x1node *tbl
25320 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73  ;  /* The data s
25330 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20  tored here */.  
25340 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
25350 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74  **ht;  /* Hash t
25360 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73  able for lookups
25370 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65   */.};../* There
25380 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
25390 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
253a0 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  re for every dat
253b0 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20  a element.** in 
253c0 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  an associative a
253d0 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 31  rray of type "x1
253e0 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  "..*/.typedef st
253f0 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 7b 0a  ruct s_x1node {.
25400 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 61    const char *da
25410 74 61 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ta;        /* Th
25420 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75  e data */.  stru
25430 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 6e 65 78  ct s_x1node *nex
25440 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  t;   /* Next ent
25450 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
25460 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63   hash */.  struc
25470 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 66 72 6f  t s_x1node **fro
25480 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  m;  /* Previous 
25490 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64 65  link */.} x1node
254a0 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
254b0 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  nly one instance
254c0 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77   of the array, w
254d0 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c  hich is the foll
254e0 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  owing */.static 
254f0 73 74 72 75 63 74 20 73 5f 78 31 20 2a 78 31 61  struct s_x1 *x1a
25500 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  ;../* Allocate a
25510 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65   new associative
25520 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53   array */.void S
25530 74 72 73 61 66 65 5f 69 6e 69 74 28 76 6f 69 64  trsafe_init(void
25540 29 7b 0a 20 20 69 66 28 20 78 31 61 20 29 20 72  ){.  if( x1a ) r
25550 65 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20 28  eturn;.  x1a = (
25560 73 74 72 75 63 74 20 73 5f 78 31 2a 29 6d 61 6c  struct s_x1*)mal
25570 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
25580 63 74 20 73 5f 78 31 29 20 29 3b 0a 20 20 69 66  ct s_x1) );.  if
25590 28 20 78 31 61 20 29 7b 0a 20 20 20 20 78 31 61  ( x1a ){.    x1a
255a0 2d 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  ->size = 1024;. 
255b0 20 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d 20     x1a->count = 
255c0 30 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c 20  0;.    x1a->tbl 
255d0 3d 20 28 78 31 6e 6f 64 65 2a 29 63 61 6c 6c 6f  = (x1node*)callo
255e0 63 28 31 30 32 34 2c 20 73 69 7a 65 6f 66 28 78  c(1024, sizeof(x
255f0 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  1node) + sizeof(
25600 78 31 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69  x1node*));.    i
25610 66 28 20 78 31 61 2d 3e 74 62 6c 3d 3d 30 20 29  f( x1a->tbl==0 )
25620 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 31 61  {.      free(x1a
25630 29 3b 0a 20 20 20 20 20 20 78 31 61 20 3d 20 30  );.      x1a = 0
25640 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25650 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
25660 78 31 61 2d 3e 68 74 20 3d 20 28 78 31 6e 6f 64  x1a->ht = (x1nod
25670 65 2a 2a 29 26 28 78 31 61 2d 3e 74 62 6c 5b 31  e**)&(x1a->tbl[1
25680 30 32 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  024]);.      for
25690 28 69 3d 30 3b 20 69 3c 31 30 32 34 3b 20 69 2b  (i=0; i<1024; i+
256a0 2b 29 20 78 31 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x1a->ht[i] = 
256b0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f  0;.    }.  }.}./
256c0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
256d0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61  ecord into the a
256e0 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52  rray.  Return TR
256f0 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  UE if successful
25700 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20  ..** Prior data 
25710 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
25720 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69  y is NOT overwri
25730 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 72 73  tten */.int Strs
25740 61 66 65 5f 69 6e 73 65 72 74 28 63 6f 6e 73 74  afe_insert(const
25750 20 63 68 61 72 20 2a 64 61 74 61 29 0a 7b 0a 20   char *data).{. 
25760 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75   x1node *np;.  u
25770 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73  nsigned h;.  uns
25780 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66 28  igned ph;..  if(
25790 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x1a==0 ) return
257a0 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61   0;.  ph = strha
257b0 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20  sh(data);.  h = 
257c0 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d  ph & (x1a->size-
257d0 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e  1);.  np = x1a->
257e0 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
257f0 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
25800 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61  rcmp(np->data,da
25810 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ta)==0 ){.      
25820 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65  /* An existing e
25830 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
25840 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e  me key is found.
25850 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   */.      /* Fai
25860 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72  l because overwr
25870 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ite is not allow
25880 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  s. */.      retu
25890 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
258a0 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
258b0 20 7d 0a 20 20 69 66 28 20 78 31 61 2d 3e 63 6f   }.  if( x1a->co
258c0 75 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20 29  unt>=x1a->size )
258d0 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
258e0 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
258f0 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20  able bigger */. 
25900 20 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65     int i,arrSize
25910 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
25920 31 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  1 array;.    arr
25930 61 79 2e 73 69 7a 65 20 3d 20 61 72 72 53 69 7a  ay.size = arrSiz
25940 65 20 3d 20 78 31 61 2d 3e 73 69 7a 65 2a 32 3b  e = x1a->size*2;
25950 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74  .    array.count
25960 20 3d 20 78 31 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x1a->count;. 
25970 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28     array.tbl = (
25980 78 31 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61  x1node*)calloc(a
25990 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78  rrSize, sizeof(x
259a0 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  1node) + sizeof(
259b0 78 31 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69  x1node*));.    i
259c0 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20  f( array.tbl==0 
259d0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
259e0 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c  Fail due to mall
259f0 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20  oc failure */.  
25a00 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 31    array.ht = (x1
25a10 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74  node**)&(array.t
25a20 62 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20  bl[arrSize]);.  
25a30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72    for(i=0; i<arr
25a40 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  Size; i++) array
25a50 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  .ht[i] = 0;.    
25a60 66 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61 2d 3e  for(i=0; i<x1a->
25a70 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  count; i++){.   
25a80 20 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e 70     x1node *oldnp
25a90 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20  , *newnp;.      
25aa0 6f 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74  oldnp = &(x1a->t
25ab0 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20  bl[i]);.      h 
25ac0 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d  = strhash(oldnp-
25ad0 3e 64 61 74 61 29 20 26 20 28 61 72 72 53 69 7a  >data) & (arrSiz
25ae0 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
25af0 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
25b00 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
25b10 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
25b20 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
25b30 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
25b40 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
25b50 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
25b60 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
25b70 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
25b80 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
25b90 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
25ba0 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
25bb0 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
25bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
25bd0 28 78 31 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x1a->tbl);.    
25be0 2a 78 31 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x1a = array;.  
25bf0 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
25c00 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
25c10 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73  h = ph & (x1a->s
25c20 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
25c30 28 78 31 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63  (x1a->tbl[x1a->c
25c40 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
25c50 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
25c60 66 28 20 78 31 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x1a->ht[h] ) 
25c70 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x1a->ht[h]->from
25c80 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
25c90 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 31 61    np->next = x1a
25ca0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e  ->ht[h];.  x1a->
25cb0 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
25cc0 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 31 61 2d 3e  ->from = &(x1a->
25cd0 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
25ce0 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
25cf0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
25d00 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
25d10 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
25d20 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
25d30 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
25d40 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72  .const char *Str
25d50 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20  safe_find(const 
25d60 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 75  char *key).{.  u
25d70 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 78 31 6e  nsigned h;.  x1n
25d80 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20  ode *np;..  if( 
25d90 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x1a==0 ) return 
25da0 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68  0;.  h = strhash
25db0 28 6b 65 79 29 20 26 20 28 78 31 61 2d 3e 73 69  (key) & (x1a->si
25dc0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31  ze-1);.  np = x1
25dd0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
25de0 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
25df0 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61   strcmp(np->data
25e00 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,key)==0 ) break
25e10 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
25e20 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
25e30 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
25e40 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
25e50 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
25e60 68 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f 72 20  he (terminal or 
25e70 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73 79 6d  nonterminal) sym
25e80 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72 65 61  bol "x"..** Crea
25e90 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 20  te a new symbol 
25ea0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
25eb0 69 72 73 74 20 74 69 6d 65 20 22 78 22 20 68 61  irst time "x" ha
25ec0 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a  s been seen..*/.
25ed0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
25ee0 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74 20  ymbol_new(const 
25ef0 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20 73 74 72  char *x).{.  str
25f00 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
25f10 0a 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66  .  sp = Symbol_f
25f20 69 6e 64 28 78 29 3b 0a 20 20 69 66 28 20 73 70  ind(x);.  if( sp
25f30 3d 3d 30 20 29 7b 0a 20 20 20 20 73 70 20 3d 20  ==0 ){.    sp = 
25f40 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
25f50 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f  )calloc(1, sizeo
25f60 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 29  f(struct symbol)
25f70 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68   );.    MemoryCh
25f80 65 63 6b 28 73 70 29 3b 0a 20 20 20 20 73 70 2d  eck(sp);.    sp-
25f90 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61 66 65 28  >name = Strsafe(
25fa0 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79 70 65  x);.    sp->type
25fb0 20 3d 20 49 53 55 50 50 45 52 28 2a 78 29 20 3f   = ISUPPER(*x) ?
25fc0 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54   TERMINAL : NONT
25fd0 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73 70 2d  ERMINAL;.    sp-
25fe0 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73  >rule = 0;.    s
25ff0 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  p->fallback = 0;
26000 0a 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d 20  .    sp->prec = 
26010 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73 73 6f  -1;.    sp->asso
26020 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73 70 2d  c = UNK;.    sp-
26030 3e 66 69 72 73 74 73 65 74 20 3d 20 30 3b 0a 20  >firstset = 0;. 
26040 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20 3d 20     sp->lambda = 
26050 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 20  LEMON_FALSE;.   
26060 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20   sp->destructor 
26070 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73  = 0;.    sp->des
26080 74 4c 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20 20 20  tLineno = 0;.   
26090 20 73 70 2d 3e 64 61 74 61 74 79 70 65 20 3d 20   sp->datatype = 
260a0 30 3b 0a 20 20 20 20 73 70 2d 3e 75 73 65 43 6e  0;.    sp->useCn
260b0 74 20 3d 20 30 3b 0a 20 20 20 20 53 79 6d 62 6f  t = 0;.    Symbo
260c0 6c 5f 69 6e 73 65 72 74 28 73 70 2c 73 70 2d 3e  l_insert(sp,sp->
260d0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 70 2d  name);.  }.  sp-
260e0 3e 75 73 65 43 6e 74 2b 2b 3b 0a 20 20 72 65 74  >useCnt++;.  ret
260f0 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f  urn sp;.}../* Co
26100 6d 70 61 72 65 20 74 77 6f 20 73 79 6d 62 6f 6c  mpare two symbol
26110 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75  s for sorting pu
26120 72 70 6f 73 65 73 2e 20 20 52 65 74 75 72 6e 20  rposes.  Return 
26130 6e 65 67 61 74 69 76 65 2c 0a 2a 2a 20 7a 65 72  negative,.** zer
26140 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
26150 66 20 61 20 69 73 20 6c 65 73 73 20 74 68 65 6e  f a is less then
26160 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
26170 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 62  reater.** than b
26180 2e 0a 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 73 20  ..**.** Symbols 
26190 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
261a0 75 70 70 65 72 20 63 61 73 65 20 6c 65 74 74 65  upper case lette
261b0 72 73 20 28 74 65 72 6d 69 6e 61 6c 73 20 6f 72  rs (terminals or
261c0 20 74 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75 73 74   tokens).** must
261d0 20 73 6f 72 74 20 62 65 66 6f 72 65 20 73 79 6d   sort before sym
261e0 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69 6e 20  bols that begin 
261f0 77 69 74 68 20 6c 6f 77 65 72 20 63 61 73 65 20  with lower case 
26200 6c 65 74 74 65 72 73 0a 2a 2a 20 28 6e 6f 6e 2d  letters.** (non-
26210 74 65 72 6d 69 6e 61 6c 73 29 2e 20 20 41 6e 64  terminals).  And
26220 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 73   MULTITERMINAL s
26230 79 6d 62 6f 6c 73 20 28 63 72 65 61 74 65 64 20  ymbols (created 
26240 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 25 74 6f  using the.** %to
26250 6b 65 6e 5f 63 6c 61 73 73 20 64 69 72 65 63 74  ken_class direct
26260 69 76 65 29 20 6d 75 73 74 20 73 6f 72 74 20 61  ive) must sort a
26270 74 20 74 68 65 20 76 65 72 79 20 65 6e 64 2e 20  t the very end. 
26280 4f 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  Other than.** th
26290 61 74 2c 20 74 68 65 20 6f 72 64 65 72 20 64 6f  at, the order do
262a0 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 0a 2a  es not matter..*
262b0 2a 0a 2a 2a 20 57 65 20 66 69 6e 64 20 65 78 70  *.** We find exp
262c0 65 72 69 6d 65 6e 74 61 6c 6c 79 20 74 68 61 74  erimentally that
262d0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 73 79 6d   leaving the sym
262e0 62 6f 6c 73 20 69 6e 20 74 68 65 69 72 20 6f 72  bols in their or
262f0 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65 72 20  iginal.** order 
26300 28 74 68 65 20 6f 72 64 65 72 20 74 68 65 79 20  (the order they 
26310 61 70 70 65 61 72 65 64 20 69 6e 20 74 68 65 20  appeared in the 
26320 67 72 61 6d 6d 61 72 20 66 69 6c 65 29 20 67 69  grammar file) gi
26330 76 65 73 20 74 68 65 0a 2a 2a 20 73 6d 61 6c 6c  ves the.** small
26340 65 73 74 20 70 61 72 73 65 72 20 74 61 62 6c 65  est parser table
26350 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a  s in SQLite..*/.
26360 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63  int Symbolcmpp(c
26370 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 61 2c 20 63  onst void *_a, c
26380 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 62 29 0a 7b  onst void *_b).{
26390 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
263a0 73 79 6d 62 6f 6c 20 2a 61 20 3d 20 2a 28 63 6f  symbol *a = *(co
263b0 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f  nst struct symbo
263c0 6c 20 2a 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e 73  l **) _a;.  cons
263d0 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  t struct symbol 
263e0 2a 62 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72  *b = *(const str
263f0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 5f  uct symbol **) _
26400 62 3b 0a 20 20 69 6e 74 20 69 31 20 3d 20 61 2d  b;.  int i1 = a-
26410 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
26420 49 4e 41 4c 20 3f 20 33 20 3a 20 61 2d 3e 6e 61  INAL ? 3 : a->na
26430 6d 65 5b 30 5d 3e 27 5a 27 20 3f 20 32 20 3a 20  me[0]>'Z' ? 2 : 
26440 31 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 62 2d  1;.  int i2 = b-
26450 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
26460 49 4e 41 4c 20 3f 20 33 20 3a 20 62 2d 3e 6e 61  INAL ? 3 : b->na
26470 6d 65 5b 30 5d 3e 27 5a 27 20 3f 20 32 20 3a 20  me[0]>'Z' ? 2 : 
26480 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 31 3d 3d  1;.  return i1==
26490 69 32 20 3f 20 61 2d 3e 69 6e 64 65 78 20 2d 20  i2 ? a->index - 
264a0 62 2d 3e 69 6e 64 65 78 20 3a 20 69 31 20 2d 20  b->index : i1 - 
264b0 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20  i2;.}../* There 
264c0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
264d0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
264e0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
264f0 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
26500 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
26510 20 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x2"..*/.struct
26520 20 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20 73 69   s_x2 {.  int si
26530 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
26540 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
26550 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
26560 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
26570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26580 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
26590 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
265a0 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
265b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265c0 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
265d0 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
265e0 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
265f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26600 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
26610 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
26620 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 74  ruct s_x2node *t
26630 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
26640 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
26650 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
26660 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
26670 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
26680 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
26690 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
266a0 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
266b0 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
266c0 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
266d0 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
266e0 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
266f0 78 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x2"..*/.typedef 
26700 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20  struct s_x2node 
26710 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
26720 6c 20 2a 64 61 74 61 3b 20 20 20 20 20 2f 2a 20  l *data;     /* 
26730 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 63 6f  The data */.  co
26740 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 3b 20 20  nst char *key;  
26750 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65         /* The ke
26760 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  y */.  struct s_
26770 78 32 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x2node *next;   
26780 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
26790 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
267a0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
267b0 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  2node **from;  /
267c0 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
267d0 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x2node;../*
267e0 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
267f0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
26800 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
26810 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
26820 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
26830 74 20 73 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a  t s_x2 *x2a;../*
26840 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
26850 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
26860 79 20 2a 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c  y */.void Symbol
26870 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 69  _init(void){.  i
26880 66 28 20 78 32 61 20 29 20 72 65 74 75 72 6e 3b  f( x2a ) return;
26890 0a 20 20 78 32 61 20 3d 20 28 73 74 72 75 63 74  .  x2a = (struct
268a0 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28 20 73   s_x2*)malloc( s
268b0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78  izeof(struct s_x
268c0 32 29 20 29 3b 0a 20 20 69 66 28 20 78 32 61 20  2) );.  if( x2a 
268d0 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69 7a 65  ){.    x2a->size
268e0 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 32 61 2d   = 128;.    x2a-
268f0 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  >count = 0;.    
26900 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32 6e 6f  x2a->tbl = (x2no
26910 64 65 2a 29 63 61 6c 6c 6f 63 28 31 32 38 2c 20  de*)calloc(128, 
26920 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b  sizeof(x2node) +
26930 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29   sizeof(x2node*)
26940 29 3b 0a 20 20 20 20 69 66 28 20 78 32 61 2d 3e  );.    if( x2a->
26950 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tbl==0 ){.      
26960 66 72 65 65 28 78 32 61 29 3b 0a 20 20 20 20 20  free(x2a);.     
26970 20 78 32 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65   x2a = 0;.    }e
26980 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
26990 3b 0a 20 20 20 20 20 20 78 32 61 2d 3e 68 74 20  ;.      x2a->ht 
269a0 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 78 32  = (x2node**)&(x2
269b0 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20  a->tbl[128]);.  
269c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
269d0 32 38 3b 20 69 2b 2b 29 20 78 32 61 2d 3e 68 74  28; i++) x2a->ht
269e0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
269f0 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61   }.}./* Insert a
26a00 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
26a10 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74   the array.  Ret
26a20 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63  urn TRUE if succ
26a30 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72  essful..** Prior
26a40 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73   data with the s
26a50 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f  ame key is NOT o
26a60 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e  verwritten */.in
26a70 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28  t Symbol_insert(
26a80 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
26a90 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ata, const char 
26aa0 2a 6b 65 79 29 0a 7b 0a 20 20 78 32 6e 6f 64 65  *key).{.  x2node
26ab0 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64   *np;.  unsigned
26ac0 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   h;.  unsigned p
26ad0 68 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30  h;..  if( x2a==0
26ae0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
26af0 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29  h = strhash(key)
26b00 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32  ;.  h = ph & (x2
26b10 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
26b20 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x2a->ht[h];. 
26b30 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
26b40 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d    if( strcmp(np-
26b50 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a  >key,key)==0 ){.
26b60 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
26b70 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20  ting entry with 
26b80 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
26b90 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20  found. */.      
26ba0 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20  /* Fail because 
26bb0 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74  overwrite is not
26bc0 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20   allows. */.    
26bd0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
26be0 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  }.    np = np->n
26bf0 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78  ext;.  }.  if( x
26c00 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e  2a->count>=x2a->
26c10 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  size ){.    /* N
26c20 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  eed to make the 
26c30 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65  hash table bigge
26c40 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61  r */.    int i,a
26c50 72 72 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75  rrSize;.    stru
26c60 63 74 20 73 5f 78 32 20 61 72 72 61 79 3b 0a 20  ct s_x2 array;. 
26c70 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20     array.size = 
26c80 61 72 72 53 69 7a 65 20 3d 20 78 32 61 2d 3e 73  arrSize = x2a->s
26c90 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79  ize*2;.    array
26ca0 2e 63 6f 75 6e 74 20 3d 20 78 32 61 2d 3e 63 6f  .count = x2a->co
26cb0 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74  unt;.    array.t
26cc0 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 63 61  bl = (x2node*)ca
26cd0 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69  lloc(arrSize, si
26ce0 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73  zeof(x2node) + s
26cf0 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 3b  izeof(x2node*));
26d00 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74  .    if( array.t
26d10 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  bl==0 ) return 0
26d20 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74  ;  /* Fail due t
26d30 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  o malloc failure
26d40 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74   */.    array.ht
26d50 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61   = (x2node**)&(a
26d60 72 72 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65  rray.tbl[arrSize
26d70 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
26d80 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29   i<arrSize; i++)
26d90 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30   array.ht[i] = 0
26da0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
26db0 3c 78 32 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b  <x2a->count; i++
26dc0 29 7b 0a 20 20 20 20 20 20 78 32 6e 6f 64 65 20  ){.      x2node 
26dd0 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a  *oldnp, *newnp;.
26de0 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28        oldnp = &(
26df0 78 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20  x2a->tbl[i]);.  
26e00 20 20 20 20 68 20 3d 20 73 74 72 68 61 73 68 28      h = strhash(
26e10 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 61  oldnp->key) & (a
26e20 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20  rrSize-1);.     
26e30 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
26e40 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
26e50 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
26e60 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
26e70 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
26e80 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
26e90 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
26ea0 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
26eb0 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d  np->key = oldnp-
26ec0 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e  >key;.      newn
26ed0 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
26ee0 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
26ef0 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
26f00 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
26f10 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
26f20 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
26f30 66 72 65 65 28 78 32 61 2d 3e 74 62 6c 29 3b 0a  free(x2a->tbl);.
26f40 20 20 20 20 2a 78 32 61 20 3d 20 61 72 72 61 79      *x2a = array
26f50 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
26f60 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
26f70 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32  /.  h = ph & (x2
26f80 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
26f90 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b 78 32   = &(x2a->tbl[x2
26fa0 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
26fb0 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20  np->key = key;. 
26fc0 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
26fd0 3b 0a 20 20 69 66 28 20 78 32 61 2d 3e 68 74 5b  ;.  if( x2a->ht[
26fe0 68 5d 20 29 20 78 32 61 2d 3e 68 74 5b 68 5d 2d  h] ) x2a->ht[h]-
26ff0 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
27000 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
27010 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x2a->ht[h];.  
27020 78 32 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x2a->ht[h] = np;
27030 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
27040 78 32 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x2a->ht[h]);.  r
27050 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
27060 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
27070 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
27080 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
27090 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
270a0 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
270b0 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d  y. */.struct sym
270c0 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64  bol *Symbol_find
270d0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79  (const char *key
270e0 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68  ).{.  unsigned h
270f0 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a  ;.  x2node *np;.
27100 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20  .  if( x2a==0 ) 
27110 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20  return 0;.  h = 
27120 73 74 72 68 61 73 68 28 6b 65 79 29 20 26 20 28  strhash(key) & (
27130 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x2a->size-1);.  
27140 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b  np = x2a->ht[h];
27150 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
27160 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e      if( strcmp(n
27170 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29  p->key,key)==0 )
27180 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
27190 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
271a0 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
271b0 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
271c0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 2d 74 68   Return the n-th
271d0 20 64 61 74 61 2e 20 20 52 65 74 75 72 6e 20 4e   data.  Return N
271e0 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f 75 74 20  ULL if n is out 
271f0 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a 73 74 72  of range. */.str
27200 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
27210 6f 6c 5f 4e 74 68 28 69 6e 74 20 6e 29 0a 7b 0a  ol_Nth(int n).{.
27220 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
27230 2a 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32 61  *data;.  if( x2a
27240 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c 3d 78 32   && n>0 && n<=x2
27250 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20  a->count ){.    
27260 64 61 74 61 20 3d 20 78 32 61 2d 3e 74 62 6c 5b  data = x2a->tbl[
27270 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20 7d 65 6c  n-1].data;.  }el
27280 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 30  se{.    data = 0
27290 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
272a0 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  ata;.}../* Retur
272b0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
272c0 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e 74 20 53  e array */.int S
272d0 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b 0a  ymbol_count().{.
272e0 20 20 72 65 74 75 72 6e 20 78 32 61 20 3f 20 78    return x2a ? x
272f0 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a 7d  2a->count : 0;.}
27300 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  ../* Return an a
27310 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
27320 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e 20   to all data in 
27330 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  the table..** Th
27340 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69  e array is obtai
27350 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
27360 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
27370 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
27380 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20  on.** problems, 
27390 6f 72 20 69 66 20 74 68 65 20 61 72 72 61 79 20  or if the array 
273a0 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72  is empty. */.str
273b0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d  uct symbol **Sym
273c0 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a  bol_arrayof().{.
273d0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
273e0 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69  **array;.  int i
273f0 2c 61 72 72 53 69 7a 65 3b 0a 20 20 69 66 28 20  ,arrSize;.  if( 
27400 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x2a==0 ) return 
27410 30 3b 0a 20 20 61 72 72 53 69 7a 65 20 3d 20 78  0;.  arrSize = x
27420 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72  2a->count;.  arr
27430 61 79 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d  ay = (struct sym
27440 62 6f 6c 20 2a 2a 29 63 61 6c 6c 6f 63 28 61 72  bol **)calloc(ar
27450 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 73 74  rSize, sizeof(st
27460 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 29 3b  ruct symbol *));
27470 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a  .  if( array ){.
27480 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
27490 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  rrSize; i++) arr
274a0 61 79 5b 69 5d 20 3d 20 78 32 61 2d 3e 74 62 6c  ay[i] = x2a->tbl
274b0 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20  [i].data;.  }.  
274c0 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a  return array;.}.
274d0 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
274e0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a  configurations *
274f0 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28  /.int Configcmp(
27500 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f 61 2c 63  const char *_a,c
27510 6f 6e 73 74 20 63 68 61 72 20 2a 5f 62 29 0a 7b  onst char *_b).{
27520 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
27530 63 6f 6e 66 69 67 20 2a 61 20 3d 20 28 73 74 72  config *a = (str
27540 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f 61  uct config *) _a
27550 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  ;.  const struct
27560 20 63 6f 6e 66 69 67 20 2a 62 20 3d 20 28 73 74   config *b = (st
27570 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f  ruct config *) _
27580 62 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78 20  b;.  int x;.  x 
27590 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d  = a->rp->index -
275a0 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20   b->rp->index;. 
275b0 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20   if( x==0 ) x = 
275c0 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b  a->dot - b->dot;
275d0 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a  .  return x;.}..
275e0 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73  /* Compare two s
275f0 74 61 74 65 73 20 2a 2f 0a 50 52 49 56 41 54 45  tates */.PRIVATE
27600 20 69 6e 74 20 73 74 61 74 65 63 6d 70 28 73 74   int statecmp(st
27610 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 2c 20  ruct config *a, 
27620 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
27630 29 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ).{.  int rc;.  
27640 66 6f 72 28 72 63 3d 30 3b 20 72 63 3d 3d 30 20  for(rc=0; rc==0 
27650 26 26 20 61 20 26 26 20 62 3b 20 20 61 3d 61 2d  && a && b;  a=a-
27660 3e 62 70 2c 20 62 3d 62 2d 3e 62 70 29 7b 0a 20  >bp, b=b->bp){. 
27670 20 20 20 72 63 20 3d 20 61 2d 3e 72 70 2d 3e 69     rc = a->rp->i
27680 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e  ndex - b->rp->in
27690 64 65 78 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  dex;.    if( rc=
276a0 3d 30 20 29 20 72 63 20 3d 20 61 2d 3e 64 6f 74  =0 ) rc = a->dot
276b0 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d 0a 20   - b->dot;.  }. 
276c0 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
276d0 20 20 69 66 28 20 61 20 29 20 72 63 20 3d 20 31    if( a ) rc = 1
276e0 3b 0a 20 20 20 20 69 66 28 20 62 20 29 20 72 63  ;.    if( b ) rc
276f0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74   = -1;.  }.  ret
27700 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 48 61  urn rc;.}../* Ha
27710 73 68 20 61 20 73 74 61 74 65 20 2a 2f 0a 50 52  sh a state */.PR
27720 49 56 41 54 45 20 75 6e 73 69 67 6e 65 64 20 73  IVATE unsigned s
27730 74 61 74 65 68 61 73 68 28 73 74 72 75 63 74 20  tatehash(struct 
27740 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20 20 75  config *a).{.  u
27750 6e 73 69 67 6e 65 64 20 68 3d 30 3b 0a 20 20 77  nsigned h=0;.  w
27760 68 69 6c 65 28 20 61 20 29 7b 0a 20 20 20 20 68  hile( a ){.    h
27770 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70   = h*571 + a->rp
27780 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e  ->index*37 + a->
27790 64 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61 2d 3e  dot;.    a = a->
277a0 62 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  bp;.  }.  return
277b0 20 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61   h;.}../* Alloca
277c0 74 65 20 61 20 6e 65 77 20 73 74 61 74 65 20 73  te a new state s
277d0 74 72 75 63 74 75 72 65 20 2a 2f 0a 73 74 72 75  tructure */.stru
277e0 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f  ct state *State_
277f0 6e 65 77 28 29 0a 7b 0a 20 20 73 74 72 75 63 74  new().{.  struct
27800 20 73 74 61 74 65 20 2a 6e 65 77 73 74 61 74 65   state *newstate
27810 3b 0a 20 20 6e 65 77 73 74 61 74 65 20 3d 20 28  ;.  newstate = (
27820 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 63  struct state *)c
27830 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28  alloc(1, sizeof(
27840 73 74 72 75 63 74 20 73 74 61 74 65 29 20 29 3b  struct state) );
27850 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 6e  .  MemoryCheck(n
27860 65 77 73 74 61 74 65 29 3b 0a 20 20 72 65 74 75  ewstate);.  retu
27870 72 6e 20 6e 65 77 73 74 61 74 65 3b 0a 7d 0a 0a  rn newstate;.}..
27880 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
27890 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
278a0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
278b0 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  ure for each.** 
278c0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
278d0 79 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a  y of type "x3"..
278e0 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 33 20 7b  */.struct s_x3 {
278f0 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
27900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
27910 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
27920 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a  lable slots. */.
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d            /*   M
27950 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
27960 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e  f 2 greater than
27970 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   or */.         
27980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27990 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31   /*   equal to 1
279a0 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b   */.  int count;
279b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
279c0 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65   Number of curre
279d0 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65  ntly slots fille
279e0 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  d */.  struct s_
279f0 78 33 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a  x3node *tbl;  /*
27a00 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   The data stored
27a10 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
27a20 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 68 74 3b  t s_x3node **ht;
27a30 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
27a40 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d  for lookups */.}
27a50 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
27a60 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
27a70 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f  his structure fo
27a80 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65  r every data ele
27a90 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73  ment.** in an as
27aa0 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
27ab0 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f  of type "x3"..*/
27ac0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
27ad0 73 5f 78 33 6e 6f 64 65 20 7b 0a 20 20 73 74 72  s_x3node {.  str
27ae0 75 63 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b  uct state *data;
27af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b00 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
27b10 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
27b20 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20   *key;          
27b30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27b40 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  key */.  struct 
27b50 73 5f 78 33 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x3node *next; 
27b60 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
27b70 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
27b80 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
27b90 5f 78 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x3node **from; 
27ba0 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
27bb0 6b 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a  k */.} x3node;..
27bc0 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
27bd0 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
27be0 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
27bf0 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
27c00 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
27c10 75 63 74 20 73 5f 78 33 20 2a 78 33 61 3b 0a 0a  uct s_x3 *x3a;..
27c20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
27c30 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
27c40 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 61 74  ray */.void Stat
27c50 65 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20  e_init(void){.  
27c60 69 66 28 20 78 33 61 20 29 20 72 65 74 75 72 6e  if( x3a ) return
27c70 3b 0a 20 20 78 33 61 20 3d 20 28 73 74 72 75 63  ;.  x3a = (struc
27c80 74 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f 63 28 20  t s_x3*)malloc( 
27c90 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f  sizeof(struct s_
27ca0 78 33 29 20 29 3b 0a 20 20 69 66 28 20 78 33 61  x3) );.  if( x3a
27cb0 20 29 7b 0a 20 20 20 20 78 33 61 2d 3e 73 69 7a   ){.    x3a->siz
27cc0 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 33 61  e = 128;.    x3a
27cd0 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ->count = 0;.   
27ce0 20 78 33 61 2d 3e 74 62 6c 20 3d 20 28 78 33 6e   x3a->tbl = (x3n
27cf0 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 31 32 38 2c  ode*)calloc(128,
27d00 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20   sizeof(x3node) 
27d10 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a  + sizeof(x3node*
27d20 29 29 3b 0a 20 20 20 20 69 66 28 20 78 33 61 2d  ));.    if( x3a-
27d30 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >tbl==0 ){.     
27d40 20 66 72 65 65 28 78 33 61 29 3b 0a 20 20 20 20   free(x3a);.    
27d50 20 20 78 33 61 20 3d 20 30 3b 0a 20 20 20 20 7d    x3a = 0;.    }
27d60 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
27d70 69 3b 0a 20 20 20 20 20 20 78 33 61 2d 3e 68 74  i;.      x3a->ht
27d80 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 78   = (x3node**)&(x
27d90 33 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20  3a->tbl[128]);. 
27da0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
27db0 31 32 38 3b 20 69 2b 2b 29 20 78 33 61 2d 3e 68  128; i++) x3a->h
27dc0 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
27dd0 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20    }.}./* Insert 
27de0 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
27df0 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65  o the array.  Re
27e00 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63  turn TRUE if suc
27e10 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f  cessful..** Prio
27e20 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20  r data with the 
27e30 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20  same key is NOT 
27e40 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69  overwritten */.i
27e50 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28  nt State_insert(
27e60 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 64 61  struct state *da
27e70 74 61 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69  ta, struct confi
27e80 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 78 33 6e 6f  g *key).{.  x3no
27e90 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e  de *np;.  unsign
27ea0 65 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ed h;.  unsigned
27eb0 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d   ph;..  if( x3a=
27ec0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
27ed0 20 70 68 20 3d 20 73 74 61 74 65 68 61 73 68 28   ph = statehash(
27ee0 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26  key);.  h = ph &
27ef0 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x3a->size-1);.
27f00 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68    np = x3a->ht[h
27f10 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
27f20 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74 65 63  {.    if( statec
27f30 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d  mp(np->key,key)=
27f40 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
27f50 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
27f60 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
27f70 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a  ey is found. */.
27f80 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65        /* Fail be
27f90 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20  cause overwrite 
27fa0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a  is not allows. *
27fb0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
27fc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d  ;.    }.    np =
27fd0 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
27fe0 20 69 66 28 20 78 33 61 2d 3e 63 6f 75 6e 74 3e   if( x3a->count>
27ff0 3d 78 33 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20  =x3a->size ){.  
28000 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
28010 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
28020 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69   bigger */.    i
28030 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20  nt i,arrSize;.  
28040 20 20 73 74 72 75 63 74 20 73 5f 78 33 20 61 72    struct s_x3 ar
28050 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73  ray;.    array.s
28060 69 7a 65 20 3d 20 61 72 72 53 69 7a 65 20 3d 20  ize = arrSize = 
28070 78 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20  x3a->size*2;.   
28080 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78   array.count = x
28090 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61  3a->count;.    a
280a0 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 33 6e 6f  rray.tbl = (x3no
280b0 64 65 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69  de*)calloc(arrSi
280c0 7a 65 2c 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64  ze, sizeof(x3nod
280d0 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f  e) + sizeof(x3no
280e0 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61  de*));.    if( a
280f0 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65  rray.tbl==0 ) re
28100 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c  turn 0;  /* Fail
28110 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66   due to malloc f
28120 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72  ailure */.    ar
28130 72 61 79 2e 68 74 20 3d 20 28 78 33 6e 6f 64 65  ray.ht = (x3node
28140 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 61  **)&(array.tbl[a
28150 72 72 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f  rrSize]);.    fo
28160 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65  r(i=0; i<arrSize
28170 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b  ; i++) array.ht[
28180 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  i] = 0;.    for(
28190 69 3d 30 3b 20 69 3c 78 33 61 2d 3e 63 6f 75 6e  i=0; i<x3a->coun
281a0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78  t; i++){.      x
281b0 33 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e  3node *oldnp, *n
281c0 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e  ewnp;.      oldn
281d0 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 69  p = &(x3a->tbl[i
281e0 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74  ]);.      h = st
281f0 61 74 65 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b  atehash(oldnp->k
28200 65 79 29 20 26 20 28 61 72 72 53 69 7a 65 2d 31  ey) & (arrSize-1
28210 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
28220 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
28230 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
28240 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
28250 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
28260 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
28270 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
28280 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
28290 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20       newnp->key 
282a0 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20  = oldnp->key;.  
282b0 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
282c0 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
282d0 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
282e0 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
282f0 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
28300 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
28310 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 33 61    }.    free(x3a
28320 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 33 61  ->tbl);.    *x3a
28330 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
28340 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
28350 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
28360 70 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d  ph & (x3a->size-
28370 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 33 61  1);.  np = &(x3a
28380 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74  ->tbl[x3a->count
28390 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20  ++]);.  np->key 
283a0 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74  = key;.  np->dat
283b0 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
283c0 78 33 61 2d 3e 68 74 5b 68 5d 20 29 20 78 33 61  x3a->ht[h] ) x3a
283d0 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
283e0 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
283f0 70 2d 3e 6e 65 78 74 20 3d 20 78 33 61 2d 3e 68  p->next = x3a->h
28400 74 5b 68 5d 3b 0a 20 20 78 33 61 2d 3e 68 74 5b  t[h];.  x3a->ht[
28410 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
28420 72 6f 6d 20 3d 20 26 28 78 33 61 2d 3e 68 74 5b  rom = &(x3a->ht[
28430 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
28440 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
28450 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
28460 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
28470 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
28480 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
28490 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
284a0 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74  ruct state *Stat
284b0 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f  e_find(struct co
284c0 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 75  nfig *key).{.  u
284d0 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 78 33 6e  nsigned h;.  x3n
284e0 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20  ode *np;..  if( 
284f0 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x3a==0 ) return 
28500 30 3b 0a 20 20 68 20 3d 20 73 74 61 74 65 68 61  0;.  h = stateha
28510 73 68 28 6b 65 79 29 20 26 20 28 78 33 61 2d 3e  sh(key) & (x3a->
28520 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
28530 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x3a->ht[h];.  wh
28540 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
28550 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e  f( statecmp(np->
28560 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72  key,key)==0 ) br
28570 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70  eak;.    np = np
28580 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  ->next;.  }.  re
28590 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61  turn np ? np->da
285a0 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  ta : 0;.}../* Re
285b0 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  turn an array of
285c0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
285d0 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 61 62   data in the tab
285e0 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79  le..** The array
285f0 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
28600 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72  m malloc.  Retur
28610 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79  n NULL if memory
28620 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70   allocation.** p
28630 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74  roblems, or if t
28640 68 65 20 61 72 72 61 79 20 69 73 20 65 6d 70 74  he array is empt
28650 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61  y. */.struct sta
28660 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79  te **State_array
28670 6f 66 28 76 6f 69 64 29 0a 7b 0a 20 20 73 74 72  of(void).{.  str
28680 75 63 74 20 73 74 61 74 65 20 2a 2a 61 72 72 61  uct state **arra
28690 79 3b 0a 20 20 69 6e 74 20 69 2c 61 72 72 53 69  y;.  int i,arrSi
286a0 7a 65 3b 0a 20 20 69 66 28 20 78 33 61 3d 3d 30  ze;.  if( x3a==0
286b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61   ) return 0;.  a
286c0 72 72 53 69 7a 65 20 3d 20 78 33 61 2d 3e 63 6f  rrSize = x3a->co
286d0 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28  unt;.  array = (
286e0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 29  struct state **)
286f0 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20  calloc(arrSize, 
28700 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74  sizeof(struct st
28710 61 74 65 20 2a 29 29 3b 0a 20 20 69 66 28 20 61  ate *));.  if( a
28720 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  rray ){.    for(
28730 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20  i=0; i<arrSize; 
28740 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20  i++) array[i] = 
28750 78 33 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61  x3a->tbl[i].data
28760 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
28770 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68  rray;.}../* Hash
28780 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
28790 20 2a 2f 0a 50 52 49 56 41 54 45 20 75 6e 73 69   */.PRIVATE unsi
287a0 67 6e 65 64 20 63 6f 6e 66 69 67 68 61 73 68 28  gned confighash(
287b0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61  struct config *a
287c0 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68  ).{.  unsigned h
287d0 3d 30 3b 0a 20 20 68 20 3d 20 68 2a 35 37 31 20  =0;.  h = h*571 
287e0 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33  + a->rp->index*3
287f0 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 72 65  7 + a->dot;.  re
28800 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn h;.}../* Th
28810 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
28820 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
28830 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
28840 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
28850 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
28860 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 73 74  type "x4"..*/.st
28870 72 75 63 74 20 73 5f 78 34 20 7b 0a 20 20 69 6e  ruct s_x4 {.  in
28880 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
28890 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
288a0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
288b0 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288d0 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
288e0 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
288f0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
28900 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
28910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
28920 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
28930 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
28940 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
28950 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
28960 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
28970 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64    struct s_x4nod
28980 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
28990 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
289a0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
289b0 34 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  4node **ht;  /* 
289c0 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
289d0 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
289e0 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
289f0 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
28a00 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
28a10 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
28a20 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
28a30 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
28a40 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x4"..*/.type
28a50 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 34 6e  def struct s_x4n
28a60 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63  ode {.  struct c
28a70 6f 6e 66 69 67 20 2a 64 61 74 61 3b 20 20 20 20  onfig *data;    
28a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28a90 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73   The data */.  s
28aa0 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a  truct s_x4node *
28ab0 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20  next;   /* Next 
28ac0 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
28ad0 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74  ame hash */.  st
28ae0 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a  ruct s_x4node **
28af0 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f  from;  /* Previo
28b00 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e  us link */.} x4n
28b10 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  ode;../* There i
28b20 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61  s only one insta
28b30 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  nce of the array
28b40 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66  , which is the f
28b50 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74  ollowing */.stat
28b60 69 63 20 73 74 72 75 63 74 20 73 5f 78 34 20 2a  ic struct s_x4 *
28b70 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  x4a;../* Allocat
28b80 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74  e a new associat
28b90 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69  ive array */.voi
28ba0 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e  d Configtable_in
28bb0 69 74 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  it(void){.  if( 
28bc0 78 34 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x4a ) return;.  
28bd0 78 34 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x4a = (struct s_
28be0 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x4*)malloc( size
28bf0 6f 66 28 73 74 72 75 63 74 20 73 5f 78 34 29 20  of(struct s_x4) 
28c00 29 3b 0a 20 20 69 66 28 20 78 34 61 20 29 7b 0a  );.  if( x4a ){.
28c10 20 20 20 20 78 34 61 2d 3e 73 69 7a 65 20 3d 20      x4a->size = 
28c20 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63 6f 75  64;.    x4a->cou
28c30 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 34 61 2d  nt = 0;.    x4a-
28c40 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29  >tbl = (x4node*)
28c50 63 61 6c 6c 6f 63 28 36 34 2c 20 73 69 7a 65 6f  calloc(64, sizeo
28c60 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x4node) + size
28c70 6f 66 28 78 34 6e 6f 64 65 2a 29 29 3b 0a 20 20  of(x4node*));.  
28c80 20 20 69 66 28 20 78 34 61 2d 3e 74 62 6c 3d 3d    if( x4a->tbl==
28c90 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
28ca0 78 34 61 29 3b 0a 20 20 20 20 20 20 78 34 61 20  x4a);.      x4a 
28cb0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
28cc0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
28cd0 20 20 20 78 34 61 2d 3e 68 74 20 3d 20 28 78 34     x4a->ht = (x4
28ce0 6e 6f 64 65 2a 2a 29 26 28 78 34 61 2d 3e 74 62  node**)&(x4a->tb
28cf0 6c 5b 36 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f  l[64]);.      fo
28d00 72 28 69 3d 30 3b 20 69 3c 36 34 3b 20 69 2b 2b  r(i=0; i<64; i++
28d10 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x4a->ht[i] = 0
28d20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
28d30 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
28d40 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
28d50 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
28d60 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
28d70 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
28d80 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
28d90 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
28da0 74 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69  ten */.int Confi
28db0 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 73 74  gtable_insert(st
28dc0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74  ruct config *dat
28dd0 61 29 0a 7b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e  a).{.  x4node *n
28de0 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b  p;.  unsigned h;
28df0 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a  .  unsigned ph;.
28e00 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20  .  if( x4a==0 ) 
28e10 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
28e20 20 63 6f 6e 66 69 67 68 61 73 68 28 64 61 74 61   confighash(data
28e30 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
28e40 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  4a->size-1);.  n
28e50 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x4a->ht[h];.
28e60 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
28e70 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70     if( Configcmp
28e80 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20  ((const char *) 
28e90 6e 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20  np->data,(const 
28ea0 63 68 61 72 20 2a 29 20 64 61 74 61 29 3d 3d 30  char *) data)==0
28eb0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
28ec0 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77  existing entry w
28ed0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
28ee0 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20   is found. */.  
28ef0 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61      /* Fail beca
28f00 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73  use overwrite is
28f10 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a   not allows. */.
28f20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
28f30 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e      }.    np = n
28f40 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  p->next;.  }.  i
28f50 66 28 20 78 34 61 2d 3e 63 6f 75 6e 74 3e 3d 78  f( x4a->count>=x
28f60 34 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20  4a->size ){.    
28f70 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
28f80 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62  the hash table b
28f90 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  igger */.    int
28fa0 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20 20   i,arrSize;.    
28fb0 73 74 72 75 63 74 20 73 5f 78 34 20 61 72 72 61  struct s_x4 arra
28fc0 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
28fd0 65 20 3d 20 61 72 72 53 69 7a 65 20 3d 20 78 34  e = arrSize = x4
28fe0 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61  a->size*2;.    a
28ff0 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 34 61  rray.count = x4a
29000 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72  ->count;.    arr
29010 61 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65  ay.tbl = (x4node
29020 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65  *)calloc(arrSize
29030 2c 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29  , sizeof(x4node)
29040 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65   + sizeof(x4node
29050 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72  *));.    if( arr
29060 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75  ay.tbl==0 ) retu
29070 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64  rn 0;  /* Fail d
29080 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69  ue to malloc fai
29090 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61  lure */.    arra
290a0 79 2e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a  y.ht = (x4node**
290b0 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 61 72 72  )&(array.tbl[arr
290c0 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  Size]);.    for(
290d0 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20  i=0; i<arrSize; 
290e0 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d  i++) array.ht[i]
290f0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
29100 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b  0; i<x4a->count;
29110 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 34 6e   i++){.      x4n
29120 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77  ode *oldnp, *new
29130 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20  np;.      oldnp 
29140 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 29  = &(x4a->tbl[i])
29150 3b 0a 20 20 20 20 20 20 68 20 3d 20 63 6f 6e 66  ;.      h = conf
29160 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61  ighash(oldnp->da
29170 74 61 29 20 26 20 28 61 72 72 53 69 7a 65 2d 31  ta) & (arrSize-1
29180 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
29190 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
291a0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
291b0 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
291c0 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
291d0 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
291e0 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
291f0 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
29200 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61       newnp->data
29210 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a   = oldnp->data;.
29220 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f        newnp->fro
29230 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68  m = &(array.ht[h
29240 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e  ]);.      array.
29250 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20  ht[h] = newnp;. 
29260 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 34     }.    free(x4
29270 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34  a->tbl);.    *x4
29280 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20  a = array;.  }. 
29290 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
292a0 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d  ew data */.  h =
292b0 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65   ph & (x4a->size
292c0 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34  -1);.  np = &(x4
292d0 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e  a->tbl[x4a->coun
292e0 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74  t++]);.  np->dat
292f0 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
29300 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61  x4a->ht[h] ) x4a
29310 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
29320 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
29330 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68  p->next = x4a->h
29340 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b  t[h];.  x4a->ht[
29350 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
29360 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b  rom = &(x4a->ht[
29370 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
29380 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
29390 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
293a0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
293b0 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
293c0 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
293d0 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
293e0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
293f0 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74  figtable_find(st
29400 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
29410 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78  ).{.  int h;.  x
29420 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  4node *np;..  if
29430 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x4a==0 ) retur
29440 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69  n 0;.  h = confi
29450 67 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 34  ghash(key) & (x4
29460 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
29470 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x4a->ht[h];. 
29480 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
29490 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28    if( Configcmp(
294a0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6e  (const char *) n
294b0 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20 63  p->data,(const c
294c0 68 61 72 20 2a 29 20 6b 65 79 29 3d 3d 30 20 29  har *) key)==0 )
294d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
294e0 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
294f0 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
29500 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
29510 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61   Remove all data
29520 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e   from the table.
29530 20 20 50 61 73 73 20 65 61 63 68 20 64 61 74 61    Pass each data
29540 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
29550 20 22 66 22 0a 2a 2a 20 61 73 20 69 74 20 69 73   "f".** as it is
29560 20 72 65 6d 6f 76 65 64 2e 20 20 28 22 66 22 20   removed.  ("f" 
29570 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61  may be null to a
29580 76 6f 69 64 20 74 68 69 73 20 73 74 65 70 2e 29  void this step.)
29590 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74   */.void Configt
295a0 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74 28 2a  able_clear(int(*
295b0 66 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  f)(struct config
295c0 20 2a 29 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a   *)).{.  int i;.
295d0 20 20 69 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20    if( x4a==0 || 
295e0 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20  x4a->count==0 ) 
295f0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 66 20  return;.  if( f 
29600 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61  ) for(i=0; i<x4a
29610 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a  ->count; i++) (*
29620 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64  f)(x4a->tbl[i].d
29630 61 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ata);.  for(i=0;
29640 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b   i<x4a->size; i+
29650 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x4a->ht[i] = 
29660 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20  0;.  x4a->count 
29670 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
29680 0a                                               .