/ Hex Artifact Content
Login

Artifact c02a8dffa053950c460cc27e524e24a06cbd1c06125ae9d619be0811528cb9bb:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0190: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
01a0: 0a 23 64 65 66 69 6e 65 20 49 53 53 50 41 43 45  .#define ISSPACE
01b0: 28 58 29 20 69 73 73 70 61 63 65 28 28 75 6e 73  (X) isspace((uns
01c0: 69 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a  igned char)(X)).
01d0: 23 64 65 66 69 6e 65 20 49 53 44 49 47 49 54 28  #define ISDIGIT(
01e0: 58 29 20 69 73 64 69 67 69 74 28 28 75 6e 73 69  X) isdigit((unsi
01f0: 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23  gned char)(X)).#
0200: 64 65 66 69 6e 65 20 49 53 41 4c 4e 55 4d 28 58  define ISALNUM(X
0210: 29 20 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67  ) isalnum((unsig
0220: 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64  ned char)(X)).#d
0230: 65 66 69 6e 65 20 49 53 41 4c 50 48 41 28 58 29  efine ISALPHA(X)
0240: 20 69 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e   isalpha((unsign
0250: 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65  ed char)(X)).#de
0260: 66 69 6e 65 20 49 53 55 50 50 45 52 28 58 29 20  fine ISUPPER(X) 
0270: 69 73 75 70 70 65 72 28 28 75 6e 73 69 67 6e 65  isupper((unsigne
0280: 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65 66  d char)(X)).#def
0290: 69 6e 65 20 49 53 4c 4f 57 45 52 28 58 29 20 69  ine ISLOWER(X) i
02a0: 73 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65 64  slower((unsigned
02b0: 20 63 68 61 72 29 28 58 29 29 0a 0a 0a 23 69 66   char)(X))...#if
02c0: 6e 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  ndef __WIN32__.#
02d0: 20 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 57     if defined(_W
02e0: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
02f0: 28 57 49 4e 33 32 29 0a 23 20 20 20 20 20 20 20  (WIN32).#       
0300: 64 65 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f  define __WIN32__
0310: 0a 23 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  .#   endif.#endi
0320: 66 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33  f..#ifdef __WIN3
0330: 32 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c  2__.#ifdef __cpl
0340: 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20 22 43  usplus.extern "C
0350: 22 20 7b 0a 23 65 6e 64 69 66 0a 65 78 74 65 72  " {.#endif.exter
0360: 6e 20 69 6e 74 20 61 63 63 65 73 73 28 63 6f 6e  n int access(con
0370: 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 69  st char *path, i
0380: 6e 74 20 6d 6f 64 65 29 3b 0a 23 69 66 64 65 66  nt mode);.#ifdef
0390: 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 7d 0a 23   __cplusplus.}.#
03a0: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 6e 63  endif.#else.#inc
03b0: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
03c0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66 69  #endif../* #defi
03d0: 6e 65 20 50 52 49 56 41 54 45 20 73 74 61 74 69  ne PRIVATE stati
03e0: 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 49  c */.#define PRI
03f0: 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54 45 53  VATE..#ifdef TES
0400: 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48 53  T.#define MAXRHS
0410: 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20   5       /* Set 
0420: 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73 65 20  low to exercise 
0430: 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65 20 2a  exception code *
0440: 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  /.#else.#define 
0450: 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65 6e 64  MAXRHS 1000.#end
0460: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  if..static int s
0470: 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e  howPrecedenceCon
0480: 66 6c 69 63 74 20 3d 20 30 3b 0a 73 74 61 74 69  flict = 0;.stati
0490: 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 63 68  c char *msort(ch
04a0: 61 72 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 28 2a  ar*,char**,int(*
04b0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
04c0: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a  nst char*));../*
04d0: 0a 2a 2a 20 43 6f 6d 70 69 6c 65 72 73 20 61 72  .** Compilers ar
04e0: 65 20 67 65 74 74 69 6e 67 20 69 6e 63 72 65 61  e getting increa
04f0: 73 69 6e 67 6c 79 20 70 65 64 61 6e 74 69 63 20  singly pedantic 
0500: 61 62 6f 75 74 20 74 79 70 65 20 63 6f 6e 76 65  about type conve
0510: 72 73 69 6f 6e 73 0a 2a 2a 20 61 73 20 43 20 65  rsions.** as C e
0520: 76 6f 6c 76 65 73 20 65 76 65 72 20 63 6c 6f 73  volves ever clos
0530: 65 72 20 74 6f 20 41 64 61 2e 2e 2e 2e 20 20 54  er to Ada....  T
0540: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
0550: 65 20 6c 61 74 65 73 74 20 70 72 6f 62 6c 65 6d  e latest problem
0560: 73 0a 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20  s.** we have to 
0570: 64 65 66 69 6e 65 20 74 68 65 20 66 6f 6c 6c 6f  define the follo
0580: 77 69 6e 67 20 76 61 72 69 61 6e 74 20 6f 66 20  wing variant of 
0590: 73 74 72 6c 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65  strlen()..*/.#de
05a0: 66 69 6e 65 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  fine lemonStrlen
05b0: 28 58 29 20 20 20 28 28 69 6e 74 29 73 74 72 6c  (X)   ((int)strl
05c0: 65 6e 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f  en(X))../*.** Co
05d0: 6d 70 69 6c 65 72 73 20 61 72 65 20 73 74 61 72  mpilers are star
05e0: 74 69 6e 67 20 74 6f 20 63 6f 6d 70 6c 61 69 6e  ting to complain
05f0: 20 61 62 6f 75 74 20 74 68 65 20 75 73 65 20 6f   about the use o
0600: 66 20 73 70 72 69 6e 74 66 28 29 20 61 6e 64 20  f sprintf() and 
0610: 73 74 72 63 70 79 28 29 2c 0a 2a 2a 20 73 61 79  strcpy(),.** say
0620: 69 6e 67 20 74 68 65 79 20 61 72 65 20 75 6e 73  ing they are uns
0630: 61 66 65 2e 20 20 53 6f 20 77 65 20 64 65 66 69  afe.  So we defi
0640: 6e 65 20 6f 75 72 20 6f 77 6e 20 76 65 72 73 69  ne our own versi
0650: 6f 6e 73 20 6f 66 20 74 68 6f 73 65 20 72 6f 75  ons of those rou
0660: 74 69 6e 65 73 20 74 6f 6f 2e 0a 2a 2a 0a 2a 2a  tines too..**.**
0670: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
0680: 20 72 6f 75 74 69 6e 65 73 20 68 65 72 65 3a 20   routines here: 
0690: 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 29   lemon_sprintf()
06a0: 2c 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74 66  , lemon_vsprintf
06b0: 28 29 2c 20 61 6e 64 0a 2a 2a 20 6c 65 6d 6f 6e  (), and.** lemon
06c0: 5f 61 64 64 74 65 78 74 28 29 2e 20 54 68 65 20  _addtext(). The 
06d0: 66 69 72 73 74 20 74 77 6f 20 61 72 65 20 72 65  first two are re
06e0: 70 6c 61 63 65 6d 65 6e 74 73 20 66 6f 72 20 73  placements for s
06f0: 70 72 69 6e 74 66 28 29 20 61 6e 64 20 76 73 70  printf() and vsp
0700: 72 69 6e 74 66 28 29 2e 0a 2a 2a 20 54 68 65 20  rintf()..** The 
0710: 74 68 69 72 64 20 69 73 20 61 20 68 65 6c 70 65  third is a helpe
0720: 72 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 76 73  r routine for vs
0730: 6e 70 72 69 6e 74 66 28 29 20 74 68 61 74 20 61  nprintf() that a
0740: 64 64 73 20 74 65 78 74 73 20 74 6f 20 74 68 65  dds texts to the
0750: 20 65 6e 64 20 6f 66 20 61 0a 2a 2a 20 62 75 66   end of a.** buf
0760: 66 65 72 2c 20 6d 61 6b 69 6e 67 20 73 75 72 65  fer, making sure
0770: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 61   the buffer is a
0780: 6c 77 61 79 73 20 7a 65 72 6f 2d 74 65 72 6d 69  lways zero-termi
0790: 6e 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nated..**.** The
07a0: 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 65   string formatte
07b0: 72 20 69 73 20 61 20 6d 69 6e 69 6d 61 6c 20 73  r is a minimal s
07c0: 75 62 73 65 74 20 6f 66 20 73 74 64 6c 69 62 20  ubset of stdlib 
07d0: 73 70 72 69 6e 74 66 28 29 20 73 75 70 70 6f 72  sprintf() suppor
07e0: 74 69 6e 67 20 6f 6e 6c 79 0a 2a 2a 20 61 20 66  ting only.** a f
07f0: 65 77 20 73 69 6d 70 6c 79 20 63 6f 6e 76 65 72  ew simply conver
0800: 73 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 25  sions:.**.**   %
0810: 64 0a 2a 2a 20 20 20 25 73 0a 2a 2a 20 20 20 25  d.**   %s.**   %
0820: 2e 2a 73 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  .*s.**.*/.static
0830: 20 76 6f 69 64 20 6c 65 6d 6f 6e 5f 61 64 64 74   void lemon_addt
0840: 65 78 74 28 0a 20 20 63 68 61 72 20 2a 7a 42 75  ext(.  char *zBu
0850: 66 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  f,           /* 
0860: 54 68 65 20 62 75 66 66 65 72 20 74 6f 20 77 68  The buffer to wh
0870: 69 63 68 20 74 65 78 74 20 69 73 20 61 64 64 65  ich text is adde
0880: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 55 73  d */.  int *pnUs
0890: 65 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed,          /* 
08a0: 53 6c 6f 74 73 20 6f 66 20 74 68 65 20 62 75 66  Slots of the buf
08b0: 66 65 72 20 75 73 65 64 20 73 6f 20 66 61 72 20  fer used so far 
08c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
08d0: 2a 7a 49 6e 2c 20 20 20 20 20 20 2f 2a 20 54 65  *zIn,      /* Te
08e0: 78 74 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69  xt to add */.  i
08f0: 6e 74 20 6e 49 6e 2c 20 20 20 20 20 20 20 20 20  nt nIn,         
0900: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
0910: 20 74 65 78 74 20 74 6f 20 61 64 64 2e 20 20 2d   text to add.  -
0920: 31 20 74 6f 20 75 73 65 20 73 74 72 6c 65 6e 28  1 to use strlen(
0930: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 57 69 64 74  ) */.  int iWidt
0940: 68 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h            /* 
0950: 46 69 65 6c 64 20 77 69 64 74 68 2e 20 20 4e 65  Field width.  Ne
0960: 67 61 74 69 76 65 20 74 6f 20 6c 65 66 74 20 6a  gative to left j
0970: 75 73 74 69 66 79 20 2a 2f 0a 29 7b 0a 20 20 69  ustify */.){.  i
0980: 66 28 20 6e 49 6e 3c 30 20 29 20 66 6f 72 28 6e  f( nIn<0 ) for(n
0990: 49 6e 3d 30 3b 20 7a 49 6e 5b 6e 49 6e 5d 3b 20  In=0; zIn[nIn]; 
09a0: 6e 49 6e 2b 2b 29 7b 7d 0a 20 20 77 68 69 6c 65  nIn++){}.  while
09b0: 28 20 69 57 69 64 74 68 3e 6e 49 6e 20 29 7b 20  ( iWidth>nIn ){ 
09c0: 7a 42 75 66 5b 28 2a 70 6e 55 73 65 64 29 2b 2b  zBuf[(*pnUsed)++
09d0: 5d 20 3d 20 27 20 27 3b 20 69 57 69 64 74 68 2d  ] = ' '; iWidth-
09e0: 2d 3b 20 7d 0a 20 20 69 66 28 20 6e 49 6e 3d 3d  -; }.  if( nIn==
09f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  0 ) return;.  me
0a00: 6d 63 70 79 28 26 7a 42 75 66 5b 2a 70 6e 55 73  mcpy(&zBuf[*pnUs
0a10: 65 64 5d 2c 20 7a 49 6e 2c 20 6e 49 6e 29 3b 0a  ed], zIn, nIn);.
0a20: 20 20 2a 70 6e 55 73 65 64 20 2b 3d 20 6e 49 6e    *pnUsed += nIn
0a30: 3b 0a 20 20 77 68 69 6c 65 28 20 28 2d 69 57 69  ;.  while( (-iWi
0a40: 64 74 68 29 3e 6e 49 6e 20 29 7b 20 7a 42 75 66  dth)>nIn ){ zBuf
0a50: 5b 28 2a 70 6e 55 73 65 64 29 2b 2b 5d 20 3d 20  [(*pnUsed)++] = 
0a60: 27 20 27 3b 20 69 57 69 64 74 68 2b 2b 3b 20 7d  ' '; iWidth++; }
0a70: 0a 20 20 7a 42 75 66 5b 2a 70 6e 55 73 65 64 5d  .  zBuf[*pnUsed]
0a80: 20 3d 20 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69   = 0;.}.static i
0a90: 6e 74 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74  nt lemon_vsprint
0aa0: 66 28 63 68 61 72 20 2a 73 74 72 2c 20 63 6f 6e  f(char *str, con
0ab0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
0ac0: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
0ad0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 63 3b   int i, j, k, c;
0ae0: 0a 20 20 69 6e 74 20 6e 55 73 65 64 20 3d 20 30  .  int nUsed = 0
0af0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
0b00: 7a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  z;.  char zTemp[
0b10: 35 30 5d 3b 0a 20 20 73 74 72 5b 30 5d 20 3d 20  50];.  str[0] = 
0b20: 30 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  0;.  for(i=j=0; 
0b30: 28 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 69 5d 29  (c = zFormat[i])
0b40: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  !=0; i++){.    i
0b50: 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a 20 20 20  f( c=='%' ){.   
0b60: 20 20 20 69 6e 74 20 69 57 69 64 74 68 20 3d 20     int iWidth = 
0b70: 30 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  0;.      lemon_a
0b80: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0b90: 65 64 2c 20 26 7a 46 6f 72 6d 61 74 5b 6a 5d 2c  ed, &zFormat[j],
0ba0: 20 69 2d 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20   i-j, 0);.      
0bb0: 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 2b 2b 69 5d  c = zFormat[++i]
0bc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 44 49  ;.      if( ISDI
0bd0: 47 49 54 28 63 29 20 7c 7c 20 28 63 3d 3d 27 2d  GIT(c) || (c=='-
0be0: 27 20 26 26 20 49 53 44 49 47 49 54 28 7a 46 6f  ' && ISDIGIT(zFo
0bf0: 72 6d 61 74 5b 69 2b 31 5d 29 29 20 29 7b 0a 20  rmat[i+1])) ){. 
0c00: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2d         if( c=='-
0c10: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) i++;.       
0c20: 20 77 68 69 6c 65 28 20 49 53 44 49 47 49 54 28   while( ISDIGIT(
0c30: 7a 46 6f 72 6d 61 74 5b 69 5d 29 20 29 20 69 57  zFormat[i]) ) iW
0c40: 69 64 74 68 20 3d 20 69 57 69 64 74 68 2a 31 30  idth = iWidth*10
0c50: 20 2b 20 7a 46 6f 72 6d 61 74 5b 69 2b 2b 5d 20   + zFormat[i++] 
0c60: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69  - '0';.        i
0c70: 66 28 20 63 3d 3d 27 2d 27 20 29 20 69 57 69 64  f( c=='-' ) iWid
0c80: 74 68 20 3d 20 2d 69 57 69 64 74 68 3b 0a 20 20  th = -iWidth;.  
0c90: 20 20 20 20 20 20 63 20 3d 20 7a 46 6f 72 6d 61        c = zForma
0ca0: 74 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t[i];.      }.  
0cb0: 20 20 20 20 69 66 28 20 63 3d 3d 27 64 27 20 29      if( c=='d' )
0cc0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76 20  {.        int v 
0cd0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
0ce0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
0cf0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
0d00: 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74  lemon_addtext(st
0d10: 72 2c 20 26 6e 55 73 65 64 2c 20 22 2d 22 2c 20  r, &nUsed, "-", 
0d20: 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20 20 20  1, iWidth);.    
0d30: 20 20 20 20 20 20 76 20 3d 20 2d 76 3b 0a 20 20        v = -v;.  
0d40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
0d50: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  v==0 ){.        
0d60: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0d70: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 22 30 22  str, &nUsed, "0"
0d80: 2c 20 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20  , 1, iWidth);.  
0d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0da0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77  k = 0;.        w
0db0: 68 69 6c 65 28 20 76 3e 30 20 29 7b 0a 20 20 20  hile( v>0 ){.   
0dc0: 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20         k++;.    
0dd0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 73 69 7a 65        zTemp[size
0de0: 6f 66 28 7a 54 65 6d 70 29 2d 6b 5d 20 3d 20 28  of(zTemp)-k] = (
0df0: 76 25 31 30 29 20 2b 20 27 30 27 3b 0a 20 20 20  v%10) + '0';.   
0e00: 20 20 20 20 20 20 20 76 20 2f 3d 20 31 30 3b 0a         v /= 10;.
0e10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0e20: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0e30: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 26 7a 54  str, &nUsed, &zT
0e40: 65 6d 70 5b 73 69 7a 65 6f 66 28 7a 54 65 6d 70  emp[sizeof(zTemp
0e50: 29 2d 6b 5d 2c 20 6b 2c 20 69 57 69 64 74 68 29  )-k], k, iWidth)
0e60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
0e70: 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20  ( c=='s' ){.    
0e80: 20 20 20 20 7a 20 3d 20 76 61 5f 61 72 67 28 61      z = va_arg(a
0e90: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
0ea0: 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  .        lemon_a
0eb0: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0ec0: 65 64 2c 20 7a 2c 20 2d 31 2c 20 69 57 69 64 74  ed, z, -1, iWidt
0ed0: 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  h);.      }else 
0ee0: 69 66 28 20 63 3d 3d 27 2e 27 20 26 26 20 6d 65  if( c=='.' && me
0ef0: 6d 63 6d 70 28 26 7a 46 6f 72 6d 61 74 5b 69 5d  mcmp(&zFormat[i]
0f00: 2c 20 22 2e 2a 73 22 2c 20 33 29 3d 3d 30 20 29  , ".*s", 3)==0 )
0f10: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  {.        i += 2
0f20: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 76 61  ;.        k = va
0f30: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
0f40: 20 20 20 20 20 20 20 7a 20 3d 20 76 61 5f 61 72         z = va_ar
0f50: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
0f60: 2a 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f  *);.        lemo
0f70: 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20 26  n_addtext(str, &
0f80: 6e 55 73 65 64 2c 20 7a 2c 20 6b 2c 20 69 57 69  nUsed, z, k, iWi
0f90: 64 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dth);.      }els
0fa0: 65 20 69 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a  e if( c=='%' ){.
0fb0: 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64          lemon_ad
0fc0: 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65  dtext(str, &nUse
0fd0: 64 2c 20 22 25 22 2c 20 31 2c 20 30 29 3b 0a 20  d, "%", 1, 0);. 
0fe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
0ff0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1000: 72 72 2c 20 22 69 6c 6c 65 67 61 6c 20 66 6f 72  rr, "illegal for
1010: 6d 61 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  mat\n");.       
1020: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
1030: 7d 0a 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b  }.      j = i+1;
1040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 65 6d  .    }.  }.  lem
1050: 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20  on_addtext(str, 
1060: 26 6e 55 73 65 64 2c 20 26 7a 46 6f 72 6d 61 74  &nUsed, &zFormat
1070: 5b 6a 5d 2c 20 69 2d 6a 2c 20 30 29 3b 0a 20 20  [j], i-j, 0);.  
1080: 72 65 74 75 72 6e 20 6e 55 73 65 64 3b 0a 7d 0a  return nUsed;.}.
1090: 73 74 61 74 69 63 20 69 6e 74 20 6c 65 6d 6f 6e  static int lemon
10a0: 5f 73 70 72 69 6e 74 66 28 63 68 61 72 20 2a 73  _sprintf(char *s
10b0: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
10c0: 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  format, ...){.  
10d0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
10e0: 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  t rc;.  va_start
10f0: 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20  (ap, format);.  
1100: 72 63 20 3d 20 6c 65 6d 6f 6e 5f 76 73 70 72 69  rc = lemon_vspri
1110: 6e 74 66 28 73 74 72 2c 20 66 6f 72 6d 61 74 2c  ntf(str, format,
1120: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1130: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1140: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
1150: 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63 68 61 72  emon_strcpy(char
1160: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
1170: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
1180: 65 28 20 28 2a 28 64 65 73 74 2b 2b 29 20 3d 20  e( (*(dest++) = 
1190: 2a 28 73 72 63 2b 2b 29 29 21 3d 30 20 29 7b 7d  *(src++))!=0 ){}
11a0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
11b0: 65 6d 6f 6e 5f 73 74 72 63 61 74 28 63 68 61 72  emon_strcat(char
11c0: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
11d0: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
11e0: 65 28 20 2a 64 65 73 74 20 29 20 64 65 73 74 2b  e( *dest ) dest+
11f0: 2b 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70  +;.  lemon_strcp
1200: 79 28 64 65 73 74 2c 20 73 72 63 29 3b 0a 7d 0a  y(dest, src);.}.
1210: 0a 0a 2f 2a 20 61 20 66 65 77 20 66 6f 72 77 61  ../* a few forwa
1220: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e  rd declarations.
1230: 2e 2e 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c  .. */.struct rul
1240: 65 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 3b  e;.struct lemon;
1250: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 3b 0a  .struct action;.
1260: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
1270: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65  ction *Action_ne
1280: 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63 20  w(void);.static 
1290: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
12a0: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72 75 63  ction_sort(struc
12b0: 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a  t action *);../*
12c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
12d0: 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 68  he file "build.h
12e0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
12f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1300: 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e  ******/.void Fin
1310: 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73  dRulePrecedences
1320: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a 29 3b  (struct lemon*);
1330: 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53  .void FindFirstS
1340: 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ets(struct lemon
1350: 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64 53 74 61  *);.void FindSta
1360: 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  tes(struct lemon
1370: 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e  *);.void FindLin
1380: 6b 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a  ks(struct lemon*
1390: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c  );.void FindFoll
13a0: 6f 77 53 65 74 73 28 73 74 72 75 63 74 20 6c 65  owSets(struct le
13b0: 6d 6f 6e 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64  mon*);.void Find
13c0: 41 63 74 69 6f 6e 73 28 73 74 72 75 63 74 20 6c  Actions(struct l
13d0: 65 6d 6f 6e 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  emon*);../******
13e0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
13f0: 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 68 22  e "configlist.h"
1400: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1420: 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  **/.void Configl
1430: 69 73 74 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a  ist_init(void);.
1440: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
1450: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 73 74  onfiglist_add(st
1460: 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74  ruct rule *, int
1470: 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  );.struct config
1480: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   *Configlist_add
1490: 62 61 73 69 73 28 73 74 72 75 63 74 20 72 75 6c  basis(struct rul
14a0: 65 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20  e *, int);.void 
14b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75  Configlist_closu
14c0: 72 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  re(struct lemon 
14d0: 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  *);.void Configl
14e0: 69 73 74 5f 73 6f 72 74 28 76 6f 69 64 29 3b 0a  ist_sort(void);.
14f0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1500: 73 6f 72 74 62 61 73 69 73 28 76 6f 69 64 29 3b  sortbasis(void);
1510: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1520: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72  Configlist_retur
1530: 6e 28 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20  n(void);.struct 
1540: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
1550: 73 74 5f 62 61 73 69 73 28 76 6f 69 64 29 3b 0a  st_basis(void);.
1560: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1570: 65 61 74 28 73 74 72 75 63 74 20 63 6f 6e 66 69  eat(struct confi
1580: 67 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  g *);.void Confi
1590: 67 6c 69 73 74 5f 72 65 73 65 74 28 76 6f 69 64  glist_reset(void
15a0: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  );../********* F
15b0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 65 72  rom the file "er
15c0: 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ror.h" *********
15d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
15f0: 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f  void ErrorMsg(co
1600: 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c  nst char *, int,
1610: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 2e 2e  const char *, ..
1620: 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 20 46 72 6f  .);../****** Fro
1630: 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69  m the file "opti
1640: 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on.h" **********
1650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1670: 2f 0a 65 6e 75 6d 20 6f 70 74 69 6f 6e 5f 74 79  /.enum option_ty
1680: 70 65 20 7b 20 4f 50 54 5f 46 4c 41 47 3d 31 2c  pe { OPT_FLAG=1,
1690: 20 20 4f 50 54 5f 49 4e 54 2c 20 20 4f 50 54 5f    OPT_INT,  OPT_
16a0: 44 42 4c 2c 20 20 4f 50 54 5f 53 54 52 2c 0a 20  DBL,  OPT_STR,. 
16b0: 20 20 20 20 20 20 20 20 4f 50 54 5f 46 46 4c 41          OPT_FFLA
16c0: 47 2c 20 4f 50 54 5f 46 49 4e 54 2c 20 4f 50 54  G, OPT_FINT, OPT
16d0: 5f 46 44 42 4c 2c 20 4f 50 54 5f 46 53 54 52 7d  _FDBL, OPT_FSTR}
16e0: 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  ;.struct s_optio
16f0: 6e 73 20 7b 0a 20 20 65 6e 75 6d 20 6f 70 74 69  ns {.  enum opti
1700: 6f 6e 5f 74 79 70 65 20 74 79 70 65 3b 0a 20 20  on_type type;.  
1710: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 61 62 65  const char *labe
1720: 6c 3b 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 0a  l;.  char *arg;.
1730: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 65    const char *me
1740: 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e 74 20 20 20  ssage;.};.int   
1750: 20 4f 70 74 49 6e 69 74 28 63 68 61 72 2a 2a 2c   OptInit(char**,
1760: 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73  struct s_options
1770: 2a 2c 46 49 4c 45 2a 29 3b 0a 69 6e 74 20 20 20  *,FILE*);.int   
1780: 20 4f 70 74 4e 41 72 67 73 28 76 6f 69 64 29 3b   OptNArgs(void);
1790: 0a 63 68 61 72 20 20 2a 4f 70 74 41 72 67 28 69  .char  *OptArg(i
17a0: 6e 74 29 3b 0a 76 6f 69 64 20 20 20 4f 70 74 45  nt);.void   OptE
17b0: 72 72 28 69 6e 74 29 3b 0a 76 6f 69 64 20 20 20  rr(int);.void   
17c0: 4f 70 74 50 72 69 6e 74 28 76 6f 69 64 29 3b 0a  OptPrint(void);.
17d0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ./******** From 
17e0: 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e  the file "parse.
17f0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
1800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1820: 69 64 20 50 61 72 73 65 28 73 74 72 75 63 74 20  id Parse(struct 
1830: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 3b 0a 0a 2f  lemon *lemp);../
1840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
1850: 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 68  he file "plink.h
1860: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
1870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63  *********/.struc
1890: 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e  t plink *Plink_n
18a0: 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 50  ew(void);.void P
18b0: 6c 69 6e 6b 5f 61 64 64 28 73 74 72 75 63 74 20  link_add(struct 
18c0: 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63 74  plink **, struct
18d0: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64   config *);.void
18e0: 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74 72 75   Plink_copy(stru
18f0: 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72  ct plink **, str
1900: 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b 0a 76 6f  uct plink *);.vo
1910: 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28  id Plink_delete(
1920: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b  struct plink *);
1930: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
1940: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70  om the file "rep
1950: 6f 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ort.h" *********
1960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1980: 69 64 20 52 65 70 72 69 6e 74 28 73 74 72 75 63  id Reprint(struc
1990: 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64  t lemon *);.void
19a0: 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 73 74   ReportOutput(st
19b0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76  ruct lemon *);.v
19c0: 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28  oid ReportTable(
19d0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20  struct lemon *, 
19e0: 69 6e 74 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72  int);.void Repor
19f0: 74 48 65 61 64 65 72 28 73 74 72 75 63 74 20 6c  tHeader(struct l
1a00: 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 43 6f  emon *);.void Co
1a10: 6d 70 72 65 73 73 54 61 62 6c 65 73 28 73 74 72  mpressTables(str
1a20: 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f  uct lemon *);.vo
1a30: 69 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28  id ResortStates(
1a40: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b  struct lemon *);
1a50: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
1a60: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 65 74  om the file "set
1a70: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1aa0: 69 64 20 20 53 65 74 53 69 7a 65 28 69 6e 74 29  id  SetSize(int)
1ab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ac0: 20 41 6c 6c 20 73 65 74 73 20 77 69 6c 6c 20 62   All sets will b
1ad0: 65 20 6f 66 20 73 69 7a 65 20 4e 20 2a 2f 0a 63  e of size N */.c
1ae0: 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f 69 64  har *SetNew(void
1af0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1b00: 20 2f 2a 20 41 20 6e 65 77 20 73 65 74 20 66 6f   /* A new set fo
1b10: 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e 4e 20 2a  r element 0..N *
1b20: 2f 0a 76 6f 69 64 20 20 53 65 74 46 72 65 65 28  /.void  SetFree(
1b30: 63 68 61 72 2a 29 3b 20 20 20 20 20 20 20 20 20  char*);         
1b40: 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74      /* Deallocat
1b50: 65 20 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53  e a set */.int S
1b60: 65 74 41 64 64 28 63 68 61 72 2a 2c 69 6e 74 29  etAdd(char*,int)
1b70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b80: 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f 20 61  Add element to a
1b90: 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65 74 55   set */.int SetU
1ba0: 6e 69 6f 6e 28 63 68 61 72 20 2a 2c 63 68 61 72  nion(char *,char
1bb0: 20 2a 29 3b 20 20 20 20 2f 2a 20 41 20 3c 2d 20   *);    /* A <- 
1bc0: 41 20 55 20 42 2c 20 74 68 72 75 20 65 6c 65 6d  A U B, thru elem
1bd0: 65 6e 74 20 4e 20 2a 2f 0a 23 64 65 66 69 6e 65  ent N */.#define
1be0: 20 53 65 74 46 69 6e 64 28 58 2c 59 29 20 28 58   SetFind(X,Y) (X
1bf0: 5b 59 5d 29 20 20 20 20 20 20 20 2f 2a 20 54 72  [Y])       /* Tr
1c00: 75 65 20 69 66 20 59 20 69 73 20 69 6e 20 73 65  ue if Y is in se
1c10: 74 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  t X */../*******
1c20: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1c30: 65 20 22 73 74 72 75 63 74 2e 68 22 20 2a 2a 2a  e "struct.h" ***
1c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c60: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 63 69  **/./*.** Princi
1c70: 70 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  pal data structu
1c80: 72 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f  res for the LEMO
1c90: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
1ca0: 6f 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20  or..*/..typedef 
1cb0: 65 6e 75 6d 20 7b 4c 45 4d 4f 4e 5f 46 41 4c 53  enum {LEMON_FALS
1cc0: 45 3d 30 2c 20 4c 45 4d 4f 4e 5f 54 52 55 45 7d  E=0, LEMON_TRUE}
1cd0: 20 42 6f 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20 53 79   Boolean;../* Sy
1ce0: 6d 62 6f 6c 73 20 28 74 65 72 6d 69 6e 61 6c 73  mbols (terminals
1cf0: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
1d00: 73 29 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  s) of the gramma
1d10: 72 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20  r are stored.** 
1d20: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1d30: 3a 20 2a 2f 0a 65 6e 75 6d 20 73 79 6d 62 6f 6c  : */.enum symbol
1d40: 5f 74 79 70 65 20 7b 0a 20 20 54 45 52 4d 49 4e  _type {.  TERMIN
1d50: 41 4c 2c 0a 20 20 4e 4f 4e 54 45 52 4d 49 4e 41  AL,.  NONTERMINA
1d60: 4c 2c 0a 20 20 4d 55 4c 54 49 54 45 52 4d 49 4e  L,.  MULTITERMIN
1d70: 41 4c 0a 7d 3b 0a 65 6e 75 6d 20 65 5f 61 73 73  AL.};.enum e_ass
1d80: 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c 0a 20  oc {.    LEFT,. 
1d90: 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20 4e 4f     RIGHT,.    NO
1da0: 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 7d 3b 0a 73  NE,.    UNK.};.s
1db0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 7b 0a 20  truct symbol {. 
1dc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d   const char *nam
1dd0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  e;        /* Nam
1de0: 65 20 6f 66 20 74 68 65 20 73 79 6d 62 6f 6c 20  e of the symbol 
1df0: 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20  */.  int index; 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e10: 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f   Index number fo
1e20: 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f  r this symbol */
1e30: 0a 20 20 65 6e 75 6d 20 73 79 6d 62 6f 6c 5f 74  .  enum symbol_t
1e40: 79 70 65 20 74 79 70 65 3b 20 20 20 2f 2a 20 53  ype type;   /* S
1e50: 79 6d 62 6f 6c 73 20 61 72 65 20 61 6c 6c 20 65  ymbols are all e
1e60: 69 74 68 65 72 20 54 45 52 4d 49 4e 41 4c 53 20  ither TERMINALS 
1e70: 6f 72 20 4e 54 73 20 2a 2f 0a 20 20 73 74 72 75  or NTs */.  stru
1e80: 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20  ct rule *rule;  
1e90: 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c       /* Linked l
1ea0: 69 73 74 20 6f 66 20 72 75 6c 65 73 20 6f 66 20  ist of rules of 
1eb0: 74 68 69 73 20 28 69 66 20 61 6e 20 4e 54 29 20  this (if an NT) 
1ec0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
1ed0: 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 2f 2a  ol *fallback; /*
1ee0: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20   fallback token 
1ef0: 69 6e 20 63 61 73 65 20 74 68 69 73 20 74 6f 6b  in case this tok
1f00: 65 6e 20 64 6f 65 73 6e 27 74 20 70 61 72 73 65  en doesn't parse
1f10: 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63 3b 20   */.  int prec; 
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f30: 2a 20 50 72 65 63 65 64 65 6e 63 65 20 69 66 20  * Precedence if 
1f40: 64 65 66 69 6e 65 64 20 28 2d 31 20 6f 74 68 65  defined (-1 othe
1f50: 72 77 69 73 65 29 20 2a 2f 0a 20 20 65 6e 75 6d  rwise) */.  enum
1f60: 20 65 5f 61 73 73 6f 63 20 61 73 73 6f 63 3b 20   e_assoc assoc; 
1f70: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
1f80: 69 76 69 74 79 20 69 66 20 70 72 65 63 65 64 65  ivity if precede
1f90: 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64 20 2a  nce is defined *
1fa0: 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73 74 73  /.  char *firsts
1fb0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
1fc0: 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20 61 6c  First-set for al
1fd0: 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73 20  l rules of this 
1fe0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f 6f 6c  symbol */.  Bool
1ff0: 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20 20 20  ean lambda;     
2000: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2010: 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e 65 72  NT and can gener
2020: 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72  ate an empty str
2030: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ing */.  int use
2040: 43 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cnt;            
2050: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2060: 69 6d 65 73 20 75 73 65 64 20 2a 2f 0a 20 20 63  imes used */.  c
2070: 68 61 72 20 2a 64 65 73 74 72 75 63 74 6f 72 3b  har *destructor;
2080: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2090: 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
20a0: 68 65 6e 65 76 65 72 20 74 68 69 73 20 73 79 6d  henever this sym
20b0: 62 6f 6c 20 69 73 0a 20 20 20 20 20 20 20 20 20  bol is.         
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 2a 2a 20 70 6f 70 70 65 64 20 66 72 6f 6d    ** popped from
20e0: 20 74 68 65 20 73 74 61 63 6b 20 64 75 72 69 6e   the stack durin
20f0: 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73 73 69  g error processi
2100: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  ng */.  int dest
2110: 4c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20  Lineno;         
2120: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
2130: 66 6f 72 20 73 74 61 72 74 20 6f 66 20 64 65 73  for start of des
2140: 74 72 75 63 74 6f 72 2e 20 20 53 65 74 20 74 6f  tructor.  Set to
2150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2160: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 2d              ** -
2170: 31 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  1 for duplicate 
2180: 64 65 73 74 72 75 63 74 6f 72 73 2e 20 2a 2f 0a  destructors. */.
2190: 20 20 63 68 61 72 20 2a 64 61 74 61 74 79 70 65    char *datatype
21a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
21b0: 65 20 64 61 74 61 20 74 79 70 65 20 6f 66 20 69  e data type of i
21c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c 64 20  nformation held 
21d0: 62 79 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  by this.        
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e     ** object. On
2200: 6c 79 20 75 73 65 64 20 69 66 20 74 79 70 65 3d  ly used if type=
2210: 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a  =NONTERMINAL */.
2220: 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20 20 20    int dtnum;    
2230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2240: 65 20 64 61 74 61 20 74 79 70 65 20 6e 75 6d 62  e data type numb
2250: 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61 72 73  er.  In the pars
2260: 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a 20 20  er, the value.  
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 63           ** stac
2290: 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20 20 54  k is a union.  T
22a0: 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65 6e 74  he .yy%d element
22b0: 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20 20 20   of this.       
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69 73 20      ** union is 
22e0: 74 68 65 20 63 6f 72 72 65 63 74 20 64 61 74 61  the correct data
22f0: 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20 6f   type for this o
2300: 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a 20 54 68  bject */.  /* Th
2310: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
2320: 64 73 20 61 72 65 20 75 73 65 64 20 62 79 20 4d  ds are used by M
2330: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73 20 6f 6e  ULTITERMINALs on
2340: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 75 62  ly */.  int nsub
2350: 73 79 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sym;            
2360: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
2370: 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c  nstituent symbol
2380: 73 20 69 6e 20 74 68 65 20 4d 55 4c 54 49 20 2a  s in the MULTI *
2390: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
23a0: 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20 2f 2a 20  l **subsym;  /* 
23b0: 41 72 72 61 79 20 6f 66 20 63 6f 6e 73 74 69 74  Array of constit
23c0: 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  uent symbols */.
23d0: 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64  };../* Each prod
23e0: 75 63 74 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74  uction rule in t
23f0: 68 65 20 67 72 61 6d 6d 61 72 20 69 73 20 73 74  he grammar is st
2400: 6f 72 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ored in the foll
2410: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
2420: 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63 74 20 72  re.  */.struct r
2430: 75 6c 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ule {.  struct s
2440: 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20  ymbol *lhs;     
2450: 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69   /* Left-hand si
2460: 64 65 20 6f 66 20 74 68 65 20 72 75 6c 65 20 2a  de of the rule *
2470: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2480: 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 2f 2a 20  lhsalias;    /* 
2490: 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48  Alias for the LH
24a0: 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29  S (NULL if none)
24b0: 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73 53 74 61   */.  int lhsSta
24c0: 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rt;            /
24d0: 2a 20 54 72 75 65 20 69 66 20 6c 65 66 74 2d 68  * True if left-h
24e0: 61 6e 64 20 73 69 64 65 20 69 73 20 74 68 65 20  and side is the 
24f0: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a  start symbol */.
2500: 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20    int ruleline; 
2510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2520: 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ne number for th
2530: 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e rule */.  int 
2540: 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  nrhs;           
2550: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2560: 66 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f  f RHS symbols */
2570: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
2580: 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20 54   **rhs;     /* T
2590: 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  he RHS symbols *
25a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
25b0: 2a 72 68 73 61 6c 69 61 73 3b 20 20 20 2f 2a 20  *rhsalias;   /* 
25c0: 41 6e 20 61 6c 69 61 73 20 66 6f 72 20 65 61 63  An alias for eac
25d0: 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55  h RHS symbol (NU
25e0: 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20  LL if none) */. 
25f0: 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20 20   int line;      
2600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
2610: 65 20 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63  e number at whic
2620: 68 20 63 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f  h code begins */
2630: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  .  const char *c
2640: 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ode;        /* T
2650: 68 65 20 63 6f 64 65 20 65 78 65 63 75 74 65 64  he code executed
2660: 20 77 68 65 6e 20 74 68 69 73 20 72 75 6c 65 20   when this rule 
2670: 69 73 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20  is reduced */.  
2680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65  const char *code
2690: 50 72 65 66 69 78 3b 20 20 2f 2a 20 53 65 74 75  Prefix;  /* Setu
26a0: 70 20 63 6f 64 65 20 62 65 66 6f 72 65 20 63 6f  p code before co
26b0: 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f 0a 20 20  de[] above */.  
26c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65  const char *code
26d0: 53 75 66 66 69 78 3b 20 20 2f 2a 20 42 72 65 61  Suffix;  /* Brea
26e0: 6b 64 6f 77 6e 20 63 6f 64 65 20 61 66 74 65 72  kdown code after
26f0: 20 63 6f 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f   code[] above */
2700: 0a 20 20 69 6e 74 20 6e 6f 43 6f 64 65 3b 20 20  .  int noCode;  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2720: 72 75 65 20 69 66 20 74 68 69 73 20 72 75 6c 65  rue if this rule
2730: 20 68 61 73 20 6e 6f 20 61 73 73 6f 63 69 61 74   has no associat
2740: 65 64 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 69  ed C code */.  i
2750: 6e 74 20 63 6f 64 65 45 6d 69 74 74 65 64 3b 20  nt codeEmitted; 
2760: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2770: 69 66 20 74 68 65 20 63 6f 64 65 20 68 61 73 20  if the code has 
2780: 62 65 65 6e 20 65 6d 69 74 74 65 64 20 61 6c 72  been emitted alr
2790: 65 61 64 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  eady */.  struct
27a0: 20 73 79 6d 62 6f 6c 20 2a 70 72 65 63 73 79 6d   symbol *precsym
27b0: 3b 20 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65  ;  /* Precedence
27c0: 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 69 73   symbol for this
27d0: 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   rule */.  int i
27e0: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
27f0: 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
2800: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
2810: 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  rule */.  int iR
2820: 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ule;            
2830: 20 20 20 2f 2a 20 52 75 6c 65 20 6e 75 6d 62 65     /* Rule numbe
2840: 72 20 61 73 20 75 73 65 64 20 69 6e 20 74 68 65  r as used in the
2850: 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
2860: 73 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 63  s */.  Boolean c
2870: 61 6e 52 65 64 75 63 65 3b 20 20 20 20 20 20 20  anReduce;       
2880: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2890: 72 75 6c 65 20 69 73 20 65 76 65 72 20 72 65 64  rule is ever red
28a0: 75 63 65 64 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61  uced */.  Boolea
28b0: 6e 20 64 6f 65 73 52 65 64 75 63 65 3b 20 20 20  n doesReduce;   
28c0: 20 20 20 2f 2a 20 52 65 64 75 63 65 20 61 63 74     /* Reduce act
28d0: 69 6f 6e 73 20 6f 63 63 75 72 20 61 66 74 65 72  ions occur after
28e0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f   optimization */
28f0: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
2900: 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e  nextlhs;    /* N
2910: 65 78 74 20 72 75 6c 65 20 77 69 74 68 20 74 68  ext rule with th
2920: 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20  e same LHS */.  
2930: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78  struct rule *nex
2940: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  t;       /* Next
2950: 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f   rule in the glo
2960: 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a  bal list */.};..
2970: 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72 61 74 69  /* A configurati
2980: 6f 6e 20 69 73 20 61 20 70 72 6f 64 75 63 74 69  on is a producti
2990: 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68 65 20 67  on rule of the g
29a0: 72 61 6d 6d 61 72 20 74 6f 67 65 74 68 65 72 20  rammar together 
29b0: 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28  with.** a mark (
29c0: 64 6f 74 29 20 73 68 6f 77 69 6e 67 20 68 6f 77  dot) showing how
29d0: 20 6d 75 63 68 20 6f 66 20 74 68 61 74 20 72 75   much of that ru
29e0: 6c 65 20 68 61 73 20 62 65 65 6e 20 70 72 6f 63  le has been proc
29f0: 65 73 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a  essed so far..**
2a00: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   Configurations 
2a10: 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66  also contain a f
2a20: 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63 68 20  ollow-set which 
2a30: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 65 72  is a list of ter
2a40: 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73  minal.** symbols
2a50: 20 77 68 69 63 68 20 61 72 65 20 61 6c 6c 6f 77   which are allow
2a60: 65 64 20 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c  ed to immediatel
2a70: 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64  y follow the end
2a80: 20 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a   of the rule..**
2a90: 20 45 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61   Every configura
2aa0: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
2ab0: 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   as an instance 
2ac0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2ad0: 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67 73 74 61  : */.enum cfgsta
2ae0: 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c 45 54 45  tus {.  COMPLETE
2af0: 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54 45 0a 7d  ,.  INCOMPLETE.}
2b00: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
2b10: 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  {.  struct rule 
2b20: 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  *rp;         /* 
2b30: 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77 68  The rule upon wh
2b40: 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ich the configur
2b50: 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20 2a  ation is based *
2b60: 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20 20  /.  int dot;    
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b80: 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74 20  The parse point 
2b90: 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b 20  */.  char *fws; 
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bb0: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 20   Follow-set for 
2bc0: 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  this configurati
2bd0: 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  on only */.  str
2be0: 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b  uct plink *fplp;
2bf0: 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d        /* Follow-
2c00: 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f 70  set forward prop
2c10: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f  agation links */
2c20: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
2c30: 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46  *bplp;      /* F
2c40: 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77 61  ollow-set backwa
2c50: 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  rds propagation 
2c60: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63  links */.  struc
2c70: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20  t state *stp;   
2c80: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2c90: 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63 6f  o state which co
2ca0: 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a 20  ntains this */. 
2cb0: 20 65 6e 75 6d 20 63 66 67 73 74 61 74 75 73 20   enum cfgstatus 
2cc0: 73 74 61 74 75 73 3b 20 20 20 2f 2a 20 75 73 65  status;   /* use
2cd0: 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f 77 73  d during follows
2ce0: 65 74 20 61 6e 64 20 73 68 69 66 74 20 63 6f 6d  et and shift com
2cf0: 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  putations */.  s
2d00: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
2d10: 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  xt;     /* Next 
2d20: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e  configuration in
2d30: 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a 20 20   the state */.  
2d40: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
2d50: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
2d60: 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e 66 69  next basis confi
2d70: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a  guration */.};..
2d80: 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 7b 0a  enum e_action {.
2d90: 20 20 53 48 49 46 54 2c 0a 20 20 41 43 43 45 50    SHIFT,.  ACCEP
2da0: 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a 20 20 45  T,.  REDUCE,.  E
2db0: 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e 46 4c 49  RROR,.  SSCONFLI
2dc0: 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CT,             
2dd0: 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68 69 66   /* A shift/shif
2de0: 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  t conflict */.  
2df0: 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20  SRCONFLICT,     
2e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20           /* Was 
2e10: 61 20 72 65 64 75 63 65 2c 20 62 75 74 20 70 61  a reduce, but pa
2e20: 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63 74  rt of a conflict
2e30: 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c 49 43 54   */.  RRCONFLICT
2e40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2e50: 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c 20  * Was a reduce, 
2e60: 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  but part of a co
2e70: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 48 5f 52  nflict */.  SH_R
2e80: 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20  ESOLVED,        
2e90: 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 73 68       /* Was a sh
2ea0: 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e 63 65  ift.  Precedence
2eb0: 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69   resolved confli
2ec0: 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45 53 4f 4c  ct */.  RD_RESOL
2ed0: 56 45 44 2c 20 20 20 20 20 20 20 20 20 20 20 20  VED,            
2ee0: 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65 2e 20   /* Was reduce. 
2ef0: 20 50 72 65 63 65 64 65 6e 63 65 20 72 65 73 6f   Precedence reso
2f00: 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  lved conflict */
2f10: 0a 20 20 4e 4f 54 5f 55 53 45 44 2c 20 20 20 20  .  NOT_USED,    
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2f30: 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70 72 65  eleted by compre
2f40: 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 48 49 46 54  ssion */.  SHIFT
2f50: 52 45 44 55 43 45 20 20 20 20 20 20 20 20 20 20  REDUCE          
2f60: 20 20 20 20 2f 2a 20 53 68 69 66 74 20 66 69 72      /* Shift fir
2f70: 73 74 2c 20 74 68 65 6e 20 72 65 64 75 63 65 20  st, then reduce 
2f80: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79 20  */.};../* Every 
2f90: 73 68 69 66 74 20 6f 72 20 72 65 64 75 63 65 20  shift or reduce 
2fa0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 74 6f  operation is sto
2fb0: 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20 74 68  red as one of th
2fc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
2fd0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a 20  truct action {. 
2fe0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
2ff0: 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  sp;       /* The
3000: 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d 62   look-ahead symb
3010: 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61  ol */.  enum e_a
3020: 63 74 69 6f 6e 20 74 79 70 65 3b 0a 20 20 75 6e  ction type;.  un
3030: 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75 63 74  ion {.    struct
3040: 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 20   state *stp;    
3050: 20 2f 2a 20 54 68 65 20 6e 65 77 20 73 74 61 74   /* The new stat
3060: 65 2c 20 69 66 20 61 20 73 68 69 66 74 20 2a 2f  e, if a shift */
3070: 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65  .    struct rule
3080: 20 2a 72 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *rp;       /* T
3090: 68 65 20 72 75 6c 65 2c 20 69 66 20 61 20 72 65  he rule, if a re
30a0: 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a 20  duce */.  } x;. 
30b0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
30c0: 73 70 4f 70 74 3b 20 20 20 20 2f 2a 20 53 48 49  spOpt;    /* SHI
30d0: 46 54 52 45 44 55 43 45 20 6f 70 74 69 6d 69 7a  FTREDUCE optimiz
30e0: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 73 79  ation to this sy
30f0: 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74  mbol */.  struct
3100: 20 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20   action *next;  
3110: 20 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f     /* Next actio
3120: 6e 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  n for this state
3130: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74   */.  struct act
3140: 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f  ion *collide;  /
3150: 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69  * Next action wi
3160: 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
3170: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20   */.};../* Each 
3180: 73 74 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e  state of the gen
3190: 65 72 61 74 65 64 20 70 61 72 73 65 72 27 73 20  erated parser's 
31a0: 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63  finite state mac
31b0: 68 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64  hine.** is encod
31c0: 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63  ed as an instanc
31d0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
31e0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ng structure. */
31f0: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a  .struct state {.
3200: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
3210: 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *bp;       /* Th
3220: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
3230: 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20  ations for this 
3240: 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  state */.  struc
3250: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20  t config *cfp;  
3260: 20 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69      /* All confi
3270: 67 75 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  gurations in thi
3280: 73 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73  s set */.  int s
3290: 74 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20  tatenum;        
32a0: 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 74 69 61      /* Sequentia
32b0: 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  l number for thi
32c0: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  s state */.  str
32d0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20  uct action *ap; 
32e0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
32f0: 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69   actions for thi
3300: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  s state */.  int
3310: 20 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63 74   nTknAct, nNtAct
3320: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
3330: 6f 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74 65  of actions on te
3340: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74  rminals and nont
3350: 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e  erminals */.  in
3360: 74 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74 4f  t iTknOfst, iNtO
3370: 66 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63 74  fst;   /* yy_act
3380: 69 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f 72  ion[] offset for
3390: 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e   terminals and n
33a0: 6f 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  onterms */.  int
33b0: 20 69 44 66 6c 74 52 65 64 75 63 65 3b 20 20 20   iDfltReduce;   
33c0: 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74        /* Default
33d0: 20 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 52 45   action is to RE
33e0: 44 55 43 45 20 62 79 20 74 68 69 73 20 72 75 6c  DUCE by this rul
33f0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  e */.  struct ru
3400: 6c 65 20 2a 70 44 66 6c 74 52 65 64 75 63 65 3b  le *pDfltReduce;
3410: 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 52  /* The default R
3420: 45 44 55 43 45 20 72 75 6c 65 2e 20 2a 2f 0a 20  EDUCE rule. */. 
3430: 20 69 6e 74 20 61 75 74 6f 52 65 64 75 63 65 3b   int autoReduce;
3440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3450: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
3460: 61 75 74 6f 2d 72 65 64 75 63 65 20 73 74 61 74  auto-reduce stat
3470: 65 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20  e */.};.#define 
3480: 4e 4f 5f 4f 46 46 53 45 54 20 28 2d 32 31 34 37  NO_OFFSET (-2147
3490: 34 38 33 36 34 37 29 0a 0a 2f 2a 20 41 20 66 6f  483647)../* A fo
34a0: 6c 6c 6f 77 73 65 74 20 70 72 6f 70 61 67 61 74  llowset propagat
34b0: 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64 69 63 61 74  ion link indicat
34c0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
34d0: 65 6e 74 73 20 6f 66 20 6f 6e 65 0a 2a 2a 20 63  ents of one.** c
34e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f 6c  onfiguration fol
34f0: 6c 6f 77 73 65 74 20 73 68 6f 75 6c 64 20 62 65  lowset should be
3500: 20 70 72 6f 70 61 67 61 74 65 64 20 74 6f 20 61   propagated to a
3510: 6e 6f 74 68 65 72 20 77 68 65 6e 65 76 65 72 0a  nother whenever.
3520: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 68 61  ** the first cha
3530: 6e 67 65 73 2e 20 2a 2f 0a 73 74 72 75 63 74 20  nges. */.struct 
3540: 70 6c 69 6e 6b 20 7b 0a 20 20 73 74 72 75 63 74  plink {.  struct
3550: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 20   config *cfp;   
3560: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67     /* The config
3570: 75 72 61 74 69 6f 6e 20 74 6f 20 77 68 69 63 68  uration to which
3580: 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20 20 73 74 72   linked */.  str
3590: 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 3b  uct plink *next;
35a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
35b0: 74 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e 6b  t propagate link
35c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20 73   */.};../* The s
35d0: 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f 72 20  tate vector for 
35e0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 73 65  the entire parse
35f0: 72 20 67 65 6e 65 72 61 74 6f 72 20 69 73 20 72  r generator is r
3600: 65 63 6f 72 64 65 64 20 61 73 0a 2a 2a 20 66 6f  ecorded as.** fo
3610: 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d 4f 4e 20 75  llows.  (LEMON u
3620: 73 65 73 20 6e 6f 20 67 6c 6f 62 61 6c 20 76 61  ses no global va
3630: 72 69 61 62 6c 65 73 20 61 6e 64 20 6d 61 6b 65  riables and make
3640: 73 20 6c 69 74 74 6c 65 20 75 73 65 20 6f 66 0a  s little use of.
3650: 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69 61 62  ** static variab
3660: 6c 65 73 2e 20 20 46 69 65 6c 64 73 20 69 6e 20  les.  Fields in 
3670: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3680: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 74  ructure can be t
3690: 68 6f 75 67 68 74 0a 2a 2a 20 6f 66 20 61 73 20  hought.** of as 
36a0: 62 65 67 69 6e 20 67 6c 6f 62 61 6c 20 76 61 72  begin global var
36b0: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 72  iables in the pr
36c0: 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73 74 72 75 63  ogram.) */.struc
36d0: 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20 73 74 72 75  t lemon {.  stru
36e0: 63 74 20 73 74 61 74 65 20 2a 2a 73 6f 72 74 65  ct state **sorte
36f0: 64 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 66  d;   /* Table of
3700: 20 73 74 61 74 65 73 20 73 6f 72 74 65 64 20 62   states sorted b
3710: 79 20 73 74 61 74 65 20 6e 75 6d 62 65 72 20 2a  y state number *
3720: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
3730: 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  *rule;       /* 
3740: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 72 75 6c 65  List of all rule
3750: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  s */.  struct ru
3760: 6c 65 20 2a 73 74 61 72 74 52 75 6c 65 3b 20 20  le *startRule;  
3770: 2f 2a 20 46 69 72 73 74 20 72 75 6c 65 20 2a 2f  /* First rule */
3780: 0a 20 20 69 6e 74 20 6e 73 74 61 74 65 3b 20 20  .  int nstate;  
3790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37a0: 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 73 20  umber of states 
37b0: 2a 2f 0a 20 20 69 6e 74 20 6e 78 73 74 61 74 65  */.  int nxstate
37c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
37d0: 20 6e 73 74 61 74 65 20 77 69 74 68 20 74 61 69   nstate with tai
37e0: 6c 20 64 65 67 65 6e 65 72 61 74 65 20 73 74 61  l degenerate sta
37f0: 74 65 73 20 72 65 6d 6f 76 65 64 20 2a 2f 0a 20  tes removed */. 
3800: 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20 20   int nrule;     
3810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3820: 62 65 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a  ber of rules */.
3830: 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20    int nsymbol;  
3840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3850: 6d 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c  mber of terminal
3860: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
3870: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e   symbols */.  in
3880: 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20  t nterminal;    
3890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
38a0: 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d   of terminal sym
38b0: 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  bols */.  struct
38c0: 20 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c   symbol **symbol
38d0: 73 3b 20 2f 2a 20 53 6f 72 74 65 64 20 61 72 72  s; /* Sorted arr
38e0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  ay of pointers t
38f0: 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69  o symbols */.  i
3900: 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20  nt errorcnt;    
3910: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3920: 72 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  r of errors */. 
3930: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
3940: 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65  errsym;   /* The
3950: 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f   error symbol */
3960: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
3970: 20 2a 77 69 6c 64 63 61 72 64 3b 20 2f 2a 20 54   *wildcard; /* T
3980: 6f 6b 65 6e 20 74 68 61 74 20 6d 61 74 63 68 65  oken that matche
3990: 73 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  s anything */.  
39a0: 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20  char *name;     
39b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
39c0: 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
39d0: 64 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68  d parser */.  ch
39e0: 61 72 20 2a 61 72 67 3b 20 20 20 20 20 20 20 20  ar *arg;        
39f0: 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6c 61 72         /* Declar
3a00: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 33 74 68  ation of the 3th
3a10: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 72   argument to par
3a20: 73 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74  ser */.  char *t
3a30: 6f 6b 65 6e 74 79 70 65 3b 20 20 20 20 20 20 20  okentype;       
3a40: 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 72    /* Type of ter
3a50: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e  minal symbols in
3a60: 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61 63   the parser stac
3a70: 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 76 61 72  k */.  char *var
3a80: 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  type;           
3a90: 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 74  /* The default t
3aa0: 79 70 65 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69  ype of non-termi
3ab0: 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  nal symbols */. 
3ac0: 20 63 68 61 72 20 2a 73 74 61 72 74 3b 20 20 20   char *start;   
3ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
3ae0: 65 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 73  e of the start s
3af0: 79 6d 62 6f 6c 20 66 6f 72 20 74 68 65 20 67 72  ymbol for the gr
3b00: 61 6d 6d 61 72 20 2a 2f 0a 20 20 63 68 61 72 20  ammar */.  char 
3b10: 2a 73 74 61 63 6b 73 69 7a 65 3b 20 20 20 20 20  *stacksize;     
3b20: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
3b30: 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20  he parser stack 
3b40: 2a 2f 0a 20 20 63 68 61 72 20 2a 69 6e 63 6c 75  */.  char *inclu
3b50: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
3b60: 20 43 6f 64 65 20 74 6f 20 70 75 74 20 61 74 20   Code to put at 
3b70: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
3b80: 20 43 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61   C file */.  cha
3b90: 72 20 2a 65 72 72 6f 72 3b 20 20 20 20 20 20 20  r *error;       
3ba0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
3bb0: 20 65 78 65 63 75 74 65 20 77 68 65 6e 20 61 6e   execute when an
3bc0: 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 2a   error is seen *
3bd0: 2f 0a 20 20 63 68 61 72 20 2a 6f 76 65 72 66 6c  /.  char *overfl
3be0: 6f 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ow;          /* 
3bf0: 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20  Code to execute 
3c00: 6f 6e 20 61 20 73 74 61 63 6b 20 6f 76 65 72 66  on a stack overf
3c10: 6c 6f 77 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66  low */.  char *f
3c20: 61 69 6c 75 72 65 3b 20 20 20 20 20 20 20 20 20  ailure;         
3c30: 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65    /* Code to exe
3c40: 63 75 74 65 20 6f 6e 20 70 61 72 73 65 72 20 66  cute on parser f
3c50: 61 69 6c 75 72 65 20 2a 2f 0a 20 20 63 68 61 72  ailure */.  char
3c60: 20 2a 61 63 63 65 70 74 3b 20 20 20 20 20 20 20   *accept;       
3c70: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
3c80: 65 78 65 63 75 74 65 20 77 68 65 6e 20 74 68 65  execute when the
3c90: 20 70 61 72 73 65 72 20 65 78 63 65 70 74 73 20   parser excepts 
3ca0: 2a 2f 0a 20 20 63 68 61 72 20 2a 65 78 74 72 61  */.  char *extra
3cb0: 63 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  code;         /*
3cc0: 20 43 6f 64 65 20 61 70 70 65 6e 64 65 64 20 74   Code appended t
3cd0: 6f 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  o the generated 
3ce0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
3cf0: 74 6f 6b 65 6e 64 65 73 74 3b 20 20 20 20 20 20  tokendest;      
3d00: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
3d10: 65 63 75 74 65 20 74 6f 20 64 65 73 74 72 6f 79  ecute to destroy
3d20: 20 74 6f 6b 65 6e 20 64 61 74 61 20 2a 2f 0a 20   token data */. 
3d30: 20 63 68 61 72 20 2a 76 61 72 64 65 73 74 3b 20   char *vardest; 
3d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64            /* Cod
3d50: 65 20 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c  e for the defaul
3d60: 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64  t non-terminal d
3d70: 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63  estructor */.  c
3d80: 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20  har *filename;  
3d90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
3da0: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
3db0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74  e */.  char *out
3dc0: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
3dd0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
3de0: 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 66 69  urrent output fi
3df0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  le */.  char *to
3e00: 6b 65 6e 70 72 65 66 69 78 3b 20 20 20 20 20 20  kenprefix;      
3e10: 20 2f 2a 20 41 20 70 72 65 66 69 78 20 61 64 64   /* A prefix add
3e20: 65 64 20 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65  ed to token name
3e30: 73 20 69 6e 20 74 68 65 20 2e 68 20 66 69 6c 65  s in the .h file
3e40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c   */.  int nconfl
3e50: 69 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ict;           /
3e60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 73  * Number of pars
3e70: 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f  ing conflicts */
3e80: 0a 20 20 69 6e 74 20 6e 61 63 74 69 6f 6e 74 61  .  int nactionta
3e90: 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  b;          /* N
3ea0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3eb0: 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f   in the yy_actio
3ec0: 6e 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  n[] table */.  i
3ed0: 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b 20 20 20  nt tablesize;   
3ee0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
3ef0: 20 74 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61   table size of a
3f00: 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 62 79 74  ll tables in byt
3f10: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 69  es */.  int basi
3f20: 73 66 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20  sflag;          
3f30: 20 2f 2a 20 50 72 69 6e 74 20 6f 6e 6c 79 20 62   /* Print only b
3f40: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
3f50: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 68 61 73  ons */.  int has
3f60: 5f 66 61 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  _fallback;      
3f70: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
3f80: 20 25 66 61 6c 6c 62 61 63 6b 20 69 73 20 73 65   %fallback is se
3f90: 65 6e 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  en in the gramma
3fa0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 6c 69 6e  r */.  int nolin
3fb0: 65 6e 6f 73 66 6c 61 67 3b 20 20 20 20 20 20 20  enosflag;       
3fc0: 2f 2a 20 54 72 75 65 20 69 66 20 23 6c 69 6e 65  /* True if #line
3fd0: 20 73 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75   statements shou
3fe0: 6c 64 20 6e 6f 74 20 62 65 20 70 72 69 6e 74 65  ld not be printe
3ff0: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67  d */.  char *arg
4000: 76 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  v0;             
4010: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
4020: 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64  rogram */.};..#d
4030: 65 66 69 6e 65 20 4d 65 6d 6f 72 79 43 68 65 63  efine MemoryChec
4040: 6b 28 58 29 20 69 66 28 28 58 29 3d 3d 30 29 7b  k(X) if((X)==0){
4050: 20 5c 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64   \.  extern void
4060: 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b   memory_error();
4070: 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f   \.  memory_erro
4080: 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  r(); \.}../*****
4090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
40a0: 20 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65   the file "table
40b0: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
40c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
40d0: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c  *****/./*.** All
40e0: 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69   code in this fi
40f0: 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f  le has been auto
4100: 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61  matically genera
4110: 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70  ted.** from a sp
4120: 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74  ecification in t
4130: 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20  he file.**      
4140: 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71          "table.q
4150: 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f  ".** by the asso
4160: 63 69 61 74 69 76 65 20 61 72 72 61 79 20 63 6f  ciative array co
4170: 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67  de building prog
4180: 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20  ram "aagen"..** 
4190: 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73  Do not edit this
41a0: 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c   file!  Instead,
41b0: 20 65 64 69 74 20 74 68 65 20 73 70 65 63 69 66   edit the specif
41c0: 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c  ication.** file,
41d0: 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65   then rerun aage
41e0: 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  n..*/./*.** Code
41f0: 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
4200: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45  tables in the LE
4210: 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
4220: 61 74 6f 72 2e 0a 2a 2f 0a 2f 2a 20 52 6f 75 74  ator..*/./* Rout
4230: 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e  ines for handlin
4240: 67 20 61 20 73 74 72 69 6e 67 73 20 2a 2f 0a 0a  g a strings */..
4250: 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73  const char *Strs
4260: 61 66 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  afe(const char *
4270: 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73 61 66 65  );..void Strsafe
4280: 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74  _init(void);.int
4290: 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28   Strsafe_insert(
42a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 63  const char *);.c
42b0: 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61  onst char *Strsa
42c0: 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68  fe_find(const ch
42d0: 61 72 20 2a 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69  ar *);../* Routi
42e0: 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67  nes for handling
42f0: 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20   symbols of the 
4300: 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75  grammar */..stru
4310: 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
4320: 6c 5f 6e 65 77 28 63 6f 6e 73 74 20 63 68 61 72  l_new(const char
4330: 20 2a 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 63   *);.int Symbolc
4340: 6d 70 70 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  mpp(const void *
4350: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b  , const void *);
4360: 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69  .void Symbol_ini
4370: 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53 79 6d  t(void);.int Sym
4380: 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72 75 63  bol_insert(struc
4390: 74 20 73 79 6d 62 6f 6c 20 2a 2c 20 63 6f 6e 73  t symbol *, cons
43a0: 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72 75 63  t char *);.struc
43b0: 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c  t symbol *Symbol
43c0: 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72  _find(const char
43d0: 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62   *);.struct symb
43e0: 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 69  ol *Symbol_Nth(i
43f0: 6e 74 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f  nt);.int Symbol_
4400: 63 6f 75 6e 74 28 76 6f 69 64 29 3b 0a 73 74 72  count(void);.str
4410: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d  uct symbol **Sym
4420: 62 6f 6c 5f 61 72 72 61 79 6f 66 28 76 6f 69 64  bol_arrayof(void
4430: 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20  );../* Routines 
4440: 74 6f 20 6d 61 6e 61 67 65 20 74 68 65 20 73 74  to manage the st
4450: 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e  ate table */..in
4460: 74 20 43 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73  t Configcmp(cons
4470: 74 20 63 68 61 72 20 2a 2c 20 63 6f 6e 73 74 20  t char *, const 
4480: 63 68 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20  char *);.struct 
4490: 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77  state *State_new
44a0: 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 53 74 61  (void);.void Sta
44b0: 74 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69  te_init(void);.i
44c0: 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28  nt State_insert(
44d0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2c 20  struct state *, 
44e0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
44f0: 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  ;.struct state *
4500: 53 74 61 74 65 5f 66 69 6e 64 28 73 74 72 75 63  State_find(struc
4510: 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72  t config *);.str
4520: 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74  uct state **Stat
4530: 65 5f 61 72 72 61 79 6f 66 28 76 6f 69 64 29 3b  e_arrayof(void);
4540: 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75 73  ../* Routines us
4550: 65 64 20 66 6f 72 20 65 66 66 69 63 69 65 6e 63  ed for efficienc
4560: 79 20 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74 5f  y in Configlist_
4570: 61 64 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f 6e  add */..void Con
4580: 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 76 6f  figtable_init(vo
4590: 69 64 29 3b 0a 69 6e 74 20 43 6f 6e 66 69 67 74  id);.int Configt
45a0: 61 62 6c 65 5f 69 6e 73 65 72 74 28 73 74 72 75  able_insert(stru
45b0: 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74  ct config *);.st
45c0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
45d0: 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74  figtable_find(st
45e0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a  ruct config *);.
45f0: 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65  void Configtable
4600: 5f 63 6c 65 61 72 28 69 6e 74 28 2a 29 28 73 74  _clear(int(*)(st
4610: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 29 3b  ruct config *));
4620: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
4630: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
4640: 69 6c 65 20 22 61 63 74 69 6f 6e 2e 63 22 20 2a  ile "action.c" *
4650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
4670: 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70  /*.** Routines p
4680: 72 6f 63 65 73 73 69 6e 67 20 70 61 72 73 65 72  rocessing parser
4690: 20 61 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20   actions in the 
46a0: 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
46b0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 41  erator..*/../* A
46c0: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
46d0: 72 73 65 72 20 61 63 74 69 6f 6e 20 2a 2f 0a 73  rser action */.s
46e0: 74 61 74 69 63 20 73 74 72 75 63 74 20 61 63 74  tatic struct act
46f0: 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77 28  ion *Action_new(
4700: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
4710: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 66  struct action *f
4720: 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 20 20 73  reelist = 0;.  s
4730: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65  truct action *ne
4740: 77 61 63 74 69 6f 6e 3b 0a 0a 20 20 69 66 28 20  waction;..  if( 
4750: 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
4760: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
4770: 74 20 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20  t amt = 100;.   
4780: 20 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72   freelist = (str
4790: 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 63 61 6c  uct action *)cal
47a0: 6c 6f 63 28 61 6d 74 2c 20 73 69 7a 65 6f 66 28  loc(amt, sizeof(
47b0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 29 29 3b  struct action));
47c0: 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c 69 73  .    if( freelis
47d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  t==0 ){.      fp
47e0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e  rintf(stderr,"Un
47f0: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
4800: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65   memory for a ne
4810: 77 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 2e  w parser action.
4820: 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
4830: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
4840: 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69  (i=0; i<amt-1; i
4850: 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e  ++) freelist[i].
4860: 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69 73 74  next = &freelist
4870: 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c  [i+1];.    freel
4880: 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20  ist[amt-1].next 
4890: 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 61 63  = 0;.  }.  newac
48a0: 74 69 6f 6e 20 3d 20 66 72 65 65 6c 69 73 74 3b  tion = freelist;
48b0: 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72  .  freelist = fr
48c0: 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20  eelist->next;.  
48d0: 72 65 74 75 72 6e 20 6e 65 77 61 63 74 69 6f 6e  return newaction
48e0: 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
48f0: 74 77 6f 20 61 63 74 69 6f 6e 73 20 66 6f 72 20  two actions for 
4900: 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
4910: 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
4920: 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20  ve, zero, or.** 
4930: 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
4940: 66 69 72 73 74 20 61 63 74 69 6f 6e 20 69 73 20  first action is 
4950: 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
4960: 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
4970: 74 68 61 6e 0a 2a 2a 20 74 68 65 20 66 69 72 73  than.** the firs
4980: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t.*/.static int 
4990: 61 63 74 69 6f 6e 63 6d 70 28 0a 20 20 73 74 72  actioncmp(.  str
49a0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 31 2c  uct action *ap1,
49b0: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
49c0: 20 2a 61 70 32 0a 29 7b 0a 20 20 69 6e 74 20 72   *ap2.){.  int r
49d0: 63 3b 0a 20 20 72 63 20 3d 20 61 70 31 2d 3e 73  c;.  rc = ap1->s
49e0: 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e  p->index - ap2->
49f0: 73 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28  sp->index;.  if(
4a00: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   rc==0 ){.    rc
4a10: 20 3d 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70   = (int)ap1->typ
4a20: 65 20 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79  e - (int)ap2->ty
4a30: 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  pe;.  }.  if( rc
4a40: 3d 3d 30 20 26 26 20 28 61 70 31 2d 3e 74 79 70  ==0 && (ap1->typ
4a50: 65 3d 3d 52 45 44 55 43 45 20 7c 7c 20 61 70 31  e==REDUCE || ap1
4a60: 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 52 45 44  ->type==SHIFTRED
4a70: 55 43 45 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  UCE) ){.    rc =
4a80: 20 61 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65   ap1->x.rp->inde
4a90: 78 20 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69  x - ap2->x.rp->i
4aa0: 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
4ab0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  rc==0 ){.    rc 
4ac0: 3d 20 28 69 6e 74 29 20 28 61 70 32 20 2d 20 61  = (int) (ap2 - a
4ad0: 70 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  p1);.  }.  retur
4ae0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74  n rc;.}../* Sort
4af0: 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20   parser actions 
4b00: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
4b10: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
4b20: 73 6f 72 74 28 0a 20 20 73 74 72 75 63 74 20 61  sort(.  struct a
4b30: 63 74 69 6f 6e 20 2a 61 70 0a 29 7b 0a 20 20 61  ction *ap.){.  a
4b40: 70 20 3d 20 28 73 74 72 75 63 74 20 61 63 74 69  p = (struct acti
4b50: 6f 6e 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72  on *)msort((char
4b60: 20 2a 29 61 70 2c 28 63 68 61 72 20 2a 2a 29 26   *)ap,(char **)&
4b70: 61 70 2d 3e 6e 65 78 74 2c 0a 20 20 20 20 20 20  ap->next,.      
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 20 20 20 20 20 20 20 20 28 69 6e 74 28 2a 29 28          (int(*)(
4ba0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
4bb0: 74 20 63 68 61 72 2a 29 29 61 63 74 69 6f 6e 63  t char*))actionc
4bc0: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 70  mp);.  return ap
4bd0: 3b 0a 7d 0a 0a 76 6f 69 64 20 41 63 74 69 6f 6e  ;.}..void Action
4be0: 5f 61 64 64 28 0a 20 20 73 74 72 75 63 74 20 61  _add(.  struct a
4bf0: 63 74 69 6f 6e 20 2a 2a 61 70 70 2c 0a 20 20 65  ction **app,.  e
4c00: 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79 70  num e_action typ
4c10: 65 2c 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  e,.  struct symb
4c20: 6f 6c 20 2a 73 70 2c 0a 20 20 63 68 61 72 20 2a  ol *sp,.  char *
4c30: 61 72 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  arg.){.  struct 
4c40: 61 63 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f  action *newactio
4c50: 6e 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d  n;.  newaction =
4c60: 20 41 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a 20   Action_new();. 
4c70: 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 6e 65 78 74   newaction->next
4c80: 20 3d 20 2a 61 70 70 3b 0a 20 20 2a 61 70 70 20   = *app;.  *app 
4c90: 3d 20 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e  = newaction;.  n
4ca0: 65 77 61 63 74 69 6f 6e 2d 3e 74 79 70 65 20 3d  ewaction->type =
4cb0: 20 74 79 70 65 3b 0a 20 20 6e 65 77 61 63 74 69   type;.  newacti
4cc0: 6f 6e 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 6e  on->sp = sp;.  n
4cd0: 65 77 61 63 74 69 6f 6e 2d 3e 73 70 4f 70 74 20  ewaction->spOpt 
4ce0: 3d 20 30 3b 0a 20 20 69 66 28 20 74 79 70 65 3d  = 0;.  if( type=
4cf0: 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 6e 65  =SHIFT ){.    ne
4d00: 77 61 63 74 69 6f 6e 2d 3e 78 2e 73 74 70 20 3d  waction->x.stp =
4d10: 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
4d20: 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )arg;.  }else{. 
4d30: 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78 2e     newaction->x.
4d40: 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c  rp = (struct rul
4d50: 65 20 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f  e *)arg;.  }.}./
4d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4d70: 2a 2a 2a 2a 2a 2a 20 4e 65 77 20 63 6f 64 65 20  ****** New code 
4d80: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
4d90: 20 22 61 63 74 74 61 62 22 20 6d 6f 64 75 6c 65   "acttab" module
4da0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a   ***********/./*
4db0: 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  .** This module 
4dc0: 69 6d 70 6c 65 6d 65 6e 74 73 20 72 6f 75 74 69  implements routi
4dd0: 6e 65 73 20 75 73 65 20 74 6f 20 63 6f 6e 73 74  nes use to const
4de0: 72 75 63 74 20 74 68 65 20 79 79 5f 61 63 74 69  ruct the yy_acti
4df0: 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a  on[] table..*/..
4e00: 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 20  /*.** The state 
4e10: 6f 66 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  of the yy_action
4e20: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
4e30: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6e 20  struction is an 
4e40: 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74  instance of.** t
4e50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
4e60: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
4e70: 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c  e yy_action tabl
4e80: 65 20 6d 61 70 73 20 74 68 65 20 70 61 69 72 20  e maps the pair 
4e90: 28 73 74 61 74 65 5f 6e 75 6d 62 65 72 2c 20 6c  (state_number, l
4ea0: 6f 6f 6b 61 68 65 61 64 29 20 69 6e 74 6f 20 61  ookahead) into a
4eb0: 6e 0a 2a 2a 20 61 63 74 69 6f 6e 5f 6e 75 6d 62  n.** action_numb
4ec0: 65 72 2e 20 20 54 68 65 20 74 61 62 6c 65 20 69  er.  The table i
4ed0: 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e  s an array of in
4ee0: 74 65 67 65 72 73 20 70 61 69 72 73 2e 20 20 54  tegers pairs.  T
4ef0: 68 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 0a  he state_number.
4f00: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 61 6e  ** determines an
4f10: 20 69 6e 69 74 69 61 6c 20 6f 66 66 73 65 74 20   initial offset 
4f20: 69 6e 74 6f 20 74 68 65 20 79 79 5f 61 63 74 69  into the yy_acti
4f30: 6f 6e 20 61 72 72 61 79 2e 20 20 54 68 65 20 6c  on array.  The l
4f40: 6f 6f 6b 61 68 65 61 64 0a 2a 2a 20 76 61 6c 75  ookahead.** valu
4f50: 65 20 69 73 20 74 68 65 6e 20 61 64 64 65 64 20  e is then added 
4f60: 74 6f 20 74 68 69 73 20 69 6e 69 74 69 61 6c 20  to this initial 
4f70: 6f 66 66 73 65 74 20 74 6f 20 67 65 74 20 61 6e  offset to get an
4f80: 20 69 6e 64 65 78 20 58 20 69 6e 74 6f 20 74 68   index X into th
4f90: 65 0a 2a 2a 20 79 79 5f 61 63 74 69 6f 6e 20 61  e.** yy_action a
4fa0: 72 72 61 79 2e 20 49 66 20 74 68 65 20 61 41 63  rray. If the aAc
4fb0: 74 69 6f 6e 5b 58 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[X].lookahea
4fc0: 64 20 65 71 75 61 6c 73 20 74 68 65 20 76 61 6c  d equals the val
4fd0: 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 66 20  ue of the.** of 
4fe0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e  the lookahead in
4ff0: 70 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  put, then the va
5000: 6c 75 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f  lue of the actio
5010: 6e 5f 6e 75 6d 62 65 72 20 6f 75 74 70 75 74 20  n_number output 
5020: 69 73 0a 2a 2a 20 61 41 63 74 69 6f 6e 5b 58 5d  is.** aAction[X]
5030: 2e 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  .action.  If the
5040: 20 6c 6f 6f 6b 61 68 65 61 64 73 20 64 6f 20 6e   lookaheads do n
5050: 6f 74 20 6d 61 74 63 68 20 74 68 65 6e 20 74 68  ot match then th
5060: 65 0a 2a 2a 20 64 65 66 61 75 6c 74 20 61 63 74  e.** default act
5070: 69 6f 6e 20 66 6f 72 20 74 68 65 20 73 74 61 74  ion for the stat
5080: 65 5f 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75  e_number is retu
5090: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  rned..**.** All 
50a0: 61 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  actions associat
50b0: 65 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ed with a single
50c0: 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 61 72   state_number ar
50d0: 65 20 66 69 72 73 74 20 65 6e 74 65 72 65 64 0a  e first entered.
50e0: 2a 2a 20 69 6e 74 6f 20 61 4c 6f 6f 6b 61 68 65  ** into aLookahe
50f0: 61 64 5b 5d 20 75 73 69 6e 67 20 6d 75 6c 74 69  ad[] using multi
5100: 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20 61 63 74  ple calls to act
5110: 74 61 62 5f 61 63 74 69 6f 6e 28 29 2e 20 20 54  tab_action().  T
5120: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 63 74 69  hen the .** acti
5130: 6f 6e 73 20 66 6f 72 20 74 68 61 74 20 73 69 6e  ons for that sin
5140: 67 6c 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72  gle state_number
5150: 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 74 6f   are placed into
5160: 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 0a   the aAction[] .
5170: 2a 2a 20 61 72 72 61 79 20 77 69 74 68 20 61 20  ** array with a 
5180: 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 61  single call to a
5190: 63 74 74 61 62 5f 69 6e 73 65 72 74 28 29 2e 20  cttab_insert(). 
51a0: 20 54 68 65 20 61 63 74 74 61 62 5f 69 6e 73 65   The acttab_inse
51b0: 72 74 28 29 20 63 61 6c 6c 0a 2a 2a 20 61 6c 73  rt() call.** als
51c0: 6f 20 72 65 73 65 74 73 20 74 68 65 20 61 4c 6f  o resets the aLo
51d0: 6f 6b 61 68 65 61 64 5b 5d 20 61 72 72 61 79 20  okahead[] array 
51e0: 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66  in preparation f
51f0: 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 73  or the next.** s
5200: 74 61 74 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  tate number..*/.
5210: 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64  struct lookahead
5220: 5f 61 63 74 69 6f 6e 20 7b 0a 20 20 69 6e 74 20  _action {.  int 
5230: 6c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  lookahead;      
5240: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
5250: 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  of the lookahead
5260: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20   token */.  int 
5270: 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  action;         
5280: 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e         /* Action
5290: 20 74 6f 20 74 61 6b 65 20 6f 6e 20 74 68 65 20   to take on the 
52a0: 67 69 76 65 6e 20 6c 6f 6f 6b 61 68 65 61 64 20  given lookahead 
52b0: 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  */.};.typedef st
52c0: 72 75 63 74 20 61 63 74 74 61 62 20 61 63 74 74  ruct acttab actt
52d0: 61 62 3b 0a 73 74 72 75 63 74 20 61 63 74 74 61  ab;.struct actta
52e0: 62 20 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f  b {.  int nActio
52f0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
5300: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5310: 75 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 41  used slots in aA
5320: 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ction[] */.  int
5330: 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20   nActionAlloc;  
5340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f            /* Slo
5350: 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ts allocated for
5360: 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20   aAction[] */.  
5370: 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64  struct lookahead
5380: 5f 61 63 74 69 6f 6e 0a 20 20 20 20 2a 61 41 63  _action.    *aAc
5390: 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  tion,           
53a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 79 79         /* The yy
53b0: 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20  _action[] table 
53c0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
53d0: 6f 6e 20 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b  on */.    *aLook
53e0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
53f0: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
5400: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
5410: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e   set */.  int mn
5420: 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  Lookahead;      
5430: 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75         /* Minimu
5440: 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c  m aLookahead[].l
5450: 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e  ookahead */.  in
5460: 74 20 6d 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20  t mnAction;     
5470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
5480: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
5490: 77 69 74 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64  with mnLookahead
54a0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b   */.  int mxLook
54b0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
54c0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 4c     /* Maximum aL
54d0: 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61  ookahead[].looka
54e0: 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  head */.  int nL
54f0: 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20  ookahead;       
5500: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73         /* Used s
5510: 6c 6f 74 73 20 69 6e 20 61 4c 6f 6f 6b 61 68 65  lots in aLookahe
5520: 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  ad[] */.  int nL
5530: 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 3b 20 20  ookaheadAlloc;  
5540: 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20         /* Slots 
5550: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c 6f  allocated in aLo
5560: 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 7d 3b 0a  okahead[] */.};.
5570: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ./* Return the n
5580: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
5590: 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f   in the yy_actio
55a0: 6e 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69  n table */.#defi
55b0: 6e 65 20 61 63 74 74 61 62 5f 73 69 7a 65 28 58  ne acttab_size(X
55c0: 29 20 28 28 58 29 2d 3e 6e 41 63 74 69 6f 6e 29  ) ((X)->nAction)
55d0: 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66  ../* The value f
55e0: 6f 72 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72  or the N-th entr
55f0: 79 20 69 6e 20 79 79 5f 61 63 74 69 6f 6e 20 2a  y in yy_action *
5600: 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62  /.#define acttab
5610: 5f 79 79 61 63 74 69 6f 6e 28 58 2c 4e 29 20 20  _yyaction(X,N)  
5620: 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d  ((X)->aAction[N]
5630: 2e 61 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65  .action)../* The
5640: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e   value for the N
5650: 2d 74 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f  -th entry in yy_
5660: 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 23 64 65  lookahead */.#de
5670: 66 69 6e 65 20 61 63 74 74 61 62 5f 79 79 6c 6f  fine acttab_yylo
5680: 6f 6b 61 68 65 61 64 28 58 2c 4e 29 20 20 28 28  okahead(X,N)  ((
5690: 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c  X)->aAction[N].l
56a0: 6f 6f 6b 61 68 65 61 64 29 0a 0a 2f 2a 20 46 72  ookahead)../* Fr
56b0: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  ee all memory as
56c0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
56d0: 65 20 67 69 76 65 6e 20 61 63 74 74 61 62 20 2a  e given acttab *
56e0: 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 66 72  /.void acttab_fr
56f0: 65 65 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20  ee(acttab *p){. 
5700: 20 66 72 65 65 28 20 70 2d 3e 61 41 63 74 69 6f   free( p->aActio
5710: 6e 20 29 3b 0a 20 20 66 72 65 65 28 20 70 2d 3e  n );.  free( p->
5720: 61 4c 6f 6f 6b 61 68 65 61 64 20 29 3b 0a 20 20  aLookahead );.  
5730: 66 72 65 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a  free( p );.}../*
5740: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
5750: 61 63 74 74 61 62 20 73 74 72 75 63 74 75 72 65  acttab structure
5760: 20 2a 2f 0a 61 63 74 74 61 62 20 2a 61 63 74 74   */.acttab *actt
5770: 61 62 5f 61 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a  ab_alloc(void){.
5780: 20 20 61 63 74 74 61 62 20 2a 70 20 3d 20 28 61    acttab *p = (a
5790: 63 74 74 61 62 20 2a 29 20 63 61 6c 6c 6f 63 28  cttab *) calloc(
57a0: 20 31 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29   1, sizeof(*p) )
57b0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
57c0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
57d0: 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c  rr,"Unable to al
57e0: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
57f0: 72 20 61 20 6e 65 77 20 61 63 74 74 61 62 2e 22  r a new acttab."
5800: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
5810: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
5820: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
5830: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
5840: 2a 20 41 64 64 20 61 20 6e 65 77 20 61 63 74 69  * Add a new acti
5850: 6f 6e 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  on to the curren
5860: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  t transaction se
5870: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t.  .**.** This 
5880: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5890: 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
58a0: 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 61 20  lookahead for a 
58b0: 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a 20 73 74  particular.** st
58c0: 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 61 63 74  ate..*/.void act
58d0: 74 61 62 5f 61 63 74 69 6f 6e 28 61 63 74 74 61  tab_action(actta
58e0: 62 20 2a 70 2c 20 69 6e 74 20 6c 6f 6f 6b 61 68  b *p, int lookah
58f0: 65 61 64 2c 20 69 6e 74 20 61 63 74 69 6f 6e 29  ead, int action)
5900: 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b  {.  if( p->nLook
5910: 61 68 65 61 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61  ahead>=p->nLooka
5920: 68 65 61 64 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  headAlloc ){.   
5930: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c   p->nLookaheadAl
5940: 6c 6f 63 20 2b 3d 20 32 35 3b 0a 20 20 20 20 70  loc += 25;.    p
5950: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 28  ->aLookahead = (
5960: 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64  struct lookahead
5970: 5f 61 63 74 69 6f 6e 20 2a 29 20 72 65 61 6c 6c  _action *) reall
5980: 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  oc( p->aLookahea
5990: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b 61  sizeof(p->aLooka
59c0: 68 65 61 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f  head[0])*p->nLoo
59d0: 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29 3b 0a 20  kaheadAlloc );. 
59e0: 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61     if( p->aLooka
59f0: 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  head==0 ){.     
5a00: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
5a10: 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e  "malloc failed\n
5a20: 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
5a30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
5a40: 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  f( p->nLookahead
5a50: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6d 78  ==0 ){.    p->mx
5a60: 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b  Lookahead = look
5a70: 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e  ahead;.    p->mn
5a80: 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b  Lookahead = look
5a90: 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e  ahead;.    p->mn
5aa0: 41 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b  Action = action;
5ab0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
5ac0: 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64  ( p->mxLookahead
5ad0: 3c 6c 6f 6f 6b 61 68 65 61 64 20 29 20 70 2d 3e  <lookahead ) p->
5ae0: 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f  mxLookahead = lo
5af0: 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 69 66 28  okahead;.    if(
5b00: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3e   p->mnLookahead>
5b10: 6c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20  lookahead ){.   
5b20: 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61     p->mnLookahea
5b30: 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20  d = lookahead;. 
5b40: 20 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e       p->mnAction
5b50: 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d   = action;.    }
5b60: 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61  .  }.  p->aLooka
5b70: 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  head[p->nLookahe
5b80: 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20  ad].lookahead = 
5b90: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 70 2d 3e  lookahead;.  p->
5ba0: 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c  aLookahead[p->nL
5bb0: 6f 6f 6b 61 68 65 61 64 5d 2e 61 63 74 69 6f 6e  ookahead].action
5bc0: 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 70 2d 3e   = action;.  p->
5bd0: 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d 0a  nLookahead++;.}.
5be0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 74  ./*.** Add the t
5bf0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62  ransaction set b
5c00: 75 69 6c 74 20 75 70 20 77 69 74 68 20 70 72 69  uilt up with pri
5c10: 6f 72 20 63 61 6c 6c 73 20 74 6f 20 61 63 74 74  or calls to actt
5c20: 61 62 5f 61 63 74 69 6f 6e 28 29 0a 2a 2a 20 69  ab_action().** i
5c30: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
5c40: 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 54  action table.  T
5c50: 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 74 72  hen reset the tr
5c60: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62 61  ansaction set ba
5c70: 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20 65 6d 70 74  ck.** to an empt
5c80: 79 20 73 65 74 20 69 6e 20 70 72 65 70 61 72 61  y set in prepara
5c90: 74 69 6f 6e 20 66 6f 72 20 61 20 6e 65 77 20 72  tion for a new r
5ca0: 6f 75 6e 64 20 6f 66 20 61 63 74 74 61 62 5f 61  ound of acttab_a
5cb0: 63 74 69 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a 2a  ction() calls..*
5cc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
5cd0: 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  offset into the 
5ce0: 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20  action table of 
5cf0: 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61 63 74  the new transact
5d00: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74 74  ion..*/.int actt
5d10: 61 62 5f 69 6e 73 65 72 74 28 61 63 74 74 61 62  ab_insert(acttab
5d20: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a   *p){.  int i, j
5d30: 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74  , k, n;.  assert
5d40: 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e  ( p->nLookahead>
5d50: 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  0 );..  /* Make 
5d60: 73 75 72 65 20 77 65 20 68 61 76 65 20 65 6e 6f  sure we have eno
5d70: 75 67 68 20 73 70 61 63 65 20 74 6f 20 68 6f 6c  ugh space to hol
5d80: 64 20 74 68 65 20 65 78 70 61 6e 64 65 64 20 61  d the expanded a
5d90: 63 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2a  ction table.  **
5da0: 20 69 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61   in the worst ca
5db0: 73 65 2e 20 20 54 68 65 20 77 6f 72 73 74 20 63  se.  The worst c
5dc0: 61 73 65 20 6f 63 63 75 72 73 20 69 66 20 74 68  ase occurs if th
5dd0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  e transaction se
5de0: 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61  t.  ** must be a
5df0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63  ppended to the c
5e00: 75 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74 61  urrent action ta
5e10: 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 70  ble.  */.  n = p
5e20: 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mxLookahead + 
5e30: 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41 63 74  1;.  if( p->nAct
5e40: 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d 3e 6e 41  ion + n >= p->nA
5e50: 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  ctionAlloc ){.  
5e60: 20 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f 63 20 3d    int oldAlloc =
5e70: 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63   p->nActionAlloc
5e80: 3b 0a 20 20 20 20 70 2d 3e 6e 41 63 74 69 6f 6e  ;.    p->nAction
5e90: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69  Alloc = p->nActi
5ea0: 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63 74  on + n + p->nAct
5eb0: 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a 20  ionAlloc + 20;. 
5ec0: 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 20 3d 20     p->aAction = 
5ed0: 28 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61  (struct lookahea
5ee0: 64 5f 61 63 74 69 6f 6e 20 2a 29 20 72 65 61 6c  d_action *) real
5ef0: 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69 6f 6e 2c  loc( p->aAction,
5f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5f10: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
5f20: 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 29  f(p->aAction[0])
5f30: 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63  *p->nActionAlloc
5f40: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41  );.    if( p->aA
5f50: 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ction==0 ){.    
5f60: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
5f70: 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c  ,"malloc failed\
5f80: 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  n");.      exit(
5f90: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
5fa0: 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b 20 69 3c  r(i=oldAlloc; i<
5fb0: 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b  p->nActionAlloc;
5fc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
5fd0: 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61  aAction[i].looka
5fe0: 68 65 61 64 20 3d 20 2d 31 3b 0a 20 20 20 20 20  head = -1;.     
5ff0: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 61   p->aAction[i].a
6000: 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  ction = -1;.    
6010: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e  }.  }..  /* Scan
6020: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 61 63   the existing ac
6030: 74 69 6f 6e 20 74 61 62 6c 65 20 6c 6f 6f 6b 69  tion table looki
6040: 6e 67 20 66 6f 72 20 61 6e 20 6f 66 66 73 65 74  ng for an offset
6050: 20 74 68 61 74 20 69 73 20 61 20 0a 20 20 2a 2a   that is a .  **
6060: 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68   duplicate of th
6070: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
6080: 63 74 69 6f 6e 20 73 65 74 2e 20 20 46 61 6c 6c  ction set.  Fall
6090: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
60a0: 0a 20 20 2a 2a 20 69 66 20 61 6e 64 20 77 68 65  .  ** if and whe
60b0: 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  n the duplicate 
60c0: 69 73 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20  is found..  **. 
60d0: 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
60e0: 65 78 20 69 6e 20 70 2d 3e 61 41 63 74 69 6f 6e  ex in p->aAction
60f0: 5b 5d 20 77 68 65 72 65 20 70 2d 3e 6d 6e 4c 6f  [] where p->mnLo
6100: 6f 6b 61 68 65 61 64 20 69 73 20 69 6e 73 65 72  okahead is inser
6110: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ted..  */.  for(
6120: 69 3d 70 2d 3e 6e 41 63 74 69 6f 6e 2d 31 3b 20  i=p->nAction-1; 
6130: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
6140: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69  if( p->aAction[i
6150: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d 3e  ].lookahead==p->
6160: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20  mnLookahead ){. 
6170: 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6c 6f 6f 6b       /* All look
6180: 61 68 65 61 64 73 20 61 6e 64 20 61 63 74 69 6f  aheads and actio
6190: 6e 73 20 69 6e 20 74 68 65 20 61 4c 6f 6f 6b 61  ns in the aLooka
61a0: 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74 69  head[] transacti
61b0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74  on.      ** must
61c0: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
61d0: 68 65 20 63 61 6e 64 69 64 61 74 65 20 61 41 63  he candidate aAc
61e0: 74 69 6f 6e 5b 69 5d 20 65 6e 74 72 79 2e 20 2a  tion[i] entry. *
61f0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  /.      if( p->a
6200: 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e  Action[i].action
6210: 21 3d 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 29 20  !=p->mnAction ) 
6220: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6230: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c  for(j=0; j<p->nL
6240: 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a  ookahead; j++){.
6250: 20 20 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61          k = p->a
6260: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f  Lookahead[j].loo
6270: 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f  kahead - p->mnLo
6280: 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20  okahead + i;.   
6290: 20 20 20 20 20 69 66 28 20 6b 3c 30 20 7c 7c 20       if( k<0 || 
62a0: 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20  k>=p->nAction ) 
62b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
62c0: 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  f( p->aLookahead
62d0: 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 21 3d 70  [j].lookahead!=p
62e0: 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f  ->aAction[k].loo
62f0: 6b 61 68 65 61 64 20 29 20 62 72 65 61 6b 3b 0a  kahead ) break;.
6300: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
6310: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 61 63 74  Lookahead[j].act
6320: 69 6f 6e 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b  ion!=p->aAction[
6330: 6b 5d 2e 61 63 74 69 6f 6e 20 29 20 62 72 65 61  k].action ) brea
6340: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
6350: 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61   if( j<p->nLooka
6360: 68 65 61 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  head ) continue;
6370: 0a 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 70 6f  ..      /* No po
6380: 73 73 69 62 6c 65 20 6c 6f 6f 6b 61 68 65 61 64  ssible lookahead
6390: 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 6e   value that is n
63a0: 6f 74 20 69 6e 20 74 68 65 20 61 4c 6f 6f 6b 61  ot in the aLooka
63b0: 68 65 61 64 5b 5d 0a 20 20 20 20 20 20 2a 2a 20  head[].      ** 
63c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
63d0: 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68 20  llowed to match 
63e0: 61 41 63 74 69 6f 6e 5b 69 5d 20 2a 2f 0a 20 20  aAction[i] */.  
63f0: 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20      n = 0;.     
6400: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
6410: 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Action; j++){.  
6420: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
6430: 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[j].lookahea
6440: 64 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  d<0 ) continue;.
6450: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
6460: 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68  Action[j].lookah
6470: 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b  ead==j+p->mnLook
6480: 61 68 65 61 64 2d 69 20 29 20 6e 2b 2b 3b 0a 20  ahead-i ) n++;. 
6490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
64a0: 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61   n==p->nLookahea
64b0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  d ){.        bre
64c0: 61 6b 3b 20 20 2f 2a 20 41 6e 20 65 78 61 63 74  ak;  /* An exact
64d0: 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 20   match is found 
64e0: 61 74 20 6f 66 66 73 65 74 20 69 20 2a 2f 0a 20  at offset i */. 
64f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6500: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 78 69  ..  /* If no exi
6510: 73 74 69 6e 67 20 6f 66 66 73 65 74 73 20 65 78  sting offsets ex
6520: 61 63 74 6c 79 20 6d 61 74 63 68 20 74 68 65 20  actly match the 
6530: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
6540: 69 6f 6e 2c 20 66 69 6e 64 20 61 6e 0a 20 20 2a  ion, find an.  *
6550: 2a 20 61 6e 20 65 6d 70 74 79 20 6f 66 66 73 65  * an empty offse
6560: 74 20 69 6e 20 74 68 65 20 61 41 63 74 69 6f 6e  t in the aAction
6570: 5b 5d 20 74 61 62 6c 65 20 69 6e 20 77 68 69 63  [] table in whic
6580: 68 20 77 65 20 63 61 6e 20 61 64 64 20 74 68 65  h we can add the
6590: 0a 20 20 2a 2a 20 61 4c 6f 6f 6b 61 68 65 61 64  .  ** aLookahead
65a0: 5b 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  [] transaction..
65b0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 3c 30 20 29    */.  if( i<0 )
65c0: 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f  {.    /* Look fo
65d0: 72 20 68 6f 6c 65 73 20 69 6e 20 74 68 65 20 61  r holes in the a
65e0: 41 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 74  Action[] table t
65f0: 68 61 74 20 66 69 74 20 74 68 65 20 63 75 72 72  hat fit the curr
6600: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 4c 6f 6f 6b  ent.    ** aLook
6610: 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74  ahead[] transact
6620: 69 6f 6e 2e 20 20 4c 65 61 76 65 20 69 20 73 65  ion.  Leave i se
6630: 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
6640: 6f 66 20 74 68 65 20 68 6f 6c 65 2e 0a 20 20 20  of the hole..   
6650: 20 2a 2a 20 49 66 20 6e 6f 20 68 6f 6c 65 73 20   ** If no holes 
6660: 61 72 65 20 66 6f 75 6e 64 2c 20 69 20 69 73 20  are found, i is 
6670: 6c 65 66 74 20 61 74 20 70 2d 3e 6e 41 63 74 69  left at p->nActi
6680: 6f 6e 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  on, which means 
6690: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
66a0: 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61  action will be a
66b0: 70 70 65 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  ppended. */.    
66c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41  for(i=0; i<p->nA
66d0: 63 74 69 6f 6e 41 6c 6c 6f 63 20 2d 20 70 2d 3e  ctionAlloc - p->
66e0: 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 69 2b 2b  mxLookahead; i++
66f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
6700: 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61  aAction[i].looka
6710: 68 65 61 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  head<0 ){.      
6720: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
6730: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29  nLookahead; j++)
6740: 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20  {.          k = 
6750: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
6760: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
6770: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
6780: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6b  .          if( k
6790: 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <0 ) break;.    
67a0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
67b0: 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[k].lookahea
67c0: 64 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d>=0 ) break;.  
67d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
67e0: 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68  if( j<p->nLookah
67f0: 65 61 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ead ) continue;.
6800: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
6810: 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a   j<p->nAction; j
6820: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
6830: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d  f( p->aAction[j]
6840: 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d  .lookahead==j+p-
6850: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69 20 29  >mnLookahead-i )
6860: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6870: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
6880: 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 7b 0a 20  =p->nAction ){. 
6890: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20           break; 
68a0: 20 2f 2a 20 46 69 74 73 20 69 6e 20 65 6d 70 74   /* Fits in empt
68b0: 79 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 20 20 20  y slots */.     
68c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
68d0: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65   }.  }.  /* Inse
68e0: 72 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  rt transaction s
68f0: 65 74 20 61 74 20 69 6e 64 65 78 20 69 2e 20 2a  et at index i. *
6900: 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70  /.  for(j=0; j<p
6910: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b  ->nLookahead; j+
6920: 2b 29 7b 0a 20 20 20 20 6b 20 3d 20 70 2d 3e 61  +){.    k = p->a
6930: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f  Lookahead[j].loo
6940: 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f  kahead - p->mnLo
6950: 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20  okahead + i;.   
6960: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 20 3d   p->aAction[k] =
6970: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a   p->aLookahead[j
6980: 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 2d  ];.    if( k>=p-
6990: 3e 6e 41 63 74 69 6f 6e 20 29 20 70 2d 3e 6e 41  >nAction ) p->nA
69a0: 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a 20 20 7d  ction = k+1;.  }
69b0: 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  .  p->nLookahead
69c0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74 75   = 0;..  /* Retu
69d0: 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 74 68  rn the offset th
69e0: 61 74 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  at is added to t
69f0: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e 20  he lookahead in 
6a00: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
6a10: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74 6f  .  ** index into
6a20: 20 79 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74 68   yy_action of th
6a30: 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 65  e action */.  re
6a40: 74 75 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c 6f  turn i - p->mnLo
6a50: 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 2a 2a  okahead;.}../***
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a70: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
6a80: 65 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a 2a 2a  e "build.c" ****
6a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
6ab0: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 63 6f 6e   Routines to con
6ac0: 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66 69  struction the fi
6ad0: 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69  nite state machi
6ae0: 6e 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  ne for the LEMON
6af0: 0a 2a 2a 20 70 61 72 73 65 72 20 67 65 6e 65 72  .** parser gener
6b00: 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e  ator..*/../* Fin
6b10: 64 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73  d a precedence s
6b20: 79 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79 20 72  ymbol of every r
6b30: 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  ule in the gramm
6b40: 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f 73 65  ar..** .** Those
6b50: 20 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76   rules which hav
6b60: 65 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73  e a precedence s
6b70: 79 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e 20 74  ymbol coded in t
6b80: 68 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72 61 6d  he input.** gram
6b90: 6d 61 72 20 75 73 69 6e 67 20 74 68 65 20 22 5b  mar using the "[
6ba0: 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74 72 75  symbol]" constru
6bb0: 63 74 20 77 69 6c 6c 20 61 6c 72 65 61 64 79 20  ct will already 
6bc0: 68 61 76 65 20 74 68 65 0a 2a 2a 20 72 70 2d 3e  have the.** rp->
6bd0: 70 72 65 63 73 79 6d 20 66 69 65 6c 64 20 66 69  precsym field fi
6be0: 6c 6c 65 64 2e 20 20 4f 74 68 65 72 20 72 75 6c  lled.  Other rul
6bf0: 65 73 20 74 61 6b 65 20 61 73 20 74 68 65 69 72  es take as their
6c00: 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73   precedence.** s
6c10: 79 6d 62 6f 6c 20 74 68 65 20 66 69 72 73 74 20  ymbol the first 
6c20: 52 48 53 20 73 79 6d 62 6f 6c 20 77 69 74 68 20  RHS symbol with 
6c30: 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64  a defined preced
6c40: 65 6e 63 65 2e 20 20 49 66 20 74 68 65 72 65 0a  ence.  If there.
6c50: 2a 2a 20 61 72 65 20 6e 6f 74 20 52 48 53 20 73  ** are not RHS s
6c60: 79 6d 62 6f 6c 73 20 77 69 74 68 20 61 20 64 65  ymbols with a de
6c70: 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65  fined precedence
6c80: 2c 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65  , the precedence
6c90: 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65 6c 64  .** symbol field
6ca0: 20 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b 2e 0a   is left blank..
6cb0: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c 65  */.void FindRule
6cc0: 50 72 65 63 65 64 65 6e 63 65 73 28 73 74 72 75  Precedences(stru
6cd0: 63 74 20 6c 65 6d 6f 6e 20 2a 78 70 29 0a 7b 0a  ct lemon *xp).{.
6ce0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
6cf0: 70 3b 0a 20 20 66 6f 72 28 72 70 3d 78 70 2d 3e  p;.  for(rp=xp->
6d00: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
6d10: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
6d20: 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30 20 29  rp->precsym==0 )
6d30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  {.      int i, j
6d40: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
6d50: 20 69 3c 72 70 2d 3e 6e 72 68 73 20 26 26 20 72   i<rp->nrhs && r
6d60: 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30 3b 20 69  p->precsym==0; i
6d70: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
6d80: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
6d90: 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
6da0: 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70       if( sp->typ
6db0: 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
6dc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
6dd0: 72 28 6a 3d 30 3b 20 6a 3c 73 70 2d 3e 6e 73 75  r(j=0; j<sp->nsu
6de0: 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  bsym; j++){.    
6df0: 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e          if( sp->
6e00: 73 75 62 73 79 6d 5b 6a 5d 2d 3e 70 72 65 63 3e  subsym[j]->prec>
6e10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6e20: 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20      rp->precsym 
6e30: 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 3b  = sp->subsym[j];
6e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
6e50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
6e60: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
6e70: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
6e80: 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b  ( sp->prec>=0 ){
6e90: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70  .          rp->p
6ea0: 72 65 63 73 79 6d 20 3d 20 72 70 2d 3e 72 68 73  recsym = rp->rhs
6eb0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  [i];.        }. 
6ec0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6ed0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
6ee0: 20 46 69 6e 64 20 61 6c 6c 20 6e 6f 6e 74 65 72   Find all nonter
6ef0: 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 77 69 6c  minals which wil
6f00: 6c 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 65  l generate the e
6f10: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 20  mpty string..** 
6f20: 54 68 65 6e 20 67 6f 20 62 61 63 6b 20 61 6e 64  Then go back and
6f30: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72   compute the fir
6f40: 73 74 20 73 65 74 73 20 6f 66 20 65 76 65 72 79  st sets of every
6f50: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2a   nonterminal..**
6f60: 20 54 68 65 20 66 69 72 73 74 20 73 65 74 20 69   The first set i
6f70: 73 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c  s the set of all
6f80: 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c   terminal symbol
6f90: 73 20 77 68 69 63 68 20 63 61 6e 20 62 65 67 69  s which can begi
6fa0: 6e 0a 2a 2a 20 61 20 73 74 72 69 6e 67 20 67 65  n.** a string ge
6fb0: 6e 65 72 61 74 65 64 20 62 79 20 74 68 61 74 20  nerated by that 
6fc0: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a  nonterminal..*/.
6fd0: 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53 65  void FindFirstSe
6fe0: 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  ts(struct lemon 
6ff0: 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69  *lemp).{.  int i
7000: 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74 20 72 75  , j;.  struct ru
7010: 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74 20 70 72  le *rp;.  int pr
7020: 6f 67 72 65 73 73 3b 0a 0a 20 20 66 6f 72 28 69  ogress;..  for(i
7030: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
7040: 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c  bol; i++){.    l
7050: 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
7060: 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f  >lambda = LEMON_
7070: 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 66 6f 72  FALSE;.  }.  for
7080: 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  (i=lemp->ntermin
7090: 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  al; i<lemp->nsym
70a0: 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c  bol; i++){.    l
70b0: 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
70c0: 3e 66 69 72 73 74 73 65 74 20 3d 20 53 65 74 4e  >firstset = SetN
70d0: 65 77 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ew();.  }..  /* 
70e0: 46 69 72 73 74 20 63 6f 6d 70 75 74 65 20 61 6c  First compute al
70f0: 6c 20 6c 61 6d 62 64 61 73 20 2a 2f 0a 20 20 64  l lambdas */.  d
7100: 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20  o{.    progress 
7110: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d  = 0;.    for(rp=
7120: 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
7130: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
7140: 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 2d      if( rp->lhs-
7150: 3e 6c 61 6d 62 64 61 20 29 20 63 6f 6e 74 69 6e  >lambda ) contin
7160: 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ue;.      for(i=
7170: 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
7180: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
7190: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
71a0: 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
71b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 70 2d       assert( sp-
71c0: 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e  >type==NONTERMIN
71d0: 41 4c 20 7c 7c 20 73 70 2d 3e 6c 61 6d 62 64 61  AL || sp->lambda
71e0: 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 3b  ==LEMON_FALSE );
71f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d  .        if( sp-
7200: 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46  >lambda==LEMON_F
7210: 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20  ALSE ) break;.  
7220: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7230: 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20  i==rp->nrhs ){. 
7240: 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e         rp->lhs->
7250: 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 54  lambda = LEMON_T
7260: 52 55 45 3b 0a 20 20 20 20 20 20 20 20 70 72 6f  RUE;.        pro
7270: 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20  gress = 1;.     
7280: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
7290: 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 0a  e( progress );..
72a0: 20 20 2f 2a 20 4e 6f 77 20 63 6f 6d 70 75 74 65    /* Now compute
72b0: 20 61 6c 6c 20 66 69 72 73 74 20 73 65 74 73 20   all first sets 
72c0: 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 73 74 72  */.  do{.    str
72d0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 31 2c 20  uct symbol *s1, 
72e0: 2a 73 32 3b 0a 20 20 20 20 70 72 6f 67 72 65 73  *s2;.    progres
72f0: 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72  s = 0;.    for(r
7300: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
7310: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
7320: 20 20 20 20 20 20 73 31 20 3d 20 72 70 2d 3e 6c        s1 = rp->l
7330: 68 73 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  hs;.      for(i=
7340: 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
7350: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 32 20  ++){.        s2 
7360: 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20  = rp->rhs[i];.  
7370: 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e 74 79        if( s2->ty
7380: 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
7390: 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65            progre
73a0: 73 73 20 2b 3d 20 53 65 74 41 64 64 28 73 31 2d  ss += SetAdd(s1-
73b0: 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 69 6e  >firstset,s2->in
73c0: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dex);.          
73d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
73e0: 65 6c 73 65 20 69 66 28 20 73 32 2d 3e 74 79 70  else if( s2->typ
73f0: 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
7400: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
7410: 72 28 6a 3d 30 3b 20 6a 3c 73 32 2d 3e 6e 73 75  r(j=0; j<s2->nsu
7420: 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  bsym; j++){.    
7430: 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73          progress
7440: 20 2b 3d 20 53 65 74 41 64 64 28 73 31 2d 3e 66   += SetAdd(s1->f
7450: 69 72 73 74 73 65 74 2c 73 32 2d 3e 73 75 62 73  irstset,s2->subs
7460: 79 6d 5b 6a 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20  ym[j]->index);. 
7470: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7480: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7490: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 31      }else if( s1
74a0: 3d 3d 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ==s2 ){.        
74b0: 20 20 69 66 28 20 73 31 2d 3e 6c 61 6d 62 64 61    if( s1->lambda
74c0: 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20  ==LEMON_FALSE ) 
74d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
74e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
74f0: 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 55  progress += SetU
7500: 6e 69 6f 6e 28 73 31 2d 3e 66 69 72 73 74 73 65  nion(s1->firstse
7510: 74 2c 73 32 2d 3e 66 69 72 73 74 73 65 74 29 3b  t,s2->firstset);
7520: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
7530: 32 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e  2->lambda==LEMON
7540: 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a  _FALSE ) break;.
7550: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7560: 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  }.    }.  }while
7570: 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 20 20  ( progress );.  
7580: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f  return;.}../* Co
7590: 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20  mpute all LR(0) 
75a0: 73 74 61 74 65 73 20 66 6f 72 20 74 68 65 20 67  states for the g
75b0: 72 61 6d 6d 61 72 2e 20 20 4c 69 6e 6b 73 0a 2a  rammar.  Links.*
75c0: 2a 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 62  * are added to b
75d0: 65 74 77 65 65 6e 20 73 6f 6d 65 20 73 74 61 74  etween some stat
75e0: 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 4c  es so that the L
75f0: 52 28 31 29 20 66 6f 6c 6c 6f 77 20 73 65 74 73  R(1) follow sets
7600: 0a 2a 2a 20 63 61 6e 20 62 65 20 63 6f 6d 70 75  .** can be compu
7610: 74 65 64 20 6c 61 74 65 72 2e 0a 2a 2f 0a 50 52  ted later..*/.PR
7620: 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74 61  IVATE struct sta
7630: 74 65 20 2a 67 65 74 73 74 61 74 65 28 73 74 72  te *getstate(str
7640: 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 20 20 2f  uct lemon *);  /
7650: 2a 20 66 6f 72 77 61 72 64 20 72 65 66 65 72 65  * forward refere
7660: 6e 63 65 20 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  nce */.void Find
7670: 53 74 61 74 65 73 28 73 74 72 75 63 74 20 6c 65  States(struct le
7680: 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73  mon *lemp).{.  s
7690: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
76a0: 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
76b0: 2a 72 70 3b 0a 0a 20 20 43 6f 6e 66 69 67 6c 69  *rp;..  Configli
76c0: 73 74 5f 69 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a  st_init();..  /*
76d0: 20 46 69 6e 64 20 74 68 65 20 73 74 61 72 74 20   Find the start 
76e0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 66 28 20  symbol */.  if( 
76f0: 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20  lemp->start ){. 
7700: 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66     sp = Symbol_f
7710: 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29  ind(lemp->start)
7720: 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20  ;.    if( sp==0 
7730: 29 7b 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73  ){.      ErrorMs
7740: 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  g(lemp->filename
7750: 2c 30 2c 0a 22 54 68 65 20 73 70 65 63 69 66 69  ,0,."The specifi
7760: 65 64 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  ed start symbol 
7770: 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 5c 0a  \"%s\" is not \.
7780: 69 6e 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  in a nonterminal
7790: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2e   of the grammar.
77a0: 20 20 5c 22 25 73 5c 22 20 77 69 6c 6c 20 62 65    \"%s\" will be
77b0: 20 75 73 65 64 20 61 73 20 74 68 65 20 73 74 61   used as the sta
77c0: 72 74 20 5c 0a 73 79 6d 62 6f 6c 20 69 6e 73 74  rt \.symbol inst
77d0: 65 61 64 2e 22 2c 6c 65 6d 70 2d 3e 73 74 61 72  ead.",lemp->star
77e0: 74 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 52 75 6c  t,lemp->startRul
77f0: 65 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  e->lhs->name);. 
7800: 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
7810: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 70 20  cnt++;.      sp 
7820: 3d 20 6c 65 6d 70 2d 3e 73 74 61 72 74 52 75 6c  = lemp->startRul
7830: 65 2d 3e 6c 68 73 3b 0a 20 20 20 20 7d 0a 20 20  e->lhs;.    }.  
7840: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20  }else{.    sp = 
7850: 6c 65 6d 70 2d 3e 73 74 61 72 74 52 75 6c 65 2d  lemp->startRule-
7860: 3e 6c 68 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  >lhs;.  }..  /* 
7870: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 74  Make sure the st
7880: 61 72 74 20 73 79 6d 62 6f 6c 20 64 6f 65 73 6e  art symbol doesn
7890: 27 74 20 6f 63 63 75 72 20 6f 6e 20 74 68 65 20  't occur on the 
78a0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
78b0: 6f 66 0a 20 20 2a 2a 20 61 6e 79 20 72 75 6c 65  of.  ** any rule
78c0: 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
78d0: 6f 72 20 69 66 20 69 74 20 64 6f 65 73 2e 20 20  or if it does.  
78e0: 28 59 41 43 43 20 77 6f 75 6c 64 20 67 65 6e 65  (YACC would gene
78f0: 72 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20  rate a new.  ** 
7900: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 69 6e 20  start symbol in 
7910: 74 68 69 73 20 63 61 73 65 2e 29 20 2a 2f 0a 20  this case.) */. 
7920: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
7930: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
7940: 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ext){.    int i;
7950: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7960: 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
7970: 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68        if( rp->rh
7980: 73 5b 69 5d 3d 3d 73 70 20 29 7b 20 20 20 2f 2a  s[i]==sp ){   /*
7990: 20 46 49 58 20 4d 45 3a 20 20 44 65 61 6c 20 77   FIX ME:  Deal w
79a0: 69 74 68 20 6d 75 6c 74 69 74 65 72 6d 69 6e 61  ith multitermina
79b0: 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 72  ls */.        Er
79c0: 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
79d0: 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 74  ename,0,."The st
79e0: 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c  art symbol \"%s\
79f0: 22 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20  " occurs on the 
7a00: 5c 0a 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  \.right-hand sid
7a10: 65 20 6f 66 20 61 20 72 75 6c 65 2e 20 54 68 69  e of a rule. Thi
7a20: 73 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  s will result in
7a30: 20 61 20 70 61 72 73 65 72 20 77 68 69 63 68 20   a parser which 
7a40: 5c 0a 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  \.does not work 
7a50: 70 72 6f 70 65 72 6c 79 2e 22 2c 73 70 2d 3e 6e  properly.",sp->n
7a60: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6c 65  ame);.        le
7a70: 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
7a80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7a90: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62 61 73 69  }..  /* The basi
7aa0: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
7ab0: 73 65 74 20 66 6f 72 20 74 68 65 20 66 69 72 73  set for the firs
7ac0: 74 20 73 74 61 74 65 0a 20 20 2a 2a 20 69 73 20  t state.  ** is 
7ad0: 61 6c 6c 20 72 75 6c 65 73 20 77 68 69 63 68 20  all rules which 
7ae0: 68 61 76 65 20 74 68 65 20 73 74 61 72 74 20 73  have the start s
7af0: 79 6d 62 6f 6c 20 61 73 20 74 68 65 69 72 0a 20  ymbol as their. 
7b00: 20 2a 2a 20 6c 65 66 74 2d 68 61 6e 64 20 73 69   ** left-hand si
7b10: 64 65 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 73  de */.  for(rp=s
7b20: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
7b30: 72 70 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20  rp->nextlhs){.  
7b40: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
7b50: 2a 6e 65 77 63 66 70 3b 0a 20 20 20 20 72 70 2d  *newcfp;.    rp-
7b60: 3e 6c 68 73 53 74 61 72 74 20 3d 20 31 3b 0a 20  >lhsStart = 1;. 
7b70: 20 20 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66     newcfp = Conf
7b80: 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28  iglist_addbasis(
7b90: 72 70 2c 30 29 3b 0a 20 20 20 20 53 65 74 41 64  rp,0);.    SetAd
7ba0: 64 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 30 29  d(newcfp->fws,0)
7bb0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
7bc0: 75 74 65 20 74 68 65 20 66 69 72 73 74 20 73 74  ute the first st
7bd0: 61 74 65 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20  ate.  All other 
7be0: 73 74 61 74 65 73 20 77 69 6c 6c 20 62 65 0a 20  states will be. 
7bf0: 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 61 75 74   ** computed aut
7c00: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 75 72 69 6e  omatically durin
7c10: 67 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  g the computatio
7c20: 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  n of the first o
7c30: 6e 65 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 74  ne..  ** The ret
7c40: 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 74 6f  urned pointer to
7c50: 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65   the first state
7c60: 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 2a 2f   is not used. */
7c70: 0a 20 20 28 76 6f 69 64 29 67 65 74 73 74 61 74  .  (void)getstat
7c80: 65 28 6c 65 6d 70 29 3b 0a 20 20 72 65 74 75 72  e(lemp);.  retur
7c90: 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  n;.}../* Return 
7ca0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
7cb0: 74 61 74 65 20 77 68 69 63 68 20 69 73 20 64 65  tate which is de
7cc0: 73 63 72 69 62 65 64 20 62 79 20 74 68 65 20 63  scribed by the c
7cd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2a 20  onfiguration.** 
7ce0: 6c 69 73 74 20 77 68 69 63 68 20 68 61 73 20 62  list which has b
7cf0: 65 65 6e 20 62 75 69 6c 74 20 66 72 6f 6d 20 63  een built from c
7d00: 61 6c 6c 73 20 74 6f 20 43 6f 6e 66 69 67 6c 69  alls to Configli
7d10: 73 74 5f 61 64 64 2e 0a 2a 2f 0a 50 52 49 56 41  st_add..*/.PRIVA
7d20: 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69  TE void buildshi
7d30: 66 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  fts(struct lemon
7d40: 20 2a 2c 20 73 74 72 75 63 74 20 73 74 61 74 65   *, struct state
7d50: 20 2a 29 3b 20 2f 2a 20 46 6f 72 77 64 20 72 65   *); /* Forwd re
7d60: 66 20 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72  f */.PRIVATE str
7d70: 75 63 74 20 73 74 61 74 65 20 2a 67 65 74 73 74  uct state *getst
7d80: 61 74 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ate(struct lemon
7d90: 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75   *lemp).{.  stru
7da0: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20  ct config *cfp, 
7db0: 2a 62 70 3b 0a 20 20 73 74 72 75 63 74 20 73 74  *bp;.  struct st
7dc0: 61 74 65 20 2a 73 74 70 3b 0a 0a 20 20 2f 2a 20  ate *stp;..  /* 
7dd0: 45 78 74 72 61 63 74 20 74 68 65 20 73 6f 72 74  Extract the sort
7de0: 65 64 20 62 61 73 69 73 20 6f 66 20 74 68 65 20  ed basis of the 
7df0: 6e 65 77 20 73 74 61 74 65 2e 20 20 54 68 65 20  new state.  The 
7e00: 62 61 73 69 73 20 77 61 73 20 63 6f 6e 73 74 72  basis was constr
7e10: 75 63 74 65 64 0a 20 20 2a 2a 20 62 79 20 70 72  ucted.  ** by pr
7e20: 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 22 43 6f  ior calls to "Co
7e30: 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69  nfiglist_addbasi
7e40: 73 28 29 22 2e 20 2a 2f 0a 20 20 43 6f 6e 66 69  s()". */.  Confi
7e50: 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28  glist_sortbasis(
7e60: 29 3b 0a 20 20 62 70 20 3d 20 43 6f 6e 66 69 67  );.  bp = Config
7e70: 6c 69 73 74 5f 62 61 73 69 73 28 29 3b 0a 0a 20  list_basis();.. 
7e80: 20 2f 2a 20 47 65 74 20 61 20 73 74 61 74 65 20   /* Get a state 
7e90: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 62 61  with the same ba
7ea0: 73 69 73 20 2a 2f 0a 20 20 73 74 70 20 3d 20 53  sis */.  stp = S
7eb0: 74 61 74 65 5f 66 69 6e 64 28 62 70 29 3b 0a 20  tate_find(bp);. 
7ec0: 20 69 66 28 20 73 74 70 20 29 7b 0a 20 20 20 20   if( stp ){.    
7ed0: 2f 2a 20 41 20 73 74 61 74 65 20 77 69 74 68 20  /* A state with 
7ee0: 74 68 65 20 73 61 6d 65 20 62 61 73 69 73 20 61  the same basis a
7ef0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 21 20 20  lready exists!  
7f00: 43 6f 70 79 20 61 6c 6c 20 74 68 65 20 66 6f 6c  Copy all the fol
7f10: 6c 6f 77 2d 73 65 74 0a 20 20 20 20 2a 2a 20 70  low-set.    ** p
7f20: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
7f30: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20   from the state 
7f40: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
7f50: 6f 6e 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  on into the.    
7f60: 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20 73  ** preexisting s
7f70: 74 61 74 65 2c 20 74 68 65 6e 20 72 65 74 75 72  tate, then retur
7f80: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
7f90: 68 65 20 70 72 65 65 78 69 73 74 69 6e 67 20 73  he preexisting s
7fa0: 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 72 75  tate */.    stru
7fb0: 63 74 20 63 6f 6e 66 69 67 20 2a 78 2c 20 2a 79  ct config *x, *y
7fc0: 3b 0a 20 20 20 20 66 6f 72 28 78 3d 62 70 2c 20  ;.    for(x=bp, 
7fd0: 79 3d 73 74 70 2d 3e 62 70 3b 20 78 20 26 26 20  y=stp->bp; x && 
7fe0: 79 3b 20 78 3d 78 2d 3e 62 70 2c 20 79 3d 79 2d  y; x=x->bp, y=y-
7ff0: 3e 62 70 29 7b 0a 20 20 20 20 20 20 50 6c 69 6e  >bp){.      Plin
8000: 6b 5f 63 6f 70 79 28 26 79 2d 3e 62 70 6c 70 2c  k_copy(&y->bplp,
8010: 78 2d 3e 62 70 6c 70 29 3b 0a 20 20 20 20 20 20  x->bplp);.      
8020: 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 78 2d 3e  Plink_delete(x->
8030: 66 70 6c 70 29 3b 0a 20 20 20 20 20 20 78 2d 3e  fplp);.      x->
8040: 66 70 6c 70 20 3d 20 78 2d 3e 62 70 6c 70 20 3d  fplp = x->bplp =
8050: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 66   0;.    }.    cf
8060: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72  p = Configlist_r
8070: 65 74 75 72 6e 28 29 3b 0a 20 20 20 20 43 6f 6e  eturn();.    Con
8080: 66 69 67 6c 69 73 74 5f 65 61 74 28 63 66 70 29  figlist_eat(cfp)
8090: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
80a0: 2a 20 54 68 69 73 20 72 65 61 6c 6c 79 20 69 73  * This really is
80b0: 20 61 20 6e 65 77 20 73 74 61 74 65 2e 20 20 43   a new state.  C
80c0: 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20 74 68 65  onstruct all the
80d0: 20 64 65 74 61 69 6c 73 20 2a 2f 0a 20 20 20 20   details */.    
80e0: 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75  Configlist_closu
80f0: 72 65 28 6c 65 6d 70 29 3b 20 20 20 20 2f 2a 20  re(lemp);    /* 
8100: 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 66  Compute the conf
8110: 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72  iguration closur
8120: 65 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c  e */.    Configl
8130: 69 73 74 5f 73 6f 72 74 28 29 3b 20 20 20 20 20  ist_sort();     
8140: 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 74 68        /* Sort th
8150: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
8160: 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 63  closure */.    c
8170: 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f  fp = Configlist_
8180: 72 65 74 75 72 6e 28 29 3b 20 20 20 2f 2a 20 47  return();   /* G
8190: 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  et a pointer to 
81a0: 74 68 65 20 63 6f 6e 66 69 67 20 6c 69 73 74 20  the config list 
81b0: 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 53 74 61  */.    stp = Sta
81c0: 74 65 5f 6e 65 77 28 29 3b 20 20 20 20 20 20 20  te_new();       
81d0: 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 74 61      /* A new sta
81e0: 74 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  te structure */.
81f0: 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28      MemoryCheck(
8200: 73 74 70 29 3b 0a 20 20 20 20 73 74 70 2d 3e 62  stp);.    stp->b
8210: 70 20 3d 20 62 70 3b 20 20 20 20 20 20 20 20 20  p = bp;         
8220: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62         /* Rememb
8230: 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  er the configura
8240: 74 69 6f 6e 20 62 61 73 69 73 20 2a 2f 0a 20 20  tion basis */.  
8250: 20 20 73 74 70 2d 3e 63 66 70 20 3d 20 63 66 70    stp->cfp = cfp
8260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8270: 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63  * Remember the c
8280: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f  onfiguration clo
8290: 73 75 72 65 20 2a 2f 0a 20 20 20 20 73 74 70 2d  sure */.    stp-
82a0: 3e 73 74 61 74 65 6e 75 6d 20 3d 20 6c 65 6d 70  >statenum = lemp
82b0: 2d 3e 6e 73 74 61 74 65 2b 2b 3b 20 2f 2a 20 45  ->nstate++; /* E
82c0: 76 65 72 79 20 73 74 61 74 65 20 67 65 74 73 20  very state gets 
82d0: 61 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65  a sequence numbe
82e0: 72 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 61 70  r */.    stp->ap
82f0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
8300: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61 63 74 69        /* No acti
8310: 6f 6e 73 2c 20 79 65 74 2e 20 2a 2f 0a 20 20 20  ons, yet. */.   
8320: 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74   State_insert(st
8330: 70 2c 73 74 70 2d 3e 62 70 29 3b 20 20 20 2f 2a  p,stp->bp);   /*
8340: 20 41 64 64 20 74 6f 20 74 68 65 20 73 74 61 74   Add to the stat
8350: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 62  e table */.    b
8360: 75 69 6c 64 73 68 69 66 74 73 28 6c 65 6d 70 2c  uildshifts(lemp,
8370: 73 74 70 29 3b 20 20 20 20 20 20 20 2f 2a 20 52  stp);       /* R
8380: 65 63 75 72 73 69 76 65 6c 79 20 63 6f 6d 70 75  ecursively compu
8390: 74 65 20 73 75 63 63 65 73 73 6f 72 20 73 74 61  te successor sta
83a0: 74 65 73 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  tes */.  }.  ret
83b0: 75 72 6e 20 73 74 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn stp;.}../*.*
83c0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
83d0: 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 61 72 65   two symbols are
83e0: 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 69 6e   the same..*/.in
83f0: 74 20 73 61 6d 65 5f 73 79 6d 62 6f 6c 28 73 74  t same_symbol(st
8400: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 61 2c 20  ruct symbol *a, 
8410: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62  struct symbol *b
8420: 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ).{.  int i;.  i
8430: 66 28 20 61 3d 3d 62 20 29 20 72 65 74 75 72 6e  f( a==b ) return
8440: 20 31 3b 0a 20 20 69 66 28 20 61 2d 3e 74 79 70   1;.  if( a->typ
8450: 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e!=MULTITERMINAL
8460: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
8470: 66 28 20 62 2d 3e 74 79 70 65 21 3d 4d 55 4c 54  f( b->type!=MULT
8480: 49 54 45 52 4d 49 4e 41 4c 20 29 20 72 65 74 75  ITERMINAL ) retu
8490: 72 6e 20 30 3b 0a 20 20 69 66 28 20 61 2d 3e 6e  rn 0;.  if( a->n
84a0: 73 75 62 73 79 6d 21 3d 62 2d 3e 6e 73 75 62 73  subsym!=b->nsubs
84b0: 79 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ym ) return 0;. 
84c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 2d 3e 6e   for(i=0; i<a->n
84d0: 73 75 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20  subsym; i++){.  
84e0: 20 20 69 66 28 20 61 2d 3e 73 75 62 73 79 6d 5b    if( a->subsym[
84f0: 69 5d 21 3d 62 2d 3e 73 75 62 73 79 6d 5b 69 5d  i]!=b->subsym[i]
8500: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
8510: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
8520: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c  /* Construct all
8530: 20 73 75 63 63 65 73 73 6f 72 20 73 74 61 74 65   successor state
8540: 73 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 73  s to the given s
8550: 74 61 74 65 2e 20 20 41 20 22 73 75 63 63 65 73  tate.  A "succes
8560: 73 6f 72 22 0a 2a 2a 20 73 74 61 74 65 20 69 73  sor".** state is
8570: 20 61 6e 79 20 73 74 61 74 65 20 77 68 69 63 68   any state which
8580: 20 63 61 6e 20 62 65 20 72 65 61 63 68 65 64 20   can be reached 
8590: 62 79 20 61 20 73 68 69 66 74 20 61 63 74 69 6f  by a shift actio
85a0: 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  n..*/.PRIVATE vo
85b0: 69 64 20 62 75 69 6c 64 73 68 69 66 74 73 28 73  id buildshifts(s
85c0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
85d0: 70 2c 20 73 74 72 75 63 74 20 73 74 61 74 65 20  p, struct state 
85e0: 2a 73 74 70 29 0a 7b 0a 20 20 73 74 72 75 63 74  *stp).{.  struct
85f0: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 2f   config *cfp;  /
8600: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
8610: 72 75 20 74 68 65 20 63 6f 6e 66 69 67 20 63 6c  ru the config cl
8620: 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a  osure of "stp" *
8630: 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  /.  struct confi
8640: 67 20 2a 62 63 66 70 3b 20 2f 2a 20 46 6f 72 20  g *bcfp; /* For 
8650: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 6f  the inner loop o
8660: 6e 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65  n config closure
8670: 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20 73   of "stp" */.  s
8680: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
8690: 77 63 66 67 3b 20 20 2f 2a 20 2a 2f 0a 20 20 73  wcfg;  /* */.  s
86a0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
86b0: 3b 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f  ;   /* Symbol fo
86c0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74 20  llowing the dot 
86d0: 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  in configuration
86e0: 20 22 63 66 70 22 20 2a 2f 0a 20 20 73 74 72 75   "cfp" */.  stru
86f0: 63 74 20 73 79 6d 62 6f 6c 20 2a 62 73 70 3b 20  ct symbol *bsp; 
8700: 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f   /* Symbol follo
8710: 77 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e 20  wing the dot in 
8720: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 62  configuration "b
8730: 63 66 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74  cfp" */.  struct
8740: 20 73 74 61 74 65 20 2a 6e 65 77 73 74 70 3b 20   state *newstp; 
8750: 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  /* A pointer to 
8760: 61 20 73 75 63 63 65 73 73 6f 72 20 73 74 61 74  a successor stat
8770: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 61 63 68 20  e */..  /* Each 
8780: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 65  configuration be
8790: 63 6f 6d 65 73 20 63 6f 6d 70 6c 65 74 65 20 61  comes complete a
87a0: 66 74 65 72 20 69 74 20 63 6f 6e 74 69 62 75 74  fter it contibut
87b0: 65 73 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f  es to a successo
87c0: 72 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 49  r.  ** state.  I
87d0: 6e 69 74 69 61 6c 6c 79 2c 20 61 6c 6c 20 63 6f  nitially, all co
87e0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61 72 65  nfigurations are
87f0: 20 69 6e 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20   incomplete */. 
8800: 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66   for(cfp=stp->cf
8810: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
8820: 3e 6e 65 78 74 29 20 63 66 70 2d 3e 73 74 61 74  >next) cfp->stat
8830: 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b  us = INCOMPLETE;
8840: 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
8850: 75 67 68 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72  ugh all configur
8860: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 74  ations of the st
8870: 61 74 65 20 22 73 74 70 22 20 2a 2f 0a 20 20 66  ate "stp" */.  f
8880: 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b  or(cfp=stp->cfp;
8890: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
88a0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 63 66  ext){.    if( cf
88b0: 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c  p->status==COMPL
88c0: 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ETE ) continue; 
88d0: 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73     /* Already us
88e0: 65 64 20 62 79 20 69 6e 6e 65 72 20 6c 6f 6f 70  ed by inner loop
88f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 66 70 2d   */.    if( cfp-
8900: 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72 70 2d 3e 6e  >dot>=cfp->rp->n
8910: 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  rhs ) continue; 
8920: 20 2f 2a 20 43 61 6e 27 74 20 73 68 69 66 74 20   /* Can't shift 
8930: 74 68 69 73 20 63 6f 6e 66 69 67 20 2a 2f 0a 20  this config */. 
8940: 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65     Configlist_re
8950: 73 65 74 28 29 3b 20 20 20 20 20 20 20 20 20 20  set();          
8960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
8970: 65 73 65 74 20 74 68 65 20 6e 65 77 20 63 6f 6e  eset the new con
8980: 66 69 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 73  fig set */.    s
8990: 70 20 3d 20 63 66 70 2d 3e 72 70 2d 3e 72 68 73  p = cfp->rp->rhs
89a0: 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20  [cfp->dot];     
89b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f          /* Symbo
89c0: 6c 20 61 66 74 65 72 20 74 68 65 20 64 6f 74 20  l after the dot 
89d0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 65  */..    /* For e
89e0: 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69  very configurati
89f0: 6f 6e 20 69 6e 20 74 68 65 20 73 74 61 74 65 20  on in the state 
8a00: 22 73 74 70 22 20 77 68 69 63 68 20 68 61 73 20  "stp" which has 
8a10: 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 0a  the symbol "sp".
8a20: 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
8a30: 20 69 74 73 20 64 6f 74 2c 20 61 64 64 20 74 68   its dot, add th
8a40: 65 20 73 61 6d 65 20 63 6f 6e 66 69 67 75 72 61  e same configura
8a50: 74 69 6f 6e 20 74 6f 20 74 68 65 20 62 61 73 69  tion to the basi
8a60: 73 20 73 65 74 20 75 6e 64 65 72 0a 20 20 20 20  s set under.    
8a70: 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  ** construction 
8a80: 62 75 74 20 77 69 74 68 20 74 68 65 20 64 6f 74  but with the dot
8a90: 20 73 68 69 66 74 65 64 20 6f 6e 65 20 73 79 6d   shifted one sym
8aa0: 62 6f 6c 20 74 6f 20 74 68 65 20 72 69 67 68 74  bol to the right
8ab0: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 62 63 66  . */.    for(bcf
8ac0: 70 3d 63 66 70 3b 20 62 63 66 70 3b 20 62 63 66  p=cfp; bcfp; bcf
8ad0: 70 3d 62 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  p=bcfp->next){. 
8ae0: 20 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e 73       if( bcfp->s
8af0: 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20  tatus==COMPLETE 
8b00: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f  ) continue;    /
8b10: 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64 20 2a  * Already used *
8b20: 2f 0a 20 20 20 20 20 20 69 66 28 20 62 63 66 70  /.      if( bcfp
8b30: 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d 3e 72 70 2d  ->dot>=bcfp->rp-
8b40: 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65  >nrhs ) continue
8b50: 3b 20 2f 2a 20 43 61 6e 27 74 20 73 68 69 66 74  ; /* Can't shift
8b60: 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 20   this one */.   
8b70: 20 20 20 62 73 70 20 3d 20 62 63 66 70 2d 3e 72     bsp = bcfp->r
8b80: 70 2d 3e 72 68 73 5b 62 63 66 70 2d 3e 64 6f 74  p->rhs[bcfp->dot
8b90: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ];           /* 
8ba0: 47 65 74 20 73 79 6d 62 6f 6c 20 61 66 74 65 72  Get symbol after
8bb0: 20 64 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66   dot */.      if
8bc0: 28 20 21 73 61 6d 65 5f 73 79 6d 62 6f 6c 28 62  ( !same_symbol(b
8bd0: 73 70 2c 73 70 29 20 29 20 63 6f 6e 74 69 6e 75  sp,sp) ) continu
8be0: 65 3b 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20  e;      /* Must 
8bf0: 62 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20 22  be same as for "
8c00: 63 66 70 22 20 2a 2f 0a 20 20 20 20 20 20 62 63  cfp" */.      bc
8c10: 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d  fp->status = COM
8c20: 50 4c 45 54 45 3b 20 20 20 20 20 20 20 20 20 20  PLETE;          
8c30: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20          /* Mark 
8c40: 74 68 69 73 20 63 6f 6e 66 69 67 20 61 73 20 75  this config as u
8c50: 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 6e 65 77  sed */.      new
8c60: 63 66 67 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74  cfg = Configlist
8c70: 5f 61 64 64 62 61 73 69 73 28 62 63 66 70 2d 3e  _addbasis(bcfp->
8c80: 72 70 2c 62 63 66 70 2d 3e 64 6f 74 2b 31 29 3b  rp,bcfp->dot+1);
8c90: 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64  .      Plink_add
8ca0: 28 26 6e 65 77 63 66 67 2d 3e 62 70 6c 70 2c 62  (&newcfg->bplp,b
8cb0: 63 66 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  cfp);.    }..   
8cc0: 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65   /* Get a pointe
8cd0: 72 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 64  r to the state d
8ce0: 65 73 63 72 69 62 65 64 20 62 79 20 74 68 65 20  escribed by the 
8cf0: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
8d00: 69 6f 6e 20 73 65 74 0a 20 20 20 20 2a 2a 20 63  ion set.    ** c
8d10: 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
8d20: 65 20 70 72 65 63 65 64 69 6e 67 20 6c 6f 6f 70  e preceding loop
8d30: 20 2a 2f 0a 20 20 20 20 6e 65 77 73 74 70 20 3d   */.    newstp =
8d40: 20 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b   getstate(lemp);
8d50: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61  ..    /* The sta
8d60: 74 65 20 22 6e 65 77 73 74 70 22 20 69 73 20 72  te "newstp" is r
8d70: 65 61 63 68 65 64 20 66 72 6f 6d 20 74 68 65 20  eached from the 
8d80: 73 74 61 74 65 20 22 73 74 70 22 20 62 79 20 61  state "stp" by a
8d90: 20 73 68 69 66 74 20 61 63 74 69 6f 6e 0a 20 20   shift action.  
8da0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 79 6d 62    ** on the symb
8db0: 6f 6c 20 22 73 70 22 20 2a 2f 0a 20 20 20 20 69  ol "sp" */.    i
8dc0: 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c  f( sp->type==MUL
8dd0: 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
8de0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
8df0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 70 2d 3e   for(i=0; i<sp->
8e00: 6e 73 75 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20  nsubsym; i++){. 
8e10: 20 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64         Action_ad
8e20: 64 28 26 73 74 70 2d 3e 61 70 2c 53 48 49 46 54  d(&stp->ap,SHIFT
8e30: 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 69 5d 2c 28  ,sp->subsym[i],(
8e40: 63 68 61 72 2a 29 6e 65 77 73 74 70 29 3b 0a 20  char*)newstp);. 
8e50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
8e60: 7b 0a 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61  {.      Action_a
8e70: 64 64 28 26 73 74 70 2d 3e 61 70 2c 53 48 49 46  dd(&stp->ap,SHIF
8e80: 54 2c 73 70 2c 28 63 68 61 72 20 2a 29 6e 65 77  T,sp,(char *)new
8e90: 73 74 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  stp);.    }.  }.
8ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
8eb0: 63 74 20 74 68 65 20 70 72 6f 70 61 67 61 74 69  ct the propagati
8ec0: 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a 76 6f 69 64  on links.*/.void
8ed0: 20 46 69 6e 64 4c 69 6e 6b 73 28 73 74 72 75 63   FindLinks(struc
8ee0: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
8ef0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
8f00: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20  ct config *cfp, 
8f10: 2a 6f 74 68 65 72 3b 0a 20 20 73 74 72 75 63 74  *other;.  struct
8f20: 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73   state *stp;.  s
8f30: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70  truct plink *plp
8f40: 3b 0a 0a 20 20 2f 2a 20 48 6f 75 73 65 6b 65 65  ;..  /* Housekee
8f50: 70 69 6e 67 20 64 65 74 61 69 6c 3a 0a 20 20 2a  ping detail:.  *
8f60: 2a 20 41 64 64 20 74 6f 20 65 76 65 72 79 20 70  * Add to every p
8f70: 72 6f 70 61 67 61 74 65 20 6c 69 6e 6b 20 61 20  ropagate link a 
8f80: 70 6f 69 6e 74 65 72 20 62 61 63 6b 20 74 6f 20  pointer back to 
8f90: 74 68 65 20 73 74 61 74 65 20 74 6f 0a 20 20 2a  the state to.  *
8fa0: 2a 20 77 68 69 63 68 20 74 68 65 20 6c 69 6e 6b  * which the link
8fb0: 20 69 73 20 61 74 74 61 63 68 65 64 2e 20 2a 2f   is attached. */
8fc0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
8fd0: 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
8fe0: 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
8ff0: 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
9000: 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66   for(cfp=stp->cf
9010: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
9020: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 63 66  >next){.      cf
9030: 70 2d 3e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20  p->stp = stp;.  
9040: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f    }.  }..  /* Co
9050: 6e 76 65 72 74 20 61 6c 6c 20 62 61 63 6b 6c 69  nvert all backli
9060: 6e 6b 73 20 69 6e 74 6f 20 66 6f 72 77 61 72 64  nks into forward
9070: 20 6c 69 6e 6b 73 2e 20 20 4f 6e 6c 79 20 74 68   links.  Only th
9080: 65 20 66 6f 72 77 61 72 64 0a 20 20 2a 2a 20 6c  e forward.  ** l
9090: 69 6e 6b 73 20 61 72 65 20 75 73 65 64 20 69 6e  inks are used in
90a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20   the follow-set 
90b0: 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 20 2a 2f 0a  computation. */.
90c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
90d0: 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
90e0: 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
90f0: 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
9100: 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70  for(cfp=stp->cfp
9110: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
9120: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66 6f 72  next){.      for
9130: 28 70 6c 70 3d 63 66 70 2d 3e 62 70 6c 70 3b 20  (plp=cfp->bplp; 
9140: 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65  plp; plp=plp->ne
9150: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 6f 74 68  xt){.        oth
9160: 65 72 20 3d 20 70 6c 70 2d 3e 63 66 70 3b 0a 20  er = plp->cfp;. 
9170: 20 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64         Plink_add
9180: 28 26 6f 74 68 65 72 2d 3e 66 70 6c 70 2c 63 66  (&other->fplp,cf
9190: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
91a0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70  }.  }.}../* Comp
91b0: 75 74 65 20 61 6c 6c 20 66 6f 6c 6c 6f 77 73 65  ute all followse
91c0: 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 66 6f 6c 6c  ts..**.** A foll
91d0: 6f 77 73 65 74 20 69 73 20 74 68 65 20 73 65 74  owset is the set
91e0: 20 6f 66 20 61 6c 6c 20 73 79 6d 62 6f 6c 73 20   of all symbols 
91f0: 77 68 69 63 68 20 63 61 6e 20 63 6f 6d 65 20 69  which can come i
9200: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66  mmediately.** af
9210: 74 65 72 20 61 20 63 6f 6e 66 69 67 75 72 61 74  ter a configurat
9220: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e  ion..*/.void Fin
9230: 64 46 6f 6c 6c 6f 77 53 65 74 73 28 73 74 72 75  dFollowSets(stru
9240: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
9250: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
9260: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
9270: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
9280: 2a 70 6c 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67  *plp;.  int prog
9290: 72 65 73 73 3b 0a 20 20 69 6e 74 20 63 68 61 6e  ress;.  int chan
92a0: 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ge;..  for(i=0; 
92b0: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
92c0: 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 63 66  i++){.    for(cf
92d0: 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  p=lemp->sorted[i
92e0: 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  ]->cfp; cfp; cfp
92f0: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
9300: 20 20 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d     cfp->status =
9310: 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20   INCOMPLETE;.   
9320: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 64 6f 7b 0a   }.  }.  .  do{.
9330: 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30      progress = 0
9340: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
9350: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
9360: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 63  ++){.      for(c
9370: 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  fp=lemp->sorted[
9380: 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66  i]->cfp; cfp; cf
9390: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=cfp->next){.  
93a0: 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e 73        if( cfp->s
93b0: 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20  tatus==COMPLETE 
93c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
93d0: 20 20 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d      for(plp=cfp-
93e0: 3e 66 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d  >fplp; plp; plp=
93f0: 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  plp->next){.    
9400: 20 20 20 20 20 20 63 68 61 6e 67 65 20 3d 20 53        change = S
9410: 65 74 55 6e 69 6f 6e 28 70 6c 70 2d 3e 63 66 70  etUnion(plp->cfp
9420: 2d 3e 66 77 73 2c 63 66 70 2d 3e 66 77 73 29 3b  ->fws,cfp->fws);
9430: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
9440: 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 20  hange ){.       
9450: 20 20 20 20 20 70 6c 70 2d 3e 63 66 70 2d 3e 73       plp->cfp->s
9460: 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45  tatus = INCOMPLE
9470: 54 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  TE;.            
9480: 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20  progress = 1;.  
9490: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
94a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 66 70 2d    }.        cfp-
94b0: 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45  >status = COMPLE
94c0: 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
94d0: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67  }.  }while( prog
94e0: 72 65 73 73 20 29 3b 0a 7d 0a 0a 73 74 61 74 69  ress );.}..stati
94f0: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f  c int resolve_co
9500: 6e 66 6c 69 63 74 28 73 74 72 75 63 74 20 61 63  nflict(struct ac
9510: 74 69 6f 6e 20 2a 2c 73 74 72 75 63 74 20 61 63  tion *,struct ac
9520: 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a 20 43 6f 6d  tion *);../* Com
9530: 70 75 74 65 20 74 68 65 20 72 65 64 75 63 65 20  pute the reduce 
9540: 61 63 74 69 6f 6e 73 2c 20 61 6e 64 20 72 65 73  actions, and res
9550: 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73 2e 0a  olve conflicts..
9560: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 41 63 74 69  */.void FindActi
9570: 6f 6e 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ons(struct lemon
9580: 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20   *lemp).{.  int 
9590: 69 2c 6a 3b 0a 20 20 73 74 72 75 63 74 20 63 6f  i,j;.  struct co
95a0: 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72  nfig *cfp;.  str
95b0: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
95c0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
95d0: 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75  *sp;.  struct ru
95e0: 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f 2a 20 41 64  le *rp;..  /* Ad
95f0: 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 64  d all of the red
9600: 75 63 65 20 61 63 74 69 6f 6e 73 20 0a 20 20 2a  uce actions .  *
9610: 2a 20 41 20 72 65 64 75 63 65 20 61 63 74 69 6f  * A reduce actio
9620: 6e 20 69 73 20 61 64 64 65 64 20 66 6f 72 20 65  n is added for e
9630: 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ach element of t
9640: 68 65 20 66 6f 6c 6c 6f 77 73 65 74 20 6f 66 0a  he followset of.
9650: 20 20 2a 2a 20 61 20 63 6f 6e 66 69 67 75 72 61    ** a configura
9660: 74 69 6f 6e 20 77 68 69 63 68 20 68 61 73 20 69  tion which has i
9670: 74 73 20 64 6f 74 20 61 74 20 74 68 65 20 65 78  ts dot at the ex
9680: 74 72 65 6d 65 20 72 69 67 68 74 2e 0a 20 20 2a  treme right..  *
9690: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
96a0: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
96b0: 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  ){   /* Loop ove
96c0: 72 20 61 6c 6c 20 73 74 61 74 65 73 20 2a 2f 0a  r all states */.
96d0: 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
96e0: 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66  sorted[i];.    f
96f0: 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b  or(cfp=stp->cfp;
9700: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
9710: 65 78 74 29 7b 20 20 2f 2a 20 4c 6f 6f 70 20 6f  ext){  /* Loop o
9720: 76 65 72 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72  ver all configur
9730: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ations */.      
9740: 69 66 28 20 63 66 70 2d 3e 72 70 2d 3e 6e 72 68  if( cfp->rp->nrh
9750: 73 3d 3d 63 66 70 2d 3e 64 6f 74 20 29 7b 20 20  s==cfp->dot ){  
9760: 20 20 20 20 20 20 2f 2a 20 49 73 20 64 6f 74 20        /* Is dot 
9770: 61 74 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  at extreme right
9780: 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  ? */.        for
9790: 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74  (j=0; j<lemp->nt
97a0: 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20  erminal; j++){. 
97b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 53 65 74           if( Set
97c0: 46 69 6e 64 28 63 66 70 2d 3e 66 77 73 2c 6a 29  Find(cfp->fws,j)
97d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
97e0: 2f 2a 20 41 64 64 20 61 20 72 65 64 75 63 65 20  /* Add a reduce 
97f0: 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 73 74  action to the st
9800: 61 74 65 20 22 73 74 70 22 20 77 68 69 63 68 20  ate "stp" which 
9810: 77 69 6c 6c 20 72 65 64 75 63 65 20 62 79 20 74  will reduce by t
9820: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
9830: 2a 20 72 75 6c 65 20 22 63 66 70 2d 3e 72 70 22  * rule "cfp->rp"
9840: 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   if the lookahea
9850: 64 20 73 79 6d 62 6f 6c 20 69 73 20 22 6c 65 6d  d symbol is "lem
9860: 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 22 20 2a  p->symbols[j]" *
9870: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 63  /.            Ac
9880: 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61  tion_add(&stp->a
9890: 70 2c 52 45 44 55 43 45 2c 6c 65 6d 70 2d 3e 73  p,REDUCE,lemp->s
98a0: 79 6d 62 6f 6c 73 5b 6a 5d 2c 28 63 68 61 72 20  ymbols[j],(char 
98b0: 2a 29 63 66 70 2d 3e 72 70 29 3b 0a 20 20 20 20  *)cfp->rp);.    
98c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
98d0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
98e0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
98f0: 65 20 61 63 63 65 70 74 69 6e 67 20 74 6f 6b 65  e accepting toke
9900: 6e 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d  n */.  if( lemp-
9910: 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73 70  >start ){.    sp
9920: 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c   = Symbol_find(l
9930: 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20  emp->start);.   
9940: 20 69 66 28 20 73 70 3d 3d 30 20 29 20 73 70 20   if( sp==0 ) sp 
9950: 3d 20 6c 65 6d 70 2d 3e 73 74 61 72 74 52 75 6c  = lemp->startRul
9960: 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65 6c 73 65 7b  e->lhs;.  }else{
9970: 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
9980: 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73 3b 0a  startRule->lhs;.
9990: 20 20 7d 0a 20 20 2f 2a 20 41 64 64 20 74 6f 20    }.  /* Add to 
99a0: 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 20  the first state 
99b0: 28 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73  (which is always
99c0: 20 74 68 65 20 73 74 61 72 74 69 6e 67 20 73 74   the starting st
99d0: 61 74 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ate of the.  ** 
99e0: 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63  finite state mac
99f0: 68 69 6e 65 29 20 61 6e 20 61 63 74 69 6f 6e 20  hine) an action 
9a00: 74 6f 20 41 43 43 45 50 54 20 69 66 20 74 68 65  to ACCEPT if the
9a10: 20 6c 6f 6f 6b 61 68 65 61 64 20 69 73 20 74 68   lookahead is th
9a20: 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6e 6f 6e  e.  ** start non
9a30: 74 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f 0a 20 20  terminal.  */.  
9a40: 41 63 74 69 6f 6e 5f 61 64 64 28 26 6c 65 6d 70  Action_add(&lemp
9a50: 2d 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e 61 70 2c  ->sorted[0]->ap,
9a60: 41 43 43 45 50 54 2c 73 70 2c 30 29 3b 0a 0a 20  ACCEPT,sp,0);.. 
9a70: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 63 6f 6e 66   /* Resolve conf
9a80: 6c 69 63 74 73 20 2a 2f 0a 20 20 66 6f 72 28 69  licts */.  for(i
9a90: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
9aa0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
9ab0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c  ruct action *ap,
9ac0: 20 2a 6e 61 70 3b 0a 20 20 20 20 73 74 70 20 3d   *nap;.    stp =
9ad0: 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
9ae0: 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28  ;.    /* assert(
9af0: 20 73 74 70 2d 3e 61 70 20 29 3b 20 2a 2f 0a 20   stp->ap ); */. 
9b00: 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63 74     stp->ap = Act
9b10: 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70  ion_sort(stp->ap
9b20: 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  );.    for(ap=st
9b30: 70 2d 3e 61 70 3b 20 61 70 20 26 26 20 61 70 2d  p->ap; ap && ap-
9b40: 3e 6e 65 78 74 3b 20 61 70 3d 61 70 2d 3e 6e 65  >next; ap=ap->ne
9b50: 78 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6e  xt){.      for(n
9b60: 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 6e 61 70  ap=ap->next; nap
9b70: 20 26 26 20 6e 61 70 2d 3e 73 70 3d 3d 61 70 2d   && nap->sp==ap-
9b80: 3e 73 70 3b 20 6e 61 70 3d 6e 61 70 2d 3e 6e 65  >sp; nap=nap->ne
9b90: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 2f 2a  xt){.         /*
9ba0: 20 54 68 65 20 74 77 6f 20 61 63 74 69 6f 6e 73   The two actions
9bb0: 20 22 61 70 22 20 61 6e 64 20 22 6e 61 70 22 20   "ap" and "nap" 
9bc0: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6c 6f  have the same lo
9bd0: 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 20 20 20  okahead..       
9be0: 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20    ** Figure out 
9bf0: 77 68 69 63 68 20 6f 6e 65 20 73 68 6f 75 6c 64  which one should
9c00: 20 62 65 20 75 73 65 64 20 2a 2f 0a 20 20 20 20   be used */.    
9c10: 20 20 20 20 20 6c 65 6d 70 2d 3e 6e 63 6f 6e 66       lemp->nconf
9c20: 6c 69 63 74 20 2b 3d 20 72 65 73 6f 6c 76 65 5f  lict += resolve_
9c30: 63 6f 6e 66 6c 69 63 74 28 61 70 2c 6e 61 70 29  conflict(ap,nap)
9c40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9c50: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74    }..  /* Report
9c60: 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 65 61   an error for ea
9c70: 63 68 20 72 75 6c 65 20 74 68 61 74 20 63 61 6e  ch rule that can
9c80: 20 6e 65 76 65 72 20 62 65 20 72 65 64 75 63 65   never be reduce
9c90: 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c  d. */.  for(rp=l
9ca0: 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
9cb0: 70 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e  p=rp->next) rp->
9cc0: 63 61 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f  canReduce = LEMO
9cd0: 4e 5f 46 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69  N_FALSE;.  for(i
9ce0: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
9cf0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
9d00: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b  ruct action *ap;
9d10: 0a 20 20 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70  .    for(ap=lemp
9d20: 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b  ->sorted[i]->ap;
9d30: 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
9d40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  ){.      if( ap-
9d50: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 20  >type==REDUCE ) 
9d60: 61 70 2d 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64  ap->x.rp->canRed
9d70: 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45  uce = LEMON_TRUE
9d80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
9d90: 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
9da0: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
9db0: 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63  ){.    if( rp->c
9dc0: 61 6e 52 65 64 75 63 65 20 29 20 63 6f 6e 74 69  anReduce ) conti
9dd0: 6e 75 65 3b 0a 20 20 20 20 45 72 72 6f 72 4d 73  nue;.    ErrorMs
9de0: 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  g(lemp->filename
9df0: 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 22 54  ,rp->ruleline,"T
9e00: 68 69 73 20 72 75 6c 65 20 63 61 6e 20 6e 6f 74  his rule can not
9e10: 20 62 65 20 72 65 64 75 63 65 64 2e 5c 6e 22 29   be reduced.\n")
9e20: 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
9e30: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  rcnt++;.  }.}../
9e40: 2a 20 52 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66  * Resolve a conf
9e50: 6c 69 63 74 20 62 65 74 77 65 65 6e 20 74 68 65  lict between the
9e60: 20 74 77 6f 20 67 69 76 65 6e 20 61 63 74 69 6f   two given actio
9e70: 6e 73 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63  ns.  If the.** c
9e80: 6f 6e 66 6c 69 63 74 20 63 61 6e 27 74 20 62 65  onflict can't be
9e90: 20 72 65 73 6f 6c 76 65 64 2c 20 72 65 74 75 72   resolved, retur
9ea0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  n non-zero..**.*
9eb0: 2a 20 4e 4f 20 4c 4f 4e 47 45 52 20 54 52 55 45  * NO LONGER TRUE
9ec0: 3a 0a 2a 2a 20 20 20 54 6f 20 72 65 73 6f 6c 76  :.**   To resolv
9ed0: 65 20 61 20 63 6f 6e 66 6c 69 63 74 2c 20 66 69  e a conflict, fi
9ee0: 72 73 74 20 6c 6f 6f 6b 20 74 6f 20 73 65 65 20  rst look to see 
9ef0: 69 66 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e  if either action
9f00: 0a 2a 2a 20 20 20 69 73 20 6f 6e 20 61 6e 20 65  .**   is on an e
9f10: 72 72 6f 72 20 72 75 6c 65 2e 20 20 49 6e 20 74  rror rule.  In t
9f20: 68 61 74 20 63 61 73 65 2c 20 74 61 6b 65 20 74  hat case, take t
9f30: 68 65 20 61 63 74 69 6f 6e 20 77 68 69 63 68 0a  he action which.
9f40: 2a 2a 20 20 20 69 73 20 6e 6f 74 20 61 73 73 6f  **   is not asso
9f50: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
9f60: 65 72 72 6f 72 20 72 75 6c 65 2e 20 20 49 66 20  error rule.  If 
9f70: 6e 65 69 74 68 65 72 20 6f 72 20 62 6f 74 68 0a  neither or both.
9f80: 2a 2a 20 20 20 61 63 74 69 6f 6e 73 20 61 72 65  **   actions are
9f90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9fa0: 20 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2c 20   an error rule, 
9fb0: 74 68 65 6e 20 74 72 79 20 74 6f 0a 2a 2a 20 20  then try to.**  
9fc0: 20 75 73 65 20 70 72 65 63 65 64 65 6e 63 65 20   use precedence 
9fd0: 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 63  to resolve the c
9fe0: 6f 6e 66 6c 69 63 74 2e 0a 2a 2a 0a 2a 2a 20 49  onflict..**.** I
9ff0: 66 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 20  f either action 
a000: 69 73 20 61 20 53 48 49 46 54 2c 20 74 68 65 6e  is a SHIFT, then
a010: 20 69 74 20 6d 75 73 74 20 62 65 20 61 70 78 2e   it must be apx.
a020: 20 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69    This.** functi
a030: 6f 6e 20 77 6f 6e 27 74 20 77 6f 72 6b 20 69 66  on won't work if
a040: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55   apx->type==REDU
a050: 43 45 20 61 6e 64 20 61 70 79 2d 3e 74 79 70 65  CE and apy->type
a060: 3d 3d 53 48 49 46 54 2e 0a 2a 2f 0a 73 74 61 74  ==SHIFT..*/.stat
a070: 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63  ic int resolve_c
a080: 6f 6e 66 6c 69 63 74 28 0a 20 20 73 74 72 75 63  onflict(.  struc
a090: 74 20 61 63 74 69 6f 6e 20 2a 61 70 78 2c 0a 20  t action *apx,. 
a0a0: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
a0b0: 61 70 79 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  apy.){.  struct 
a0c0: 73 79 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70  symbol *spx, *sp
a0d0: 79 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20  y;.  int errcnt 
a0e0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61  = 0;.  assert( a
a0f0: 70 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20  px->sp==apy->sp 
a100: 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  );  /* Otherwise
a110: 20 74 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20   there would be 
a120: 6e 6f 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  no conflict */. 
a130: 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d   if( apx->type==
a140: 53 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79  SHIFT && apy->ty
a150: 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20  pe==SHIFT ){.   
a160: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 53 53 43   apy->type = SSC
a170: 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 65 72 72  ONFLICT;.    err
a180: 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  cnt++;.  }.  if(
a190: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46   apx->type==SHIF
a1a0: 54 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d  T && apy->type==
a1b0: 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70  REDUCE ){.    sp
a1c0: 78 20 3d 20 61 70 78 2d 3e 73 70 3b 0a 20 20 20  x = apx->sp;.   
a1d0: 20 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70   spy = apy->x.rp
a1e0: 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 69  ->precsym;.    i
a1f0: 66 28 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78  f( spy==0 || spx
a200: 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70 79 2d  ->prec<0 || spy-
a210: 3e 70 72 65 63 3c 30 20 29 7b 0a 20 20 20 20 20  >prec<0 ){.     
a220: 20 2f 2a 20 4e 6f 74 20 65 6e 6f 75 67 68 20 70   /* Not enough p
a230: 72 65 63 65 64 65 6e 63 65 20 69 6e 66 6f 72 6d  recedence inform
a240: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
a250: 61 70 79 2d 3e 74 79 70 65 20 3d 20 53 52 43 4f  apy->type = SRCO
a260: 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72  NFLICT;.      er
a270: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  rcnt++;.    }els
a280: 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e  e if( spx->prec>
a290: 73 70 79 2d 3e 70 72 65 63 20 29 7b 20 20 20 20  spy->prec ){    
a2a0: 2f 2a 20 68 69 67 68 65 72 20 70 72 65 63 65 64  /* higher preced
a2b0: 65 6e 63 65 20 77 69 6e 73 20 2a 2f 0a 20 20 20  ence wins */.   
a2c0: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52     apy->type = R
a2d0: 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20  D_RESOLVED;.    
a2e0: 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70  }else if( spx->p
a2f0: 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b  rec<spy->prec ){
a300: 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65  .      apx->type
a310: 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a   = SH_RESOLVED;.
a320: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
a330: 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72  x->prec==spy->pr
a340: 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63  ec && spx->assoc
a350: 3d 3d 52 49 47 48 54 20 29 7b 20 2f 2a 20 55 73  ==RIGHT ){ /* Us
a360: 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  e operator */.  
a370: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
a380: 52 44 5f 52 45 53 4f 4c 56 45 44 3b 20 20 20 20  RD_RESOLVED;    
a390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 6f           /* asso
a3b0: 63 69 61 74 69 76 69 74 79 20 2a 2f 0a 20 20 20  ciativity */.   
a3c0: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
a3d0: 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20  prec==spy->prec 
a3e0: 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4c  && spx->assoc==L
a3f0: 45 46 54 20 29 7b 20 20 2f 2a 20 74 6f 20 62 72  EFT ){  /* to br
a400: 65 61 6b 20 74 69 65 20 2a 2f 0a 20 20 20 20 20  eak tie */.     
a410: 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f   apx->type = SH_
a420: 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65  RESOLVED;.    }e
a430: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
a440: 74 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70  t( spx->prec==sp
a450: 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e  y->prec && spx->
a460: 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a 20  assoc==NONE );. 
a470: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d       apx->type =
a480: 20 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20   ERROR;.    }.  
a490: 7d 65 6c 73 65 20 69 66 28 20 61 70 78 2d 3e 74  }else if( apx->t
a4a0: 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61  ype==REDUCE && a
a4b0: 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  py->type==REDUCE
a4c0: 20 29 7b 0a 20 20 20 20 73 70 78 20 3d 20 61 70   ){.    spx = ap
a4d0: 78 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d  x->x.rp->precsym
a4e0: 3b 0a 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d  ;.    spy = apy-
a4f0: 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a  >x.rp->precsym;.
a500: 20 20 20 20 69 66 28 20 73 70 78 3d 3d 30 20 7c      if( spx==0 |
a510: 7c 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d  | spy==0 || spx-
a520: 3e 70 72 65 63 3c 30 20 7c 7c 0a 20 20 20 20 73  >prec<0 ||.    s
a530: 70 79 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70  py->prec<0 || sp
a540: 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72  x->prec==spy->pr
a550: 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70 79 2d  ec ){.      apy-
a560: 3e 74 79 70 65 20 3d 20 52 52 43 4f 4e 46 4c 49  >type = RRCONFLI
a570: 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74  CT;.      errcnt
a580: 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ++;.    }else if
a590: 28 20 73 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d  ( spx->prec>spy-
a5a0: 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61  >prec ){.      a
a5b0: 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45  py->type = RD_RE
a5c0: 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73  SOLVED;.    }els
a5d0: 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3c  e if( spx->prec<
a5e0: 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20  spy->prec ){.   
a5f0: 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 52     apx->type = R
a600: 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20  D_RESOLVED;.    
a610: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
a620: 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 61 70  ssert( .      ap
a630: 78 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f  x->type==SH_RESO
a640: 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70  LVED ||.      ap
a650: 78 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f  x->type==RD_RESO
a660: 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70  LVED ||.      ap
a670: 78 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e 46 4c  x->type==SSCONFL
a680: 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 78  ICT ||.      apx
a690: 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46 4c 49  ->type==SRCONFLI
a6a0: 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d  CT ||.      apx-
a6b0: 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c 49 43  >type==RRCONFLIC
a6c0: 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e  T ||.      apy->
a6d0: 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45  type==SH_RESOLVE
a6e0: 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e  D ||.      apy->
a6f0: 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45  type==RD_RESOLVE
a700: 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e  D ||.      apy->
a710: 74 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49 43 54  type==SSCONFLICT
a720: 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   ||.      apy->t
a730: 79 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43 54 20  ype==SRCONFLICT 
a740: 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  ||.      apy->ty
a750: 70 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54 0a 20  pe==RRCONFLICT. 
a760: 20 20 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65     );.    /* The
a770: 20 52 45 44 55 43 45 2f 53 48 49 46 54 20 63 61   REDUCE/SHIFT ca
a780: 73 65 20 63 61 6e 6e 6f 74 20 68 61 70 70 65 6e  se cannot happen
a790: 20 62 65 63 61 75 73 65 20 53 48 49 46 54 73 20   because SHIFTs 
a7a0: 63 6f 6d 65 20 62 65 66 6f 72 65 0a 20 20 20 20  come before.    
a7b0: 2a 2a 20 52 45 44 55 43 45 73 20 6f 6e 20 74 68  ** REDUCEs on th
a7c0: 65 20 6c 69 73 74 2e 20 20 49 66 20 77 65 20 72  e list.  If we r
a7d0: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20  each this point 
a7e0: 69 74 20 6d 75 73 74 20 62 65 20 62 65 63 61 75  it must be becau
a7f0: 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  se.    ** the pa
a800: 72 73 65 72 20 63 6f 6e 66 6c 69 63 74 20 68 61  rser conflict ha
a810: 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  d already been r
a820: 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 7d 0a  esolved. */.  }.
a830: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b    return errcnt;
a840: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
a850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
a860: 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c  he file "configl
a870: 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ist.c" *********
a880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a890: 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  /./*.** Routines
a8a0: 20 74 6f 20 70 72 6f 63 65 73 73 69 6e 67 20 61   to processing a
a8b0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
a8c0: 69 73 74 20 61 6e 64 20 62 75 69 6c 64 69 6e 67  ist and building
a8d0: 20 61 20 73 74 61 74 65 0a 2a 2a 20 69 6e 20 74   a state.** in t
a8e0: 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
a8f0: 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73  generator..*/..s
a900: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
a910: 66 69 67 20 2a 66 72 65 65 6c 69 73 74 20 3d 20  fig *freelist = 
a920: 30 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  0;      /* List 
a930: 6f 66 20 66 72 65 65 20 63 6f 6e 66 69 67 75 72  of free configur
a940: 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
a950: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
a960: 63 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20  current = 0;    
a970: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73     /* Top of lis
a980: 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61 74 69  t of configurati
a990: 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ons */.static st
a9a0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a 63 75  ruct config **cu
a9b0: 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 20 20 20  rrentend = 0;   
a9c0: 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c 69 73 74 20  /* Last on list 
a9d0: 6f 66 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74  of configs */.st
a9e0: 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66  atic struct conf
a9f0: 69 67 20 2a 62 61 73 69 73 20 3d 20 30 3b 20 20  ig *basis = 0;  
aa00: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
aa10: 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20 63   list of basis c
aa20: 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74 69 63  onfigs */.static
aa30: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
aa40: 2a 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 20 20  *basisend = 0;  
aa50: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c 69 73     /* End of lis
aa60: 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e 66 69  t of basis confi
aa70: 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74 75 72 6e  gs */../* Return
aa80: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
aa90: 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  new configuratio
aaa0: 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72  n */.PRIVATE str
aab0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63  uct config *newc
aac0: 6f 6e 66 69 67 28 76 6f 69 64 29 7b 0a 20 20 73  onfig(void){.  s
aad0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
aae0: 77 63 66 67 3b 0a 20 20 69 66 28 20 66 72 65 65  wcfg;.  if( free
aaf0: 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  list==0 ){.    i
ab00: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d  nt i;.    int am
ab10: 74 20 3d 20 33 3b 0a 20 20 20 20 66 72 65 65 6c  t = 3;.    freel
ab20: 69 73 74 20 3d 20 28 73 74 72 75 63 74 20 63 6f  ist = (struct co
ab30: 6e 66 69 67 20 2a 29 63 61 6c 6c 6f 63 28 20 61  nfig *)calloc( a
ab40: 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63  mt, sizeof(struc
ab50: 74 20 63 6f 6e 66 69 67 29 20 29 3b 0a 20 20 20  t config) );.   
ab60: 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30   if( freelist==0
ab70: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
ab80: 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65  f(stderr,"Unable
ab90: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
aba0: 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 63 6f  ory for a new co
abb0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 22 29 3b 0a  nfiguration.");.
abc0: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
abd0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
abe0: 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20  ; i<amt-1; i++) 
abf0: 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74  freelist[i].next
ac00: 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31   = &freelist[i+1
ac10: 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b  ];.    freelist[
ac20: 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b  amt-1].next = 0;
ac30: 0a 20 20 7d 0a 20 20 6e 65 77 63 66 67 20 3d 20  .  }.  newcfg = 
ac40: 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65  freelist;.  free
ac50: 6c 69 73 74 20 3d 20 66 72 65 65 6c 69 73 74 2d  list = freelist-
ac60: 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20  >next;.  return 
ac70: 6e 65 77 63 66 67 3b 0a 7d 0a 0a 2f 2a 20 54 68  newcfg;.}../* Th
ac80: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
ac90: 22 6f 6c 64 22 20 69 73 20 6e 6f 20 6c 6f 6e 67  "old" is no long
aca0: 65 72 20 75 73 65 64 20 2a 2f 0a 50 52 49 56 41  er used */.PRIVA
acb0: 54 45 20 76 6f 69 64 20 64 65 6c 65 74 65 63 6f  TE void deleteco
acc0: 6e 66 69 67 28 73 74 72 75 63 74 20 63 6f 6e 66  nfig(struct conf
acd0: 69 67 20 2a 6f 6c 64 29 0a 7b 0a 20 20 6f 6c 64  ig *old).{.  old
ace0: 2d 3e 6e 65 78 74 20 3d 20 66 72 65 65 6c 69 73  ->next = freelis
acf0: 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20  t;.  freelist = 
ad00: 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69  old;.}../* Initi
ad10: 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69  alized the confi
ad20: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75  guration list bu
ad30: 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f  ilder */.void Co
ad40: 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 76 6f  nfiglist_init(vo
ad50: 69 64 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d  id){.  current =
ad60: 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64   0;.  currentend
ad70: 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20 62   = &current;.  b
ad80: 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69  asis = 0;.  basi
ad90: 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a 20  send = &basis;. 
ada0: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69   Configtable_ini
adb0: 74 28 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  t();.  return;.}
adc0: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64  ../* Initialized
add0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
ade0: 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20  on list builder 
adf0: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
ae00: 73 74 5f 72 65 73 65 74 28 76 6f 69 64 29 7b 0a  st_reset(void){.
ae10: 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20    current = 0;. 
ae20: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63   currentend = &c
ae30: 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73 20  urrent;.  basis 
ae40: 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20  = 0;.  basisend 
ae50: 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66  = &basis;.  Conf
ae60: 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 30 29  igtable_clear(0)
ae70: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
ae80: 2a 20 41 64 64 20 61 6e 6f 74 68 65 72 20 63 6f  * Add another co
ae90: 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74  nfiguration to t
aea0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
aeb0: 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20   list */.struct 
aec0: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
aed0: 73 74 5f 61 64 64 28 0a 20 20 73 74 72 75 63 74  st_add(.  struct
aee0: 20 72 75 6c 65 20 2a 72 70 2c 20 20 20 20 2f 2a   rule *rp,    /*
aef0: 20 54 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69   The rule */.  i
af00: 6e 74 20 64 6f 74 20 20 20 20 20 20 20 20 20 20  nt dot          
af10: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
af20: 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
af30: 72 75 6c 65 20 77 68 65 72 65 20 74 68 65 20 64  rule where the d
af40: 6f 74 20 67 6f 65 73 20 2a 2f 0a 29 7b 0a 20 20  ot goes */.){.  
af50: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
af60: 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73  fp, model;..  as
af70: 73 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64  sert( currentend
af80: 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72  !=0 );.  model.r
af90: 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e  p = rp;.  model.
afa0: 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70  dot = dot;.  cfp
afb0: 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66   = Configtable_f
afc0: 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69  ind(&model);.  i
afd0: 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20  f( cfp==0 ){.   
afe0: 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67   cfp = newconfig
aff0: 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20  ();.    cfp->rp 
b000: 3d 20 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64  = rp;.    cfp->d
b010: 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66  ot = dot;.    cf
b020: 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28  p->fws = SetNew(
b030: 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20  );.    cfp->stp 
b040: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70  = 0;.    cfp->fp
b050: 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d  lp = cfp->bplp =
b060: 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78   0;.    cfp->nex
b070: 74 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  t = 0;.    cfp->
b080: 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72  bp = 0;.    *cur
b090: 72 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20  rentend = cfp;. 
b0a0: 20 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20     currentend = 
b0b0: 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20  &cfp->next;.    
b0c0: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65  Configtable_inse
b0d0: 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72  rt(cfp);.  }.  r
b0e0: 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a  eturn cfp;.}../*
b0f0: 20 41 64 64 20 61 20 62 61 73 69 73 20 63 6f 6e   Add a basis con
b100: 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68  figuration to th
b110: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
b120: 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63  list */.struct c
b130: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73  onfig *Configlis
b140: 74 5f 61 64 64 62 61 73 69 73 28 73 74 72 75 63  t_addbasis(struc
b150: 74 20 72 75 6c 65 20 2a 72 70 2c 20 69 6e 74 20  t rule *rp, int 
b160: 64 6f 74 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  dot).{.  struct 
b170: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64  config *cfp, mod
b180: 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62  el;..  assert( b
b190: 61 73 69 73 65 6e 64 21 3d 30 20 29 3b 0a 20 20  asisend!=0 );.  
b1a0: 61 73 73 65 72 74 28 20 63 75 72 72 65 6e 74 65  assert( currente
b1b0: 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c  nd!=0 );.  model
b1c0: 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65  .rp = rp;.  mode
b1d0: 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63  l.dot = dot;.  c
b1e0: 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65  fp = Configtable
b1f0: 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20  _find(&model);. 
b200: 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20   if( cfp==0 ){. 
b210: 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66     cfp = newconf
b220: 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72  ig();.    cfp->r
b230: 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70 2d  p = rp;.    cfp-
b240: 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20  >dot = dot;.    
b250: 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65  cfp->fws = SetNe
b260: 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74  w();.    cfp->st
b270: 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  p = 0;.    cfp->
b280: 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70  fplp = cfp->bplp
b290: 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e   = 0;.    cfp->n
b2a0: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  ext = 0;.    cfp
b2b0: 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63  ->bp = 0;.    *c
b2c0: 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b  urrentend = cfp;
b2d0: 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64 20  .    currentend 
b2e0: 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20  = &cfp->next;.  
b2f0: 20 20 2a 62 61 73 69 73 65 6e 64 20 3d 20 63 66    *basisend = cf
b300: 70 3b 0a 20 20 20 20 62 61 73 69 73 65 6e 64 20  p;.    basisend 
b310: 3d 20 26 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20  = &cfp->bp;.    
b320: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65  Configtable_inse
b330: 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72  rt(cfp);.  }.  r
b340: 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a  eturn cfp;.}../*
b350: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6c 6f   Compute the clo
b360: 73 75 72 65 20 6f 66 20 74 68 65 20 63 6f 6e 66  sure of the conf
b370: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a  iguration list *
b380: 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  /.void Configlis
b390: 74 5f 63 6c 6f 73 75 72 65 28 73 74 72 75 63 74  t_closure(struct
b3a0: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
b3b0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
b3c0: 2a 63 66 70 2c 20 2a 6e 65 77 63 66 70 3b 0a 20  *cfp, *newcfp;. 
b3d0: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
b3e0: 2c 20 2a 6e 65 77 72 70 3b 0a 20 20 73 74 72 75  , *newrp;.  stru
b3f0: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 20 2a  ct symbol *sp, *
b400: 78 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 64 6f  xsp;.  int i, do
b410: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
b420: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
b430: 20 66 6f 72 28 63 66 70 3d 63 75 72 72 65 6e 74   for(cfp=current
b440: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
b450: 6e 65 78 74 29 7b 0a 20 20 20 20 72 70 20 3d 20  next){.    rp = 
b460: 63 66 70 2d 3e 72 70 3b 0a 20 20 20 20 64 6f 74  cfp->rp;.    dot
b470: 20 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a 20 20 20   = cfp->dot;.   
b480: 20 69 66 28 20 64 6f 74 3e 3d 72 70 2d 3e 6e 72   if( dot>=rp->nr
b490: 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  hs ) continue;. 
b4a0: 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b     sp = rp->rhs[
b4b0: 64 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20 73 70  dot];.    if( sp
b4c0: 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49  ->type==NONTERMI
b4d0: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  NAL ){.      if(
b4e0: 20 73 70 2d 3e 72 75 6c 65 3d 3d 30 20 26 26 20   sp->rule==0 && 
b4f0: 73 70 21 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  sp!=lemp->errsym
b500: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
b510: 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
b520: 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c 22 4e 6f  ame,rp->line,"No
b530: 6e 74 65 72 6d 69 6e 61 6c 20 5c 22 25 73 5c 22  nterminal \"%s\"
b540: 20 68 61 73 20 6e 6f 20 72 75 6c 65 73 2e 22 2c   has no rules.",
b550: 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 6e  .          sp->n
b560: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6c 65  ame);.        le
b570: 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
b580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
b590: 72 28 6e 65 77 72 70 3d 73 70 2d 3e 72 75 6c 65  r(newrp=sp->rule
b5a0: 3b 20 6e 65 77 72 70 3b 20 6e 65 77 72 70 3d 6e  ; newrp; newrp=n
b5b0: 65 77 72 70 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a  ewrp->nextlhs){.
b5c0: 20 20 20 20 20 20 20 20 6e 65 77 63 66 70 20 3d          newcfp =
b5d0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28   Configlist_add(
b5e0: 6e 65 77 72 70 2c 30 29 3b 0a 20 20 20 20 20 20  newrp,0);.      
b5f0: 20 20 66 6f 72 28 69 3d 64 6f 74 2b 31 3b 20 69    for(i=dot+1; i
b600: 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
b610: 0a 20 20 20 20 20 20 20 20 20 20 78 73 70 20 3d  .          xsp =
b620: 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
b630: 20 20 20 20 20 20 20 69 66 28 20 78 73 70 2d 3e         if( xsp->
b640: 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29  type==TERMINAL )
b650: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 65  {.            Se
b660: 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73  tAdd(newcfp->fws
b670: 2c 78 73 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20  ,xsp->index);.  
b680: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b690: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
b6a0: 20 69 66 28 20 78 73 70 2d 3e 74 79 70 65 3d 3d   if( xsp->type==
b6b0: 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
b6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
b6d0: 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
b6e0: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 78 73 70 2d 3e  for(k=0; k<xsp->
b6f0: 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20  nsubsym; k++){. 
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74               Set
b710: 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c  Add(newcfp->fws,
b720: 20 78 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d   xsp->subsym[k]-
b730: 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20  >index);.       
b740: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b750: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b760: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b770: 20 20 20 20 20 20 20 53 65 74 55 6e 69 6f 6e 28         SetUnion(
b780: 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d  newcfp->fws,xsp-
b790: 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20  >firstset);.    
b7a0: 20 20 20 20 20 20 20 20 69 66 28 20 78 73 70 2d          if( xsp-
b7b0: 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46  >lambda==LEMON_F
b7c0: 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20  ALSE ) break;.  
b7d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b7e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
b7f0: 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 50 6c  i==rp->nrhs ) Pl
b800: 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e 66 70  ink_add(&cfp->fp
b810: 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20 20 20  lp,newcfp);.    
b820: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
b830: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f  return;.}../* So
b840: 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  rt the configura
b850: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69  tion list */.voi
b860: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72  d Configlist_sor
b870: 74 28 76 6f 69 64 29 7b 0a 20 20 63 75 72 72 65  t(void){.  curre
b880: 6e 74 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e  nt = (struct con
b890: 66 69 67 2a 29 6d 73 6f 72 74 28 28 63 68 61 72  fig*)msort((char
b8a0: 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72 2a  *)current,(char*
b8b0: 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 6e 65 78  *)&(current->nex
b8c0: 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8e0: 20 20 20 20 20 20 43 6f 6e 66 69 67 63 6d 70 29        Configcmp)
b8f0: 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d  ;.  currentend =
b900: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
b910: 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 62 61 73  ./* Sort the bas
b920: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
b930: 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f   list */.void Co
b940: 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73  nfiglist_sortbas
b950: 69 73 28 76 6f 69 64 29 7b 0a 20 20 62 61 73 69  is(void){.  basi
b960: 73 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  s = (struct conf
b970: 69 67 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 2a  ig*)msort((char*
b980: 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72 2a 2a  )current,(char**
b990: 29 26 28 63 75 72 72 65 6e 74 2d 3e 62 70 29 2c  )&(current->bp),
b9a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9c0: 20 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20 62   Configcmp);.  b
b9d0: 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72  asisend = 0;.  r
b9e0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  eturn;.}../* Ret
b9f0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
ba00: 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65   the head of the
ba10: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
ba20: 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65 74  ist and.** reset
ba30: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74 72   the list */.str
ba40: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
ba50: 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 76 6f  iglist_return(vo
ba60: 69 64 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  id){.  struct co
ba70: 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64  nfig *old;.  old
ba80: 20 3d 20 63 75 72 72 65 6e 74 3b 0a 20 20 63 75   = current;.  cu
ba90: 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72  rrent = 0;.  cur
baa0: 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72  rentend = 0;.  r
bab0: 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a  eturn old;.}../*
bac0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
bad0: 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  r to the head of
bae0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
baf0: 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72  on list and.** r
bb00: 65 73 65 74 20 74 68 65 20 6c 69 73 74 20 2a 2f  eset the list */
bb10: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
bb20: 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73  Configlist_basis
bb30: 28 76 6f 69 64 29 7b 0a 20 20 73 74 72 75 63 74  (void){.  struct
bb40: 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20   config *old;.  
bb50: 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a 20 20 62  old = basis;.  b
bb60: 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69  asis = 0;.  basi
bb70: 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  send = 0;.  retu
bb80: 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 46 72  rn old;.}../* Fr
bb90: 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20  ee all elements 
bba0: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 6f 6e  of the given con
bbb0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
bbc0: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
bbd0: 73 74 5f 65 61 74 28 73 74 72 75 63 74 20 63 6f  st_eat(struct co
bbe0: 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73  nfig *cfp).{.  s
bbf0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
bc00: 78 74 63 66 70 3b 0a 20 20 66 6f 72 28 3b 20 63  xtcfp;.  for(; c
bc10: 66 70 3b 20 63 66 70 3d 6e 65 78 74 63 66 70 29  fp; cfp=nextcfp)
bc20: 7b 0a 20 20 20 20 6e 65 78 74 63 66 70 20 3d 20  {.    nextcfp = 
bc30: 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 61  cfp->next;.    a
bc40: 73 73 65 72 74 28 20 63 66 70 2d 3e 66 70 6c 70  ssert( cfp->fplp
bc50: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
bc60: 74 28 20 63 66 70 2d 3e 62 70 6c 70 3d 3d 30 20  t( cfp->bplp==0 
bc70: 29 3b 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e  );.    if( cfp->
bc80: 66 77 73 20 29 20 53 65 74 46 72 65 65 28 63 66  fws ) SetFree(cf
bc90: 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 64 65 6c  p->fws);.    del
bca0: 65 74 65 63 6f 6e 66 69 67 28 63 66 70 29 3b 0a  eteconfig(cfp);.
bcb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a    }.  return;.}.
bcc0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
bcd0: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
bce0: 20 22 65 72 72 6f 72 2e 63 22 20 2a 2a 2a 2a 2a   "error.c" *****
bcf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
bd10: 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 69  .** Code for pri
bd20: 6e 74 69 6e 67 20 65 72 72 6f 72 20 6d 65 73 73  nting error mess
bd30: 61 67 65 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 45 72  age..*/..void Er
bd40: 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63 68 61  rorMsg(const cha
bd50: 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 69 6e 74  r *filename, int
bd60: 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20 63   lineno, const c
bd70: 68 61 72 20 2a 66 6f 72 6d 61 74 2c 20 2e 2e 2e  har *format, ...
bd80: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
bd90: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
bda0: 72 2c 20 22 25 73 3a 25 64 3a 20 22 2c 20 66 69  r, "%s:%d: ", fi
bdb0: 6c 65 6e 61 6d 65 2c 20 6c 69 6e 65 6e 6f 29 3b  lename, lineno);
bdc0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
bdd0: 66 6f 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69  format);.  vfpri
bde0: 6e 74 66 28 73 74 64 65 72 72 2c 66 6f 72 6d 61  ntf(stderr,forma
bdf0: 74 2c 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  t,ap);.  va_end(
be00: 61 70 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  ap);.  fprintf(s
be10: 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 7d 0a  tderr, "\n");.}.
be20: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
be30: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
be40: 22 6d 61 69 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  "main.c" *******
be50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
be70: 2a 0a 2a 2a 20 4d 61 69 6e 20 70 72 6f 67 72 61  *.** Main progra
be80: 6d 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 4c  m file for the L
be90: 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
bea0: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 65  rator..*/../* Re
beb0: 70 6f 72 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d  port an out-of-m
bec0: 65 6d 6f 72 79 20 63 6f 6e 64 69 74 69 6f 6e 20  emory condition 
bed0: 61 6e 64 20 61 62 6f 72 74 2e 20 20 54 68 69 73  and abort.  This
bee0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
bef0: 75 73 65 64 20 6d 6f 73 74 6c 79 20 62 79 20 74  used mostly by t
bf00: 68 65 20 22 4d 65 6d 6f 72 79 43 68 65 63 6b 22  he "MemoryCheck"
bf10: 20 6d 61 63 72 6f 20 69 6e 20 73 74 72 75 63 74   macro in struct
bf20: 2e 68 0a 2a 2f 0a 76 6f 69 64 20 6d 65 6d 6f 72  .h.*/.void memor
bf30: 79 5f 65 72 72 6f 72 28 76 6f 69 64 29 7b 0a 20  y_error(void){. 
bf40: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
bf50: 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20  "Out of memory. 
bf60: 20 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e 22 29   Aborting...\n")
bf70: 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a  ;.  exit(1);.}..
bf80: 73 74 61 74 69 63 20 69 6e 74 20 6e 44 65 66 69  static int nDefi
bf90: 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ne = 0;      /* 
bfa0: 4e 75 6d 62 65 72 20 6f 66 20 2d 44 20 6f 70 74  Number of -D opt
bfb0: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  ions on the comm
bfc0: 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 73 74 61 74  and line */.stat
bfd0: 69 63 20 63 68 61 72 20 2a 2a 61 7a 44 65 66 69  ic char **azDefi
bfe0: 6e 65 20 3d 20 30 3b 20 20 2f 2a 20 4e 61 6d 65  ne = 0;  /* Name
bff0: 20 6f 66 20 74 68 65 20 2d 44 20 6d 61 63 72 6f   of the -D macro
c000: 73 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20 72 6f  s */../* This ro
c010: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
c020: 77 69 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e  with the argumen
c030: 74 20 74 6f 20 65 61 63 68 20 2d 44 20 63 6f 6d  t to each -D com
c040: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
c050: 2e 0a 2a 2a 20 41 64 64 20 74 68 65 20 6d 61 63  ..** Add the mac
c060: 72 6f 20 64 65 66 69 6e 65 64 20 74 6f 20 74 68  ro defined to th
c070: 65 20 61 7a 44 65 66 69 6e 65 20 61 72 72 61 79  e azDefine array
c080: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c090: 20 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e   handle_D_option
c0a0: 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61  (char *z){.  cha
c0b0: 72 20 2a 2a 70 61 7a 3b 0a 20 20 6e 44 65 66 69  r **paz;.  nDefi
c0c0: 6e 65 2b 2b 3b 0a 20 20 61 7a 44 65 66 69 6e 65  ne++;.  azDefine
c0d0: 20 3d 20 28 63 68 61 72 20 2a 2a 29 20 72 65 61   = (char **) rea
c0e0: 6c 6c 6f 63 28 61 7a 44 65 66 69 6e 65 2c 20 73  lloc(azDefine, s
c0f0: 69 7a 65 6f 66 28 61 7a 44 65 66 69 6e 65 5b 30  izeof(azDefine[0
c100: 5d 29 2a 6e 44 65 66 69 6e 65 29 3b 0a 20 20 69  ])*nDefine);.  i
c110: 66 28 20 61 7a 44 65 66 69 6e 65 3d 3d 30 20 29  f( azDefine==0 )
c120: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
c130: 64 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d  derr,"out of mem
c140: 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ory\n");.    exi
c150: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 70 61 7a 20  t(1);.  }.  paz 
c160: 3d 20 26 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66  = &azDefine[nDef
c170: 69 6e 65 2d 31 5d 3b 0a 20 20 2a 70 61 7a 20 3d  ine-1];.  *paz =
c180: 20 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63   (char *) malloc
c190: 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29  ( lemonStrlen(z)
c1a0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 2a 70 61 7a  +1 );.  if( *paz
c1b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
c1c0: 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20 6f  tf(stderr,"out o
c1d0: 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
c1e0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
c1f0: 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 2a 70   lemon_strcpy(*p
c200: 61 7a 2c 20 7a 29 3b 0a 20 20 66 6f 72 28 7a 3d  az, z);.  for(z=
c210: 2a 70 61 7a 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d  *paz; *z && *z!=
c220: 27 3d 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 2a 7a  '='; z++){}.  *z
c230: 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   = 0;.}..static 
c240: 63 68 61 72 20 2a 75 73 65 72 5f 74 65 6d 70 6c  char *user_templ
c250: 61 74 65 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  atename = NULL;.
c260: 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 6e 64  static void hand
c270: 6c 65 5f 54 5f 6f 70 74 69 6f 6e 28 63 68 61 72  le_T_option(char
c280: 20 2a 7a 29 7b 0a 20 20 75 73 65 72 5f 74 65 6d   *z){.  user_tem
c290: 70 6c 61 74 65 6e 61 6d 65 20 3d 20 28 63 68 61  platename = (cha
c2a0: 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d  r *) malloc( lem
c2b0: 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b 31 20 29 3b  onStrlen(z)+1 );
c2c0: 0a 20 20 69 66 28 20 75 73 65 72 5f 74 65 6d 70  .  if( user_temp
c2d0: 6c 61 74 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  latename==0 ){. 
c2e0: 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28     memory_error(
c2f0: 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73  );.  }.  lemon_s
c300: 74 72 63 70 79 28 75 73 65 72 5f 74 65 6d 70 6c  trcpy(user_templ
c310: 61 74 65 6e 61 6d 65 2c 20 7a 29 3b 0a 7d 0a 0a  atename, z);.}..
c320: 2f 2a 20 4d 65 72 67 65 20 74 6f 67 65 74 68 65  /* Merge togethe
c330: 72 20 74 6f 20 6c 69 73 74 73 20 6f 66 20 72 75  r to lists of ru
c340: 6c 65 73 20 6f 72 64 65 72 65 64 20 62 79 20 72  les ordered by r
c350: 75 6c 65 2e 69 52 75 6c 65 20 2a 2f 0a 73 74 61  ule.iRule */.sta
c360: 74 69 63 20 73 74 72 75 63 74 20 72 75 6c 65 20  tic struct rule 
c370: 2a 52 75 6c 65 5f 6d 65 72 67 65 28 73 74 72 75  *Rule_merge(stru
c380: 63 74 20 72 75 6c 65 20 2a 70 41 2c 20 73 74 72  ct rule *pA, str
c390: 75 63 74 20 72 75 6c 65 20 2a 70 42 29 7b 0a 20  uct rule *pB){. 
c3a0: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 46   struct rule *pF
c3b0: 69 72 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75  irst = 0;.  stru
c3c0: 63 74 20 72 75 6c 65 20 2a 2a 70 70 50 72 65 76  ct rule **ppPrev
c3d0: 20 3d 20 26 70 46 69 72 73 74 3b 0a 20 20 77 68   = &pFirst;.  wh
c3e0: 69 6c 65 28 20 70 41 20 26 26 20 70 42 20 29 7b  ile( pA && pB ){
c3f0: 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 69 52 75  .    if( pA->iRu
c400: 6c 65 3c 70 42 2d 3e 69 52 75 6c 65 20 29 7b 0a  le<pB->iRule ){.
c410: 20 20 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20        *ppPrev = 
c420: 70 41 3b 0a 20 20 20 20 20 20 70 70 50 72 65 76  pA;.      ppPrev
c430: 20 3d 20 26 70 41 2d 3e 6e 65 78 74 3b 0a 20 20   = &pA->next;.  
c440: 20 20 20 20 70 41 20 3d 20 70 41 2d 3e 6e 65 78      pA = pA->nex
c450: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
c460: 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70 42      *ppPrev = pB
c470: 3b 0a 20 20 20 20 20 20 70 70 50 72 65 76 20 3d  ;.      ppPrev =
c480: 20 26 70 42 2d 3e 6e 65 78 74 3b 0a 20 20 20 20   &pB->next;.    
c490: 20 20 70 42 20 3d 20 70 42 2d 3e 6e 65 78 74 3b    pB = pB->next;
c4a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c4b0: 20 70 41 20 29 7b 0a 20 20 20 20 2a 70 70 50 72   pA ){.    *ppPr
c4c0: 65 76 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65  ev = pA;.  }else
c4d0: 7b 0a 20 20 20 20 2a 70 70 50 72 65 76 20 3d 20  {.    *ppPrev = 
c4e0: 70 42 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  pB;.  }.  return
c4f0: 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   pFirst;.}../*.*
c500: 2a 20 53 6f 72 74 20 61 20 6c 69 73 74 20 6f 66  * Sort a list of
c510: 20 72 75 6c 65 73 20 69 6e 20 6f 72 64 65 72 20   rules in order 
c520: 6f 66 20 69 6e 63 72 65 61 73 69 6e 67 20 69 52  of increasing iR
c530: 75 6c 65 20 76 61 6c 75 65 0a 2a 2f 0a 73 74 61  ule value.*/.sta
c540: 74 69 63 20 73 74 72 75 63 74 20 72 75 6c 65 20  tic struct rule 
c550: 2a 52 75 6c 65 5f 73 6f 72 74 28 73 74 72 75 63  *Rule_sort(struc
c560: 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20 69  t rule *rp){.  i
c570: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 72  nt i;.  struct r
c580: 75 6c 65 20 2a 70 4e 65 78 74 3b 0a 20 20 73 74  ule *pNext;.  st
c590: 72 75 63 74 20 72 75 6c 65 20 2a 78 5b 33 32 5d  ruct rule *x[32]
c5a0: 3b 0a 20 20 6d 65 6d 73 65 74 28 78 2c 20 30 2c  ;.  memset(x, 0,
c5b0: 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 77   sizeof(x));.  w
c5c0: 68 69 6c 65 28 20 72 70 20 29 7b 0a 20 20 20 20  hile( rp ){.    
c5d0: 70 4e 65 78 74 20 3d 20 72 70 2d 3e 6e 65 78 74  pNext = rp->next
c5e0: 3b 0a 20 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d  ;.    rp->next =
c5f0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
c600: 20 69 3c 73 69 7a 65 6f 66 28 78 29 2f 73 69 7a   i<sizeof(x)/siz
c610: 65 6f 66 28 78 5b 30 5d 29 20 26 26 20 78 5b 69  eof(x[0]) && x[i
c620: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  ]; i++){.      r
c630: 70 20 3d 20 52 75 6c 65 5f 6d 65 72 67 65 28 78  p = Rule_merge(x
c640: 5b 69 5d 2c 20 72 70 29 3b 0a 20 20 20 20 20 20  [i], rp);.      
c650: 78 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  x[i] = 0;.    }.
c660: 20 20 20 20 78 5b 69 5d 20 3d 20 72 70 3b 0a 20      x[i] = rp;. 
c670: 20 20 20 72 70 20 3d 20 70 4e 65 78 74 3b 0a 20     rp = pNext;. 
c680: 20 7d 0a 20 20 72 70 20 3d 20 30 3b 0a 20 20 66   }.  rp = 0;.  f
c690: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
c6a0: 28 78 29 2f 73 69 7a 65 6f 66 28 78 5b 30 5d 29  (x)/sizeof(x[0])
c6b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 70 20 3d  ; i++){.    rp =
c6c0: 20 52 75 6c 65 5f 6d 65 72 67 65 28 78 5b 69 5d   Rule_merge(x[i]
c6d0: 2c 20 72 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  , rp);.  }.  ret
c6e0: 75 72 6e 20 72 70 3b 0a 7d 0a 0a 2f 2a 20 66 6f  urn rp;.}../* fo
c6f0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
c700: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
c710: 63 68 61 72 20 2a 6d 69 6e 69 6d 75 6d 5f 73 69  char *minimum_si
c720: 7a 65 5f 74 79 70 65 28 69 6e 74 20 6c 77 72 2c  ze_type(int lwr,
c730: 20 69 6e 74 20 75 70 72 2c 20 69 6e 74 20 2a 70   int upr, int *p
c740: 6e 42 79 74 65 29 3b 0a 0a 2f 2a 20 50 72 69 6e  nByte);../* Prin
c750: 74 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20  t a single line 
c760: 6f 66 20 74 68 65 20 22 50 61 72 73 65 72 20 53  of the "Parser S
c770: 74 61 74 73 22 20 6f 75 74 70 75 74 0a 2a 2f 0a  tats" output.*/.
c780: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 74  static void stat
c790: 73 5f 6c 69 6e 65 28 63 6f 6e 73 74 20 63 68 61  s_line(const cha
c7a0: 72 20 2a 7a 4c 61 62 65 6c 2c 20 69 6e 74 20 69  r *zLabel, int i
c7b0: 56 61 6c 75 65 29 7b 0a 20 20 69 6e 74 20 6e 4c  Value){.  int nL
c7c0: 61 62 65 6c 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c  abel = lemonStrl
c7d0: 65 6e 28 7a 4c 61 62 65 6c 29 3b 0a 20 20 70 72  en(zLabel);.  pr
c7e0: 69 6e 74 66 28 22 20 20 25 73 25 2e 2a 73 20 25  intf("  %s%.*s %
c7f0: 35 64 5c 6e 22 2c 20 7a 4c 61 62 65 6c 2c 0a 20  5d\n", zLabel,. 
c800: 20 20 20 20 20 20 20 20 33 35 2d 6e 4c 61 62 65          35-nLabe
c810: 6c 2c 20 22 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  l, "............
c820: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
c830: 2e 2e 2e 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  ....",.         
c840: 69 56 61 6c 75 65 29 3b 0a 7d 0a 0a 2f 2a 20 54  iValue);.}../* T
c850: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e  he main program.
c860: 20 20 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d    Parse the comm
c870: 61 6e 64 20 6c 69 6e 65 20 61 6e 64 20 64 6f 20  and line and do 
c880: 69 74 2e 2e 2e 20 2a 2f 0a 69 6e 74 20 6d 61 69  it... */.int mai
c890: 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  n(int argc, char
c8a0: 20 2a 2a 61 72 67 76 29 0a 7b 0a 20 20 73 74 61   **argv).{.  sta
c8b0: 74 69 63 20 69 6e 74 20 76 65 72 73 69 6f 6e 20  tic int version 
c8c0: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
c8d0: 74 20 72 70 66 6c 61 67 20 3d 20 30 3b 0a 20 20  t rpflag = 0;.  
c8e0: 73 74 61 74 69 63 20 69 6e 74 20 62 61 73 69 73  static int basis
c8f0: 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74  flag = 0;.  stat
c900: 69 63 20 69 6e 74 20 63 6f 6d 70 72 65 73 73 20  ic int compress 
c910: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
c920: 74 20 71 75 69 65 74 20 3d 20 30 3b 0a 20 20 73  t quiet = 0;.  s
c930: 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 69 73  tatic int statis
c940: 74 69 63 73 20 3d 20 30 3b 0a 20 20 73 74 61 74  tics = 0;.  stat
c950: 69 63 20 69 6e 74 20 6d 68 66 6c 61 67 20 3d 20  ic int mhflag = 
c960: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
c970: 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 3d 20  nolinenosflag = 
c980: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
c990: 6e 6f 52 65 73 6f 72 74 20 3d 20 30 3b 0a 20 20  noResort = 0;.  
c9a0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f  static struct s_
c9b0: 6f 70 74 69 6f 6e 73 20 6f 70 74 69 6f 6e 73 5b  options options[
c9c0: 5d 20 3d 20 7b 0a 20 20 20 20 7b 4f 50 54 5f 46  ] = {.    {OPT_F
c9d0: 4c 41 47 2c 20 22 62 22 2c 20 28 63 68 61 72 2a  LAG, "b", (char*
c9e0: 29 26 62 61 73 69 73 66 6c 61 67 2c 20 22 50 72  )&basisflag, "Pr
c9f0: 69 6e 74 20 6f 6e 6c 79 20 74 68 65 20 62 61 73  int only the bas
ca00: 69 73 20 69 6e 20 72 65 70 6f 72 74 2e 22 7d 2c  is in report."},
ca10: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
ca20: 22 63 22 2c 20 28 63 68 61 72 2a 29 26 63 6f 6d  "c", (char*)&com
ca30: 70 72 65 73 73 2c 20 22 44 6f 6e 27 74 20 63 6f  press, "Don't co
ca40: 6d 70 72 65 73 73 20 74 68 65 20 61 63 74 69 6f  mpress the actio
ca50: 6e 20 74 61 62 6c 65 2e 22 7d 2c 0a 20 20 20 20  n table."},.    
ca60: 7b 4f 50 54 5f 46 53 54 52 2c 20 22 44 22 2c 20  {OPT_FSTR, "D", 
ca70: 28 63 68 61 72 2a 29 68 61 6e 64 6c 65 5f 44 5f  (char*)handle_D_
ca80: 6f 70 74 69 6f 6e 2c 20 22 44 65 66 69 6e 65 20  option, "Define 
ca90: 61 6e 20 25 69 66 64 65 66 20 6d 61 63 72 6f 2e  an %ifdef macro.
caa0: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54  "},.    {OPT_FST
cab0: 52 2c 20 22 66 22 2c 20 30 2c 20 22 49 67 6e 6f  R, "f", 0, "Igno
cac0: 72 65 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64  red.  (Placehold
cad0: 65 72 20 66 6f 72 20 2d 66 20 63 6f 6d 70 69 6c  er for -f compil
cae0: 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c 0a  er options.)"},.
caf0: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
cb00: 67 22 2c 20 28 63 68 61 72 2a 29 26 72 70 66 6c  g", (char*)&rpfl
cb10: 61 67 2c 20 22 50 72 69 6e 74 20 67 72 61 6d 6d  ag, "Print gramm
cb20: 61 72 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f  ar without actio
cb30: 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ns."},.    {OPT_
cb40: 46 53 54 52 2c 20 22 49 22 2c 20 30 2c 20 22 49  FSTR, "I", 0, "I
cb50: 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63 65 68  gnored.  (Placeh
cb60: 6f 6c 64 65 72 20 66 6f 72 20 27 2d 49 27 20 63  older for '-I' c
cb70: 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e  ompiler options.
cb80: 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  )"},.    {OPT_FL
cb90: 41 47 2c 20 22 6d 22 2c 20 28 63 68 61 72 2a 29  AG, "m", (char*)
cba0: 26 6d 68 66 6c 61 67 2c 20 22 4f 75 74 70 75 74  &mhflag, "Output
cbb0: 20 61 20 6d 61 6b 65 68 65 61 64 65 72 73 20 63   a makeheaders c
cbc0: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 2e 22  ompatible file."
cbd0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
cbe0: 2c 20 22 6c 22 2c 20 28 63 68 61 72 2a 29 26 6e  , "l", (char*)&n
cbf0: 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 2c 20 22 44  olinenosflag, "D
cc00: 6f 20 6e 6f 74 20 70 72 69 6e 74 20 23 6c 69 6e  o not print #lin
cc10: 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 22 7d 2c  e statements."},
cc20: 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20  .    {OPT_FSTR, 
cc30: 22 4f 22 2c 20 30 2c 20 22 49 67 6e 6f 72 65 64  "O", 0, "Ignored
cc40: 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64 65 72 20  .  (Placeholder 
cc50: 66 6f 72 20 27 2d 4f 27 20 63 6f 6d 70 69 6c 65  for '-O' compile
cc60: 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c 0a 20  r options.)"},. 
cc70: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 70     {OPT_FLAG, "p
cc80: 22 2c 20 28 63 68 61 72 2a 29 26 73 68 6f 77 50  ", (char*)&showP
cc90: 72 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63  recedenceConflic
cca0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
ccb0: 20 20 20 20 20 20 20 22 53 68 6f 77 20 63 6f 6e         "Show con
ccc0: 66 6c 69 63 74 73 20 72 65 73 6f 6c 76 65 64 20  flicts resolved 
ccd0: 62 79 20 70 72 65 63 65 64 65 6e 63 65 20 72 75  by precedence ru
cce0: 6c 65 73 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  les"},.    {OPT_
ccf0: 46 4c 41 47 2c 20 22 71 22 2c 20 28 63 68 61 72  FLAG, "q", (char
cd00: 2a 29 26 71 75 69 65 74 2c 20 22 28 51 75 69 65  *)&quiet, "(Quie
cd10: 74 29 20 44 6f 6e 27 74 20 70 72 69 6e 74 20 74  t) Don't print t
cd20: 68 65 20 72 65 70 6f 72 74 20 66 69 6c 65 2e 22  he report file."
cd30: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
cd40: 2c 20 22 72 22 2c 20 28 63 68 61 72 2a 29 26 6e  , "r", (char*)&n
cd50: 6f 52 65 73 6f 72 74 2c 20 22 44 6f 20 6e 6f 74  oResort, "Do not
cd60: 20 73 6f 72 74 20 6f 72 20 72 65 6e 75 6d 62 65   sort or renumbe
cd70: 72 20 73 74 61 74 65 73 22 7d 2c 0a 20 20 20 20  r states"},.    
cd80: 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 73 22 2c 20  {OPT_FLAG, "s", 
cd90: 28 63 68 61 72 2a 29 26 73 74 61 74 69 73 74 69  (char*)&statisti
cda0: 63 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  cs,.            
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdc0: 20 20 20 20 20 20 20 22 50 72 69 6e 74 20 70 61         "Print pa
cdd0: 72 73 65 72 20 73 74 61 74 73 20 74 6f 20 73 74  rser stats to st
cde0: 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 22 7d  andard output."}
cdf0: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
ce00: 20 22 78 22 2c 20 28 63 68 61 72 2a 29 26 76 65   "x", (char*)&ve
ce10: 72 73 69 6f 6e 2c 20 22 50 72 69 6e 74 20 74 68  rsion, "Print th
ce20: 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
ce30: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53  ."},.    {OPT_FS
ce40: 54 52 2c 20 22 54 22 2c 20 28 63 68 61 72 2a 29  TR, "T", (char*)
ce50: 68 61 6e 64 6c 65 5f 54 5f 6f 70 74 69 6f 6e 2c  handle_T_option,
ce60: 20 22 53 70 65 63 69 66 79 20 61 20 74 65 6d 70   "Specify a temp
ce70: 6c 61 74 65 20 66 69 6c 65 2e 22 7d 2c 0a 20 20  late file."},.  
ce80: 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 57 22    {OPT_FSTR, "W"
ce90: 2c 20 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20 20  , 0, "Ignored.  
cea0: 28 50 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72  (Placeholder for
ceb0: 20 27 2d 57 27 20 63 6f 6d 70 69 6c 65 72 20 6f   '-W' compiler o
cec0: 70 74 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20 20  ptions.)"},.    
ced0: 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c 30 2c 30 7d  {OPT_FLAG,0,0,0}
cee0: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
cef0: 20 69 6e 74 20 65 78 69 74 63 6f 64 65 3b 0a 20   int exitcode;. 
cf00: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 6c 65   struct lemon le
cf10: 6d 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  m;.  struct rule
cf20: 20 2a 72 70 3b 0a 0a 20 20 4f 70 74 49 6e 69 74   *rp;..  OptInit
cf30: 28 61 72 67 76 2c 6f 70 74 69 6f 6e 73 2c 73 74  (argv,options,st
cf40: 64 65 72 72 29 3b 0a 20 20 69 66 28 20 76 65 72  derr);.  if( ver
cf50: 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 70 72 69  sion ){.     pri
cf60: 6e 74 66 28 22 4c 65 6d 6f 6e 20 76 65 72 73 69  ntf("Lemon versi
cf70: 6f 6e 20 31 2e 30 5c 6e 22 29 3b 0a 20 20 20 20  on 1.0\n");.    
cf80: 20 65 78 69 74 28 30 29 3b 20 0a 20 20 7d 0a 20   exit(0); .  }. 
cf90: 20 69 66 28 20 4f 70 74 4e 41 72 67 73 28 29 21   if( OptNArgs()!
cfa0: 3d 31 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =1 ){.    fprint
cfb0: 66 28 73 74 64 65 72 72 2c 22 45 78 61 63 74 6c  f(stderr,"Exactl
cfc0: 79 20 6f 6e 65 20 66 69 6c 65 6e 61 6d 65 20 61  y one filename a
cfd0: 72 67 75 6d 65 6e 74 20 69 73 20 72 65 71 75 69  rgument is requi
cfe0: 72 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78  red.\n");.    ex
cff0: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d  it(1);.  }.  mem
d000: 73 65 74 28 26 6c 65 6d 2c 20 30 2c 20 73 69 7a  set(&lem, 0, siz
d010: 65 6f 66 28 6c 65 6d 29 29 3b 0a 20 20 6c 65 6d  eof(lem));.  lem
d020: 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 0a  .errorcnt = 0;..
d030: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
d040: 74 68 65 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  the machine */. 
d050: 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29 3b   Strsafe_init();
d060: 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29  .  Symbol_init()
d070: 3b 0a 20 20 53 74 61 74 65 5f 69 6e 69 74 28 29  ;.  State_init()
d080: 3b 0a 20 20 6c 65 6d 2e 61 72 67 76 30 20 3d 20  ;.  lem.argv0 = 
d090: 61 72 67 76 5b 30 5d 3b 0a 20 20 6c 65 6d 2e 66  argv[0];.  lem.f
d0a0: 69 6c 65 6e 61 6d 65 20 3d 20 4f 70 74 41 72 67  ilename = OptArg
d0b0: 28 30 29 3b 0a 20 20 6c 65 6d 2e 62 61 73 69 73  (0);.  lem.basis
d0c0: 66 6c 61 67 20 3d 20 62 61 73 69 73 66 6c 61 67  flag = basisflag
d0d0: 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c 69 6e 65 6e 6f  ;.  lem.nolineno
d0e0: 73 66 6c 61 67 20 3d 20 6e 6f 6c 69 6e 65 6e 6f  sflag = nolineno
d0f0: 73 66 6c 61 67 3b 0a 20 20 53 79 6d 62 6f 6c 5f  sflag;.  Symbol_
d100: 6e 65 77 28 22 24 22 29 3b 0a 20 20 6c 65 6d 2e  new("$");.  lem.
d110: 65 72 72 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f  errsym = Symbol_
d120: 6e 65 77 28 22 65 72 72 6f 72 22 29 3b 0a 20 20  new("error");.  
d130: 6c 65 6d 2e 65 72 72 73 79 6d 2d 3e 75 73 65 43  lem.errsym->useC
d140: 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 61  nt = 0;..  /* Pa
d150: 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 66 69  rse the input fi
d160: 6c 65 20 2a 2f 0a 20 20 50 61 72 73 65 28 26 6c  le */.  Parse(&l
d170: 65 6d 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 65  em);.  if( lem.e
d180: 72 72 6f 72 63 6e 74 20 29 20 65 78 69 74 28 6c  rrorcnt ) exit(l
d190: 65 6d 2e 65 72 72 6f 72 63 6e 74 29 3b 0a 20 20  em.errorcnt);.  
d1a0: 69 66 28 20 6c 65 6d 2e 6e 72 75 6c 65 3d 3d 30  if( lem.nrule==0
d1b0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
d1c0: 73 74 64 65 72 72 2c 22 45 6d 70 74 79 20 67 72  stderr,"Empty gr
d1d0: 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20 20 20  ammar.\n");.    
d1e0: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20  exit(1);.  }..  
d1f0: 2f 2a 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e 64  /* Count and ind
d200: 65 78 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 6f  ex the symbols o
d210: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f  f the grammar */
d220: 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b  .  Symbol_new("{
d230: 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c 65  default}");.  le
d240: 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53 79 6d 62  m.nsymbol = Symb
d250: 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 6c 65  ol_count();.  le
d260: 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d 62  m.symbols = Symb
d270: 6f 6c 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20 20  ol_arrayof();.  
d280: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 2e 6e  for(i=0; i<lem.n
d290: 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d  symbol; i++) lem
d2a0: 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64  .symbols[i]->ind
d2b0: 65 78 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74 28  ex = i;.  qsort(
d2c0: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65 6d 2e  lem.symbols,lem.
d2d0: 6e 73 79 6d 62 6f 6c 2c 73 69 7a 65 6f 66 28 73  nsymbol,sizeof(s
d2e0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2c 20  truct symbol*), 
d2f0: 53 79 6d 62 6f 6c 63 6d 70 70 29 3b 0a 20 20 66  Symbolcmpp);.  f
d300: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 2e 6e 73  or(i=0; i<lem.ns
d310: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e  ymbol; i++) lem.
d320: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65  symbols[i]->inde
d330: 78 20 3d 20 69 3b 0a 20 20 77 68 69 6c 65 28 20  x = i;.  while( 
d340: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 2d 31 5d  lem.symbols[i-1]
d350: 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
d360: 4d 49 4e 41 4c 20 29 7b 20 69 2d 2d 3b 20 7d 0a  MINAL ){ i--; }.
d370: 20 20 61 73 73 65 72 74 28 20 73 74 72 63 6d 70    assert( strcmp
d380: 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 2d 31  (lem.symbols[i-1
d390: 5d 2d 3e 6e 61 6d 65 2c 22 7b 64 65 66 61 75 6c  ]->name,"{defaul
d3a0: 74 7d 22 29 3d 3d 30 20 29 3b 0a 20 20 6c 65 6d  t}")==0 );.  lem
d3b0: 2e 6e 73 79 6d 62 6f 6c 20 3d 20 69 20 2d 20 31  .nsymbol = i - 1
d3c0: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 49 53 55  ;.  for(i=1; ISU
d3d0: 50 50 45 52 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73  PPER(lem.symbols
d3e0: 5b 69 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b 20 69  [i]->name[0]); i
d3f0: 2b 2b 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65 72 6d  ++);.  lem.nterm
d400: 69 6e 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20  inal = i;..  /* 
d410: 41 73 73 69 67 6e 20 73 65 71 75 65 6e 74 69 61  Assign sequentia
d420: 6c 20 72 75 6c 65 20 6e 75 6d 62 65 72 73 2e 20  l rule numbers. 
d430: 20 53 74 61 72 74 20 77 69 74 68 20 30 2e 20 20   Start with 0.  
d440: 50 75 74 20 72 75 6c 65 73 20 74 68 61 74 20 68  Put rules that h
d450: 61 76 65 20 6e 6f 0a 20 20 2a 2a 20 72 65 64 75  ave no.  ** redu
d460: 63 65 20 61 63 74 69 6f 6e 20 43 2d 63 6f 64 65  ce action C-code
d470: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
d480: 20 74 68 65 6d 20 6c 61 73 74 2c 20 73 6f 20 74   them last, so t
d490: 68 61 74 20 74 68 65 20 73 77 69 74 63 68 28 29  hat the switch()
d4a0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
d4b0: 74 68 61 74 20 73 65 6c 65 63 74 73 20 72 65 64  that selects red
d4c0: 75 63 74 69 6f 6e 20 61 63 74 69 6f 6e 73 20 77  uction actions w
d4d0: 69 6c 6c 20 68 61 76 65 20 61 20 73 6d 61 6c 6c  ill have a small
d4e0: 65 72 20 6a 75 6d 70 20 74 61 62 6c 65 2e 0a 20  er jump table.. 
d4f0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72   */.  for(i=0, r
d500: 70 3d 6c 65 6d 2e 72 75 6c 65 3b 20 72 70 3b 20  p=lem.rule; rp; 
d510: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
d520: 20 20 72 70 2d 3e 69 52 75 6c 65 20 3d 20 72 70    rp->iRule = rp
d530: 2d 3e 63 6f 64 65 20 3f 20 69 2b 2b 20 3a 20 2d  ->code ? i++ : -
d540: 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d  1;.  }.  for(rp=
d550: 6c 65 6d 2e 72 75 6c 65 3b 20 72 70 3b 20 72 70  lem.rule; rp; rp
d560: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
d570: 69 66 28 20 72 70 2d 3e 69 52 75 6c 65 3c 30 20  if( rp->iRule<0 
d580: 29 20 72 70 2d 3e 69 52 75 6c 65 20 3d 20 69 2b  ) rp->iRule = i+
d590: 2b 3b 0a 20 20 7d 0a 20 20 6c 65 6d 2e 73 74 61  +;.  }.  lem.sta
d5a0: 72 74 52 75 6c 65 20 3d 20 6c 65 6d 2e 72 75 6c  rtRule = lem.rul
d5b0: 65 3b 0a 20 20 6c 65 6d 2e 72 75 6c 65 20 3d 20  e;.  lem.rule = 
d5c0: 52 75 6c 65 5f 73 6f 72 74 28 6c 65 6d 2e 72 75  Rule_sort(lem.ru
d5d0: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  le);..  /* Gener
d5e0: 61 74 65 20 61 20 72 65 70 72 69 6e 74 20 6f 66  ate a reprint of
d5f0: 20 74 68 65 20 67 72 61 6d 6d 61 72 2c 20 69 66   the grammar, if
d600: 20 72 65 71 75 65 73 74 65 64 20 6f 6e 20 74 68   requested on th
d610: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a  e command line *
d620: 2f 0a 20 20 69 66 28 20 72 70 66 6c 61 67 20 29  /.  if( rpflag )
d630: 7b 0a 20 20 20 20 52 65 70 72 69 6e 74 28 26 6c  {.    Reprint(&l
d640: 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  em);.  }else{.  
d650: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
d660: 74 68 65 20 73 69 7a 65 20 66 6f 72 20 61 6c 6c  the size for all
d670: 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 66 69 72 73   follow and firs
d680: 74 20 73 65 74 73 20 2a 2f 0a 20 20 20 20 53 65  t sets */.    Se
d690: 74 53 69 7a 65 28 6c 65 6d 2e 6e 74 65 72 6d 69  tSize(lem.ntermi
d6a0: 6e 61 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  nal+1);..    /* 
d6b0: 46 69 6e 64 20 74 68 65 20 70 72 65 63 65 64 65  Find the precede
d6c0: 6e 63 65 20 66 6f 72 20 65 76 65 72 79 20 70 72  nce for every pr
d6d0: 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 28 74  oduction rule (t
d6e0: 68 61 74 20 68 61 73 20 6f 6e 65 29 20 2a 2f 0a  hat has one) */.
d6f0: 20 20 20 20 46 69 6e 64 52 75 6c 65 50 72 65 63      FindRulePrec
d700: 65 64 65 6e 63 65 73 28 26 6c 65 6d 29 3b 0a 0a  edences(&lem);..
d710: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
d720: 68 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74 65 72  he lambda-nonter
d730: 6d 69 6e 61 6c 73 20 61 6e 64 20 74 68 65 20 66  minals and the f
d740: 69 72 73 74 2d 73 65 74 73 20 66 6f 72 20 65 76  irst-sets for ev
d750: 65 72 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e 74 65  ery.    ** nonte
d760: 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 46 69  rminal */.    Fi
d770: 6e 64 46 69 72 73 74 53 65 74 73 28 26 6c 65 6d  ndFirstSets(&lem
d780: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  );..    /* Compu
d790: 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61  te all LR(0) sta
d7a0: 74 65 73 2e 20 20 41 6c 73 6f 20 72 65 63 6f 72  tes.  Also recor
d7b0: 64 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f  d follow-set pro
d7c0: 70 61 67 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  pagation.    ** 
d7d0: 6c 69 6e 6b 73 20 73 6f 20 74 68 61 74 20 74 68  links so that th
d7e0: 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 61 6e  e follow-set can
d7f0: 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61 74   be computed lat
d800: 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e 6e 73  er */.    lem.ns
d810: 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 46 69  tate = 0;.    Fi
d820: 6e 64 53 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a  ndStates(&lem);.
d830: 20 20 20 20 6c 65 6d 2e 73 6f 72 74 65 64 20 3d      lem.sorted =
d840: 20 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29   State_arrayof()
d850: 3b 0a 0a 20 20 20 20 2f 2a 20 54 69 65 20 75 70  ;..    /* Tie up
d860: 20 6c 6f 6f 73 65 20 65 6e 64 73 20 6f 6e 20 74   loose ends on t
d870: 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  he propagation l
d880: 69 6e 6b 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64  inks */.    Find
d890: 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  Links(&lem);..  
d8a0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
d8b0: 20 66 6f 6c 6c 6f 77 20 73 65 74 20 6f 66 20 65   follow set of e
d8c0: 76 65 72 79 20 72 65 64 75 63 69 62 6c 65 20 63  very reducible c
d8d0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a  onfiguration */.
d8e0: 20 20 20 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65      FindFollowSe
d8f0: 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  ts(&lem);..    /
d900: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63  * Compute the ac
d910: 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20  tion tables */. 
d920: 20 20 20 46 69 6e 64 41 63 74 69 6f 6e 73 28 26     FindActions(&
d930: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
d940: 6d 70 72 65 73 73 20 74 68 65 20 61 63 74 69 6f  mpress the actio
d950: 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  n tables */.    
d960: 69 66 28 20 63 6f 6d 70 72 65 73 73 3d 3d 30 20  if( compress==0 
d970: 29 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73  ) CompressTables
d980: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
d990: 52 65 6f 72 64 65 72 20 61 6e 64 20 72 65 6e 75  Reorder and renu
d9a0: 6d 62 65 72 20 74 68 65 20 73 74 61 74 65 73 20  mber the states 
d9b0: 73 6f 20 74 68 61 74 20 73 74 61 74 65 73 20 77  so that states w
d9c0: 69 74 68 20 66 65 77 65 72 20 63 68 6f 69 63 65  ith fewer choice
d9d0: 73 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 20 61  s.    ** occur a
d9e0: 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73  t the end.  This
d9f0: 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
da00: 69 6f 6e 20 74 68 61 74 20 68 65 6c 70 73 20 6d  ion that helps m
da10: 61 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 67  ake the.    ** g
da20: 65 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 20  enerated parser 
da30: 74 61 62 6c 65 73 20 73 6d 61 6c 6c 65 72 2e 20  tables smaller. 
da40: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 6f 52 65 73  */.    if( noRes
da50: 6f 72 74 3d 3d 30 20 29 20 52 65 73 6f 72 74 53  ort==0 ) ResortS
da60: 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  tates(&lem);..  
da70: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
da80: 72 65 70 6f 72 74 20 6f 66 20 74 68 65 20 70 61  report of the pa
da90: 72 73 65 72 20 67 65 6e 65 72 61 74 65 64 2e 20  rser generated. 
daa0: 20 28 74 68 65 20 22 79 2e 6f 75 74 70 75 74 22   (the "y.output"
dab0: 20 66 69 6c 65 29 20 2a 2f 0a 20 20 20 20 69 66   file) */.    if
dac0: 28 20 21 71 75 69 65 74 20 29 20 52 65 70 6f 72  ( !quiet ) Repor
dad0: 74 4f 75 74 70 75 74 28 26 6c 65 6d 29 3b 0a 0a  tOutput(&lem);..
dae0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
daf0: 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20  the source code 
db00: 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a  for the parser *
db10: 2f 0a 20 20 20 20 52 65 70 6f 72 74 54 61 62 6c  /.    ReportTabl
db20: 65 28 26 6c 65 6d 2c 20 6d 68 66 6c 61 67 29 3b  e(&lem, mhflag);
db30: 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 64 75 63 65  ..    /* Produce
db40: 20 61 20 68 65 61 64 65 72 20 66 69 6c 65 20 66   a header file f
db50: 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 73 63  or use by the sc
db60: 61 6e 6e 65 72 2e 20 20 28 54 68 69 73 20 73 74  anner.  (This st
db70: 65 70 20 69 73 0a 20 20 20 20 2a 2a 20 6f 6d 69  ep is.    ** omi
db80: 74 74 65 64 20 69 66 20 74 68 65 20 22 2d 6d 22  tted if the "-m"
db90: 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20   option is used 
dba0: 62 65 63 61 75 73 65 20 6d 61 6b 65 68 65 61 64  because makehead
dbb0: 65 72 73 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ers will.    ** 
dbc0: 67 65 6e 65 72 61 74 65 20 74 68 65 20 66 69 6c  generate the fil
dbd0: 65 20 66 6f 72 20 75 73 2e 29 20 2a 2f 0a 20 20  e for us.) */.  
dbe0: 20 20 69 66 28 20 21 6d 68 66 6c 61 67 20 29 20    if( !mhflag ) 
dbf0: 52 65 70 6f 72 74 48 65 61 64 65 72 28 26 6c 65  ReportHeader(&le
dc00: 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  m);.  }.  if( st
dc10: 61 74 69 73 74 69 63 73 20 29 7b 0a 20 20 20 20  atistics ){.    
dc20: 70 72 69 6e 74 66 28 22 50 61 72 73 65 72 20 73  printf("Parser s
dc30: 74 61 74 69 73 74 69 63 73 3a 5c 6e 22 29 3b 0a  tatistics:\n");.
dc40: 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22      stats_line("
dc50: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
dc60: 22 2c 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c  ", lem.nterminal
dc70: 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e  );.    stats_lin
dc80: 65 28 22 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  e("non-terminal 
dc90: 73 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e 73  symbols", lem.ns
dca0: 79 6d 62 6f 6c 20 2d 20 6c 65 6d 2e 6e 74 65 72  ymbol - lem.nter
dcb0: 6d 69 6e 61 6c 29 3b 0a 20 20 20 20 73 74 61 74  minal);.    stat
dcc0: 73 5f 6c 69 6e 65 28 22 74 6f 74 61 6c 20 73 79  s_line("total sy
dcd0: 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e 73 79 6d  mbols", lem.nsym
dce0: 62 6f 6c 29 3b 0a 20 20 20 20 73 74 61 74 73 5f  bol);.    stats_
dcf0: 6c 69 6e 65 28 22 72 75 6c 65 73 22 2c 20 6c 65  line("rules", le
dd00: 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20 20 20 73 74  m.nrule);.    st
dd10: 61 74 73 5f 6c 69 6e 65 28 22 73 74 61 74 65 73  ats_line("states
dd20: 22 2c 20 6c 65 6d 2e 6e 78 73 74 61 74 65 29 3b  ", lem.nxstate);
dd30: 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28  .    stats_line(
dd40: 22 63 6f 6e 66 6c 69 63 74 73 22 2c 20 6c 65 6d  "conflicts", lem
dd50: 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 20  .nconflict);.   
dd60: 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 61 63 74   stats_line("act
dd70: 69 6f 6e 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ion table entrie
dd80: 73 22 2c 20 6c 65 6d 2e 6e 61 63 74 69 6f 6e 74  s", lem.nactiont
dd90: 61 62 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c  ab);.    stats_l
dda0: 69 6e 65 28 22 74 6f 74 61 6c 20 74 61 62 6c 65  ine("total table
ddb0: 20 73 69 7a 65 20 28 62 79 74 65 73 29 22 2c 20   size (bytes)", 
ddc0: 6c 65 6d 2e 74 61 62 6c 65 73 69 7a 65 29 3b 0a  lem.tablesize);.
ddd0: 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 63    }.  if( lem.nc
dde0: 6f 6e 66 6c 69 63 74 20 3e 20 30 20 29 7b 0a 20  onflict > 0 ){. 
ddf0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
de00: 72 2c 22 25 64 20 70 61 72 73 69 6e 67 20 63 6f  r,"%d parsing co
de10: 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c 65 6d 2e  nflicts.\n",lem.
de20: 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d 0a  nconflict);.  }.
de30: 0a 20 20 2f 2a 20 72 65 74 75 72 6e 20 30 20 6f  .  /* return 0 o
de40: 6e 20 73 75 63 63 65 73 73 2c 20 31 20 6f 6e 20  n success, 1 on 
de50: 66 61 69 6c 75 72 65 2e 20 2a 2f 0a 20 20 65 78  failure. */.  ex
de60: 69 74 63 6f 64 65 20 3d 20 28 28 6c 65 6d 2e 65  itcode = ((lem.e
de70: 72 72 6f 72 63 6e 74 20 3e 20 30 29 20 7c 7c 20  rrorcnt > 0) || 
de80: 28 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e  (lem.nconflict >
de90: 20 30 29 29 20 3f 20 31 20 3a 20 30 3b 0a 20 20   0)) ? 1 : 0;.  
dea0: 65 78 69 74 28 65 78 69 74 63 6f 64 65 29 3b 0a  exit(exitcode);.
deb0: 20 20 72 65 74 75 72 6e 20 28 65 78 69 74 63 6f    return (exitco
dec0: 64 65 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  de);.}./********
ded0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
dee0: 6d 20 74 68 65 20 66 69 6c 65 20 22 6d 73 6f 72  m the file "msor
def0: 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t.c" ***********
df00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
df10: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 67 65  ****/./*.** A ge
df20: 6e 65 72 69 63 20 6d 65 72 67 65 2d 73 6f 72 74  neric merge-sort
df30: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
df40: 55 53 41 47 45 3a 0a 2a 2a 20 4c 65 74 20 22 70  USAGE:.** Let "p
df50: 74 72 22 20 62 65 20 61 20 70 6f 69 6e 74 65 72  tr" be a pointer
df60: 20 74 6f 20 73 6f 6d 65 20 73 74 72 75 63 74 75   to some structu
df70: 72 65 20 77 68 69 63 68 20 69 73 20 61 74 20 74  re which is at t
df80: 68 65 20 68 65 61 64 20 6f 66 0a 2a 2a 20 61 20  he head of.** a 
df90: 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20  null-terminated 
dfa0: 6c 69 73 74 2e 20 20 54 68 65 6e 20 74 6f 20 73  list.  Then to s
dfb0: 6f 72 74 20 74 68 65 20 6c 69 73 74 20 63 61 6c  ort the list cal
dfc0: 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 74 72  l:.**.**     ptr
dfd0: 20 3d 20 6d 73 6f 72 74 28 70 74 72 2c 26 28 70   = msort(ptr,&(p
dfe0: 74 72 2d 3e 6e 65 78 74 29 2c 63 6d 70 66 6e 63  tr->next),cmpfnc
dff0: 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  );.**.** In the 
e000: 61 62 6f 76 65 2c 20 22 63 6d 70 66 6e 63 22 20  above, "cmpfnc" 
e010: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
e020: 61 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 63 68  a function which
e030: 20 63 6f 6d 70 61 72 65 73 0a 2a 2a 20 74 77 6f   compares.** two
e040: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
e050: 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
e060: 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67  returns an integ
e070: 65 72 2c 20 61 73 20 69 6e 0a 2a 2a 20 73 74 72  er, as in.** str
e080: 63 6d 70 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  cmp.  The second
e090: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
e0a0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 6f  ointer to the po
e0b0: 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20  inter to the.** 
e0c0: 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f  second element o
e0d0: 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  f the linked lis
e0e0: 74 2e 20 20 54 68 69 73 20 61 64 64 72 65 73 73  t.  This address
e0f0: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   is used to comp
e100: 75 74 65 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65  ute.** the offse
e110: 74 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20  t to the "next" 
e120: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
e130: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
e140: 20 6f 66 66 73 65 74 20 74 6f 0a 2a 2a 20 74 68   offset to.** th
e150: 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64 20 6d  e "next" field m
e160: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 20  ust be constant 
e170: 66 6f 72 20 61 6c 6c 20 73 74 72 75 63 74 75 72  for all structur
e180: 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  es in the list..
e190: 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  **.** The functi
e1a0: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77  on returns a new
e1b0: 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 69   pointer which i
e1c0: 73 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  s the head of th
e1d0: 65 20 6c 69 73 74 0a 2a 2a 20 61 66 74 65 72 20  e list.** after 
e1e0: 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  sorting..**.** A
e1f0: 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a 20 4d 65 72  LGORITHM:.** Mer
e200: 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f 2a 0a  ge-sort..*/../*.
e210: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
e220: 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ter to the next 
e230: 73 74 72 75 63 74 75 72 65 20 69 6e 20 74 68 65  structure in the
e240: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f   linked list..*/
e250: 0a 23 64 65 66 69 6e 65 20 4e 45 58 54 28 41 29  .#define NEXT(A)
e260: 20 28 2a 28 63 68 61 72 2a 2a 29 28 28 28 63 68   (*(char**)(((ch
e270: 61 72 2a 29 41 29 2b 6f 66 66 73 65 74 29 29 0a  ar*)A)+offset)).
e280: 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a  ./*.** Inputs:.*
e290: 2a 20 20 20 61 3a 20 20 20 20 20 20 20 41 20 73  *   a:       A s
e2a0: 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d  orted, null-term
e2b0: 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69  inated linked li
e2c0: 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75 6c  st.  (May be nul
e2d0: 6c 29 2e 0a 2a 2a 20 20 20 62 3a 20 20 20 20 20  l)..**   b:     
e2e0: 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c    A sorted, null
e2f0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b  -terminated link
e300: 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62  ed list.  (May b
e310: 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63 6d  e null)..**   cm
e320: 70 3a 20 20 20 20 20 41 20 70 6f 69 6e 74 65 72  p:     A pointer
e330: 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   to the comparis
e340: 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  on function..** 
e350: 20 20 6f 66 66 73 65 74 3a 20 20 4f 66 66 73 65    offset:  Offse
e360: 74 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  t in the structu
e370: 72 65 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22  re to the "next"
e380: 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52 65   field..**.** Re
e390: 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20  turn Value:.**  
e3a0: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
e3b0: 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74  e head of a sort
e3c0: 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  ed list containi
e3d0: 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a  ng the elements.
e3e0: 2a 2a 20 20 20 6f 66 20 62 6f 74 68 20 61 20 61  **   of both a a
e3f0: 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65  nd b..**.** Side
e400: 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54   effects:.**   T
e410: 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65  he "next" pointe
e420: 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20  rs for elements 
e430: 69 6e 20 74 68 65 20 6c 69 73 74 73 20 61 20 61  in the lists a a
e440: 6e 64 20 62 20 61 72 65 0a 2a 2a 20 20 20 63 68  nd b are.**   ch
e450: 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  anged..*/.static
e460: 20 63 68 61 72 20 2a 6d 65 72 67 65 28 0a 20 20   char *merge(.  
e470: 63 68 61 72 20 2a 61 2c 0a 20 20 63 68 61 72 20  char *a,.  char 
e480: 2a 62 2c 0a 20 20 69 6e 74 20 28 2a 63 6d 70 29  *b,.  int (*cmp)
e490: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e  (const char*,con
e4a0: 73 74 20 63 68 61 72 2a 29 2c 0a 20 20 69 6e 74  st char*),.  int
e4b0: 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 63 68 61   offset.){.  cha
e4c0: 72 20 2a 70 74 72 2c 20 2a 68 65 61 64 3b 0a 0a  r *ptr, *head;..
e4d0: 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
e4e0: 20 20 68 65 61 64 20 3d 20 62 3b 0a 20 20 7d 65    head = b;.  }e
e4f0: 6c 73 65 20 69 66 28 20 62 3d 3d 30 20 29 7b 0a  lse if( b==0 ){.
e500: 20 20 20 20 68 65 61 64 20 3d 20 61 3b 0a 20 20      head = a;.  
e510: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 28  }else{.    if( (
e520: 2a 63 6d 70 29 28 61 2c 62 29 3c 3d 30 20 29 7b  *cmp)(a,b)<=0 ){
e530: 0a 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a  .      ptr = a;.
e540: 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61        a = NEXT(a
e550: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
e560: 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20      ptr = b;.   
e570: 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a     b = NEXT(b);.
e580: 20 20 20 20 7d 0a 20 20 20 20 68 65 61 64 20 3d      }.    head =
e590: 20 70 74 72 3b 0a 20 20 20 20 77 68 69 6c 65 28   ptr;.    while(
e5a0: 20 61 20 26 26 20 62 20 29 7b 0a 20 20 20 20 20   a && b ){.     
e5b0: 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29   if( (*cmp)(a,b)
e5c0: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4e  <=0 ){.        N
e5d0: 45 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20  EXT(ptr) = a;.  
e5e0: 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a 20        ptr = a;. 
e5f0: 20 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28         a = NEXT(
e600: 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  a);.      }else{
e610: 0a 20 20 20 20 20 20 20 20 4e 45 58 54 28 70 74  .        NEXT(pt
e620: 72 29 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20  r) = b;.        
e630: 70 74 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 20  ptr = b;.       
e640: 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20   b = NEXT(b);.  
e650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e660: 69 66 28 20 61 20 29 20 4e 45 58 54 28 70 74 72  if( a ) NEXT(ptr
e670: 29 20 3d 20 61 3b 0a 20 20 20 20 65 6c 73 65 20  ) = a;.    else 
e680: 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 62     NEXT(ptr) = b
e690: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
e6a0: 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ead;.}../*.** In
e6b0: 70 75 74 73 3a 0a 2a 2a 20 20 20 6c 69 73 74 3a  puts:.**   list:
e6c0: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
e6d0: 20 61 20 73 69 6e 67 6c 79 2d 6c 69 6e 6b 65 64   a singly-linked
e6e0: 20 6c 69 73 74 20 6f 66 20 73 74 72 75 63 74 75   list of structu
e6f0: 72 65 73 2e 0a 2a 2a 20 20 20 6e 65 78 74 3a 20  res..**   next: 
e700: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
e710: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
e720: 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66  econd element of
e730: 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 20 20 20   the list..**   
e740: 63 6d 70 3a 20 20 20 20 20 20 20 41 20 63 6f 6d  cmp:       A com
e750: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
e760: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 56  ..**.** Return V
e770: 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f 69  alue:.**   A poi
e780: 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
e790: 20 6f 66 20 61 20 73 6f 72 74 65 64 20 6c 69 73   of a sorted lis
e7a0: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
e7b0: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f   elements.**   o
e7c0: 72 67 69 6e 61 6c 6c 79 20 69 6e 20 6c 69 73 74  rginally in list
e7d0: 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66 66  ..**.** Side eff
e7e0: 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20 22  ects:.**   The "
e7f0: 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20 66  next" pointers f
e800: 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 6c  or elements in l
e810: 69 73 74 20 61 72 65 20 63 68 61 6e 67 65 64 2e  ist are changed.
e820: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 49 53 54  .*/.#define LIST
e830: 53 49 5a 45 20 33 30 0a 73 74 61 74 69 63 20 63  SIZE 30.static c
e840: 68 61 72 20 2a 6d 73 6f 72 74 28 0a 20 20 63 68  har *msort(.  ch
e850: 61 72 20 2a 6c 69 73 74 2c 0a 20 20 63 68 61 72  ar *list,.  char
e860: 20 2a 2a 6e 65 78 74 2c 0a 20 20 69 6e 74 20 28   **next,.  int (
e870: 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72  *cmp)(const char
e880: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29  *,const char*).)
e890: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  {.  unsigned lon
e8a0: 67 20 6f 66 66 73 65 74 3b 0a 20 20 63 68 61 72  g offset;.  char
e8b0: 20 2a 65 70 3b 0a 20 20 63 68 61 72 20 2a 73 65   *ep;.  char *se
e8c0: 74 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a 20 20 69  t[LISTSIZE];.  i
e8d0: 6e 74 20 69 3b 0a 20 20 6f 66 66 73 65 74 20 3d  nt i;.  offset =
e8e0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
e8f0: 28 28 63 68 61 72 2a 29 6e 65 78 74 20 2d 20 28  ((char*)next - (
e900: 63 68 61 72 2a 29 6c 69 73 74 29 3b 0a 20 20 66  char*)list);.  f
e910: 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49  or(i=0; i<LISTSI
e920: 5a 45 3b 20 69 2b 2b 29 20 73 65 74 5b 69 5d 20  ZE; i++) set[i] 
e930: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 6c 69  = 0;.  while( li
e940: 73 74 20 29 7b 0a 20 20 20 20 65 70 20 3d 20 6c  st ){.    ep = l
e950: 69 73 74 3b 0a 20 20 20 20 6c 69 73 74 20 3d 20  ist;.    list = 
e960: 4e 45 58 54 28 6c 69 73 74 29 3b 0a 20 20 20 20  NEXT(list);.    
e970: 4e 45 58 54 28 65 70 29 20 3d 20 30 3b 0a 20 20  NEXT(ep) = 0;.  
e980: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53    for(i=0; i<LIS
e990: 54 53 49 5a 45 2d 31 20 26 26 20 73 65 74 5b 69  TSIZE-1 && set[i
e9a0: 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ]!=0; i++){.    
e9b0: 20 20 65 70 20 3d 20 6d 65 72 67 65 28 65 70 2c    ep = merge(ep,
e9c0: 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65  set[i],cmp,offse
e9d0: 74 29 3b 0a 20 20 20 20 20 20 73 65 74 5b 69 5d  t);.      set[i]
e9e0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
e9f0: 73 65 74 5b 69 5d 20 3d 20 65 70 3b 0a 20 20 7d  set[i] = ep;.  }
ea00: 0a 20 20 65 70 20 3d 20 30 3b 0a 20 20 66 6f 72  .  ep = 0;.  for
ea10: 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45  (i=0; i<LISTSIZE
ea20: 3b 20 69 2b 2b 29 20 69 66 28 20 73 65 74 5b 69  ; i++) if( set[i
ea30: 5d 20 29 20 65 70 20 3d 20 6d 65 72 67 65 28 73  ] ) ep = merge(s
ea40: 65 74 5b 69 5d 2c 65 70 2c 63 6d 70 2c 6f 66 66  et[i],ep,cmp,off
ea50: 73 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  set);.  return e
ea60: 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  p;.}./**********
ea70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
ea80: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70  rom the file "op
ea90: 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  tion.c" ********
eaa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eab0: 2a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  **/.static char 
eac0: 2a 2a 61 72 67 76 3b 0a 73 74 61 74 69 63 20 73  **argv;.static s
ead0: 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20  truct s_options 
eae0: 2a 6f 70 3b 0a 73 74 61 74 69 63 20 46 49 4c 45  *op;.static FILE
eaf0: 20 2a 65 72 72 73 74 72 65 61 6d 3b 0a 0a 23 64   *errstream;..#d
eb00: 65 66 69 6e 65 20 49 53 4f 50 54 28 58 29 20 28  efine ISOPT(X) (
eb10: 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58 29  (X)[0]=='-'||(X)
eb20: 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63 68 72  [0]=='+'||strchr
eb30: 28 28 58 29 2c 27 3d 27 29 21 3d 30 29 0a 0a 2f  ((X),'=')!=0)../
eb40: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63  *.** Print the c
eb50: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 69 74 68  ommand line with
eb60: 20 61 20 63 61 72 72 6f 74 20 70 6f 69 6e 74 69   a carrot pointi
eb70: 6e 67 20 74 6f 20 74 68 65 20 6b 2d 74 68 20 63  ng to the k-th c
eb80: 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 74  haracter.** of t
eb90: 68 65 20 6e 2d 74 68 20 66 69 65 6c 64 2e 0a 2a  he n-th field..*
eba0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 72  /.static void er
ebb0: 72 6c 69 6e 65 28 69 6e 74 20 6e 2c 20 69 6e 74  rline(int n, int
ebc0: 20 6b 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b   k, FILE *err).{
ebd0: 0a 20 20 69 6e 74 20 73 70 63 6e 74 2c 20 69 3b  .  int spcnt, i;
ebe0: 0a 20 20 69 66 28 20 61 72 67 76 5b 30 5d 20 29  .  if( argv[0] )
ebf0: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
ec00: 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 70  ",argv[0]);.  sp
ec10: 63 6e 74 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  cnt = lemonStrle
ec20: 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a  n(argv[0]) + 1;.
ec30: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26    for(i=1; i<n &
ec40: 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b  & argv[i]; i++){
ec50: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
ec60: 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b  ," %s",argv[i]);
ec70: 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d 20 6c 65  .    spcnt += le
ec80: 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76 5b 69  monStrlen(argv[i
ec90: 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20 73 70 63 6e  ])+1;.  }.  spcn
eca0: 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b 20  t += k;.  for(; 
ecb0: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 20 66 70  argv[i]; i++) fp
ecc0: 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22 2c  rintf(err," %s",
ecd0: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 69 66 28 20  argv[i]);.  if( 
ece0: 73 70 63 6e 74 3c 32 30 20 29 7b 0a 20 20 20 20  spcnt<20 ){.    
ecf0: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25  fprintf(err,"\n%
ed00: 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c 73 70  *s^-- here\n",sp
ed10: 63 6e 74 2c 22 22 29 3b 0a 20 20 7d 65 6c 73 65  cnt,"");.  }else
ed20: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72  {.    fprintf(er
ed30: 72 2c 22 5c 6e 25 2a 73 68 65 72 65 20 2d 2d 5e  r,"\n%*shere --^
ed40: 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c 22 22 29 3b  \n",spcnt-7,"");
ed50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
ed60: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
ed70: 66 20 74 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d 73  f the N-th non-s
ed80: 77 69 74 63 68 20 61 72 67 75 6d 65 6e 74 2e 20  witch argument. 
ed90: 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
eda0: 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   N is out of ran
edb0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
edc0: 74 20 61 72 67 69 6e 64 65 78 28 69 6e 74 20 6e  t argindex(int n
edd0: 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ).{.  int i;.  i
ede0: 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b  nt dashdash = 0;
edf0: 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26  .  if( argv!=0 &
ee00: 26 20 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20 20  & *argv!=0 ){.  
ee10: 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b    for(i=1; argv[
ee20: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
ee30: 69 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20  if( dashdash || 
ee40: 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20  !ISOPT(argv[i]) 
ee50: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
ee60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
ee70: 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20          n--;.   
ee80: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
ee90: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d  trcmp(argv[i],"-
eea0: 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73  -")==0 ) dashdas
eeb0: 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  h = 1;.    }.  }
eec0: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
eed0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 65 6d 73  .static char ems
eee0: 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c  g[] = "Command l
eef0: 69 6e 65 20 73 79 6e 74 61 78 20 65 72 72 6f 72  ine syntax error
ef00: 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  : ";../*.** Proc
ef10: 65 73 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d 61  ess a flag comma
ef20: 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd line argument
ef30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ef40: 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 6e 74 20  handleflags(int 
ef50: 69 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a  i, FILE *err).{.
ef60: 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e 74 20 65    int v;.  int e
ef70: 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  rrcnt = 0;.  int
ef80: 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f   j;.  for(j=0; o
ef90: 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29  p[j].label; j++)
efa0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  {.    if( strncm
efb0: 70 28 26 61 72 67 76 5b 69 5d 5b 31 5d 2c 6f 70  p(&argv[i][1],op
efc0: 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c 65 6d 6f 6e 53  [j].label,lemonS
efd0: 74 72 6c 65 6e 28 6f 70 5b 6a 5d 2e 6c 61 62 65  trlen(op[j].labe
efe0: 6c 29 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  l))==0 ) break;.
eff0: 20 20 7d 0a 20 20 76 20 3d 20 61 72 67 76 5b 69    }.  v = argv[i
f000: 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a 20  ][0]=='-' ? 1 : 
f010: 30 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c  0;.  if( op[j].l
f020: 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  abel==0 ){.    i
f030: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
f040: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75  fprintf(err,"%su
f050: 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e  ndefined option.
f060: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
f070: 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72   errline(i,1,err
f080: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72  );.    }.    err
f090: 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69  cnt++;.  }else i
f0a0: 66 28 20 6f 70 5b 6a 5d 2e 61 72 67 3d 3d 30 20  f( op[j].arg==0 
f0b0: 29 7b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65  ){.    /* Ignore
f0c0: 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 2a 2f 0a   this option */.
f0d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a    }else if( op[j
f0e0: 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c 41 47  ].type==OPT_FLAG
f0f0: 20 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74 2a 29   ){.    *((int*)
f100: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76 3b 0a  op[j].arg) = v;.
f110: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a    }else if( op[j
f120: 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46 4c 41  ].type==OPT_FFLA
f130: 47 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64  G ){.    (*(void
f140: 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e  (*)(int))(op[j].
f150: 61 72 67 29 29 28 76 29 3b 0a 20 20 7d 65 6c 73  arg))(v);.  }els
f160: 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65  e if( op[j].type
f170: 3d 3d 4f 50 54 5f 46 53 54 52 20 29 7b 0a 20 20  ==OPT_FSTR ){.  
f180: 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 63 68 61    (*(void(*)(cha
f190: 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  r *))(op[j].arg)
f1a0: 29 28 26 61 72 67 76 5b 69 5d 5b 32 5d 29 3b 0a  )(&argv[i][2]);.
f1b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
f1c0: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70   err ){.      fp
f1d0: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6d 69 73  rintf(err,"%smis
f1e0: 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e  sing argument on
f1f0: 20 73 77 69 74 63 68 2e 5c 6e 22 2c 65 6d 73 67   switch.\n",emsg
f200: 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65  );.      errline
f210: 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d  (i,1,err);.    }
f220: 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20  .    errcnt++;. 
f230: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
f240: 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  nt;.}../*.** Pro
f250: 63 65 73 73 20 61 20 63 6f 6d 6d 61 6e 64 20 6c  cess a command l
f260: 69 6e 65 20 73 77 69 74 63 68 20 77 68 69 63 68  ine switch which
f270: 20 68 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74   has an argument
f280: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f290: 68 61 6e 64 6c 65 73 77 69 74 63 68 28 69 6e 74  handleswitch(int
f2a0: 20 69 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b   i, FILE *err).{
f2b0: 0a 20 20 69 6e 74 20 6c 76 20 3d 20 30 3b 0a 20  .  int lv = 0;. 
f2c0: 20 64 6f 75 62 6c 65 20 64 76 20 3d 20 30 2e 30   double dv = 0.0
f2d0: 3b 0a 20 20 63 68 61 72 20 2a 73 76 20 3d 20 30  ;.  char *sv = 0
f2e0: 2c 20 2a 65 6e 64 3b 0a 20 20 63 68 61 72 20 2a  , *end;.  char *
f2f0: 63 70 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69  cp;.  int j;.  i
f300: 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20  nt errcnt = 0;. 
f310: 20 63 70 20 3d 20 73 74 72 63 68 72 28 61 72 67   cp = strchr(arg
f320: 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20 20 61 73 73  v[i],'=');.  ass
f330: 65 72 74 28 20 63 70 21 3d 30 20 29 3b 0a 20 20  ert( cp!=0 );.  
f340: 2a 63 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a  *cp = 0;.  for(j
f350: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
f360: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
f370: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 6f 70  trcmp(argv[i],op
f380: 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20 29 20  [j].label)==0 ) 
f390: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70  break;.  }.  *cp
f3a0: 20 3d 20 27 3d 27 3b 0a 20 20 69 66 28 20 6f 70   = '=';.  if( op
f3b0: 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a  [j].label==0 ){.
f3c0: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
f3d0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
f3e0: 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70  ,"%sundefined op
f3f0: 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  tion.\n",emsg);.
f400: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
f410: 30 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  0,err);.    }.  
f420: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65    errcnt++;.  }e
f430: 6c 73 65 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a 20  lse{.    cp++;. 
f440: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d     switch( op[j]
f450: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
f460: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
f470: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
f480: 41 47 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20  AG:.        if( 
f490: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  err ){.         
f4a0: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
f4b0: 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
f4c0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c  an argument.\n",
f4d0: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  emsg);.         
f4e0: 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72   errline(i,0,err
f4f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f500: 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20       errcnt++;. 
f510: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f520: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
f530: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
f540: 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 64  _FDBL:.        d
f550: 76 20 3d 20 73 74 72 74 6f 64 28 63 70 2c 26 65  v = strtod(cp,&e
f560: 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nd);.        if(
f570: 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20   *end ){.       
f580: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
f590: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
f5a0: 66 28 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20  f(err,.         
f5b0: 20 20 20 20 20 20 22 25 73 69 6c 6c 65 67 61 6c        "%sillegal
f5c0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 66 6c   character in fl
f5d0: 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 61 72 67  oating-point arg
f5e0: 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b  ument.\n",emsg);
f5f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72  .            err
f600: 6c 69 6e 65 28 69 2c 28 69 6e 74 29 28 28 63 68  line(i,(int)((ch
f610: 61 72 2a 29 65 6e 64 2d 28 63 68 61 72 2a 29 61  ar*)end-(char*)a
f620: 72 67 76 5b 69 5d 29 2c 65 72 72 29 3b 0a 20 20  rgv[i]),err);.  
f630: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f640: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
f650: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f660: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
f670: 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20  e OPT_INT:.     
f680: 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a   case OPT_FINT:.
f690: 20 20 20 20 20 20 20 20 6c 76 20 3d 20 73 74 72          lv = str
f6a0: 74 6f 6c 28 63 70 2c 26 65 6e 64 2c 30 29 3b 0a  tol(cp,&end,0);.
f6b0: 20 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64          if( *end
f6c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
f6d0: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20  ( err ){.       
f6e0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
f6f0: 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72  ,"%sillegal char
f700: 61 63 74 65 72 20 69 6e 20 69 6e 74 65 67 65 72  acter in integer
f710: 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d   argument.\n",em
f720: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sg);.           
f730: 20 65 72 72 6c 69 6e 65 28 69 2c 28 69 6e 74 29   errline(i,(int)
f740: 28 28 63 68 61 72 2a 29 65 6e 64 2d 28 63 68 61  ((char*)end-(cha
f750: 72 2a 29 61 72 67 76 5b 69 5d 29 2c 65 72 72 29  r*)argv[i]),err)
f760: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
f770: 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b          errcnt++
f780: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f790: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f7a0: 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20   case OPT_STR:. 
f7b0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53       case OPT_FS
f7c0: 54 52 3a 0a 20 20 20 20 20 20 20 20 73 76 20 3d  TR:.        sv =
f7d0: 20 63 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65   cp;.        bre
f7e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  ak;.    }.    sw
f7f0: 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65  itch( op[j].type
f800: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
f810: 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63  PT_FLAG:.      c
f820: 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20  ase OPT_FFLAG:. 
f830: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f840: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
f850: 3a 0a 20 20 20 20 20 20 20 20 2a 28 64 6f 75 62  :.        *(doub
f860: 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20  le*)(op[j].arg) 
f870: 3d 20 64 76 3b 0a 20 20 20 20 20 20 20 20 62 72  = dv;.        br
f880: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
f890: 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20  OPT_FDBL:.      
f8a0: 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 64 6f 75    (*(void(*)(dou
f8b0: 62 6c 65 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  ble))(op[j].arg)
f8c0: 29 28 64 76 29 3b 0a 20 20 20 20 20 20 20 20 62  )(dv);.        b
f8d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
f8e0: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
f8f0: 20 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e    *(int*)(op[j].
f900: 61 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20  arg) = lv;.     
f910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f920: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
f930: 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a         (*(void(*
f940: 29 28 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e 61 72  )(int))(op[j].ar
f950: 67 29 29 28 28 69 6e 74 29 6c 76 29 3b 0a 20 20  g))((int)lv);.  
f960: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f970: 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a     case OPT_STR:
f980: 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a  .        *(char*
f990: 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20  *)(op[j].arg) = 
f9a0: 73 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  sv;.        brea
f9b0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
f9c0: 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20  T_FSTR:.        
f9d0: 28 2a 28 76 6f 69 64 28 2a 29 28 63 68 61 72 20  (*(void(*)(char 
f9e0: 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28  *))(op[j].arg))(
f9f0: 73 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  sv);.        bre
fa00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
fa10: 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d  return errcnt;.}
fa20: 0a 0a 69 6e 74 20 4f 70 74 49 6e 69 74 28 63 68  ..int OptInit(ch
fa30: 61 72 20 2a 2a 61 2c 20 73 74 72 75 63 74 20 73  ar **a, struct s
fa40: 5f 6f 70 74 69 6f 6e 73 20 2a 6f 2c 20 46 49 4c  _options *o, FIL
fa50: 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74 20  E *err).{.  int 
fa60: 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72  errcnt = 0;.  ar
fa70: 67 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f  gv = a;.  op = o
fa80: 3b 0a 20 20 65 72 72 73 74 72 65 61 6d 20 3d 20  ;.  errstream = 
fa90: 65 72 72 3b 0a 20 20 69 66 28 20 61 72 67 76 20  err;.  if( argv 
faa0: 26 26 20 2a 61 72 67 76 20 26 26 20 6f 70 20 29  && *argv && op )
fab0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
fac0: 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69   for(i=1; argv[i
fad0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
fae0: 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27  f( argv[i][0]=='
faf0: 2b 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d  +' || argv[i][0]
fb00: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
fb10: 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c   errcnt += handl
fb20: 65 66 6c 61 67 73 28 69 2c 65 72 72 29 3b 0a 20  eflags(i,err);. 
fb30: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
fb40: 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d  trchr(argv[i],'=
fb50: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72  ') ){.        er
fb60: 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77  rcnt += handlesw
fb70: 69 74 63 68 28 69 2c 65 72 72 29 3b 0a 20 20 20  itch(i,err);.   
fb80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
fb90: 20 69 66 28 20 65 72 72 63 6e 74 3e 30 20 29 7b   if( errcnt>0 ){
fba0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
fbb0: 2c 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20  ,"Valid command 
fbc0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72  line options for
fbd0: 20 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c   \"%s\" are:\n",
fbe0: 2a 61 29 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e  *a);.    OptPrin
fbf0: 74 28 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  t();.    exit(1)
fc00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
fc10: 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67  ;.}..int OptNArg
fc20: 73 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 63  s(void){.  int c
fc30: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 64 61  nt = 0;.  int da
fc40: 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  shdash = 0;.  in
fc50: 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76 21  t i;.  if( argv!
fc60: 3d 30 20 26 26 20 61 72 67 76 5b 30 5d 21 3d 30  =0 && argv[0]!=0
fc70: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
fc80: 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   argv[i]; i++){.
fc90: 20 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61        if( dashda
fca0: 73 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67  sh || !ISOPT(arg
fcb0: 76 5b 69 5d 29 20 29 20 63 6e 74 2b 2b 3b 0a 20  v[i]) ) cnt++;. 
fcc0: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
fcd0: 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30  argv[i],"--")==0
fce0: 20 29 20 64 61 73 68 64 61 73 68 20 3d 20 31 3b   ) dashdash = 1;
fcf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
fd00: 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72  urn cnt;.}..char
fd10: 20 2a 4f 70 74 41 72 67 28 69 6e 74 20 6e 29 0a   *OptArg(int n).
fd20: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
fd30: 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20   argindex(n);.  
fd40: 72 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72  return i>=0 ? ar
fd50: 67 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f  gv[i] : 0;.}..vo
fd60: 69 64 20 4f 70 74 45 72 72 28 69 6e 74 20 6e 29  id OptErr(int n)
fd70: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20  .{.  int i;.  i 
fd80: 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20  = argindex(n);. 
fd90: 20 69 66 28 20 69 3e 3d 30 20 29 20 65 72 72 6c   if( i>=0 ) errl
fda0: 69 6e 65 28 69 2c 30 2c 65 72 72 73 74 72 65 61  ine(i,0,errstrea
fdb0: 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50  m);.}..void OptP
fdc0: 72 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 69 6e  rint(void){.  in
fdd0: 74 20 69 3b 0a 20 20 69 6e 74 20 6d 61 78 2c 20  t i;.  int max, 
fde0: 6c 65 6e 3b 0a 20 20 6d 61 78 20 3d 20 30 3b 0a  len;.  max = 0;.
fdf0: 20 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d    for(i=0; op[i]
fe00: 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  .label; i++){.  
fe10: 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72    len = lemonStr
fe20: 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29  len(op[i].label)
fe30: 20 2b 20 31 3b 0a 20 20 20 20 73 77 69 74 63 68   + 1;.    switch
fe40: 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a  ( op[i].type ){.
fe50: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
fe60: 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20  LAG:.      case 
fe70: 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20  OPT_FFLAG:.     
fe80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
fe90: 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20  case OPT_INT:.  
fea0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e      case OPT_FIN
feb0: 54 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b  T:.        len +
fec0: 3d 20 39 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65  = 9;       /* le
fed0: 6e 67 74 68 20 6f 66 20 22 3c 69 6e 74 65 67 65  ngth of "<intege
fee0: 72 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  r>" */.        b
fef0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ff00: 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20   OPT_DBL:.      
ff10: 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20  case OPT_FDBL:. 
ff20: 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 36 3b         len += 6;
ff30: 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68         /* length
ff40: 20 6f 66 20 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a   of "<real>" */.
ff50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ff60: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54       case OPT_ST
ff70: 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  R:.      case OP
ff80: 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20  T_FSTR:.        
ff90: 6c 65 6e 20 2b 3d 20 38 3b 20 20 20 20 20 20 20  len += 8;       
ffa0: 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 73  /* length of "<s
ffb0: 74 72 69 6e 67 3e 22 20 2a 2f 0a 20 20 20 20 20  tring>" */.     
ffc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ffd0: 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 20      if( len>max 
ffe0: 29 20 6d 61 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d  ) max = len;.  }
fff0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69  .  for(i=0; op[i
10000 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20  ].label; i++){. 
10010 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d     switch( op[i]
10020 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
10030 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
10040 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
10050 41 47 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69  AG:.        fpri
10060 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20  ntf(errstream," 
10070 20 2d 25 2d 2a 73 20 20 25 73 5c 6e 22 2c 6d 61   -%-*s  %s\n",ma
10080 78 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70  x,op[i].label,op
10090 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20  [i].message);.  
100a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
100b0 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a     case OPT_INT:
100c0 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
100d0 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 66 70  FINT:.        fp
100e0 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c  rintf(errstream,
100f0 22 20 20 2d 25 73 3c 69 6e 74 65 67 65 72 3e 25  "  -%s<integer>%
10100 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e  *s  %s\n",op[i].
10110 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  label,.         
10120 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e   (int)(max-lemon
10130 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62  Strlen(op[i].lab
10140 65 6c 29 2d 39 29 2c 22 22 2c 6f 70 5b 69 5d 2e  el)-9),"",op[i].
10150 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20  message);.      
10160 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
10170 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20  ase OPT_DBL:.   
10180 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c     case OPT_FDBL
10190 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  :.        fprint
101a0 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d  f(errstream,"  -
101b0 25 73 3c 72 65 61 6c 3e 25 2a 73 20 20 25 73 5c  %s<real>%*s  %s\
101c0 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a  n",op[i].label,.
101d0 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
101e0 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  max-lemonStrlen(
101f0 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c  op[i].label)-6),
10200 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  "",op[i].message
10210 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
10220 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
10230 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65  _STR:.      case
10240 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20   OPT_FSTR:.     
10250 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74     fprintf(errst
10260 72 65 61 6d 2c 22 20 20 2d 25 73 3c 73 74 72 69  ream,"  -%s<stri
10270 6e 67 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70  ng>%*s  %s\n",op
10280 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20  [i].label,.     
10290 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c       (int)(max-l
102a0 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d  emonStrlen(op[i]
102b0 2e 6c 61 62 65 6c 29 2d 38 29 2c 22 22 2c 6f 70  .label)-8),"",op
102c0 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20  [i].message);.  
102d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
102e0 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a   }.  }.}./******
102f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10300 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
10310 22 70 61 72 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a  "parse.c" ******
10320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10330 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e  ******/./*.** In
10340 70 75 74 20 66 69 6c 65 20 70 61 72 73 65 72 20  put file parser 
10350 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
10360 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
10370 2a 2f 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65  */../* The state
10380 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a   of the parser *
10390 2f 0a 65 6e 75 6d 20 65 5f 73 74 61 74 65 20 7b  /.enum e_state {
103a0 0a 20 20 49 4e 49 54 49 41 4c 49 5a 45 2c 0a 20  .  INITIALIZE,. 
103b0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
103c0 4c 5f 4f 52 5f 52 55 4c 45 2c 0a 20 20 57 41 49  L_OR_RULE,.  WAI
103d0 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45  TING_FOR_DECL_KE
103e0 59 57 4f 52 44 2c 0a 20 20 57 41 49 54 49 4e 47  YWORD,.  WAITING
103f0 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 2c 0a 20  _FOR_DECL_ARG,. 
10400 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45   WAITING_FOR_PRE
10410 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a  CEDENCE_SYMBOL,.
10420 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52    WAITING_FOR_AR
10430 52 4f 57 2c 0a 20 20 49 4e 5f 52 48 53 2c 0a 20  ROW,.  IN_RHS,. 
10440 20 4c 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20   LHS_ALIAS_1,.  
10450 4c 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 4c  LHS_ALIAS_2,.  L
10460 48 53 5f 41 4c 49 41 53 5f 33 2c 0a 20 20 52 48  HS_ALIAS_3,.  RH
10470 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 52 48 53  S_ALIAS_1,.  RHS
10480 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 50 52 45 43  _ALIAS_2,.  PREC
10490 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20  EDENCE_MARK_1,. 
104a0 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
104b0 5f 32 2c 0a 20 20 52 45 53 59 4e 43 5f 41 46 54  _2,.  RESYNC_AFT
104c0 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20  ER_RULE_ERROR,. 
104d0 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
104e0 43 4c 5f 45 52 52 4f 52 2c 0a 20 20 57 41 49 54  CL_ERROR,.  WAIT
104f0 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54  ING_FOR_DESTRUCT
10500 4f 52 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49  OR_SYMBOL,.  WAI
10510 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50  TING_FOR_DATATYP
10520 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54  E_SYMBOL,.  WAIT
10530 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b  ING_FOR_FALLBACK
10540 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  _ID,.  WAITING_F
10550 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 2c 0a  OR_WILDCARD_ID,.
10560 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c    WAITING_FOR_CL
10570 41 53 53 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e  ASS_ID,.  WAITIN
10580 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45  G_FOR_CLASS_TOKE
10590 4e 0a 7d 3b 0a 73 74 72 75 63 74 20 70 73 74 61  N.};.struct psta
105a0 74 65 20 7b 0a 20 20 63 68 61 72 20 2a 66 69 6c  te {.  char *fil
105b0 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20  ename;       /* 
105c0 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75  Name of the inpu
105d0 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  t file */.  int 
105e0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20  tokenlineno;    
105f0 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20    /* Linenumber 
10600 61 74 20 77 68 69 63 68 20 63 75 72 72 65 6e 74  at which current
10610 20 74 6f 6b 65 6e 20 73 74 61 72 74 73 20 2a 2f   token starts */
10620 0a 20 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b  .  int errorcnt;
10630 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10640 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 6f 20  er of errors so 
10650 66 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74  far */.  char *t
10660 6f 6b 65 6e 73 74 61 72 74 3b 20 20 20 20 20 2f  okenstart;     /
10670 2a 20 54 65 78 74 20 6f 66 20 63 75 72 72 65 6e  * Text of curren
10680 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72  t token */.  str
10690 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20  uct lemon *gp;  
106a0 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 74 61     /* Global sta
106b0 74 65 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 65  te vector */.  e
106c0 6e 75 6d 20 65 5f 73 74 61 74 65 20 73 74 61 74  num e_state stat
106d0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
106e0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
106f0 72 73 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74  rser */.  struct
10700 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63   symbol *fallbac
10710 6b 3b 20 20 20 2f 2a 20 54 68 65 20 66 61 6c 6c  k;   /* The fall
10720 62 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  back token */.  
10730 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 74  struct symbol *t
10740 6b 63 6c 61 73 73 3b 20 20 20 20 2f 2a 20 54 6f  kclass;    /* To
10750 6b 65 6e 20 63 6c 61 73 73 20 73 79 6d 62 6f 6c  ken class symbol
10760 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
10770 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 20  bol *lhs;       
10780 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69   /* Left-hand si
10790 64 65 20 6f 66 20 63 75 72 72 65 6e 74 20 72 75  de of current ru
107a0 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
107b0 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20  ar *lhsalias;   
107c0 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20     /* Alias for 
107d0 74 68 65 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74  the LHS */.  int
107e0 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20   nrhs;          
107f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10800 72 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  r of right-hand 
10810 73 69 64 65 20 73 79 6d 62 6f 6c 73 20 73 65 65  side symbols see
10820 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  n */.  struct sy
10830 6d 62 6f 6c 20 2a 72 68 73 5b 4d 41 58 52 48 53  mbol *rhs[MAXRHS
10840 5d 3b 20 20 2f 2a 20 52 48 53 20 73 79 6d 62 6f  ];  /* RHS symbo
10850 6c 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ls */.  const ch
10860 61 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53  ar *alias[MAXRHS
10870 5d 3b 20 2f 2a 20 41 6c 69 61 73 65 73 20 66 6f  ]; /* Aliases fo
10880 72 20 65 61 63 68 20 52 48 53 20 73 79 6d 62 6f  r each RHS symbo
10890 6c 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  l (or NULL) */. 
108a0 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 72   struct rule *pr
108b0 65 76 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50  evrule;     /* P
108c0 72 65 76 69 6f 75 73 20 72 75 6c 65 20 70 61 72  revious rule par
108d0 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
108e0 68 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64  har *declkeyword
108f0 3b 20 20 20 2f 2a 20 4b 65 79 77 6f 72 64 20 6f  ;   /* Keyword o
10900 66 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  f a declaration 
10910 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 64 65 63 6c  */.  char **decl
10920 61 72 67 73 6c 6f 74 3b 20 20 20 20 20 20 20 20  argslot;        
10930 2f 2a 20 57 68 65 72 65 20 74 68 65 20 64 65 63  /* Where the dec
10940 6c 61 72 61 74 69 6f 6e 20 61 72 67 75 6d 65 6e  laration argumen
10950 74 20 73 68 6f 75 6c 64 20 62 65 20 70 75 74 20  t should be put 
10960 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 65 72 74 4c  */.  int insertL
10970 69 6e 65 4d 61 63 72 6f 3b 20 20 20 20 20 20 20  ineMacro;       
10980 2f 2a 20 41 64 64 20 23 6c 69 6e 65 20 62 65 66  /* Add #line bef
10990 6f 72 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ore declaration 
109a0 69 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20  insert */.  int 
109b0 2a 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b  *decllinenoslot;
109c0 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
109d0 74 6f 20 77 72 69 74 65 20 64 65 63 6c 61 72 61  to write declara
109e0 74 69 6f 6e 20 6c 69 6e 65 20 6e 75 6d 62 65 72  tion line number
109f0 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73   */.  enum e_ass
10a00 6f 63 20 64 65 63 6c 61 73 73 6f 63 3b 20 20 20  oc declassoc;   
10a10 20 2f 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20   /* Assign this 
10a20 61 73 73 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64  association to d
10a30 65 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ecl arguments */
10a40 0a 20 20 69 6e 74 20 70 72 65 63 63 6f 75 6e 74  .  int preccount
10a50 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er;           /*
10a60 20 41 73 73 69 67 6e 20 74 68 69 73 20 70 72 65   Assign this pre
10a70 63 65 64 65 6e 63 65 20 74 6f 20 64 65 63 6c 20  cedence to decl 
10a80 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73  arguments */.  s
10a90 74 72 75 63 74 20 72 75 6c 65 20 2a 66 69 72 73  truct rule *firs
10aa0 74 72 75 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69  trule;    /* Poi
10ab0 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 72 75  nter to first ru
10ac0 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  le in the gramma
10ad0 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  r */.  struct ru
10ae0 6c 65 20 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20  le *lastrule;   
10af0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
10b00 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
10b10 79 20 70 61 72 73 65 64 20 72 75 6c 65 20 2a 2f  y parsed rule */
10b20 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20  .};../* Parse a 
10b30 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a  single token */.
10b40 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73  static void pars
10b50 65 6f 6e 65 74 6f 6b 65 6e 28 73 74 72 75 63 74  eonetoken(struct
10b60 20 70 73 74 61 74 65 20 2a 70 73 70 29 0a 7b 0a   pstate *psp).{.
10b70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 3b    const char *x;
10b80 0a 20 20 78 20 3d 20 53 74 72 73 61 66 65 28 70  .  x = Strsafe(p
10b90 73 70 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b  sp->tokenstart);
10ba0 20 20 20 20 20 2f 2a 20 53 61 76 65 20 74 68 65       /* Save the
10bb0 20 74 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74   token permanent
10bc0 6c 79 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72  ly */.#if 0.  pr
10bd0 69 6e 74 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b  intf("%s:%d: Tok
10be0 65 6e 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25 64  en=[%s] state=%d
10bf0 5c 6e 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  \n",psp->filenam
10c00 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
10c10 6e 6f 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73  no,.    x,psp->s
10c20 74 61 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  tate);.#endif.  
10c30 73 77 69 74 63 68 28 20 70 73 70 2d 3e 73 74 61  switch( psp->sta
10c40 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 49  te ){.    case I
10c50 4e 49 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20  NITIALIZE:.     
10c60 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d   psp->prevrule =
10c70 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 70   0;.      psp->p
10c80 72 65 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a  reccounter = 0;.
10c90 20 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74        psp->first
10ca0 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74  rule = psp->last
10cb0 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rule = 0;.      
10cc0 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d  psp->gp->nrule =
10cd0 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c   0;.      /* Fal
10ce0 6c 20 74 68 72 75 20 74 6f 20 6e 65 78 74 20 63  l thru to next c
10cf0 61 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ase */.    case 
10d00 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
10d10 5f 4f 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20  _OR_RULE:.      
10d20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b  if( x[0]=='%' ){
10d30 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10d40 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
10d50 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a  R_DECL_KEYWORD;.
10d60 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10d70 49 53 4c 4f 57 45 52 28 78 5b 30 5d 29 20 29 7b  ISLOWER(x[0]) ){
10d80 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68  .        psp->lh
10d90 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  s = Symbol_new(x
10da0 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
10db0 6e 72 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  nrhs = 0;.      
10dc0 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20    psp->lhsalias 
10dd0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 0;.        psp
10de0 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
10df0 47 5f 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20  G_FOR_ARROW;.   
10e00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30     }else if( x[0
10e10 5d 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20 20  ]=='{' ){.      
10e20 20 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72    if( psp->prevr
10e30 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ule==0 ){.      
10e40 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
10e50 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
10e60 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68  tokenlineno,."Th
10e70 65 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20  ere is no prior 
10e80 72 75 6c 65 20 75 70 6f 6e 20 77 68 69 63 68 20  rule upon which 
10e90 74 6f 20 61 74 74 61 63 68 20 74 68 65 20 63 6f  to attach the co
10ea0 64 65 20 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68  de \.fragment wh
10eb0 69 63 68 20 62 65 67 69 6e 73 20 6f 6e 20 74 68  ich begins on th
10ec0 69 73 20 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20  is line.");.    
10ed0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
10ee0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
10ef0 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72  else if( psp->pr
10f00 65 76 72 75 6c 65 2d 3e 63 6f 64 65 21 3d 30 20  evrule->code!=0 
10f10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
10f20 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
10f30 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
10f40 6e 65 6e 6f 2c 0a 22 43 6f 64 65 20 66 72 61 67  neno,."Code frag
10f50 6d 65 6e 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f  ment beginning o
10f60 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
10f70 6f 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74  ot the first \.t
10f80 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65  o follow the pre
10f90 76 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20  vious rule.");. 
10fa0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
10fb0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
10fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10fd0 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
10fe0 2d 3e 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f  ->line = psp->to
10ff0 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20  kenlineno;.     
11000 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
11010 6c 65 2d 3e 63 6f 64 65 20 3d 20 26 78 5b 31 5d  le->code = &x[1]
11020 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
11030 3e 70 72 65 76 72 75 6c 65 2d 3e 6e 6f 43 6f 64  >prevrule->noCod
11040 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
11050 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
11060 20 78 5b 30 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20   x[0]=='[' ){.  
11070 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11080 20 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41   = PRECEDENCE_MA
11090 52 4b 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RK_1;.      }els
110a0 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
110b0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
110c0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
110d0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54  no,.          "T
110e0 6f 6b 65 6e 20 5c 22 25 73 5c 22 20 73 68 6f 75  oken \"%s\" shou
110f0 6c 64 20 62 65 20 65 69 74 68 65 72 20 5c 22 25  ld be either \"%
11100 25 5c 22 20 6f 72 20 61 20 6e 6f 6e 74 65 72 6d  %\" or a nonterm
11110 69 6e 61 6c 20 6e 61 6d 65 2e 22 2c 0a 20 20 20  inal name.",.   
11120 20 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20         x);.     
11130 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
11140 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
11150 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11160 65 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52  e PRECEDENCE_MAR
11170 4b 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 21  K_1:.      if( !
11180 49 53 55 50 50 45 52 28 78 5b 30 5d 29 20 29 7b  ISUPPER(x[0]) ){
11190 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
111a0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
111b0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
111c0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54 68 65  ,.          "The
111d0 20 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62   precedence symb
111e0 6f 6c 20 6d 75 73 74 20 62 65 20 61 20 74 65 72  ol must be a ter
111f0 6d 69 6e 61 6c 2e 22 29 3b 0a 20 20 20 20 20 20  minal.");.      
11200 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11210 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
11220 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65  f( psp->prevrule
11230 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
11240 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
11250 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
11260 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
11270 20 20 22 54 68 65 72 65 20 69 73 20 6e 6f 20 70    "There is no p
11280 72 69 6f 72 20 72 75 6c 65 20 74 6f 20 61 73 73  rior rule to ass
11290 69 67 6e 20 70 72 65 63 65 64 65 6e 63 65 20 5c  ign precedence \
112a0 22 5b 25 73 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20  "[%s]\".",x);.  
112b0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
112c0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
112d0 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76  se if( psp->prev
112e0 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d 21 3d 30  rule->precsym!=0
112f0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
11300 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
11310 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
11320 65 6e 6f 2c 0a 22 50 72 65 63 65 64 65 6e 63 65  eno,."Precedence
11330 20 6d 61 72 6b 20 6f 6e 20 74 68 69 73 20 6c 69   mark on this li
11340 6e 65 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69  ne is not the fi
11350 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20  rst \.to follow 
11360 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 75 6c  the previous rul
11370 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  e.");.        ps
11380 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
11390 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
113a0 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c      psp->prevrul
113b0 65 2d 3e 70 72 65 63 73 79 6d 20 3d 20 53 79 6d  e->precsym = Sym
113c0 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
113d0 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73    }.      psp->s
113e0 74 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e 43  tate = PRECEDENC
113f0 45 5f 4d 41 52 4b 5f 32 3b 0a 20 20 20 20 20 20  E_MARK_2;.      
11400 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
11410 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
11420 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  2:.      if( x[0
11430 5d 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20  ]!=']' ){.      
11440 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11450 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11460 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11470 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22       "Missing \"
11480 5d 5c 22 20 6f 6e 20 70 72 65 63 65 64 65 6e 63  ]\" on precedenc
11490 65 20 6d 61 72 6b 2e 22 29 3b 0a 20 20 20 20 20  e mark.");.     
114a0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
114b0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
114c0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
114d0 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
114e0 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 62  OR_RULE;.      b
114f0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
11500 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57  AITING_FOR_ARROW
11510 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
11520 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27  ==':' && x[1]=='
11530 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20  :' && x[2]=='=' 
11540 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
11550 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a  state = IN_RHS;.
11560 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11570 78 5b 30 5d 3d 3d 27 28 27 20 29 7b 0a 20 20 20  x[0]=='(' ){.   
11580 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11590 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20  = LHS_ALIAS_1;. 
115a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
115b0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
115c0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
115d0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
115e0 20 20 20 20 20 20 20 22 45 78 70 65 63 74 65 64         "Expected
115f0 20 74 6f 20 73 65 65 20 61 20 5c 22 3a 5c 22 20   to see a \":\" 
11600 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4c 48  following the LH
11610 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e  S symbol \"%s\".
11620 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ",.          psp
11630 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ->lhs->name);.  
11640 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
11650 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
11660 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
11670 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
11680 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
11690 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
116a0 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3a 0a  se LHS_ALIAS_1:.
116b0 20 20 20 20 20 20 69 66 28 20 49 53 41 4c 50 48        if( ISALPH
116c0 41 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  A(x[0]) ){.     
116d0 20 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73     psp->lhsalias
116e0 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73   = x;.        ps
116f0 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41  p->state = LHS_A
11700 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65  LIAS_2;.      }e
11710 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
11720 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11730 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
11740 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
11750 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61  "\"%s\" is not a
11760 20 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72   valid alias for
11770 20 74 68 65 20 4c 48 53 20 5c 22 25 73 5c 22 5c   the LHS \"%s\"\
11780 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c  n",.          x,
11790 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b  psp->lhs->name);
117a0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
117b0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
117c0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
117d0 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
117e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
117f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11800 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f   case LHS_ALIAS_
11810 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  2:.      if( x[0
11820 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20  ]==')' ){.      
11830 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c    psp->state = L
11840 48 53 5f 41 4c 49 41 53 5f 33 3b 0a 20 20 20 20  HS_ALIAS_3;.    
11850 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11860 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
11870 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
11880 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
11890 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29      "Missing \")
118a0 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53  \" following LHS
118b0 20 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73   alias name \"%s
118c0 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69  \".",psp->lhsali
118d0 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  as);.        psp
118e0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
118f0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11900 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
11910 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
11920 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
11930 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c  .    case LHS_AL
11940 49 41 53 5f 33 3a 0a 20 20 20 20 20 20 69 66 28  IAS_3:.      if(
11950 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b   x[0]==':' && x[
11960 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d  1]==':' && x[2]=
11970 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='=' ){.        
11980 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f  psp->state = IN_
11990 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  RHS;.      }else
119a0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
119b0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
119c0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
119d0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69  o,.          "Mi
119e0 73 73 69 6e 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c  ssing \"->\" fol
119f0 6c 6f 77 69 6e 67 3a 20 5c 22 25 73 28 25 73 29  lowing: \"%s(%s)
11a00 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  \".",.          
11a10 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c   psp->lhs->name,
11a20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a  psp->lhsalias);.
11a30 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11a40 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
11a50 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
11a60 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
11a70 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
11a80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11a90 63 61 73 65 20 49 4e 5f 52 48 53 3a 0a 20 20 20  case IN_RHS:.   
11aa0 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
11ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
11ac0 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 20  ct rule *rp;.   
11ad0 20 20 20 20 20 72 70 20 3d 20 28 73 74 72 75 63       rp = (struc
11ae0 74 20 72 75 6c 65 20 2a 29 63 61 6c 6c 6f 63 28  t rule *)calloc(
11af0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 72   sizeof(struct r
11b00 75 6c 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20  ule) + .        
11b10 20 20 20 20 20 73 69 7a 65 6f 66 28 73 74 72 75       sizeof(stru
11b20 63 74 20 73 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d  ct symbol*)*psp-
11b30 3e 6e 72 68 73 20 2b 20 73 69 7a 65 6f 66 28 63  >nrhs + sizeof(c
11b40 68 61 72 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 2c  har*)*psp->nrhs,
11b50 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
11b60 20 72 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   rp==0 ){.      
11b70 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
11b80 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
11b90 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
11ba0 20 20 20 20 20 20 20 20 20 22 43 61 6e 27 74 20           "Can't 
11bb0 61 6c 6c 6f 63 61 74 65 20 65 6e 6f 75 67 68 20  allocate enough 
11bc0 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 69 73 20  memory for this 
11bd0 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  rule.");.       
11be0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
11bf0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
11c00 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b  p->prevrule = 0;
11c10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
11c20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
11c30 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72  .          rp->r
11c40 75 6c 65 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74  uleline = psp->t
11c50 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20  okenlineno;.    
11c60 20 20 20 20 20 20 72 70 2d 3e 72 68 73 20 3d 20        rp->rhs = 
11c70 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 2a  (struct symbol**
11c80 29 26 72 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20  )&rp[1];.       
11c90 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 20     rp->rhsalias 
11ca0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  = (const char**)
11cb0 26 28 72 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e  &(rp->rhs[psp->n
11cc0 72 68 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  rhs]);.         
11cd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 73 70 2d   for(i=0; i<psp-
11ce0 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
11cf0 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73           rp->rhs
11d00 5b 69 5d 20 3d 20 70 73 70 2d 3e 72 68 73 5b 69  [i] = psp->rhs[i
11d10 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ];.            r
11d20 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 3d  p->rhsalias[i] =
11d30 20 70 73 70 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a   psp->alias[i];.
11d40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11d50 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 20 3d 20        rp->lhs = 
11d60 70 73 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20  psp->lhs;.      
11d70 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73      rp->lhsalias
11d80 20 3d 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73   = psp->lhsalias
11d90 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
11da0 6e 72 68 73 20 3d 20 70 73 70 2d 3e 6e 72 68 73  nrhs = psp->nrhs
11db0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
11dc0 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  code = 0;.      
11dd0 20 20 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d      rp->noCode =
11de0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70   1;.          rp
11df0 2d 3e 70 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20  ->precsym = 0;. 
11e00 20 20 20 20 20 20 20 20 20 72 70 2d 3e 69 6e 64           rp->ind
11e10 65 78 20 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72  ex = psp->gp->nr
11e20 75 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ule++;.         
11e30 20 72 70 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72   rp->nextlhs = r
11e40 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20  p->lhs->rule;.  
11e50 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d          rp->lhs-
11e60 3e 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20  >rule = rp;.    
11e70 20 20 20 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d        rp->next =
11e80 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
11e90 28 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65  ( psp->firstrule
11ea0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11eb0 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c     psp->firstrul
11ec0 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c  e = psp->lastrul
11ed0 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20  e = rp;.        
11ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11ef0 20 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75       psp->lastru
11f00 6c 65 2d 3e 6e 65 78 74 20 3d 20 72 70 3b 0a 20  le->next = rp;. 
11f10 20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e             psp->
11f20 6c 61 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 20  lastrule = rp;. 
11f30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11f40 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
11f50 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20  le = rp;.       
11f60 20 7d 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e   }.        psp->
11f70 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
11f80 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
11f90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11fa0 28 20 49 53 41 4c 50 48 41 28 78 5b 30 5d 29 20  ( ISALPHA(x[0]) 
11fb0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
11fc0 73 70 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52 48 53  sp->nrhs>=MAXRHS
11fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
11fe0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
11ff0 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
12000 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
12010 20 20 20 22 54 6f 6f 20 6d 61 6e 79 20 73 79 6d     "Too many sym
12020 62 6f 6c 73 20 6f 6e 20 52 48 53 20 6f 66 20 72  bols on RHS of r
12030 75 6c 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ule beginning at
12040 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20   \"%s\".",.     
12050 20 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20         x);.     
12060 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
12070 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
12080 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
12090 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
120a0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65  RROR;.        }e
120b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
120c0 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68  sp->rhs[psp->nrh
120d0 73 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  s] = Symbol_new(
120e0 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
120f0 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72  p->alias[psp->nr
12100 68 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  hs] = 0;.       
12110 20 20 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a     psp->nrhs++;.
12120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12130 7d 65 6c 73 65 20 69 66 28 20 28 78 5b 30 5d 3d  }else if( (x[0]=
12140 3d 27 7c 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f  ='|' || x[0]=='/
12150 27 29 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e  ') && psp->nrhs>
12160 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  0 ){.        str
12170 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20  uct symbol *msp 
12180 3d 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e  = psp->rhs[psp->
12190 6e 72 68 73 2d 31 5d 3b 0a 20 20 20 20 20 20 20  nrhs-1];.       
121a0 20 69 66 28 20 6d 73 70 2d 3e 74 79 70 65 21 3d   if( msp->type!=
121b0 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
121c0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
121d0 74 20 73 79 6d 62 6f 6c 20 2a 6f 72 69 67 73 70  t symbol *origsp
121e0 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20   = msp;.        
121f0 20 20 6d 73 70 20 3d 20 28 73 74 72 75 63 74 20    msp = (struct 
12200 73 79 6d 62 6f 6c 20 2a 29 20 63 61 6c 6c 6f 63  symbol *) calloc
12210 28 31 2c 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29  (1,sizeof(*msp))
12220 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  ;.          mems
12230 65 74 28 6d 73 70 2c 20 30 2c 20 73 69 7a 65 6f  et(msp, 0, sizeo
12240 66 28 2a 6d 73 70 29 29 3b 0a 20 20 20 20 20 20  f(*msp));.      
12250 20 20 20 20 6d 73 70 2d 3e 74 79 70 65 20 3d 20      msp->type = 
12260 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 3b 0a 20  MULTITERMINAL;. 
12270 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73           msp->ns
12280 75 62 73 79 6d 20 3d 20 31 3b 0a 20 20 20 20 20  ubsym = 1;.     
12290 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d       msp->subsym
122a0 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f   = (struct symbo
122b0 6c 20 2a 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73  l **) calloc(1,s
122c0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
122d0 62 6f 6c 2a 29 29 3b 0a 20 20 20 20 20 20 20 20  bol*));.        
122e0 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d    msp->subsym[0]
122f0 20 3d 20 6f 72 69 67 73 70 3b 0a 20 20 20 20 20   = origsp;.     
12300 20 20 20 20 20 6d 73 70 2d 3e 6e 61 6d 65 20 3d       msp->name =
12310 20 6f 72 69 67 73 70 2d 3e 6e 61 6d 65 3b 0a 20   origsp->name;. 
12320 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68           psp->rh
12330 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d  s[psp->nrhs-1] =
12340 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   msp;.        }.
12350 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75          msp->nsu
12360 62 73 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  bsym++;.        
12370 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73  msp->subsym = (s
12380 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29  truct symbol **)
12390 20 72 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75   realloc(msp->su
123a0 62 73 79 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  bsym,.          
123b0 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79  sizeof(struct sy
123c0 6d 62 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62  mbol*)*msp->nsub
123d0 73 79 6d 29 3b 0a 20 20 20 20 20 20 20 20 6d 73  sym);.        ms
123e0 70 2d 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e  p->subsym[msp->n
123f0 73 75 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62  subsym-1] = Symb
12400 6f 6c 5f 6e 65 77 28 26 78 5b 31 5d 29 3b 0a 20  ol_new(&x[1]);. 
12410 20 20 20 20 20 20 20 69 66 28 20 49 53 4c 4f 57         if( ISLOW
12420 45 52 28 78 5b 31 5d 29 20 7c 7c 20 49 53 4c 4f  ER(x[1]) || ISLO
12430 57 45 52 28 6d 73 70 2d 3e 73 75 62 73 79 6d 5b  WER(msp->subsym[
12440 30 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a  0]->name[0]) ){.
12450 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
12460 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
12470 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
12480 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  o,.            "
12490 43 61 6e 6e 6f 74 20 66 6f 72 6d 20 61 20 63 6f  Cannot form a co
124a0 6d 70 6f 75 6e 64 20 63 6f 6e 74 61 69 6e 69 6e  mpound containin
124b0 67 20 61 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  g a non-terminal
124c0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ");.          ps
124d0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
124e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
124f0 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
12500 28 27 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e  (' && psp->nrhs>
12510 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  0 ){.        psp
12520 2d 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c  ->state = RHS_AL
12530 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_1;.      }el
12540 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
12550 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
12560 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
12570 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
12580 49 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65  Illegal characte
12590 72 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65  r on RHS of rule
125a0 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  : \"%s\".",x);. 
125b0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
125c0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
125d0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
125e0 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
125f0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
12600 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
12610 61 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 31 3a  ase RHS_ALIAS_1:
12620 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 4c 50  .      if( ISALP
12630 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  HA(x[0]) ){.    
12640 20 20 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70      psp->alias[p
12650 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 78 3b  sp->nrhs-1] = x;
12660 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
12670 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f  ate = RHS_ALIAS_
12680 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
12690 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
126a0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
126b0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
126c0 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 25 73  .          "\"%s
126d0 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69  \" is not a vali
126e0 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  d alias for the 
126f0 52 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c  RHS symbol \"%s\
12700 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "\n",.          
12710 78 2c 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e  x,psp->rhs[psp->
12720 6e 72 68 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a  nrhs-1]->name);.
12730 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
12740 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
12750 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
12760 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
12770 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
12780 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12790 63 61 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 32  case RHS_ALIAS_2
127a0 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
127b0 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20  ==')' ){.       
127c0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e   psp->state = IN
127d0 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _RHS;.      }els
127e0 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
127f0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
12800 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
12810 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d  no,.          "M
12820 69 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c  issing \")\" fol
12830 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73  lowing LHS alias
12840 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70   name \"%s\".",p
12850 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20  sp->lhsalias);. 
12860 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
12870 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
12880 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
12890 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
128a0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
128b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
128c0 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
128d0 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20 20  DECL_KEYWORD:.  
128e0 20 20 20 20 69 66 28 20 49 53 41 4c 50 48 41 28      if( ISALPHA(
128f0 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
12900 20 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72   psp->declkeywor
12910 64 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70  d = x;.        p
12920 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
12930 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 0;.        psp
12940 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74  ->decllinenoslot
12950 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
12960 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
12970 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ro = 1;.        
12980 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
12990 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52  TING_FOR_DECL_AR
129a0 47 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  G;.        if( s
129b0 74 72 63 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d  trcmp(x,"name")=
129c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
129d0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
129e0 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61   = &(psp->gp->na
129f0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  me);.          p
12a00 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
12a10 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
12a20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12a30 70 28 78 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d  p(x,"include")==
12a40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
12a50 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
12a60 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63  = &(psp->gp->inc
12a70 6c 75 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  lude);.        }
12a80 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
12a90 78 2c 22 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a  x,"code")==0 ){.
12aa0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
12ab0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
12ac0 73 70 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64  sp->gp->extracod
12ad0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
12ae0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
12af0 74 6f 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72  token_destructor
12b00 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
12b10 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
12b20 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
12b30 74 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20 20 20  tokendest;.     
12b40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
12b50 63 6d 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 64  cmp(x,"default_d
12b60 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29  estructor")==0 )
12b70 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
12b80 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
12b90 70 73 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74  psp->gp->vardest
12ba0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
12bb0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f  if( strcmp(x,"to
12bc0 6b 65 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30 20  ken_prefix")==0 
12bd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
12be0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
12bf0 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70  &psp->gp->tokenp
12c00 72 65 66 69 78 3b 0a 20 20 20 20 20 20 20 20 20  refix;.         
12c10 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
12c20 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Macro = 0;.     
12c30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
12c40 63 6d 70 28 78 2c 22 73 79 6e 74 61 78 5f 65 72  cmp(x,"syntax_er
12c50 72 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ror")==0 ){.    
12c60 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
12c70 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
12c80 67 70 2d 3e 65 72 72 6f 72 29 3b 0a 20 20 20 20  gp->error);.    
12c90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
12ca0 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 61 63  rcmp(x,"parse_ac
12cb0 63 65 70 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  cept")==0 ){.   
12cc0 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
12cd0 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
12ce0 3e 67 70 2d 3e 61 63 63 65 70 74 29 3b 0a 20 20  >gp->accept);.  
12cf0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12d00 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f  strcmp(x,"parse_
12d10 66 61 69 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a  failure")==0 ){.
12d20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
12d30 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
12d40 73 70 2d 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29  sp->gp->failure)
12d50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
12d60 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74  if( strcmp(x,"st
12d70 61 63 6b 5f 6f 76 65 72 66 6c 6f 77 22 29 3d 3d  ack_overflow")==
12d80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
12d90 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
12da0 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6f 76 65  = &(psp->gp->ove
12db0 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20 20  rflow);.        
12dc0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
12dd0 28 78 2c 22 65 78 74 72 61 5f 61 72 67 75 6d 65  (x,"extra_argume
12de0 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nt")==0 ){.     
12df0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
12e00 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
12e10 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 20 20 20  p->arg);.       
12e20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
12e30 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20  neMacro = 0;.   
12e40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
12e50 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74  trcmp(x,"token_t
12e60 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ype")==0 ){.    
12e70 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
12e80 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
12e90 67 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a  gp->tokentype);.
12ea0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69            psp->i
12eb0 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
12ec0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
12ed0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
12ee0 64 65 66 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d  default_type")==
12ef0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
12f00 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
12f10 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72  = &(psp->gp->var
12f20 74 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20  type);.         
12f30 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
12f40 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Macro = 0;.     
12f50 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
12f60 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a  cmp(x,"stack_siz
12f70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
12f80 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
12f90 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
12fa0 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20  ->stacksize);.  
12fb0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
12fc0 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30  ertLineMacro = 0
12fd0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
12fe0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74  if( strcmp(x,"st
12ff0 61 72 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20  art_symbol")==0 
13000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
13010 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
13020 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74  &(psp->gp->start
13030 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
13040 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
13050 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  o = 0;.        }
13060 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13070 78 2c 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a  x,"left")==0 ){.
13080 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
13090 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  reccounter++;.  
130a0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
130b0 6c 61 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20  lassoc = LEFT;. 
130c0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
130d0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
130e0 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
130f0 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  BOL;.        }el
13100 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
13110 22 72 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20  "right")==0 ){. 
13120 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
13130 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  eccounter++;.   
13140 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
13150 61 73 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20  assoc = RIGHT;. 
13160 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
13170 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
13180 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
13190 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  BOL;.        }el
131a0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
131b0 22 6e 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29  "nonassoc")==0 )
131c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
131d0 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a  >preccounter++;.
131e0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
131f0 65 63 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b  eclassoc = NONE;
13200 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13210 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
13220 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53  FOR_PRECEDENCE_S
13230 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
13240 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13250 78 2c 22 64 65 73 74 72 75 63 74 6f 72 22 29 3d  x,"destructor")=
13260 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13270 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
13280 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43  TING_FOR_DESTRUC
13290 54 4f 52 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20  TOR_SYMBOL;.    
132a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
132b0 72 63 6d 70 28 78 2c 22 74 79 70 65 22 29 3d 3d  rcmp(x,"type")==
132c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
132d0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
132e0 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45  ING_FOR_DATATYPE
132f0 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20  _SYMBOL;.       
13300 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13310 70 28 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d  p(x,"fallback")=
13320 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13330 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20  psp->fallback = 
13340 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  0;.          psp
13350 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
13360 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49  G_FOR_FALLBACK_I
13370 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  D;.        }else
13380 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 77   if( strcmp(x,"w
13390 69 6c 64 63 61 72 64 22 29 3d 3d 30 20 29 7b 0a  ildcard")==0 ){.
133a0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
133b0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
133c0 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 3b 0a  OR_WILDCARD_ID;.
133d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
133e0 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
133f0 6e 5f 63 6c 61 73 73 22 29 3d 3d 30 20 29 7b 0a  n_class")==0 ){.
13400 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
13410 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
13420 4f 52 5f 43 4c 41 53 53 5f 49 44 3b 0a 20 20 20  OR_CLASS_ID;.   
13430 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13440 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
13450 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
13460 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
13470 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 6b 6e             "Unkn
13480 6f 77 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  own declaration 
13490 6b 65 79 77 6f 72 64 3a 20 5c 22 25 25 25 73 5c  keyword: \"%%%s\
134a0 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20  ".",x);.        
134b0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
134c0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
134d0 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
134e0 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
134f0 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
13500 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13510 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
13520 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
13530 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
13540 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 64 65       "Illegal de
13550 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72  claration keywor
13560 64 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a  d: \"%s\".",x);.
13570 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
13580 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
13590 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
135a0 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
135b0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
135c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
135d0 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
135e0 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42  _DESTRUCTOR_SYMB
135f0 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 49  OL:.      if( !I
13600 53 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a  SALPHA(x[0]) ){.
13610 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
13620 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
13630 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
13640 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62  .          "Symb
13650 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20  ol name missing 
13660 61 66 74 65 72 20 25 25 64 65 73 74 72 75 63 74  after %%destruct
13670 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20  or keyword");.  
13680 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
13690 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
136a0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
136b0 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
136c0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
136d0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
136e0 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79   symbol *sp = Sy
136f0 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
13700 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
13710 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73  gslot = &sp->des
13720 74 72 75 63 74 6f 72 3b 0a 20 20 20 20 20 20 20  tructor;.       
13730 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f   psp->decllineno
13740 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74  slot = &sp->dest
13750 4c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20  Lineno;.        
13760 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
13770 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  acro = 1;.      
13780 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
13790 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
137a0 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ARG;.      }.   
137b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
137c0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44  se WAITING_FOR_D
137d0 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a  ATATYPE_SYMBOL:.
137e0 20 20 20 20 20 20 69 66 28 20 21 49 53 41 4c 50        if( !ISALP
137f0 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  HA(x[0]) ){.    
13800 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
13810 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
13820 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
13830 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e         "Symbol n
13840 61 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65  ame missing afte
13850 72 20 25 25 74 79 70 65 20 6b 65 79 77 6f 72 64  r %%type keyword
13860 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ");.        psp-
13870 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
13880 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
13890 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
138a0 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
138b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
138c0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
138d0 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  p = Symbol_find(
138e0 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 28  x);.        if((
138f0 73 70 29 20 26 26 20 28 73 70 2d 3e 64 61 74 61  sp) && (sp->data
13900 74 79 70 65 29 29 7b 0a 20 20 20 20 20 20 20 20  type)){.        
13910 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
13920 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
13930 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
13940 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 25         "Symbol %
13950 25 74 79 70 65 20 5c 22 25 73 5c 22 20 61 6c 72  %type \"%s\" alr
13960 65 61 64 79 20 64 65 66 69 6e 65 64 22 2c 20 78  eady defined", x
13970 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
13980 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
13990 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
139a0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
139b0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
139c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
139d0 20 20 20 20 20 20 20 69 66 20 28 21 73 70 29 7b         if (!sp){
139e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 70 20  .            sp 
139f0 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
13a00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
13a10 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
13a20 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64  argslot = &sp->d
13a30 61 74 61 74 79 70 65 3b 0a 20 20 20 20 20 20 20  atatype;.       
13a40 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
13a50 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20  neMacro = 0;.   
13a60 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13a70 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
13a80 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20  DECL_ARG;.      
13a90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13aa0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
13ab0 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52  e WAITING_FOR_PR
13ac0 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a  ECEDENCE_SYMBOL:
13ad0 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
13ae0 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
13af0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
13b00 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
13b10 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  _RULE;.      }el
13b20 73 65 20 69 66 28 20 49 53 55 50 50 45 52 28 78  se if( ISUPPER(x
13b30 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
13b40 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
13b50 70 3b 0a 20 20 20 20 20 20 20 20 73 70 20 3d 20  p;.        sp = 
13b60 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
13b70 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 70         if( sp->p
13b80 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rec>=0 ){.      
13b90 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
13ba0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
13bb0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
13bc0 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c           "Symbol
13bd0 20 5c 22 25 73 5c 22 20 68 61 73 20 61 6c 72 65   \"%s\" has alre
13be0 61 64 79 20 62 65 20 67 69 76 65 6e 20 61 20 70  ady be given a p
13bf0 72 65 63 65 64 65 6e 63 65 2e 22 2c 78 29 3b 0a  recedence.",x);.
13c00 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
13c10 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
13c20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13c30 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 70      sp->prec = p
13c40 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 3b  sp->preccounter;
13c50 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 61  .          sp->a
13c60 73 73 6f 63 20 3d 20 70 73 70 2d 3e 64 65 63 6c  ssoc = psp->decl
13c70 61 73 73 6f 63 3b 0a 20 20 20 20 20 20 20 20 7d  assoc;.        }
13c80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13c90 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
13ca0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
13cb0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
13cc0 20 20 20 20 20 20 20 20 20 22 43 61 6e 27 74 20           "Can't 
13cd0 61 73 73 69 67 6e 20 61 20 70 72 65 63 65 64 65  assign a precede
13ce0 6e 63 65 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c  nce to \"%s\".",
13cf0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
13d00 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
13d10 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
13d20 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
13d30 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a  NG_FOR_DECL_ARG:
13d40 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
13d50 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c  ='{' || x[0]=='\
13d60 22 27 20 7c 7c 20 49 53 41 4c 4e 55 4d 28 78 5b  "' || ISALNUM(x[
13d70 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  0]) ){.        c
13d80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64 2c  onst char *zOld,
13d90 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20 20   *zNew;.        
13da0 63 68 61 72 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a  char *zBuf, *z;.
13db0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4f 6c 64          int nOld
13dc0 2c 20 6e 2c 20 6e 4c 69 6e 65 20 3d 20 30 2c 20  , n, nLine = 0, 
13dd0 6e 4e 65 77 2c 20 6e 42 61 63 6b 3b 0a 20 20 20  nNew, nBack;.   
13de0 20 20 20 20 20 69 6e 74 20 61 64 64 4c 69 6e 65       int addLine
13df0 4d 61 63 72 6f 3b 0a 20 20 20 20 20 20 20 20 63  Macro;.        c
13e00 68 61 72 20 7a 4c 69 6e 65 5b 35 30 5d 3b 0a 20  har zLine[50];. 
13e10 20 20 20 20 20 20 20 7a 4e 65 77 20 3d 20 78 3b         zNew = x;
13e20 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 65  .        if( zNe
13e30 77 5b 30 5d 3d 3d 27 22 27 20 7c 7c 20 7a 4e 65  w[0]=='"' || zNe
13e40 77 5b 30 5d 3d 3d 27 7b 27 20 29 20 7a 4e 65 77  w[0]=='{' ) zNew
13e50 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 4e 65 77  ++;.        nNew
13e60 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a   = lemonStrlen(z
13e70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  New);.        if
13e80 28 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73  ( *psp->declargs
13e90 6c 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lot ){.         
13ea0 20 7a 4f 6c 64 20 3d 20 2a 70 73 70 2d 3e 64 65   zOld = *psp->de
13eb0 63 6c 61 72 67 73 6c 6f 74 3b 0a 20 20 20 20 20  clargslot;.     
13ec0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13ed0 20 20 20 20 7a 4f 6c 64 20 3d 20 22 22 3b 0a 20      zOld = "";. 
13ee0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13ef0 20 6e 4f 6c 64 20 3d 20 6c 65 6d 6f 6e 53 74 72   nOld = lemonStr
13f00 6c 65 6e 28 7a 4f 6c 64 29 3b 0a 20 20 20 20 20  len(zOld);.     
13f10 20 20 20 6e 20 3d 20 6e 4f 6c 64 20 2b 20 6e 4e     n = nOld + nN
13f20 65 77 20 2b 20 32 30 3b 0a 20 20 20 20 20 20 20  ew + 20;.       
13f30 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 3d 20   addLineMacro = 
13f40 21 70 73 70 2d 3e 67 70 2d 3e 6e 6f 6c 69 6e 65  !psp->gp->noline
13f50 6e 6f 73 66 6c 61 67 20 26 26 20 70 73 70 2d 3e  nosflag && psp->
13f60 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
13f70 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
13f80 20 20 20 20 20 20 20 20 20 20 20 28 70 73 70 2d             (psp-
13f90 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3d  >decllinenoslot=
13fa0 3d 30 20 7c 7c 20 70 73 70 2d 3e 64 65 63 6c 6c  =0 || psp->decll
13fb0 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 21 3d 30 29  inenoslot[0]!=0)
13fc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
13fd0 64 4c 69 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20  dLineMacro ){.  
13fe0 20 20 20 20 20 20 20 20 66 6f 72 28 7a 3d 70 73          for(z=ps
13ff0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 6e 42 61  p->filename, nBa
14000 63 6b 3d 30 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a  ck=0; *z; z++){.
14010 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
14020 2a 7a 3d 3d 27 5c 5c 27 20 29 20 6e 42 61 63 6b  *z=='\\' ) nBack
14030 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
14040 20 20 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f            lemon_
14050 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22  sprintf(zLine, "
14060 23 6c 69 6e 65 20 25 64 20 22 2c 20 70 73 70 2d  #line %d ", psp-
14070 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 29 3b 0a 20  >tokenlineno);. 
14080 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d           nLine =
14090 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4c 69   lemonStrlen(zLi
140a0 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ne);.          n
140b0 20 2b 3d 20 6e 4c 69 6e 65 20 2b 20 6c 65 6d 6f   += nLine + lemo
140c0 6e 53 74 72 6c 65 6e 28 70 73 70 2d 3e 66 69 6c  nStrlen(psp->fil
140d0 65 6e 61 6d 65 29 20 2b 20 6e 42 61 63 6b 3b 0a  ename) + nBack;.
140e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
140f0 20 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73    *psp->declargs
14100 6c 6f 74 20 3d 20 28 63 68 61 72 20 2a 29 20 72  lot = (char *) r
14110 65 61 6c 6c 6f 63 28 2a 70 73 70 2d 3e 64 65 63  ealloc(*psp->dec
14120 6c 61 72 67 73 6c 6f 74 2c 20 6e 29 3b 0a 20 20  largslot, n);.  
14130 20 20 20 20 20 20 7a 42 75 66 20 3d 20 2a 70 73        zBuf = *ps
14140 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 2b  p->declargslot +
14150 20 6e 4f 6c 64 3b 0a 20 20 20 20 20 20 20 20 69   nOld;.        i
14160 66 28 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20  f( addLineMacro 
14170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
14180 20 6e 4f 6c 64 20 26 26 20 7a 42 75 66 5b 2d 31   nOld && zBuf[-1
14190 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  ]!='\n' ){.     
141a0 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29         *(zBuf++)
141b0 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20   = '\n';.       
141c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
141d0 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e  emcpy(zBuf, zLin
141e0 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20  e, nLine);.     
141f0 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4c 69       zBuf += nLi
14200 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  ne;.          *(
14210 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20  zBuf++) = '"';. 
14220 20 20 20 20 20 20 20 20 20 66 6f 72 28 7a 3d 70           for(z=p
14230 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b 20 2a 7a  sp->filename; *z
14240 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; z++){.        
14250 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27      if( *z=='\\'
14260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14270 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c    *(zBuf++) = '\
14280 5c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  \';.            
14290 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 28  }.            *(
142a0 7a 42 75 66 2b 2b 29 20 3d 20 2a 7a 3b 0a 20 20  zBuf++) = *z;.  
142b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
142c0 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20      *(zBuf++) = 
142d0 27 22 27 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  '"';.          *
142e0 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b  (zBuf++) = '\n';
142f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14300 20 20 20 69 66 28 20 70 73 70 2d 3e 64 65 63 6c     if( psp->decl
14310 6c 69 6e 65 6e 6f 73 6c 6f 74 20 26 26 20 70 73  linenoslot && ps
14320 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f  p->decllinenoslo
14330 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t[0]==0 ){.     
14340 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69       psp->declli
14350 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 20 3d 20 70 73  nenoslot[0] = ps
14360 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a  p->tokenlineno;.
14370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14380 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a    memcpy(zBuf, z
14390 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  New, nNew);.    
143a0 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4e 65 77      zBuf += nNew
143b0 3b 0a 20 20 20 20 20 20 20 20 2a 7a 42 75 66 20  ;.        *zBuf 
143c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 0;.        psp
143d0 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
143e0 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
143f0 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
14400 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
14410 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
14420 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
14430 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c  ,.          "Ill
14440 65 67 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f  egal argument to
14450 20 25 25 25 73 3a 20 25 73 22 2c 70 73 70 2d 3e   %%%s: %s",psp->
14460 64 65 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b 0a  declkeyword,x);.
14470 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
14480 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
14490 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
144a0 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
144b0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
144c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
144d0 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
144e0 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20 20  _FALLBACK_ID:.  
144f0 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e      if( x[0]=='.
14500 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
14510 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
14520 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
14530 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  LE;.      }else 
14540 69 66 28 20 21 49 53 55 50 50 45 52 28 78 5b 30  if( !ISUPPER(x[0
14550 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]) ){.        Er
14560 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
14570 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e  name, psp->token
14580 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
14590 20 20 22 25 25 66 61 6c 6c 62 61 63 6b 20 61 72    "%%fallback ar
145a0 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68  gument \"%s\" sh
145b0 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22  ould be a token"
145c0 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  , x);.        ps
145d0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
145e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
145f0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
14600 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e  l *sp = Symbol_n
14610 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69  ew(x);.        i
14620 66 28 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b  f( psp->fallback
14630 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
14640 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d   psp->fallback =
14650 20 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   sp;.        }el
14660 73 65 20 69 66 28 20 73 70 2d 3e 66 61 6c 6c 62  se if( sp->fallb
14670 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ack ){.         
14680 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
14690 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f  ilename, psp->to
146a0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
146b0 20 20 20 20 20 20 20 22 4d 6f 72 65 20 74 68 61         "More tha
146c0 6e 20 6f 6e 65 20 66 61 6c 6c 62 61 63 6b 20 61  n one fallback a
146d0 73 73 69 67 6e 65 64 20 74 6f 20 74 6f 6b 65 6e  ssigned to token
146e0 20 25 73 22 2c 20 78 29 3b 0a 20 20 20 20 20 20   %s", x);.      
146f0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
14700 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t++;.        }el
14710 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70  se{.          sp
14720 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 70 73 70  ->fallback = psp
14730 2d 3e 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20  ->fallback;.    
14740 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 68        psp->gp->h
14750 61 73 5f 66 61 6c 6c 62 61 63 6b 20 3d 20 31 3b  as_fallback = 1;
14760 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14770 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
14780 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
14790 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44  _FOR_WILDCARD_ID
147a0 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
147b0 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='.' ){.       
147c0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
147d0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
147e0 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65  R_RULE;.      }e
147f0 6c 73 65 20 69 66 28 20 21 49 53 55 50 50 45 52  lse if( !ISUPPER
14800 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
14810 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
14820 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74  filename, psp->t
14830 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
14840 20 20 20 20 20 20 22 25 25 77 69 6c 64 63 61 72        "%%wildcar
14850 64 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c  d argument \"%s\
14860 22 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f  " should be a to
14870 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20  ken", x);.      
14880 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
14890 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
148a0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
148b0 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62  ymbol *sp = Symb
148c0 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
148d0 20 20 20 69 66 28 20 70 73 70 2d 3e 67 70 2d 3e     if( psp->gp->
148e0 77 69 6c 64 63 61 72 64 3d 3d 30 20 29 7b 0a 20  wildcard==0 ){. 
148f0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70           psp->gp
14900 2d 3e 77 69 6c 64 63 61 72 64 20 3d 20 73 70 3b  ->wildcard = sp;
14910 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
14920 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
14930 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
14940 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  , psp->tokenline
14950 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
14960 22 45 78 74 72 61 20 77 69 6c 64 63 61 72 64 20  "Extra wildcard 
14970 74 6f 20 74 6f 6b 65 6e 3a 20 25 73 22 2c 20 78  to token: %s", x
14980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
14990 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
149a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
149b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
149c0 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
149d0 52 5f 43 4c 41 53 53 5f 49 44 3a 0a 20 20 20 20  R_CLASS_ID:.    
149e0 20 20 69 66 28 20 21 49 53 4c 4f 57 45 52 28 78    if( !ISLOWER(x
149f0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
14a00 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
14a10 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b  lename, psp->tok
14a20 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
14a30 20 20 20 20 22 25 25 74 6f 6b 65 6e 5f 63 6c 61      "%%token_cla
14a40 73 73 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f  ss must be follo
14a50 77 65 64 20 62 79 20 61 6e 20 69 64 65 6e 74 69  wed by an identi
14a60 66 69 65 72 3a 20 22 2c 20 78 29 3b 0a 20 20 20  fier: ", x);.   
14a70 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
14a80 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
14a90 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
14aa0 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
14ab0 4f 52 3b 0a 20 20 20 20 20 7d 65 6c 73 65 20 69  OR;.     }else i
14ac0 66 28 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78  f( Symbol_find(x
14ad0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ) ){.        Err
14ae0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
14af0 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ame, psp->tokenl
14b00 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
14b10 20 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20   "Symbol \"%s\" 
14b20 61 6c 72 65 61 64 79 20 75 73 65 64 22 2c 20 78  already used", x
14b30 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
14b40 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
14b50 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
14b60 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
14b70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
14b80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
14b90 73 70 2d 3e 74 6b 63 6c 61 73 73 20 3d 20 53 79  sp->tkclass = Sy
14ba0 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
14bb0 20 20 20 20 20 70 73 70 2d 3e 74 6b 63 6c 61 73       psp->tkclas
14bc0 73 2d 3e 74 79 70 65 20 3d 20 4d 55 4c 54 49 54  s->type = MULTIT
14bd0 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 20 20 20  ERMINAL;.       
14be0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
14bf0 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f  ITING_FOR_CLASS_
14c00 54 4f 4b 45 4e 3b 0a 20 20 20 20 20 20 7d 0a 20  TOKEN;.      }. 
14c10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14c20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
14c30 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 3a 0a 20 20  _CLASS_TOKEN:.  
14c40 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e      if( x[0]=='.
14c50 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
14c60 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
14c70 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
14c80 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  LE;.      }else 
14c90 69 66 28 20 49 53 55 50 50 45 52 28 78 5b 30 5d  if( ISUPPER(x[0]
14ca0 29 20 7c 7c 20 28 28 78 5b 30 5d 3d 3d 27 7c 27  ) || ((x[0]=='|'
14cb0 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20 26   || x[0]=='/') &
14cc0 26 20 49 53 55 50 50 45 52 28 78 5b 31 5d 29 29  & ISUPPER(x[1]))
14cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
14ce0 63 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d  ct symbol *msp =
14cf0 20 70 73 70 2d 3e 74 6b 63 6c 61 73 73 3b 0a 20   psp->tkclass;. 
14d00 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62         msp->nsub
14d10 73 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d  sym++;.        m
14d20 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74  sp->subsym = (st
14d30 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20  ruct symbol **) 
14d40 72 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62  realloc(msp->sub
14d50 73 79 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 73  sym,.          s
14d60 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
14d70 62 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73  bol*)*msp->nsubs
14d80 79 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ym);.        if(
14d90 20 21 49 53 55 50 50 45 52 28 78 5b 30 5d 29 20   !ISUPPER(x[0]) 
14da0 29 20 78 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d  ) x++;.        m
14db0 73 70 2d 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e  sp->subsym[msp->
14dc0 6e 73 75 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d  nsubsym-1] = Sym
14dd0 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
14de0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14df0 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
14e00 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f  ilename, psp->to
14e10 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
14e20 20 20 20 20 20 22 25 25 74 6f 6b 65 6e 5f 63 6c       "%%token_cl
14e30 61 73 73 20 61 72 67 75 6d 65 6e 74 20 5c 22 25  ass argument \"%
14e40 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61 20  s\" should be a 
14e50 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20  token", x);.    
14e60 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
14e70 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
14e80 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
14e90 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
14ea0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
14eb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
14ec0 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
14ed0 4c 45 5f 45 52 52 4f 52 3a 0a 2f 2a 20 20 20 20  LE_ERROR:./*    
14ee0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
14ef0 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57  ) psp->state = W
14f00 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
14f10 4f 52 5f 52 55 4c 45 3b 0a 2a 2a 20 20 20 20 20  OR_RULE;.**     
14f20 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 63   break; */.    c
14f30 61 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52  ase RESYNC_AFTER
14f40 5f 44 45 43 4c 5f 45 52 52 4f 52 3a 0a 20 20 20  _DECL_ERROR:.   
14f50 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
14f60 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20   ) psp->state = 
14f70 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
14f80 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20  _OR_RULE;.      
14f90 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 20  if( x[0]=='%' ) 
14fa0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
14fb0 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45  TING_FOR_DECL_KE
14fc0 59 57 4f 52 44 3b 0a 20 20 20 20 20 20 62 72 65  YWORD;.      bre
14fd0 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 75  ak;.  }.}../* Ru
14fe0 6e 20 74 68 65 20 70 72 65 70 72 6f 63 65 73 73  n the preprocess
14ff0 6f 72 20 6f 76 65 72 20 74 68 65 20 69 6e 70 75  or over the inpu
15000 74 20 66 69 6c 65 20 74 65 78 74 2e 20 20 54 68  t file text.  Th
15010 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  e global variabl
15020 65 73 0a 2a 2a 20 61 7a 44 65 66 69 6e 65 5b 30  es.** azDefine[0
15030 5d 20 74 68 72 6f 75 67 68 20 61 7a 44 65 66 69  ] through azDefi
15040 6e 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 20 63 6f  ne[nDefine-1] co
15050 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73  ntains the names
15060 20 6f 66 20 61 6c 6c 20 64 65 66 69 6e 65 64 0a   of all defined.
15070 2a 2a 20 6d 61 63 72 6f 73 2e 20 20 54 68 69 73  ** macros.  This
15080 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 66   routine looks f
15090 6f 72 20 22 25 69 66 64 65 66 22 20 61 6e 64 20  or "%ifdef" and 
150a0 22 25 69 66 6e 64 65 66 22 20 61 6e 64 20 22 25  "%ifndef" and "%
150b0 65 6e 64 69 66 22 20 61 6e 64 0a 2a 2a 20 63 6f  endif" and.** co
150c0 6d 6d 65 6e 74 73 20 74 68 65 6d 20 6f 75 74 2e  mments them out.
150d0 20 20 54 65 78 74 20 69 6e 20 62 65 74 77 65 65    Text in betwee
150e0 6e 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e  n is also commen
150f0 74 65 64 20 6f 75 74 20 61 73 20 61 70 70 72 6f  ted out as appro
15100 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  priate..*/.stati
15110 63 20 76 6f 69 64 20 70 72 65 70 72 6f 63 65 73  c void preproces
15120 73 5f 69 6e 70 75 74 28 63 68 61 72 20 2a 7a 29  s_input(char *z)
15130 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c  {.  int i, j, k,
15140 20 6e 3b 0a 20 20 69 6e 74 20 65 78 63 6c 75 64   n;.  int exclud
15150 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 74 61  e = 0;.  int sta
15160 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 69  rt = 0;.  int li
15170 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 69 6e 74 20  neno = 1;.  int 
15180 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 31  start_lineno = 1
15190 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69  ;.  for(i=0; z[i
151a0 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; i++){.    if(
151b0 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6c 69   z[i]=='\n' ) li
151c0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20  neno++;.    if( 
151d0 7a 5b 69 5d 21 3d 27 25 27 20 7c 7c 20 28 69 3e  z[i]!='%' || (i>
151e0 30 20 26 26 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e  0 && z[i-1]!='\n
151f0 27 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ') ) continue;. 
15200 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 26     if( strncmp(&
15210 7a 5b 69 5d 2c 22 25 65 6e 64 69 66 22 2c 36 29  z[i],"%endif",6)
15220 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45 28 7a  ==0 && ISSPACE(z
15230 5b 69 2b 36 5d 29 20 29 7b 0a 20 20 20 20 20 20  [i+6]) ){.      
15240 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20  if( exclude ){. 
15250 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 2d 2d         exclude--
15260 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78  ;.        if( ex
15270 63 6c 75 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  clude==0 ){.    
15280 20 20 20 20 20 20 66 6f 72 28 6a 3d 73 74 61 72        for(j=star
15290 74 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 20 69 66 28  t; j<i; j++) if(
152a0 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 20 29 20 7a 5b   z[j]!='\n' ) z[
152b0 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  j] = ' ';.      
152c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
152d0 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20    for(j=i; z[j] 
152e0 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a  && z[j]!='\n'; j
152f0 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a  ++) z[j] = ' ';.
15300 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 73      }else if( (s
15310 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69  trncmp(&z[i],"%i
15320 66 64 65 66 22 2c 36 29 3d 3d 30 20 26 26 20 49  fdef",6)==0 && I
15330 53 53 50 41 43 45 28 7a 5b 69 2b 36 5d 29 29 0a  SSPACE(z[i+6])).
15340 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 74            || (st
15350 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66  rncmp(&z[i],"%if
15360 6e 64 65 66 22 2c 37 29 3d 3d 30 20 26 26 20 49  ndef",7)==0 && I
15370 53 53 50 41 43 45 28 7a 5b 69 2b 37 5d 29 29 20  SSPACE(z[i+7])) 
15380 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 63  ){.      if( exc
15390 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lude ){.        
153a0 65 78 63 6c 75 64 65 2b 2b 3b 0a 20 20 20 20 20  exclude++;.     
153b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
153c0 66 6f 72 28 6a 3d 69 2b 37 3b 20 49 53 53 50 41  for(j=i+7; ISSPA
153d0 43 45 28 7a 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d  CE(z[j]); j++){}
153e0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6e 3d 30  .        for(n=0
153f0 3b 20 7a 5b 6a 2b 6e 5d 20 26 26 20 21 49 53 53  ; z[j+n] && !ISS
15400 50 41 43 45 28 7a 5b 6a 2b 6e 5d 29 3b 20 6e 2b  PACE(z[j+n]); n+
15410 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 65 78 63  +){}.        exc
15420 6c 75 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  lude = 1;.      
15430 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 44 65    for(k=0; k<nDe
15440 66 69 6e 65 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  fine; k++){.    
15450 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
15460 70 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 2c 26 7a  p(azDefine[k],&z
15470 5b 6a 5d 2c 6e 29 3d 3d 30 20 26 26 20 6c 65 6d  [j],n)==0 && lem
15480 6f 6e 53 74 72 6c 65 6e 28 61 7a 44 65 66 69 6e  onStrlen(azDefin
15490 65 5b 6b 5d 29 3d 3d 6e 20 29 7b 0a 20 20 20 20  e[k])==n ){.    
154a0 20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 20          exclude 
154b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
154c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
154d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
154e0 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 33 5d        if( z[i+3]
154f0 3d 3d 27 6e 27 20 29 20 65 78 63 6c 75 64 65 20  =='n' ) exclude 
15500 3d 20 21 65 78 63 6c 75 64 65 3b 0a 20 20 20 20  = !exclude;.    
15510 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20      if( exclude 
15520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
15530 72 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  rt = i;.        
15540 20 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d    start_lineno =
15550 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20   lineno;.       
15560 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15570 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26   for(j=i; z[j] &
15580 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b  & z[j]!='\n'; j+
15590 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20  +) z[j] = ' ';. 
155a0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65     }.  }.  if( e
155b0 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 66 70  xclude ){.    fp
155c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 75 6e  rintf(stderr,"un
155d0 74 65 72 6d 69 6e 61 74 65 64 20 25 25 69 66 64  terminated %%ifd
155e0 65 66 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 6c  ef starting on l
155f0 69 6e 65 20 25 64 5c 6e 22 2c 20 73 74 61 72 74  ine %d\n", start
15600 5f 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 65 78  _lineno);.    ex
15610 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  it(1);.  }.}../*
15620 20 49 6e 20 73 70 69 74 65 20 6f 66 20 69 74 73   In spite of its
15630 20 6e 61 6d 65 2c 20 74 68 69 73 20 66 75 6e 63   name, this func
15640 74 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20 61  tion is really a
15650 20 73 63 61 6e 6e 65 72 2e 20 20 49 74 20 72 65   scanner.  It re
15660 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 65 6e 74  ad.** in the ent
15670 69 72 65 20 69 6e 70 75 74 20 66 69 6c 65 20 28  ire input file (
15680 61 6c 6c 20 61 74 20 6f 6e 63 65 29 20 74 68 65  all at once) the
15690 6e 20 74 6f 6b 65 6e 69 7a 65 73 20 69 74 2e 20  n tokenizes it. 
156a0 20 45 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69   Each.** token i
156b0 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
156c0 66 75 6e 63 74 69 6f 6e 20 22 70 61 72 73 65 6f  function "parseo
156d0 6e 65 74 6f 6b 65 6e 22 20 77 68 69 63 68 20 62  netoken" which b
156e0 75 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74 68 65  uilds all.** the
156f0 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 61 74   appropriate dat
15700 61 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20  a structures in 
15710 74 68 65 20 67 6c 6f 62 61 6c 20 73 74 61 74 65  the global state
15720 20 76 65 63 74 6f 72 20 22 67 70 22 2e 0a 2a 2f   vector "gp"..*/
15730 0a 76 6f 69 64 20 50 61 72 73 65 28 73 74 72 75  .void Parse(stru
15740 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 29 0a 7b 0a  ct lemon *gp).{.
15750 20 20 73 74 72 75 63 74 20 70 73 74 61 74 65 20    struct pstate 
15760 70 73 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a  ps;.  FILE *fp;.
15770 20 20 63 68 61 72 20 2a 66 69 6c 65 62 75 66 3b    char *filebuf;
15780 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
15790 66 69 6c 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20  filesize;.  int 
157a0 6c 69 6e 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b  lineno;.  int c;
157b0 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65  .  char *cp, *ne
157c0 78 74 63 70 3b 0a 20 20 69 6e 74 20 73 74 61 72  xtcp;.  int star
157d0 74 6c 69 6e 65 20 3d 20 30 3b 0a 0a 20 20 6d 65  tline = 0;..  me
157e0 6d 73 65 74 28 26 70 73 2c 20 27 5c 30 27 2c 20  mset(&ps, '\0', 
157f0 73 69 7a 65 6f 66 28 70 73 29 29 3b 0a 20 20 70  sizeof(ps));.  p
15800 73 2e 67 70 20 3d 20 67 70 3b 0a 20 20 70 73 2e  s.gp = gp;.  ps.
15810 66 69 6c 65 6e 61 6d 65 20 3d 20 67 70 2d 3e 66  filename = gp->f
15820 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 73 2e 65 72  ilename;.  ps.er
15830 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 20 20 70 73  rorcnt = 0;.  ps
15840 2e 73 74 61 74 65 20 3d 20 49 4e 49 54 49 41 4c  .state = INITIAL
15850 49 5a 45 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  IZE;..  /* Begin
15860 20 62 79 20 72 65 61 64 69 6e 67 20 74 68 65 20   by reading the 
15870 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
15880 66 70 20 3d 20 66 6f 70 65 6e 28 70 73 2e 66 69  fp = fopen(ps.fi
15890 6c 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20  lename,"rb");.  
158a0 69 66 28 20 66 70 3d 3d 30 20 29 7b 0a 20 20 20  if( fp==0 ){.   
158b0 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c   ErrorMsg(ps.fil
158c0 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 6f  ename,0,"Can't o
158d0 70 65 6e 20 74 68 69 73 20 66 69 6c 65 20 66 6f  pen this file fo
158e0 72 20 72 65 61 64 69 6e 67 2e 22 29 3b 0a 20 20  r reading.");.  
158f0 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b    gp->errorcnt++
15900 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
15910 7d 0a 20 20 66 73 65 65 6b 28 66 70 2c 30 2c 32  }.  fseek(fp,0,2
15920 29 3b 0a 20 20 66 69 6c 65 73 69 7a 65 20 3d 20  );.  filesize = 
15930 66 74 65 6c 6c 28 66 70 29 3b 0a 20 20 72 65 77  ftell(fp);.  rew
15940 69 6e 64 28 66 70 29 3b 0a 20 20 66 69 6c 65 62  ind(fp);.  fileb
15950 75 66 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c  uf = (char *)mal
15960 6c 6f 63 28 20 66 69 6c 65 73 69 7a 65 2b 31 20  loc( filesize+1 
15970 29 3b 0a 20 20 69 66 28 20 66 69 6c 65 73 69 7a  );.  if( filesiz
15980 65 3e 31 30 30 30 30 30 30 30 30 20 7c 7c 20 66  e>100000000 || f
15990 69 6c 65 62 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ilebuf==0 ){.   
159a0 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c   ErrorMsg(ps.fil
159b0 65 6e 61 6d 65 2c 30 2c 22 49 6e 70 75 74 20 66  ename,0,"Input f
159c0 69 6c 65 20 74 6f 6f 20 6c 61 72 67 65 2e 22 29  ile too large.")
159d0 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63  ;.    gp->errorc
159e0 6e 74 2b 2b 3b 0a 20 20 20 20 66 63 6c 6f 73 65  nt++;.    fclose
159f0 28 66 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (fp);.    return
15a00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 61  ;.  }.  if( frea
15a10 64 28 66 69 6c 65 62 75 66 2c 31 2c 66 69 6c 65  d(filebuf,1,file
15a20 73 69 7a 65 2c 66 70 29 21 3d 66 69 6c 65 73 69  size,fp)!=filesi
15a30 7a 65 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d  ze ){.    ErrorM
15a40 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30  sg(ps.filename,0
15a50 2c 22 43 61 6e 27 74 20 72 65 61 64 20 69 6e 20  ,"Can't read in 
15a60 61 6c 6c 20 25 64 20 62 79 74 65 73 20 6f 66 20  all %d bytes of 
15a70 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20  this file.",.   
15a80 20 20 20 66 69 6c 65 73 69 7a 65 29 3b 0a 20 20     filesize);.  
15a90 20 20 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b    free(filebuf);
15aa0 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e  .    gp->errorcn
15ab0 74 2b 2b 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28  t++;.    fclose(
15ac0 66 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  fp);.    return;
15ad0 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70  .  }.  fclose(fp
15ae0 29 3b 0a 20 20 66 69 6c 65 62 75 66 5b 66 69 6c  );.  filebuf[fil
15af0 65 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20 2f  esize] = 0;..  /
15b00 2a 20 4d 61 6b 65 20 61 6e 20 69 6e 69 74 69 61  * Make an initia
15b10 6c 20 70 61 73 73 20 74 68 72 6f 75 67 68 20 74  l pass through t
15b20 68 65 20 66 69 6c 65 20 74 6f 20 68 61 6e 64 6c  he file to handl
15b30 65 20 25 69 66 64 65 66 20 61 6e 64 20 25 69 66  e %ifdef and %if
15b40 6e 64 65 66 20 2a 2f 0a 20 20 70 72 65 70 72 6f  ndef */.  prepro
15b50 63 65 73 73 5f 69 6e 70 75 74 28 66 69 6c 65 62  cess_input(fileb
15b60 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 73  uf);..  /* Now s
15b70 63 61 6e 20 74 68 65 20 74 65 78 74 20 6f 66 20  can the text of 
15b80 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  the input file *
15b90 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a  /.  lineno = 1;.
15ba0 20 20 66 6f 72 28 63 70 3d 66 69 6c 65 62 75 66    for(cp=filebuf
15bb0 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 3b 20 29  ; (c= *cp)!=0; )
15bc0 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e  {.    if( c=='\n
15bd0 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 20 20  ' ) lineno++;   
15be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
15bf0 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
15c00 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  line number */. 
15c10 20 20 20 69 66 28 20 49 53 53 50 41 43 45 28 63     if( ISSPACE(c
15c20 29 20 29 7b 20 63 70 2b 2b 3b 20 63 6f 6e 74 69  ) ){ cp++; conti
15c30 6e 75 65 3b 20 7d 20 20 2f 2a 20 53 6b 69 70 20  nue; }  /* Skip 
15c40 61 6c 6c 20 77 68 69 74 65 20 73 70 61 63 65 20  all white space 
15c50 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f  */.    if( c=='/
15c60 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20  ' && cp[1]=='/' 
15c70 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ){          /* S
15c80 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f  kip C++ style co
15c90 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  mments */.      
15ca0 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69  cp+=2;.      whi
15cb0 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
15cc0 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b  && c!='\n' ) cp+
15cd0 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  +;.      continu
15ce0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
15cf0 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
15d00 3d 3d 27 2a 27 20 29 7b 20 20 20 20 20 20 20 20  =='*' ){        
15d10 20 20 2f 2a 20 53 6b 69 70 20 43 20 73 74 79 6c    /* Skip C styl
15d20 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20  e comments */.  
15d30 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20      cp+=2;.     
15d40 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29   while( (c= *cp)
15d50 21 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20 7c  !=0 && (c!='/' |
15d60 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a 27 29 20 29  | cp[-1]!='*') )
15d70 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
15d80 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
15d90 3b 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a  ;.        cp++;.
15da0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15db0 28 20 63 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20  ( c ) cp++;.    
15dc0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
15dd0 7d 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 73 74  }.    ps.tokenst
15de0 61 72 74 20 3d 20 63 70 3b 20 20 20 20 20 20 20  art = cp;       
15df0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b           /* Mark
15e00 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
15e10 66 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20  f the token */. 
15e20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e     ps.tokenlinen
15e30 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20 20 20 20  o = lineno;     
15e40 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d        /* Linenum
15e50 62 65 72 20 6f 6e 20 77 68 69 63 68 20 74 6f 6b  ber on which tok
15e60 65 6e 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20 20  en begins */.   
15e70 20 69 66 28 20 63 3d 3d 27 5c 22 27 20 29 7b 20   if( c=='\"' ){ 
15e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e90 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c 69      /* String li
15ea0 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20  terals */.      
15eb0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c  cp++;.      whil
15ec0 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  e( (c= *cp)!=0 &
15ed0 26 20 63 21 3d 27 5c 22 27 20 29 7b 0a 20 20 20  & c!='\"' ){.   
15ee0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
15ef0 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20   ) lineno++;.   
15f00 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
15f10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
15f20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  0 ){.        Err
15f30 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
15f40 65 2c 73 74 61 72 74 6c 69 6e 65 2c 0a 22 53 74  e,startline,."St
15f50 72 69 6e 67 20 73 74 61 72 74 69 6e 67 20 6f 6e  ring starting on
15f60 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
15f70 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66  t terminated bef
15f80 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ore the end of t
15f90 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20  he file.");.    
15fa0 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b      ps.errorcnt+
15fb0 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63  +;.        nextc
15fc0 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65  p = cp;.      }e
15fd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  lse{.        nex
15fe0 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20  tcp = cp+1;.    
15ff0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
16000 28 20 63 3d 3d 27 7b 27 20 29 7b 20 20 20 20 20  ( c=='{' ){     
16010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62            /* A b
16020 6c 6f 63 6b 20 6f 66 20 43 20 63 6f 64 65 20 2a  lock of C code *
16030 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 76 65  /.      int leve
16040 6c 3b 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  l;.      cp++;. 
16050 20 20 20 20 20 66 6f 72 28 6c 65 76 65 6c 3d 31       for(level=1
16060 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ; (c= *cp)!=0 &&
16070 20 28 6c 65 76 65 6c 3e 31 20 7c 7c 20 63 21 3d   (level>1 || c!=
16080 27 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20  '}'); cp++){.   
16090 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
160a0 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20   ) lineno++;.   
160b0 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d       else if( c=
160c0 3d 27 7b 27 20 29 20 6c 65 76 65 6c 2b 2b 3b 0a  ='{' ) level++;.
160d0 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
160e0 20 63 3d 3d 27 7d 27 20 29 20 6c 65 76 65 6c 2d   c=='}' ) level-
160f0 2d 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20  -;.        else 
16100 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70  if( c=='/' && cp
16110 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 2f 2a 20  [1]=='*' ){  /* 
16120 53 6b 69 70 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f  Skip comments */
16130 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 70  .          int p
16140 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20 20 20  revc;.          
16150 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20  cp = &cp[2];.   
16160 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 30         prevc = 0
16170 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
16180 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  e( (c= *cp)!=0 &
16190 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 70 72 65  & (c!='/' || pre
161a0 76 63 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20  vc!='*') ){.    
161b0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
161c0 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
161d0 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 76              prev
161e0 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  c = c;.         
161f0 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20     cp++;.       
16200 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
16210 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26  se if( c=='/' &&
16220 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20   cp[1]=='/' ){  
16230 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c  /* Skip C++ styl
16240 65 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 6f 20 2a  e comments too *
16250 2f 0a 20 20 20 20 20 20 20 20 20 20 63 70 20 3d  /.          cp =
16260 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20   &cp[2];.       
16270 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63     while( (c= *c
16280 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27  p)!=0 && c!='\n'
16290 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20   ) cp++;.       
162a0 20 20 20 69 66 28 20 63 20 29 20 6c 69 6e 65 6e     if( c ) linen
162b0 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  o++;.        }el
162c0 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c  se if( c=='\'' |
162d0 7c 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20  | c=='\"' ){    
162e0 2f 2a 20 53 74 72 69 6e 67 20 61 20 63 68 61 72  /* String a char
162f0 61 63 74 65 72 20 6c 69 74 65 72 61 6c 73 20 2a  acter literals *
16300 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
16310 73 74 61 72 74 63 68 61 72 2c 20 70 72 65 76 63  startchar, prevc
16320 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72  ;.          star
16330 74 63 68 61 72 20 3d 20 63 3b 0a 20 20 20 20 20  tchar = c;.     
16340 20 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a       prevc = 0;.
16350 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 63 70            for(cp
16360 2b 2b 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  ++; (c= *cp)!=0 
16370 26 26 20 28 63 21 3d 73 74 61 72 74 63 68 61 72  && (c!=startchar
16380 20 7c 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29   || prevc=='\\')
16390 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; cp++){.       
163a0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
163b0 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20   ) lineno++;.   
163c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72 65           if( pre
163d0 76 63 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76 63  vc=='\\' ) prevc
163e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
163f0 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
16400 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 20      prevc = c;. 
16410 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16420 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
16430 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
16440 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
16450 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74  ps.filename,ps.t
16460 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63  okenlineno,."C c
16470 6f 64 65 20 73 74 61 72 74 69 6e 67 20 6f 6e 20  ode starting on 
16480 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74  this line is not
16490 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f   terminated befo
164a0 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  re the end of th
164b0 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20  e file.");.     
164c0 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b     ps.errorcnt++
164d0 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  ;.        nextcp
164e0 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c   = cp;.      }el
164f0 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  se{.        next
16500 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20  cp = cp+1;.     
16510 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
16520 20 49 53 41 4c 4e 55 4d 28 63 29 20 29 7b 20 20   ISALNUM(c) ){  
16530 20 20 20 20 20 20 20 20 2f 2a 20 49 64 65 6e 74          /* Ident
16540 69 66 69 65 72 73 20 2a 2f 0a 20 20 20 20 20 20  ifiers */.      
16550 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
16560 3d 30 20 26 26 20 28 49 53 41 4c 4e 55 4d 28 63  =0 && (ISALNUM(c
16570 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63  ) || c=='_') ) c
16580 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  p++;.      nextc
16590 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73  p = cp;.    }els
165a0 65 20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20  e if( c==':' && 
165b0 63 70 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70  cp[1]==':' && cp
165c0 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54  [2]=='=' ){ /* T
165d0 68 65 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d  he operator "::=
165e0 22 20 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d  " */.      cp +=
165f0 20 33 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70   3;.      nextcp
16600 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65   = cp;.    }else
16610 20 69 66 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20   if( (c=='/' || 
16620 63 3d 3d 27 7c 27 29 20 26 26 20 49 53 41 4c 50  c=='|') && ISALP
16630 48 41 28 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20  HA(cp[1]) ){.   
16640 20 20 20 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20     cp += 2;.    
16650 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 63    while( (c = *c
16660 70 29 21 3d 30 20 26 26 20 28 49 53 41 4c 4e 55  p)!=0 && (ISALNU
16670 4d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20  M(c) || c=='_') 
16680 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65  ) cp++;.      ne
16690 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d  xtcp = cp;.    }
166a0 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
166c0 2a 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65  * All other (one
166d0 20 63 68 61 72 61 63 74 65 72 29 20 6f 70 65 72   character) oper
166e0 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63  ators */.      c
166f0 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  p++;.      nextc
16700 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20  p = cp;.    }.  
16710 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a    c = *cp;.    *
16720 63 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  cp = 0;         
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16740 2a 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65  * Null terminate
16750 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20   the token */.  
16760 20 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28    parseonetoken(
16770 26 70 73 29 3b 20 20 20 20 20 20 20 20 20 20 20  &ps);           
16780 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74    /* Parse the t
16790 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20  oken */.    *cp 
167a0 3d 20 28 63 68 61 72 29 63 3b 20 20 20 20 20 20  = (char)c;      
167b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
167c0 65 73 74 6f 72 65 20 74 68 65 20 62 75 66 66 65  estore the buffe
167d0 72 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65  r */.    cp = ne
167e0 78 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65  xtcp;.  }.  free
167f0 28 66 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20  (filebuf);      
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16810 20 52 65 6c 65 61 73 65 20 74 68 65 20 62 75 66   Release the buf
16820 66 65 72 20 61 66 74 65 72 20 70 61 72 73 69 6e  fer after parsin
16830 67 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20  g */.  gp->rule 
16840 3d 20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a  = ps.firstrule;.
16850 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d    gp->errorcnt =
16860 20 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a   ps.errorcnt;.}.
16870 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
16880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
16890 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e  m the file "plin
168a0 6b 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  k.c" ***********
168b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
168c0 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65  * Routines proce
168d0 73 73 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74  ssing configurat
168e0 69 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70  ion follow-set p
168f0 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
16900 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  .** in the LEMON
16910 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
16920 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  r..*/.static str
16930 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b  uct plink *plink
16940 5f 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a  _freelist = 0;..
16950 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
16960 77 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63  w plink */.struc
16970 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e  t plink *Plink_n
16980 65 77 28 76 6f 69 64 29 7b 0a 20 20 73 74 72 75  ew(void){.  stru
16990 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 6c 69 6e  ct plink *newlin
169a0 6b 3b 0a 0a 20 20 69 66 28 20 70 6c 69 6e 6b 5f  k;..  if( plink_
169b0 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
169c0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
169d0 74 20 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20  t amt = 100;.   
169e0 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20   plink_freelist 
169f0 3d 20 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  = (struct plink 
16a00 2a 29 63 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73  *)calloc( amt, s
16a10 69 7a 65 6f 66 28 73 74 72 75 63 74 20 70 6c 69  izeof(struct pli
16a20 6e 6b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nk) );.    if( p
16a30 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30  link_freelist==0
16a40 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
16a50 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20  f(stderr,.      
16a60 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63  "Unable to alloc
16a70 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61  ate memory for a
16a80 20 6e 65 77 20 66 6f 6c 6c 6f 77 2d 73 65 74 20   new follow-set 
16a90 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
16aa0 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69  .\n");.      exi
16ab0 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(1);.    }.    
16ac0 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31  for(i=0; i<amt-1
16ad0 3b 20 69 2b 2b 29 20 70 6c 69 6e 6b 5f 66 72 65  ; i++) plink_fre
16ae0 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20  elist[i].next = 
16af0 26 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b  &plink_freelist[
16b00 69 2b 31 5d 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f  i+1];.    plink_
16b10 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e  freelist[amt-1].
16b20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  next = 0;.  }.  
16b30 6e 65 77 6c 69 6e 6b 20 3d 20 70 6c 69 6e 6b 5f  newlink = plink_
16b40 66 72 65 65 6c 69 73 74 3b 0a 20 20 70 6c 69 6e  freelist;.  plin
16b50 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 69  k_freelist = pli
16b60 6e 6b 5f 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78  nk_freelist->nex
16b70 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 6c  t;.  return newl
16b80 69 6e 6b 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61  ink;.}../* Add a
16b90 20 70 6c 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e   plink to a plin
16ba0 6b 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50  k list */.void P
16bb0 6c 69 6e 6b 5f 61 64 64 28 73 74 72 75 63 74 20  link_add(struct 
16bc0 70 6c 69 6e 6b 20 2a 2a 70 6c 70 70 2c 20 73 74  plink **plpp, st
16bd0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
16be0 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  ).{.  struct pli
16bf0 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e  nk *newlink;.  n
16c00 65 77 6c 69 6e 6b 20 3d 20 50 6c 69 6e 6b 5f 6e  ewlink = Plink_n
16c10 65 77 28 29 3b 0a 20 20 6e 65 77 6c 69 6e 6b 2d  ew();.  newlink-
16c20 3e 6e 65 78 74 20 3d 20 2a 70 6c 70 70 3b 0a 20  >next = *plpp;. 
16c30 20 2a 70 6c 70 70 20 3d 20 6e 65 77 6c 69 6e 6b   *plpp = newlink
16c40 3b 0a 20 20 6e 65 77 6c 69 6e 6b 2d 3e 63 66 70  ;.  newlink->cfp
16c50 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 54 72   = cfp;.}../* Tr
16c60 61 6e 73 66 65 72 20 65 76 65 72 79 20 70 6c 69  ansfer every pli
16c70 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 22  nk on the list "
16c80 66 72 6f 6d 22 20 74 6f 20 74 68 65 20 6c 69 73  from" to the lis
16c90 74 20 22 74 6f 22 20 2a 2f 0a 76 6f 69 64 20 50  t "to" */.void P
16ca0 6c 69 6e 6b 5f 63 6f 70 79 28 73 74 72 75 63 74  link_copy(struct
16cb0 20 70 6c 69 6e 6b 20 2a 2a 74 6f 2c 20 73 74 72   plink **to, str
16cc0 75 63 74 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 29  uct plink *from)
16cd0 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  .{.  struct plin
16ce0 6b 20 2a 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69  k *nextpl;.  whi
16cf0 6c 65 28 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20  le( from ){.    
16d00 6e 65 78 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e  nextpl = from->n
16d10 65 78 74 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e  ext;.    from->n
16d20 65 78 74 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a  ext = *to;.    *
16d30 74 6f 20 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66  to = from;.    f
16d40 72 6f 6d 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20  rom = nextpl;.  
16d50 7d 0a 7d 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65  }.}../* Delete e
16d60 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68  very plink on th
16d70 65 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50  e list */.void P
16d80 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 73 74 72 75  link_delete(stru
16d90 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 29 0a 7b  ct plink *plp).{
16da0 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
16db0 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20 77 68 69 6c  *nextpl;..  whil
16dc0 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20 6e 65  e( plp ){.    ne
16dd0 78 74 70 6c 20 3d 20 70 6c 70 2d 3e 6e 65 78 74  xtpl = plp->next
16de0 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e 65 78 74 20  ;.    plp->next 
16df0 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  = plink_freelist
16e00 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65  ;.    plink_free
16e10 6c 69 73 74 20 3d 20 70 6c 70 3b 0a 20 20 20 20  list = plp;.    
16e20 70 6c 70 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20  plp = nextpl;.  
16e30 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}./***********
16e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
16e50 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70 6f  m the file "repo
16e60 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rt.c" **********
16e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e80 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 64 75 72  /./*.** Procedur
16e90 65 73 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e  es for generatin
16ea0 67 20 72 65 70 6f 72 74 73 20 61 6e 64 20 74 61  g reports and ta
16eb0 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  bles in the LEMO
16ec0 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
16ed0 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e 65 72  or..*/../* Gener
16ee0 61 74 65 20 61 20 66 69 6c 65 6e 61 6d 65 20 77  ate a filename w
16ef0 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 73 75  ith the given su
16f00 66 66 69 78 2e 20 20 53 70 61 63 65 20 74 6f 20  ffix.  Space to 
16f10 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 6e 61 6d 65  hold the.** name
16f20 20 63 6f 6d 65 73 20 66 72 6f 6d 20 6d 61 6c 6c   comes from mall
16f30 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
16f40 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
16f50 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
16f60 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63 68  n..*/.PRIVATE ch
16f70 61 72 20 2a 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d  ar *file_makenam
16f80 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  e(struct lemon *
16f90 6c 65 6d 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  lemp, const char
16fa0 20 2a 73 75 66 66 69 78 29 0a 7b 0a 20 20 63 68   *suffix).{.  ch
16fb0 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 63 68 61 72  ar *name;.  char
16fc0 20 2a 63 70 3b 0a 0a 20 20 6e 61 6d 65 20 3d 20   *cp;..  name = 
16fd0 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6c  (char*)malloc( l
16fe0 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d  emonStrlen(lemp-
16ff0 3e 66 69 6c 65 6e 61 6d 65 29 20 2b 20 6c 65 6d  >filename) + lem
17000 6f 6e 53 74 72 6c 65 6e 28 73 75 66 66 69 78 29  onStrlen(suffix)
17010 20 2b 20 35 20 29 3b 0a 20 20 69 66 28 20 6e 61   + 5 );.  if( na
17020 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  me==0 ){.    fpr
17030 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
17040 27 74 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  't allocate spac
17050 65 20 66 6f 72 20 61 20 66 69 6c 65 6e 61 6d 65  e for a filename
17060 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  .\n");.    exit(
17070 31 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f  1);.  }.  lemon_
17080 73 74 72 63 70 79 28 6e 61 6d 65 2c 6c 65 6d 70  strcpy(name,lemp
17090 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 63  ->filename);.  c
170a0 70 20 3d 20 73 74 72 72 63 68 72 28 6e 61 6d 65  p = strrchr(name
170b0 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20  ,'.');.  if( cp 
170c0 29 20 2a 63 70 20 3d 20 30 3b 0a 20 20 6c 65 6d  ) *cp = 0;.  lem
170d0 6f 6e 5f 73 74 72 63 61 74 28 6e 61 6d 65 2c 73  on_strcat(name,s
170e0 75 66 66 69 78 29 3b 0a 20 20 72 65 74 75 72 6e  uffix);.  return
170f0 20 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65   name;.}../* Ope
17100 6e 20 61 20 66 69 6c 65 20 77 69 74 68 20 61 20  n a file with a 
17110 6e 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 74 68  name based on th
17120 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
17130 70 75 74 20 66 69 6c 65 2c 0a 2a 2a 20 62 75 74  put file,.** but
17140 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
17150 74 20 28 73 70 65 63 69 66 69 65 64 29 20 73 75  t (specified) su
17160 66 66 69 78 2c 20 61 6e 64 20 72 65 74 75 72 6e  ffix, and return
17170 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
17180 20 74 68 65 20 73 74 72 65 61 6d 20 2a 2f 0a 50   the stream */.P
17190 52 49 56 41 54 45 20 46 49 4c 45 20 2a 66 69 6c  RIVATE FILE *fil
171a0 65 5f 6f 70 65 6e 28 0a 20 20 73 74 72 75 63 74  e_open(.  struct
171b0 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20   lemon *lemp,.  
171c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66 66  const char *suff
171d0 69 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ix,.  const char
171e0 20 2a 6d 6f 64 65 0a 29 7b 0a 20 20 46 49 4c 45   *mode.){.  FILE
171f0 20 2a 66 70 3b 0a 0a 20 20 69 66 28 20 6c 65 6d   *fp;..  if( lem
17200 70 2d 3e 6f 75 74 6e 61 6d 65 20 29 20 66 72 65  p->outname ) fre
17210 65 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29  e(lemp->outname)
17220 3b 0a 20 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  ;.  lemp->outnam
17230 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d  e = file_makenam
17240 65 28 6c 65 6d 70 2c 20 73 75 66 66 69 78 29 3b  e(lemp, suffix);
17250 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 6c 65  .  fp = fopen(le
17260 6d 70 2d 3e 6f 75 74 6e 61 6d 65 2c 6d 6f 64 65  mp->outname,mode
17270 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 26  );.  if( fp==0 &
17280 26 20 2a 6d 6f 64 65 3d 3d 27 77 27 20 29 7b 0a  & *mode=='w' ){.
17290 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
172a0 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 66  rr,"Can't open f
172b0 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 6c  ile \"%s\".\n",l
172c0 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20  emp->outname);. 
172d0 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
172e0 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t++;.    return 
172f0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
17300 66 70 3b 0a 7d 0a 0a 2f 2a 20 44 75 70 6c 69 63  fp;.}../* Duplic
17310 61 74 65 20 74 68 65 20 69 6e 70 75 74 20 66 69  ate the input fi
17320 6c 65 20 77 69 74 68 6f 75 74 20 63 6f 6d 6d 65  le without comme
17330 6e 74 73 20 61 6e 64 20 77 69 74 68 6f 75 74 20  nts and without 
17340 61 63 74 69 6f 6e 73 20 0a 2a 2a 20 6f 6e 20 72  actions .** on r
17350 75 6c 65 73 20 2a 2f 0a 76 6f 69 64 20 52 65 70  ules */.void Rep
17360 72 69 6e 74 28 73 74 72 75 63 74 20 6c 65 6d 6f  rint(struct lemo
17370 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72  n *lemp).{.  str
17380 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
17390 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
173a0 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6d  p;.  int i, j, m
173b0 61 78 6c 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f 6c  axlen, len, ncol
173c0 75 6d 6e 73 2c 20 73 6b 69 70 3b 0a 20 20 70 72  umns, skip;.  pr
173d0 69 6e 74 66 28 22 2f 2f 20 52 65 70 72 69 6e 74  intf("// Reprint
173e0 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 5c   of input file \
173f0 22 25 73 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62 6f  "%s\".\n// Symbo
17400 6c 73 3a 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69 6c  ls:\n",lemp->fil
17410 65 6e 61 6d 65 29 3b 0a 20 20 6d 61 78 6c 65 6e  ename);.  maxlen
17420 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28 69 3d 30   = 10;.  for(i=0
17430 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
17440 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 20  l; i++){.    sp 
17450 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
17460 69 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65  i];.    len = le
17470 6d 6f 6e 53 74 72 6c 65 6e 28 73 70 2d 3e 6e 61  monStrlen(sp->na
17480 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e  me);.    if( len
17490 3e 6d 61 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e  >maxlen ) maxlen
174a0 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63   = len;.  }.  nc
174b0 6f 6c 75 6d 6e 73 20 3d 20 37 36 2f 28 6d 61 78  olumns = 76/(max
174c0 6c 65 6e 2b 35 29 3b 0a 20 20 69 66 28 20 6e 63  len+5);.  if( nc
174d0 6f 6c 75 6d 6e 73 3c 31 20 29 20 6e 63 6f 6c 75  olumns<1 ) ncolu
174e0 6d 6e 73 20 3d 20 31 3b 0a 20 20 73 6b 69 70 20  mns = 1;.  skip 
174f0 3d 20 28 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c  = (lemp->nsymbol
17500 20 2b 20 6e 63 6f 6c 75 6d 6e 73 20 2d 20 31 29   + ncolumns - 1)
17510 2f 6e 63 6f 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72  /ncolumns;.  for
17520 28 69 3d 30 3b 20 69 3c 73 6b 69 70 3b 20 69 2b  (i=0; i<skip; i+
17530 2b 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  +){.    printf("
17540 2f 2f 22 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  //");.    for(j=
17550 69 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  i; j<lemp->nsymb
17560 6f 6c 3b 20 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20  ol; j+=skip){.  
17570 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73      sp = lemp->s
17580 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20  ymbols[j];.     
17590 20 61 73 73 65 72 74 28 20 73 70 2d 3e 69 6e 64   assert( sp->ind
175a0 65 78 3d 3d 6a 20 29 3b 0a 20 20 20 20 20 20 70  ex==j );.      p
175b0 72 69 6e 74 66 28 22 20 25 33 64 20 25 2d 2a 2e  rintf(" %3d %-*.
175c0 2a 73 22 2c 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78  *s",j,maxlen,max
175d0 6c 65 6e 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  len,sp->name);. 
175e0 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28     }.    printf(
175f0 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  "\n");.  }.  for
17600 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
17610 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
17620 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 73  {.    printf("%s
17630 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29  ",rp->lhs->name)
17640 3b 0a 20 20 20 20 2f 2a 20 20 20 20 69 66 28 20  ;.    /*    if( 
17650 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 29 20 70  rp->lhsalias ) p
17660 72 69 6e 74 66 28 22 28 25 73 29 22 2c 72 70 2d  rintf("(%s)",rp-
17670 3e 6c 68 73 61 6c 69 61 73 29 3b 20 2a 2f 0a 20  >lhsalias); */. 
17680 20 20 20 70 72 69 6e 74 66 28 22 20 3a 3a 3d 22     printf(" ::="
17690 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
176a0 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
176b0 7b 0a 20 20 20 20 20 20 73 70 20 3d 20 72 70 2d  {.      sp = rp-
176c0 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69  >rhs[i];.      i
176d0 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c  f( sp->type==MUL
176e0 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
176f0 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25        printf(" %
17700 73 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30  s", sp->subsym[0
17710 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
17720 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d    for(j=1; j<sp-
17730 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a  >nsubsym; j++){.
17740 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
17750 28 22 7c 25 73 22 2c 20 73 70 2d 3e 73 75 62 73  ("|%s", sp->subs
17760 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ym[j]->name);.  
17770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
17780 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 72 69  lse{.        pri
17790 6e 74 66 28 22 20 25 73 22 2c 20 73 70 2d 3e 6e  ntf(" %s", sp->n
177a0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
177b0 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d 3e 72      /* if( rp->r
177c0 68 73 61 6c 69 61 73 5b 69 5d 20 29 20 70 72 69  hsalias[i] ) pri
177d0 6e 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e 72  ntf("(%s)",rp->r
177e0 68 73 61 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f 0a  hsalias[i]); */.
177f0 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66      }.    printf
17800 28 22 2e 22 29 3b 0a 20 20 20 20 69 66 28 20 72  (".");.    if( r
17810 70 2d 3e 70 72 65 63 73 79 6d 20 29 20 70 72 69  p->precsym ) pri
17820 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72 70 2d 3e  ntf(" [%s]",rp->
17830 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b 0a  precsym->name);.
17840 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d 3e 63      /* if( rp->c
17850 6f 64 65 20 29 20 70 72 69 6e 74 66 28 22 5c 6e  ode ) printf("\n
17860 20 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f 64 65      %s",rp->code
17870 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66  ); */.    printf
17880 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ("\n");.  }.}../
17890 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
178a0 20 72 75 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 52   rule..*/.void R
178b0 75 6c 65 50 72 69 6e 74 28 46 49 4c 45 20 2a 66  ulePrint(FILE *f
178c0 70 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  p, struct rule *
178d0 72 70 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29  rp, int iCursor)
178e0 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
178f0 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20  l *sp;.  int i, 
17900 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c  j;.  fprintf(fp,
17910 22 25 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c 68 73  "%s ::=",rp->lhs
17920 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  ->name);.  for(i
17930 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68 73 3b  =0; i<=rp->nrhs;
17940 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
17950 3d 3d 69 43 75 72 73 6f 72 20 29 20 66 70 72 69  ==iCursor ) fpri
17960 6e 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a 20 20  ntf(fp," *");.  
17970 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68    if( i==rp->nrh
17980 73 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73  s ) break;.    s
17990 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  p = rp->rhs[i];.
179a0 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
179b0 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
179c0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
179d0 28 66 70 2c 22 20 25 73 22 2c 20 73 70 2d 3e 73  (fp," %s", sp->s
179e0 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29 3b  ubsym[0]->name);
179f0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  .      for(j=1; 
17a00 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a  j<sp->nsubsym; j
17a10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
17a20 69 6e 74 66 28 66 70 2c 22 7c 25 73 22 2c 73 70  intf(fp,"|%s",sp
17a30 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d  ->subsym[j]->nam
17a40 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
17a50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72  }else{.      fpr
17a60 69 6e 74 66 28 66 70 2c 22 20 25 73 22 2c 20 73  intf(fp," %s", s
17a70 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  p->name);.    }.
17a80 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20    }.}../* Print 
17a90 74 68 65 20 72 75 6c 65 20 66 6f 72 20 61 20 63  the rule for a c
17aa0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f  onfiguration..*/
17ab0 0a 76 6f 69 64 20 43 6f 6e 66 69 67 50 72 69 6e  .void ConfigPrin
17ac0 74 28 46 49 4c 45 20 2a 66 70 2c 20 73 74 72 75  t(FILE *fp, stru
17ad0 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 29 7b  ct config *cfp){
17ae0 0a 20 20 52 75 6c 65 50 72 69 6e 74 28 66 70 2c  .  RulePrint(fp,
17af0 20 63 66 70 2d 3e 72 70 2c 20 63 66 70 2d 3e 64   cfp->rp, cfp->d
17b00 6f 74 29 3b 0a 7d 0a 0a 2f 2a 20 23 64 65 66 69  ot);.}../* #defi
17b10 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69 66 20 30  ne TEST */.#if 0
17b20 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 65 74 20  ./* Print a set 
17b30 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
17b40 53 65 74 50 72 69 6e 74 28 6f 75 74 2c 73 65 74  SetPrint(out,set
17b50 2c 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75 74  ,lemp).FILE *out
17b60 3b 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73 74 72  ;.char *set;.str
17b70 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
17b80 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  .{.  int i;.  ch
17b90 61 72 20 2a 73 70 61 63 65 72 3b 0a 20 20 73 70  ar *spacer;.  sp
17ba0 61 63 65 72 20 3d 20 22 22 3b 0a 20 20 66 70 72  acer = "";.  fpr
17bb0 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 5b 22  intf(out,"%12s["
17bc0 2c 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ,"");.  for(i=0;
17bd0 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   i<lemp->ntermin
17be0 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  al; i++){.    if
17bf0 28 20 53 65 74 46 69 6e 64 28 73 65 74 2c 69 29  ( SetFind(set,i)
17c00 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
17c10 66 28 6f 75 74 2c 22 25 73 25 73 22 2c 73 70 61  f(out,"%s%s",spa
17c20 63 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  cer,lemp->symbol
17c30 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  s[i]->name);.   
17c40 20 20 20 73 70 61 63 65 72 20 3d 20 22 20 22 3b     spacer = " ";
17c50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
17c60 69 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b  intf(out,"]\n");
17c70 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 70  .}../* Print a p
17c80 6c 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50 52  link chain */.PR
17c90 49 56 41 54 45 20 76 6f 69 64 20 50 6c 69 6e 6b  IVATE void Plink
17ca0 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74 61  Print(out,plp,ta
17cb0 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74  g).FILE *out;.st
17cc0 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b  ruct plink *plp;
17cd0 0a 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20 20  .char *tag;.{.  
17ce0 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20  while( plp ){.  
17cf0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
17d00 31 32 73 25 73 20 28 73 74 61 74 65 20 25 32 64  12s%s (state %2d
17d10 29 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d 3e  ) ","",tag,plp->
17d20 63 66 70 2d 3e 73 74 70 2d 3e 73 74 61 74 65 6e  cfp->stp->staten
17d30 75 6d 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 50  um);.    ConfigP
17d40 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e 63 66  rint(out,plp->cf
17d50 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  p);.    fprintf(
17d60 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 70  out,"\n");.    p
17d70 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a  lp = plp->next;.
17d80 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
17d90 20 50 72 69 6e 74 20 61 6e 20 61 63 74 69 6f 6e   Print an action
17da0 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69   to the given fi
17db0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
17dc0 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a  Return FALSE if.
17dd0 2a 2a 20 6e 6f 74 68 69 6e 67 20 77 61 73 20 61  ** nothing was a
17de0 63 74 75 61 6c 6c 79 20 70 72 69 6e 74 65 64 2e  ctually printed.
17df0 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e 74 41 63 74  .*/.int PrintAct
17e00 69 6f 6e 28 0a 20 20 73 74 72 75 63 74 20 61 63  ion(.  struct ac
17e10 74 69 6f 6e 20 2a 61 70 2c 20 20 20 20 20 20 20  tion *ap,       
17e20 20 20 20 2f 2a 20 54 68 65 20 61 63 74 69 6f 6e     /* The action
17e30 20 74 6f 20 70 72 69 6e 74 20 2a 2f 0a 20 20 46   to print */.  F
17e40 49 4c 45 20 2a 66 70 2c 20 20 20 20 20 20 20 20  ILE *fp,        
17e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
17e60 69 6e 74 20 74 68 65 20 61 63 74 69 6f 6e 20 68  int the action h
17e70 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64  ere */.  int ind
17e80 65 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ent             
17e90 20 20 20 20 20 2f 2a 20 49 6e 64 65 6e 74 20 62       /* Indent b
17ea0 79 20 74 68 69 73 20 61 6d 6f 75 6e 74 20 2a 2f  y this amount */
17eb0 0a 29 7b 0a 20 20 69 6e 74 20 72 65 73 75 6c 74  .){.  int result
17ec0 20 3d 20 31 3b 0a 20 20 73 77 69 74 63 68 28 20   = 1;.  switch( 
17ed0 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20 20  ap->type ){.    
17ee0 63 61 73 65 20 53 48 49 46 54 3a 20 7b 0a 20 20  case SHIFT: {.  
17ef0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 65      struct state
17f00 20 2a 73 74 70 20 3d 20 61 70 2d 3e 78 2e 73 74   *stp = ap->x.st
17f10 70 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  p;.      fprintf
17f20 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20  (fp,"%*s shift  
17f30 20 20 20 20 20 20 25 2d 37 64 22 2c 69 6e 64 65        %-7d",inde
17f40 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
17f50 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a  stp->statenum);.
17f60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17f70 20 7d 0a 20 20 20 20 63 61 73 65 20 52 45 44 55   }.    case REDU
17f80 43 45 3a 20 7b 0a 20 20 20 20 20 20 73 74 72 75  CE: {.      stru
17f90 63 74 20 72 75 6c 65 20 2a 72 70 20 3d 20 61 70  ct rule *rp = ap
17fa0 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 66 70  ->x.rp;.      fp
17fb0 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65  rintf(fp,"%*s re
17fc0 64 75 63 65 20 20 20 20 20 20 20 25 2d 37 64 22  duce       %-7d"
17fd0 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
17fe0 6e 61 6d 65 2c 72 70 2d 3e 69 52 75 6c 65 29 3b  name,rp->iRule);
17ff0 0a 20 20 20 20 20 20 52 75 6c 65 50 72 69 6e 74  .      RulePrint
18000 28 66 70 2c 20 72 70 2c 20 2d 31 29 3b 0a 20 20  (fp, rp, -1);.  
18010 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18020 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54 52  .    case SHIFTR
18030 45 44 55 43 45 3a 20 7b 0a 20 20 20 20 20 20 73  EDUCE: {.      s
18040 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 20 3d  truct rule *rp =
18050 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20   ap->x.rp;.     
18060 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
18070 20 73 68 69 66 74 2d 72 65 64 75 63 65 20 25 2d   shift-reduce %-
18080 37 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73  7d",indent,ap->s
18090 70 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 69 52 75 6c  p->name,rp->iRul
180a0 65 29 3b 0a 20 20 20 20 20 20 52 75 6c 65 50 72  e);.      RulePr
180b0 69 6e 74 28 66 70 2c 20 72 70 2c 20 2d 31 29 3b  int(fp, rp, -1);
180c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
180d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 41 43 43    }.    case ACC
180e0 45 50 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  EPT:.      fprin
180f0 74 66 28 66 70 2c 22 25 2a 73 20 61 63 63 65 70  tf(fp,"%*s accep
18100 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70  t",indent,ap->sp
18110 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  ->name);.      b
18120 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45  reak;.    case E
18130 52 52 4f 52 3a 0a 20 20 20 20 20 20 66 70 72 69  RROR:.      fpri
18140 6e 74 66 28 66 70 2c 22 25 2a 73 20 65 72 72 6f  ntf(fp,"%*s erro
18150 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70  r",indent,ap->sp
18160 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  ->name);.      b
18170 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
18180 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 63  RCONFLICT:.    c
18190 61 73 65 20 52 52 43 4f 4e 46 4c 49 43 54 3a 0a  ase RRCONFLICT:.
181a0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
181b0 2c 22 25 2a 73 20 72 65 64 75 63 65 20 20 20 20  ,"%*s reduce    
181c0 20 20 20 25 2d 37 64 20 2a 2a 20 50 61 72 73 69     %-7d ** Parsi
181d0 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a 22 2c  ng conflict **",
181e0 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74 2c  .        indent,
181f0 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d  ap->sp->name,ap-
18200 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20  >x.rp->iRule);. 
18210 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18220 63 61 73 65 20 53 53 43 4f 4e 46 4c 49 43 54 3a  case SSCONFLICT:
18230 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
18240 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20 20 20  p,"%*s shift    
18250 20 20 20 20 25 2d 37 64 20 2a 2a 20 50 61 72 73      %-7d ** Pars
18260 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a 22  ing conflict **"
18270 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e  , .        inden
18280 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61  t,ap->sp->name,a
18290 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e  p->x.stp->staten
182a0 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  um);.      break
182b0 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52 45  ;.    case SH_RE
182c0 53 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20 69 66  SOLVED:.      if
182d0 28 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65  ( showPrecedence
182e0 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20  Conflict ){.    
182f0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
18300 25 2a 73 20 73 68 69 66 74 20 20 20 20 20 20 20  %*s shift       
18310 20 25 2d 37 64 20 2d 2d 20 64 72 6f 70 70 65 64   %-7d -- dropped
18320 20 62 79 20 70 72 65 63 65 64 65 6e 63 65 22 2c   by precedence",
18330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18340 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
18350 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e  name,ap->x.stp->
18360 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20  statenum);.     
18370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18380 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20  result = 0;.    
18390 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
183a0 0a 20 20 20 20 63 61 73 65 20 52 44 5f 52 45 53  .    case RD_RES
183b0 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20 69 66 28  OLVED:.      if(
183c0 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43   showPrecedenceC
183d0 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20 20  onflict ){.     
183e0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
183f0 2a 73 20 72 65 64 75 63 65 20 25 2d 37 64 20 2d  *s reduce %-7d -
18400 2d 20 64 72 6f 70 70 65 64 20 62 79 20 70 72 65  - dropped by pre
18410 63 65 64 65 6e 63 65 22 2c 0a 20 20 20 20 20 20  cedence",.      
18420 20 20 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74            indent
18430 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70  ,ap->sp->name,ap
18440 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 29 3b 0a  ->x.rp->iRule);.
18450 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18460 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b       result = 0;
18470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
18480 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4e  reak;.    case N
18490 4f 54 5f 55 53 45 44 3a 0a 20 20 20 20 20 20 72  OT_USED:.      r
184a0 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20  esult = 0;.     
184b0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
184c0 28 20 72 65 73 75 6c 74 20 26 26 20 61 70 2d 3e  ( result && ap->
184d0 73 70 4f 70 74 20 29 7b 0a 20 20 20 20 66 70 72  spOpt ){.    fpr
184e0 69 6e 74 66 28 66 70 2c 22 20 20 2f 2a 20 62 65  intf(fp,"  /* be
184f0 63 61 75 73 65 20 25 73 3d 3d 25 73 20 2a 2f 22  cause %s==%s */"
18500 2c 20 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 20  , ap->sp->name, 
18510 61 70 2d 3e 73 70 4f 70 74 2d 3e 6e 61 6d 65 29  ap->spOpt->name)
18520 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18530 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e  esult;.}../* Gen
18540 65 72 61 74 65 20 74 68 65 20 22 2a 2e 6f 75 74  erate the "*.out
18550 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76 6f  " log file */.vo
18560 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28  id ReportOutput(
18570 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
18580 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp).{.  int i;. 
18590 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
185a0 74 70 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  tp;.  struct con
185b0 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75  fig *cfp;.  stru
185c0 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20  ct action *ap;. 
185d0 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 66 70   FILE *fp;..  fp
185e0 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d   = file_open(lem
185f0 70 2c 22 2e 6f 75 74 22 2c 22 77 62 22 29 3b 0a  p,".out","wb");.
18600 20 20 69 66 28 20 66 70 3d 3d 30 20 29 20 72 65    if( fp==0 ) re
18610 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
18620 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65   i<lemp->nxstate
18630 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
18640 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
18650 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66  ];.    fprintf(f
18660 70 2c 22 53 74 61 74 65 20 25 64 3a 5c 6e 22 2c  p,"State %d:\n",
18670 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a  stp->statenum);.
18680 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61      if( lemp->ba
18690 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d 73 74  sisflag ) cfp=st
186a0 70 2d 3e 62 70 3b 0a 20 20 20 20 65 6c 73 65 20  p->bp;.    else 
186b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186c0 20 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 0a 20   cfp=stp->cfp;. 
186d0 20 20 20 77 68 69 6c 65 28 20 63 66 70 20 29 7b     while( cfp ){
186e0 0a 20 20 20 20 20 20 63 68 61 72 20 62 75 66 5b  .      char buf[
186f0 32 30 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63  20];.      if( c
18700 66 70 2d 3e 64 6f 74 3d 3d 63 66 70 2d 3e 72 70  fp->dot==cfp->rp
18710 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  ->nrhs ){.      
18720 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28    lemon_sprintf(
18730 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d 3e  buf,"(%d)",cfp->
18740 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20  rp->iRule);.    
18750 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
18760 20 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b 0a      %5s ",buf);.
18770 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18780 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
18790 22 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a 20  "          ");. 
187a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f 6e       }.      Con
187b0 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70 29  figPrint(fp,cfp)
187c0 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
187d0 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20 30 0a  fp,"\n");.#if 0.
187e0 20 20 20 20 20 20 53 65 74 50 72 69 6e 74 28 66        SetPrint(f
187f0 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70 29  p,cfp->fws,lemp)
18800 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69  ;.      PlinkPri
18810 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70 2c  nt(fp,cfp->fplp,
18820 22 54 6f 20 20 22 29 3b 0a 20 20 20 20 20 20 50  "To  ");.      P
18830 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70  linkPrint(fp,cfp
18840 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b 0a  ->bplp,"From");.
18850 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
18860 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67   lemp->basisflag
18870 20 29 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b 0a   ) cfp=cfp->bp;.
18880 20 20 20 20 20 20 65 6c 73 65 20 20 20 20 20 20        else      
18890 20 20 20 20 20 20 20 20 20 20 20 20 63 66 70 3d              cfp=
188a0 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d  cfp->next;.    }
188b0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
188c0 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 61  "\n");.    for(a
188d0 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
188e0 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
188f0 20 20 20 69 66 28 20 50 72 69 6e 74 41 63 74 69     if( PrintActi
18900 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20 29 20 66  on(ap,fp,30) ) f
18910 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b  printf(fp,"\n");
18920 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
18930 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d  tf(fp,"\n");.  }
18940 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22  .  fprintf(fp, "
18950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18980 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70 72 69  ----\n");.  fpri
18990 6e 74 66 28 66 70 2c 20 22 53 79 6d 62 6f 6c 73  ntf(fp, "Symbols
189a0 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  :\n");.  for(i=0
189b0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
189c0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  l; i++){.    int
189d0 20 6a 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   j;.    struct s
189e0 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 20 20  ymbol *sp;..    
189f0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
18a00 6c 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e  ls[i];.    fprin
18a10 74 66 28 66 70 2c 20 22 20 20 25 33 64 3a 20 25  tf(fp, "  %3d: %
18a20 73 22 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d 65 29  s", i, sp->name)
18a30 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  ;.    if( sp->ty
18a40 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe==NONTERMINAL 
18a50 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
18a60 28 66 70 2c 20 22 3a 22 29 3b 0a 20 20 20 20 20  (fp, ":");.     
18a70 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61 20   if( sp->lambda 
18a80 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
18a90 74 66 28 66 70 2c 20 22 20 3c 6c 61 6d 62 64 61  tf(fp, " <lambda
18aa0 3e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >");.      }.   
18ab0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65     for(j=0; j<le
18ac0 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a  mp->nterminal; j
18ad0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
18ae0 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20 26 26   sp->firstset &&
18af0 20 53 65 74 46 69 6e 64 28 73 70 2d 3e 66 69 72   SetFind(sp->fir
18b00 73 74 73 65 74 2c 20 6a 29 20 29 7b 0a 20 20 20  stset, j) ){.   
18b10 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
18b20 70 2c 20 22 20 25 73 22 2c 20 6c 65 6d 70 2d 3e  p, " %s", lemp->
18b30 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d 65  symbols[j]->name
18b40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
18b50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
18b60 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 6e 22 29  printf(fp, "\n")
18b70 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  ;.  }.  fclose(f
18b80 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  p);.  return;.}.
18b90 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74  ./* Search for t
18ba0 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20 77  he file "name" w
18bb0 68 69 63 68 20 69 73 20 69 6e 20 74 68 65 20 73  hich is in the s
18bc0 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
18bd0 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61 62  .** the exacutab
18be0 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63 68  le */.PRIVATE ch
18bf0 61 72 20 2a 70 61 74 68 73 65 61 72 63 68 28 63  ar *pathsearch(c
18c00 68 61 72 20 2a 61 72 67 76 30 2c 20 63 68 61 72  har *argv0, char
18c10 20 2a 6e 61 6d 65 2c 20 69 6e 74 20 6d 6f 64 65   *name, int mode
18c20 6d 61 73 6b 29 0a 7b 0a 20 20 63 6f 6e 73 74 20  mask).{.  const 
18c30 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b 0a  char *pathlist;.
18c40 20 20 63 68 61 72 20 2a 70 61 74 68 62 75 66 70    char *pathbufp
18c50 74 72 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68  tr;.  char *path
18c60 62 75 66 3b 0a 20 20 63 68 61 72 20 2a 70 61 74  buf;.  char *pat
18c70 68 2c 2a 63 70 3b 0a 20 20 63 68 61 72 20 63 3b  h,*cp;.  char c;
18c80 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33 32  ..#ifdef __WIN32
18c90 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  __.  cp = strrch
18ca0 72 28 61 72 67 76 30 2c 27 5c 5c 27 29 3b 0a 23  r(argv0,'\\');.#
18cb0 65 6c 73 65 0a 20 20 63 70 20 3d 20 73 74 72 72  else.  cp = strr
18cc0 63 68 72 28 61 72 67 76 30 2c 27 2f 27 29 3b 0a  chr(argv0,'/');.
18cd0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 63 70 20  #endif.  if( cp 
18ce0 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a  ){.    c = *cp;.
18cf0 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20      *cp = 0;.   
18d00 20 70 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29   path = (char *)
18d10 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72  malloc( lemonStr
18d20 6c 65 6e 28 61 72 67 76 30 29 20 2b 20 6c 65 6d  len(argv0) + lem
18d30 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29 20 2b  onStrlen(name) +
18d40 20 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61   2 );.    if( pa
18d50 74 68 20 29 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e  th ) lemon_sprin
18d60 74 66 28 70 61 74 68 2c 22 25 73 2f 25 73 22 2c  tf(path,"%s/%s",
18d70 61 72 67 76 30 2c 6e 61 6d 65 29 3b 0a 20 20 20  argv0,name);.   
18d80 20 2a 63 70 20 3d 20 63 3b 0a 20 20 7d 65 6c 73   *cp = c;.  }els
18d90 65 7b 0a 20 20 20 20 70 61 74 68 6c 69 73 74 20  e{.    pathlist 
18da0 3d 20 67 65 74 65 6e 76 28 22 50 41 54 48 22 29  = getenv("PATH")
18db0 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 6c 69  ;.    if( pathli
18dc0 73 74 3d 3d 30 20 29 20 70 61 74 68 6c 69 73 74  st==0 ) pathlist
18dd0 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f   = ".:/bin:/usr/
18de0 62 69 6e 22 3b 0a 20 20 20 20 70 61 74 68 62 75  bin";.    pathbu
18df0 66 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c  f = (char *) mal
18e00 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  loc( lemonStrlen
18e10 28 70 61 74 68 6c 69 73 74 29 20 2b 20 31 20 29  (pathlist) + 1 )
18e20 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63 68  ;.    path = (ch
18e30 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d  ar *)malloc( lem
18e40 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c 69 73  onStrlen(pathlis
18e50 74 29 2b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e  t)+lemonStrlen(n
18e60 61 6d 65 29 2b 32 20 29 3b 0a 20 20 20 20 69 66  ame)+2 );.    if
18e70 28 20 28 70 61 74 68 62 75 66 20 21 3d 20 30 29  ( (pathbuf != 0)
18e80 20 26 26 20 28 70 61 74 68 21 3d 30 29 20 29 7b   && (path!=0) ){
18e90 0a 20 20 20 20 20 20 70 61 74 68 62 75 66 70 74  .      pathbufpt
18ea0 72 20 3d 20 70 61 74 68 62 75 66 3b 0a 20 20 20  r = pathbuf;.   
18eb0 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28     lemon_strcpy(
18ec0 70 61 74 68 62 75 66 2c 20 70 61 74 68 6c 69 73  pathbuf, pathlis
18ed0 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
18ee0 20 2a 70 61 74 68 62 75 66 20 29 7b 0a 20 20 20   *pathbuf ){.   
18ef0 20 20 20 20 20 63 70 20 3d 20 73 74 72 63 68 72       cp = strchr
18f00 28 70 61 74 68 62 75 66 2c 27 3a 27 29 3b 0a 20  (pathbuf,':');. 
18f10 20 20 20 20 20 20 20 69 66 28 20 63 70 3d 3d 30         if( cp==0
18f20 20 29 20 63 70 20 3d 20 26 70 61 74 68 62 75 66   ) cp = &pathbuf
18f30 5b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74  [lemonStrlen(pat
18f40 68 62 75 66 29 5d 3b 0a 20 20 20 20 20 20 20 20  hbuf)];.        
18f50 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20 20  c = *cp;.       
18f60 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20 20   *cp = 0;.      
18f70 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28    lemon_sprintf(
18f80 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 70 61 74  path,"%s/%s",pat
18f90 68 62 75 66 2c 6e 61 6d 65 29 3b 0a 20 20 20 20  hbuf,name);.    
18fa0 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 20      *cp = c;.   
18fb0 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
18fc0 70 61 74 68 62 75 66 5b 30 5d 20 3d 20 30 3b 0a  pathbuf[0] = 0;.
18fd0 20 20 20 20 20 20 20 20 65 6c 73 65 20 70 61 74          else pat
18fe0 68 62 75 66 20 3d 20 26 63 70 5b 31 5d 3b 0a 20  hbuf = &cp[1];. 
18ff0 20 20 20 20 20 20 20 69 66 28 20 61 63 63 65 73         if( acces
19000 73 28 70 61 74 68 2c 6d 6f 64 65 6d 61 73 6b 29  s(path,modemask)
19010 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
19020 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28     }.      free(
19030 70 61 74 68 62 75 66 70 74 72 29 3b 0a 20 20 20  pathbufptr);.   
19040 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19050 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69 76 65  path;.}../* Give
19060 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20 63 6f 6d  n an action, com
19070 70 75 74 65 20 74 68 65 20 69 6e 74 65 67 65 72  pute the integer
19080 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61 74 20   value for that 
19090 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20  action.** which 
190a0 69 73 20 74 6f 20 62 65 20 70 75 74 20 69 6e 20  is to be put in 
190b0 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
190c0 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
190d0 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 52 65  d machine..** Re
190e0 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66  turn negative if
190f0 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68 6f 75 6c   no action shoul
19100 64 20 62 65 20 67 65 6e 65 72 61 74 65 64 2e 0a  d be generated..
19110 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 63  */.PRIVATE int c
19120 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 73 74  ompute_action(st
19130 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
19140 2c 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  , struct action 
19150 2a 61 70 29 0a 7b 0a 20 20 69 6e 74 20 61 63 74  *ap).{.  int act
19160 3b 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e  ;.  switch( ap->
19170 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
19180 20 53 48 49 46 54 3a 20 20 61 63 74 20 3d 20 61   SHIFT:  act = a
19190 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e  p->x.stp->staten
191a0 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
191b0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
191c0 3b 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54  ;.    case SHIFT
191d0 52 45 44 55 43 45 3a 20 61 63 74 20 3d 20 61 70  REDUCE: act = ap
191e0 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c 65 20 2b 20  ->x.rp->iRule + 
191f0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 20 20  lemp->nstate;   
19200 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19210 63 61 73 65 20 52 45 44 55 43 45 3a 20 61 63 74  case REDUCE: act
19220 20 3d 20 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75   = ap->x.rp->iRu
19230 6c 65 20 2b 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  le + lemp->nstat
19240 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 20 62  e+lemp->nrule; b
19250 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45  reak;.    case E
19260 52 52 4f 52 3a 20 20 61 63 74 20 3d 20 6c 65 6d  RROR:  act = lem
19270 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70  p->nstate + lemp
19280 2d 3e 6e 72 75 6c 65 2a 32 3b 20 20 20 20 20 20  ->nrule*2;      
19290 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
192a0 20 20 20 20 63 61 73 65 20 41 43 43 45 50 54 3a      case ACCEPT:
192b0 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74   act = lemp->nst
192c0 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  ate + lemp->nrul
192d0 65 2a 32 20 2b 20 31 3b 20 20 20 20 20 20 20 20  e*2 + 1;        
192e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
192f0 66 61 75 6c 74 3a 20 20 20 20 20 61 63 74 20 3d  fault:     act =
19300 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   -1; break;.  }.
19310 20 20 72 65 74 75 72 6e 20 61 63 74 3b 0a 7d 0a    return act;.}.
19320 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 53 49 5a  .#define LINESIZ
19330 45 20 31 30 30 30 0a 2f 2a 20 54 68 65 20 6e 65  E 1000./* The ne
19340 78 74 20 63 6c 75 73 74 65 72 20 6f 66 20 72 6f  xt cluster of ro
19350 75 74 69 6e 65 73 20 61 72 65 20 66 6f 72 20 72  utines are for r
19360 65 61 64 69 6e 67 20 74 68 65 20 74 65 6d 70 6c  eading the templ
19370 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  ate file.** and 
19380 77 72 69 74 69 6e 67 20 74 68 65 20 72 65 73 75  writing the resu
19390 6c 74 73 20 74 6f 20 74 68 65 20 67 65 6e 65 72  lts to the gener
193a0 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 2f  ated parser */./
193b0 2a 20 54 68 65 20 66 69 72 73 74 20 66 75 6e 63  * The first func
193c0 74 69 6f 6e 20 74 72 61 6e 73 66 65 72 73 20 64  tion transfers d
193d0 61 74 61 20 66 72 6f 6d 20 22 69 6e 22 20 74 6f  ata from "in" to
193e0 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a 2a 20   "out" until.** 
193f0 61 20 6c 69 6e 65 20 69 73 20 73 65 65 6e 20 77  a line is seen w
19400 68 69 63 68 20 62 65 67 69 6e 73 20 77 69 74 68  hich begins with
19410 20 22 25 25 22 2e 20 20 54 68 65 20 6c 69 6e 65   "%%".  The line
19420 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 74 72   number is.** tr
19430 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20  acked..**.** if 
19440 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20 61 6e  name!=0, then an
19450 79 20 77 6f 72 64 20 74 68 61 74 20 62 65 67 69  y word that begi
19460 6e 20 77 69 74 68 20 22 50 61 72 73 65 22 20 69  n with "Parse" i
19470 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a 2a 20  s changed to.** 
19480 62 65 67 69 6e 20 77 69 74 68 20 2a 6e 61 6d 65  begin with *name
19490 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50 52 49   instead..*/.PRI
194a0 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 78  VATE void tplt_x
194b0 66 65 72 28 63 68 61 72 20 2a 6e 61 6d 65 2c 20  fer(char *name, 
194c0 46 49 4c 45 20 2a 69 6e 2c 20 46 49 4c 45 20 2a  FILE *in, FILE *
194d0 6f 75 74 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f  out, int *lineno
194e0 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 69 53 74  ).{.  int i, iSt
194f0 61 72 74 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65  art;.  char line
19500 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 77 68  [LINESIZE];.  wh
19510 69 6c 65 28 20 66 67 65 74 73 28 6c 69 6e 65 2c  ile( fgets(line,
19520 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 20 26 26 20  LINESIZE,in) && 
19530 28 6c 69 6e 65 5b 30 5d 21 3d 27 25 27 20 7c 7c  (line[0]!='%' ||
19540 20 6c 69 6e 65 5b 31 5d 21 3d 27 25 27 29 20 29   line[1]!='%') )
19550 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b  {.    (*lineno)+
19560 2b 3b 0a 20 20 20 20 69 53 74 61 72 74 20 3d 20  +;.    iStart = 
19570 30 3b 0a 20 20 20 20 69 66 28 20 6e 61 6d 65 20  0;.    if( name 
19580 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
19590 3b 20 6c 69 6e 65 5b 69 5d 3b 20 69 2b 2b 29 7b  ; line[i]; i++){
195a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 69 6e  .        if( lin
195b0 65 5b 69 5d 3d 3d 27 50 27 20 26 26 20 73 74 72  e[i]=='P' && str
195c0 6e 63 6d 70 28 26 6c 69 6e 65 5b 69 5d 2c 22 50  ncmp(&line[i],"P
195d0 61 72 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20  arse",5)==0.    
195e0 20 20 20 20 20 20 26 26 20 28 69 3d 3d 30 20 7c        && (i==0 |
195f0 7c 20 21 49 53 41 4c 50 48 41 28 6c 69 6e 65 5b  | !ISALPHA(line[
19600 69 2d 31 5d 29 29 0a 20 20 20 20 20 20 20 20 29  i-1])).        )
19610 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
19620 69 3e 69 53 74 61 72 74 20 29 20 66 70 72 69 6e  i>iStart ) fprin
19630 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2d  tf(out,"%.*s",i-
19640 69 53 74 61 72 74 2c 26 6c 69 6e 65 5b 69 53 74  iStart,&line[iSt
19650 61 72 74 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  art]);.         
19660 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73   fprintf(out,"%s
19670 22 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ",name);.       
19680 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20     i += 4;.     
19690 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 2b       iStart = i+
196a0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
196b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
196c0 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c  printf(out,"%s",
196d0 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a  &line[iStart]);.
196e0 20 20 7d 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6e 65    }.}../* The ne
196f0 78 74 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  xt function find
19700 73 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66  s the template f
19710 69 6c 65 20 61 6e 64 20 6f 70 65 6e 73 20 69 74  ile and opens it
19720 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  , returning.** a
19730 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
19740 6f 70 65 6e 65 64 20 66 69 6c 65 2e 20 2a 2f 0a  opened file. */.
19750 50 52 49 56 41 54 45 20 46 49 4c 45 20 2a 74 70  PRIVATE FILE *tp
19760 6c 74 5f 6f 70 65 6e 28 73 74 72 75 63 74 20 6c  lt_open(struct l
19770 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
19780 73 74 61 74 69 63 20 63 68 61 72 20 74 65 6d 70  static char temp
19790 6c 61 74 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65  latename[] = "le
197a0 6d 70 61 72 2e 63 22 3b 0a 20 20 63 68 61 72 20  mpar.c";.  char 
197b0 62 75 66 5b 31 30 30 30 5d 3b 0a 20 20 46 49 4c  buf[1000];.  FIL
197c0 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 74  E *in;.  char *t
197d0 70 6c 74 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20  pltname;.  char 
197e0 2a 63 70 3b 0a 0a 20 20 2f 2a 20 66 69 72 73 74  *cp;..  /* first
197f0 2c 20 73 65 65 20 69 66 20 75 73 65 72 20 73 70  , see if user sp
19800 65 63 69 66 69 65 64 20 61 20 74 65 6d 70 6c 61  ecified a templa
19810 74 65 20 66 69 6c 65 6e 61 6d 65 20 6f 6e 20 74  te filename on t
19820 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e  he command line.
19830 20 2a 2f 0a 20 20 69 66 20 28 75 73 65 72 5f 74   */.  if (user_t
19840 65 6d 70 6c 61 74 65 6e 61 6d 65 20 21 3d 20 30  emplatename != 0
19850 29 20 7b 0a 20 20 20 20 69 66 28 20 61 63 63 65  ) {.    if( acce
19860 73 73 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65  ss(user_template
19870 6e 61 6d 65 2c 30 30 34 29 3d 3d 2d 31 20 29 7b  name,004)==-1 ){
19880 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
19890 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69 6e  tderr,"Can't fin
198a0 64 20 74 68 65 20 70 61 72 73 65 72 20 64 72 69  d the parser dri
198b0 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  ver template fil
198c0 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20  e \"%s\".\n",.  
198d0 20 20 20 20 20 20 75 73 65 72 5f 74 65 6d 70 6c        user_templ
198e0 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  atename);.      
198f0 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
19900 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
19910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d  ;.    }.    in =
19920 20 66 6f 70 65 6e 28 75 73 65 72 5f 74 65 6d 70   fopen(user_temp
19930 6c 61 74 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a  latename,"rb");.
19940 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b      if( in==0 ){
19950 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
19960 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65  tderr,"Can't ope
19970 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66  n the template f
19980 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a  ile \"%s\".\n",.
19990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73                us
199a0 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29  er_templatename)
199b0 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72  ;.      lemp->er
199c0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
199d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
199e0 20 20 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 20      return in;. 
199f0 20 7d 0a 0a 20 20 63 70 20 3d 20 73 74 72 72 63   }..  cp = strrc
19a00 68 72 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  hr(lemp->filenam
19a10 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70  e,'.');.  if( cp
19a20 20 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70   ){.    lemon_sp
19a30 72 69 6e 74 66 28 62 75 66 2c 22 25 2e 2a 73 2e  rintf(buf,"%.*s.
19a40 6c 74 22 2c 28 69 6e 74 29 28 63 70 2d 6c 65 6d  lt",(int)(cp-lem
19a50 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c 6c 65 6d  p->filename),lem
19a60 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
19a70 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 65 6d 6f 6e  }else{.    lemon
19a80 5f 73 70 72 69 6e 74 66 28 62 75 66 2c 22 25 73  _sprintf(buf,"%s
19a90 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  .lt",lemp->filen
19aa0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ame);.  }.  if( 
19ab0 61 63 63 65 73 73 28 62 75 66 2c 30 30 34 29 3d  access(buf,004)=
19ac0 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e 61  =0 ){.    tpltna
19ad0 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d 65 6c 73  me = buf;.  }els
19ae0 65 20 69 66 28 20 61 63 63 65 73 73 28 74 65 6d  e if( access(tem
19af0 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29 3d 3d  platename,004)==
19b00 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d  0 ){.    tpltnam
19b10 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65  e = templatename
19b20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
19b30 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74 68 73 65  pltname = pathse
19b40 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72 67 76 30  arch(lemp->argv0
19b50 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 29  ,templatename,0)
19b60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 70 6c 74  ;.  }.  if( tplt
19b70 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66  name==0 ){.    f
19b80 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
19b90 61 6e 27 74 20 66 69 6e 64 20 74 68 65 20 70 61  an't find the pa
19ba0 72 73 65 72 20 64 72 69 76 65 72 20 74 65 6d 70  rser driver temp
19bb0 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22  late file \"%s\"
19bc0 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d 70 6c 61  .\n",.    templa
19bd0 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d  tename);.    lem
19be0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
19bf0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
19c00 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 74 70  .  in = fopen(tp
19c10 6c 74 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20  ltname,"rb");.  
19c20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  if( in==0 ){.   
19c30 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
19c40 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 65 20  "Can't open the 
19c50 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22  template file \"
19c60 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70 6c 61 74  %s\".\n",templat
19c70 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70  ename);.    lemp
19c80 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
19c90 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
19ca0 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 7d 0a 0a    return in;.}..
19cb0 2f 2a 20 50 72 69 6e 74 20 61 20 23 6c 69 6e 65  /* Print a #line
19cc0 20 64 69 72 65 63 74 69 76 65 20 6c 69 6e 65 20   directive line 
19cd0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 66 69  to the output fi
19ce0 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  le. */.PRIVATE v
19cf0 6f 69 64 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  oid tplt_linedir
19d00 28 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74 20  (FILE *out, int 
19d10 6c 69 6e 65 6e 6f 2c 20 63 68 61 72 20 2a 66 69  lineno, char *fi
19d20 6c 65 6e 61 6d 65 29 0a 7b 0a 20 20 66 70 72 69  lename).{.  fpri
19d30 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25  ntf(out,"#line %
19d40 64 20 5c 22 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20  d \"",lineno);. 
19d50 20 77 68 69 6c 65 28 20 2a 66 69 6c 65 6e 61 6d   while( *filenam
19d60 65 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 66 69  e ){.    if( *fi
19d70 6c 65 6e 61 6d 65 20 3d 3d 20 27 5c 5c 27 20 29  lename == '\\' )
19d80 20 70 75 74 63 28 27 5c 5c 27 2c 6f 75 74 29 3b   putc('\\',out);
19d90 0a 20 20 20 20 70 75 74 63 28 2a 66 69 6c 65 6e  .    putc(*filen
19da0 61 6d 65 2c 6f 75 74 29 3b 0a 20 20 20 20 66 69  ame,out);.    fi
19db0 6c 65 6e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 20 20  lename++;.  }.  
19dc0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 5c  fprintf(out,"\"\
19dd0 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74  n");.}../* Print
19de0 20 61 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65   a string to the
19df0 20 66 69 6c 65 20 61 6e 64 20 6b 65 65 70 20 74   file and keep t
19e00 68 65 20 6c 69 6e 65 6e 75 6d 62 65 72 20 75 70  he linenumber up
19e10 20 74 6f 20 64 61 74 65 20 2a 2f 0a 50 52 49 56   to date */.PRIV
19e20 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 70 72  ATE void tplt_pr
19e30 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73  int(FILE *out, s
19e40 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
19e50 70 2c 20 63 68 61 72 20 2a 73 74 72 2c 20 69 6e  p, char *str, in
19e60 74 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20 69  t *lineno).{.  i
19e70 66 28 20 73 74 72 3d 3d 30 20 29 20 72 65 74 75  f( str==0 ) retu
19e80 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 2a 73 74  rn;.  while( *st
19e90 72 20 29 7b 0a 20 20 20 20 70 75 74 63 28 2a 73  r ){.    putc(*s
19ea0 74 72 2c 6f 75 74 29 3b 0a 20 20 20 20 69 66 28  tr,out);.    if(
19eb0 20 2a 73 74 72 3d 3d 27 5c 6e 27 20 29 20 28 2a   *str=='\n' ) (*
19ec0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 73  lineno)++;.    s
19ed0 74 72 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  tr++;.  }.  if( 
19ee0 73 74 72 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b  str[-1]!='\n' ){
19ef0 0a 20 20 20 20 70 75 74 63 28 27 5c 6e 27 2c 6f  .    putc('\n',o
19f00 75 74 29 3b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e  ut);.    (*linen
19f10 6f 29 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 20 28  o)++;.  }.  if (
19f20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73  !lemp->nolinenos
19f30 66 6c 61 67 29 20 7b 0a 20 20 20 20 28 2a 6c 69  flag) {.    (*li
19f40 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69  neno)++; tplt_li
19f50 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e  nedir(out,*linen
19f60 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29  o,lemp->outname)
19f70 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  ; .  }.  return;
19f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
19f90 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
19fa0 65 6d 69 74 73 20 63 6f 64 65 20 66 6f 72 20 74  emits code for t
19fb0 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
19fc0 72 20 74 68 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20  r the.** symbol 
19fd0 73 70 0a 2a 2f 0a 76 6f 69 64 20 65 6d 69 74 5f  sp.*/.void emit_
19fe0 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28  destructor_code(
19ff0 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20 20  .  FILE *out,.  
1a000 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
1a010 70 2c 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  p,.  struct lemo
1a020 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 2a  n *lemp,.  int *
1a030 6c 69 6e 65 6e 6f 0a 29 7b 0a 20 63 68 61 72 20  lineno.){. char 
1a040 2a 63 70 20 3d 20 30 3b 0a 0a 20 69 66 28 20 73  *cp = 0;.. if( s
1a050 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
1a060 4c 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d  L ){.   cp = lem
1a070 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20 20  p->tokendest;.  
1a080 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74   if( cp==0 ) ret
1a090 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28  urn;.   fprintf(
1a0a0 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69  out,"{\n"); (*li
1a0b0 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 20  neno)++;. }else 
1a0c0 69 66 28 20 73 70 2d 3e 64 65 73 74 72 75 63 74  if( sp->destruct
1a0d0 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d 20 73 70  or ){.   cp = sp
1a0e0 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20  ->destructor;.  
1a0f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c   fprintf(out,"{\
1a100 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n"); (*lineno)++
1a110 3b 0a 20 20 20 69 66 28 20 21 6c 65 6d 70 2d 3e  ;.   if( !lemp->
1a120 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 29 7b  nolinenosflag ){
1a130 0a 20 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b  .     (*lineno)+
1a140 2b 3b 0a 20 20 20 20 20 74 70 6c 74 5f 6c 69 6e  +;.     tplt_lin
1a150 65 64 69 72 28 6f 75 74 2c 73 70 2d 3e 64 65 73  edir(out,sp->des
1a160 74 4c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 66 69  tLineno,lemp->fi
1a170 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a 20 7d  lename);.   }. }
1a180 65 6c 73 65 20 69 66 28 20 6c 65 6d 70 2d 3e 76  else if( lemp->v
1a190 61 72 64 65 73 74 20 29 7b 0a 20 20 20 63 70 20  ardest ){.   cp 
1a1a0 3d 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 3b  = lemp->vardest;
1a1b0 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20  .   if( cp==0 ) 
1a1c0 72 65 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e  return;.   fprin
1a1d0 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28  tf(out,"{\n"); (
1a1e0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c  *lineno)++;. }el
1a1f0 73 65 7b 0a 20 20 20 61 73 73 65 72 74 28 20 30  se{.   assert( 0
1a200 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68   );  /* Cannot h
1a210 61 70 70 65 6e 20 2a 2f 0a 20 7d 0a 20 66 6f 72  appen */. }. for
1a220 28 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20  (; *cp; cp++){. 
1a230 20 20 69 66 28 20 2a 63 70 3d 3d 27 24 27 20 26    if( *cp=='$' &
1a240 26 20 63 70 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a  & cp[1]=='$' ){.
1a250 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1a260 2c 22 28 79 79 70 6d 69 6e 6f 72 2d 3e 79 79 25  ,"(yypminor->yy%
1a270 64 29 22 2c 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a  d)",sp->dtnum);.
1a280 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
1a290 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 7d 0a 20  continue;.   }. 
1a2a0 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20    if( *cp=='\n' 
1a2b0 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20  ) (*lineno)++;. 
1a2c0 20 20 66 70 75 74 63 28 2a 63 70 2c 6f 75 74 29    fputc(*cp,out)
1a2d0 3b 0a 20 7d 0a 20 66 70 72 69 6e 74 66 28 6f 75  ;. }. fprintf(ou
1a2e0 74 2c 22 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e  t,"\n"); (*linen
1a2f0 6f 29 2b 2b 3b 0a 20 69 66 20 28 21 6c 65 6d 70  o)++;. if (!lemp
1a300 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29  ->nolinenosflag)
1a310 20 7b 20 0a 20 20 20 28 2a 6c 69 6e 65 6e 6f 29   { .   (*lineno)
1a320 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  ++; tplt_linedir
1a330 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d  (out,*lineno,lem
1a340 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 7d  p->outname); . }
1a350 0a 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d  . fprintf(out,"}
1a360 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n"); (*lineno)+
1a370 2b 3b 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  +;. return;.}../
1a380 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1a390 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74   (non-zero) if t
1a3a0 68 65 20 67 69 76 65 6e 20 73 79 6d 62 6f 6c 20  he given symbol 
1a3b0 68 61 73 20 61 20 64 65 73 74 72 75 63 74 6f 72  has a destructor
1a3c0 2e 0a 2a 2f 0a 69 6e 74 20 68 61 73 5f 64 65 73  ..*/.int has_des
1a3d0 74 72 75 63 74 6f 72 28 73 74 72 75 63 74 20 73  tructor(struct s
1a3e0 79 6d 62 6f 6c 20 2a 73 70 2c 20 73 74 72 75 63  ymbol *sp, struc
1a3f0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
1a400 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 69 66  .  int ret;.  if
1a410 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  ( sp->type==TERM
1a420 49 4e 41 4c 20 29 7b 0a 20 20 20 20 72 65 74 20  INAL ){.    ret 
1a430 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73  = lemp->tokendes
1a440 74 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  t!=0;.  }else{. 
1a450 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 76     ret = lemp->v
1a460 61 72 64 65 73 74 21 3d 30 20 7c 7c 20 73 70 2d  ardest!=0 || sp-
1a470 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30 3b 0a  >destructor!=0;.
1a480 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
1a490 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1a4a0 64 20 74 65 78 74 20 74 6f 20 61 20 64 79 6e 61  d text to a dyna
1a4b0 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
1a4c0 64 20 73 74 72 69 6e 67 2e 20 20 49 66 20 7a 54  d string.  If zT
1a4d0 65 78 74 20 69 73 20 30 20 74 68 65 6e 0a 2a 2a  ext is 0 then.**
1a4e0 20 72 65 73 65 74 20 74 68 65 20 73 74 72 69 6e   reset the strin
1a4f0 67 20 74 6f 20 62 65 20 65 6d 70 74 79 20 61 67  g to be empty ag
1a500 61 69 6e 2e 20 20 41 6c 77 61 79 73 20 72 65 74  ain.  Always ret
1a510 75 72 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  urn the complete
1a520 20 74 65 78 74 0a 2a 2a 20 6f 66 20 74 68 65 20   text.** of the 
1a530 73 74 72 69 6e 67 20 28 77 68 69 63 68 20 69 73  string (which is
1a540 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74   overwritten wit
1a550 68 20 65 61 63 68 20 63 61 6c 6c 29 2e 0a 2a 2a  h each call)..**
1a560 0a 2a 2a 20 6e 20 62 79 74 65 73 20 6f 66 20 7a  .** n bytes of z
1a570 54 65 78 74 20 61 72 65 20 73 74 6f 72 65 64 2e  Text are stored.
1a580 20 20 49 66 20 6e 3d 3d 30 20 74 68 65 6e 20 61    If n==0 then a
1a590 6c 6c 20 6f 66 20 7a 54 65 78 74 20 75 70 20 74  ll of zText up t
1a5a0 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 5c  o the first.** \
1a5b0 30 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 69  000 terminator i
1a5c0 73 20 73 74 6f 72 65 64 2e 20 20 7a 54 65 78 74  s stored.  zText
1a5d0 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20 75 70 20   can contain up 
1a5e0 74 6f 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73  to two instances
1a5f0 20 6f 66 0a 2a 2a 20 25 64 2e 20 20 54 68 65 20   of.** %d.  The 
1a600 76 61 6c 75 65 73 20 6f 66 20 70 31 20 61 6e 64  values of p1 and
1a610 20 70 32 20 61 72 65 20 77 72 69 74 74 65 6e 20   p2 are written 
1a620 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 20 61  into the first a
1a630 6e 64 20 73 65 63 6f 6e 64 0a 2a 2a 20 25 64 2e  nd second.** %d.
1a640 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 2d 31 2c  .**.** If n==-1,
1a650 20 74 68 65 6e 20 74 68 65 20 70 72 65 76 69 6f   then the previo
1a660 75 73 20 63 68 61 72 61 63 74 65 72 20 69 73 20  us character is 
1a670 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a  overwritten..*/.
1a680 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 61 70  PRIVATE char *ap
1a690 70 65 6e 64 5f 73 74 72 28 63 6f 6e 73 74 20 63  pend_str(const c
1a6a0 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20  har *zText, int 
1a6b0 6e 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  n, int p1, int p
1a6c0 32 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  2){.  static cha
1a6d0 72 20 65 6d 70 74 79 5b 31 5d 20 3d 20 7b 20 30  r empty[1] = { 0
1a6e0 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61   };.  static cha
1a6f0 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 73 74 61 74  r *z = 0;.  stat
1a700 69 63 20 69 6e 74 20 61 6c 6c 6f 63 65 64 20 3d  ic int alloced =
1a710 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
1a720 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74   used = 0;.  int
1a730 20 63 3b 0a 20 20 63 68 61 72 20 7a 49 6e 74 5b   c;.  char zInt[
1a740 34 30 5d 3b 0a 20 20 69 66 28 20 7a 54 65 78 74  40];.  if( zText
1a750 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 75  ==0 ){.    if( u
1a760 73 65 64 3d 3d 30 20 26 26 20 7a 21 3d 30 20 29  sed==0 && z!=0 )
1a770 20 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 75   z[0] = 0;.    u
1a780 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  sed = 0;.    ret
1a790 75 72 6e 20 7a 3b 0a 20 20 7d 0a 20 20 69 66 28  urn z;.  }.  if(
1a7a0 20 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28   n<=0 ){.    if(
1a7b0 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 73   n<0 ){.      us
1a7c0 65 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 61  ed += n;.      a
1a7d0 73 73 65 72 74 28 20 75 73 65 64 3e 3d 30 20 29  ssert( used>=0 )
1a7e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
1a7f0 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 54 65 78  lemonStrlen(zTex
1a800 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69  t);.  }.  if( (i
1a810 6e 74 29 20 28 6e 2b 73 69 7a 65 6f 66 28 7a 49  nt) (n+sizeof(zI
1a820 6e 74 29 2a 32 2b 75 73 65 64 29 20 3e 3d 20 61  nt)*2+used) >= a
1a830 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 61 6c  lloced ){.    al
1a840 6c 6f 63 65 64 20 3d 20 6e 20 2b 20 73 69 7a 65  loced = n + size
1a850 6f 66 28 7a 49 6e 74 29 2a 32 20 2b 20 75 73 65  of(zInt)*2 + use
1a860 64 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 20 3d  d + 200;.    z =
1a870 20 28 63 68 61 72 20 2a 29 20 72 65 61 6c 6c 6f   (char *) reallo
1a880 63 28 7a 2c 20 20 61 6c 6c 6f 63 65 64 29 3b 0a  c(z,  alloced);.
1a890 20 20 7d 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29    }.  if( z==0 )
1a8a0 20 72 65 74 75 72 6e 20 65 6d 70 74 79 3b 0a 20   return empty;. 
1a8b0 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20   while( n-- > 0 
1a8c0 29 7b 0a 20 20 20 20 63 20 3d 20 2a 28 7a 54 65  ){.    c = *(zTe
1a8d0 78 74 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63  xt++);.    if( c
1a8e0 3d 3d 27 25 27 20 26 26 20 6e 3e 30 20 26 26 20  =='%' && n>0 && 
1a8f0 7a 54 65 78 74 5b 30 5d 3d 3d 27 64 27 20 29 7b  zText[0]=='d' ){
1a900 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72  .      lemon_spr
1a910 69 6e 74 66 28 7a 49 6e 74 2c 20 22 25 64 22 2c  intf(zInt, "%d",
1a920 20 70 31 29 3b 0a 20 20 20 20 20 20 70 31 20 3d   p1);.      p1 =
1a930 20 70 32 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e   p2;.      lemon
1a940 5f 73 74 72 63 70 79 28 26 7a 5b 75 73 65 64 5d  _strcpy(&z[used]
1a950 2c 20 7a 49 6e 74 29 3b 0a 20 20 20 20 20 20 75  , zInt);.      u
1a960 73 65 64 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c  sed += lemonStrl
1a970 65 6e 28 26 7a 5b 75 73 65 64 5d 29 3b 0a 20 20  en(&z[used]);.  
1a980 20 20 20 20 7a 54 65 78 74 2b 2b 3b 0a 20 20 20      zText++;.   
1a990 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73     n--;.    }els
1a9a0 65 7b 0a 20 20 20 20 20 20 7a 5b 75 73 65 64 2b  e{.      z[used+
1a9b0 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a 20 20  +] = (char)c;.  
1a9c0 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b 75 73 65 64    }.  }.  z[used
1a9d0 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
1a9e0 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  z;.}../*.** Writ
1a9f0 65 20 61 6e 64 20 74 72 61 6e 73 66 6f 72 6d 20  e and transform 
1aa00 74 68 65 20 72 70 2d 3e 63 6f 64 65 20 73 74 72  the rp->code str
1aa10 69 6e 67 20 73 6f 20 74 68 61 74 20 73 79 6d 62  ing so that symb
1aa20 6f 6c 73 20 61 72 65 20 65 78 70 61 6e 64 65 64  ols are expanded
1aa30 2e 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68  ..** Populate th
1aa40 65 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78  e rp->codePrefix
1aa50 20 61 6e 64 20 72 70 2d 3e 63 6f 64 65 53 75 66   and rp->codeSuf
1aa60 66 69 78 20 73 74 72 69 6e 67 73 2c 20 61 73 20  fix strings, as 
1aa70 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 0a  appropriate..**.
1aa80 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  ** Return 1 if t
1aa90 68 65 20 65 78 70 61 6e 64 65 64 20 63 6f 64 65  he expanded code
1aaa0 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 22   requires that "
1aab0 79 79 6c 68 73 6d 69 6e 6f 72 22 20 6c 6f 63 61  yylhsminor" loca
1aac0 6c 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 74 6f  l variable.** to
1aad0 20 62 65 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   be defined..*/.
1aae0 50 52 49 56 41 54 45 20 69 6e 74 20 74 72 61 6e  PRIVATE int tran
1aaf0 73 6c 61 74 65 5f 63 6f 64 65 28 73 74 72 75 63  slate_code(struc
1ab00 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73  t lemon *lemp, s
1ab10 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b  truct rule *rp){
1ab20 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 78 70  .  char *cp, *xp
1ab30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
1ab40 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1ab50 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 79      /* True if y
1ab60 79 6c 68 73 6d 69 6e 6f 72 20 69 73 20 75 73 65  ylhsminor is use
1ab70 64 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 6e 74 55  d */.  int dontU
1ab80 73 65 52 68 73 30 20 3d 20 30 3b 20 20 20 2f 2a  seRhs0 = 0;   /*
1ab90 20 49 66 20 74 72 75 65 2c 20 75 73 65 20 6f 66   If true, use of
1aba0 20 6c 65 66 74 2d 6d 6f 73 74 20 52 48 53 20 6c   left-most RHS l
1abb0 61 62 65 6c 20 69 73 20 69 6c 6c 65 67 61 6c 20  abel is illegal 
1abc0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1abd0 2a 7a 53 6b 69 70 20 3d 20 30 3b 20 2f 2a 20 54  *zSkip = 0; /* T
1abe0 68 65 20 7a 4f 76 77 72 74 20 63 6f 6d 6d 65 6e  he zOvwrt commen
1abf0 74 20 77 69 74 68 69 6e 20 72 70 2d 3e 63 6f 64  t within rp->cod
1ac00 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
1ac10 63 68 61 72 20 6c 68 73 75 73 65 64 20 3d 20 30  char lhsused = 0
1ac20 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ;      /* True i
1ac30 66 20 74 68 65 20 4c 48 53 20 65 6c 65 6d 65 6e  f the LHS elemen
1ac40 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20  t has been used 
1ac50 2a 2f 0a 20 20 63 68 61 72 20 6c 68 73 64 69 72  */.  char lhsdir
1ac60 65 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ect;        /* T
1ac70 72 75 65 20 69 66 20 4c 48 53 20 77 72 69 74 65  rue if LHS write
1ac80 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
1ac90 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20  stack */.  char 
1aca0 75 73 65 64 5b 4d 41 58 52 48 53 5d 3b 20 20 20  used[MAXRHS];   
1acb0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 65 61    /* True for ea
1acc0 63 68 20 52 48 53 20 65 6c 65 6d 65 6e 74 20 77  ch RHS element w
1acd0 68 69 63 68 20 69 73 20 75 73 65 64 20 2a 2f 0a  hich is used */.
1ace0 20 20 63 68 61 72 20 7a 4c 68 73 5b 35 30 5d 3b    char zLhs[50];
1acf0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76           /* Conv
1ad00 65 72 74 20 74 68 65 20 4c 48 53 20 73 79 6d 62  ert the LHS symb
1ad10 6f 6c 20 69 6e 74 6f 20 74 68 69 73 20 73 74 72  ol into this str
1ad20 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4f  ing */.  char zO
1ad30 76 77 72 74 5b 39 30 30 5d 3b 20 20 20 20 20 20  vwrt[900];      
1ad40 2f 2a 20 43 6f 6d 6d 65 6e 74 20 74 68 61 74 20  /* Comment that 
1ad50 74 6f 20 61 6c 6c 6f 77 20 4c 48 53 20 74 6f 20  to allow LHS to 
1ad60 6f 76 65 72 77 72 69 74 65 20 52 48 53 20 2a 2f  overwrite RHS */
1ad70 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72  ..  for(i=0; i<r
1ad80 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75 73  p->nrhs; i++) us
1ad90 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 6c 68 73  ed[i] = 0;.  lhs
1ada0 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28  used = 0;..  if(
1adb0 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 7b 0a   rp->code==0 ){.
1adc0 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
1add0 6e 65 77 6c 69 6e 65 73 74 72 5b 32 5d 20 3d 20  newlinestr[2] = 
1ade0 7b 20 27 5c 6e 27 2c 20 27 5c 30 27 20 7d 3b 0a  { '\n', '\0' };.
1adf0 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 6e      rp->code = n
1ae00 65 77 6c 69 6e 65 73 74 72 3b 0a 20 20 20 20 72  ewlinestr;.    r
1ae10 70 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d 3e 72 75  p->line = rp->ru
1ae20 6c 65 6c 69 6e 65 3b 0a 20 20 20 20 72 70 2d 3e  leline;.    rp->
1ae30 6e 6f 43 6f 64 65 20 3d 20 31 3b 0a 20 20 7d 65  noCode = 1;.  }e
1ae40 6c 73 65 7b 0a 20 20 20 20 72 70 2d 3e 6e 6f 43  lse{.    rp->noC
1ae50 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 0a 20  ode = 0;.  }... 
1ae60 20 69 66 28 20 72 70 2d 3e 6e 72 68 73 3d 3d 30   if( rp->nrhs==0
1ae70 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1ae80 65 72 65 20 61 72 65 20 6e 6f 20 52 48 53 20 73  ere are no RHS s
1ae90 79 6d 62 6f 6c 73 2c 20 74 68 65 6e 20 77 72 69  ymbols, then wri
1aea0 74 69 6e 67 20 64 69 72 65 63 74 6c 79 20 74 6f  ting directly to
1aeb0 20 74 68 65 20 4c 48 53 20 69 73 20 6f 6b 20 2a   the LHS is ok *
1aec0 2f 0a 20 20 20 20 6c 68 73 64 69 72 65 63 74 20  /.    lhsdirect 
1aed0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
1aee0 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d   rp->rhsalias[0]
1aef0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1af00 65 20 6c 65 66 74 2d 6d 6f 73 74 20 52 48 53 20  e left-most RHS 
1af10 73 79 6d 62 6f 6c 20 68 61 73 20 6e 6f 20 76 61  symbol has no va
1af20 6c 75 65 2e 20 20 4c 48 53 20 64 69 72 65 63 74  lue.  LHS direct
1af30 20 69 73 20 6f 6b 2e 20 20 42 75 74 0a 20 20 20   is ok.  But.   
1af40 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 63   ** we have to c
1af50 61 6c 6c 20 74 68 65 20 64 69 73 74 72 75 63 74  all the distruct
1af60 6f 72 20 6f 6e 20 74 68 65 20 52 48 53 20 73 79  or on the RHS sy
1af70 6d 62 6f 6c 20 66 69 72 73 74 2e 20 2a 2f 0a 20  mbol first. */. 
1af80 20 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20 31     lhsdirect = 1
1af90 3b 0a 20 20 20 20 69 66 28 20 68 61 73 5f 64 65  ;.    if( has_de
1afa0 73 74 72 75 63 74 6f 72 28 72 70 2d 3e 72 68 73  structor(rp->rhs
1afb0 5b 30 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20 20  [0],lemp) ){.   
1afc0 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c     append_str(0,
1afd0 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 61 70  0,0,0);.      ap
1afe0 70 65 6e 64 5f 73 74 72 28 22 20 20 79 79 5f 64  pend_str("  yy_d
1aff0 65 73 74 72 75 63 74 6f 72 28 79 79 70 50 61 72  estructor(yypPar
1b000 73 65 72 2c 25 64 2c 26 79 79 6d 73 70 5b 25 64  ser,%d,&yymsp[%d
1b010 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e 22 2c 20 30 2c  ].minor);\n", 0,
1b020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b030 20 20 72 70 2d 3e 72 68 73 5b 30 5d 2d 3e 69 6e    rp->rhs[0]->in
1b040 64 65 78 2c 31 2d 72 70 2d 3e 6e 72 68 73 29 3b  dex,1-rp->nrhs);
1b050 0a 20 20 20 20 20 20 72 70 2d 3e 63 6f 64 65 50  .      rp->codeP
1b060 72 65 66 69 78 20 3d 20 53 74 72 73 61 66 65 28  refix = Strsafe(
1b070 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30  append_str(0,0,0
1b080 2c 30 29 29 3b 0a 20 20 20 20 20 20 72 70 2d 3e  ,0));.      rp->
1b090 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  noCode = 0;.    
1b0a0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70  }.  }else if( rp
1b0b0 2d 3e 6c 68 73 61 6c 69 61 73 3d 3d 30 20 29 7b  ->lhsalias==0 ){
1b0c0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73  .    /* There is
1b0d0 20 6e 6f 20 4c 48 53 20 76 61 6c 75 65 20 73 79   no LHS value sy
1b0e0 6d 62 6f 6c 2e 20 2a 2f 0a 20 20 20 20 6c 68 73  mbol. */.    lhs
1b0f0 64 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 7d 65  direct = 1;.  }e
1b100 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 72  lse if( strcmp(r
1b110 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e  p->lhsalias,rp->
1b120 72 68 73 61 6c 69 61 73 5b 30 5d 29 3d 3d 30 20  rhsalias[0])==0 
1b130 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4c 48  ){.    /* The LH
1b140 53 20 73 79 6d 62 6f 6c 20 61 6e 64 20 74 68 65  S symbol and the
1b150 20 6c 65 66 74 2d 6d 6f 73 74 20 52 48 53 20 73   left-most RHS s
1b160 79 6d 62 6f 6c 20 61 72 65 20 74 68 65 20 73 61  ymbol are the sa
1b170 6d 65 2c 20 73 6f 20 0a 20 20 20 20 2a 2a 20 64  me, so .    ** d
1b180 69 72 65 63 74 20 77 72 69 74 69 6e 67 20 69 73  irect writing is
1b190 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 20 20   allowed */.    
1b1a0 6c 68 73 64 69 72 65 63 74 20 3d 20 31 3b 0a 20  lhsdirect = 1;. 
1b1b0 20 20 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a     lhsused = 1;.
1b1c0 20 20 20 20 75 73 65 64 5b 30 5d 20 3d 20 31 3b      used[0] = 1;
1b1d0 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73  .    if( rp->lhs
1b1e0 2d 3e 64 74 6e 75 6d 21 3d 72 70 2d 3e 72 68 73  ->dtnum!=rp->rhs
1b1f0 5b 30 5d 2d 3e 64 74 6e 75 6d 20 29 7b 0a 20 20  [0]->dtnum ){.  
1b200 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
1b210 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
1b220 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20  ruleline,.      
1b230 20 20 22 25 73 28 25 73 29 20 61 6e 64 20 25 73    "%s(%s) and %s
1b240 28 25 73 29 20 73 68 61 72 65 20 74 68 65 20 73  (%s) share the s
1b250 61 6d 65 20 6c 61 62 65 6c 20 62 75 74 20 68 61  ame label but ha
1b260 76 65 20 22 0a 20 20 20 20 20 20 20 20 22 64 69  ve ".        "di
1b270 66 66 65 72 65 6e 74 20 64 61 74 61 74 79 70 65  fferent datatype
1b280 73 2e 22 2c 0a 20 20 20 20 20 20 20 20 72 70 2d  s.",.        rp-
1b290 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e  >lhs->name, rp->
1b2a0 6c 68 73 61 6c 69 61 73 2c 20 72 70 2d 3e 72 68  lhsalias, rp->rh
1b2b0 73 5b 30 5d 2d 3e 6e 61 6d 65 2c 20 72 70 2d 3e  s[0]->name, rp->
1b2c0 72 68 73 61 6c 69 61 73 5b 30 5d 29 3b 0a 20 20  rhsalias[0]);.  
1b2d0 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
1b2e0 6e 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 20 20 0a  nt++;.    }    .
1b2f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 65 6d    }else{.    lem
1b300 6f 6e 5f 73 70 72 69 6e 74 66 28 7a 4f 76 77 72  on_sprintf(zOvwr
1b310 74 2c 20 22 2f 2a 25 73 2d 6f 76 65 72 77 72 69  t, "/*%s-overwri
1b320 74 65 73 2d 25 73 2a 2f 22 2c 0a 20 20 20 20 20  tes-%s*/",.     
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d               rp-
1b340 3e 6c 68 73 61 6c 69 61 73 2c 20 72 70 2d 3e 72  >lhsalias, rp->r
1b350 68 73 61 6c 69 61 73 5b 30 5d 29 3b 0a 20 20 20  hsalias[0]);.   
1b360 20 7a 53 6b 69 70 20 3d 20 73 74 72 73 74 72 28   zSkip = strstr(
1b370 72 70 2d 3e 63 6f 64 65 2c 20 7a 4f 76 77 72 74  rp->code, zOvwrt
1b380 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 6b 69 70  );.    if( zSkip
1b390 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
1b3a0 54 68 65 20 63 6f 64 65 20 63 6f 6e 74 61 69 6e  The code contain
1b3b0 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6d 6d  s a special comm
1b3c0 65 6e 74 20 74 68 61 74 20 69 6e 64 69 63 61 74  ent that indicat
1b3d0 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61  es that it is sa
1b3e0 66 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  fe.      ** for 
1b3f0 74 68 65 20 4c 48 53 20 6c 61 62 65 6c 20 74 6f  the LHS label to
1b400 20 6f 76 65 72 77 72 69 74 65 20 6c 65 66 74 2d   overwrite left-
1b410 6d 6f 73 74 20 52 48 53 20 6c 61 62 65 6c 2e 20  most RHS label. 
1b420 2a 2f 0a 20 20 20 20 20 20 6c 68 73 64 69 72 65  */.      lhsdire
1b430 63 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ct = 1;.    }els
1b440 65 7b 0a 20 20 20 20 20 20 6c 68 73 64 69 72 65  e{.      lhsdire
1b450 63 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ct = 0;.    }.  
1b460 7d 0a 20 20 69 66 28 20 6c 68 73 64 69 72 65 63  }.  if( lhsdirec
1b470 74 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  t ){.    sprintf
1b480 28 7a 4c 68 73 2c 20 22 79 79 6d 73 70 5b 25 64  (zLhs, "yymsp[%d
1b490 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 31 2d  ].minor.yy%d",1-
1b4a0 72 70 2d 3e 6e 72 68 73 2c 72 70 2d 3e 6c 68 73  rp->nrhs,rp->lhs
1b4b0 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 7d 65 6c 73  ->dtnum);.  }els
1b4c0 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  e{.    rc = 1;. 
1b4d0 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 68 73 2c     sprintf(zLhs,
1b4e0 20 22 79 79 6c 68 73 6d 69 6e 6f 72 2e 79 79 25   "yylhsminor.yy%
1b4f0 64 22 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75  d",rp->lhs->dtnu
1b500 6d 29 3b 0a 20 20 7d 0a 0a 20 20 61 70 70 65 6e  m);.  }..  appen
1b510 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a  d_str(0,0,0,0);.
1b520 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74  .  /* This const
1b530 20 63 61 73 74 20 69 73 20 77 72 6f 6e 67 20 62   cast is wrong b
1b540 75 74 20 68 61 72 6d 6c 65 73 73 2c 20 69 66 20  ut harmless, if 
1b550 77 65 27 72 65 20 63 61 72 65 66 75 6c 2e 20 2a  we're careful. *
1b560 2f 0a 20 20 66 6f 72 28 63 70 3d 28 63 68 61 72  /.  for(cp=(char
1b570 20 2a 29 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70   *)rp->code; *cp
1b580 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; cp++){.    if(
1b590 20 63 70 3d 3d 7a 53 6b 69 70 20 29 7b 0a 20 20   cp==zSkip ){.  
1b5a0 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 7a      append_str(z
1b5b0 4f 76 77 72 74 2c 30 2c 30 2c 30 29 3b 0a 20 20  Ovwrt,0,0,0);.  
1b5c0 20 20 20 20 63 70 20 2b 3d 20 6c 65 6d 6f 6e 53      cp += lemonS
1b5d0 74 72 6c 65 6e 28 7a 4f 76 77 72 74 29 2d 31 3b  trlen(zOvwrt)-1;
1b5e0 0a 20 20 20 20 20 20 64 6f 6e 74 55 73 65 52 68  .      dontUseRh
1b5f0 73 30 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f  s0 = 1;.      co
1b600 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1b610 20 20 69 66 28 20 49 53 41 4c 50 48 41 28 2a 63    if( ISALPHA(*c
1b620 70 29 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63  p) && (cp==rp->c
1b630 6f 64 65 20 7c 7c 20 28 21 49 53 41 4c 4e 55 4d  ode || (!ISALNUM
1b640 28 63 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d  (cp[-1]) && cp[-
1b650 31 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20  1]!='_')) ){.   
1b660 20 20 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20     char saved;. 
1b670 20 20 20 20 20 66 6f 72 28 78 70 3d 20 26 63 70       for(xp= &cp
1b680 5b 31 5d 3b 20 49 53 41 4c 4e 55 4d 28 2a 78 70  [1]; ISALNUM(*xp
1b690 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20 78  ) || *xp=='_'; x
1b6a0 70 2b 2b 29 3b 0a 20 20 20 20 20 20 73 61 76 65  p++);.      save
1b6b0 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20 2a  d = *xp;.      *
1b6c0 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  xp = 0;.      if
1b6d0 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26  ( rp->lhsalias &
1b6e0 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e  & strcmp(cp,rp->
1b6f0 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a  lhsalias)==0 ){.
1b700 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73          append_s
1b710 74 72 28 7a 4c 68 73 2c 30 2c 30 2c 30 29 3b 0a  tr(zLhs,0,0,0);.
1b720 20 20 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b          cp = xp;
1b730 0a 20 20 20 20 20 20 20 20 6c 68 73 75 73 65 64  .        lhsused
1b740 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
1b750 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  e{.        for(i
1b760 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
1b770 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
1b780 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
1b790 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 63 70  [i] && strcmp(cp
1b7a0 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d  ,rp->rhsalias[i]
1b7b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1b7c0 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20      if( i==0 && 
1b7d0 64 6f 6e 74 55 73 65 52 68 73 30 20 29 7b 0a 20  dontUseRhs0 ){. 
1b7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 45 72 72               Err
1b7f0 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
1b800 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e  name,rp->rulelin
1b810 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1b820 20 20 20 20 22 4c 61 62 65 6c 20 25 73 20 75 73      "Label %s us
1b830 65 64 20 61 66 74 65 72 20 27 25 73 27 2e 22 2c  ed after '%s'.",
1b840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b850 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30    rp->rhsalias[0
1b860 5d 2c 20 7a 4f 76 77 72 74 29 3b 0a 20 20 20 20  ], zOvwrt);.    
1b870 20 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e            lemp->
1b880 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
1b890 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1b8a0 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64 65 20 26  ( cp!=rp->code &
1b8b0 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27 20 29 7b  & cp[-1]=='@' ){
1b8c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
1b8d0 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e  * If the argumen
1b8e0 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
1b8f0 20 40 58 20 74 68 65 6e 20 73 75 62 73 74 69 74   @X then substit
1b900 75 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  uted.           
1b910 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b 65 6e 20     ** the token 
1b920 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20 6e 6f 74  number of X, not
1b930 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 58 20   the value of X 
1b940 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1b950 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d   append_str("yym
1b960 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22 2c 2d 31  sp[%d].major",-1
1b970 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 30 29  ,i-rp->nrhs+1,0)
1b980 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
1b990 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1b9a0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1b9b0 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   *sp = rp->rhs[i
1b9c0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
1b9d0 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20 20 20 20   int dtnum;.    
1b9e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 70            if( sp
1b9f0 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
1ba00 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
1ba10 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20 3d           dtnum =
1ba20 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e   sp->subsym[0]->
1ba30 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  dtnum;.         
1ba40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e 75              dtnu
1ba60 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d 3b 0a 20  m = sp->dtnum;. 
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
1ba90 65 6e 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25  end_str("yymsp[%
1baa0 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30  d].minor.yy%d",0
1bab0 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 20 64  ,i-rp->nrhs+1, d
1bac0 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  tnum);.         
1bad0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1bae0 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20   cp = xp;.      
1baf0 20 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d 20        used[i] = 
1bb00 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  1;.            b
1bb10 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1bb20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1bb30 20 20 7d 0a 20 20 20 20 20 20 2a 78 70 20 3d 20    }.      *xp = 
1bb40 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  saved;.    }.   
1bb50 20 61 70 70 65 6e 64 5f 73 74 72 28 63 70 2c 20   append_str(cp, 
1bb60 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 20 2f 2a  1, 0, 0);.  } /*
1bb70 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20   End loop */..  
1bb80 2f 2a 20 4d 61 69 6e 20 63 6f 64 65 20 67 65 6e  /* Main code gen
1bb90 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65  eration complete
1bba0 64 20 2a 2f 0a 20 20 63 70 20 3d 20 61 70 70 65  d */.  cp = appe
1bbb0 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b  nd_str(0,0,0,0);
1bbc0 0a 20 20 69 66 28 20 63 70 20 26 26 20 63 70 5b  .  if( cp && cp[
1bbd0 30 5d 20 29 20 72 70 2d 3e 63 6f 64 65 20 3d 20  0] ) rp->code = 
1bbe0 53 74 72 73 61 66 65 28 63 70 29 3b 0a 20 20 61  Strsafe(cp);.  a
1bbf0 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c  ppend_str(0,0,0,
1bc00 30 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  0);..  /* Check 
1bc10 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
1bc20 20 4c 48 53 20 68 61 73 20 62 65 65 6e 20 75 73   LHS has been us
1bc30 65 64 20 2a 2f 0a 20 20 69 66 28 20 72 70 2d 3e  ed */.  if( rp->
1bc40 6c 68 73 61 6c 69 61 73 20 26 26 20 21 6c 68 73  lhsalias && !lhs
1bc50 75 73 65 64 20 29 7b 0a 20 20 20 20 45 72 72 6f  used ){.    Erro
1bc60 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
1bc70 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65  ame,rp->ruleline
1bc80 2c 0a 20 20 20 20 20 20 22 4c 61 62 65 6c 20 5c  ,.      "Label \
1bc90 22 25 73 5c 22 20 66 6f 72 20 5c 22 25 73 28 25  "%s\" for \"%s(%
1bca0 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73  s)\" is never us
1bcb0 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 20 72 70  ed.",.        rp
1bcc0 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 6c  ->lhsalias,rp->l
1bcd0 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73  hs->name,rp->lhs
1bce0 61 6c 69 61 73 29 3b 0a 20 20 20 20 6c 65 6d 70  alias);.    lemp
1bcf0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
1bd00 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
1bd10 20 64 65 73 74 72 75 63 74 6f 72 20 63 6f 64 65   destructor code
1bd20 20 66 6f 72 20 52 48 53 20 6d 69 6e 6f 72 20 76   for RHS minor v
1bd30 61 6c 75 65 73 20 77 68 69 63 68 20 61 72 65 20  alues which are 
1bd40 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 64 2e 0a  not referenced..
1bd50 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 65 72    ** Generate er
1bd60 72 6f 72 20 6d 65 73 73 61 67 65 73 20 66 6f 72  ror messages for
1bd70 20 75 6e 75 73 65 64 20 6c 61 62 65 6c 73 20 61   unused labels a
1bd80 6e 64 20 64 75 70 6c 69 63 61 74 65 20 6c 61 62  nd duplicate lab
1bd90 65 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  els..  */.  for(
1bda0 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
1bdb0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   i++){.    if( r
1bdc0 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 29  p->rhsalias[i] )
1bdd0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20  {.      if( i>0 
1bde0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  ){.        int j
1bdf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70  ;.        if( rp
1be00 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 73 74  ->lhsalias && st
1be10 72 63 6d 70 28 72 70 2d 3e 6c 68 73 61 6c 69 61  rcmp(rp->lhsalia
1be20 73 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  s,rp->rhsalias[i
1be30 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])==0 ){.       
1be40 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
1be50 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72  ->filename,rp->r
1be60 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20  uleline,.       
1be70 20 20 20 20 20 22 25 73 28 25 73 29 20 68 61 73       "%s(%s) has
1be80 20 74 68 65 20 73 61 6d 65 20 6c 61 62 65 6c 20   the same label 
1be90 61 73 20 74 68 65 20 4c 48 53 20 62 75 74 20 69  as the LHS but i
1bea0 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 2d 6d  s not the left-m
1beb0 6f 73 74 20 22 0a 20 20 20 20 20 20 20 20 20 20  ost ".          
1bec0 20 20 22 73 79 6d 62 6f 6c 20 6f 6e 20 74 68 65    "symbol on the
1bed0 20 52 48 53 2e 22 2c 0a 20 20 20 20 20 20 20 20   RHS.",.        
1bee0 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e      rp->rhs[i]->
1bef0 6e 61 6d 65 2c 20 72 70 2d 3e 72 68 73 61 6c 69  name, rp->rhsali
1bf00 61 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  as);.          l
1bf10 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
1bf20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bf30 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b     for(j=0; j<i;
1bf40 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
1bf50 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61   if( rp->rhsalia
1bf60 73 5b 6a 5d 20 26 26 20 73 74 72 63 6d 70 28 72  s[j] && strcmp(r
1bf70 70 2d 3e 72 68 73 61 6c 69 61 73 5b 6a 5d 2c 72  p->rhsalias[j],r
1bf80 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d  p->rhsalias[i])=
1bf90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1bfa0 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
1bfb0 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
1bfc0 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20  leline,.        
1bfd0 20 20 20 20 20 20 22 4c 61 62 65 6c 20 25 73 20        "Label %s 
1bfe0 75 73 65 64 20 66 6f 72 20 6d 75 6c 74 69 70 6c  used for multipl
1bff0 65 20 73 79 6d 62 6f 6c 73 20 6f 6e 20 74 68 65  e symbols on the
1c000 20 52 48 53 20 6f 66 20 61 20 72 75 6c 65 2e 22   RHS of a rule."
1c010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c020 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29  rp->rhsalias[i])
1c030 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  ;.            le
1c040 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
1c050 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1c060 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
1c070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c080 0a 20 20 20 20 20 20 69 66 28 20 21 75 73 65 64  .      if( !used
1c090 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 45  [i] ){.        E
1c0a0 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
1c0b0 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c  lename,rp->rulel
1c0c0 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  ine,.          "
1c0d0 4c 61 62 65 6c 20 25 73 20 66 6f 72 20 5c 22 25  Label %s for \"%
1c0e0 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72  s(%s)\" is never
1c0f0 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20   used.",.       
1c100 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b     rp->rhsalias[
1c110 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e  i],rp->rhs[i]->n
1c120 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  ame,rp->rhsalias
1c130 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6c 65  [i]);.        le
1c140 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
1c150 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1c160 65 20 69 66 28 20 69 3e 30 20 26 26 20 68 61 73  e if( i>0 && has
1c170 5f 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d 3e  _destructor(rp->
1c180 72 68 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b 0a  rhs[i],lemp) ){.
1c190 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
1c1a0 28 22 20 20 79 79 5f 64 65 73 74 72 75 63 74 6f  ("  yy_destructo
1c1b0 72 28 79 79 70 50 61 72 73 65 72 2c 25 64 2c 26  r(yypParser,%d,&
1c1c0 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29  yymsp[%d].minor)
1c1d0 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20 20  ;\n", 0,.       
1c1e0 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 69 6e    rp->rhs[i]->in
1c1f0 64 65 78 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  dex,i-rp->nrhs+1
1c200 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1c210 2f 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  /* If unable to 
1c220 77 72 69 74 65 20 4c 48 53 20 76 61 6c 75 65 73  write LHS values
1c230 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
1c240 68 65 20 73 74 61 63 6b 2c 20 77 72 69 74 65 20  he stack, write 
1c250 74 68 65 0a 20 20 2a 2a 20 73 61 76 65 64 20 4c  the.  ** saved L
1c260 48 53 20 76 61 6c 75 65 20 6e 6f 77 2e 20 2a 2f  HS value now. */
1c270 0a 20 20 69 66 28 20 6c 68 73 64 69 72 65 63 74  .  if( lhsdirect
1c280 3d 3d 30 20 29 7b 0a 20 20 20 20 61 70 70 65 6e  ==0 ){.    appen
1c290 64 5f 73 74 72 28 22 20 20 79 79 6d 73 70 5b 25  d_str("  yymsp[%
1c2a0 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 20 3d 20  d].minor.yy%d = 
1c2b0 22 2c 20 30 2c 20 31 2d 72 70 2d 3e 6e 72 68 73  ", 0, 1-rp->nrhs
1c2c0 2c 20 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d  , rp->lhs->dtnum
1c2d0 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 5f 73 74  );.    append_st
1c2e0 72 28 7a 4c 68 73 2c 20 30 2c 20 30 2c 20 30 29  r(zLhs, 0, 0, 0)
1c2f0 3b 0a 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72  ;.    append_str
1c300 28 22 3b 5c 6e 22 2c 20 30 2c 20 30 2c 20 30 29  (";\n", 0, 0, 0)
1c310 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 75 66 66  ;.  }..  /* Suff
1c320 69 78 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ix code generati
1c330 6f 6e 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20  on complete */. 
1c340 20 63 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72   cp = append_str
1c350 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 69 66 28  (0,0,0,0);.  if(
1c360 20 63 70 20 26 26 20 63 70 5b 30 5d 20 29 7b 0a   cp && cp[0] ){.
1c370 20 20 20 20 72 70 2d 3e 63 6f 64 65 53 75 66 66      rp->codeSuff
1c380 69 78 20 3d 20 53 74 72 73 61 66 65 28 63 70 29  ix = Strsafe(cp)
1c390 3b 0a 20 20 20 20 72 70 2d 3e 6e 6f 43 6f 64 65  ;.    rp->noCode
1c3a0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 0;.  }..  ret
1c3b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
1c3c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1c3d0 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
1c3e0 68 65 6e 20 74 68 65 20 72 75 6c 65 20 22 72 70  hen the rule "rp
1c3f0 22 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 57  " is reduced.  W
1c400 72 69 74 65 0a 2a 2a 20 74 68 65 20 63 6f 64 65  rite.** the code
1c410 20 74 6f 20 22 6f 75 74 22 2e 20 20 4d 61 6b 65   to "out".  Make
1c420 20 73 75 72 65 20 6c 69 6e 65 6e 6f 20 73 74 61   sure lineno sta
1c430 79 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a  ys up-to-date..*
1c440 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 65  /.PRIVATE void e
1c450 6d 69 74 5f 63 6f 64 65 28 0a 20 20 46 49 4c 45  mit_code(.  FILE
1c460 20 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63 74 20   *out,.  struct 
1c470 72 75 6c 65 20 2a 72 70 2c 0a 20 20 73 74 72 75  rule *rp,.  stru
1c480 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a  ct lemon *lemp,.
1c490 20 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a 29 7b    int *lineno.){
1c4a0 0a 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 70  . const char *cp
1c4b0 3b 0a 0a 20 2f 2a 20 53 65 74 75 70 20 63 6f 64  ;.. /* Setup cod
1c4c0 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 23  e prior to the #
1c4d0 6c 69 6e 65 20 64 69 72 65 63 74 69 76 65 20 2a  line directive *
1c4e0 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 50  /. if( rp->codeP
1c4f0 72 65 66 69 78 20 26 26 20 72 70 2d 3e 63 6f 64  refix && rp->cod
1c500 65 50 72 65 66 69 78 5b 30 5d 20 29 7b 0a 20 20  ePrefix[0] ){.  
1c510 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7b   fprintf(out, "{
1c520 25 73 22 2c 20 72 70 2d 3e 63 6f 64 65 50 72 65  %s", rp->codePre
1c530 66 69 78 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d  fix);.   for(cp=
1c540 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 3b 20  rp->codePrefix; 
1c550 2a 63 70 3b 20 63 70 2b 2b 29 7b 20 69 66 28 20  *cp; cp++){ if( 
1c560 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69  *cp=='\n' ) (*li
1c570 6e 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 7d 0a 0a 20  neno)++; }. }.. 
1c580 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1c590 20 74 6f 20 64 6f 20 74 68 65 20 72 65 64 75 63   to do the reduc
1c5a0 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28  e action */. if(
1c5b0 20 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20   rp->code ){.   
1c5c0 69 66 28 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e  if( !lemp->nolin
1c5d0 65 6e 6f 73 66 6c 61 67 20 29 7b 0a 20 20 20 20  enosflag ){.    
1c5e0 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
1c5f0 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28     tplt_linedir(
1c600 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d  out,rp->line,lem
1c610 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
1c620 20 7d 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75   }.   fprintf(ou
1c630 74 2c 22 7b 25 73 22 2c 72 70 2d 3e 63 6f 64 65  t,"{%s",rp->code
1c640 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d  );.   for(cp=rp-
1c650 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b  >code; *cp; cp++
1c660 29 7b 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27  ){ if( *cp=='\n'
1c670 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20   ) (*lineno)++; 
1c680 7d 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  }.   fprintf(out
1c690 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e  ,"}\n"); (*linen
1c6a0 6f 29 2b 2b 3b 0a 20 20 20 69 66 28 20 21 6c 65  o)++;.   if( !le
1c6b0 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  mp->nolinenosfla
1c6c0 67 20 29 7b 0a 20 20 20 20 20 28 2a 6c 69 6e 65  g ){.     (*line
1c6d0 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 74 70 6c 74  no)++;.     tplt
1c6e0 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69  _linedir(out,*li
1c6f0 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  neno,lemp->outna
1c700 6d 65 29 3b 0a 20 20 20 7d 0a 20 7d 0a 0a 20 2f  me);.   }. }.. /
1c710 2a 20 47 65 6e 65 72 61 74 65 20 62 72 65 61 6b  * Generate break
1c720 64 6f 77 6e 20 63 6f 64 65 20 74 68 61 74 20 6f  down code that o
1c730 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20  ccurs after the 
1c740 23 6c 69 6e 65 20 64 69 72 65 63 74 69 76 65 20  #line directive 
1c750 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65  */. if( rp->code
1c760 53 75 66 66 69 78 20 26 26 20 72 70 2d 3e 63 6f  Suffix && rp->co
1c770 64 65 53 75 66 66 69 78 5b 30 5d 20 29 7b 0a 20  deSuffix[0] ){. 
1c780 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1c790 25 73 22 2c 20 72 70 2d 3e 63 6f 64 65 53 75 66  %s", rp->codeSuf
1c7a0 66 69 78 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d  fix);.   for(cp=
1c7b0 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78 3b 20  rp->codeSuffix; 
1c7c0 2a 63 70 3b 20 63 70 2b 2b 29 7b 20 69 66 28 20  *cp; cp++){ if( 
1c7d0 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69  *cp=='\n' ) (*li
1c7e0 6e 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 7d 0a 0a 20  neno)++; }. }.. 
1c7f0 69 66 28 20 72 70 2d 3e 63 6f 64 65 50 72 65 66  if( rp->codePref
1c800 69 78 20 29 7b 0a 20 20 20 66 70 72 69 6e 74 66  ix ){.   fprintf
1c810 28 6f 75 74 2c 20 22 7d 5c 6e 22 29 3b 20 28 2a  (out, "}\n"); (*
1c820 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 0a 0a 20  lineno)++;. }.. 
1c830 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
1c840 20 50 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e   Print the defin
1c850 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69  ition of the uni
1c860 6f 6e 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  on used for the 
1c870 70 61 72 73 65 72 27 73 20 64 61 74 61 20 73 74  parser's data st
1c880 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69  ack..** This uni
1c890 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c  on contains fiel
1c8a0 64 73 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73  ds for every pos
1c8b0 73 69 62 6c 65 20 64 61 74 61 20 74 79 70 65 20  sible data type 
1c8c0 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e  for tokens.** an
1c8d0 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20  d nonterminals. 
1c8e0 20 49 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20   In the process 
1c8f0 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64  of computing and
1c900 20 70 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a   printing this.*
1c910 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65  * union, also se
1c920 74 20 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66  t the ".dtnum" f
1c930 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65  ield of every te
1c940 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65  rminal and nonte
1c950 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c  rminal.** symbol
1c960 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f  ..*/.void print_
1c970 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 0a 20 20 46  stack_union(.  F
1c980 49 4c 45 20 2a 6f 75 74 2c 20 20 20 20 20 20 20  ILE *out,       
1c990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c9a0 65 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20  e output stream 
1c9b0 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  */.  struct lemo
1c9c0 6e 20 2a 6c 65 6d 70 2c 20 20 20 20 20 20 20 20  n *lemp,        
1c9d0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66   /* The main inf
1c9e0 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  o structure for 
1c9f0 74 68 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 20  this parser */. 
1ca00 20 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 2c 20 20   int *plineno,  
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ca20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c  Pointer to the l
1ca30 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ine number */.  
1ca40 69 6e 74 20 6d 68 66 6c 61 67 20 20 20 20 20 20  int mhflag      
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ca60 72 75 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e  rue if generatin
1ca70 67 20 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75  g makeheaders ou
1ca80 74 70 75 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tput */.){.  int
1ca90 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65   lineno = *pline
1caa0 6e 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69  no;    /* The li
1cab0 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ne number of the
1cac0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61   output */.  cha
1cad0 72 20 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20  r **types;      
1cae0 20 20 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68         /* A hash
1caf0 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79   table of dataty
1cb00 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72  pes */.  int arr
1cb10 61 79 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  aysize;         
1cb20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1cb30 65 20 22 74 79 70 65 73 22 20 61 72 72 61 79 20  e "types" array 
1cb40 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65  */.  int maxdtle
1cb50 6e 67 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f  ngth;          /
1cb60 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68  * Maximum length
1cb70 20 6f 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79   of any ".dataty
1cb80 70 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  pe" field. */.  
1cb90 63 68 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20  char *stddt;    
1cba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
1cbb0 6e 64 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66  ndardized name f
1cbc0 6f 72 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f  or a datatype */
1cbd0 0a 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20  .  int i,j;     
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cbf0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1cc00 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 61 73 68  .  unsigned hash
1cc10 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1cc20 46 6f 72 20 68 61 73 68 69 6e 67 20 74 68 65 20  For hashing the 
1cc30 6e 61 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a  name of a type *
1cc40 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1cc50 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  name;         /*
1cc60 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72   Name of the par
1cc70 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ser */..  /* All
1cc80 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
1cc90 6c 69 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64  lize types[] and
1cca0 20 61 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b   allocate stddt[
1ccb0 5d 20 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65  ] */.  arraysize
1ccc0 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   = lemp->nsymbol
1ccd0 20 2a 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20   * 2;.  types = 
1cce0 28 63 68 61 72 2a 2a 29 63 61 6c 6c 6f 63 28 20  (char**)calloc( 
1ccf0 61 72 72 61 79 73 69 7a 65 2c 20 73 69 7a 65 6f  arraysize, sizeo
1cd00 66 28 63 68 61 72 2a 29 20 29 3b 0a 20 20 69 66  f(char*) );.  if
1cd10 28 20 74 79 70 65 73 3d 3d 30 20 29 7b 0a 20 20  ( types==0 ){.  
1cd20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1cd30 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  ,"Out of memory.
1cd40 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
1cd50 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1cd60 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69  ; i<arraysize; i
1cd70 2b 2b 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30  ++) types[i] = 0
1cd80 3b 0a 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20  ;.  maxdtlength 
1cd90 3d 20 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  = 0;.  if( lemp-
1cda0 3e 76 61 72 74 79 70 65 20 29 7b 0a 20 20 20 20  >vartype ){.    
1cdb0 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65  maxdtlength = le
1cdc0 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e  monStrlen(lemp->
1cdd0 76 61 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20  vartype);.  }.  
1cde0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1cdf0 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
1ce00 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
1ce10 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1ce20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
1ce30 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73  ls[i];.    if( s
1ce40 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29  p->datatype==0 )
1ce50 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c   continue;.    l
1ce60 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  en = lemonStrlen
1ce70 28 73 70 2d 3e 64 61 74 61 74 79 70 65 29 3b 0a  (sp->datatype);.
1ce80 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 64      if( len>maxd
1ce90 74 6c 65 6e 67 74 68 20 29 20 6d 61 78 64 74 6c  tlength ) maxdtl
1cea0 65 6e 67 74 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d  ength = len;.  }
1ceb0 0a 20 20 73 74 64 64 74 20 3d 20 28 63 68 61 72  .  stddt = (char
1cec0 2a 29 6d 61 6c 6c 6f 63 28 20 6d 61 78 64 74 6c  *)malloc( maxdtl
1ced0 65 6e 67 74 68 2a 32 20 2b 20 31 20 29 3b 0a 20  ength*2 + 1 );. 
1cee0 20 69 66 28 20 73 74 64 64 74 3d 3d 30 20 29 7b   if( stddt==0 ){
1cef0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
1cf00 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f  err,"Out of memo
1cf10 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ry.\n");.    exi
1cf20 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  t(1);.  }..  /* 
1cf30 42 75 69 6c 64 20 61 20 68 61 73 68 20 74 61 62  Build a hash tab
1cf40 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e  le of datatypes.
1cf50 20 54 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69   The ".dtnum" fi
1cf60 65 6c 64 20 6f 66 20 65 61 63 68 20 73 79 6d 62  eld of each symb
1cf70 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c 65  ol.  ** is fille
1cf80 64 20 69 6e 20 77 69 74 68 20 74 68 65 20 68 61  d in with the ha
1cf90 73 68 20 69 6e 64 65 78 20 70 6c 75 73 20 31 2e  sh index plus 1.
1cfa0 20 20 41 20 22 2e 64 74 6e 75 6d 22 20 76 61 6c    A ".dtnum" val
1cfb0 75 65 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a 20  ue of 0 is.  ** 
1cfc0 75 73 65 64 20 66 6f 72 20 74 65 72 6d 69 6e 61  used for termina
1cfd0 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66 20 74  l symbols.  If t
1cfe0 68 65 72 65 20 69 73 20 6e 6f 20 25 64 65 66 61  here is no %defa
1cff0 75 6c 74 5f 74 79 70 65 20 64 65 66 69 6e 65 64  ult_type defined
1d000 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69 73 20   then.  ** 0 is 
1d010 61 6c 73 6f 20 75 73 65 64 20 61 73 20 74 68 65  also used as the
1d020 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20 66 6f   .dtnum value fo
1d030 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77  r nonterminals w
1d040 68 69 63 68 20 64 6f 20 6e 6f 74 20 73 70 65 63  hich do not spec
1d050 69 66 79 0a 20 20 2a 2a 20 61 20 64 61 74 61 74  ify.  ** a datat
1d060 79 70 65 20 75 73 69 6e 67 20 74 68 65 20 25 74  ype using the %t
1d070 79 70 65 20 64 69 72 65 63 74 69 76 65 2e 0a 20  ype directive.. 
1d080 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
1d090 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
1d0a0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
1d0b0 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65   symbol *sp = le
1d0c0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
1d0d0 20 20 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20      char *cp;.  
1d0e0 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e    if( sp==lemp->
1d0f0 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20  errsym ){.      
1d100 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72 72 61  sp->dtnum = arra
1d110 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20 20 63  ysize+1;.      c
1d120 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
1d130 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21     if( sp->type!
1d140 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20  =NONTERMINAL || 
1d150 28 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30  (sp->datatype==0
1d160 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70   && lemp->vartyp
1d170 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  e==0) ){.      s
1d180 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20  p->dtnum = 0;.  
1d190 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1d1a0 20 20 7d 0a 20 20 20 20 63 70 20 3d 20 73 70 2d    }.    cp = sp-
1d1b0 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20 69  >datatype;.    i
1d1c0 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20  f( cp==0 ) cp = 
1d1d0 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b 0a 20  lemp->vartype;. 
1d1e0 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77 68     j = 0;.    wh
1d1f0 69 6c 65 28 20 49 53 53 50 41 43 45 28 2a 63 70  ile( ISSPACE(*cp
1d200 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77 68  ) ) cp++;.    wh
1d210 69 6c 65 28 20 2a 63 70 20 29 20 73 74 64 64 74  ile( *cp ) stddt
1d220 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20  [j++] = *cp++;. 
1d230 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26     while( j>0 &&
1d240 20 49 53 53 50 41 43 45 28 73 74 64 64 74 5b 6a   ISSPACE(stddt[j
1d250 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20 20  -1]) ) j--;.    
1d260 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20  stddt[j] = 0;.  
1d270 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65    if( lemp->toke
1d280 6e 74 79 70 65 20 26 26 20 73 74 72 63 6d 70 28  ntype && strcmp(
1d290 73 74 64 64 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b  stddt, lemp->tok
1d2a0 65 6e 74 79 70 65 29 3d 3d 30 20 29 7b 0a 20 20  entype)==0 ){.  
1d2b0 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
1d2c0 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
1d2d0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73  e;.    }.    has
1d2e0 68 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a  h = 0;.    for(j
1d2f0 3d 30 3b 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b  =0; stddt[j]; j+
1d300 2b 29 7b 0a 20 20 20 20 20 20 68 61 73 68 20 3d  +){.      hash =
1d310 20 68 61 73 68 2a 35 33 20 2b 20 73 74 64 64 74   hash*53 + stddt
1d320 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  [j];.    }.    h
1d330 61 73 68 20 3d 20 28 68 61 73 68 20 26 20 30 78  ash = (hash & 0x
1d340 37 66 66 66 66 66 66 66 29 25 61 72 72 61 79 73  7fffffff)%arrays
1d350 69 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ize;.    while( 
1d360 74 79 70 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20  types[hash] ){. 
1d370 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
1d380 74 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64  types[hash],stdd
1d390 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)==0 ){.       
1d3a0 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73   sp->dtnum = has
1d3b0 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 62  h + 1;.        b
1d3c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1d3d0 20 20 20 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20      hash++;.    
1d3e0 20 20 69 66 28 20 68 61 73 68 3e 3d 28 75 6e 73    if( hash>=(uns
1d3f0 69 67 6e 65 64 29 61 72 72 61 79 73 69 7a 65 20  igned)arraysize 
1d400 29 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20  ) hash = 0;.    
1d410 7d 0a 20 20 20 20 69 66 28 20 74 79 70 65 73 5b  }.    if( types[
1d420 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  hash]==0 ){.    
1d430 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61    sp->dtnum = ha
1d440 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 74 79  sh + 1;.      ty
1d450 70 65 73 5b 68 61 73 68 5d 20 3d 20 28 63 68 61  pes[hash] = (cha
1d460 72 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e  r*)malloc( lemon
1d470 53 74 72 6c 65 6e 28 73 74 64 64 74 29 2b 31 20  Strlen(stddt)+1 
1d480 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74 79 70  );.      if( typ
1d490 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20  es[hash]==0 ){. 
1d4a0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
1d4b0 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65  tderr,"Out of me
1d4c0 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 20  mory.\n");.     
1d4d0 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
1d4e0 20 20 7d 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f    }.      lemon_
1d4f0 73 74 72 63 70 79 28 74 79 70 65 73 5b 68 61 73  strcpy(types[has
1d500 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20 20 7d  h],stddt);.    }
1d510 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74  .  }..  /* Print
1d520 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e 69 74   out the definit
1d530 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54 59  ion of YYTOKENTY
1d540 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54 59  PE and YYMINORTY
1d550 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c  PE */.  name = l
1d560 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70  emp->name ? lemp
1d570 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22  ->name : "Parse"
1d580 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c  ;.  lineno = *pl
1d590 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68 66  ineno;.  if( mhf
1d5a0 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  lag ){ fprintf(o
1d5b0 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
1d5c0 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
1d5d0 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
1d5e0 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f 4b 45  ,"#define %sTOKE
1d5f0 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d 65  NTYPE %s\n",name
1d600 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65  ,.    lemp->toke
1d610 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65  ntype?lemp->toke
1d620 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b 20  ntype:"void*"); 
1d630 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28   lineno++;.  if(
1d640 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e   mhflag ){ fprin
1d650 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e  tf(out,"#endif\n
1d660 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a  "); lineno++; }.
1d670 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 74    fprintf(out,"t
1d680 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e  ypedef union {\n
1d690 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1d6a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69  fprintf(out,"  i
1d6b0 6e 74 20 79 79 69 6e 69 74 3b 5c 6e 22 29 3b 20  nt yyinit;\n"); 
1d6c0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1d6d0 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 54 4f 4b  ntf(out,"  %sTOK
1d6e0 45 4e 54 59 50 45 20 79 79 30 3b 5c 6e 22 2c 6e  ENTYPE yy0;\n",n
1d6f0 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
1d700 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72    for(i=0; i<arr
1d710 61 79 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  aysize; i++){.  
1d720 20 20 69 66 28 20 74 79 70 65 73 5b 69 5d 3d 3d    if( types[i]==
1d730 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1d740 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1d750 20 25 73 20 79 79 25 64 3b 5c 6e 22 2c 74 79 70   %s yy%d;\n",typ
1d760 65 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65  es[i],i+1); line
1d770 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 74  no++;.    free(t
1d780 79 70 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  ypes[i]);.  }.  
1d790 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  if( lemp->errsym
1d7a0 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20  ->useCnt ){.    
1d7b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69  fprintf(out,"  i
1d7c0 6e 74 20 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70  nt yy%d;\n",lemp
1d7d0 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29  ->errsym->dtnum)
1d7e0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1d7f0 20 20 66 72 65 65 28 73 74 64 64 74 29 3b 0a 20    free(stddt);. 
1d800 20 66 72 65 65 28 74 79 70 65 73 29 3b 0a 20 20   free(types);.  
1d810 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20 59  fprintf(out,"} Y
1d820 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29 3b  YMINORTYPE;\n");
1d830 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c   lineno++;.  *pl
1d840 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a  ineno = lineno;.
1d850 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1d860 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 43 20  the name of a C 
1d870 64 61 74 61 74 79 70 65 20 61 62 6c 65 20 74 6f  datatype able to
1d880 20 72 65 70 72 65 73 65 6e 74 20 76 61 6c 75 65   represent value
1d890 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c 77 72  s between.** lwr
1d8a0 20 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c 75 73   and upr, inclus
1d8b0 69 76 65 2e 20 20 49 66 20 70 6e 42 79 74 65 21  ive.  If pnByte!
1d8c0 3d 4e 55 4c 4c 20 74 68 65 6e 20 61 6c 73 6f 20  =NULL then also 
1d8d0 77 72 69 74 65 20 74 68 65 20 73 69 7a 65 6f 66  write the sizeof
1d8e0 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 74 79 70  .** for that typ
1d8f0 65 20 28 31 2c 20 32 2c 20 6f 72 20 34 29 20 69  e (1, 2, or 4) i
1d900 6e 74 6f 20 2a 70 6e 42 79 74 65 2e 0a 2a 2f 0a  nto *pnByte..*/.
1d910 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
1d920 72 20 2a 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f  r *minimum_size_
1d930 74 79 70 65 28 69 6e 74 20 6c 77 72 2c 20 69 6e  type(int lwr, in
1d940 74 20 75 70 72 2c 20 69 6e 74 20 2a 70 6e 42 79  t upr, int *pnBy
1d950 74 65 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  te){.  const cha
1d960 72 20 2a 7a 54 79 70 65 20 3d 20 22 69 6e 74 22  r *zType = "int"
1d970 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  ;.  int nByte = 
1d980 34 3b 0a 20 20 69 66 28 20 6c 77 72 3e 3d 30 20  4;.  if( lwr>=0 
1d990 29 7b 0a 20 20 20 20 69 66 28 20 75 70 72 3c 3d  ){.    if( upr<=
1d9a0 32 35 35 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  255 ){.      zTy
1d9b0 70 65 20 3d 20 22 75 6e 73 69 67 6e 65 64 20 63  pe = "unsigned c
1d9c0 68 61 72 22 3b 0a 20 20 20 20 20 20 6e 42 79 74  har";.      nByt
1d9d0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 1;.    }else
1d9e0 20 69 66 28 20 75 70 72 3c 36 35 35 33 35 20 29   if( upr<65535 )
1d9f0 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
1da00 22 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  "unsigned short 
1da10 69 6e 74 22 3b 0a 20 20 20 20 20 20 6e 42 79 74  int";.      nByt
1da20 65 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 2;.    }else
1da30 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
1da40 22 75 6e 73 69 67 6e 65 64 20 69 6e 74 22 3b 0a  "unsigned int";.
1da50 20 20 20 20 20 20 6e 42 79 74 65 20 3d 20 34 3b        nByte = 4;
1da60 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1da70 66 28 20 6c 77 72 3e 3d 2d 31 32 37 20 26 26 20  f( lwr>=-127 && 
1da80 75 70 72 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20  upr<=127 ){.    
1da90 7a 54 79 70 65 20 3d 20 22 73 69 67 6e 65 64 20  zType = "signed 
1daa0 63 68 61 72 22 3b 0a 20 20 20 20 6e 42 79 74 65  char";.    nByte
1dab0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
1dac0 28 20 6c 77 72 3e 3d 2d 33 32 37 36 37 20 26 26  ( lwr>=-32767 &&
1dad0 20 75 70 72 3c 33 32 37 36 37 20 29 7b 0a 20 20   upr<32767 ){.  
1dae0 20 20 7a 54 79 70 65 20 3d 20 22 73 68 6f 72 74    zType = "short
1daf0 22 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 32  ";.    nByte = 2
1db00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e 42 79  ;.  }.  if( pnBy
1db10 74 65 20 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e  te ) *pnByte = n
1db20 42 79 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 7a  Byte;.  return z
1db30 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  Type;.}../*.** E
1db40 61 63 68 20 73 74 61 74 65 20 63 6f 6e 74 61 69  ach state contai
1db50 6e 73 20 61 20 73 65 74 20 6f 66 20 74 6f 6b 65  ns a set of toke
1db60 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  n transaction an
1db70 64 20 61 20 73 65 74 20 6f 66 0a 2a 2a 20 6e 6f  d a set of.** no
1db80 6e 74 65 72 6d 69 6e 61 6c 20 74 72 61 6e 73 61  nterminal transa
1db90 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 6f 66  ctions.  Each of
1dba0 20 74 68 65 73 65 20 73 65 74 73 20 6d 61 6b 65   these sets make
1dbb0 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a 2a  s an instance.**
1dbc0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1dbd0 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 41 6e  g structure.  An
1dbe0 20 61 72 72 61 79 20 6f 66 20 74 68 65 73 65 20   array of these 
1dbf0 73 74 72 75 63 74 75 72 65 73 20 69 73 20 75 73  structures is us
1dc00 65 64 0a 2a 2a 20 74 6f 20 6f 72 64 65 72 20 74  ed.** to order t
1dc10 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 65  he creation of e
1dc20 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 79 79  ntries in the yy
1dc30 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e  _action[] table.
1dc40 0a 2a 2f 0a 73 74 72 75 63 74 20 61 78 73 65 74  .*/.struct axset
1dc50 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74   {.  struct stat
1dc60 65 20 2a 73 74 70 3b 20 20 20 2f 2a 20 41 20 70  e *stp;   /* A p
1dc70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74  ointer to a stat
1dc80 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 6b 6e  e */.  int isTkn
1dc90 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
1dca0 72 75 65 20 74 6f 20 75 73 65 20 74 6f 6b 65 6e  rue to use token
1dcb0 73 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6e 6f  s.  False for no
1dcc0 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20  n-terminals */. 
1dcd0 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20 20   int nAction;   
1dce0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1dcf0 6f 66 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  of actions */.  
1dd00 69 6e 74 20 69 4f 72 64 65 72 3b 20 20 20 20 20  int iOrder;     
1dd10 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
1dd20 20 6f 72 64 65 72 20 6f 66 20 61 63 74 69 6f 6e   order of action
1dd30 20 73 65 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   sets */.};../*.
1dd40 2a 2a 20 43 6f 6d 70 61 72 65 20 74 6f 20 61 78  ** Compare to ax
1dd50 73 65 74 20 73 74 72 75 63 74 75 72 65 73 20 66  set structures f
1dd60 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f  or sorting purpo
1dd70 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ses.*/.static in
1dd80 74 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 28  t axset_compare(
1dd90 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63  const void *a, c
1dda0 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20  onst void *b){. 
1ddb0 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 70   struct axset *p
1ddc0 31 20 3d 20 28 73 74 72 75 63 74 20 61 78 73 65  1 = (struct axse
1ddd0 74 2a 29 61 3b 0a 20 20 73 74 72 75 63 74 20 61  t*)a;.  struct a
1dde0 78 73 65 74 20 2a 70 32 20 3d 20 28 73 74 72 75  xset *p2 = (stru
1ddf0 63 74 20 61 78 73 65 74 2a 29 62 3b 0a 20 20 69  ct axset*)b;.  i
1de00 6e 74 20 63 3b 0a 20 20 63 20 3d 20 70 32 2d 3e  nt c;.  c = p2->
1de10 6e 41 63 74 69 6f 6e 20 2d 20 70 31 2d 3e 6e 41  nAction - p1->nA
1de20 63 74 69 6f 6e 3b 0a 20 20 69 66 28 20 63 3d 3d  ction;.  if( c==
1de30 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 70 31 2d  0 ){.    c = p1-
1de40 3e 69 4f 72 64 65 72 20 2d 20 70 32 2d 3e 69 4f  >iOrder - p2->iO
1de50 72 64 65 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rder;.  }.  asse
1de60 72 74 28 20 63 21 3d 30 20 7c 7c 20 70 31 3d 3d  rt( c!=0 || p1==
1de70 70 32 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  p2 );.  return c
1de80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
1de90 20 74 65 78 74 20 6f 6e 20 22 6f 75 74 22 20 74   text on "out" t
1dea0 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
1deb0 65 20 72 75 6c 65 20 22 72 70 22 2e 0a 2a 2f 0a  e rule "rp"..*/.
1dec0 73 74 61 74 69 63 20 76 6f 69 64 20 77 72 69 74  static void writ
1ded0 65 52 75 6c 65 54 65 78 74 28 46 49 4c 45 20 2a  eRuleText(FILE *
1dee0 6f 75 74 2c 20 73 74 72 75 63 74 20 72 75 6c 65  out, struct rule
1def0 20 2a 72 70 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a   *rp){.  int j;.
1df00 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
1df10 73 20 3a 3a 3d 22 2c 20 72 70 2d 3e 6c 68 73 2d  s ::=", rp->lhs-
1df20 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 6a 3d  >name);.  for(j=
1df30 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b 20 6a  0; j<rp->nrhs; j
1df40 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
1df50 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d  symbol *sp = rp-
1df60 3e 72 68 73 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  >rhs[j];.    if(
1df70 20 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49   sp->type!=MULTI
1df80 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
1df90 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1dfa0 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  %s", sp->name);.
1dfb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dfc0 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 66 70   int k;.      fp
1dfd0 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c  rintf(out," %s",
1dfe0 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e   sp->subsym[0]->
1dff0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  name);.      for
1e000 28 6b 3d 31 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62  (k=1; k<sp->nsub
1e010 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  sym; k++){.     
1e020 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1e030 7c 25 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b  |%s",sp->subsym[
1e040 6b 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  k]->name);.     
1e050 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
1e060 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 43 20 73  ./* Generate C s
1e070 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74  ource code for t
1e080 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69  he parser */.voi
1e090 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28 0a 20  d ReportTable(. 
1e0a0 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c   struct lemon *l
1e0b0 65 6d 70 2c 0a 20 20 69 6e 74 20 6d 68 66 6c 61  emp,.  int mhfla
1e0c0 67 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  g     /* Output 
1e0d0 69 6e 20 6d 61 6b 65 68 65 61 64 65 72 73 20 66  in makeheaders f
1e0e0 6f 72 6d 61 74 20 69 66 20 74 72 75 65 20 2a 2f  ormat if true */
1e0f0 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c  .){.  FILE *out,
1e100 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 6c 69 6e   *in;.  char lin
1e110 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69  e[LINESIZE];.  i
1e120 6e 74 20 20 6c 69 6e 65 6e 6f 3b 0a 20 20 73 74  nt  lineno;.  st
1e130 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
1e140 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
1e150 20 2a 61 70 3b 0a 20 20 73 74 72 75 63 74 20 72   *ap;.  struct r
1e160 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63  ule *rp;.  struc
1e170 74 20 61 63 74 74 61 62 20 2a 70 41 63 74 74 61  t acttab *pActta
1e180 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  b;.  int i, j, n
1e190 2c 20 73 7a 3b 0a 20 20 69 6e 74 20 73 7a 41 63  , sz;.  int szAc
1e1a0 74 69 6f 6e 54 79 70 65 3b 20 20 20 20 20 2f 2a  tionType;     /*
1e1b0 20 73 69 7a 65 6f 66 28 59 59 41 43 54 49 4f 4e   sizeof(YYACTION
1e1c0 54 59 50 45 29 20 2a 2f 0a 20 20 69 6e 74 20 73  TYPE) */.  int s
1e1d0 7a 43 6f 64 65 54 79 70 65 3b 20 20 20 20 20 20  zCodeType;      
1e1e0 20 2f 2a 20 73 69 7a 65 6f 66 28 59 59 43 4f 44   /* sizeof(YYCOD
1e1f0 45 54 59 50 45 29 20 20 20 2a 2f 0a 20 20 63 6f  ETYPE)   */.  co
1e200 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a  nst char *name;.
1e210 20 20 69 6e 74 20 6d 6e 54 6b 6e 4f 66 73 74 2c    int mnTknOfst,
1e220 20 6d 78 54 6b 6e 4f 66 73 74 3b 0a 20 20 69 6e   mxTknOfst;.  in
1e230 74 20 6d 6e 4e 74 4f 66 73 74 2c 20 6d 78 4e 74  t mnNtOfst, mxNt
1e240 4f 66 73 74 3b 0a 20 20 73 74 72 75 63 74 20 61  Ofst;.  struct a
1e250 78 73 65 74 20 2a 61 78 3b 0a 0a 20 20 69 6e 20  xset *ax;..  in 
1e260 3d 20 74 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d 70  = tplt_open(lemp
1e270 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  );.  if( in==0 )
1e280 20 72 65 74 75 72 6e 3b 0a 20 20 6f 75 74 20 3d   return;.  out =
1e290 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c   file_open(lemp,
1e2a0 22 2e 63 22 2c 22 77 62 22 29 3b 0a 20 20 69 66  ".c","wb");.  if
1e2b0 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( out==0 ){.    
1e2c0 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
1e2d0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c 69  return;.  }.  li
1e2e0 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 74 70 6c 74  neno = 1;.  tplt
1e2f0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1e300 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1e310 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1e320 20 74 68 65 20 69 6e 63 6c 75 64 65 20 63 6f 64   the include cod
1e330 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 74  e, if any */.  t
1e340 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
1e350 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64 65  mp,lemp->include
1e360 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 69 66 28  ,&lineno);.  if(
1e370 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63   mhflag ){.    c
1e380 68 61 72 20 2a 69 6e 63 4e 61 6d 65 20 3d 20 66  har *incName = f
1e390 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d  ile_makename(lem
1e3a0 70 2c 20 22 2e 68 22 29 3b 0a 20 20 20 20 66 70  p, ".h");.    fp
1e3b0 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63 6c  rintf(out,"#incl
1e3c0 75 64 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 69  ude \"%s\"\n", i
1e3d0 6e 63 4e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ncName); lineno+
1e3e0 2b 3b 0a 20 20 20 20 66 72 65 65 28 69 6e 63 4e  +;.    free(incN
1e3f0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  ame);.  }.  tplt
1e400 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1e410 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1e420 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1e430 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20 61 6c   #defines for al
1e440 6c 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66  l tokens */.  if
1e450 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( mhflag ){.    
1e460 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 65 66  const char *pref
1e470 69 78 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ix;.    fprintf(
1e480 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41  out,"#if INTERFA
1e490 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  CE\n"); lineno++
1e4a0 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ;.    if( lemp->
1e4b0 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72  tokenprefix ) pr
1e4c0 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b  efix = lemp->tok
1e4d0 65 6e 70 72 65 66 69 78 3b 0a 20 20 20 20 65 6c  enprefix;.    el
1e4e0 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
1e4f0 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20 22        prefix = "
1e500 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ";.    for(i=1; 
1e510 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i<lemp->ntermina
1e520 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  l; i++){.      f
1e530 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1e540 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c  ine %s%-30s %2d\
1e550 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e  n",prefix,lemp->
1e560 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65  symbols[i]->name
1e570 2c 69 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e  ,i);.      linen
1e580 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  o++;.    }.    f
1e590 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64  printf(out,"#end
1e5a0 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  if\n"); lineno++
1e5b0 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
1e5c0 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1e5d0 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1e5e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
1e5f0 20 64 65 66 69 6e 65 73 20 2a 2f 0a 20 20 66 70   defines */.  fp
1e600 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1e610 6e 65 20 59 59 43 4f 44 45 54 59 50 45 20 25 73  ne YYCODETYPE %s
1e620 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d  \n",.    minimum
1e630 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65  _size_type(0, le
1e640 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 2c 20 26  mp->nsymbol+1, &
1e650 73 7a 43 6f 64 65 54 79 70 65 29 29 3b 20 6c 69  szCodeType)); li
1e660 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1e670 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1e680 59 4e 4f 43 4f 44 45 20 25 64 5c 6e 22 2c 6c 65  YNOCODE %d\n",le
1e690 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 29 3b 20  mp->nsymbol+1); 
1e6a0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1e6b0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1e6c0 65 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 25  e YYACTIONTYPE %
1e6d0 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75  s\n",.    minimu
1e6e0 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c 6c 65  m_size_type(0,le
1e6f0 6d 70 2d 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d  mp->nstate+lemp-
1e700 3e 6e 72 75 6c 65 2a 32 2b 35 2c 26 73 7a 41 63  >nrule*2+5,&szAc
1e710 74 69 6f 6e 54 79 70 65 29 29 3b 20 6c 69 6e 65  tionType)); line
1e720 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70  no++;.  if( lemp
1e730 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20  ->wildcard ){.  
1e740 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1e750 64 65 66 69 6e 65 20 59 59 57 49 4c 44 43 41 52  define YYWILDCAR
1e760 44 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  D %d\n",.       
1e770 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 2d 3e  lemp->wildcard->
1e780 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  index); lineno++
1e790 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 5f 73 74  ;.  }.  print_st
1e7a0 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65  ack_union(out,le
1e7b0 6d 70 2c 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61  mp,&lineno,mhfla
1e7c0 67 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  g);.  fprintf(ou
1e7d0 74 2c 20 22 23 69 66 6e 64 65 66 20 59 59 53 54  t, "#ifndef YYST
1e7e0 41 43 4b 44 45 50 54 48 5c 6e 22 29 3b 20 6c 69  ACKDEPTH\n"); li
1e7f0 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65  neno++;.  if( le
1e800 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b  mp->stacksize ){
1e810 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1e820 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54 41 43  ,"#define YYSTAC
1e830 4b 44 45 50 54 48 20 25 73 5c 6e 22 2c 6c 65 6d  KDEPTH %s\n",lem
1e840 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 20 20  p->stacksize);  
1e850 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73  lineno++;.  }els
1e860 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e{.    fprintf(o
1e870 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54  ut,"#define YYST
1e880 41 43 4b 44 45 50 54 48 20 31 30 30 5c 6e 22 29  ACKDEPTH 100\n")
1e890 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ;  lineno++;.  }
1e8a0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1e8b0 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e  "#endif\n"); lin
1e8c0 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66  eno++;.  if( mhf
1e8d0 6c 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  lag ){.    fprin
1e8e0 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45  tf(out,"#if INTE
1e8f0 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e  RFACE\n"); linen
1e900 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 20  o++;.  }.  name 
1e910 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c  = lemp->name ? l
1e920 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72  emp->name : "Par
1e930 73 65 22 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  se";.  if( lemp-
1e940 3e 61 72 67 20 26 26 20 6c 65 6d 70 2d 3e 61 72  >arg && lemp->ar
1e950 67 5b 30 5d 20 29 7b 0a 20 20 20 20 69 20 3d 20  g[0] ){.    i = 
1e960 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70  lemonStrlen(lemp
1e970 2d 3e 61 72 67 29 3b 0a 20 20 20 20 77 68 69 6c  ->arg);.    whil
1e980 65 28 20 69 3e 3d 31 20 26 26 20 49 53 53 50 41  e( i>=1 && ISSPA
1e990 43 45 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31  CE(lemp->arg[i-1
1e9a0 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 77 68  ]) ) i--;.    wh
1e9b0 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 28 49 53  ile( i>=1 && (IS
1e9c0 41 4c 4e 55 4d 28 6c 65 6d 70 2d 3e 61 72 67 5b  ALNUM(lemp->arg[
1e9d0 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d 3e 61  i-1]) || lemp->a
1e9e0 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20 29 20  rg[i-1]=='_') ) 
1e9f0 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  i--;.    fprintf
1ea00 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1ea10 41 52 47 5f 53 44 45 43 4c 20 25 73 3b 5c 6e 22  ARG_SDECL %s;\n"
1ea20 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29  ,name,lemp->arg)
1ea30 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1ea40 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1ea50 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43  efine %sARG_PDEC
1ea60 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c 6c 65  L ,%s\n",name,le
1ea70 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e  mp->arg);  linen
1ea80 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1ea90 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1eaa0 41 52 47 5f 46 45 54 43 48 20 25 73 20 3d 20 79  ARG_FETCH %s = y
1eab0 79 70 50 61 72 73 65 72 2d 3e 25 73 5c 6e 22 2c  ypParser->%s\n",
1eac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ead0 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67    name,lemp->arg
1eae0 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b  ,&lemp->arg[i]);
1eaf0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
1eb00 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1eb10 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f 52 45  fine %sARG_STORE
1eb20 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73 20 3d   yypParser->%s =
1eb30 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
1eb40 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 26 6c           name,&l
1eb50 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c 26 6c 65 6d  emp->arg[i],&lem
1eb60 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e  p->arg[i]);  lin
1eb70 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  eno++;.  }else{.
1eb80 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1eb90 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53  "#define %sARG_S
1eba0 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20  DECL\n",name);  
1ebb0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70  lineno++;.    fp
1ebc0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1ebd0 6e 65 20 25 73 41 52 47 5f 50 44 45 43 4c 5c 6e  ne %sARG_PDECL\n
1ebe0 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f  ",name);  lineno
1ebf0 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1ec00 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1ec10 52 47 5f 46 45 54 43 48 5c 6e 22 2c 6e 61 6d 65  RG_FETCH\n",name
1ec20 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1ec30 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1ec40 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f 52  efine %sARG_STOR
1ec50 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65  E\n",name); line
1ec60 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  no++;.  }.  if( 
1ec70 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 66 70  mhflag ){.    fp
1ec80 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69  rintf(out,"#endi
1ec90 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  f\n"); lineno++;
1eca0 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d  .  }.  if( lemp-
1ecb0 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20  >errsym->useCnt 
1ecc0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1ecd0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52  ut,"#define YYER
1ece0 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c 6e 22 2c  RORSYMBOL %d\n",
1ecf0 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 69 6e  lemp->errsym->in
1ed00 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
1ed10 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1ed20 22 23 64 65 66 69 6e 65 20 59 59 45 52 52 53 59  "#define YYERRSY
1ed30 4d 44 54 20 79 79 25 64 5c 6e 22 2c 6c 65 6d 70  MDT yy%d\n",lemp
1ed40 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29  ->errsym->dtnum)
1ed50 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1ed60 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f    if( lemp->has_
1ed70 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  fallback ){.    
1ed80 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1ed90 66 69 6e 65 20 59 59 46 41 4c 4c 42 41 43 4b 20  fine YYFALLBACK 
1eda0 31 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  1\n");  lineno++
1edb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
1edc0 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74  ute the action t
1edd0 61 62 6c 65 2c 20 62 75 74 20 64 6f 20 6e 6f 74  able, but do not
1ede0 20 6f 75 74 70 75 74 20 69 74 20 79 65 74 2e 20   output it yet. 
1edf0 20 54 68 65 20 61 63 74 69 6f 6e 0a 20 20 2a 2a   The action.  **
1ee00 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 63   table must be c
1ee10 6f 6d 70 75 74 65 64 20 62 65 66 6f 72 65 20 67  omputed before g
1ee20 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 59 59  enerating the YY
1ee30 4e 53 54 41 54 45 20 6d 61 63 72 6f 20 62 65 63  NSTATE macro bec
1ee40 61 75 73 65 0a 20 20 2a 2a 20 77 65 20 6e 65 65  ause.  ** we nee
1ee50 64 20 74 6f 20 6b 6e 6f 77 20 68 6f 77 20 6d 61  d to know how ma
1ee60 6e 79 20 73 74 61 74 65 73 20 63 61 6e 20 62 65  ny states can be
1ee70 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 20 20 2a   eliminated..  *
1ee80 2f 0a 20 20 61 78 20 3d 20 28 73 74 72 75 63 74  /.  ax = (struct
1ee90 20 61 78 73 65 74 20 2a 29 20 63 61 6c 6c 6f 63   axset *) calloc
1eea0 28 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2a 32  (lemp->nxstate*2
1eeb0 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 29  , sizeof(ax[0]))
1eec0 3b 0a 20 20 69 66 28 20 61 78 3d 3d 30 20 29 7b  ;.  if( ax==0 ){
1eed0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
1eee0 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  err,"malloc fail
1eef0 65 64 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ed\n");.    exit
1ef00 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  (1);.  }.  for(i
1ef10 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74  =0; i<lemp->nxst
1ef20 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
1ef30 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
1ef40 64 5b 69 5d 3b 0a 20 20 20 20 61 78 5b 69 2a 32  d[i];.    ax[i*2
1ef50 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20  ].stp = stp;.   
1ef60 20 61 78 5b 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d   ax[i*2].isTkn =
1ef70 20 31 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e   1;.    ax[i*2].
1ef80 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e  nAction = stp->n
1ef90 54 6b 6e 41 63 74 3b 0a 20 20 20 20 61 78 5b 69  TknAct;.    ax[i
1efa0 2a 32 2b 31 5d 2e 73 74 70 20 3d 20 73 74 70 3b  *2+1].stp = stp;
1efb0 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 69  .    ax[i*2+1].i
1efc0 73 54 6b 6e 20 3d 20 30 3b 0a 20 20 20 20 61 78  sTkn = 0;.    ax
1efd0 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20  [i*2+1].nAction 
1efe0 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20  = stp->nNtAct;. 
1eff0 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73 74 20 3d   }.  mxTknOfst =
1f000 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a   mnTknOfst = 0;.
1f010 20 20 6d 78 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e    mxNtOfst = mnN
1f020 74 4f 66 73 74 20 3d 20 30 3b 0a 20 20 2f 2a 20  tOfst = 0;.  /* 
1f030 49 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  In an effort to 
1f040 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 63 74  minimize the act
1f050 69 6f 6e 20 74 61 62 6c 65 20 73 69 7a 65 2c 20  ion table size, 
1f060 75 73 65 20 74 68 65 20 68 65 75 72 69 73 74 69  use the heuristi
1f070 63 0a 20 20 2a 2a 20 6f 66 20 70 6c 61 63 69 6e  c.  ** of placin
1f080 67 20 74 68 65 20 6c 61 72 67 65 73 74 20 61 63  g the largest ac
1f090 74 69 6f 6e 20 73 65 74 73 20 66 69 72 73 74 20  tion sets first 
1f0a0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1f0b0 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2a 32 3b  lemp->nxstate*2;
1f0c0 20 69 2b 2b 29 20 61 78 5b 69 5d 2e 69 4f 72 64   i++) ax[i].iOrd
1f0d0 65 72 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74 28  er = i;.  qsort(
1f0e0 61 78 2c 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  ax, lemp->nxstat
1f0f0 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30  e*2, sizeof(ax[0
1f100 5d 29 2c 20 61 78 73 65 74 5f 63 6f 6d 70 61 72  ]), axset_compar
1f110 65 29 3b 0a 20 20 70 41 63 74 74 61 62 20 3d 20  e);.  pActtab = 
1f120 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28 29 3b 0a  acttab_alloc();.
1f130 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1f140 70 2d 3e 6e 78 73 74 61 74 65 2a 32 20 26 26 20  p->nxstate*2 && 
1f150 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 3e 30 3b  ax[i].nAction>0;
1f160 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
1f170 20 61 78 5b 69 5d 2e 73 74 70 3b 0a 20 20 20 20   ax[i].stp;.    
1f180 69 66 28 20 61 78 5b 69 5d 2e 69 73 54 6b 6e 20  if( ax[i].isTkn 
1f190 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 3d  ){.      for(ap=
1f1a0 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
1f1b0 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
1f1c0 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20     int action;. 
1f1d0 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73         if( ap->s
1f1e0 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d 70 2d 3e  p->index>=lemp->
1f1f0 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74  nterminal ) cont
1f200 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63  inue;.        ac
1f210 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61  tion = compute_a
1f220 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b  ction(lemp, ap);
1f230 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63 74  .        if( act
1f240 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65  ion<0 ) continue
1f250 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74 61 62  ;.        acttab
1f260 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c  _action(pActtab,
1f270 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20   ap->sp->index, 
1f280 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  action);.      }
1f290 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e  .      stp->iTkn
1f2a0 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69 6e  Ofst = acttab_in
1f2b0 73 65 72 74 28 70 41 63 74 74 61 62 29 3b 0a 20  sert(pActtab);. 
1f2c0 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 54       if( stp->iT
1f2d0 6b 6e 4f 66 73 74 3c 6d 6e 54 6b 6e 4f 66 73 74  knOfst<mnTknOfst
1f2e0 20 29 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 73   ) mnTknOfst = s
1f2f0 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20  tp->iTknOfst;.  
1f300 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 54 6b      if( stp->iTk
1f310 6e 4f 66 73 74 3e 6d 78 54 6b 6e 4f 66 73 74 20  nOfst>mxTknOfst 
1f320 29 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 73 74  ) mxTknOfst = st
1f330 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20  p->iTknOfst;.   
1f340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
1f350 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1f360 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1f370 20 20 20 20 20 20 20 20 69 6e 74 20 61 63 74 69          int acti
1f380 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  on;.        if( 
1f390 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65  ap->sp->index<le
1f3a0 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20  mp->nterminal ) 
1f3b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1f3c0 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e    if( ap->sp->in
1f3d0 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62  dex==lemp->nsymb
1f3e0 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ol ) continue;. 
1f3f0 20 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20         action = 
1f400 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c  compute_action(l
1f410 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20  emp, ap);.      
1f420 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29    if( action<0 )
1f430 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f440 20 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e     acttab_action
1f450 28 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70  (pActtab, ap->sp
1f460 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29  ->index, action)
1f470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f480 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 61  stp->iNtOfst = a
1f490 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41 63  cttab_insert(pAc
1f4a0 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ttab);.      if(
1f4b0 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e   stp->iNtOfst<mn
1f4c0 4e 74 4f 66 73 74 20 29 20 6d 6e 4e 74 4f 66 73  NtOfst ) mnNtOfs
1f4d0 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  t = stp->iNtOfst
1f4e0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d  ;.      if( stp-
1f4f0 3e 69 4e 74 4f 66 73 74 3e 6d 78 4e 74 4f 66 73  >iNtOfst>mxNtOfs
1f500 74 20 29 20 6d 78 4e 74 4f 66 73 74 20 3d 20 73  t ) mxNtOfst = s
1f510 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20  tp->iNtOfst;.   
1f520 20 7d 0a 23 69 66 20 30 20 20 2f 2a 20 55 6e 63   }.#if 0  /* Unc
1f530 6f 6d 6d 65 6e 74 20 66 6f 72 20 61 20 74 72 61  omment for a tra
1f540 63 65 20 6f 66 20 68 6f 77 20 74 68 65 20 79 79  ce of how the yy
1f550 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20  _action[] table 
1f560 66 69 6c 6c 73 20 6f 75 74 20 2a 2f 0a 20 20 20  fills out */.   
1f570 20 7b 20 69 6e 74 20 6a 6a 2c 20 6e 6e 3b 0a 20   { int jj, nn;. 
1f580 20 20 20 20 20 66 6f 72 28 6a 6a 3d 6e 6e 3d 30       for(jj=nn=0
1f590 3b 20 6a 6a 3c 70 41 63 74 74 61 62 2d 3e 6e 41  ; jj<pActtab->nA
1f5a0 63 74 69 6f 6e 3b 20 6a 6a 2b 2b 29 7b 0a 20 20  ction; jj++){.  
1f5b0 20 20 20 20 20 20 69 66 28 20 70 41 63 74 74 61        if( pActta
1f5c0 62 2d 3e 61 41 63 74 69 6f 6e 5b 6a 6a 5d 2e 61  b->aAction[jj].a
1f5d0 63 74 69 6f 6e 3c 30 20 29 20 6e 6e 2b 2b 3b 0a  ction<0 ) nn++;.
1f5e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72        }.      pr
1f5f0 69 6e 74 66 28 22 25 34 64 3a 20 53 74 61 74 65  intf("%4d: State
1f600 20 25 33 64 20 25 73 20 6e 3a 20 25 32 64 20 73   %3d %s n: %2d s
1f610 69 7a 65 3a 20 25 35 64 20 66 72 65 65 73 70 61  ize: %5d freespa
1f620 63 65 3a 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ce: %d\n",.     
1f630 20 20 20 20 20 20 20 20 69 2c 20 73 74 70 2d 3e          i, stp->
1f640 73 74 61 74 65 6e 75 6d 2c 20 61 78 5b 69 5d 2e  statenum, ax[i].
1f650 69 73 54 6b 6e 20 3f 20 22 54 6f 6b 65 6e 22 20  isTkn ? "Token" 
1f660 3a 20 22 56 61 72 20 20 22 2c 0a 20 20 20 20 20  : "Var  ",.     
1f670 20 20 20 20 20 20 20 20 61 78 5b 69 5d 2e 6e 41          ax[i].nA
1f680 63 74 69 6f 6e 2c 20 70 41 63 74 74 61 62 2d 3e  ction, pActtab->
1f690 6e 41 63 74 69 6f 6e 2c 20 6e 6e 29 3b 0a 20 20  nAction, nn);.  
1f6a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
1f6b0 20 66 72 65 65 28 61 78 29 3b 0a 0a 20 20 2f 2a   free(ax);..  /*
1f6c0 20 4d 61 72 6b 20 72 75 6c 65 73 20 74 68 61 74   Mark rules that
1f6d0 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73   are actually us
1f6e0 65 64 20 66 6f 72 20 72 65 64 75 63 65 20 61 63  ed for reduce ac
1f6f0 74 69 6f 6e 73 20 61 66 74 65 72 20 61 6c 6c 0a  tions after all.
1f700 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f    ** optimizatio
1f710 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 70 70  ns have been app
1f720 6c 69 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  lied.  */.  for(
1f730 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
1f740 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 20  p; rp=rp->next) 
1f750 72 70 2d 3e 64 6f 65 73 52 65 64 75 63 65 20 3d  rp->doesReduce =
1f760 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20   LEMON_FALSE;.  
1f770 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1f780 3e 6e 78 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  >nxstate; i++){.
1f790 20 20 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d      for(ap=lemp-
1f7a0 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20  >sorted[i]->ap; 
1f7b0 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
1f7c0 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  {.      if( ap->
1f7d0 74 79 70 65 3d 3d 52 45 44 55 43 45 20 7c 7c 20  type==REDUCE || 
1f7e0 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 52  ap->type==SHIFTR
1f7f0 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 20  EDUCE ){.       
1f800 20 61 70 2d 3e 78 2e 72 70 2d 3e 64 6f 65 73 52   ap->x.rp->doesR
1f810 65 64 75 63 65 20 3d 20 69 3b 0a 20 20 20 20 20  educe = i;.     
1f820 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1f830 2f 2a 20 46 69 6e 69 73 68 20 72 65 6e 64 65 72  /* Finish render
1f840 69 6e 67 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  ing the constant
1f850 73 20 6e 6f 77 20 74 68 61 74 20 74 68 65 20 61  s now that the a
1f860 63 74 69 6f 6e 20 74 61 62 6c 65 20 68 61 73 0a  ction table has.
1f870 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 75 74    ** been comput
1f880 65 64 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  ed */.  fprintf(
1f890 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e  out,"#define YYN
1f8a0 53 54 41 54 45 20 20 20 20 20 20 20 20 20 20 20  STATE           
1f8b0 20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 78    %d\n",lemp->nx
1f8c0 73 74 61 74 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  state);  lineno+
1f8d0 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1f8e0 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 52 55 4c  ,"#define YYNRUL
1f8f0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25  E              %
1f900 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65  d\n",lemp->nrule
1f910 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1f920 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1f930 66 69 6e 65 20 59 59 5f 4d 41 58 5f 53 48 49 46  fine YY_MAX_SHIF
1f940 54 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c  T         %d\n",
1f950 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2d 31 29  lemp->nxstate-1)
1f960 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1f970 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1f980 6e 65 20 59 59 5f 4d 49 4e 5f 53 48 49 46 54 52  ne YY_MIN_SHIFTR
1f990 45 44 55 43 45 20 20 20 25 64 5c 6e 22 2c 6c 65  EDUCE   %d\n",le
1f9a0 6d 70 2d 3e 6e 73 74 61 74 65 29 3b 20 6c 69 6e  mp->nstate); lin
1f9b0 65 6e 6f 2b 2b 3b 0a 20 20 69 20 3d 20 6c 65 6d  eno++;.  i = lem
1f9c0 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70  p->nstate + lemp
1f9d0 2d 3e 6e 72 75 6c 65 3b 0a 20 20 66 70 72 69 6e  ->nrule;.  fprin
1f9e0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1f9f0 59 59 5f 4d 41 58 5f 53 48 49 46 54 52 45 44 55  YY_MAX_SHIFTREDU
1fa00 43 45 20 20 20 25 64 5c 6e 22 2c 20 69 2d 31 29  CE   %d\n", i-1)
1fa10 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1fa20 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1fa30 6e 65 20 59 59 5f 4d 49 4e 5f 52 45 44 55 43 45  ne YY_MIN_REDUCE
1fa40 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
1fa50 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69  ); lineno++;.  i
1fa60 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20   = lemp->nstate 
1fa70 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2a 32 3b  + lemp->nrule*2;
1fa80 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1fa90 23 64 65 66 69 6e 65 20 59 59 5f 4d 41 58 5f 52  #define YY_MAX_R
1faa0 45 44 55 43 45 20 20 20 20 20 20 20 20 25 64 5c  EDUCE        %d\
1fab0 6e 22 2c 20 69 2d 31 29 3b 20 6c 69 6e 65 6e 6f  n", i-1); lineno
1fac0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1fad0 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 45 52  t,"#define YY_ER
1fae0 52 4f 52 5f 41 43 54 49 4f 4e 20 20 20 20 20 20  ROR_ACTION      
1faf0 25 64 5c 6e 22 2c 20 69 29 3b 20 6c 69 6e 65 6e  %d\n", i); linen
1fb00 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1fb10 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 41  ut,"#define YY_A
1fb20 43 43 45 50 54 5f 41 43 54 49 4f 4e 20 20 20 20  CCEPT_ACTION    
1fb30 20 25 64 5c 6e 22 2c 20 69 2b 31 29 3b 20 6c 69   %d\n", i+1); li
1fb40 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1fb50 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1fb60 59 5f 4e 4f 5f 41 43 54 49 4f 4e 20 20 20 20 20  Y_NO_ACTION     
1fb70 20 20 20 20 25 64 5c 6e 22 2c 20 69 2b 32 29 3b      %d\n", i+2);
1fb80 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c   lineno++;.  tpl
1fb90 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1fba0 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1fbb0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6f 75 74  );..  /* Now out
1fbc0 70 75 74 20 74 68 65 20 61 63 74 69 6f 6e 20 74  put the action t
1fbd0 61 62 6c 65 20 61 6e 64 20 69 74 73 20 61 73 73  able and its ass
1fbe0 6f 63 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20  ociates:.  **.  
1fbf0 2a 2a 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  **  yy_action[] 
1fc00 20 20 20 20 20 20 20 41 20 73 69 6e 67 6c 65 20         A single 
1fc10 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1fc20 20 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20   all actions..  
1fc30 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64  **  yy_lookahead
1fc40 5b 5d 20 20 20 20 20 41 20 74 61 62 6c 65 20 63  []     A table c
1fc50 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f  ontaining the lo
1fc60 6f 6b 61 68 65 61 64 20 66 6f 72 20 65 61 63 68  okahead for each
1fc70 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20   entry in.  **  
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc90 20 20 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55     yy_action.  U
1fca0 73 65 64 20 74 6f 20 64 65 74 65 63 74 20 68 61  sed to detect ha
1fcb0 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20  sh collisions.. 
1fcc0 20 2a 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f 66   **  yy_shift_of
1fcd0 73 74 5b 5d 20 20 20 20 46 6f 72 20 65 61 63 68  st[]    For each
1fce0 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73   state, the offs
1fcf0 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f  et into yy_actio
1fd00 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20  n for.  **      
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1fd20 68 69 66 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c  hifting terminal
1fd30 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64 75  s..  **  yy_redu
1fd40 63 65 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20  ce_ofst[]   For 
1fd50 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65 20  each state, the 
1fd60 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61  offset into yy_a
1fd70 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20  ction for.  **  
1fd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd90 20 20 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d     shifting non-
1fda0 74 65 72 6d 69 6e 61 6c 73 20 61 66 74 65 72 20  terminals after 
1fdb0 61 20 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20  a reduce..  **  
1fdc0 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20 20  yy_default[]    
1fdd0 20 20 20 44 65 66 61 75 6c 74 20 61 63 74 69 6f     Default actio
1fde0 6e 20 66 6f 72 20 65 61 63 68 20 73 74 61 74 65  n for each state
1fdf0 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74  ..  */..  /* Out
1fe00 70 75 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f  put the yy_actio
1fe10 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6c 65 6d  n table */.  lem
1fe20 70 2d 3e 6e 61 63 74 69 6f 6e 74 61 62 20 3d 20  p->nactiontab = 
1fe30 6e 20 3d 20 61 63 74 74 61 62 5f 73 69 7a 65 28  n = acttab_size(
1fe40 70 41 63 74 74 61 62 29 3b 0a 20 20 6c 65 6d 70  pActtab);.  lemp
1fe50 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e  ->tablesize += n
1fe60 2a 73 7a 41 63 74 69 6f 6e 54 79 70 65 3b 0a 20  *szActionType;. 
1fe70 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1fe80 65 66 69 6e 65 20 59 59 5f 41 43 54 54 41 42 5f  efine YY_ACTTAB_
1fe90 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e  COUNT (%d)\n", n
1fea0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1feb0 70 72 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74  printf(out,"stat
1fec0 69 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f  ic const YYACTIO
1fed0 4e 54 59 50 45 20 79 79 5f 61 63 74 69 6f 6e 5b  NTYPE yy_action[
1fee0 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ] = {\n"); linen
1fef0 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  o++;.  for(i=j=0
1ff00 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1ff10 20 69 6e 74 20 61 63 74 69 6f 6e 20 3d 20 61 63   int action = ac
1ff20 74 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 70 41  ttab_yyaction(pA
1ff30 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20 20 69  cttab, i);.    i
1ff40 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 61 63  f( action<0 ) ac
1ff50 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74  tion = lemp->nst
1ff60 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  ate + lemp->nrul
1ff70 65 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 6a  e + 2;.    if( j
1ff80 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75  ==0 ) fprintf(ou
1ff90 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c  t," /* %5d */ ",
1ffa0 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   i);.    fprintf
1ffb0 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 61  (out, " %4d,", a
1ffc0 63 74 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20  ction);.    if( 
1ffd0 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29  j==9 || i==n-1 )
1ffe0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1fff0 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65  out, "\n"); line
20000 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20  no++;.      j = 
20010 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
20020 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      j++;.    }. 
20030 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
20040 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  , "};\n"); linen
20050 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  o++;..  /* Outpu
20060 74 20 74 68 65 20 79 79 5f 6c 6f 6f 6b 61 68 65  t the yy_lookahe
20070 61 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6c 65  ad table */.  le
20080 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d  mp->tablesize +=
20090 20 6e 2a 73 7a 43 6f 64 65 54 79 70 65 3b 0a 20   n*szCodeType;. 
200a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 73 74   fprintf(out,"st
200b0 61 74 69 63 20 63 6f 6e 73 74 20 59 59 43 4f 44  atic const YYCOD
200c0 45 54 59 50 45 20 79 79 5f 6c 6f 6f 6b 61 68 65  ETYPE yy_lookahe
200d0 61 64 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69  ad[] = {\n"); li
200e0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  neno++;.  for(i=
200f0 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
20100 20 20 20 20 69 6e 74 20 6c 61 20 3d 20 61 63 74      int la = act
20110 74 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28  tab_yylookahead(
20120 70 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20  pActtab, i);.   
20130 20 69 66 28 20 6c 61 3c 30 20 29 20 6c 61 20 3d   if( la<0 ) la =
20140 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a   lemp->nsymbol;.
20150 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
20160 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
20170 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
20180 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
20190 20 25 34 64 2c 22 2c 20 6c 61 29 3b 0a 20 20 20   %4d,", la);.   
201a0 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
201b0 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
201c0 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
201d0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
201e0 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
201f0 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
20200 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
20210 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
20220 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20  lineno++;..  /* 
20230 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 73 68  Output the yy_sh
20240 69 66 74 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65  ift_ofst[] table
20250 20 2a 2f 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e   */.  n = lemp->
20260 6e 78 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65  nxstate;.  while
20270 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73  ( n>0 && lemp->s
20280 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e  orted[n-1]->iTkn
20290 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  Ofst==NO_OFFSET 
202a0 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66  ) n--;.  fprintf
202b0 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
202c0 59 5f 53 48 49 46 54 5f 55 53 45 5f 44 46 4c 54  Y_SHIFT_USE_DFLT
202d0 20 28 25 64 29 5c 6e 22 2c 20 6c 65 6d 70 2d 3e   (%d)\n", lemp->
202e0 6e 61 63 74 69 6f 6e 74 61 62 29 3b 20 6c 69 6e  nactiontab); lin
202f0 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
20300 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
20310 59 5f 53 48 49 46 54 5f 43 4f 55 4e 54 20 20 20  Y_SHIFT_COUNT   
20320 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20   (%d)\n", n-1); 
20330 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
20340 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
20350 65 20 59 59 5f 53 48 49 46 54 5f 4d 49 4e 20 20  e YY_SHIFT_MIN  
20360 20 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54      (%d)\n", mnT
20370 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b  knOfst); lineno+
20380 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
20390 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48  , "#define YY_SH
203a0 49 46 54 5f 4d 41 58 20 20 20 20 20 20 28 25 64  IFT_MAX      (%d
203b0 29 5c 6e 22 2c 20 6d 78 54 6b 6e 4f 66 73 74 29  )\n", mxTknOfst)
203c0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
203d0 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74  rintf(out, "stat
203e0 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f 73  ic const %s yy_s
203f0 68 69 66 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c  hift_ofst[] = {\
20400 6e 22 2c 20 0a 20 20 20 20 20 20 20 6d 69 6e 69  n", .       mini
20410 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e  mum_size_type(mn
20420 54 6b 6e 4f 66 73 74 2c 20 6c 65 6d 70 2d 3e 6e  TknOfst, lemp->n
20430 74 65 72 6d 69 6e 61 6c 2b 6c 65 6d 70 2d 3e 6e  terminal+lemp->n
20440 61 63 74 69 6f 6e 74 61 62 2c 20 26 73 7a 29 29  actiontab, &sz))
20450 3b 0a 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b  ;.       lineno+
20460 2b 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65  +;.  lemp->table
20470 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 3b 0a 20 20  size += n*sz;.  
20480 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
20490 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66  i++){.    int of
204a0 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  st;.    stp = le
204b0 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
204c0 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69     ofst = stp->i
204d0 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 69 66 28  TknOfst;.    if(
204e0 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54   ofst==NO_OFFSET
204f0 20 29 20 6f 66 73 74 20 3d 20 6c 65 6d 70 2d 3e   ) ofst = lemp->
20500 6e 61 63 74 69 6f 6e 74 61 62 3b 0a 20 20 20 20  nactiontab;.    
20510 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e  if( j==0 ) fprin
20520 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20  tf(out," /* %5d 
20530 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70  */ ", i);.    fp
20540 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64  rintf(out, " %4d
20550 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ,", ofst);.    i
20560 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d  f( j==9 || i==n-
20570 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  1 ){.      fprin
20580 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c  tf(out, "\n"); l
20590 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a  ineno++;.      j
205a0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
205b0 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
205c0 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  }.  }.  fprintf(
205d0 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69  out, "};\n"); li
205e0 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75  neno++;..  /* Ou
205f0 74 70 75 74 20 74 68 65 20 79 79 5f 72 65 64 75  tput the yy_redu
20600 63 65 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20  ce_ofst[] table 
20610 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
20620 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45  , "#define YY_RE
20630 44 55 43 45 5f 55 53 45 5f 44 46 4c 54 20 28 25  DUCE_USE_DFLT (%
20640 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74 2d  d)\n", mnNtOfst-
20650 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  1); lineno++;.  
20660 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  n = lemp->nxstat
20670 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  e;.  while( n>0 
20680 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  && lemp->sorted[
20690 6e 2d 31 5d 2d 3e 69 4e 74 4f 66 73 74 3d 3d 4e  n-1]->iNtOfst==N
206a0 4f 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a  O_OFFSET ) n--;.
206b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
206c0 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43  #define YY_REDUC
206d0 45 5f 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c  E_COUNT (%d)\n",
206e0 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b   n-1); lineno++;
206f0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
20700 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55  "#define YY_REDU
20710 43 45 5f 4d 49 4e 20 20 20 28 25 64 29 5c 6e 22  CE_MIN   (%d)\n"
20720 2c 20 6d 6e 4e 74 4f 66 73 74 29 3b 20 6c 69 6e  , mnNtOfst); lin
20730 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
20740 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
20750 59 5f 52 45 44 55 43 45 5f 4d 41 58 20 20 20 28  Y_REDUCE_MAX   (
20760 25 64 29 5c 6e 22 2c 20 6d 78 4e 74 4f 66 73 74  %d)\n", mxNtOfst
20770 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
20780 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61  printf(out, "sta
20790 74 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f  tic const %s yy_
207a0 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 3d 20  reduce_ofst[] = 
207b0 7b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  {\n", .         
207c0 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79   minimum_size_ty
207d0 70 65 28 6d 6e 4e 74 4f 66 73 74 2d 31 2c 20 6d  pe(mnNtOfst-1, m
207e0 78 4e 74 4f 66 73 74 2c 20 26 73 7a 29 29 3b 20  xNtOfst, &sz)); 
207f0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6c 65 6d 70  lineno++;.  lemp
20800 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e  ->tablesize += n
20810 2a 73 7a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  *sz;.  for(i=j=0
20820 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
20830 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73   int ofst;.    s
20840 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
20850 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d  d[i];.    ofst =
20860 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20   stp->iNtOfst;. 
20870 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f     if( ofst==NO_
20880 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d 20  OFFSET ) ofst = 
20890 6d 6e 4e 74 4f 66 73 74 20 2d 20 31 3b 0a 20 20  mnNtOfst - 1;.  
208a0 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
208b0 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
208c0 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
208d0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
208e0 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20  4d,", ofst);.   
208f0 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
20900 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
20910 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
20920 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
20930 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
20940 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
20950 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
20960 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
20970 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20  lineno++;..  /* 
20980 4f 75 74 70 75 74 20 74 68 65 20 64 65 66 61 75  Output the defau
20990 6c 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  lt action table 
209a0 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
209b0 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20  , "static const 
209c0 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f  YYACTIONTYPE yy_
209d0 64 65 66 61 75 6c 74 5b 5d 20 3d 20 7b 5c 6e 22  default[] = {\n"
209e0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e  ); lineno++;.  n
209f0 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65   = lemp->nxstate
20a00 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73  ;.  lemp->tables
20a10 69 7a 65 20 2b 3d 20 6e 2a 73 7a 41 63 74 69 6f  ize += n*szActio
20a20 6e 54 79 70 65 3b 0a 20 20 66 6f 72 28 69 3d 6a  nType;.  for(i=j
20a30 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
20a40 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
20a50 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 69 66  orted[i];.    if
20a60 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66  ( j==0 ) fprintf
20a70 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f  (out," /* %5d */
20a80 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69   ", i);.    fpri
20a90 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22  ntf(out, " %4d,"
20aa0 2c 20 73 74 70 2d 3e 69 44 66 6c 74 52 65 64 75  , stp->iDfltRedu
20ab0 63 65 2b 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b  ce+lemp->nstate+
20ac0 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 0a 20 20  lemp->nrule);.  
20ad0 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d    if( j==9 || i=
20ae0 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70  =n-1 ){.      fp
20af0 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
20b00 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
20b10 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c    j = 0;.    }el
20b20 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  se{.      j++;. 
20b30 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e     }.  }.  fprin
20b40 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b  tf(out, "};\n");
20b50 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c   lineno++;.  tpl
20b60 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
20b70 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
20b80 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
20b90 65 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 66  e the table of f
20ba0 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a  allback tokens..
20bb0 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d    */.  if( lemp-
20bc0 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b  >has_fallback ){
20bd0 0a 20 20 20 20 69 6e 74 20 6d 78 20 3d 20 6c 65  .    int mx = le
20be0 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 2d 20  mp->nterminal - 
20bf0 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6d 78  1;.    while( mx
20c00 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62  >0 && lemp->symb
20c10 6f 6c 73 5b 6d 78 5d 2d 3e 66 61 6c 6c 62 61 63  ols[mx]->fallbac
20c20 6b 3d 3d 30 20 29 7b 20 6d 78 2d 2d 3b 20 7d 0a  k==0 ){ mx--; }.
20c30 20 20 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73      lemp->tables
20c40 69 7a 65 20 2b 3d 20 28 6d 78 2b 31 29 2a 73 7a  ize += (mx+1)*sz
20c50 43 6f 64 65 54 79 70 65 3b 0a 20 20 20 20 66 6f  CodeType;.    fo
20c60 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 3b 20 69 2b  r(i=0; i<=mx; i+
20c70 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
20c80 20 73 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d   symbol *p = lem
20c90 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
20ca0 20 20 20 20 20 69 66 28 20 70 2d 3e 66 61 6c 6c       if( p->fall
20cb0 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  back==0 ){.     
20cc0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
20cd0 22 20 20 20 20 30 2c 20 20 2f 2a 20 25 31 30 73  "    0,  /* %10s
20ce0 20 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e   => nothing */\n
20cf0 22 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ", p->name);.   
20d00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20d10 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
20d20 20 20 25 33 64 2c 20 20 2f 2a 20 25 31 30 73 20    %3d,  /* %10s 
20d30 3d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e  => %s */\n", p->
20d40 66 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65 78 2c  fallback->index,
20d50 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 61  .          p->na
20d60 6d 65 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d  me, p->fallback-
20d70 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  >name);.      }.
20d80 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a        lineno++;.
20d90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74      }.  }.  tplt
20da0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
20db0 2c 20 69 6e 2c 20 6f 75 74 2c 20 26 6c 69 6e 65  , in, out, &line
20dc0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
20dd0 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74  ate a table cont
20de0 61 69 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f  aining the symbo
20df0 6c 69 63 20 6e 61 6d 65 20 6f 66 20 65 76 65 72  lic name of ever
20e00 79 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20  y symbol.  */.  
20e10 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
20e20 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
20e30 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74      lemon_sprint
20e40 66 28 6c 69 6e 65 2c 22 5c 22 25 73 5c 22 2c 22  f(line,"\"%s\","
20e50 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
20e60 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 70  ]->name);.    fp
20e70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 2d 31  rintf(out,"  %-1
20e80 35 73 22 2c 6c 69 6e 65 29 3b 0a 20 20 20 20 69  5s",line);.    i
20e90 66 28 20 28 69 26 33 29 3d 3d 33 20 29 7b 20 66  f( (i&3)==3 ){ f
20ea0 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29  printf(out,"\n")
20eb0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20  ; lineno++; }.  
20ec0 7d 0a 20 20 69 66 28 20 28 69 26 33 29 21 3d 30  }.  if( (i&3)!=0
20ed0 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   ){ fprintf(out,
20ee0 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
20ef0 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
20f00 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
20f10 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
20f20 20 47 65 6e 65 72 61 74 65 20 61 20 74 61 62 6c   Generate a tabl
20f30 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74  e containing a t
20f40 65 78 74 20 73 74 72 69 6e 67 20 74 68 61 74 20  ext string that 
20f50 64 65 73 63 72 69 62 65 73 20 65 76 65 72 79 0a  describes every.
20f60 20 20 2a 2a 20 72 75 6c 65 20 69 6e 20 74 68 65    ** rule in the
20f70 20 72 75 6c 65 20 73 65 74 20 6f 66 20 74 68 65   rule set of the
20f80 20 67 72 61 6d 6d 61 72 2e 20 20 54 68 69 73 20   grammar.  This 
20f90 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
20fa0 73 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 72  sed.  ** when tr
20fb0 61 63 69 6e 67 20 52 45 44 55 43 45 20 61 63 74  acing REDUCE act
20fc0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
20fd0 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d 3e 72  (i=0, rp=lemp->r
20fe0 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
20ff0 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20  next, i++){.    
21000 61 73 73 65 72 74 28 20 72 70 2d 3e 69 52 75 6c  assert( rp->iRul
21010 65 3d 3d 69 20 29 3b 0a 20 20 20 20 66 70 72 69  e==i );.    fpri
21020 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 33 64  ntf(out," /* %3d
21030 20 2a 2f 20 5c 22 22 2c 20 69 29 3b 0a 20 20 20   */ \"", i);.   
21040 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f   writeRuleText(o
21050 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72  ut, rp);.    fpr
21060 69 6e 74 66 28 6f 75 74 2c 22 5c 22 2c 5c 6e 22  intf(out,"\",\n"
21070 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
21080 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
21090 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
210a0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
210b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
210c0 63 68 20 65 78 65 63 75 74 65 73 20 65 76 65 72  ch executes ever
210d0 79 20 74 69 6d 65 20 61 20 73 79 6d 62 6f 6c 20  y time a symbol 
210e0 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d 0a 20  is popped from. 
210f0 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 20 77 68   ** the stack wh
21100 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 65  ile processing e
21110 72 72 6f 72 73 20 6f 72 20 77 68 69 6c 65 20 64  rrors or while d
21120 65 73 74 72 6f 79 69 6e 67 20 74 68 65 20 70 61  estroying the pa
21130 72 73 65 72 2e 20 0a 20 20 2a 2a 20 28 49 6e 20  rser. .  ** (In 
21140 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 67 65 6e  other words, gen
21150 65 72 61 74 65 20 74 68 65 20 25 64 65 73 74 72  erate the %destr
21160 75 63 74 6f 72 20 61 63 74 69 6f 6e 73 29 0a 20  uctor actions). 
21170 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
21180 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a 20 20 20  tokendest ){.   
21190 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20   int once = 1;. 
211a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
211b0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
211c0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
211d0 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
211e0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
211f0 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c       if( sp==0 |
21200 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54 45 52 4d  | sp->type!=TERM
21210 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  INAL ) continue;
21220 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20  .      if( once 
21230 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
21240 74 66 28 6f 75 74 2c 20 22 20 20 20 20 20 20 2f  tf(out, "      /
21250 2a 20 54 45 52 4d 49 4e 41 4c 20 44 65 73 74 72  * TERMINAL Destr
21260 75 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20 6c 69  uctor */\n"); li
21270 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
21280 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  once = 0;.      
21290 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
212a0 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64  out,"    case %d
212b0 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73  : /* %s */\n", s
212c0 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61  p->index, sp->na
212d0 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
212e0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
212f0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
21300 6c 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  l && lemp->symbo
21310 6c 73 5b 69 5d 2d 3e 74 79 70 65 21 3d 54 45 52  ls[i]->type!=TER
21320 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20 20  MINAL; i++);.   
21330 20 69 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79   if( i<lemp->nsy
21340 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 65 6d  mbol ){.      em
21350 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
21360 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d  de(out,lemp->sym
21370 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69  bols[i],lemp,&li
21380 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70 72  neno);.      fpr
21390 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
213a0 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
213b0 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  no++;.    }.  }.
213c0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64    if( lemp->vard
213d0 65 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  est ){.    struc
213e0 74 20 73 79 6d 62 6f 6c 20 2a 64 66 6c 74 5f 73  t symbol *dflt_s
213f0 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6f  p = 0;.    int o
21400 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72  nce = 1;.    for
21410 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
21420 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
21430 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
21440 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d   *sp = lemp->sym
21450 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69  bols[i];.      i
21460 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e  f( sp==0 || sp->
21470 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c  type==TERMINAL |
21480 7c 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  |.          sp->
21490 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73 70 2d 3e  index<=0 || sp->
214a0 64 65 73 74 72 75 63 74 6f 72 21 3d 30 20 29 20  destructor!=0 ) 
214b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
214c0 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20  if( once ){.    
214d0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
214e0 20 22 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75   "      /* Defau
214f0 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49 4e 41 4c 20  lt NON-TERMINAL 
21500 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22  Destructor */\n"
21510 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
21520 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
21530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
21540 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61  intf(out,"    ca
21550 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c  se %d: /* %s */\
21560 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73  n", sp->index, s
21570 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  p->name); lineno
21580 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f 73  ++;.      dflt_s
21590 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20 20  p = sp;.    }.  
215a0 20 20 69 66 28 20 64 66 6c 74 5f 73 70 21 3d 30    if( dflt_sp!=0
215b0 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64   ){.      emit_d
215c0 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f  estructor_code(o
215d0 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70 2c  ut,dflt_sp,lemp,
215e0 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 7d 0a  &lineno);.    }.
215f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
21600 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22  "      break;\n"
21610 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
21620 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
21630 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
21640 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79  ){.    struct sy
21650 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
21660 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
21670 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70   if( sp==0 || sp
21680 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
21690 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74   || sp->destruct
216a0 6f 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  or==0 ) continue
216b0 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 64 65  ;.    if( sp->de
216c0 73 74 4c 69 6e 65 6e 6f 3c 30 20 29 20 63 6f 6e  stLineno<0 ) con
216d0 74 69 6e 75 65 3b 20 20 2f 2a 20 41 6c 72 65 61  tinue;  /* Alrea
216e0 64 79 20 65 6d 69 74 74 65 64 20 2a 2f 0a 20 20  dy emitted */.  
216f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
21700 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25     case %d: /* %
21710 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64  s */\n", sp->ind
21720 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c  ex, sp->name); l
21730 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  ineno++;..    /*
21740 20 43 6f 6d 62 69 6e 65 20 64 75 70 6c 69 63 61   Combine duplica
21750 74 65 20 64 65 73 74 72 75 63 74 6f 72 73 20 69  te destructors i
21760 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 63 61 73  nto a single cas
21770 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 69  e */.    for(j=i
21780 2b 31 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  +1; j<lemp->nsym
21790 62 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  bol; j++){.     
217a0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
217b0 73 70 32 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62  sp2 = lemp->symb
217c0 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  ols[j];.      if
217d0 28 20 73 70 32 20 26 26 20 73 70 32 2d 3e 74 79  ( sp2 && sp2->ty
217e0 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 26 26 20  pe!=TERMINAL && 
217f0 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 0a  sp2->destructor.
21800 20 20 20 20 20 20 20 20 20 20 26 26 20 73 70 32            && sp2
21810 2d 3e 64 74 6e 75 6d 3d 3d 73 70 2d 3e 64 74 6e  ->dtnum==sp->dtn
21820 75 6d 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  um.          && 
21830 73 74 72 63 6d 70 28 73 70 2d 3e 64 65 73 74 72  strcmp(sp->destr
21840 75 63 74 6f 72 2c 73 70 32 2d 3e 64 65 73 74 72  uctor,sp2->destr
21850 75 63 74 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20  uctor)==0 ){.   
21860 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
21870 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20  t,"    case %d: 
21880 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20  /* %s */\n",.   
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 70                sp
218a0 32 2d 3e 69 6e 64 65 78 2c 20 73 70 32 2d 3e 6e  2->index, sp2->n
218b0 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
218c0 20 20 20 20 20 20 20 20 20 73 70 32 2d 3e 64 65           sp2->de
218d0 73 74 4c 69 6e 65 6e 6f 20 3d 20 2d 31 3b 20 20  stLineno = -1;  
218e0 2f 2a 20 41 76 6f 69 64 20 65 6d 69 74 74 69 6e  /* Avoid emittin
218f0 67 20 74 68 69 73 20 64 65 73 74 72 75 63 74 6f  g this destructo
21900 72 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20  r again */.     
21910 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6d   }.    }..    em
21920 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
21930 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d  de(out,lemp->sym
21940 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69  bols[i],lemp,&li
21950 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e  neno);.    fprin
21960 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72  tf(out,"      br
21970 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  eak;\n"); lineno
21980 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  ++;.  }.  tplt_x
21990 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
219a0 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
219b0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
219c0 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
219d0 65 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  es whenever the 
219e0 70 61 72 73 65 72 20 73 74 61 63 6b 20 6f 76 65  parser stack ove
219f0 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 74 70 6c 74  rflows */.  tplt
21a00 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
21a10 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 2c 26  lemp->overflow,&
21a20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f  lineno);.  tplt_
21a30 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
21a40 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
21a50 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
21a60 74 68 65 20 74 61 62 6c 65 20 6f 66 20 72 75 6c  the table of rul
21a70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 20  e information . 
21a80 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54   **.  ** Note: T
21a90 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
21aa0 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
21ab0 74 20 72 75 6c 65 73 20 61 72 65 20 6e 75 6d 62  t rules are numb
21ac0 65 72 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74 75  er.  ** sequentu
21ad0 61 6c 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20 77  ally beginning w
21ae0 69 74 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ith 0..  */.  fo
21af0 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
21b00 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
21b10 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
21b20 75 74 2c 22 20 20 7b 20 25 64 2c 20 25 64 20 7d  ut,"  { %d, %d }
21b30 2c 5c 6e 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e  ,\n",rp->lhs->in
21b40 64 65 78 2c 72 70 2d 3e 6e 72 68 73 29 3b 20 6c  dex,rp->nrhs); l
21b50 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
21b60 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
21b70 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
21b80 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
21b90 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
21ba0 78 65 63 75 74 69 6f 6e 20 64 75 72 69 6e 67 20  xecution during 
21bb0 65 61 63 68 20 52 45 44 55 43 45 20 61 63 74 69  each REDUCE acti
21bc0 6f 6e 20 2a 2f 0a 20 20 69 20 3d 20 30 3b 0a 20  on */.  i = 0;. 
21bd0 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
21be0 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
21bf0 65 78 74 29 7b 0a 20 20 20 20 69 20 2b 3d 20 74  ext){.    i += t
21c00 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28 6c 65  ranslate_code(le
21c10 6d 70 2c 20 72 70 29 3b 0a 20 20 7d 0a 20 20 69  mp, rp);.  }.  i
21c20 66 28 20 69 20 29 7b 0a 20 20 20 20 66 70 72 69  f( i ){.    fpri
21c30 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20  ntf(out,"       
21c40 20 59 59 4d 49 4e 4f 52 54 59 50 45 20 79 79 6c   YYMINORTYPE yyl
21c50 68 73 6d 69 6e 6f 72 3b 5c 6e 22 29 3b 20 6c 69  hsminor;\n"); li
21c60 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 2f 2a  neno++;.  }.  /*
21c70 20 46 69 72 73 74 20 6f 75 74 70 75 74 20 72 75   First output ru
21c80 6c 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  les other than t
21c90 68 65 20 64 65 66 61 75 6c 74 3a 20 72 75 6c 65  he default: rule
21ca0 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d   */.  for(rp=lem
21cb0 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
21cc0 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 73  rp->next){.    s
21cd0 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 32 3b  truct rule *rp2;
21ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21cf0 2a 20 4f 74 68 65 72 20 72 75 6c 65 73 20 77 69  * Other rules wi
21d00 74 68 20 74 68 65 20 73 61 6d 65 20 61 63 74 69  th the same acti
21d10 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 70  on */.    if( rp
21d20 2d 3e 63 6f 64 65 45 6d 69 74 74 65 64 20 29 20  ->codeEmitted ) 
21d30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
21d40 28 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 29 7b 0a  ( rp->noCode ){.
21d50 20 20 20 20 20 20 2f 2a 20 4e 6f 20 43 20 63 6f        /* No C co
21d60 64 65 20 61 63 74 69 6f 6e 73 2c 20 73 6f 20 74  de actions, so t
21d70 68 69 73 20 77 69 6c 6c 20 62 65 20 70 61 72 74  his will be part
21d80 20 6f 66 20 74 68 65 20 22 64 65 66 61 75 6c 74   of the "default
21d90 3a 22 20 72 75 6c 65 20 2a 2f 0a 20 20 20 20 20  :" rule */.     
21da0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
21db0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
21dc0 2c 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a  ,"      case %d:
21dd0 20 2f 2a 20 22 2c 20 72 70 2d 3e 69 52 75 6c 65   /* ", rp->iRule
21de0 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65  );.    writeRule
21df0 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20  Text(out, rp);. 
21e00 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
21e10 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  " */\n"); lineno
21e20 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 72 70 32 3d  ++;.    for(rp2=
21e30 72 70 2d 3e 6e 65 78 74 3b 20 72 70 32 3b 20 72  rp->next; rp2; r
21e40 70 32 3d 72 70 32 2d 3e 6e 65 78 74 29 7b 0a 20  p2=rp2->next){. 
21e50 20 20 20 20 20 69 66 28 20 72 70 32 2d 3e 63 6f       if( rp2->co
21e60 64 65 3d 3d 72 70 2d 3e 63 6f 64 65 20 26 26 20  de==rp->code && 
21e70 72 70 32 2d 3e 63 6f 64 65 50 72 65 66 69 78 3d  rp2->codePrefix=
21e80 3d 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 0a  =rp->codePrefix.
21e90 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
21ea0 72 70 32 2d 3e 63 6f 64 65 53 75 66 66 69 78 3d  rp2->codeSuffix=
21eb0 3d 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78 20  =rp->codeSuffix 
21ec0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
21ed0 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61  tf(out,"      ca
21ee0 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70 32  se %d: /* ", rp2
21ef0 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20  ->iRule);.      
21f00 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28    writeRuleText(
21f10 6f 75 74 2c 20 72 70 32 29 3b 0a 20 20 20 20 20  out, rp2);.     
21f20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
21f30 20 2a 2f 20 79 79 74 65 73 74 63 61 73 65 28 79   */ yytestcase(y
21f40 79 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22  yruleno==%d);\n"
21f50 2c 20 72 70 32 2d 3e 69 52 75 6c 65 29 3b 20 6c  , rp2->iRule); l
21f60 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
21f70 20 72 70 32 2d 3e 63 6f 64 65 45 6d 69 74 74 65   rp2->codeEmitte
21f80 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
21f90 20 20 20 7d 0a 20 20 20 20 65 6d 69 74 5f 63 6f     }.    emit_co
21fa0 64 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 26  de(out,rp,lemp,&
21fb0 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72  lineno);.    fpr
21fc0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
21fd0 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69    break;\n"); li
21fe0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 72 70 2d 3e  neno++;.    rp->
21ff0 63 6f 64 65 45 6d 69 74 74 65 64 20 3d 20 31 3b  codeEmitted = 1;
22000 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c  .  }.  /* Finall
22010 79 2c 20 6f 75 74 70 75 74 20 74 68 65 20 64 65  y, output the de
22020 66 61 75 6c 74 3a 20 72 75 6c 65 2e 20 20 57 65  fault: rule.  We
22030 20 63 68 6f 6f 73 65 20 61 73 20 74 68 65 20 64   choose as the d
22040 65 66 61 75 6c 74 3a 20 61 6c 6c 0a 20 20 2a 2a  efault: all.  **
22050 20 65 6d 70 74 79 20 61 63 74 69 6f 6e 73 2e 20   empty actions. 
22060 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
22070 2c 22 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ,"      default:
22080 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
22090 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
220a0 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
220b0 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72  next){.    if( r
220c0 70 2d 3e 63 6f 64 65 45 6d 69 74 74 65 64 20 29  p->codeEmitted )
220d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
220e0 73 73 65 72 74 28 20 72 70 2d 3e 6e 6f 43 6f 64  ssert( rp->noCod
220f0 65 20 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  e );.    fprintf
22100 28 6f 75 74 2c 22 20 20 20 20 20 20 2f 2a 20 28  (out,"      /* (
22110 25 64 29 20 22 2c 20 72 70 2d 3e 69 52 75 6c 65  %d) ", rp->iRule
22120 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65  );.    writeRule
22130 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20  Text(out, rp);. 
22140 20 20 20 69 66 28 20 72 70 2d 3e 64 6f 65 73 52     if( rp->doesR
22150 65 64 75 63 65 20 29 7b 0a 20 20 20 20 20 20 66  educe ){.      f
22160 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f  printf(out, " */
22170 20 79 79 74 65 73 74 63 61 73 65 28 79 79 72 75   yytestcase(yyru
22180 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72  leno==%d);\n", r
22190 70 2d 3e 69 52 75 6c 65 29 3b 20 6c 69 6e 65 6e  p->iRule); linen
221a0 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o++;.    }else{.
221b0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
221c0 74 2c 20 22 20 28 4f 50 54 49 4d 49 5a 45 44 20  t, " (OPTIMIZED 
221d0 4f 55 54 29 20 2a 2f 20 61 73 73 65 72 74 28 79  OUT) */ assert(y
221e0 79 72 75 6c 65 6e 6f 21 3d 25 64 29 3b 5c 6e 22  yruleno!=%d);\n"
221f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22200 72 70 2d 3e 69 52 75 6c 65 29 3b 20 6c 69 6e 65  rp->iRule); line
22210 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  no++;.    }.  }.
22220 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
22230 20 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22         break;\n"
22240 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74  ); lineno++;.  t
22250 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
22260 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
22270 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
22280 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
22290 78 65 63 75 74 65 73 20 69 66 20 61 20 70 61 72  xecutes if a par
222a0 73 65 20 66 61 69 6c 73 20 2a 2f 0a 20 20 74 70  se fails */.  tp
222b0 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
222c0 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65 2c  p,lemp->failure,
222d0 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74  &lineno);.  tplt
222e0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
222f0 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
22300 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
22310 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
22320 75 74 65 73 20 77 68 65 6e 20 61 20 73 79 6e 74  utes when a synt
22330 61 78 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ax error occurs 
22340 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
22350 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65  out,lemp,lemp->e
22360 72 72 6f 72 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  rror,&lineno);. 
22370 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
22380 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
22390 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
223a0 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
223b0 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 74   executes when t
223c0 68 65 20 70 61 72 73 65 72 20 61 63 63 65 70 74  he parser accept
223d0 73 20 69 74 73 20 69 6e 70 75 74 20 2a 2f 0a 20  s its input */. 
223e0 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
223f0 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61 63 63 65 70  lemp,lemp->accep
22400 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70  t,&lineno);.  tp
22410 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
22420 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
22430 6f 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64  o);..  /* Append
22440 20 61 6e 79 20 61 64 64 69 74 69 6f 6e 20 63 6f   any addition co
22450 64 65 20 74 68 65 20 75 73 65 72 20 64 65 73 69  de the user desi
22460 72 65 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  res */.  tplt_pr
22470 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
22480 70 2d 3e 65 78 74 72 61 63 6f 64 65 2c 26 6c 69  p->extracode,&li
22490 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73 65  neno);..  fclose
224a0 28 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 6f  (in);.  fclose(o
224b0 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  ut);.  return;.}
224c0 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20  ../* Generate a 
224d0 68 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20  header file for 
224e0 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f  the parser */.vo
224f0 69 64 20 52 65 70 6f 72 74 48 65 61 64 65 72 28  id ReportHeader(
22500 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
22510 6d 70 29 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f 75  mp).{.  FILE *ou
22520 74 2c 20 2a 69 6e 3b 0a 20 20 63 6f 6e 73 74 20  t, *in;.  const 
22530 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20  char *prefix;.  
22540 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49  char line[LINESI
22550 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70 61 74 74  ZE];.  char patt
22560 65 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20  ern[LINESIZE];. 
22570 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6c   int i;..  if( l
22580 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78  emp->tokenprefix
22590 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70   ) prefix = lemp
225a0 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20  ->tokenprefix;. 
225b0 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20   else           
225c0 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20           prefix 
225d0 3d 20 22 22 3b 0a 20 20 69 6e 20 3d 20 66 69 6c  = "";.  in = fil
225e0 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22  e_open(lemp,".h"
225f0 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e  ,"rb");.  if( in
22600 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74   ){.    int next
22610 43 68 61 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Char;.    for(i=
22620 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  1; i<lemp->nterm
22630 69 6e 61 6c 20 26 26 20 66 67 65 74 73 28 6c 69  inal && fgets(li
22640 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 3b  ne,LINESIZE,in);
22650 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6c 65 6d   i++){.      lem
22660 6f 6e 5f 73 70 72 69 6e 74 66 28 70 61 74 74 65  on_sprintf(patte
22670 72 6e 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d  rn,"#define %s%-
22680 33 30 73 20 25 33 64 5c 6e 22 2c 0a 20 20 20 20  30s %3d\n",.    
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226a0 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d  prefix,lemp->sym
226b0 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29  bols[i]->name,i)
226c0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  ;.      if( strc
226d0 6d 70 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e 29  mp(line,pattern)
226e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
226f0 20 20 20 20 6e 65 78 74 43 68 61 72 20 3d 20 66      nextChar = f
22700 67 65 74 63 28 69 6e 29 3b 0a 20 20 20 20 66 63  getc(in);.    fc
22710 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 69 66  lose(in);.    if
22720 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d  ( i==lemp->nterm
22730 69 6e 61 6c 20 26 26 20 6e 65 78 74 43 68 61 72  inal && nextChar
22740 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 2f  ==EOF ){.      /
22750 2a 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20 74  * No change in t
22760 68 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74 20  he file.  Don't 
22770 72 65 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a 20  rewrite it. */. 
22780 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
22790 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20 66   }.  }.  out = f
227a0 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e  ile_open(lemp,".
227b0 68 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20  h","wb");.  if( 
227c0 6f 75 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  out ){.    for(i
227d0 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =1; i<lemp->nter
227e0 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  minal; i++){.   
227f0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
22800 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20  #define %s%-30s 
22810 25 33 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65  %3d\n",prefix,le
22820 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
22830 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a 20  name,i);.    }. 
22840 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 20     fclose(out); 
22850 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a   .  }.  return;.
22860 7d 0a 0a 2f 2a 20 52 65 64 75 63 65 20 74 68 65  }../* Reduce the
22870 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63 74   size of the act
22880 69 6f 6e 20 74 61 62 6c 65 73 2c 20 69 66 20 70  ion tables, if p
22890 6f 73 73 69 62 6c 65 2c 20 62 79 20 6d 61 6b 69  ossible, by maki
228a0 6e 67 20 75 73 65 0a 2a 2a 20 6f 66 20 64 65 66  ng use.** of def
228b0 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  aults..**.** In 
228c0 74 68 69 73 20 76 65 72 73 69 6f 6e 2c 20 77 65  this version, we
228d0 20 74 61 6b 65 20 74 68 65 20 6d 6f 73 74 20 66   take the most f
228e0 72 65 71 75 65 6e 74 20 52 45 44 55 43 45 20 61  requent REDUCE a
228f0 63 74 69 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a  ction and make.*
22900 2a 20 69 74 20 74 68 65 20 64 65 66 61 75 6c 74  * it the default
22910 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 72 65  .  Except, there
22920 20 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 69   is no default i
22930 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74  f the wildcard t
22940 6f 6b 65 6e 0a 2a 2a 20 69 73 20 61 20 70 6f 73  oken.** is a pos
22950 73 69 62 6c 65 20 6c 6f 6f 6b 2d 61 68 65 61 64  sible look-ahead
22960 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70 72 65  ..*/.void Compre
22970 73 73 54 61 62 6c 65 73 28 73 74 72 75 63 74 20  ssTables(struct 
22980 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
22990 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
229a0 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74  tp;.  struct act
229b0 69 6f 6e 20 2a 61 70 2c 20 2a 61 70 32 2c 20 2a  ion *ap, *ap2, *
229c0 6e 65 78 74 61 70 3b 0a 20 20 73 74 72 75 63 74  nextap;.  struct
229d0 20 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c   rule *rp, *rp2,
229e0 20 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e   *rbest;.  int n
229f0 62 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69  best, n;.  int i
22a00 3b 0a 20 20 69 6e 74 20 75 73 65 73 57 69 6c 64  ;.  int usesWild
22a10 63 61 72 64 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  card;..  for(i=0
22a20 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
22a30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
22a40 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
22a50 5d 3b 0a 20 20 20 20 6e 62 65 73 74 20 3d 20 30  ];.    nbest = 0
22a60 3b 0a 20 20 20 20 72 62 65 73 74 20 3d 20 30 3b  ;.    rbest = 0;
22a70 0a 20 20 20 20 75 73 65 73 57 69 6c 64 63 61 72  .    usesWildcar
22a80 64 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28  d = 0;..    for(
22a90 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
22aa0 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
22ab0 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
22ac0 3d 3d 53 48 49 46 54 20 26 26 20 61 70 2d 3e 73  ==SHIFT && ap->s
22ad0 70 3d 3d 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72  p==lemp->wildcar
22ae0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65  d ){.        use
22af0 73 57 69 6c 64 63 61 72 64 20 3d 20 31 3b 0a 20  sWildcard = 1;. 
22b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
22b10 20 61 70 2d 3e 74 79 70 65 21 3d 52 45 44 55 43   ap->type!=REDUC
22b20 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  E ) continue;.  
22b30 20 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72      rp = ap->x.r
22b40 70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d  p;.      if( rp-
22b50 3e 6c 68 73 53 74 61 72 74 20 29 20 63 6f 6e 74  >lhsStart ) cont
22b60 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
22b70 72 70 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74  rp==rbest ) cont
22b80 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20  inue;.      n = 
22b90 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 32  1;.      for(ap2
22ba0 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20  =ap->next; ap2; 
22bb0 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a  ap2=ap2->next){.
22bc0 20 20 20 20 20 20 20 20 69 66 28 20 61 70 32 2d          if( ap2-
22bd0 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20 29 20  >type!=REDUCE ) 
22be0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
22bf0 20 20 72 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72    rp2 = ap2->x.r
22c00 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  p;.        if( r
22c10 70 32 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74  p2==rbest ) cont
22c20 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
22c30 28 20 72 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b  ( rp2==rp ) n++;
22c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
22c50 66 28 20 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20  f( n>nbest ){.  
22c60 20 20 20 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b        nbest = n;
22c70 0a 20 20 20 20 20 20 20 20 72 62 65 73 74 20 3d  .        rbest =
22c80 20 72 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rp;.      }.   
22c90 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 44 6f 20 6e   }. .    /* Do n
22ca0 6f 74 20 6d 61 6b 65 20 61 20 64 65 66 61 75 6c  ot make a defaul
22cb0 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t if the number 
22cc0 6f 66 20 72 75 6c 65 73 20 74 6f 20 64 65 66 61  of rules to defa
22cd0 75 6c 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ult.    ** is no
22ce0 74 20 61 74 20 6c 65 61 73 74 20 31 20 6f 72 20  t at least 1 or 
22cf0 69 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20  if the wildcard 
22d00 74 6f 6b 65 6e 20 69 73 20 61 20 70 6f 73 73 69  token is a possi
22d10 62 6c 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 6b 61  ble.    ** looka
22d20 68 65 61 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  head..    */.   
22d30 20 69 66 28 20 6e 62 65 73 74 3c 31 20 7c 7c 20   if( nbest<1 || 
22d40 75 73 65 73 57 69 6c 64 63 61 72 64 20 29 20 63  usesWildcard ) c
22d50 6f 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f  ontinue;...    /
22d60 2a 20 43 6f 6d 62 69 6e 65 20 6d 61 74 63 68 69  * Combine matchi
22d70 6e 67 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e  ng REDUCE action
22d80 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
22d90 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20 66  default */.    f
22da0 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
22db0 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
22dc0 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
22dd0 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61  ype==REDUCE && a
22de0 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29  p->x.rp==rbest )
22df0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
22e00 20 20 61 73 73 65 72 74 28 20 61 70 20 29 3b 0a    assert( ap );.
22e10 20 20 20 20 61 70 2d 3e 73 70 20 3d 20 53 79 6d      ap->sp = Sym
22e20 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c  bol_new("{defaul
22e30 74 7d 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70  t}");.    for(ap
22e40 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61  =ap->next; ap; a
22e50 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
22e60 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
22e70 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78  =REDUCE && ap->x
22e80 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 61 70 2d  .rp==rbest ) ap-
22e90 3e 74 79 70 65 20 3d 20 4e 4f 54 5f 55 53 45 44  >type = NOT_USED
22ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 70 2d  ;.    }.    stp-
22eb0 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72  >ap = Action_sor
22ec0 74 28 73 74 70 2d 3e 61 70 29 3b 0a 0a 20 20 20  t(stp->ap);..   
22ed0 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
22ee0 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
22ef0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  ){.      if( ap-
22f00 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 29 20 62  >type==SHIFT ) b
22f10 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
22f20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  ap->type==REDUCE
22f30 20 26 26 20 61 70 2d 3e 78 2e 72 70 21 3d 72 62   && ap->x.rp!=rb
22f40 65 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  est ) break;.   
22f50 20 7d 0a 20 20 20 20 69 66 28 20 61 70 3d 3d 30   }.    if( ap==0
22f60 20 29 7b 0a 20 20 20 20 20 20 73 74 70 2d 3e 61   ){.      stp->a
22f70 75 74 6f 52 65 64 75 63 65 20 3d 20 31 3b 0a 20  utoReduce = 1;. 
22f80 20 20 20 20 20 73 74 70 2d 3e 70 44 66 6c 74 52       stp->pDfltR
22f90 65 64 75 63 65 20 3d 20 72 62 65 73 74 3b 0a 20  educe = rbest;. 
22fa0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
22fb0 61 6b 65 20 61 20 73 65 63 6f 6e 64 20 70 61 73  ake a second pas
22fc0 73 20 6f 76 65 72 20 61 6c 6c 20 73 74 61 74 65  s over all state
22fd0 73 20 61 6e 64 20 61 63 74 69 6f 6e 73 2e 20 20  s and actions.  
22fe0 43 6f 6e 76 65 72 74 0a 20 20 2a 2a 20 65 76 65  Convert.  ** eve
22ff0 72 79 20 61 63 74 69 6f 6e 20 74 68 61 74 20 69  ry action that i
23000 73 20 61 20 53 48 49 46 54 20 74 6f 20 61 6e 20  s a SHIFT to an 
23010 61 75 74 6f 52 65 64 75 63 65 20 73 74 61 74 65  autoReduce state
23020 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 53 48 49   into.  ** a SHI
23030 46 54 52 45 44 55 43 45 20 61 63 74 69 6f 6e 2e  FTREDUCE action.
23040 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
23050 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
23060 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
23070 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
23080 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  ;.    for(ap=stp
23090 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
230a0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 73 74  >next){.      st
230b0 72 75 63 74 20 73 74 61 74 65 20 2a 70 4e 65 78  ruct state *pNex
230c0 74 53 74 61 74 65 3b 0a 20 20 20 20 20 20 69 66  tState;.      if
230d0 28 20 61 70 2d 3e 74 79 70 65 21 3d 53 48 49 46  ( ap->type!=SHIF
230e0 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  T ) continue;.  
230f0 20 20 20 20 70 4e 65 78 74 53 74 61 74 65 20 3d      pNextState =
23100 20 61 70 2d 3e 78 2e 73 74 70 3b 0a 20 20 20 20   ap->x.stp;.    
23110 20 20 69 66 28 20 70 4e 65 78 74 53 74 61 74 65    if( pNextState
23120 2d 3e 61 75 74 6f 52 65 64 75 63 65 20 26 26 20  ->autoReduce && 
23130 70 4e 65 78 74 53 74 61 74 65 2d 3e 70 44 66 6c  pNextState->pDfl
23140 74 52 65 64 75 63 65 21 3d 30 20 29 7b 0a 20 20  tReduce!=0 ){.  
23150 20 20 20 20 20 20 61 70 2d 3e 74 79 70 65 20 3d        ap->type =
23160 20 53 48 49 46 54 52 45 44 55 43 45 3b 0a 20 20   SHIFTREDUCE;.  
23170 20 20 20 20 20 20 61 70 2d 3e 78 2e 72 70 20 3d        ap->x.rp =
23180 20 70 4e 65 78 74 53 74 61 74 65 2d 3e 70 44 66   pNextState->pDf
23190 6c 74 52 65 64 75 63 65 3b 0a 20 20 20 20 20 20  ltReduce;.      
231a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
231b0 2a 20 49 66 20 61 20 53 48 49 46 54 52 45 44 55  * If a SHIFTREDU
231c0 43 45 20 61 63 74 69 6f 6e 20 73 70 65 63 69 66  CE action specif
231d0 69 65 73 20 61 20 72 75 6c 65 20 74 68 61 74 20  ies a rule that 
231e0 68 61 73 20 61 20 73 69 6e 67 6c 65 20 52 48 53  has a single RHS
231f0 20 74 65 72 6d 0a 20 20 2a 2a 20 28 6d 65 61 6e   term.  ** (mean
23200 69 6e 67 20 74 68 61 74 20 74 68 65 20 53 48 49  ing that the SHI
23210 46 54 52 45 44 55 43 45 20 77 69 6c 6c 20 6c 61  FTREDUCE will la
23220 6e 64 20 62 61 63 6b 20 69 6e 20 74 68 65 20 73  nd back in the s
23230 74 61 74 65 20 77 68 65 72 65 20 69 74 0a 20 20  tate where it.  
23240 2a 2a 20 73 74 61 72 74 65 64 29 20 61 6e 64 20  ** started) and 
23250 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 43  if there is no C
23260 2d 63 6f 64 65 20 61 73 73 6f 63 69 61 74 65 64  -code associated
23270 20 77 69 74 68 20 74 68 65 20 72 65 64 75 63 65   with the reduce
23280 20 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68   action,.  ** th
23290 65 6e 20 77 65 20 63 61 6e 20 67 6f 20 61 68 65  en we can go ahe
232a0 61 64 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74  ad and convert t
232b0 68 65 20 61 63 74 69 6f 6e 20 74 6f 20 62 65 20  he action to be 
232c0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a  the same as the.
232d0 20 20 2a 2a 20 61 63 74 69 6f 6e 20 66 6f 72 20    ** action for 
232e0 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 72  the RHS of the r
232f0 75 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ule..  */.  for(
23300 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
23310 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
23320 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
23330 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 61 70  d[i];.    for(ap
23340 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
23350 3d 6e 65 78 74 61 70 29 7b 0a 20 20 20 20 20 20  =nextap){.      
23360 6e 65 78 74 61 70 20 3d 20 61 70 2d 3e 6e 65 78  nextap = ap->nex
23370 74 3b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  t;.      if( ap-
23380 3e 74 79 70 65 21 3d 53 48 49 46 54 52 45 44 55  >type!=SHIFTREDU
23390 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  CE ) continue;. 
233a0 20 20 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e       rp = ap->x.
233b0 72 70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70  rp;.      if( rp
233c0 2d 3e 6e 6f 43 6f 64 65 3d 3d 30 20 29 20 63 6f  ->noCode==0 ) co
233d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
233e0 28 20 72 70 2d 3e 6e 72 68 73 21 3d 31 20 29 20  ( rp->nrhs!=1 ) 
233f0 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 20 31 0a  continue;.#if 1.
23400 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 70        /* Only ap
23410 70 6c 79 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  ply this optimiz
23420 61 74 69 6f 6e 20 74 6f 20 6e 6f 6e 2d 74 65 72  ation to non-ter
23430 6d 69 6e 61 6c 73 2e 20 20 49 74 20 77 6f 75 6c  minals.  It woul
23440 64 20 62 65 20 4f 4b 20 74 6f 0a 20 20 20 20 20  d be OK to.     
23450 20 2a 2a 20 61 70 70 6c 79 20 69 74 20 74 6f 20   ** apply it to 
23460 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
23470 20 74 6f 6f 2c 20 62 75 74 20 74 68 61 74 20 6d   too, but that m
23480 61 6b 65 73 20 74 68 65 20 70 61 72 73 65 72 20  akes the parser 
23490 74 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  tables.      ** 
234a0 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  larger. */.     
234b0 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
234c0 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  ex<lemp->ntermin
234d0 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23  al ) continue;.#
234e0 65 6e 64 69 66 0a 20 20 20 20 20 20 2f 2a 20 49  endif.      /* I
234f0 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
23500 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
23510 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
23520 20 63 61 6e 20 62 65 20 61 70 70 6c 69 65 64 20   can be applied 
23530 2a 2f 0a 20 20 20 20 20 20 6e 65 78 74 61 70 20  */.      nextap 
23540 3d 20 61 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  = ap;.      for(
23550 61 70 32 3d 73 74 70 2d 3e 61 70 3b 20 61 70 32  ap2=stp->ap; ap2
23560 20 26 26 20 28 61 70 32 3d 3d 61 70 20 7c 7c 20   && (ap2==ap || 
23570 61 70 32 2d 3e 73 70 21 3d 72 70 2d 3e 6c 68 73  ap2->sp!=rp->lhs
23580 29 3b 20 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74  ); ap2=ap2->next
23590 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74  ){}.      assert
235a0 28 20 61 70 32 21 3d 30 20 29 3b 0a 20 20 20 20  ( ap2!=0 );.    
235b0 20 20 61 70 2d 3e 73 70 4f 70 74 20 3d 20 61 70    ap->spOpt = ap
235c0 32 2d 3e 73 70 3b 0a 20 20 20 20 20 20 61 70 2d  2->sp;.      ap-
235d0 3e 74 79 70 65 20 3d 20 61 70 32 2d 3e 74 79 70  >type = ap2->typ
235e0 65 3b 0a 20 20 20 20 20 20 61 70 2d 3e 78 20 3d  e;.      ap->x =
235f0 20 61 70 32 2d 3e 78 3b 0a 20 20 20 20 7d 0a 20   ap2->x;.    }. 
23600 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   }.}.../*.** Com
23610 70 61 72 65 20 74 77 6f 20 73 74 61 74 65 73 20  pare two states 
23620 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70  for sorting purp
23630 6f 73 65 73 2e 20 20 54 68 65 20 73 6d 61 6c 6c  oses.  The small
23640 65 72 20 73 74 61 74 65 20 69 73 20 74 68 65 0a  er state is the.
23650 2a 2a 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  ** one with the 
23660 6d 6f 73 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  most non-termina
23670 6c 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74  l actions.  If t
23680 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d  hey have the sam
23690 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e  e number.** of n
236a0 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74 69  on-terminal acti
236b0 6f 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 73 6d  ons, then the sm
236c0 61 6c 6c 65 72 20 69 73 20 74 68 65 20 6f 6e 65  aller is the one
236d0 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74 0a 2a   with the most.*
236e0 2a 20 74 6f 6b 65 6e 20 61 63 74 69 6f 6e 73 2e  * token actions.
236f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
23700 74 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72  tateResortCompar
23710 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c  e(const void *a,
23720 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b   const void *b){
23730 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
23740 73 74 61 74 65 20 2a 70 41 20 3d 20 2a 28 63 6f  state *pA = *(co
23750 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65  nst struct state
23760 2a 2a 29 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74  **)a;.  const st
23770 72 75 63 74 20 73 74 61 74 65 20 2a 70 42 20 3d  ruct state *pB =
23780 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20   *(const struct 
23790 73 74 61 74 65 2a 2a 29 62 3b 0a 20 20 69 6e 74  state**)b;.  int
237a0 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e   n;..  n = pB->n
237b0 4e 74 41 63 74 20 2d 20 70 41 2d 3e 6e 4e 74 41  NtAct - pA->nNtA
237c0 63 74 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29  ct;.  if( n==0 )
237d0 7b 0a 20 20 20 20 6e 20 3d 20 70 42 2d 3e 6e 54  {.    n = pB->nT
237e0 6b 6e 41 63 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e  knAct - pA->nTkn
237f0 41 63 74 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  Act;.    if( n==
23800 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70  0 ){.      n = p
23810 42 2d 3e 73 74 61 74 65 6e 75 6d 20 2d 20 70 41  B->statenum - pA
23820 2d 3e 73 74 61 74 65 6e 75 6d 3b 0a 20 20 20 20  ->statenum;.    
23830 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
23840 6e 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  n!=0 );.  return
23850 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65   n;.}.../*.** Re
23860 6e 75 6d 62 65 72 20 61 6e 64 20 72 65 73 6f 72  number and resor
23870 74 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74  t states so that
23880 20 73 74 61 74 65 73 20 77 69 74 68 20 66 65 77   states with few
23890 65 72 20 63 68 6f 69 63 65 73 0a 2a 2a 20 6f 63  er choices.** oc
238a0 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20  cur at the end. 
238b0 20 45 78 63 65 70 74 2c 20 6b 65 65 70 20 73 74   Except, keep st
238c0 61 74 65 20 30 20 61 73 20 74 68 65 20 66 69 72  ate 0 as the fir
238d0 73 74 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69  st state..*/.voi
238e0 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28 73  d ResortStates(s
238f0 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
23900 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p).{.  int i;.  
23910 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
23920 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p;.  struct acti
23930 6f 6e 20 2a 61 70 3b 0a 0a 20 20 66 6f 72 28 69  on *ap;..  for(i
23940 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
23950 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
23960 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
23970 5b 69 5d 3b 0a 20 20 20 20 73 74 70 2d 3e 6e 54  [i];.    stp->nT
23980 6b 6e 41 63 74 20 3d 20 73 74 70 2d 3e 6e 4e 74  knAct = stp->nNt
23990 41 63 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 70  Act = 0;.    stp
239a0 2d 3e 69 44 66 6c 74 52 65 64 75 63 65 20 3d 20  ->iDfltReduce = 
239b0 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 20 20 2f 2a  lemp->nrule;  /*
239c0 20 49 6e 69 74 20 64 66 6c 74 20 61 63 74 69 6f   Init dflt actio
239d0 6e 20 74 6f 20 22 73 79 6e 74 61 78 20 65 72 72  n to "syntax err
239e0 6f 72 22 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e  or" */.    stp->
239f0 69 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46  iTknOfst = NO_OF
23a00 46 53 45 54 3b 0a 20 20 20 20 73 74 70 2d 3e 69  FSET;.    stp->i
23a10 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53  NtOfst = NO_OFFS
23a20 45 54 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73  ET;.    for(ap=s
23a30 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
23a40 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
23a50 69 6e 74 20 69 41 63 74 69 6f 6e 20 3d 20 63 6f  int iAction = co
23a60 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d  mpute_action(lem
23a70 70 2c 61 70 29 3b 0a 20 20 20 20 20 20 69 66 28  p,ap);.      if(
23a80 20 69 41 63 74 69 6f 6e 3e 3d 30 20 29 7b 0a 20   iAction>=0 ){. 
23a90 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73         if( ap->s
23aa0 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e  p->index<lemp->n
23ab0 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20  terminal ){.    
23ac0 20 20 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41        stp->nTknA
23ad0 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  ct++;.        }e
23ae0 6c 73 65 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e  lse if( ap->sp->
23af0 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  index<lemp->nsym
23b00 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  bol ){.         
23b10 20 73 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b 3b 0a   stp->nNtAct++;.
23b20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
23b30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
23b40 20 73 74 70 2d 3e 61 75 74 6f 52 65 64 75 63 65   stp->autoReduce
23b50 3d 3d 30 20 7c 7c 20 73 74 70 2d 3e 70 44 66 6c  ==0 || stp->pDfl
23b60 74 52 65 64 75 63 65 3d 3d 61 70 2d 3e 78 2e 72  tReduce==ap->x.r
23b70 70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  p );.          s
23b80 74 70 2d 3e 69 44 66 6c 74 52 65 64 75 63 65 20  tp->iDfltReduce 
23b90 3d 20 69 41 63 74 69 6f 6e 20 2d 20 6c 65 6d 70  = iAction - lemp
23ba0 2d 3e 6e 73 74 61 74 65 20 2d 20 6c 65 6d 70 2d  ->nstate - lemp-
23bb0 3e 6e 72 75 6c 65 3b 0a 20 20 20 20 20 20 20 20  >nrule;.        
23bc0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
23bd0 20 20 7d 0a 20 20 71 73 6f 72 74 28 26 6c 65 6d    }.  qsort(&lem
23be0 70 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c 20 6c 65  p->sorted[1], le
23bf0 6d 70 2d 3e 6e 73 74 61 74 65 2d 31 2c 20 73 69  mp->nstate-1, si
23c00 7a 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72 74 65  zeof(lemp->sorte
23c10 64 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20 73  d[0]),.        s
23c20 74 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72  tateResortCompar
23c30 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
23c40 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
23c50 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73  ++){.    lemp->s
23c60 6f 72 74 65 64 5b 69 5d 2d 3e 73 74 61 74 65 6e  orted[i]->staten
23c70 75 6d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 6c 65  um = i;.  }.  le
23c80 6d 70 2d 3e 6e 78 73 74 61 74 65 20 3d 20 6c 65  mp->nxstate = le
23c90 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68  mp->nstate;.  wh
23ca0 69 6c 65 28 20 6c 65 6d 70 2d 3e 6e 78 73 74 61  ile( lemp->nxsta
23cb0 74 65 3e 31 20 26 26 20 6c 65 6d 70 2d 3e 73 6f  te>1 && lemp->so
23cc0 72 74 65 64 5b 6c 65 6d 70 2d 3e 6e 78 73 74 61  rted[lemp->nxsta
23cd0 74 65 2d 31 5d 2d 3e 61 75 74 6f 52 65 64 75 63  te-1]->autoReduc
23ce0 65 20 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 6e  e ){.    lemp->n
23cf0 78 73 74 61 74 65 2d 2d 3b 0a 20 20 7d 0a 7d 0a  xstate--;.  }.}.
23d00 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
23d10 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
23d20 6c 65 20 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a  le "set.c" *****
23d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
23d50 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70  ./*.** Set manip
23d60 75 6c 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73  ulation routines
23d70 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70   for the LEMON p
23d80 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
23d90 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
23da0 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65  size = 0;../* Se
23db0 74 20 74 68 65 20 73 65 74 20 73 69 7a 65 20 2a  t the set size *
23dc0 2f 0a 76 6f 69 64 20 53 65 74 53 69 7a 65 28 69  /.void SetSize(i
23dd0 6e 74 20 6e 29 0a 7b 0a 20 20 73 69 7a 65 20 3d  nt n).{.  size =
23de0 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f   n+1;.}../* Allo
23df0 63 61 74 65 20 61 20 6e 65 77 20 73 65 74 20 2a  cate a new set *
23e00 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 76  /.char *SetNew(v
23e10 6f 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b  oid){.  char *s;
23e20 0a 20 20 73 20 3d 20 28 63 68 61 72 2a 29 63 61  .  s = (char*)ca
23e30 6c 6c 6f 63 28 20 73 69 7a 65 2c 20 31 29 3b 0a  lloc( size, 1);.
23e40 20 20 69 66 28 20 73 3d 3d 30 20 29 7b 0a 20 20    if( s==0 ){.  
23e50 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d 65    extern void me
23e60 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20  mory_error();.  
23e70 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29    memory_error()
23e80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
23e90 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61  ;.}../* Dealloca
23ea0 74 65 20 61 20 73 65 74 20 2a 2f 0a 76 6f 69 64  te a set */.void
23eb0 20 53 65 74 46 72 65 65 28 63 68 61 72 20 2a 73   SetFree(char *s
23ec0 29 0a 7b 0a 20 20 66 72 65 65 28 73 29 3b 0a 7d  ).{.  free(s);.}
23ed0 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 65  ../* Add a new e
23ee0 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 73 65  lement to the se
23ef0 74 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  t.  Return TRUE 
23f00 69 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 77  if the element w
23f10 61 73 20 61 64 64 65 64 0a 2a 2a 20 61 6e 64 20  as added.** and 
23f20 46 41 4c 53 45 20 69 66 20 69 74 20 77 61 73 20  FALSE if it was 
23f30 61 6c 72 65 61 64 79 20 74 68 65 72 65 2e 20 2a  already there. *
23f40 2f 0a 69 6e 74 20 53 65 74 41 64 64 28 63 68 61  /.int SetAdd(cha
23f50 72 20 2a 73 2c 20 69 6e 74 20 65 29 0a 7b 0a 20  r *s, int e).{. 
23f60 20 69 6e 74 20 72 76 3b 0a 20 20 61 73 73 65 72   int rv;.  asser
23f70 74 28 20 65 3e 3d 30 20 26 26 20 65 3c 73 69 7a  t( e>=0 && e<siz
23f80 65 20 29 3b 0a 20 20 72 76 20 3d 20 73 5b 65 5d  e );.  rv = s[e]
23f90 3b 0a 20 20 73 5b 65 5d 20 3d 20 31 3b 0a 20 20  ;.  s[e] = 1;.  
23fa0 72 65 74 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f  return !rv;.}../
23fb0 2a 20 41 64 64 20 65 76 65 72 79 20 65 6c 65 6d  * Add every elem
23fc0 65 6e 74 20 6f 66 20 73 32 20 74 6f 20 73 31 2e  ent of s2 to s1.
23fd0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
23fe0 20 73 31 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a   s1 changes. */.
23ff0 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28 63 68 61  int SetUnion(cha
24000 72 20 2a 73 31 2c 20 63 68 61 72 20 2a 73 32 29  r *s1, char *s2)
24010 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 70 72 6f 67  .{.  int i, prog
24020 72 65 73 73 3b 0a 20 20 70 72 6f 67 72 65 73 73  ress;.  progress
24030 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
24040 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20   i<size; i++){. 
24050 20 20 20 69 66 28 20 73 32 5b 69 5d 3d 3d 30 20     if( s2[i]==0 
24060 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
24070 69 66 28 20 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a  if( s1[i]==0 ){.
24080 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d        progress =
24090 20 31 3b 0a 20 20 20 20 20 20 73 31 5b 69 5d 20   1;.      s1[i] 
240a0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
240b0 20 72 65 74 75 72 6e 20 70 72 6f 67 72 65 73 73   return progress
240c0 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
240d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
240e0 20 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65   the file "table
240f0 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
24100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24110 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65  /./*.** All code
24120 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68 61   in this file ha
24130 73 20 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63  s been automatic
24140 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 0a 2a  ally generated.*
24150 2a 20 66 72 6f 6d 20 61 20 73 70 65 63 69 66 69  * from a specifi
24160 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69  cation in the fi
24170 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  le.**           
24180 20 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20     "table.q".** 
24190 62 79 20 74 68 65 20 61 73 73 6f 63 69 61 74 69  by the associati
241a0 76 65 20 61 72 72 61 79 20 63 6f 64 65 20 62 75  ve array code bu
241b0 69 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d 20 22  ilding program "
241c0 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f  aagen"..** Do no
241d0 74 20 65 64 69 74 20 74 68 69 73 20 66 69 6c 65  t edit this file
241e0 21 20 20 49 6e 73 74 65 61 64 2c 20 65 64 69 74  !  Instead, edit
241f0 20 74 68 65 20 73 70 65 63 69 66 69 63 61 74 69   the specificati
24200 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  on.** file, then
24210 20 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f   rerun aagen..*/
24220 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20  ./*.** Code for 
24230 70 72 6f 63 65 73 73 69 6e 67 20 74 61 62 6c 65  processing table
24240 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  s in the LEMON p
24250 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
24260 0a 2a 2f 0a 0a 50 52 49 56 41 54 45 20 75 6e 73  .*/..PRIVATE uns
24270 69 67 6e 65 64 20 73 74 72 68 61 73 68 28 63 6f  igned strhash(co
24280 6e 73 74 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20  nst char *x).{. 
24290 20 75 6e 73 69 67 6e 65 64 20 68 20 3d 20 30 3b   unsigned h = 0;
242a0 0a 20 20 77 68 69 6c 65 28 20 2a 78 20 29 20 68  .  while( *x ) h
242b0 20 3d 20 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29   = h*13 + *(x++)
242c0 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a  ;.  return h;.}.
242d0 0a 2f 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73  ./* Works like s
242e0 74 72 64 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20  trdup, sort of. 
242f0 20 53 61 76 65 20 61 20 73 74 72 69 6e 67 20 69   Save a string i
24300 6e 20 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72  n malloced memor
24310 79 2c 20 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73  y, but.** keep s
24320 74 72 69 6e 67 73 20 69 6e 20 61 20 74 61 62 6c  trings in a tabl
24330 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 61  e so that the sa
24340 6d 65 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74  me string is not
24350 20 69 6e 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e   in more.** than
24360 20 6f 6e 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63   one place..*/.c
24370 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61  onst char *Strsa
24380 66 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 79  fe(const char *y
24390 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ).{.  const char
243a0 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 63 70 79   *z;.  char *cpy
243b0 3b 0a 0a 20 20 69 66 28 20 79 3d 3d 30 20 29 20  ;..  if( y==0 ) 
243c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20  return 0;.  z = 
243d0 53 74 72 73 61 66 65 5f 66 69 6e 64 28 79 29 3b  Strsafe_find(y);
243e0 0a 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 28  .  if( z==0 && (
243f0 63 70 79 3d 28 63 68 61 72 20 2a 29 6d 61 6c 6c  cpy=(char *)mall
24400 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
24410 79 29 2b 31 20 29 29 21 3d 30 20 29 7b 0a 20 20  y)+1 ))!=0 ){.  
24420 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63    lemon_strcpy(c
24430 70 79 2c 79 29 3b 0a 20 20 20 20 7a 20 3d 20 63  py,y);.    z = c
24440 70 79 3b 0a 20 20 20 20 53 74 72 73 61 66 65 5f  py;.    Strsafe_
24450 69 6e 73 65 72 74 28 7a 29 3b 0a 20 20 7d 0a 20  insert(z);.  }. 
24460 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 7a 29 3b   MemoryCheck(z);
24470 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
24480 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
24490 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
244a0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
244b0 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  ure for each.** 
244c0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
244d0 79 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a  y of type "x1"..
244e0 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 31 20 7b  */.struct s_x1 {
244f0 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
24500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24510 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
24520 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a  lable slots. */.
24530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d            /*   M
24550 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
24560 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e  f 2 greater than
24570 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   or */.         
24580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24590 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31   /*   equal to 1
245a0 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b   */.  int count;
245b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
245c0 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65   Number of curre
245d0 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65  ntly slots fille
245e0 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  d */.  struct s_
245f0 78 31 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a  x1node *tbl;  /*
24600 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   The data stored
24610 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
24620 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 68 74 3b  t s_x1node **ht;
24630 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
24640 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d  for lookups */.}
24650 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
24660 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
24670 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f  his structure fo
24680 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65  r every data ele
24690 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73  ment.** in an as
246a0 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
246b0 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f  of type "x1"..*/
246c0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
246d0 73 5f 78 31 6e 6f 64 65 20 7b 0a 20 20 63 6f 6e  s_x1node {.  con
246e0 73 74 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  st char *data;  
246f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
24700 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  a */.  struct s_
24710 78 31 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x1node *next;   
24720 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
24730 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
24740 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
24750 31 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  1node **from;  /
24760 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
24770 2a 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x1node;../*
24780 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
24790 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
247a0 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
247b0 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
247c0 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
247d0 74 20 73 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a  t s_x1 *x1a;../*
247e0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
247f0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
24800 79 20 2a 2f 0a 76 6f 69 64 20 53 74 72 73 61 66  y */.void Strsaf
24810 65 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20  e_init(void){.  
24820 69 66 28 20 78 31 61 20 29 20 72 65 74 75 72 6e  if( x1a ) return
24830 3b 0a 20 20 78 31 61 20 3d 20 28 73 74 72 75 63  ;.  x1a = (struc
24840 74 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63 28 20  t s_x1*)malloc( 
24850 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f  sizeof(struct s_
24860 78 31 29 20 29 3b 0a 20 20 69 66 28 20 78 31 61  x1) );.  if( x1a
24870 20 29 7b 0a 20 20 20 20 78 31 61 2d 3e 73 69 7a   ){.    x1a->siz
24880 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 78 31  e = 1024;.    x1
24890 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
248a0 20 20 78 31 61 2d 3e 74 62 6c 20 3d 20 28 78 31    x1a->tbl = (x1
248b0 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 31 30 32  node*)calloc(102
248c0 34 2c 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65  4, sizeof(x1node
248d0 29 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64  ) + sizeof(x1nod
248e0 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 78 31  e*));.    if( x1
248f0 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
24900 20 20 20 66 72 65 65 28 78 31 61 29 3b 0a 20 20     free(x1a);.  
24910 20 20 20 20 78 31 61 20 3d 20 30 3b 0a 20 20 20      x1a = 0;.   
24920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
24930 74 20 69 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e  t i;.      x1a->
24940 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26  ht = (x1node**)&
24950 28 78 31 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29  (x1a->tbl[1024])
24960 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
24970 20 69 3c 31 30 32 34 3b 20 69 2b 2b 29 20 78 31   i<1024; i++) x1
24980 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
24990 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73    }.  }.}./* Ins
249a0 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
249b0 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e   into the array.
249c0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
249d0 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20   successful..** 
249e0 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20  Prior data with 
249f0 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
24a00 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20  NOT overwritten 
24a10 2a 2f 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69  */.int Strsafe_i
24a20 6e 73 65 72 74 28 63 6f 6e 73 74 20 63 68 61 72  nsert(const char
24a30 20 2a 64 61 74 61 29 0a 7b 0a 20 20 78 31 6e 6f   *data).{.  x1no
24a40 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e  de *np;.  unsign
24a50 65 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ed h;.  unsigned
24a60 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d   ph;..  if( x1a=
24a70 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
24a80 20 70 68 20 3d 20 73 74 72 68 61 73 68 28 64 61   ph = strhash(da
24a90 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ta);.  h = ph & 
24aa0 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x1a->size-1);. 
24ab0 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d   np = x1a->ht[h]
24ac0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
24ad0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
24ae0 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d  np->data,data)==
24af0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  0 ){.      /* An
24b00 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
24b10 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
24b20 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20  y is found. */. 
24b30 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63       /* Fail bec
24b40 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69  ause overwrite i
24b50 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f  s not allows. */
24b60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
24b70 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20  .    }.    np = 
24b80 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
24b90 69 66 28 20 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d  if( x1a->count>=
24ba0 78 31 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20  x1a->size ){.   
24bb0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
24bc0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
24bd0 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e  bigger */.    in
24be0 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20  t i,arrSize;.   
24bf0 20 73 74 72 75 63 74 20 73 5f 78 31 20 61 72 72   struct s_x1 arr
24c00 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69  ay;.    array.si
24c10 7a 65 20 3d 20 61 72 72 53 69 7a 65 20 3d 20 78  ze = arrSize = x
24c20 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20  1a->size*2;.    
24c30 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31  array.count = x1
24c40 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72  a->count;.    ar
24c50 72 61 79 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64  ray.tbl = (x1nod
24c60 65 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a  e*)calloc(arrSiz
24c70 65 2c 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65  e, sizeof(x1node
24c80 29 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64  ) + sizeof(x1nod
24c90 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72  e*));.    if( ar
24ca0 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74  ray.tbl==0 ) ret
24cb0 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20  urn 0;  /* Fail 
24cc0 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61  due to malloc fa
24cd0 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72  ilure */.    arr
24ce0 61 79 2e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a  ay.ht = (x1node*
24cf0 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 61 72  *)&(array.tbl[ar
24d00 72 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72  rSize]);.    for
24d10 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b  (i=0; i<arrSize;
24d20 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69   i++) array.ht[i
24d30 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  ] = 0;.    for(i
24d40 3d 30 3b 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74  =0; i<x1a->count
24d50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31  ; i++){.      x1
24d60 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65  node *oldnp, *ne
24d70 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70  wnp;.      oldnp
24d80 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d   = &(x1a->tbl[i]
24d90 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72  );.      h = str
24da0 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61  hash(oldnp->data
24db0 29 20 26 20 28 61 72 72 53 69 7a 65 2d 31 29 3b  ) & (arrSize-1);
24dc0 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26  .      newnp = &
24dd0 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a  (array.tbl[i]);.
24de0 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e        if( array.
24df0 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74  ht[h] ) array.ht
24e00 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65  [h]->from = &(ne
24e10 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20  wnp->next);.    
24e20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20    newnp->next = 
24e30 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20  array.ht[h];.   
24e40 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d     newnp->data =
24e50 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20   oldnp->data;.  
24e60 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20      newnp->from 
24e70 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29  = &(array.ht[h])
24e80 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74  ;.      array.ht
24e90 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20  [h] = newnp;.   
24ea0 20 7d 0a 20 20 20 20 66 72 65 65 28 78 31 61 2d   }.    free(x1a-
24eb0 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 31 61 20  >tbl);.    *x1a 
24ec0 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f  = array;.  }.  /
24ed0 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
24ee0 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70   data */.  h = p
24ef0 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31  h & (x1a->size-1
24f00 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 31 61 2d  );.  np = &(x1a-
24f10 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74 2b  >tbl[x1a->count+
24f20 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20  +]);.  np->data 
24f30 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 31  = data;.  if( x1
24f40 61 2d 3e 68 74 5b 68 5d 20 29 20 78 31 61 2d 3e  a->ht[h] ) x1a->
24f50 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
24f60 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d  np->next);.  np-
24f70 3e 6e 65 78 74 20 3d 20 78 31 61 2d 3e 68 74 5b  >next = x1a->ht[
24f80 68 5d 3b 0a 20 20 78 31 61 2d 3e 68 74 5b 68 5d  h];.  x1a->ht[h]
24f90 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f   = np;.  np->fro
24fa0 6d 20 3d 20 26 28 78 31 61 2d 3e 68 74 5b 68 5d  m = &(x1a->ht[h]
24fb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
24fc0 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
24fd0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73  inter to data as
24fe0 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69  signed to the gi
24ff0 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e  ven key.  Return
25000 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73   NULL.** if no s
25010 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 63 6f 6e 73  uch key. */.cons
25020 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f  t char *Strsafe_
25030 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20  find(const char 
25040 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e  *key).{.  unsign
25050 65 64 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20 2a  ed h;.  x1node *
25060 6e 70 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d  np;..  if( x1a==
25070 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
25080 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29  h = strhash(key)
25090 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29   & (x1a->size-1)
250a0 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74  ;.  np = x1a->ht
250b0 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
250c0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
250d0 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29  mp(np->data,key)
250e0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
250f0 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
25100 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20    }.  return np 
25110 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a  ? np->data : 0;.
25120 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
25130 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 28 74  ointer to the (t
25140 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65  erminal or nonte
25150 72 6d 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20 22  rminal) symbol "
25160 78 22 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  x"..** Create a 
25170 6e 65 77 20 73 79 6d 62 6f 6c 20 69 66 20 74 68  new symbol if th
25180 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
25190 74 69 6d 65 20 22 78 22 20 68 61 73 20 62 65 65  time "x" has bee
251a0 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63  n seen..*/.struc
251b0 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c  t symbol *Symbol
251c0 5f 6e 65 77 28 63 6f 6e 73 74 20 63 68 61 72 20  _new(const char 
251d0 2a 78 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  *x).{.  struct s
251e0 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73 70  ymbol *sp;..  sp
251f0 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78   = Symbol_find(x
25200 29 3b 0a 20 20 69 66 28 20 73 70 3d 3d 30 20 29  );.  if( sp==0 )
25210 7b 0a 20 20 20 20 73 70 20 3d 20 28 73 74 72 75  {.    sp = (stru
25220 63 74 20 73 79 6d 62 6f 6c 20 2a 29 63 61 6c 6c  ct symbol *)call
25230 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72  oc(1, sizeof(str
25240 75 63 74 20 73 79 6d 62 6f 6c 29 20 29 3b 0a 20  uct symbol) );. 
25250 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73     MemoryCheck(s
25260 70 29 3b 0a 20 20 20 20 73 70 2d 3e 6e 61 6d 65  p);.    sp->name
25270 20 3d 20 53 74 72 73 61 66 65 28 78 29 3b 0a 20   = Strsafe(x);. 
25280 20 20 20 73 70 2d 3e 74 79 70 65 20 3d 20 49 53     sp->type = IS
25290 55 50 50 45 52 28 2a 78 29 20 3f 20 54 45 52 4d  UPPER(*x) ? TERM
252a0 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e  INAL : NONTERMIN
252b0 41 4c 3b 0a 20 20 20 20 73 70 2d 3e 72 75 6c 65  AL;.    sp->rule
252c0 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 66 61   = 0;.    sp->fa
252d0 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20  llback = 0;.    
252e0 73 70 2d 3e 70 72 65 63 20 3d 20 2d 31 3b 0a 20  sp->prec = -1;. 
252f0 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 55     sp->assoc = U
25300 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e 66 69 72 73  NK;.    sp->firs
25310 74 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 73 70  tset = 0;.    sp
25320 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e  ->lambda = LEMON
25330 5f 46 41 4c 53 45 3b 0a 20 20 20 20 73 70 2d 3e  _FALSE;.    sp->
25340 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a  destructor = 0;.
25350 20 20 20 20 73 70 2d 3e 64 65 73 74 4c 69 6e 65      sp->destLine
25360 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  no = 0;.    sp->
25370 64 61 74 61 74 79 70 65 20 3d 20 30 3b 0a 20 20  datatype = 0;.  
25380 20 20 73 70 2d 3e 75 73 65 43 6e 74 20 3d 20 30    sp->useCnt = 0
25390 3b 0a 20 20 20 20 53 79 6d 62 6f 6c 5f 69 6e 73  ;.    Symbol_ins
253a0 65 72 74 28 73 70 2c 73 70 2d 3e 6e 61 6d 65 29  ert(sp,sp->name)
253b0 3b 0a 20 20 7d 0a 20 20 73 70 2d 3e 75 73 65 43  ;.  }.  sp->useC
253c0 6e 74 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73  nt++;.  return s
253d0 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65  p;.}../* Compare
253e0 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 66 6f 72   two symbols for
253f0 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65   sorting purpose
25400 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74  s.  Return negat
25410 69 76 65 2c 0a 2a 2a 20 7a 65 72 6f 2c 20 6f 72  ive,.** zero, or
25420 20 70 6f 73 69 74 69 76 65 20 69 66 20 61 20 69   positive if a i
25430 73 20 6c 65 73 73 20 74 68 65 6e 2c 20 65 71 75  s less then, equ
25440 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
25450 72 0a 2a 2a 20 74 68 61 6e 20 62 2e 0a 2a 2a 0a  r.** than b..**.
25460 2a 2a 20 53 79 6d 62 6f 6c 73 20 74 68 61 74 20  ** Symbols that 
25470 62 65 67 69 6e 20 77 69 74 68 20 75 70 70 65 72  begin with upper
25480 20 63 61 73 65 20 6c 65 74 74 65 72 73 20 28 74   case letters (t
25490 65 72 6d 69 6e 61 6c 73 20 6f 72 20 74 6f 6b 65  erminals or toke
254a0 6e 73 29 0a 2a 2a 20 6d 75 73 74 20 73 6f 72 74  ns).** must sort
254b0 20 62 65 66 6f 72 65 20 73 79 6d 62 6f 6c 73 20   before symbols 
254c0 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
254d0 6c 6f 77 65 72 20 63 61 73 65 20 6c 65 74 74 65  lower case lette
254e0 72 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65 72 6d 69  rs.** (non-termi
254f0 6e 61 6c 73 29 2e 20 20 41 6e 64 20 4d 55 4c 54  nals).  And MULT
25500 49 54 45 52 4d 49 4e 41 4c 20 73 79 6d 62 6f 6c  ITERMINAL symbol
25510 73 20 28 63 72 65 61 74 65 64 20 75 73 69 6e 67  s (created using
25520 20 74 68 65 0a 2a 2a 20 25 74 6f 6b 65 6e 5f 63   the.** %token_c
25530 6c 61 73 73 20 64 69 72 65 63 74 69 76 65 29 20  lass directive) 
25540 6d 75 73 74 20 73 6f 72 74 20 61 74 20 74 68 65  must sort at the
25550 20 76 65 72 79 20 65 6e 64 2e 20 4f 74 68 65 72   very end. Other
25560 20 74 68 61 6e 0a 2a 2a 20 74 68 61 74 2c 20 74   than.** that, t
25570 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6e 6f  he order does no
25580 74 20 6d 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  t matter..**.** 
25590 57 65 20 66 69 6e 64 20 65 78 70 65 72 69 6d 65  We find experime
255a0 6e 74 61 6c 6c 79 20 74 68 61 74 20 6c 65 61 76  ntally that leav
255b0 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 73 20  ing the symbols 
255c0 69 6e 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  in their origina
255d0 6c 0a 2a 2a 20 6f 72 64 65 72 20 28 74 68 65 20  l.** order (the 
255e0 6f 72 64 65 72 20 74 68 65 79 20 61 70 70 65 61  order they appea
255f0 72 65 64 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  red in the gramm
25600 61 72 20 66 69 6c 65 29 20 67 69 76 65 73 20 74  ar file) gives t
25610 68 65 0a 2a 2a 20 73 6d 61 6c 6c 65 73 74 20 70  he.** smallest p
25620 61 72 73 65 72 20 74 61 62 6c 65 73 20 69 6e 20  arser tables in 
25630 53 51 4c 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20 53  SQLite..*/.int S
25640 79 6d 62 6f 6c 63 6d 70 70 28 63 6f 6e 73 74 20  ymbolcmpp(const 
25650 76 6f 69 64 20 2a 5f 61 2c 20 63 6f 6e 73 74 20  void *_a, const 
25660 76 6f 69 64 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f  void *_b).{.  co
25670 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f  nst struct symbo
25680 6c 20 2a 61 20 3d 20 2a 28 63 6f 6e 73 74 20 73  l *a = *(const s
25690 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29  truct symbol **)
256a0 20 5f 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72   _a;.  const str
256b0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 20 3d 20  uct symbol *b = 
256c0 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73  *(const struct s
256d0 79 6d 62 6f 6c 20 2a 2a 29 20 5f 62 3b 0a 20 20  ymbol **) _b;.  
256e0 69 6e 74 20 69 31 20 3d 20 61 2d 3e 74 79 70 65  int i1 = a->type
256f0 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
25700 3f 20 33 20 3a 20 61 2d 3e 6e 61 6d 65 5b 30 5d  ? 3 : a->name[0]
25710 3e 27 5a 27 20 3f 20 32 20 3a 20 31 3b 0a 20 20  >'Z' ? 2 : 1;.  
25720 69 6e 74 20 69 32 20 3d 20 62 2d 3e 74 79 70 65  int i2 = b->type
25730 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
25740 3f 20 33 20 3a 20 62 2d 3e 6e 61 6d 65 5b 30 5d  ? 3 : b->name[0]
25750 3e 27 5a 27 20 3f 20 32 20 3a 20 31 3b 0a 20 20  >'Z' ? 2 : 1;.  
25760 72 65 74 75 72 6e 20 69 31 3d 3d 69 32 20 3f 20  return i1==i2 ? 
25770 61 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 69 6e  a->index - b->in
25780 64 65 78 20 3a 20 69 31 20 2d 20 69 32 3b 0a 7d  dex : i1 - i2;.}
25790 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
257a0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
257b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
257c0 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a  cture for each.*
257d0 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  * associative ar
257e0 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 32 22  ray of type "x2"
257f0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 32  ..*/.struct s_x2
25800 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20   {.  int size;  
25810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25820 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  The number of av
25830 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a  ailable slots. *
25840 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
25850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
25860 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   Must be a power
25870 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68   of 2 greater th
25880 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  an or */.       
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258a0 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f     /*   equal to
258b0 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e   1 */.  int coun
258c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
258d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
258e0 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c  rently slots fil
258f0 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  led */.  struct 
25900 73 5f 78 32 6e 6f 64 65 20 2a 74 62 6c 3b 20 20  s_x2node *tbl;  
25910 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72  /* The data stor
25920 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  ed here */.  str
25930 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 68  uct s_x2node **h
25940 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c  t;  /* Hash tabl
25950 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f  e for lookups */
25960 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  .};../* There is
25970 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
25980 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
25990 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65  for every data e
259a0 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20  lement.** in an 
259b0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
259c0 79 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e 0a  y of type "x2"..
259d0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
259e0 74 20 73 5f 78 32 6e 6f 64 65 20 7b 0a 20 20 73  t s_x2node {.  s
259f0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61  truct symbol *da
25a00 74 61 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ta;     /* The d
25a10 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ata */.  const c
25a20 68 61 72 20 2a 6b 65 79 3b 20 20 20 20 20 20 20  har *key;       
25a30 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
25a40 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
25a50 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65  e *next;   /* Ne
25a60 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  xt entry with th
25a70 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20  e same hash */. 
25a80 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
25a90 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65   **from;  /* Pre
25aa0 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20  vious link */.} 
25ab0 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72  x2node;../* Ther
25ac0 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e  e is only one in
25ad0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72  stance of the ar
25ae0 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68  ray, which is th
25af0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
25b00 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78  tatic struct s_x
25b10 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f  2 *x2a;../* Allo
25b20 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63  cate a new assoc
25b30 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a  iative array */.
25b40 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74  void Symbol_init
25b50 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 78 32  (void){.  if( x2
25b60 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 32  a ) return;.  x2
25b70 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 32  a = (struct s_x2
25b80 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
25b90 28 73 74 72 75 63 74 20 73 5f 78 32 29 20 29 3b  (struct s_x2) );
25ba0 0a 20 20 69 66 28 20 78 32 61 20 29 7b 0a 20 20  .  if( x2a ){.  
25bb0 20 20 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32    x2a->size = 12
25bc0 38 3b 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e  8;.    x2a->coun
25bd0 74 20 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e  t = 0;.    x2a->
25be0 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 63  tbl = (x2node*)c
25bf0 61 6c 6c 6f 63 28 31 32 38 2c 20 73 69 7a 65 6f  alloc(128, sizeo
25c00 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x2node) + size
25c10 6f 66 28 78 32 6e 6f 64 65 2a 29 29 3b 0a 20 20  of(x2node*));.  
25c20 20 20 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d    if( x2a->tbl==
25c30 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
25c40 78 32 61 29 3b 0a 20 20 20 20 20 20 78 32 61 20  x2a);.      x2a 
25c50 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
25c60 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
25c70 20 20 20 78 32 61 2d 3e 68 74 20 3d 20 28 78 32     x2a->ht = (x2
25c80 6e 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62  node**)&(x2a->tb
25c90 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66  l[128]);.      f
25ca0 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69  or(i=0; i<128; i
25cb0 2b 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x2a->ht[i] =
25cc0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
25cd0 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
25ce0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
25cf0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
25d00 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
25d10 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
25d20 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
25d30 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
25d40 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d  itten */.int Sym
25d50 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72 75 63  bol_insert(struc
25d60 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 2c 20  t symbol *data, 
25d70 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29  const char *key)
25d80 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b  .{.  x2node *np;
25d90 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20  .  unsigned h;. 
25da0 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20   unsigned ph;.. 
25db0 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65   if( x2a==0 ) re
25dc0 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73  turn 0;.  ph = s
25dd0 74 72 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68  trhash(key);.  h
25de0 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69   = ph & (x2a->si
25df0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32  ze-1);.  np = x2
25e00 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
25e10 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
25e20 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c   strcmp(np->key,
25e30 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  key)==0 ){.     
25e40 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
25e50 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
25e60 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64  ame key is found
25e70 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61  . */.      /* Fa
25e80 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77  il because overw
25e90 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  rite is not allo
25ea0 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ws. */.      ret
25eb0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
25ec0 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
25ed0 20 20 7d 0a 20 20 69 66 28 20 78 32 61 2d 3e 63    }.  if( x2a->c
25ee0 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a 65 20  ount>=x2a->size 
25ef0 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  ){.    /* Need t
25f00 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
25f10 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a  table bigger */.
25f20 20 20 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a      int i,arrSiz
25f30 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f  e;.    struct s_
25f40 78 32 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72  x2 array;.    ar
25f50 72 61 79 2e 73 69 7a 65 20 3d 20 61 72 72 53 69  ray.size = arrSi
25f60 7a 65 20 3d 20 78 32 61 2d 3e 73 69 7a 65 2a 32  ze = x2a->size*2
25f70 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e  ;.    array.coun
25f80 74 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a  t = x2a->count;.
25f90 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20      array.tbl = 
25fa0 28 78 32 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28  (x2node*)calloc(
25fb0 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28  arrSize, sizeof(
25fc0 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x2node) + sizeof
25fd0 28 78 32 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20  (x2node*));.    
25fe0 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30  if( array.tbl==0
25ff0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
26000 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c   Fail due to mal
26010 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  loc failure */. 
26020 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78     array.ht = (x
26030 32 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e  2node**)&(array.
26040 74 62 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20  tbl[arrSize]);. 
26050 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72     for(i=0; i<ar
26060 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  rSize; i++) arra
26070 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  y.ht[i] = 0;.   
26080 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d   for(i=0; i<x2a-
26090 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  >count; i++){.  
260a0 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e      x2node *oldn
260b0 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20  p, *newnp;.     
260c0 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e   oldnp = &(x2a->
260d0 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68  tbl[i]);.      h
260e0 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70   = strhash(oldnp
260f0 2d 3e 6b 65 79 29 20 26 20 28 61 72 72 53 69 7a  ->key) & (arrSiz
26100 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
26110 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
26120 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
26130 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
26140 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
26150 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
26160 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
26170 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
26180 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b  ;.      newnp->k
26190 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b  ey = oldnp->key;
261a0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
261b0 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
261c0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
261d0 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
261e0 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
261f0 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
26200 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
26210 78 32 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x2a->tbl);.    *
26220 78 32 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x2a = array;.  }
26230 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
26240 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
26250 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69   = ph & (x2a->si
26260 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
26270 78 32 61 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f  x2a->tbl[x2a->co
26280 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b  unt++]);.  np->k
26290 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e  ey = key;.  np->
262a0 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
262b0 66 28 20 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x2a->ht[h] ) 
262c0 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x2a->ht[h]->from
262d0 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
262e0 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61    np->next = x2a
262f0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e  ->ht[h];.  x2a->
26300 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
26310 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e  ->from = &(x2a->
26320 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
26330 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
26340 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
26350 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
26360 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
26370 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
26380 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
26390 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
263a0 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73  Symbol_find(cons
263b0 74 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20  t char *key).{. 
263c0 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 78   unsigned h;.  x
263d0 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  2node *np;..  if
263e0 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x2a==0 ) retur
263f0 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61  n 0;.  h = strha
26400 73 68 28 6b 65 79 29 20 26 20 28 78 32 61 2d 3e  sh(key) & (x2a->
26410 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
26420 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x2a->ht[h];.  wh
26430 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
26440 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65  f( strcmp(np->ke
26450 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61  y,key)==0 ) brea
26460 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e  k;.    np = np->
26470 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  next;.  }.  retu
26480 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61  rn np ? np->data
26490 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75   : 0;.}../* Retu
264a0 72 6e 20 74 68 65 20 6e 2d 74 68 20 64 61 74 61  rn the n-th data
264b0 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
264c0 66 20 6e 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f n is out of ra
264d0 6e 67 65 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  nge. */.struct s
264e0 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74  ymbol *Symbol_Nt
264f0 68 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73 74 72  h(int n).{.  str
26500 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61  uct symbol *data
26510 3b 0a 20 20 69 66 28 20 78 32 61 20 26 26 20 6e  ;.  if( x2a && n
26520 3e 30 20 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f  >0 && n<=x2a->co
26530 75 6e 74 20 29 7b 0a 20 20 20 20 64 61 74 61 20  unt ){.    data 
26540 3d 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e  = x2a->tbl[n-1].
26550 64 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  data;.  }else{. 
26560 20 20 20 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d     data = 0;.  }
26570 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61 3b 0a  .  return data;.
26580 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
26590 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
265a0 61 79 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c  ay */.int Symbol
265b0 5f 63 6f 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74  _count().{.  ret
265c0 75 72 6e 20 78 32 61 20 3f 20 78 32 61 2d 3e 63  urn x2a ? x2a->c
265d0 6f 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  ount : 0;.}../* 
265e0 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20  Return an array 
265f0 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  of pointers to a
26600 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  ll data in the t
26610 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72  able..** The arr
26620 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ay is obtained f
26630 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74  rom malloc.  Ret
26640 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f  urn NULL if memo
26650 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
26660 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66   problems, or if
26670 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65 6d   the array is em
26680 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  pty. */.struct s
26690 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61  ymbol **Symbol_a
266a0 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72  rrayof().{.  str
266b0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72  uct symbol **arr
266c0 61 79 3b 0a 20 20 69 6e 74 20 69 2c 61 72 72 53  ay;.  int i,arrS
266d0 69 7a 65 3b 0a 20 20 69 66 28 20 78 32 61 3d 3d  ize;.  if( x2a==
266e0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
266f0 61 72 72 53 69 7a 65 20 3d 20 78 32 61 2d 3e 63  arrSize = x2a->c
26700 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20  ount;.  array = 
26710 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
26720 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65  *)calloc(arrSize
26730 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  , sizeof(struct 
26740 73 79 6d 62 6f 6c 20 2a 29 29 3b 0a 20 20 69 66  symbol *));.  if
26750 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66  ( array ){.    f
26760 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a  or(i=0; i<arrSiz
26770 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d  e; i++) array[i]
26780 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64   = x2a->tbl[i].d
26790 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ata;.  }.  retur
267a0 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43  n array;.}../* C
267b0 6f 6d 70 61 72 65 20 74 77 6f 20 63 6f 6e 66 69  ompare two confi
267c0 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74  gurations */.int
267d0 20 43 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73 74   Configcmp(const
267e0 20 63 68 61 72 20 2a 5f 61 2c 63 6f 6e 73 74 20   char *_a,const 
267f0 63 68 61 72 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f  char *_b).{.  co
26800 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6e 66 69  nst struct confi
26810 67 20 2a 61 20 3d 20 28 73 74 72 75 63 74 20 63  g *a = (struct c
26820 6f 6e 66 69 67 20 2a 29 20 5f 61 3b 0a 20 20 63  onfig *) _a;.  c
26830 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6e 66  onst struct conf
26840 69 67 20 2a 62 20 3d 20 28 73 74 72 75 63 74 20  ig *b = (struct 
26850 63 6f 6e 66 69 67 20 2a 29 20 5f 62 3b 0a 20 20  config *) _b;.  
26860 69 6e 74 20 78 3b 0a 20 20 78 20 3d 20 61 2d 3e  int x;.  x = a->
26870 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72  rp->index - b->r
26880 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  p->index;.  if( 
26890 78 3d 3d 30 20 29 20 78 20 3d 20 61 2d 3e 64 6f  x==0 ) x = a->do
268a0 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 72 65  t - b->dot;.  re
268b0 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f  turn x;.}../* Co
268c0 6d 70 61 72 65 20 74 77 6f 20 73 74 61 74 65 73  mpare two states
268d0 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20   */.PRIVATE int 
268e0 73 74 61 74 65 63 6d 70 28 73 74 72 75 63 74 20  statecmp(struct 
268f0 63 6f 6e 66 69 67 20 2a 61 2c 20 73 74 72 75 63  config *a, struc
26900 74 20 63 6f 6e 66 69 67 20 2a 62 29 0a 7b 0a 20  t config *b).{. 
26910 20 69 6e 74 20 72 63 3b 0a 20 20 66 6f 72 28 72   int rc;.  for(r
26920 63 3d 30 3b 20 72 63 3d 3d 30 20 26 26 20 61 20  c=0; rc==0 && a 
26930 26 26 20 62 3b 20 20 61 3d 61 2d 3e 62 70 2c 20  && b;  a=a->bp, 
26940 62 3d 62 2d 3e 62 70 29 7b 0a 20 20 20 20 72 63  b=b->bp){.    rc
26950 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20   = a->rp->index 
26960 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a  - b->rp->index;.
26970 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
26980 72 63 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d  rc = a->dot - b-
26990 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >dot;.  }.  if( 
269a0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
269b0 20 61 20 29 20 72 63 20 3d 20 31 3b 0a 20 20 20   a ) rc = 1;.   
269c0 20 69 66 28 20 62 20 29 20 72 63 20 3d 20 2d 31   if( b ) rc = -1
269d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
269e0 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20  c;.}../* Hash a 
269f0 73 74 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45  state */.PRIVATE
26a00 20 75 6e 73 69 67 6e 65 64 20 73 74 61 74 65 68   unsigned stateh
26a10 61 73 68 28 73 74 72 75 63 74 20 63 6f 6e 66 69  ash(struct confi
26a20 67 20 2a 61 29 0a 7b 0a 20 20 75 6e 73 69 67 6e  g *a).{.  unsign
26a30 65 64 20 68 3d 30 3b 0a 20 20 77 68 69 6c 65 28  ed h=0;.  while(
26a40 20 61 20 29 7b 0a 20 20 20 20 68 20 3d 20 68 2a   a ){.    h = h*
26a50 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64  571 + a->rp->ind
26a60 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a  ex*37 + a->dot;.
26a70 20 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b 0a 20      a = a->bp;. 
26a80 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d   }.  return h;.}
26a90 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
26aa0 6e 65 77 20 73 74 61 74 65 20 73 74 72 75 63 74  new state struct
26ab0 75 72 65 20 2a 2f 0a 73 74 72 75 63 74 20 73 74  ure */.struct st
26ac0 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 29  ate *State_new()
26ad0 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  .{.  struct stat
26ae0 65 20 2a 6e 65 77 73 74 61 74 65 3b 0a 20 20 6e  e *newstate;.  n
26af0 65 77 73 74 61 74 65 20 3d 20 28 73 74 72 75 63  ewstate = (struc
26b00 74 20 73 74 61 74 65 20 2a 29 63 61 6c 6c 6f 63  t state *)calloc
26b10 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63  (1, sizeof(struc
26b20 74 20 73 74 61 74 65 29 20 29 3b 0a 20 20 4d 65  t state) );.  Me
26b30 6d 6f 72 79 43 68 65 63 6b 28 6e 65 77 73 74 61  moryCheck(newsta
26b40 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65  te);.  return ne
26b50 77 73 74 61 74 65 3b 0a 7d 0a 0a 2f 2a 20 54 68  wstate;.}../* Th
26b60 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
26b70 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
26b80 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
26b90 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
26ba0 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
26bb0 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73 74  type "x3"..*/.st
26bc0 72 75 63 74 20 73 5f 78 33 20 7b 0a 20 20 69 6e  ruct s_x3 {.  in
26bd0 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
26be0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
26bf0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
26c00 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
26c30 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
26c40 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
26c50 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
26c60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
26c70 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
26c80 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
26c90 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
26ca0 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
26cb0 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
26cc0 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
26cd0 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
26ce0 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
26cf0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
26d00 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  3node **ht;  /* 
26d10 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
26d20 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
26d30 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
26d40 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
26d50 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
26d60 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
26d70 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
26d80 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
26d90 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x3"..*/.type
26da0 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 33 6e  def struct s_x3n
26db0 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ode {.  struct s
26dc0 74 61 74 65 20 2a 64 61 74 61 3b 20 20 20 20 20  tate *data;     
26dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26de0 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74  The data */.  st
26df0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
26e00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26e10 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
26e20 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
26e30 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
26e40 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
26e50 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
26e60 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  .  struct s_x3no
26e70 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
26e80 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
26e90 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x3node;../* Th
26ea0 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
26eb0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
26ec0 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
26ed0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
26ee0 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
26ef0 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c  _x3 *x3a;../* Al
26f00 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
26f10 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
26f20 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69  /.void State_ini
26f30 74 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 78  t(void){.  if( x
26f40 33 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  3a ) return;.  x
26f50 33 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78  3a = (struct s_x
26f60 33 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  3*)malloc( sizeo
26f70 66 28 73 74 72 75 63 74 20 73 5f 78 33 29 20 29  f(struct s_x3) )
26f80 3b 0a 20 20 69 66 28 20 78 33 61 20 29 7b 0a 20  ;.  if( x3a ){. 
26f90 20 20 20 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31     x3a->size = 1
26fa0 32 38 3b 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75  28;.    x3a->cou
26fb0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d  nt = 0;.    x3a-
26fc0 3e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29  >tbl = (x3node*)
26fd0 63 61 6c 6c 6f 63 28 31 32 38 2c 20 73 69 7a 65  calloc(128, size
26fe0 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x3node) + siz
26ff0 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 3b 0a 20  eof(x3node*));. 
27000 20 20 20 69 66 28 20 78 33 61 2d 3e 74 62 6c 3d     if( x3a->tbl=
27010 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  =0 ){.      free
27020 28 78 33 61 29 3b 0a 20 20 20 20 20 20 78 33 61  (x3a);.      x3a
27030 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
27040 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
27050 20 20 20 20 78 33 61 2d 3e 68 74 20 3d 20 28 78      x3a->ht = (x
27060 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d 3e 74  3node**)&(x3a->t
27070 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20  bl[128]);.      
27080 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20  for(i=0; i<128; 
27090 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69 5d 20  i++) x3a->ht[i] 
270a0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
270b0 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  ./* Insert a new
270c0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
270d0 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
270e0 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66  TRUE if successf
270f0 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74  ul..** Prior dat
27100 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  a with the same 
27110 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77  key is NOT overw
27120 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74  ritten */.int St
27130 61 74 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63  ate_insert(struc
27140 74 20 73 74 61 74 65 20 2a 64 61 74 61 2c 20 73  t state *data, s
27150 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
27160 79 29 0a 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e  y).{.  x3node *n
27170 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b  p;.  unsigned h;
27180 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a  .  unsigned ph;.
27190 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20  .  if( x3a==0 ) 
271a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
271b0 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29 3b   statehash(key);
271c0 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33 61  .  h = ph & (x3a
271d0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
271e0 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x3a->ht[h];.  
271f0 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
27200 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70   if( statecmp(np
27210 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b  ->key,key)==0 ){
27220 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69  .      /* An exi
27230 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68  sting entry with
27240 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
27250 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20   found. */.     
27260 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65   /* Fail because
27270 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f   overwrite is no
27280 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20  t allows. */.   
27290 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
272a0 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e   }.    np = np->
272b0 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  next;.  }.  if( 
272c0 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d  x3a->count>=x3a-
272d0 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  >size ){.    /* 
272e0 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  Need to make the
272f0 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67   hash table bigg
27300 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  er */.    int i,
27310 61 72 72 53 69 7a 65 3b 0a 20 20 20 20 73 74 72  arrSize;.    str
27320 75 63 74 20 73 5f 78 33 20 61 72 72 61 79 3b 0a  uct s_x3 array;.
27330 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d      array.size =
27340 20 61 72 72 53 69 7a 65 20 3d 20 78 33 61 2d 3e   arrSize = x3a->
27350 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61  size*2;.    arra
27360 79 2e 63 6f 75 6e 74 20 3d 20 78 33 61 2d 3e 63  y.count = x3a->c
27370 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e  ount;.    array.
27380 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 63  tbl = (x3node*)c
27390 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73  alloc(arrSize, s
273a0 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20  izeof(x3node) + 
273b0 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29  sizeof(x3node*))
273c0 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e  ;.    if( array.
273d0 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tbl==0 ) return 
273e0 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20  0;  /* Fail due 
273f0 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  to malloc failur
27400 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68  e */.    array.h
27410 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28  t = (x3node**)&(
27420 61 72 72 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a  array.tbl[arrSiz
27430 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e]);.    for(i=0
27440 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b  ; i<arrSize; i++
27450 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20  ) array.ht[i] = 
27460 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
27470 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b  i<x3a->count; i+
27480 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64 65  +){.      x3node
27490 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b   *oldnp, *newnp;
274a0 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26  .      oldnp = &
274b0 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20  (x3a->tbl[i]);. 
274c0 20 20 20 20 20 68 20 3d 20 73 74 61 74 65 68 61       h = stateha
274d0 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26  sh(oldnp->key) &
274e0 20 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20   (arrSize-1);.  
274f0 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
27500 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
27510 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
27520 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
27530 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
27540 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
27550 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
27560 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
27570 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64  newnp->key = old
27580 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e  np->key;.      n
27590 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64  ewnp->data = old
275a0 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20  np->data;.      
275b0 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  newnp->from = &(
275c0 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20  array.ht[h]);.  
275d0 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20      array.ht[h] 
275e0 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20  = newnp;.    }. 
275f0 20 20 20 66 72 65 65 28 78 33 61 2d 3e 74 62 6c     free(x3a->tbl
27600 29 3b 0a 20 20 20 20 2a 78 33 61 20 3d 20 61 72  );.    *x3a = ar
27610 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e  ray;.  }.  /* In
27620 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74  sert the new dat
27630 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20  a */.  h = ph & 
27640 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x3a->size-1);. 
27650 20 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c   np = &(x3a->tbl
27660 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b  [x3a->count++]);
27670 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79  .  np->key = key
27680 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
27690 61 74 61 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e  ata;.  if( x3a->
276a0 68 74 5b 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b  ht[h] ) x3a->ht[
276b0 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
276c0 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
276d0 78 74 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b  xt = x3a->ht[h];
276e0 0a 20 20 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x3a->ht[h] = 
276f0 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
27700 20 26 28 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x3a->ht[h]);.
27710 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
27720 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
27730 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
27740 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
27750 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
27760 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
27770 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20   key. */.struct 
27780 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69 6e  state *State_fin
27790 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  d(struct config 
277a0 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e  *key).{.  unsign
277b0 65 64 20 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a  ed h;.  x3node *
277c0 6e 70 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d  np;..  if( x3a==
277d0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
277e0 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65  h = statehash(ke
277f0 79 29 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d  y) & (x3a->size-
27800 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e  1);.  np = x3a->
27810 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
27820 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
27830 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b  atecmp(np->key,k
27840 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ey)==0 ) break;.
27850 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
27860 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
27870 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20  np ? np->data : 
27880 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  0;.}../* Return 
27890 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
278a0 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61  ters to all data
278b0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
278c0 2a 20 54 68 65 20 61 72 72 61 79 20 69 73 20 6f  * The array is o
278d0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
278e0 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  loc.  Return NUL
278f0 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  L if memory allo
27900 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65  cation.** proble
27910 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72  ms, or if the ar
27920 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f  ray is empty. */
27930 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a  .struct state **
27940 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28 76 6f  State_arrayof(vo
27950 69 64 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  id).{.  struct s
27960 74 61 74 65 20 2a 2a 61 72 72 61 79 3b 0a 20 20  tate **array;.  
27970 69 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20  int i,arrSize;. 
27980 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65   if( x3a==0 ) re
27990 74 75 72 6e 20 30 3b 0a 20 20 61 72 72 53 69 7a  turn 0;.  arrSiz
279a0 65 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a  e = x3a->count;.
279b0 20 20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63    array = (struc
279c0 74 20 73 74 61 74 65 20 2a 2a 29 63 61 6c 6c 6f  t state **)callo
279d0 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f  c(arrSize, sizeo
279e0 66 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  f(struct state *
279f0 29 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20  ));.  if( array 
27a00 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
27a10 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20  i<arrSize; i++) 
27a20 61 72 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e  array[i] = x3a->
27a30 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d  tbl[i].data;.  }
27a40 0a 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b  .  return array;
27a50 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f  .}../* Hash a co
27a60 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50  nfiguration */.P
27a70 52 49 56 41 54 45 20 75 6e 73 69 67 6e 65 64 20  RIVATE unsigned 
27a80 63 6f 6e 66 69 67 68 61 73 68 28 73 74 72 75 63  confighash(struc
27a90 74 20 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20  t config *a).{. 
27aa0 20 75 6e 73 69 67 6e 65 64 20 68 3d 30 3b 0a 20   unsigned h=0;. 
27ab0 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e   h = h*571 + a->
27ac0 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61  rp->index*37 + a
27ad0 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20  ->dot;.  return 
27ae0 68 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  h;.}../* There i
27af0 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
27b00 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
27b10 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
27b20 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
27b30 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
27b40 22 78 34 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x4"..*/.struct 
27b50 73 5f 78 34 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x4 {.  int siz
27b60 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
27b70 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
27b80 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
27b90 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
27ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bb0 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
27bc0 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
27bd0 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
27be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bf0 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
27c00 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
27c10 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
27c20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
27c30 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
27c40 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
27c50 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 74 62  uct s_x4node *tb
27c60 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
27c70 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
27c80 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65   struct s_x4node
27c90 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
27ca0 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
27cb0 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
27cc0 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
27cd0 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
27ce0 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
27cf0 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
27d00 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
27d10 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
27d20 34 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  4"..*/.typedef s
27d30 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 7b  truct s_x4node {
27d40 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
27d50 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
27d60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27d70 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74  data */.  struct
27d80 20 73 5f 78 34 6e 6f 64 65 20 2a 6e 65 78 74 3b   s_x4node *next;
27d90 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79     /* Next entry
27da0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68   with the same h
27db0 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ash */.  struct 
27dc0 73 5f 78 34 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b  s_x4node **from;
27dd0 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69    /* Previous li
27de0 6e 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65 3b 0a  nk */.} x4node;.
27df0 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c  ./* There is onl
27e00 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  y one instance o
27e10 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69  f the array, whi
27e20 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ch is the follow
27e30 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ing */.static st
27e40 72 75 63 74 20 73 5f 78 34 20 2a 78 34 61 3b 0a  ruct s_x4 *x4a;.
27e50 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
27e60 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ew associative a
27e70 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  rray */.void Con
27e80 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 76 6f  figtable_init(vo
27e90 69 64 29 7b 0a 20 20 69 66 28 20 78 34 61 20 29  id){.  if( x4a )
27ea0 20 72 65 74 75 72 6e 3b 0a 20 20 78 34 61 20 3d   return;.  x4a =
27eb0 20 28 73 74 72 75 63 74 20 73 5f 78 34 2a 29 6d   (struct s_x4*)m
27ec0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
27ed0 72 75 63 74 20 73 5f 78 34 29 20 29 3b 0a 20 20  ruct s_x4) );.  
27ee0 69 66 28 20 78 34 61 20 29 7b 0a 20 20 20 20 78  if( x4a ){.    x
27ef0 34 61 2d 3e 73 69 7a 65 20 3d 20 36 34 3b 0a 20  4a->size = 64;. 
27f00 20 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20     x4a->count = 
27f10 30 3b 0a 20 20 20 20 78 34 61 2d 3e 74 62 6c 20  0;.    x4a->tbl 
27f20 3d 20 28 78 34 6e 6f 64 65 2a 29 63 61 6c 6c 6f  = (x4node*)callo
27f30 63 28 36 34 2c 20 73 69 7a 65 6f 66 28 78 34 6e  c(64, sizeof(x4n
27f40 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34  ode) + sizeof(x4
27f50 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28  node*));.    if(
27f60 20 78 34 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a   x4a->tbl==0 ){.
27f70 20 20 20 20 20 20 66 72 65 65 28 78 34 61 29 3b        free(x4a);
27f80 0a 20 20 20 20 20 20 78 34 61 20 3d 20 30 3b 0a  .      x4a = 0;.
27f90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27fa0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 34   int i;.      x4
27fb0 61 2d 3e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a  a->ht = (x4node*
27fc0 2a 29 26 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d  *)&(x4a->tbl[64]
27fd0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
27fe0 3b 20 69 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61  ; i<64; i++) x4a
27ff0 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  ->ht[i] = 0;.   
28000 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65   }.  }.}./* Inse
28010 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
28020 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20  into the array. 
28030 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
28040 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50  successful..** P
28050 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74  rior data with t
28060 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e  he same key is N
28070 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a  OT overwritten *
28080 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c  /.int Configtabl
28090 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20  e_insert(struct 
280a0 63 6f 6e 66 69 67 20 2a 64 61 74 61 29 0a 7b 0a  config *data).{.
280b0 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20    x4node *np;.  
280c0 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e  unsigned h;.  un
280d0 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66  signed ph;..  if
280e0 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x4a==0 ) retur
280f0 6e 20 30 3b 0a 20 20 70 68 20 3d 20 63 6f 6e 66  n 0;.  ph = conf
28100 69 67 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20  ighash(data);.  
28110 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73  h = ph & (x4a->s
28120 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
28130 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  4a->ht[h];.  whi
28140 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
28150 28 20 43 6f 6e 66 69 67 63 6d 70 28 28 63 6f 6e  ( Configcmp((con
28160 73 74 20 63 68 61 72 20 2a 29 20 6e 70 2d 3e 64  st char *) np->d
28170 61 74 61 2c 28 63 6f 6e 73 74 20 63 68 61 72 20  ata,(const char 
28180 2a 29 20 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20  *) data)==0 ){. 
28190 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
281a0 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74  ing entry with t
281b0 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66  he same key is f
281c0 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  ound. */.      /
281d0 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f  * Fail because o
281e0 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20  verwrite is not 
281f0 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  allows. */.     
28200 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
28210 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
28220 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 34  xt;.  }.  if( x4
28230 61 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73  a->count>=x4a->s
28240 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ize ){.    /* Ne
28250 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68  ed to make the h
28260 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72  ash table bigger
28270 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61 72   */.    int i,ar
28280 72 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63  rSize;.    struc
28290 74 20 73 5f 78 34 20 61 72 72 61 79 3b 0a 20 20  t s_x4 array;.  
282a0 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 61    array.size = a
282b0 72 72 53 69 7a 65 20 3d 20 78 34 61 2d 3e 73 69  rrSize = x4a->si
282c0 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e  ze*2;.    array.
282d0 63 6f 75 6e 74 20 3d 20 78 34 61 2d 3e 63 6f 75  count = x4a->cou
282e0 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62  nt;.    array.tb
282f0 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 63 61 6c  l = (x4node*)cal
28300 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a  loc(arrSize, siz
28310 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69  eof(x4node) + si
28320 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 3b 0a  zeof(x4node*));.
28330 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62      if( array.tb
28340 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
28350 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f    /* Fail due to
28360 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
28370 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20  */.    array.ht 
28380 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72  = (x4node**)&(ar
28390 72 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d  ray.tbl[arrSize]
283a0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
283b0 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20  i<arrSize; i++) 
283c0 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b  array.ht[i] = 0;
283d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
283e0 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x4a->count; i++)
283f0 7b 0a 20 20 20 20 20 20 78 34 6e 6f 64 65 20 2a  {.      x4node *
28400 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20  oldnp, *newnp;. 
28410 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78       oldnp = &(x
28420 34 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  4a->tbl[i]);.   
28430 20 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73     h = confighas
28440 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26  h(oldnp->data) &
28450 20 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20   (arrSize-1);.  
28460 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
28470 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
28480 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
28490 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
284a0 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
284b0 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
284c0 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
284d0 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
284e0 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
284f0 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
28500 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
28510 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
28520 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
28530 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
28540 20 20 20 20 66 72 65 65 28 78 34 61 2d 3e 74 62      free(x4a->tb
28550 6c 29 3b 0a 20 20 20 20 2a 78 34 61 20 3d 20 61  l);.    *x4a = a
28560 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
28570 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
28580 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
28590 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x4a->size-1);.
285a0 20 20 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62    np = &(x4a->tb
285b0 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x4a->count++])
285c0 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
285d0 61 74 61 3b 0a 20 20 69 66 28 20 78 34 61 2d 3e  ata;.  if( x4a->
285e0 68 74 5b 68 5d 20 29 20 78 34 61 2d 3e 68 74 5b  ht[h] ) x4a->ht[
285f0 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
28600 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
28610 78 74 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b  xt = x4a->ht[h];
28620 0a 20 20 78 34 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x4a->ht[h] = 
28630 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
28640 20 26 28 78 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x4a->ht[h]);.
28650 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
28660 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
28670 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
28680 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
28690 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
286a0 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
286b0 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20   key. */.struct 
286c0 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61  config *Configta
286d0 62 6c 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20  ble_find(struct 
286e0 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20  config *key).{. 
286f0 20 69 6e 74 20 68 3b 0a 20 20 78 34 6e 6f 64 65   int h;.  x4node
28700 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 34 61   *np;..  if( x4a
28710 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
28720 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68    h = confighash
28730 28 6b 65 79 29 20 26 20 28 78 34 61 2d 3e 73 69  (key) & (x4a->si
28740 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34  ze-1);.  np = x4
28750 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
28760 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
28770 20 43 6f 6e 66 69 67 63 6d 70 28 28 63 6f 6e 73   Configcmp((cons
28780 74 20 63 68 61 72 20 2a 29 20 6e 70 2d 3e 64 61  t char *) np->da
28790 74 61 2c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ta,(const char *
287a0 29 20 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61  ) key)==0 ) brea
287b0 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e  k;.    np = np->
287c0 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  next;.  }.  retu
287d0 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61  rn np ? np->data
287e0 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f   : 0;.}../* Remo
287f0 76 65 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d  ve all data from
28800 20 74 68 65 20 74 61 62 6c 65 2e 20 20 50 61 73   the table.  Pas
28810 73 20 65 61 63 68 20 64 61 74 61 20 74 6f 20 74  s each data to t
28820 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 66 22 0a  he function "f".
28830 2a 2a 20 61 73 20 69 74 20 69 73 20 72 65 6d 6f  ** as it is remo
28840 76 65 64 2e 20 20 28 22 66 22 20 6d 61 79 20 62  ved.  ("f" may b
28850 65 20 6e 75 6c 6c 20 74 6f 20 61 76 6f 69 64 20  e null to avoid 
28860 74 68 69 73 20 73 74 65 70 2e 29 20 2a 2f 0a 76  this step.) */.v
28870 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  oid Configtable_
28880 63 6c 65 61 72 28 69 6e 74 28 2a 66 29 28 73 74  clear(int(*f)(st
28890 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 29 0a  ruct config *)).
288a0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
288b0 20 78 34 61 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e   x4a==0 || x4a->
288c0 63 6f 75 6e 74 3d 3d 30 20 29 20 72 65 74 75 72  count==0 ) retur
288d0 6e 3b 0a 20 20 69 66 28 20 66 20 29 20 66 6f 72  n;.  if( f ) for
288e0 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75  (i=0; i<x4a->cou
288f0 6e 74 3b 20 69 2b 2b 29 20 28 2a 66 29 28 78 34  nt; i++) (*f)(x4
28900 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 29 3b  a->tbl[i].data);
28910 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34  .  for(i=0; i<x4
28920 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29 20 78 34  a->size; i++) x4
28930 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
28940 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x4a->count = 0;.
28950 20 20 72 65 74 75 72 6e 3b 0a 7d 0a                return;.}.