/ Hex Artifact Content
Login

Artifact 7f7735326ca9c3b48327b241063cee52d35d44e20ebe1b3624a81658052a4d39:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0190: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
01a0: 0a 23 64 65 66 69 6e 65 20 49 53 53 50 41 43 45  .#define ISSPACE
01b0: 28 58 29 20 69 73 73 70 61 63 65 28 28 75 6e 73  (X) isspace((uns
01c0: 69 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a  igned char)(X)).
01d0: 23 64 65 66 69 6e 65 20 49 53 44 49 47 49 54 28  #define ISDIGIT(
01e0: 58 29 20 69 73 64 69 67 69 74 28 28 75 6e 73 69  X) isdigit((unsi
01f0: 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23  gned char)(X)).#
0200: 64 65 66 69 6e 65 20 49 53 41 4c 4e 55 4d 28 58  define ISALNUM(X
0210: 29 20 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67  ) isalnum((unsig
0220: 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64  ned char)(X)).#d
0230: 65 66 69 6e 65 20 49 53 41 4c 50 48 41 28 58 29  efine ISALPHA(X)
0240: 20 69 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e   isalpha((unsign
0250: 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65  ed char)(X)).#de
0260: 66 69 6e 65 20 49 53 55 50 50 45 52 28 58 29 20  fine ISUPPER(X) 
0270: 69 73 75 70 70 65 72 28 28 75 6e 73 69 67 6e 65  isupper((unsigne
0280: 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65 66  d char)(X)).#def
0290: 69 6e 65 20 49 53 4c 4f 57 45 52 28 58 29 20 69  ine ISLOWER(X) i
02a0: 73 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65 64  slower((unsigned
02b0: 20 63 68 61 72 29 28 58 29 29 0a 0a 0a 23 69 66   char)(X))...#if
02c0: 6e 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  ndef __WIN32__.#
02d0: 20 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 57     if defined(_W
02e0: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
02f0: 28 57 49 4e 33 32 29 0a 23 20 20 20 20 20 20 20  (WIN32).#       
0300: 64 65 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f  define __WIN32__
0310: 0a 23 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  .#   endif.#endi
0320: 66 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33  f..#ifdef __WIN3
0330: 32 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c  2__.#ifdef __cpl
0340: 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20 22 43  usplus.extern "C
0350: 22 20 7b 0a 23 65 6e 64 69 66 0a 65 78 74 65 72  " {.#endif.exter
0360: 6e 20 69 6e 74 20 61 63 63 65 73 73 28 63 6f 6e  n int access(con
0370: 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 69  st char *path, i
0380: 6e 74 20 6d 6f 64 65 29 3b 0a 23 69 66 64 65 66  nt mode);.#ifdef
0390: 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 7d 0a 23   __cplusplus.}.#
03a0: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 6e 63  endif.#else.#inc
03b0: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
03c0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66 69  #endif../* #defi
03d0: 6e 65 20 50 52 49 56 41 54 45 20 73 74 61 74 69  ne PRIVATE stati
03e0: 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 49  c */.#define PRI
03f0: 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54 45 53  VATE..#ifdef TES
0400: 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48 53  T.#define MAXRHS
0410: 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20   5       /* Set 
0420: 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73 65 20  low to exercise 
0430: 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65 20 2a  exception code *
0440: 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  /.#else.#define 
0450: 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65 6e 64  MAXRHS 1000.#end
0460: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  if..static int s
0470: 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e  howPrecedenceCon
0480: 66 6c 69 63 74 20 3d 20 30 3b 0a 73 74 61 74 69  flict = 0;.stati
0490: 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 63 68  c char *msort(ch
04a0: 61 72 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 28 2a  ar*,char**,int(*
04b0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
04c0: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a  nst char*));../*
04d0: 0a 2a 2a 20 43 6f 6d 70 69 6c 65 72 73 20 61 72  .** Compilers ar
04e0: 65 20 67 65 74 74 69 6e 67 20 69 6e 63 72 65 61  e getting increa
04f0: 73 69 6e 67 6c 79 20 70 65 64 61 6e 74 69 63 20  singly pedantic 
0500: 61 62 6f 75 74 20 74 79 70 65 20 63 6f 6e 76 65  about type conve
0510: 72 73 69 6f 6e 73 0a 2a 2a 20 61 73 20 43 20 65  rsions.** as C e
0520: 76 6f 6c 76 65 73 20 65 76 65 72 20 63 6c 6f 73  volves ever clos
0530: 65 72 20 74 6f 20 41 64 61 2e 2e 2e 2e 20 20 54  er to Ada....  T
0540: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
0550: 65 20 6c 61 74 65 73 74 20 70 72 6f 62 6c 65 6d  e latest problem
0560: 73 0a 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20  s.** we have to 
0570: 64 65 66 69 6e 65 20 74 68 65 20 66 6f 6c 6c 6f  define the follo
0580: 77 69 6e 67 20 76 61 72 69 61 6e 74 20 6f 66 20  wing variant of 
0590: 73 74 72 6c 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65  strlen()..*/.#de
05a0: 66 69 6e 65 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  fine lemonStrlen
05b0: 28 58 29 20 20 20 28 28 69 6e 74 29 73 74 72 6c  (X)   ((int)strl
05c0: 65 6e 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f  en(X))../*.** Co
05d0: 6d 70 69 6c 65 72 73 20 61 72 65 20 73 74 61 72  mpilers are star
05e0: 74 69 6e 67 20 74 6f 20 63 6f 6d 70 6c 61 69 6e  ting to complain
05f0: 20 61 62 6f 75 74 20 74 68 65 20 75 73 65 20 6f   about the use o
0600: 66 20 73 70 72 69 6e 74 66 28 29 20 61 6e 64 20  f sprintf() and 
0610: 73 74 72 63 70 79 28 29 2c 0a 2a 2a 20 73 61 79  strcpy(),.** say
0620: 69 6e 67 20 74 68 65 79 20 61 72 65 20 75 6e 73  ing they are uns
0630: 61 66 65 2e 20 20 53 6f 20 77 65 20 64 65 66 69  afe.  So we defi
0640: 6e 65 20 6f 75 72 20 6f 77 6e 20 76 65 72 73 69  ne our own versi
0650: 6f 6e 73 20 6f 66 20 74 68 6f 73 65 20 72 6f 75  ons of those rou
0660: 74 69 6e 65 73 20 74 6f 6f 2e 0a 2a 2a 0a 2a 2a  tines too..**.**
0670: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
0680: 20 72 6f 75 74 69 6e 65 73 20 68 65 72 65 3a 20   routines here: 
0690: 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 29   lemon_sprintf()
06a0: 2c 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74 66  , lemon_vsprintf
06b0: 28 29 2c 20 61 6e 64 0a 2a 2a 20 6c 65 6d 6f 6e  (), and.** lemon
06c0: 5f 61 64 64 74 65 78 74 28 29 2e 20 54 68 65 20  _addtext(). The 
06d0: 66 69 72 73 74 20 74 77 6f 20 61 72 65 20 72 65  first two are re
06e0: 70 6c 61 63 65 6d 65 6e 74 73 20 66 6f 72 20 73  placements for s
06f0: 70 72 69 6e 74 66 28 29 20 61 6e 64 20 76 73 70  printf() and vsp
0700: 72 69 6e 74 66 28 29 2e 0a 2a 2a 20 54 68 65 20  rintf()..** The 
0710: 74 68 69 72 64 20 69 73 20 61 20 68 65 6c 70 65  third is a helpe
0720: 72 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 76 73  r routine for vs
0730: 6e 70 72 69 6e 74 66 28 29 20 74 68 61 74 20 61  nprintf() that a
0740: 64 64 73 20 74 65 78 74 73 20 74 6f 20 74 68 65  dds texts to the
0750: 20 65 6e 64 20 6f 66 20 61 0a 2a 2a 20 62 75 66   end of a.** buf
0760: 66 65 72 2c 20 6d 61 6b 69 6e 67 20 73 75 72 65  fer, making sure
0770: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 61   the buffer is a
0780: 6c 77 61 79 73 20 7a 65 72 6f 2d 74 65 72 6d 69  lways zero-termi
0790: 6e 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nated..**.** The
07a0: 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 65   string formatte
07b0: 72 20 69 73 20 61 20 6d 69 6e 69 6d 61 6c 20 73  r is a minimal s
07c0: 75 62 73 65 74 20 6f 66 20 73 74 64 6c 69 62 20  ubset of stdlib 
07d0: 73 70 72 69 6e 74 66 28 29 20 73 75 70 70 6f 72  sprintf() suppor
07e0: 74 69 6e 67 20 6f 6e 6c 79 0a 2a 2a 20 61 20 66  ting only.** a f
07f0: 65 77 20 73 69 6d 70 6c 79 20 63 6f 6e 76 65 72  ew simply conver
0800: 73 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 25  sions:.**.**   %
0810: 64 0a 2a 2a 20 20 20 25 73 0a 2a 2a 20 20 20 25  d.**   %s.**   %
0820: 2e 2a 73 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  .*s.**.*/.static
0830: 20 76 6f 69 64 20 6c 65 6d 6f 6e 5f 61 64 64 74   void lemon_addt
0840: 65 78 74 28 0a 20 20 63 68 61 72 20 2a 7a 42 75  ext(.  char *zBu
0850: 66 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  f,           /* 
0860: 54 68 65 20 62 75 66 66 65 72 20 74 6f 20 77 68  The buffer to wh
0870: 69 63 68 20 74 65 78 74 20 69 73 20 61 64 64 65  ich text is adde
0880: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 55 73  d */.  int *pnUs
0890: 65 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed,          /* 
08a0: 53 6c 6f 74 73 20 6f 66 20 74 68 65 20 62 75 66  Slots of the buf
08b0: 66 65 72 20 75 73 65 64 20 73 6f 20 66 61 72 20  fer used so far 
08c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
08d0: 2a 7a 49 6e 2c 20 20 20 20 20 20 2f 2a 20 54 65  *zIn,      /* Te
08e0: 78 74 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69  xt to add */.  i
08f0: 6e 74 20 6e 49 6e 2c 20 20 20 20 20 20 20 20 20  nt nIn,         
0900: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
0910: 20 74 65 78 74 20 74 6f 20 61 64 64 2e 20 20 2d   text to add.  -
0920: 31 20 74 6f 20 75 73 65 20 73 74 72 6c 65 6e 28  1 to use strlen(
0930: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 57 69 64 74  ) */.  int iWidt
0940: 68 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h            /* 
0950: 46 69 65 6c 64 20 77 69 64 74 68 2e 20 20 4e 65  Field width.  Ne
0960: 67 61 74 69 76 65 20 74 6f 20 6c 65 66 74 20 6a  gative to left j
0970: 75 73 74 69 66 79 20 2a 2f 0a 29 7b 0a 20 20 69  ustify */.){.  i
0980: 66 28 20 6e 49 6e 3c 30 20 29 20 66 6f 72 28 6e  f( nIn<0 ) for(n
0990: 49 6e 3d 30 3b 20 7a 49 6e 5b 6e 49 6e 5d 3b 20  In=0; zIn[nIn]; 
09a0: 6e 49 6e 2b 2b 29 7b 7d 0a 20 20 77 68 69 6c 65  nIn++){}.  while
09b0: 28 20 69 57 69 64 74 68 3e 6e 49 6e 20 29 7b 20  ( iWidth>nIn ){ 
09c0: 7a 42 75 66 5b 28 2a 70 6e 55 73 65 64 29 2b 2b  zBuf[(*pnUsed)++
09d0: 5d 20 3d 20 27 20 27 3b 20 69 57 69 64 74 68 2d  ] = ' '; iWidth-
09e0: 2d 3b 20 7d 0a 20 20 69 66 28 20 6e 49 6e 3d 3d  -; }.  if( nIn==
09f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  0 ) return;.  me
0a00: 6d 63 70 79 28 26 7a 42 75 66 5b 2a 70 6e 55 73  mcpy(&zBuf[*pnUs
0a10: 65 64 5d 2c 20 7a 49 6e 2c 20 6e 49 6e 29 3b 0a  ed], zIn, nIn);.
0a20: 20 20 2a 70 6e 55 73 65 64 20 2b 3d 20 6e 49 6e    *pnUsed += nIn
0a30: 3b 0a 20 20 77 68 69 6c 65 28 20 28 2d 69 57 69  ;.  while( (-iWi
0a40: 64 74 68 29 3e 6e 49 6e 20 29 7b 20 7a 42 75 66  dth)>nIn ){ zBuf
0a50: 5b 28 2a 70 6e 55 73 65 64 29 2b 2b 5d 20 3d 20  [(*pnUsed)++] = 
0a60: 27 20 27 3b 20 69 57 69 64 74 68 2b 2b 3b 20 7d  ' '; iWidth++; }
0a70: 0a 20 20 7a 42 75 66 5b 2a 70 6e 55 73 65 64 5d  .  zBuf[*pnUsed]
0a80: 20 3d 20 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69   = 0;.}.static i
0a90: 6e 74 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74  nt lemon_vsprint
0aa0: 66 28 63 68 61 72 20 2a 73 74 72 2c 20 63 6f 6e  f(char *str, con
0ab0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
0ac0: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
0ad0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 63 3b   int i, j, k, c;
0ae0: 0a 20 20 69 6e 74 20 6e 55 73 65 64 20 3d 20 30  .  int nUsed = 0
0af0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
0b00: 7a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  z;.  char zTemp[
0b10: 35 30 5d 3b 0a 20 20 73 74 72 5b 30 5d 20 3d 20  50];.  str[0] = 
0b20: 30 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  0;.  for(i=j=0; 
0b30: 28 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 69 5d 29  (c = zFormat[i])
0b40: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  !=0; i++){.    i
0b50: 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a 20 20 20  f( c=='%' ){.   
0b60: 20 20 20 69 6e 74 20 69 57 69 64 74 68 20 3d 20     int iWidth = 
0b70: 30 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  0;.      lemon_a
0b80: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0b90: 65 64 2c 20 26 7a 46 6f 72 6d 61 74 5b 6a 5d 2c  ed, &zFormat[j],
0ba0: 20 69 2d 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20   i-j, 0);.      
0bb0: 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 2b 2b 69 5d  c = zFormat[++i]
0bc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 44 49  ;.      if( ISDI
0bd0: 47 49 54 28 63 29 20 7c 7c 20 28 63 3d 3d 27 2d  GIT(c) || (c=='-
0be0: 27 20 26 26 20 49 53 44 49 47 49 54 28 7a 46 6f  ' && ISDIGIT(zFo
0bf0: 72 6d 61 74 5b 69 2b 31 5d 29 29 20 29 7b 0a 20  rmat[i+1])) ){. 
0c00: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2d         if( c=='-
0c10: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) i++;.       
0c20: 20 77 68 69 6c 65 28 20 49 53 44 49 47 49 54 28   while( ISDIGIT(
0c30: 7a 46 6f 72 6d 61 74 5b 69 5d 29 20 29 20 69 57  zFormat[i]) ) iW
0c40: 69 64 74 68 20 3d 20 69 57 69 64 74 68 2a 31 30  idth = iWidth*10
0c50: 20 2b 20 7a 46 6f 72 6d 61 74 5b 69 2b 2b 5d 20   + zFormat[i++] 
0c60: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69  - '0';.        i
0c70: 66 28 20 63 3d 3d 27 2d 27 20 29 20 69 57 69 64  f( c=='-' ) iWid
0c80: 74 68 20 3d 20 2d 69 57 69 64 74 68 3b 0a 20 20  th = -iWidth;.  
0c90: 20 20 20 20 20 20 63 20 3d 20 7a 46 6f 72 6d 61        c = zForma
0ca0: 74 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t[i];.      }.  
0cb0: 20 20 20 20 69 66 28 20 63 3d 3d 27 64 27 20 29      if( c=='d' )
0cc0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76 20  {.        int v 
0cd0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
0ce0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
0cf0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
0d00: 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74  lemon_addtext(st
0d10: 72 2c 20 26 6e 55 73 65 64 2c 20 22 2d 22 2c 20  r, &nUsed, "-", 
0d20: 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20 20 20  1, iWidth);.    
0d30: 20 20 20 20 20 20 76 20 3d 20 2d 76 3b 0a 20 20        v = -v;.  
0d40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
0d50: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  v==0 ){.        
0d60: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0d70: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 22 30 22  str, &nUsed, "0"
0d80: 2c 20 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20  , 1, iWidth);.  
0d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0da0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77  k = 0;.        w
0db0: 68 69 6c 65 28 20 76 3e 30 20 29 7b 0a 20 20 20  hile( v>0 ){.   
0dc0: 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20         k++;.    
0dd0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 73 69 7a 65        zTemp[size
0de0: 6f 66 28 7a 54 65 6d 70 29 2d 6b 5d 20 3d 20 28  of(zTemp)-k] = (
0df0: 76 25 31 30 29 20 2b 20 27 30 27 3b 0a 20 20 20  v%10) + '0';.   
0e00: 20 20 20 20 20 20 20 76 20 2f 3d 20 31 30 3b 0a         v /= 10;.
0e10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0e20: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0e30: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 26 7a 54  str, &nUsed, &zT
0e40: 65 6d 70 5b 73 69 7a 65 6f 66 28 7a 54 65 6d 70  emp[sizeof(zTemp
0e50: 29 2d 6b 5d 2c 20 6b 2c 20 69 57 69 64 74 68 29  )-k], k, iWidth)
0e60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
0e70: 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20  ( c=='s' ){.    
0e80: 20 20 20 20 7a 20 3d 20 76 61 5f 61 72 67 28 61      z = va_arg(a
0e90: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
0ea0: 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  .        lemon_a
0eb0: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0ec0: 65 64 2c 20 7a 2c 20 2d 31 2c 20 69 57 69 64 74  ed, z, -1, iWidt
0ed0: 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  h);.      }else 
0ee0: 69 66 28 20 63 3d 3d 27 2e 27 20 26 26 20 6d 65  if( c=='.' && me
0ef0: 6d 63 6d 70 28 26 7a 46 6f 72 6d 61 74 5b 69 5d  mcmp(&zFormat[i]
0f00: 2c 20 22 2e 2a 73 22 2c 20 33 29 3d 3d 30 20 29  , ".*s", 3)==0 )
0f10: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  {.        i += 2
0f20: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 76 61  ;.        k = va
0f30: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
0f40: 20 20 20 20 20 20 20 7a 20 3d 20 76 61 5f 61 72         z = va_ar
0f50: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
0f60: 2a 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f  *);.        lemo
0f70: 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20 26  n_addtext(str, &
0f80: 6e 55 73 65 64 2c 20 7a 2c 20 6b 2c 20 69 57 69  nUsed, z, k, iWi
0f90: 64 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dth);.      }els
0fa0: 65 20 69 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a  e if( c=='%' ){.
0fb0: 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64          lemon_ad
0fc0: 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65  dtext(str, &nUse
0fd0: 64 2c 20 22 25 22 2c 20 31 2c 20 30 29 3b 0a 20  d, "%", 1, 0);. 
0fe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
0ff0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1000: 72 72 2c 20 22 69 6c 6c 65 67 61 6c 20 66 6f 72  rr, "illegal for
1010: 6d 61 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  mat\n");.       
1020: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
1030: 7d 0a 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b  }.      j = i+1;
1040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 65 6d  .    }.  }.  lem
1050: 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20  on_addtext(str, 
1060: 26 6e 55 73 65 64 2c 20 26 7a 46 6f 72 6d 61 74  &nUsed, &zFormat
1070: 5b 6a 5d 2c 20 69 2d 6a 2c 20 30 29 3b 0a 20 20  [j], i-j, 0);.  
1080: 72 65 74 75 72 6e 20 6e 55 73 65 64 3b 0a 7d 0a  return nUsed;.}.
1090: 73 74 61 74 69 63 20 69 6e 74 20 6c 65 6d 6f 6e  static int lemon
10a0: 5f 73 70 72 69 6e 74 66 28 63 68 61 72 20 2a 73  _sprintf(char *s
10b0: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
10c0: 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  format, ...){.  
10d0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
10e0: 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  t rc;.  va_start
10f0: 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20  (ap, format);.  
1100: 72 63 20 3d 20 6c 65 6d 6f 6e 5f 76 73 70 72 69  rc = lemon_vspri
1110: 6e 74 66 28 73 74 72 2c 20 66 6f 72 6d 61 74 2c  ntf(str, format,
1120: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1130: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1140: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
1150: 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63 68 61 72  emon_strcpy(char
1160: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
1170: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
1180: 65 28 20 28 2a 28 64 65 73 74 2b 2b 29 20 3d 20  e( (*(dest++) = 
1190: 2a 28 73 72 63 2b 2b 29 29 21 3d 30 20 29 7b 7d  *(src++))!=0 ){}
11a0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
11b0: 65 6d 6f 6e 5f 73 74 72 63 61 74 28 63 68 61 72  emon_strcat(char
11c0: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
11d0: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
11e0: 65 28 20 2a 64 65 73 74 20 29 20 64 65 73 74 2b  e( *dest ) dest+
11f0: 2b 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70  +;.  lemon_strcp
1200: 79 28 64 65 73 74 2c 20 73 72 63 29 3b 0a 7d 0a  y(dest, src);.}.
1210: 0a 0a 2f 2a 20 61 20 66 65 77 20 66 6f 72 77 61  ../* a few forwa
1220: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e  rd declarations.
1230: 2e 2e 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c  .. */.struct rul
1240: 65 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 3b  e;.struct lemon;
1250: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 3b 0a  .struct action;.
1260: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
1270: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65  ction *Action_ne
1280: 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63 20  w(void);.static 
1290: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
12a0: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72 75 63  ction_sort(struc
12b0: 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a  t action *);../*
12c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
12d0: 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 68  he file "build.h
12e0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
12f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1300: 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e  ******/.void Fin
1310: 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73  dRulePrecedences
1320: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a 29 3b  (struct lemon*);
1330: 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53  .void FindFirstS
1340: 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ets(struct lemon
1350: 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64 53 74 61  *);.void FindSta
1360: 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  tes(struct lemon
1370: 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e  *);.void FindLin
1380: 6b 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 2a  ks(struct lemon*
1390: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c  );.void FindFoll
13a0: 6f 77 53 65 74 73 28 73 74 72 75 63 74 20 6c 65  owSets(struct le
13b0: 6d 6f 6e 2a 29 3b 0a 76 6f 69 64 20 46 69 6e 64  mon*);.void Find
13c0: 41 63 74 69 6f 6e 73 28 73 74 72 75 63 74 20 6c  Actions(struct l
13d0: 65 6d 6f 6e 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  emon*);../******
13e0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
13f0: 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 68 22  e "configlist.h"
1400: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1420: 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  **/.void Configl
1430: 69 73 74 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a  ist_init(void);.
1440: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
1450: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 73 74  onfiglist_add(st
1460: 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74  ruct rule *, int
1470: 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  );.struct config
1480: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   *Configlist_add
1490: 62 61 73 69 73 28 73 74 72 75 63 74 20 72 75 6c  basis(struct rul
14a0: 65 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20  e *, int);.void 
14b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75  Configlist_closu
14c0: 72 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  re(struct lemon 
14d0: 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  *);.void Configl
14e0: 69 73 74 5f 73 6f 72 74 28 76 6f 69 64 29 3b 0a  ist_sort(void);.
14f0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1500: 73 6f 72 74 62 61 73 69 73 28 76 6f 69 64 29 3b  sortbasis(void);
1510: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1520: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72  Configlist_retur
1530: 6e 28 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20  n(void);.struct 
1540: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
1550: 73 74 5f 62 61 73 69 73 28 76 6f 69 64 29 3b 0a  st_basis(void);.
1560: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
1570: 65 61 74 28 73 74 72 75 63 74 20 63 6f 6e 66 69  eat(struct confi
1580: 67 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  g *);.void Confi
1590: 67 6c 69 73 74 5f 72 65 73 65 74 28 76 6f 69 64  glist_reset(void
15a0: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  );../********* F
15b0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 65 72  rom the file "er
15c0: 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ror.h" *********
15d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
15f0: 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f  void ErrorMsg(co
1600: 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c  nst char *, int,
1610: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 2e 2e  const char *, ..
1620: 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 20 46 72 6f  .);../****** Fro
1630: 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69  m the file "opti
1640: 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on.h" **********
1650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1670: 2f 0a 65 6e 75 6d 20 6f 70 74 69 6f 6e 5f 74 79  /.enum option_ty
1680: 70 65 20 7b 20 4f 50 54 5f 46 4c 41 47 3d 31 2c  pe { OPT_FLAG=1,
1690: 20 20 4f 50 54 5f 49 4e 54 2c 20 20 4f 50 54 5f    OPT_INT,  OPT_
16a0: 44 42 4c 2c 20 20 4f 50 54 5f 53 54 52 2c 0a 20  DBL,  OPT_STR,. 
16b0: 20 20 20 20 20 20 20 20 4f 50 54 5f 46 46 4c 41          OPT_FFLA
16c0: 47 2c 20 4f 50 54 5f 46 49 4e 54 2c 20 4f 50 54  G, OPT_FINT, OPT
16d0: 5f 46 44 42 4c 2c 20 4f 50 54 5f 46 53 54 52 7d  _FDBL, OPT_FSTR}
16e0: 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  ;.struct s_optio
16f0: 6e 73 20 7b 0a 20 20 65 6e 75 6d 20 6f 70 74 69  ns {.  enum opti
1700: 6f 6e 5f 74 79 70 65 20 74 79 70 65 3b 0a 20 20  on_type type;.  
1710: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 61 62 65  const char *labe
1720: 6c 3b 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 0a  l;.  char *arg;.
1730: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 65    const char *me
1740: 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e 74 20 20 20  ssage;.};.int   
1750: 20 4f 70 74 49 6e 69 74 28 63 68 61 72 2a 2a 2c   OptInit(char**,
1760: 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73  struct s_options
1770: 2a 2c 46 49 4c 45 2a 29 3b 0a 69 6e 74 20 20 20  *,FILE*);.int   
1780: 20 4f 70 74 4e 41 72 67 73 28 76 6f 69 64 29 3b   OptNArgs(void);
1790: 0a 63 68 61 72 20 20 2a 4f 70 74 41 72 67 28 69  .char  *OptArg(i
17a0: 6e 74 29 3b 0a 76 6f 69 64 20 20 20 4f 70 74 45  nt);.void   OptE
17b0: 72 72 28 69 6e 74 29 3b 0a 76 6f 69 64 20 20 20  rr(int);.void   
17c0: 4f 70 74 50 72 69 6e 74 28 76 6f 69 64 29 3b 0a  OptPrint(void);.
17d0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ./******** From 
17e0: 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e  the file "parse.
17f0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
1800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1820: 69 64 20 50 61 72 73 65 28 73 74 72 75 63 74 20  id Parse(struct 
1830: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 3b 0a 0a 2f  lemon *lemp);../
1840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
1850: 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 68  he file "plink.h
1860: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
1870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63  *********/.struc
1890: 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e  t plink *Plink_n
18a0: 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 50  ew(void);.void P
18b0: 6c 69 6e 6b 5f 61 64 64 28 73 74 72 75 63 74 20  link_add(struct 
18c0: 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63 74  plink **, struct
18d0: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64   config *);.void
18e0: 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74 72 75   Plink_copy(stru
18f0: 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72  ct plink **, str
1900: 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b 0a 76 6f  uct plink *);.vo
1910: 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28  id Plink_delete(
1920: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b  struct plink *);
1930: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
1940: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70  om the file "rep
1950: 6f 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ort.h" *********
1960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1980: 69 64 20 52 65 70 72 69 6e 74 28 73 74 72 75 63  id Reprint(struc
1990: 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64  t lemon *);.void
19a0: 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 73 74   ReportOutput(st
19b0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76  ruct lemon *);.v
19c0: 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28  oid ReportTable(
19d0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20  struct lemon *, 
19e0: 69 6e 74 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72  int);.void Repor
19f0: 74 48 65 61 64 65 72 28 73 74 72 75 63 74 20 6c  tHeader(struct l
1a00: 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 43 6f  emon *);.void Co
1a10: 6d 70 72 65 73 73 54 61 62 6c 65 73 28 73 74 72  mpressTables(str
1a20: 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f  uct lemon *);.vo
1a30: 69 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28  id ResortStates(
1a40: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b  struct lemon *);
1a50: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
1a60: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 65 74  om the file "set
1a70: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
1aa0: 69 64 20 20 53 65 74 53 69 7a 65 28 69 6e 74 29  id  SetSize(int)
1ab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ac0: 20 41 6c 6c 20 73 65 74 73 20 77 69 6c 6c 20 62   All sets will b
1ad0: 65 20 6f 66 20 73 69 7a 65 20 4e 20 2a 2f 0a 63  e of size N */.c
1ae0: 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f 69 64  har *SetNew(void
1af0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1b00: 20 2f 2a 20 41 20 6e 65 77 20 73 65 74 20 66 6f   /* A new set fo
1b10: 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e 4e 20 2a  r element 0..N *
1b20: 2f 0a 76 6f 69 64 20 20 53 65 74 46 72 65 65 28  /.void  SetFree(
1b30: 63 68 61 72 2a 29 3b 20 20 20 20 20 20 20 20 20  char*);         
1b40: 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74      /* Deallocat
1b50: 65 20 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53  e a set */.int S
1b60: 65 74 41 64 64 28 63 68 61 72 2a 2c 69 6e 74 29  etAdd(char*,int)
1b70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b80: 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f 20 61  Add element to a
1b90: 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65 74 55   set */.int SetU
1ba0: 6e 69 6f 6e 28 63 68 61 72 20 2a 2c 63 68 61 72  nion(char *,char
1bb0: 20 2a 29 3b 20 20 20 20 2f 2a 20 41 20 3c 2d 20   *);    /* A <- 
1bc0: 41 20 55 20 42 2c 20 74 68 72 75 20 65 6c 65 6d  A U B, thru elem
1bd0: 65 6e 74 20 4e 20 2a 2f 0a 23 64 65 66 69 6e 65  ent N */.#define
1be0: 20 53 65 74 46 69 6e 64 28 58 2c 59 29 20 28 58   SetFind(X,Y) (X
1bf0: 5b 59 5d 29 20 20 20 20 20 20 20 2f 2a 20 54 72  [Y])       /* Tr
1c00: 75 65 20 69 66 20 59 20 69 73 20 69 6e 20 73 65  ue if Y is in se
1c10: 74 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  t X */../*******
1c20: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1c30: 65 20 22 73 74 72 75 63 74 2e 68 22 20 2a 2a 2a  e "struct.h" ***
1c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c60: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 63 69  **/./*.** Princi
1c70: 70 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  pal data structu
1c80: 72 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f  res for the LEMO
1c90: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
1ca0: 6f 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20  or..*/..typedef 
1cb0: 65 6e 75 6d 20 7b 4c 45 4d 4f 4e 5f 46 41 4c 53  enum {LEMON_FALS
1cc0: 45 3d 30 2c 20 4c 45 4d 4f 4e 5f 54 52 55 45 7d  E=0, LEMON_TRUE}
1cd0: 20 42 6f 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20 53 79   Boolean;../* Sy
1ce0: 6d 62 6f 6c 73 20 28 74 65 72 6d 69 6e 61 6c 73  mbols (terminals
1cf0: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
1d00: 73 29 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  s) of the gramma
1d10: 72 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20  r are stored.** 
1d20: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1d30: 3a 20 2a 2f 0a 65 6e 75 6d 20 73 79 6d 62 6f 6c  : */.enum symbol
1d40: 5f 74 79 70 65 20 7b 0a 20 20 54 45 52 4d 49 4e  _type {.  TERMIN
1d50: 41 4c 2c 0a 20 20 4e 4f 4e 54 45 52 4d 49 4e 41  AL,.  NONTERMINA
1d60: 4c 2c 0a 20 20 4d 55 4c 54 49 54 45 52 4d 49 4e  L,.  MULTITERMIN
1d70: 41 4c 0a 7d 3b 0a 65 6e 75 6d 20 65 5f 61 73 73  AL.};.enum e_ass
1d80: 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c 0a 20  oc {.    LEFT,. 
1d90: 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20 4e 4f     RIGHT,.    NO
1da0: 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 7d 3b 0a 73  NE,.    UNK.};.s
1db0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 7b 0a 20  truct symbol {. 
1dc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d   const char *nam
1dd0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  e;        /* Nam
1de0: 65 20 6f 66 20 74 68 65 20 73 79 6d 62 6f 6c 20  e of the symbol 
1df0: 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20  */.  int index; 
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e10: 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f   Index number fo
1e20: 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f  r this symbol */
1e30: 0a 20 20 65 6e 75 6d 20 73 79 6d 62 6f 6c 5f 74  .  enum symbol_t
1e40: 79 70 65 20 74 79 70 65 3b 20 20 20 2f 2a 20 53  ype type;   /* S
1e50: 79 6d 62 6f 6c 73 20 61 72 65 20 61 6c 6c 20 65  ymbols are all e
1e60: 69 74 68 65 72 20 54 45 52 4d 49 4e 41 4c 53 20  ither TERMINALS 
1e70: 6f 72 20 4e 54 73 20 2a 2f 0a 20 20 73 74 72 75  or NTs */.  stru
1e80: 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20  ct rule *rule;  
1e90: 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c       /* Linked l
1ea0: 69 73 74 20 6f 66 20 72 75 6c 65 73 20 6f 66 20  ist of rules of 
1eb0: 74 68 69 73 20 28 69 66 20 61 6e 20 4e 54 29 20  this (if an NT) 
1ec0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
1ed0: 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 2f 2a  ol *fallback; /*
1ee0: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20   fallback token 
1ef0: 69 6e 20 63 61 73 65 20 74 68 69 73 20 74 6f 6b  in case this tok
1f00: 65 6e 20 64 6f 65 73 6e 27 74 20 70 61 72 73 65  en doesn't parse
1f10: 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63 3b 20   */.  int prec; 
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f30: 2a 20 50 72 65 63 65 64 65 6e 63 65 20 69 66 20  * Precedence if 
1f40: 64 65 66 69 6e 65 64 20 28 2d 31 20 6f 74 68 65  defined (-1 othe
1f50: 72 77 69 73 65 29 20 2a 2f 0a 20 20 65 6e 75 6d  rwise) */.  enum
1f60: 20 65 5f 61 73 73 6f 63 20 61 73 73 6f 63 3b 20   e_assoc assoc; 
1f70: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
1f80: 69 76 69 74 79 20 69 66 20 70 72 65 63 65 64 65  ivity if precede
1f90: 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64 20 2a  nce is defined *
1fa0: 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73 74 73  /.  char *firsts
1fb0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
1fc0: 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20 61 6c  First-set for al
1fd0: 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73 20  l rules of this 
1fe0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f 6f 6c  symbol */.  Bool
1ff0: 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20 20 20  ean lambda;     
2000: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2010: 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e 65 72  NT and can gener
2020: 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72  ate an empty str
2030: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ing */.  int use
2040: 43 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cnt;            
2050: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2060: 69 6d 65 73 20 75 73 65 64 20 2a 2f 0a 20 20 63  imes used */.  c
2070: 68 61 72 20 2a 64 65 73 74 72 75 63 74 6f 72 3b  har *destructor;
2080: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2090: 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
20a0: 68 65 6e 65 76 65 72 20 74 68 69 73 20 73 79 6d  henever this sym
20b0: 62 6f 6c 20 69 73 0a 20 20 20 20 20 20 20 20 20  bol is.         
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 2a 2a 20 70 6f 70 70 65 64 20 66 72 6f 6d    ** popped from
20e0: 20 74 68 65 20 73 74 61 63 6b 20 64 75 72 69 6e   the stack durin
20f0: 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73 73 69  g error processi
2100: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  ng */.  int dest
2110: 4c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20  Lineno;         
2120: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
2130: 66 6f 72 20 73 74 61 72 74 20 6f 66 20 64 65 73  for start of des
2140: 74 72 75 63 74 6f 72 2e 20 20 53 65 74 20 74 6f  tructor.  Set to
2150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2160: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 2d              ** -
2170: 31 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  1 for duplicate 
2180: 64 65 73 74 72 75 63 74 6f 72 73 2e 20 2a 2f 0a  destructors. */.
2190: 20 20 63 68 61 72 20 2a 64 61 74 61 74 79 70 65    char *datatype
21a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
21b0: 65 20 64 61 74 61 20 74 79 70 65 20 6f 66 20 69  e data type of i
21c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c 64 20  nformation held 
21d0: 62 79 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  by this.        
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e     ** object. On
2200: 6c 79 20 75 73 65 64 20 69 66 20 74 79 70 65 3d  ly used if type=
2210: 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a  =NONTERMINAL */.
2220: 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20 20 20    int dtnum;    
2230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2240: 65 20 64 61 74 61 20 74 79 70 65 20 6e 75 6d 62  e data type numb
2250: 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61 72 73  er.  In the pars
2260: 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a 20 20  er, the value.  
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61 63           ** stac
2290: 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20 20 54  k is a union.  T
22a0: 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65 6e 74  he .yy%d element
22b0: 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20 20 20   of this.       
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69 73 20      ** union is 
22e0: 74 68 65 20 63 6f 72 72 65 63 74 20 64 61 74 61  the correct data
22f0: 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20 6f   type for this o
2300: 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a 20 54 68  bject */.  /* Th
2310: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
2320: 64 73 20 61 72 65 20 75 73 65 64 20 62 79 20 4d  ds are used by M
2330: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73 20 6f 6e  ULTITERMINALs on
2340: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 75 62  ly */.  int nsub
2350: 73 79 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sym;            
2360: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
2370: 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c  nstituent symbol
2380: 73 20 69 6e 20 74 68 65 20 4d 55 4c 54 49 20 2a  s in the MULTI *
2390: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
23a0: 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20 2f 2a 20  l **subsym;  /* 
23b0: 41 72 72 61 79 20 6f 66 20 63 6f 6e 73 74 69 74  Array of constit
23c0: 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  uent symbols */.
23d0: 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64  };../* Each prod
23e0: 75 63 74 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74  uction rule in t
23f0: 68 65 20 67 72 61 6d 6d 61 72 20 69 73 20 73 74  he grammar is st
2400: 6f 72 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ored in the foll
2410: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
2420: 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63 74 20 72  re.  */.struct r
2430: 75 6c 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ule {.  struct s
2440: 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20  ymbol *lhs;     
2450: 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69   /* Left-hand si
2460: 64 65 20 6f 66 20 74 68 65 20 72 75 6c 65 20 2a  de of the rule *
2470: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2480: 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 2f 2a 20  lhsalias;    /* 
2490: 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48  Alias for the LH
24a0: 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29  S (NULL if none)
24b0: 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73 53 74 61   */.  int lhsSta
24c0: 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rt;            /
24d0: 2a 20 54 72 75 65 20 69 66 20 6c 65 66 74 2d 68  * True if left-h
24e0: 61 6e 64 20 73 69 64 65 20 69 73 20 74 68 65 20  and side is the 
24f0: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a  start symbol */.
2500: 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20    int ruleline; 
2510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2520: 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ne number for th
2530: 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e rule */.  int 
2540: 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  nrhs;           
2550: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2560: 66 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f  f RHS symbols */
2570: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
2580: 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20 54   **rhs;     /* T
2590: 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  he RHS symbols *
25a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
25b0: 2a 72 68 73 61 6c 69 61 73 3b 20 20 20 2f 2a 20  *rhsalias;   /* 
25c0: 41 6e 20 61 6c 69 61 73 20 66 6f 72 20 65 61 63  An alias for eac
25d0: 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55  h RHS symbol (NU
25e0: 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20  LL if none) */. 
25f0: 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20 20   int line;      
2600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
2610: 65 20 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63  e number at whic
2620: 68 20 63 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f  h code begins */
2630: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  .  const char *c
2640: 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ode;        /* T
2650: 68 65 20 63 6f 64 65 20 65 78 65 63 75 74 65 64  he code executed
2660: 20 77 68 65 6e 20 74 68 69 73 20 72 75 6c 65 20   when this rule 
2670: 69 73 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20  is reduced */.  
2680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65  const char *code
2690: 50 72 65 66 69 78 3b 20 20 2f 2a 20 53 65 74 75  Prefix;  /* Setu
26a0: 70 20 63 6f 64 65 20 62 65 66 6f 72 65 20 63 6f  p code before co
26b0: 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f 0a 20 20  de[] above */.  
26c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 64 65  const char *code
26d0: 53 75 66 66 69 78 3b 20 20 2f 2a 20 42 72 65 61  Suffix;  /* Brea
26e0: 6b 64 6f 77 6e 20 63 6f 64 65 20 61 66 74 65 72  kdown code after
26f0: 20 63 6f 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f   code[] above */
2700: 0a 20 20 69 6e 74 20 6e 6f 43 6f 64 65 3b 20 20  .  int noCode;  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2720: 72 75 65 20 69 66 20 74 68 69 73 20 72 75 6c 65  rue if this rule
2730: 20 68 61 73 20 6e 6f 20 61 73 73 6f 63 69 61 74   has no associat
2740: 65 64 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 69  ed C code */.  i
2750: 6e 74 20 63 6f 64 65 45 6d 69 74 74 65 64 3b 20  nt codeEmitted; 
2760: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2770: 69 66 20 74 68 65 20 63 6f 64 65 20 68 61 73 20  if the code has 
2780: 62 65 65 6e 20 65 6d 69 74 74 65 64 20 61 6c 72  been emitted alr
2790: 65 61 64 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  eady */.  struct
27a0: 20 73 79 6d 62 6f 6c 20 2a 70 72 65 63 73 79 6d   symbol *precsym
27b0: 3b 20 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65  ;  /* Precedence
27c0: 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 69 73   symbol for this
27d0: 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   rule */.  int i
27e0: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
27f0: 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
2800: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
2810: 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  rule */.  int iR
2820: 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ule;            
2830: 20 20 20 2f 2a 20 52 75 6c 65 20 6e 75 6d 62 65     /* Rule numbe
2840: 72 20 61 73 20 75 73 65 64 20 69 6e 20 74 68 65  r as used in the
2850: 20 67 65 6e 65 72 61 74 65 64 20 74 61 62 6c 65   generated table
2860: 73 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 63  s */.  Boolean c
2870: 61 6e 52 65 64 75 63 65 3b 20 20 20 20 20 20 20  anReduce;       
2880: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2890: 72 75 6c 65 20 69 73 20 65 76 65 72 20 72 65 64  rule is ever red
28a0: 75 63 65 64 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61  uced */.  Boolea
28b0: 6e 20 64 6f 65 73 52 65 64 75 63 65 3b 20 20 20  n doesReduce;   
28c0: 20 20 20 2f 2a 20 52 65 64 75 63 65 20 61 63 74     /* Reduce act
28d0: 69 6f 6e 73 20 6f 63 63 75 72 20 61 66 74 65 72  ions occur after
28e0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f   optimization */
28f0: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
2900: 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e  nextlhs;    /* N
2910: 65 78 74 20 72 75 6c 65 20 77 69 74 68 20 74 68  ext rule with th
2920: 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20  e same LHS */.  
2930: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78  struct rule *nex
2940: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  t;       /* Next
2950: 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f   rule in the glo
2960: 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a  bal list */.};..
2970: 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72 61 74 69  /* A configurati
2980: 6f 6e 20 69 73 20 61 20 70 72 6f 64 75 63 74 69  on is a producti
2990: 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68 65 20 67  on rule of the g
29a0: 72 61 6d 6d 61 72 20 74 6f 67 65 74 68 65 72 20  rammar together 
29b0: 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28  with.** a mark (
29c0: 64 6f 74 29 20 73 68 6f 77 69 6e 67 20 68 6f 77  dot) showing how
29d0: 20 6d 75 63 68 20 6f 66 20 74 68 61 74 20 72 75   much of that ru
29e0: 6c 65 20 68 61 73 20 62 65 65 6e 20 70 72 6f 63  le has been proc
29f0: 65 73 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a  essed so far..**
2a00: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   Configurations 
2a10: 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66  also contain a f
2a20: 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63 68 20  ollow-set which 
2a30: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 65 72  is a list of ter
2a40: 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73  minal.** symbols
2a50: 20 77 68 69 63 68 20 61 72 65 20 61 6c 6c 6f 77   which are allow
2a60: 65 64 20 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c  ed to immediatel
2a70: 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64  y follow the end
2a80: 20 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a   of the rule..**
2a90: 20 45 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61   Every configura
2aa0: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
2ab0: 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   as an instance 
2ac0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2ad0: 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67 73 74 61  : */.enum cfgsta
2ae0: 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c 45 54 45  tus {.  COMPLETE
2af0: 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54 45 0a 7d  ,.  INCOMPLETE.}
2b00: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
2b10: 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  {.  struct rule 
2b20: 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  *rp;         /* 
2b30: 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77 68  The rule upon wh
2b40: 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ich the configur
2b50: 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20 2a  ation is based *
2b60: 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20 20  /.  int dot;    
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b80: 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74 20  The parse point 
2b90: 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b 20  */.  char *fws; 
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bb0: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 20   Follow-set for 
2bc0: 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  this configurati
2bd0: 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  on only */.  str
2be0: 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b  uct plink *fplp;
2bf0: 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d        /* Follow-
2c00: 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f 70  set forward prop
2c10: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f  agation links */
2c20: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
2c30: 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46  *bplp;      /* F
2c40: 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77 61  ollow-set backwa
2c50: 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  rds propagation 
2c60: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63  links */.  struc
2c70: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20  t state *stp;   
2c80: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2c90: 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63 6f  o state which co
2ca0: 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a 20  ntains this */. 
2cb0: 20 65 6e 75 6d 20 63 66 67 73 74 61 74 75 73 20   enum cfgstatus 
2cc0: 73 74 61 74 75 73 3b 20 20 20 2f 2a 20 75 73 65  status;   /* use
2cd0: 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f 77 73  d during follows
2ce0: 65 74 20 61 6e 64 20 73 68 69 66 74 20 63 6f 6d  et and shift com
2cf0: 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  putations */.  s
2d00: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
2d10: 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  xt;     /* Next 
2d20: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e  configuration in
2d30: 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a 20 20   the state */.  
2d40: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
2d50: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
2d60: 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e 66 69  next basis confi
2d70: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a  guration */.};..
2d80: 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 7b 0a  enum e_action {.
2d90: 20 20 53 48 49 46 54 2c 0a 20 20 41 43 43 45 50    SHIFT,.  ACCEP
2da0: 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a 20 20 45  T,.  REDUCE,.  E
2db0: 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e 46 4c 49  RROR,.  SSCONFLI
2dc0: 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CT,             
2dd0: 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68 69 66   /* A shift/shif
2de0: 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  t conflict */.  
2df0: 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20  SRCONFLICT,     
2e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20           /* Was 
2e10: 61 20 72 65 64 75 63 65 2c 20 62 75 74 20 70 61  a reduce, but pa
2e20: 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63 74  rt of a conflict
2e30: 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c 49 43 54   */.  RRCONFLICT
2e40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2e50: 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c 20  * Was a reduce, 
2e60: 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  but part of a co
2e70: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 48 5f 52  nflict */.  SH_R
2e80: 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20  ESOLVED,        
2e90: 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 73 68       /* Was a sh
2ea0: 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e 63 65  ift.  Precedence
2eb0: 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69   resolved confli
2ec0: 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45 53 4f 4c  ct */.  RD_RESOL
2ed0: 56 45 44 2c 20 20 20 20 20 20 20 20 20 20 20 20  VED,            
2ee0: 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65 2e 20   /* Was reduce. 
2ef0: 20 50 72 65 63 65 64 65 6e 63 65 20 72 65 73 6f   Precedence reso
2f00: 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  lved conflict */
2f10: 0a 20 20 4e 4f 54 5f 55 53 45 44 2c 20 20 20 20  .  NOT_USED,    
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2f30: 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70 72 65  eleted by compre
2f40: 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 48 49 46 54  ssion */.  SHIFT
2f50: 52 45 44 55 43 45 20 20 20 20 20 20 20 20 20 20  REDUCE          
2f60: 20 20 20 20 2f 2a 20 53 68 69 66 74 20 66 69 72      /* Shift fir
2f70: 73 74 2c 20 74 68 65 6e 20 72 65 64 75 63 65 20  st, then reduce 
2f80: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79 20  */.};../* Every 
2f90: 73 68 69 66 74 20 6f 72 20 72 65 64 75 63 65 20  shift or reduce 
2fa0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 74 6f  operation is sto
2fb0: 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20 74 68  red as one of th
2fc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
2fd0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a 20  truct action {. 
2fe0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
2ff0: 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  sp;       /* The
3000: 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d 62   look-ahead symb
3010: 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61  ol */.  enum e_a
3020: 63 74 69 6f 6e 20 74 79 70 65 3b 0a 20 20 75 6e  ction type;.  un
3030: 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75 63 74  ion {.    struct
3040: 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 20   state *stp;    
3050: 20 2f 2a 20 54 68 65 20 6e 65 77 20 73 74 61 74   /* The new stat
3060: 65 2c 20 69 66 20 61 20 73 68 69 66 74 20 2a 2f  e, if a shift */
3070: 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65  .    struct rule
3080: 20 2a 72 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *rp;       /* T
3090: 68 65 20 72 75 6c 65 2c 20 69 66 20 61 20 72 65  he rule, if a re
30a0: 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a 20  duce */.  } x;. 
30b0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
30c0: 73 70 4f 70 74 3b 20 20 20 20 2f 2a 20 53 48 49  spOpt;    /* SHI
30d0: 46 54 52 45 44 55 43 45 20 6f 70 74 69 6d 69 7a  FTREDUCE optimiz
30e0: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 73 79  ation to this sy
30f0: 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75 63 74  mbol */.  struct
3100: 20 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20   action *next;  
3110: 20 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f     /* Next actio
3120: 6e 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  n for this state
3130: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74   */.  struct act
3140: 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f  ion *collide;  /
3150: 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69  * Next action wi
3160: 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
3170: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20   */.};../* Each 
3180: 73 74 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e  state of the gen
3190: 65 72 61 74 65 64 20 70 61 72 73 65 72 27 73 20  erated parser's 
31a0: 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63  finite state mac
31b0: 68 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64  hine.** is encod
31c0: 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63  ed as an instanc
31d0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
31e0: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ng structure. */
31f0: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a  .struct state {.
3200: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
3210: 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *bp;       /* Th
3220: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
3230: 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20  ations for this 
3240: 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  state */.  struc
3250: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20  t config *cfp;  
3260: 20 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69      /* All confi
3270: 67 75 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  gurations in thi
3280: 73 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73  s set */.  int s
3290: 74 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20  tatenum;        
32a0: 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 74 69 61      /* Sequentia
32b0: 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  l number for thi
32c0: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  s state */.  str
32d0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20  uct action *ap; 
32e0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
32f0: 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69   actions for thi
3300: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  s state */.  int
3310: 20 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63 74   nTknAct, nNtAct
3320: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
3330: 6f 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74 65  of actions on te
3340: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74  rminals and nont
3350: 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e  erminals */.  in
3360: 74 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74 4f  t iTknOfst, iNtO
3370: 66 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63 74  fst;   /* yy_act
3380: 69 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f 72  ion[] offset for
3390: 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e   terminals and n
33a0: 6f 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  onterms */.  int
33b0: 20 69 44 66 6c 74 52 65 64 75 63 65 3b 20 20 20   iDfltReduce;   
33c0: 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74        /* Default
33d0: 20 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 52 45   action is to RE
33e0: 44 55 43 45 20 62 79 20 74 68 69 73 20 72 75 6c  DUCE by this rul
33f0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  e */.  struct ru
3400: 6c 65 20 2a 70 44 66 6c 74 52 65 64 75 63 65 3b  le *pDfltReduce;
3410: 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 52  /* The default R
3420: 45 44 55 43 45 20 72 75 6c 65 2e 20 2a 2f 0a 20  EDUCE rule. */. 
3430: 20 69 6e 74 20 61 75 74 6f 52 65 64 75 63 65 3b   int autoReduce;
3440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3450: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
3460: 61 75 74 6f 2d 72 65 64 75 63 65 20 73 74 61 74  auto-reduce stat
3470: 65 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20  e */.};.#define 
3480: 4e 4f 5f 4f 46 46 53 45 54 20 28 2d 32 31 34 37  NO_OFFSET (-2147
3490: 34 38 33 36 34 37 29 0a 0a 2f 2a 20 41 20 66 6f  483647)../* A fo
34a0: 6c 6c 6f 77 73 65 74 20 70 72 6f 70 61 67 61 74  llowset propagat
34b0: 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64 69 63 61 74  ion link indicat
34c0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
34d0: 65 6e 74 73 20 6f 66 20 6f 6e 65 0a 2a 2a 20 63  ents of one.** c
34e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f 6c  onfiguration fol
34f0: 6c 6f 77 73 65 74 20 73 68 6f 75 6c 64 20 62 65  lowset should be
3500: 20 70 72 6f 70 61 67 61 74 65 64 20 74 6f 20 61   propagated to a
3510: 6e 6f 74 68 65 72 20 77 68 65 6e 65 76 65 72 0a  nother whenever.
3520: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 68 61  ** the first cha
3530: 6e 67 65 73 2e 20 2a 2f 0a 73 74 72 75 63 74 20  nges. */.struct 
3540: 70 6c 69 6e 6b 20 7b 0a 20 20 73 74 72 75 63 74  plink {.  struct
3550: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 20   config *cfp;   
3560: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67     /* The config
3570: 75 72 61 74 69 6f 6e 20 74 6f 20 77 68 69 63 68  uration to which
3580: 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20 20 73 74 72   linked */.  str
3590: 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 3b  uct plink *next;
35a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
35b0: 74 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e 6b  t propagate link
35c0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20 73   */.};../* The s
35d0: 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f 72 20  tate vector for 
35e0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 73 65  the entire parse
35f0: 72 20 67 65 6e 65 72 61 74 6f 72 20 69 73 20 72  r generator is r
3600: 65 63 6f 72 64 65 64 20 61 73 0a 2a 2a 20 66 6f  ecorded as.** fo
3610: 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d 4f 4e 20 75  llows.  (LEMON u
3620: 73 65 73 20 6e 6f 20 67 6c 6f 62 61 6c 20 76 61  ses no global va
3630: 72 69 61 62 6c 65 73 20 61 6e 64 20 6d 61 6b 65  riables and make
3640: 73 20 6c 69 74 74 6c 65 20 75 73 65 20 6f 66 0a  s little use of.
3650: 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69 61 62  ** static variab
3660: 6c 65 73 2e 20 20 46 69 65 6c 64 73 20 69 6e 20  les.  Fields in 
3670: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
3680: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 74  ructure can be t
3690: 68 6f 75 67 68 74 0a 2a 2a 20 6f 66 20 61 73 20  hought.** of as 
36a0: 62 65 67 69 6e 20 67 6c 6f 62 61 6c 20 76 61 72  begin global var
36b0: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 72  iables in the pr
36c0: 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73 74 72 75 63  ogram.) */.struc
36d0: 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20 73 74 72 75  t lemon {.  stru
36e0: 63 74 20 73 74 61 74 65 20 2a 2a 73 6f 72 74 65  ct state **sorte
36f0: 64 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 66  d;   /* Table of
3700: 20 73 74 61 74 65 73 20 73 6f 72 74 65 64 20 62   states sorted b
3710: 79 20 73 74 61 74 65 20 6e 75 6d 62 65 72 20 2a  y state number *
3720: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
3730: 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  *rule;       /* 
3740: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 72 75 6c 65  List of all rule
3750: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  s */.  struct ru
3760: 6c 65 20 2a 73 74 61 72 74 52 75 6c 65 3b 20 20  le *startRule;  
3770: 2f 2a 20 46 69 72 73 74 20 72 75 6c 65 20 2a 2f  /* First rule */
3780: 0a 20 20 69 6e 74 20 6e 73 74 61 74 65 3b 20 20  .  int nstate;  
3790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37a0: 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 73 20  umber of states 
37b0: 2a 2f 0a 20 20 69 6e 74 20 6e 78 73 74 61 74 65  */.  int nxstate
37c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
37d0: 20 6e 73 74 61 74 65 20 77 69 74 68 20 74 61 69   nstate with tai
37e0: 6c 20 64 65 67 65 6e 65 72 61 74 65 20 73 74 61  l degenerate sta
37f0: 74 65 73 20 72 65 6d 6f 76 65 64 20 2a 2f 0a 20  tes removed */. 
3800: 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20 20   int nrule;     
3810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3820: 62 65 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a  ber of rules */.
3830: 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20    int nsymbol;  
3840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3850: 6d 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c  mber of terminal
3860: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
3870: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e   symbols */.  in
3880: 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20  t nterminal;    
3890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
38a0: 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d   of terminal sym
38b0: 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 69  bols */.  int mi
38c0: 6e 53 68 69 66 74 52 65 64 75 63 65 3b 20 20 20  nShiftReduce;   
38d0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 73 68     /* Minimum sh
38e0: 69 66 74 2d 72 65 64 75 63 65 20 61 63 74 69 6f  ift-reduce actio
38f0: 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  n value */.  int
3900: 20 65 72 72 41 63 74 69 6f 6e 3b 20 20 20 20 20   errAction;     
3910: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 61        /* Error a
3920: 63 74 69 6f 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  ction value */. 
3930: 20 69 6e 74 20 61 63 63 41 63 74 69 6f 6e 3b 20   int accAction; 
3940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63            /* Acc
3950: 65 70 74 20 61 63 74 69 6f 6e 20 76 61 6c 75 65  ept action value
3960: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 41 63 74 69   */.  int noActi
3970: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  on;            /
3980: 2a 20 4e 6f 2d 6f 70 20 61 63 74 69 6f 6e 20 76  * No-op action v
3990: 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 69  alue */.  int mi
39a0: 6e 52 65 64 75 63 65 3b 20 20 20 20 20 20 20 20  nReduce;        
39b0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65     /* Minimum re
39c0: 64 75 63 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  duce action */. 
39d0: 20 69 6e 74 20 6d 61 78 41 63 74 69 6f 6e 3b 20   int maxAction; 
39e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
39f0: 69 6d 75 6d 20 61 63 74 69 6f 6e 20 76 61 6c 75  imum action valu
3a00: 65 20 6f 66 20 61 6e 79 20 6b 69 6e 64 20 2a 2f  e of any kind */
3a10: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
3a20: 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20 2f 2a 20 53   **symbols; /* S
3a30: 6f 72 74 65 64 20 61 72 72 61 79 20 6f 66 20 70  orted array of p
3a40: 6f 69 6e 74 65 72 73 20 74 6f 20 73 79 6d 62 6f  ointers to symbo
3a50: 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f  ls */.  int erro
3a60: 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rcnt;           
3a70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
3a80: 72 6f 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  rors */.  struct
3a90: 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b   symbol *errsym;
3aa0: 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20     /* The error 
3ab0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75  symbol */.  stru
3ac0: 63 74 20 73 79 6d 62 6f 6c 20 2a 77 69 6c 64 63  ct symbol *wildc
3ad0: 61 72 64 3b 20 2f 2a 20 54 6f 6b 65 6e 20 74 68  ard; /* Token th
3ae0: 61 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68  at matches anyth
3af0: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e  ing */.  char *n
3b00: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
3b10: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3b20: 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
3b30: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67  r */.  char *arg
3b40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3b50: 2f 2a 20 44 65 63 6c 61 72 61 74 69 6f 6e 20 6f  /* Declaration o
3b60: 66 20 74 68 65 20 33 74 68 20 61 72 67 75 6d 65  f the 3th argume
3b70: 6e 74 20 74 6f 20 70 61 72 73 65 72 20 2a 2f 0a  nt to parser */.
3b80: 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 74 79 70    char *tokentyp
3b90: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79  e;         /* Ty
3ba0: 70 65 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73  pe of terminal s
3bb0: 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 70 61  ymbols in the pa
3bc0: 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20  rser stack */.  
3bd0: 63 68 61 72 20 2a 76 61 72 74 79 70 65 3b 20 20  char *vartype;  
3be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
3bf0: 64 65 66 61 75 6c 74 20 74 79 70 65 20 6f 66 20  default type of 
3c00: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 73 79 6d  non-terminal sym
3c10: 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  bols */.  char *
3c20: 73 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  start;          
3c30: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3c40: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 66  e start symbol f
3c50: 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  or the grammar *
3c60: 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 63 6b 73  /.  char *stacks
3c70: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ize;         /* 
3c80: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73  Size of the pars
3c90: 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68  er stack */.  ch
3ca0: 61 72 20 2a 69 6e 63 6c 75 64 65 3b 20 20 20 20  ar *include;    
3cb0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
3cc0: 6f 20 70 75 74 20 61 74 20 74 68 65 20 73 74 61  o put at the sta
3cd0: 72 74 20 6f 66 20 74 68 65 20 43 20 66 69 6c 65  rt of the C file
3ce0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 72 72 6f   */.  char *erro
3cf0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
3d00: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
3d10: 65 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20  e when an error 
3d20: 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 63 68 61  is seen */.  cha
3d30: 72 20 2a 6f 76 65 72 66 6c 6f 77 3b 20 20 20 20  r *overflow;    
3d40: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
3d50: 20 65 78 65 63 75 74 65 20 6f 6e 20 61 20 73 74   execute on a st
3d60: 61 63 6b 20 6f 76 65 72 66 6c 6f 77 20 2a 2f 0a  ack overflow */.
3d70: 20 20 63 68 61 72 20 2a 66 61 69 6c 75 72 65 3b    char *failure;
3d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3d90: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e  de to execute on
3da0: 20 70 61 72 73 65 72 20 66 61 69 6c 75 72 65 20   parser failure 
3db0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 63 63 65 70  */.  char *accep
3dc0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
3dd0: 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65   Code to execute
3de0: 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   when the parser
3df0: 20 65 78 63 65 70 74 73 20 2a 2f 0a 20 20 63 68   excepts */.  ch
3e00: 61 72 20 2a 65 78 74 72 61 63 6f 64 65 3b 20 20  ar *extracode;  
3e10: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 61         /* Code a
3e20: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 67  ppended to the g
3e30: 65 6e 65 72 61 74 65 64 20 66 69 6c 65 20 2a 2f  enerated file */
3e40: 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 64 65  .  char *tokende
3e50: 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  st;         /* C
3e60: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 74  ode to execute t
3e70: 6f 20 64 65 73 74 72 6f 79 20 74 6f 6b 65 6e 20  o destroy token 
3e80: 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a  data */.  char *
3e90: 76 61 72 64 65 73 74 3b 20 20 20 20 20 20 20 20  vardest;        
3ea0: 20 20 20 2f 2a 20 43 6f 64 65 20 66 6f 72 20 74     /* Code for t
3eb0: 68 65 20 64 65 66 61 75 6c 74 20 6e 6f 6e 2d 74  he default non-t
3ec0: 65 72 6d 69 6e 61 6c 20 64 65 73 74 72 75 63 74  erminal destruct
3ed0: 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69  or */.  char *fi
3ee0: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
3ef0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3f00: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
3f10: 63 68 61 72 20 2a 6f 75 74 6e 61 6d 65 3b 20 20  char *outname;  
3f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3f30: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
3f40: 6f 75 74 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20  output file */. 
3f50: 20 63 68 61 72 20 2a 74 6f 6b 65 6e 70 72 65 66   char *tokenpref
3f60: 69 78 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 70  ix;       /* A p
3f70: 72 65 66 69 78 20 61 64 64 65 64 20 74 6f 20 74  refix added to t
3f80: 6f 6b 65 6e 20 6e 61 6d 65 73 20 69 6e 20 74 68  oken names in th
3f90: 65 20 2e 68 20 66 69 6c 65 20 2a 2f 0a 20 20 69  e .h file */.  i
3fa0: 6e 74 20 6e 63 6f 6e 66 6c 69 63 74 3b 20 20 20  nt nconflict;   
3fb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3fc0: 72 20 6f 66 20 70 61 72 73 69 6e 67 20 63 6f 6e  r of parsing con
3fd0: 66 6c 69 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20  flicts */.  int 
3fe0: 6e 61 63 74 69 6f 6e 74 61 62 3b 20 20 20 20 20  nactiontab;     
3ff0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4000: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
4010: 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62   yy_action[] tab
4020: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6c 6f 6f  le */.  int nloo
4030: 6b 61 68 65 61 64 74 61 62 3b 20 20 20 20 20 20  kaheadtab;      
4040: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
4050: 74 72 69 65 73 20 69 6e 20 79 79 5f 6c 6f 6f 6b  tries in yy_look
4060: 61 68 65 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ahead[] */.  int
4070: 20 74 61 62 6c 65 73 69 7a 65 3b 20 20 20 20 20   tablesize;     
4080: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 74        /* Total t
4090: 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c  able size of all
40a0: 20 74 61 62 6c 65 73 20 69 6e 20 62 79 74 65 73   tables in bytes
40b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 69 73 66   */.  int basisf
40c0: 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f  lag;           /
40d0: 2a 20 50 72 69 6e 74 20 6f 6e 6c 79 20 62 61 73  * Print only bas
40e0: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
40f0: 73 20 2a 2f 0a 20 20 69 6e 74 20 68 61 73 5f 66  s */.  int has_f
4100: 61 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  allback;        
4110: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 25  /* True if any %
4120: 66 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 65 6e  fallback is seen
4130: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
4140: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e  */.  int nolinen
4150: 6f 73 66 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  osflag;       /*
4160: 20 54 72 75 65 20 69 66 20 23 6c 69 6e 65 20 73   True if #line s
4170: 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64  tatements should
4180: 20 6e 6f 74 20 62 65 20 70 72 69 6e 74 65 64 20   not be printed 
4190: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 76 30  */.  char *argv0
41a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
41b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
41c0: 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  gram */.};..#def
41d0: 69 6e 65 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28  ine MemoryCheck(
41e0: 58 29 20 69 66 28 28 58 29 3d 3d 30 29 7b 20 5c  X) if((X)==0){ \
41f0: 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d  .  extern void m
4200: 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c  emory_error(); \
4210: 0a 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  .  memory_error(
4220: 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ); \.}../*******
4230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
4240: 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 68  he file "table.h
4250: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
4260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4270: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63  ***/./*.** All c
4280: 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
4290: 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61   has been automa
42a0: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
42b0: 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63  d.** from a spec
42c0: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65  ification in the
42d0: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20   file.**        
42e0: 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a        "table.q".
42f0: 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69  ** by the associ
4300: 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65  ative array code
4310: 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61   building progra
4320: 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f  m "aagen"..** Do
4330: 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66   not edit this f
4340: 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65  ile!  Instead, e
4350: 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63  dit the specific
4360: 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74  ation.** file, t
4370: 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e  hen rerun aagen.
4380: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66  .*/./*.** Code f
4390: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61  or processing ta
43a0: 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  bles in the LEMO
43b0: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
43c0: 6f 72 2e 0a 2a 2f 0a 2f 2a 20 52 6f 75 74 69 6e  or..*/./* Routin
43d0: 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20  es for handling 
43e0: 61 20 73 74 72 69 6e 67 73 20 2a 2f 0a 0a 63 6f  a strings */..co
43f0: 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66  nst char *Strsaf
4400: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  e(const char *);
4410: 0a 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69  ..void Strsafe_i
4420: 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53  nit(void);.int S
4430: 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 63 6f  trsafe_insert(co
4440: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 63 6f 6e  nst char *);.con
4450: 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65  st char *Strsafe
4460: 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72  _find(const char
4470: 20 2a 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65   *);../* Routine
4480: 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 73  s for handling s
4490: 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72  ymbols of the gr
44a0: 61 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75 63 74  ammar */..struct
44b0: 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
44c0: 6e 65 77 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  new(const char *
44d0: 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70  );.int Symbolcmp
44e0: 70 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2c 20  p(const void *, 
44f0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 76  const void *);.v
4500: 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28  oid Symbol_init(
4510: 76 6f 69 64 29 3b 0a 69 6e 74 20 53 79 6d 62 6f  void);.int Symbo
4520: 6c 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20  l_insert(struct 
4530: 73 79 6d 62 6f 6c 20 2a 2c 20 63 6f 6e 73 74 20  symbol *, const 
4540: 63 68 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20  char *);.struct 
4550: 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66  symbol *Symbol_f
4560: 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ind(const char *
4570: 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  );.struct symbol
4580: 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74   *Symbol_Nth(int
4590: 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f  );.int Symbol_co
45a0: 75 6e 74 28 76 6f 69 64 29 3b 0a 73 74 72 75 63  unt(void);.struc
45b0: 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f  t symbol **Symbo
45c0: 6c 5f 61 72 72 61 79 6f 66 28 76 6f 69 64 29 3b  l_arrayof(void);
45d0: 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  ../* Routines to
45e0: 20 6d 61 6e 61 67 65 20 74 68 65 20 73 74 61 74   manage the stat
45f0: 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e 74 20  e table */..int 
4600: 43 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73 74 20  Configcmp(const 
4610: 63 68 61 72 20 2a 2c 20 63 6f 6e 73 74 20 63 68  char *, const ch
4620: 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74  ar *);.struct st
4630: 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 76  ate *State_new(v
4640: 6f 69 64 29 3b 0a 76 6f 69 64 20 53 74 61 74 65  oid);.void State
4650: 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74  _init(void);.int
4660: 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74   State_insert(st
4670: 72 75 63 74 20 73 74 61 74 65 20 2a 2c 20 73 74  ruct state *, st
4680: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a  ruct config *);.
4690: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74  struct state *St
46a0: 61 74 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20  ate_find(struct 
46b0: 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75 63  config *);.struc
46c0: 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f  t state **State_
46d0: 61 72 72 61 79 6f 66 28 76 6f 69 64 29 3b 0a 0a  arrayof(void);..
46e0: 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64  /* Routines used
46f0: 20 66 6f 72 20 65 66 66 69 63 69 65 6e 63 79 20   for efficiency 
4700: 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  in Configlist_ad
4710: 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69  d */..void Confi
4720: 67 74 61 62 6c 65 5f 69 6e 69 74 28 76 6f 69 64  gtable_init(void
4730: 29 3b 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62  );.int Configtab
4740: 6c 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74  le_insert(struct
4750: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75   config *);.stru
4760: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
4770: 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74 72 75  gtable_find(stru
4780: 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f  ct config *);.vo
4790: 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63  id Configtable_c
47a0: 6c 65 61 72 28 69 6e 74 28 2a 29 28 73 74 72 75  lear(int(*)(stru
47b0: 63 74 20 63 6f 6e 66 69 67 20 2a 29 29 3b 0a 0a  ct config *));..
47c0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
47d0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
47e0: 65 20 22 61 63 74 69 6f 6e 2e 63 22 20 2a 2a 2a  e "action.c" ***
47f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
4810: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f  .** Routines pro
4820: 63 65 73 73 69 6e 67 20 70 61 72 73 65 72 20 61  cessing parser a
4830: 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 45  ctions in the LE
4840: 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
4850: 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 41 6c 6c  ator..*/../* All
4860: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 72 73  ocate a new pars
4870: 65 72 20 61 63 74 69 6f 6e 20 2a 2f 0a 73 74 61  er action */.sta
4880: 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f  tic struct actio
4890: 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77 28 76 6f  n *Action_new(vo
48a0: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74  id){.  static st
48b0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 66 72 65  ruct action *fre
48c0: 65 6c 69 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  elist = 0;.  str
48d0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 61  uct action *newa
48e0: 63 74 69 6f 6e 3b 0a 0a 20 20 69 66 28 20 66 72  ction;..  if( fr
48f0: 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
4900: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
4910: 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 66  amt = 100;.    f
4920: 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63  reelist = (struc
4930: 74 20 61 63 74 69 6f 6e 20 2a 29 63 61 6c 6c 6f  t action *)callo
4940: 63 28 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74  c(amt, sizeof(st
4950: 72 75 63 74 20 61 63 74 69 6f 6e 29 29 3b 0a 20  ruct action));. 
4960: 20 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d     if( freelist=
4970: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
4980: 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62  ntf(stderr,"Unab
4990: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
49a0: 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20  emory for a new 
49b0: 70 61 72 73 65 72 20 61 63 74 69 6f 6e 2e 22 29  parser action.")
49c0: 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
49d0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
49e0: 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b  =0; i<amt-1; i++
49f0: 29 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65  ) freelist[i].ne
4a00: 78 74 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69  xt = &freelist[i
4a10: 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  +1];.    freelis
4a20: 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20  t[amt-1].next = 
4a30: 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 61 63 74 69  0;.  }.  newacti
4a40: 6f 6e 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20  on = freelist;. 
4a50: 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65 65   freelist = free
4a60: 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65  list->next;.  re
4a70: 74 75 72 6e 20 6e 65 77 61 63 74 69 6f 6e 3b 0a  turn newaction;.
4a80: 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77  }../* Compare tw
4a90: 6f 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 73 6f  o actions for so
4aa0: 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  rting purposes. 
4ab0: 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
4ac0: 2c 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20 70 6f  , zero, or.** po
4ad0: 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
4ae0: 72 73 74 20 61 63 74 69 6f 6e 20 69 73 20 6c 65  rst action is le
4af0: 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
4b00: 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
4b10: 61 6e 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 0a  an.** the first.
4b20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
4b30: 74 69 6f 6e 63 6d 70 28 0a 20 20 73 74 72 75 63  tioncmp(.  struc
4b40: 74 20 61 63 74 69 6f 6e 20 2a 61 70 31 2c 0a 20  t action *ap1,. 
4b50: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
4b60: 61 70 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ap2.){.  int rc;
4b70: 0a 20 20 72 63 20 3d 20 61 70 31 2d 3e 73 70 2d  .  rc = ap1->sp-
4b80: 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e 73 70  >index - ap2->sp
4b90: 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 72  ->index;.  if( r
4ba0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==0 ){.    rc =
4bb0: 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70 65 20   (int)ap1->type 
4bc0: 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79 70 65  - (int)ap2->type
4bd0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
4be0: 30 20 26 26 20 28 61 70 31 2d 3e 74 79 70 65 3d  0 && (ap1->type=
4bf0: 3d 52 45 44 55 43 45 20 7c 7c 20 61 70 31 2d 3e  =REDUCE || ap1->
4c00: 74 79 70 65 3d 3d 53 48 49 46 54 52 45 44 55 43  type==SHIFTREDUC
4c10: 45 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61  E) ){.    rc = a
4c20: 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20  p1->x.rp->index 
4c30: 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64  - ap2->x.rp->ind
4c40: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ex;.  }.  if( rc
4c50: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
4c60: 28 69 6e 74 29 20 28 61 70 32 20 2d 20 61 70 31  (int) (ap2 - ap1
4c70: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4c80: 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 70  rc;.}../* Sort p
4c90: 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20 2a 2f  arser actions */
4ca0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
4cb0: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f  ction *Action_so
4cc0: 72 74 28 0a 20 20 73 74 72 75 63 74 20 61 63 74  rt(.  struct act
4cd0: 69 6f 6e 20 2a 61 70 0a 29 7b 0a 20 20 61 70 20  ion *ap.){.  ap 
4ce0: 3d 20 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  = (struct action
4cf0: 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a   *)msort((char *
4d00: 29 61 70 2c 28 63 68 61 72 20 2a 2a 29 26 61 70  )ap,(char **)&ap
4d10: 2d 3e 6e 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ->next,.        
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 20 20 20 20 20 20 28 69 6e 74 28 2a 29 28 63 6f        (int(*)(co
4d40: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
4d50: 63 68 61 72 2a 29 29 61 63 74 69 6f 6e 63 6d 70  char*))actioncmp
4d60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 70 3b 0a  );.  return ap;.
4d70: 7d 0a 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61  }..void Action_a
4d80: 64 64 28 0a 20 20 73 74 72 75 63 74 20 61 63 74  dd(.  struct act
4d90: 69 6f 6e 20 2a 2a 61 70 70 2c 0a 20 20 65 6e 75  ion **app,.  enu
4da0: 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79 70 65 2c  m e_action type,
4db0: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
4dc0: 20 2a 73 70 2c 0a 20 20 63 68 61 72 20 2a 61 72   *sp,.  char *ar
4dd0: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 61 63  g.){.  struct ac
4de0: 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f 6e 3b  tion *newaction;
4df0: 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d 20 41  .  newaction = A
4e00: 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a 20 20 6e  ction_new();.  n
4e10: 65 77 61 63 74 69 6f 6e 2d 3e 6e 65 78 74 20 3d  ewaction->next =
4e20: 20 2a 61 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20   *app;.  *app = 
4e30: 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e 65 77  newaction;.  new
4e40: 61 63 74 69 6f 6e 2d 3e 74 79 70 65 20 3d 20 74  action->type = t
4e50: 79 70 65 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e  ype;.  newaction
4e60: 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 6e 65 77  ->sp = sp;.  new
4e70: 61 63 74 69 6f 6e 2d 3e 73 70 4f 70 74 20 3d 20  action->spOpt = 
4e80: 30 3b 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53  0;.  if( type==S
4e90: 48 49 46 54 20 29 7b 0a 20 20 20 20 6e 65 77 61  HIFT ){.    newa
4ea0: 63 74 69 6f 6e 2d 3e 78 2e 73 74 70 20 3d 20 28  ction->x.stp = (
4eb0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 61  struct state *)a
4ec0: 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rg;.  }else{.   
4ed0: 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78 2e 72 70   newaction->x.rp
4ee0: 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65 20   = (struct rule 
4ef0: 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a  *)arg;.  }.}./**
4f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f10: 2a 2a 2a 2a 20 4e 65 77 20 63 6f 64 65 20 74 6f  **** New code to
4f20: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 22   implement the "
4f30: 61 63 74 74 61 62 22 20 6d 6f 64 75 6c 65 20 2a  acttab" module *
4f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
4f50: 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 6d  * This module im
4f60: 70 6c 65 6d 65 6e 74 73 20 72 6f 75 74 69 6e 65  plements routine
4f70: 73 20 75 73 65 20 74 6f 20 63 6f 6e 73 74 72 75  s use to constru
4f80: 63 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  ct the yy_action
4f90: 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  [] table..*/../*
4fa0: 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66  .** The state of
4fb0: 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74   the yy_action t
4fc0: 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  able under const
4fd0: 72 75 63 74 69 6f 6e 20 69 73 20 61 6e 20 69 6e  ruction is an in
4fe0: 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65  stance of.** the
4ff0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
5000: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ture..**.** The 
5010: 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  yy_action table 
5020: 6d 61 70 73 20 74 68 65 20 70 61 69 72 20 28 73  maps the pair (s
5030: 74 61 74 65 5f 6e 75 6d 62 65 72 2c 20 6c 6f 6f  tate_number, loo
5040: 6b 61 68 65 61 64 29 20 69 6e 74 6f 20 61 6e 0a  kahead) into an.
5050: 2a 2a 20 61 63 74 69 6f 6e 5f 6e 75 6d 62 65 72  ** action_number
5060: 2e 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  .  The table is 
5070: 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65  an array of inte
5080: 67 65 72 73 20 70 61 69 72 73 2e 20 20 54 68 65  gers pairs.  The
5090: 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 0a 2a 2a   state_number.**
50a0: 20 64 65 74 65 72 6d 69 6e 65 73 20 61 6e 20 69   determines an i
50b0: 6e 69 74 69 61 6c 20 6f 66 66 73 65 74 20 69 6e  nitial offset in
50c0: 74 6f 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  to the yy_action
50d0: 20 61 72 72 61 79 2e 20 20 54 68 65 20 6c 6f 6f   array.  The loo
50e0: 6b 61 68 65 61 64 0a 2a 2a 20 76 61 6c 75 65 20  kahead.** value 
50f0: 69 73 20 74 68 65 6e 20 61 64 64 65 64 20 74 6f  is then added to
5100: 20 74 68 69 73 20 69 6e 69 74 69 61 6c 20 6f 66   this initial of
5110: 66 73 65 74 20 74 6f 20 67 65 74 20 61 6e 20 69  fset to get an i
5120: 6e 64 65 78 20 58 20 69 6e 74 6f 20 74 68 65 0a  ndex X into the.
5130: 2a 2a 20 79 79 5f 61 63 74 69 6f 6e 20 61 72 72  ** yy_action arr
5140: 61 79 2e 20 49 66 20 74 68 65 20 61 41 63 74 69  ay. If the aActi
5150: 6f 6e 5b 58 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  on[X].lookahead 
5160: 65 71 75 61 6c 73 20 74 68 65 20 76 61 6c 75 65  equals the value
5170: 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 66 20 74 68   of the.** of th
5180: 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e 70 75  e lookahead inpu
5190: 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  t, then the valu
51a0: 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 5f  e of the action_
51b0: 6e 75 6d 62 65 72 20 6f 75 74 70 75 74 20 69 73  number output is
51c0: 0a 2a 2a 20 61 41 63 74 69 6f 6e 5b 58 5d 2e 61  .** aAction[X].a
51d0: 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 6c  ction.  If the l
51e0: 6f 6f 6b 61 68 65 61 64 73 20 64 6f 20 6e 6f 74  ookaheads do not
51f0: 20 6d 61 74 63 68 20 74 68 65 6e 20 74 68 65 0a   match then the.
5200: 2a 2a 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f  ** default actio
5210: 6e 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 5f  n for the state_
5220: 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75 72 6e  number is return
5230: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 61 63  ed..**.** All ac
5240: 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
5250: 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 73   with a single s
5260: 74 61 74 65 5f 6e 75 6d 62 65 72 20 61 72 65 20  tate_number are 
5270: 66 69 72 73 74 20 65 6e 74 65 72 65 64 0a 2a 2a  first entered.**
5280: 20 69 6e 74 6f 20 61 4c 6f 6f 6b 61 68 65 61 64   into aLookahead
5290: 5b 5d 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c  [] using multipl
52a0: 65 20 63 61 6c 6c 73 20 74 6f 20 61 63 74 74 61  e calls to actta
52b0: 62 5f 61 63 74 69 6f 6e 28 29 2e 20 20 54 68 65  b_action().  The
52c0: 6e 20 74 68 65 0a 2a 2a 20 61 63 74 69 6f 6e 73  n the.** actions
52d0: 20 66 6f 72 20 74 68 61 74 20 73 69 6e 67 6c 65   for that single
52e0: 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 61 72   state_number ar
52f0: 65 20 70 6c 61 63 65 64 20 69 6e 74 6f 20 74 68  e placed into th
5300: 65 20 61 41 63 74 69 6f 6e 5b 5d 0a 2a 2a 20 61  e aAction[].** a
5310: 72 72 61 79 20 77 69 74 68 20 61 20 73 69 6e 67  rray with a sing
5320: 6c 65 20 63 61 6c 6c 20 74 6f 20 61 63 74 74 61  le call to actta
5330: 62 5f 69 6e 73 65 72 74 28 29 2e 20 20 54 68 65  b_insert().  The
5340: 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 29   acttab_insert()
5350: 20 63 61 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 72 65   call.** also re
5360: 73 65 74 73 20 74 68 65 20 61 4c 6f 6f 6b 61 68  sets the aLookah
5370: 65 61 64 5b 5d 20 61 72 72 61 79 20 69 6e 20 70  ead[] array in p
5380: 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 74  reparation for t
5390: 68 65 20 6e 65 78 74 0a 2a 2a 20 73 74 61 74 65  he next.** state
53a0: 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 72 75   number..*/.stru
53b0: 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74  ct lookahead_act
53c0: 69 6f 6e 20 7b 0a 20 20 69 6e 74 20 6c 6f 6f 6b  ion {.  int look
53d0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
53e0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74     /* Value of t
53f0: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 74 6f 6b  he lookahead tok
5400: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 63 74 69  en */.  int acti
5410: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
5420: 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20     /* Action to 
5430: 74 61 6b 65 20 6f 6e 20 74 68 65 20 67 69 76 65  take on the give
5440: 6e 20 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 7d  n lookahead */.}
5450: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
5460: 20 61 63 74 74 61 62 20 61 63 74 74 61 62 3b 0a   acttab acttab;.
5470: 73 74 72 75 63 74 20 61 63 74 74 61 62 20 7b 0a  struct acttab {.
5480: 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20    int nAction;  
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
54a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 64  * Number of used
54b0: 20 73 6c 6f 74 73 20 69 6e 20 61 41 63 74 69 6f   slots in aActio
54c0: 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63  n[] */.  int nAc
54d0: 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20  tionAlloc;      
54e0: 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61        /* Slots a
54f0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 41 63  llocated for aAc
5500: 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 73 74 72 75  tion[] */.  stru
5510: 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74  ct lookahead_act
5520: 69 6f 6e 0a 20 20 20 20 2a 61 41 63 74 69 6f 6e  ion.    *aAction
5530: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5540: 20 20 20 2f 2a 20 54 68 65 20 79 79 5f 61 63 74     /* The yy_act
5550: 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 75 6e 64 65  ion[] table unde
5560: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
5570: 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b 61 68 65 61  /.    *aLookahea
5580: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
5590: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e 65 77   /* A single new
55a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
55b0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f 6f 6b   */.  int mnLook
55c0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
55d0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 4c     /* Minimum aL
55e0: 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61  ookahead[].looka
55f0: 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e  head */.  int mn
5600: 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Action;         
5610: 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e         /* Action
5620: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
5630: 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a   mnLookahead */.
5640: 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68 65 61    int mxLookahea
5650: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
5660: 2a 20 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f 6b 61  * Maximum aLooka
5670: 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64  head[].lookahead
5680: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61   */.  int nLooka
5690: 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  head;           
56a0: 20 20 20 2f 2a 20 55 73 65 64 20 73 6c 6f 74 73     /* Used slots
56b0: 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d   in aLookahead[]
56c0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61   */.  int nLooka
56d0: 68 65 61 64 41 6c 6c 6f 63 3b 20 20 20 20 20 20  headAlloc;      
56e0: 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f     /* Slots allo
56f0: 63 61 74 65 64 20 69 6e 20 61 4c 6f 6f 6b 61 68  cated in aLookah
5700: 65 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ead[] */.  int n
5710: 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20 20  terminal;       
5720: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5730: 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79  r of terminal sy
5740: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  mbols */.  int n
5750: 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20 20 20 20  symbol;         
5760: 20 20 20 20 20 20 20 20 2f 2a 20 74 6f 74 61 6c          /* total
5770: 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6d 62 6f   number of symbo
5780: 6c 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65 74  ls */.};../* Ret
5790: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
57a0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
57b0: 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65   yy_action table
57c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74   */.#define actt
57d0: 61 62 5f 6c 6f 6f 6b 61 68 65 61 64 5f 73 69 7a  ab_lookahead_siz
57e0: 65 28 58 29 20 28 28 58 29 2d 3e 6e 41 63 74 69  e(X) ((X)->nActi
57f0: 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75  on)../* The valu
5800: 65 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 65  e for the N-th e
5810: 6e 74 72 79 20 69 6e 20 79 79 5f 61 63 74 69 6f  ntry in yy_actio
5820: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74  n */.#define act
5830: 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 58 2c 4e  tab_yyaction(X,N
5840: 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e  )  ((X)->aAction
5850: 5b 4e 5d 2e 61 63 74 69 6f 6e 29 0a 0a 2f 2a 20  [N].action)../* 
5860: 54 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  The value for th
5870: 65 20 4e 2d 74 68 20 65 6e 74 72 79 20 69 6e 20  e N-th entry in 
5880: 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a  yy_lookahead */.
5890: 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79  #define acttab_y
58a0: 79 6c 6f 6f 6b 61 68 65 61 64 28 58 2c 4e 29 20  ylookahead(X,N) 
58b0: 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e   ((X)->aAction[N
58c0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 29 0a 0a 2f 2a  ].lookahead)../*
58d0: 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
58e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
58f0: 20 74 68 65 20 67 69 76 65 6e 20 61 63 74 74 61   the given actta
5900: 62 20 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62  b */.void acttab
5910: 5f 66 72 65 65 28 61 63 74 74 61 62 20 2a 70 29  _free(acttab *p)
5920: 7b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 41 63  {.  free( p->aAc
5930: 74 69 6f 6e 20 29 3b 0a 20 20 66 72 65 65 28 20  tion );.  free( 
5940: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 29 3b  p->aLookahead );
5950: 0a 20 20 66 72 65 65 28 20 70 20 29 3b 0a 7d 0a  .  free( p );.}.
5960: 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
5970: 65 77 20 61 63 74 74 61 62 20 73 74 72 75 63 74  ew acttab struct
5980: 75 72 65 20 2a 2f 0a 61 63 74 74 61 62 20 2a 61  ure */.acttab *a
5990: 63 74 74 61 62 5f 61 6c 6c 6f 63 28 69 6e 74 20  cttab_alloc(int 
59a0: 6e 73 79 6d 62 6f 6c 2c 20 69 6e 74 20 6e 74 65  nsymbol, int nte
59b0: 72 6d 69 6e 61 6c 29 7b 0a 20 20 61 63 74 74 61  rminal){.  actta
59c0: 62 20 2a 70 20 3d 20 28 61 63 74 74 61 62 20 2a  b *p = (acttab *
59d0: 29 20 63 61 6c 6c 6f 63 28 20 31 2c 20 73 69 7a  ) calloc( 1, siz
59e0: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
59f0: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72   p==0 ){.    fpr
5a00: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61  intf(stderr,"Una
5a10: 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
5a20: 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77  memory for a new
5a30: 20 61 63 74 74 61 62 2e 22 29 3b 0a 20 20 20 20   acttab.");.    
5a40: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d  exit(1);.  }.  m
5a50: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
5a60: 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d 3e 6e 73  of(*p));.  p->ns
5a70: 79 6d 62 6f 6c 20 3d 20 6e 73 79 6d 62 6f 6c 3b  ymbol = nsymbol;
5a80: 0a 20 20 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  .  p->nterminal 
5a90: 3d 20 6e 74 65 72 6d 69 6e 61 6c 3b 0a 20 20 72  = nterminal;.  r
5aa0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 20 41  eturn p;.}../* A
5ab0: 64 64 20 61 20 6e 65 77 20 61 63 74 69 6f 6e 20  dd a new action 
5ac0: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  to the current t
5ad0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 0a  ransaction set..
5ae0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5af0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
5b00: 65 20 66 6f 72 20 65 61 63 68 20 6c 6f 6f 6b 61  e for each looka
5b10: 68 65 61 64 20 66 6f 72 20 61 20 70 61 72 74 69  head for a parti
5b20: 63 75 6c 61 72 0a 2a 2a 20 73 74 61 74 65 2e 0a  cular.** state..
5b30: 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 61  */.void acttab_a
5b40: 63 74 69 6f 6e 28 61 63 74 74 61 62 20 2a 70 2c  ction(acttab *p,
5b50: 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 2c 20   int lookahead, 
5b60: 69 6e 74 20 61 63 74 69 6f 6e 29 7b 0a 20 20 69  int action){.  i
5b70: 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  f( p->nLookahead
5b80: 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41  >=p->nLookaheadA
5b90: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
5ba0: 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 2b  LookaheadAlloc +
5bb0: 3d 20 32 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 6f  = 25;.    p->aLo
5bc0: 6f 6b 61 68 65 61 64 20 3d 20 28 73 74 72 75 63  okahead = (struc
5bd0: 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74 69  t lookahead_acti
5be0: 6f 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28 20 70  on *) realloc( p
5bf0: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 2c 0a 20 20  ->aLookahead,.  
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
5c20: 66 28 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  f(p->aLookahead[
5c30: 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  0])*p->nLookahea
5c40: 64 41 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 69 66  dAlloc );.    if
5c50: 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 3d  ( p->aLookahead=
5c60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
5c70: 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c  ntf(stderr,"mall
5c80: 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20  oc failed\n");. 
5c90: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
5ca0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
5cb0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29  >nLookahead==0 )
5cc0: 7b 0a 20 20 20 20 70 2d 3e 6d 78 4c 6f 6f 6b 61  {.    p->mxLooka
5cd0: 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64  head = lookahead
5ce0: 3b 0a 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61  ;.    p->mnLooka
5cf0: 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64  head = lookahead
5d00: 3b 0a 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f  ;.    p->mnActio
5d10: 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 7d 65  n = action;.  }e
5d20: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  lse{.    if( p->
5d30: 6d 78 4c 6f 6f 6b 61 68 65 61 64 3c 6c 6f 6f 6b  mxLookahead<look
5d40: 61 68 65 61 64 20 29 20 70 2d 3e 6d 78 4c 6f 6f  ahead ) p->mxLoo
5d50: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
5d60: 61 64 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d  ad;.    if( p->m
5d70: 6e 4c 6f 6f 6b 61 68 65 61 64 3e 6c 6f 6f 6b 61  nLookahead>looka
5d80: 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  head ){.      p-
5d90: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  >mnLookahead = l
5da0: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 20 20  ookahead;.      
5db0: 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63  p->mnAction = ac
5dc0: 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tion;.    }.  }.
5dd0: 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b    p->aLookahead[
5de0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 6c  p->nLookahead].l
5df0: 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61  ookahead = looka
5e00: 68 65 61 64 3b 0a 20 20 70 2d 3e 61 4c 6f 6f 6b  head;.  p->aLook
5e10: 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68  ahead[p->nLookah
5e20: 65 61 64 5d 2e 61 63 74 69 6f 6e 20 3d 20 61 63  ead].action = ac
5e30: 74 69 6f 6e 3b 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b  tion;.  p->nLook
5e40: 61 68 65 61 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  ahead++;.}../*.*
5e50: 2a 20 41 64 64 20 74 68 65 20 74 72 61 6e 73 61  * Add the transa
5e60: 63 74 69 6f 6e 20 73 65 74 20 62 75 69 6c 74 20  ction set built 
5e70: 75 70 20 77 69 74 68 20 70 72 69 6f 72 20 63 61  up with prior ca
5e80: 6c 6c 73 20 74 6f 20 61 63 74 74 61 62 5f 61 63  lls to acttab_ac
5e90: 74 69 6f 6e 28 29 0a 2a 2a 20 69 6e 74 6f 20 74  tion().** into t
5ea0: 68 65 20 63 75 72 72 65 6e 74 20 61 63 74 69 6f  he current actio
5eb0: 6e 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 72  n table.  Then r
5ec0: 65 73 65 74 20 74 68 65 20 74 72 61 6e 73 61 63  eset the transac
5ed0: 74 69 6f 6e 20 73 65 74 20 62 61 63 6b 0a 2a 2a  tion set back.**
5ee0: 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 73 65 74   to an empty set
5ef0: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20   in preparation 
5f00: 66 6f 72 20 61 20 6e 65 77 20 72 6f 75 6e 64 20  for a new round 
5f10: 6f 66 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e  of acttab_action
5f20: 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  () calls..**.** 
5f30: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
5f40: 74 20 69 6e 74 6f 20 74 68 65 20 61 63 74 69 6f  t into the actio
5f50: 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6e  n table of the n
5f60: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
5f70: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 6b  **.** If the mak
5f80: 65 49 74 53 61 66 65 20 70 61 72 61 6d 65 74 65  eItSafe paramete
5f90: 72 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  r is true, then 
5fa0: 74 68 65 20 6f 66 66 73 65 74 20 69 73 20 63 68  the offset is ch
5fb0: 6f 73 65 6e 20 73 6f 20 74 68 61 74 0a 2a 2a 20  osen so that.** 
5fc0: 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  it is impossible
5fd0: 20 74 6f 20 6f 76 65 72 72 65 61 64 20 74 68 65   to overread the
5fe0: 20 79 79 5f 6c 6f 6f 6b 61 73 69 64 65 5b 5d 20   yy_lookaside[] 
5ff0: 74 61 62 6c 65 20 72 65 67 61 72 64 6c 65 73 73  table regardless
6000: 20 6f 66 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61   of.** the looka
6010: 73 69 64 65 20 74 6f 6b 65 6e 2e 20 20 54 68 69  side token.  Thi
6020: 73 20 69 73 20 64 6f 6e 65 20 66 6f 72 20 74 68  s is done for th
6030: 65 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  e terminal symbo
6040: 6c 73 2c 20 61 73 20 74 68 65 79 0a 2a 2a 20 63  ls, as they.** c
6050: 6f 6d 65 20 66 72 6f 6d 20 65 78 74 65 72 6e 61  ome from externa
6060: 6c 20 69 6e 70 75 74 73 20 61 6e 64 20 63 61 6e  l inputs and can
6070: 20 63 6f 6e 74 61 69 6e 20 73 79 6e 74 61 78 20   contain syntax 
6080: 65 72 72 6f 72 73 2e 20 20 57 68 65 6e 20 6d 61  errors.  When ma
6090: 6b 65 49 74 53 61 66 65 0a 2a 2a 20 69 73 20 66  keItSafe.** is f
60a0: 61 6c 73 65 2c 20 74 68 65 72 65 20 69 73 20 6d  alse, there is m
60b0: 6f 72 65 20 66 6c 65 78 69 62 69 6c 69 74 79 20  ore flexibility 
60c0: 69 6e 20 73 65 6c 65 63 74 69 6e 67 20 6f 66 66  in selecting off
60d0: 73 65 74 73 2c 20 72 65 73 75 6c 74 69 6e 67 20  sets, resulting 
60e0: 69 6e 0a 2a 2a 20 61 20 73 6d 61 6c 6c 65 72 20  in.** a smaller 
60f0: 74 61 62 6c 65 2e 20 20 46 6f 72 20 6e 6f 6e 2d  table.  For non-
6100: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
6110: 2c 20 77 68 69 63 68 20 61 72 65 20 6e 65 76 65  , which are neve
6120: 72 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73 2c  r syntax errors,
6130: 0a 2a 2a 20 6d 61 6b 65 49 74 53 61 66 65 20 63  .** makeItSafe c
6140: 61 6e 20 62 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a  an be false..*/.
6150: 69 6e 74 20 61 63 74 74 61 62 5f 69 6e 73 65 72  int acttab_inser
6160: 74 28 61 63 74 74 61 62 20 2a 70 2c 20 69 6e 74  t(acttab *p, int
6170: 20 6d 61 6b 65 49 74 53 61 66 65 29 7b 0a 20 20   makeItSafe){.  
6180: 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 2c 20  int i, j, k, n, 
6190: 65 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  end;.  assert( p
61a0: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 30 20 29  ->nLookahead>0 )
61b0: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
61c0: 65 20 77 65 20 68 61 76 65 20 65 6e 6f 75 67 68  e we have enough
61d0: 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   space to hold t
61e0: 68 65 20 65 78 70 61 6e 64 65 64 20 61 63 74 69  he expanded acti
61f0: 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  on table.  ** in
6200: 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e   the worst case.
6210: 20 20 54 68 65 20 77 6f 72 73 74 20 63 61 73 65    The worst case
6220: 20 6f 63 63 75 72 73 20 69 66 20 74 68 65 20 74   occurs if the t
6230: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a 20  ransaction set. 
6240: 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 70 70 65   ** must be appe
6250: 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72  nded to the curr
6260: 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ent action table
6270: 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 70 2d 3e 6e  .  */.  n = p->n
6280: 73 79 6d 62 6f 6c 20 2b 20 31 3b 0a 20 20 69 66  symbol + 1;.  if
6290: 28 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e  ( p->nAction + n
62a0: 20 3e 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c   >= p->nActionAl
62b0: 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  loc ){.    int o
62c0: 6c 64 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63  ldAlloc = p->nAc
62d0: 74 69 6f 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 70  tionAlloc;.    p
62e0: 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 3d  ->nActionAlloc =
62f0: 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e 20   p->nAction + n 
6300: 2b 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  + p->nActionAllo
6310: 63 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 61  c + 20;.    p->a
6320: 41 63 74 69 6f 6e 20 3d 20 28 73 74 72 75 63 74  Action = (struct
6330: 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74 69 6f   lookahead_actio
6340: 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28 20 70 2d  n *) realloc( p-
6350: 3e 61 41 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20  >aAction,.      
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6370: 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 41      sizeof(p->aA
6380: 63 74 69 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63  ction[0])*p->nAc
6390: 74 69 6f 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  tionAlloc);.    
63a0: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d  if( p->aAction==
63b0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
63c0: 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f  tf(stderr,"mallo
63d0: 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20  c failed\n");.  
63e0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
63f0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6f 6c 64   }.    for(i=old
6400: 41 6c 6c 6f 63 3b 20 69 3c 70 2d 3e 6e 41 63 74  Alloc; i<p->nAct
6410: 69 6f 6e 41 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a  ionAlloc; i++){.
6420: 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e        p->aAction
6430: 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20  [i].lookahead = 
6440: 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 61 41 63  -1;.      p->aAc
6450: 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d  tion[i].action =
6460: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   -1;.    }.  }..
6470: 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 65 78    /* Scan the ex
6480: 69 73 74 69 6e 67 20 61 63 74 69 6f 6e 20 74 61  isting action ta
6490: 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ble looking for 
64a0: 61 6e 20 6f 66 66 73 65 74 20 74 68 61 74 20 69  an offset that i
64b0: 73 20 61 0a 20 20 2a 2a 20 64 75 70 6c 69 63 61  s a.  ** duplica
64c0: 74 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  te of the curren
64d0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  t transaction se
64e0: 74 2e 20 20 46 61 6c 6c 20 6f 75 74 20 6f 66 20  t.  Fall out of 
64f0: 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2a 20 69 66  the loop.  ** if
6500: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 64 75   and when the du
6510: 70 6c 69 63 61 74 65 20 69 73 20 66 6f 75 6e 64  plicate is found
6520: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 20 69 73  ..  **.  ** i is
6530: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 2d   the index in p-
6540: 3e 61 41 63 74 69 6f 6e 5b 5d 20 77 68 65 72 65  >aAction[] where
6550: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
6560: 69 73 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a  is inserted..  *
6570: 2f 0a 20 20 65 6e 64 20 3d 20 6d 61 6b 65 49 74  /.  end = makeIt
6580: 53 61 66 65 20 3f 20 70 2d 3e 6d 6e 4c 6f 6f 6b  Safe ? p->mnLook
6590: 61 68 65 61 64 20 3a 20 30 3b 0a 20 20 66 6f 72  ahead : 0;.  for
65a0: 28 69 3d 70 2d 3e 6e 41 63 74 69 6f 6e 2d 31 3b  (i=p->nAction-1;
65b0: 20 69 3e 3d 65 6e 64 3b 20 69 2d 2d 29 7b 0a 20   i>=end; i--){. 
65c0: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
65d0: 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d  n[i].lookahead==
65e0: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  p->mnLookahead )
65f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6c  {.      /* All l
6600: 6f 6f 6b 61 68 65 61 64 73 20 61 6e 64 20 61 63  ookaheads and ac
6610: 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 61 4c 6f  tions in the aLo
6620: 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61  okahead[] transa
6630: 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6d  ction.      ** m
6640: 75 73 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73  ust match agains
6650: 74 20 74 68 65 20 63 61 6e 64 69 64 61 74 65 20  t the candidate 
6660: 61 41 63 74 69 6f 6e 5b 69 5d 20 65 6e 74 72 79  aAction[i] entry
6670: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
6680: 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74  ->aAction[i].act
6690: 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63 74 69 6f 6e  ion!=p->mnAction
66a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
66b0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
66c0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b  >nLookahead; j++
66d0: 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 70  ){.        k = p
66e0: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e  ->aLookahead[j].
66f0: 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d  lookahead - p->m
6700: 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a  nLookahead + i;.
6710: 20 20 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20          if( k<0 
6720: 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e  || k>=p->nAction
6730: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
6740: 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68    if( p->aLookah
6750: 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ead[j].lookahead
6760: 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e  !=p->aAction[k].
6770: 6c 6f 6f 6b 61 68 65 61 64 20 29 20 62 72 65 61  lookahead ) brea
6780: 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
6790: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e  ->aLookahead[j].
67a0: 61 63 74 69 6f 6e 21 3d 70 2d 3e 61 41 63 74 69  action!=p->aActi
67b0: 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e 20 29 20 62  on[k].action ) b
67c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
67d0: 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f      if( j<p->nLo
67e0: 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74 69 6e  okahead ) contin
67f0: 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  ue;..      /* No
6800: 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 61 68   possible lookah
6810: 65 61 64 20 76 61 6c 75 65 20 74 68 61 74 20 69  ead value that i
6820: 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 61 4c 6f  s not in the aLo
6830: 6f 6b 61 68 65 61 64 5b 5d 0a 20 20 20 20 20 20  okahead[].      
6840: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
6850: 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74  s allowed to mat
6860: 63 68 20 61 41 63 74 69 6f 6e 5b 69 5d 20 2a 2f  ch aAction[i] */
6870: 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20  .      n = 0;.  
6880: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
6890: 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b  ->nAction; j++){
68a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
68b0: 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61  aAction[j].looka
68c0: 68 65 61 64 3c 30 20 29 20 63 6f 6e 74 69 6e 75  head<0 ) continu
68d0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
68e0: 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f  ->aAction[j].loo
68f0: 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c  kahead==j+p->mnL
6900: 6f 6f 6b 61 68 65 61 64 2d 69 20 29 20 6e 2b 2b  ookahead-i ) n++
6910: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6920: 69 66 28 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61  if( n==p->nLooka
6930: 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20  head ){.        
6940: 62 72 65 61 6b 3b 20 20 2f 2a 20 41 6e 20 65 78  break;  /* An ex
6950: 61 63 74 20 6d 61 74 63 68 20 69 73 20 66 6f 75  act match is fou
6960: 6e 64 20 61 74 20 6f 66 66 73 65 74 20 69 20 2a  nd at offset i *
6970: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
6980: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20    }..  /* If no 
6990: 65 78 69 73 74 69 6e 67 20 6f 66 66 73 65 74 73  existing offsets
69a0: 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 20 74   exactly match t
69b0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
69c0: 61 63 74 69 6f 6e 2c 20 66 69 6e 64 20 61 6e 0a  action, find an.
69d0: 20 20 2a 2a 20 61 6e 20 65 6d 70 74 79 20 6f 66    ** an empty of
69e0: 66 73 65 74 20 69 6e 20 74 68 65 20 61 41 63 74  fset in the aAct
69f0: 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 69 6e 20 77  ion[] table in w
6a00: 68 69 63 68 20 77 65 20 63 61 6e 20 61 64 64 20  hich we can add 
6a10: 74 68 65 0a 20 20 2a 2a 20 61 4c 6f 6f 6b 61 68  the.  ** aLookah
6a20: 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74 69 6f  ead[] transactio
6a30: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 3c  n..  */.  if( i<
6a40: 65 6e 64 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 6f  end ){.    /* Lo
6a50: 6f 6b 20 66 6f 72 20 68 6f 6c 65 73 20 69 6e 20  ok for holes in 
6a60: 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 74 61  the aAction[] ta
6a70: 62 6c 65 20 74 68 61 74 20 66 69 74 20 74 68 65  ble that fit the
6a80: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
6a90: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61  aLookahead[] tra
6aa0: 6e 73 61 63 74 69 6f 6e 2e 20 20 4c 65 61 76 65  nsaction.  Leave
6ab0: 20 69 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66   i set to the of
6ac0: 66 73 65 74 20 6f 66 20 74 68 65 20 68 6f 6c 65  fset of the hole
6ad0: 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 20 68  ..    ** If no h
6ae0: 6f 6c 65 73 20 61 72 65 20 66 6f 75 6e 64 2c 20  oles are found, 
6af0: 69 20 69 73 20 6c 65 66 74 20 61 74 20 70 2d 3e  i is left at p->
6b00: 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63 68 20 6d  nAction, which m
6b10: 65 61 6e 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  eans the.    ** 
6b20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
6b30: 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 2a 2f   be appended. */
6b40: 0a 20 20 20 20 69 20 3d 20 6d 61 6b 65 49 74 53  .    i = makeItS
6b50: 61 66 65 20 3f 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61  afe ? p->mnLooka
6b60: 68 65 61 64 20 3a 20 30 3b 0a 20 20 20 20 66 6f  head : 0;.    fo
6b70: 72 28 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e  r(; i<p->nAction
6b80: 41 6c 6c 6f 63 20 2d 20 70 2d 3e 6d 78 4c 6f 6f  Alloc - p->mxLoo
6b90: 6b 61 68 65 61 64 3b 20 69 2b 2b 29 7b 0a 20 20  kahead; i++){.  
6ba0: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
6bb0: 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c  on[i].lookahead<
6bc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
6bd0: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b  (j=0; j<p->nLook
6be0: 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ahead; j++){.   
6bf0: 20 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c         k = p->aL
6c00: 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b  ookahead[j].look
6c10: 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f  ahead - p->mnLoo
6c20: 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20  kahead + i;.    
6c30: 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20 29 20        if( k<0 ) 
6c40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
6c50: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
6c60: 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e 3d 30 20  k].lookahead>=0 
6c70: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
6c80: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
6c90: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  <p->nLookahead )
6ca0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6cb0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
6cc0: 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a  >nAction; j++){.
6cd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
6ce0: 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b  >aAction[j].look
6cf0: 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f  ahead==j+p->mnLo
6d00: 6f 6b 61 68 65 61 64 2d 69 20 29 20 62 72 65 61  okahead-i ) brea
6d10: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
6d20: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e       if( j==p->n
6d30: 41 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Action ){.      
6d40: 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 46      break;  /* F
6d50: 69 74 73 20 69 6e 20 65 6d 70 74 79 20 73 6c 6f  its in empty slo
6d60: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ts */.        }.
6d70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6d80: 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 72  }.  /* Insert tr
6d90: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 61 74  ansaction set at
6da0: 20 69 6e 64 65 78 20 69 2e 20 2a 2f 0a 23 69 66   index i. */.#if
6db0: 20 30 0a 20 20 70 72 69 6e 74 66 28 22 41 63 74   0.  printf("Act
6dc0: 74 61 62 3a 22 29 3b 0a 20 20 66 6f 72 28 6a 3d  tab:");.  for(j=
6dd0: 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  0; j<p->nLookahe
6de0: 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 70 72  ad; j++){.    pr
6df0: 69 6e 74 66 28 22 20 25 64 22 2c 20 70 2d 3e 61  intf(" %d", p->a
6e00: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f  Lookahead[j].loo
6e10: 6b 61 68 65 61 64 29 3b 0a 20 20 7d 0a 20 20 70  kahead);.  }.  p
6e20: 72 69 6e 74 66 28 22 20 69 6e 73 65 72 74 65 64  rintf(" inserted
6e30: 20 61 74 20 25 64 5c 6e 22 2c 20 69 29 3b 0a 23   at %d\n", i);.#
6e40: 65 6e 64 69 66 0a 20 20 66 6f 72 28 6a 3d 30 3b  endif.  for(j=0;
6e50: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
6e60: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d 20  ; j++){.    k = 
6e70: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
6e80: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
6e90: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
6ea0: 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b  .    p->aAction[
6eb0: 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65  k] = p->aLookahe
6ec0: 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b  ad[j];.    if( k
6ed0: 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 70  >=p->nAction ) p
6ee0: 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b  ->nAction = k+1;
6ef0: 0a 20 20 7d 0a 20 20 69 66 28 20 6d 61 6b 65 49  .  }.  if( makeI
6f00: 74 53 61 66 65 20 26 26 20 69 2b 70 2d 3e 6e 74  tSafe && i+p->nt
6f10: 65 72 6d 69 6e 61 6c 3e 3d 70 2d 3e 6e 41 63 74  erminal>=p->nAct
6f20: 69 6f 6e 20 29 20 70 2d 3e 6e 41 63 74 69 6f 6e  ion ) p->nAction
6f30: 20 3d 20 69 2b 70 2d 3e 6e 74 65 72 6d 69 6e 61   = i+p->ntermina
6f40: 6c 2b 31 3b 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61  l+1;.  p->nLooka
6f50: 68 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  head = 0;..  /* 
6f60: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
6f70: 74 20 74 68 61 74 20 69 73 20 61 64 64 65 64 20  t that is added 
6f80: 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  to the lookahead
6f90: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
6fa0: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
6fb0: 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 6f  into yy_action o
6fc0: 66 20 74 68 65 20 61 63 74 69 6f 6e 20 2a 2f 0a  f the action */.
6fd0: 20 20 72 65 74 75 72 6e 20 69 20 2d 20 70 2d 3e    return i - p->
6fe0: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a  mnLookahead;.}..
6ff0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7000: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63 74   size of the act
7010: 69 6f 6e 20 74 61 62 6c 65 20 77 69 74 68 6f 75  ion table withou
7020: 74 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 73  t the trailing s
7030: 79 6e 74 61 78 20 65 72 72 6f 72 0a 2a 2a 20 65  yntax error.** e
7040: 6e 74 72 69 65 73 2e 0a 2a 2f 0a 69 6e 74 20 61  ntries..*/.int a
7050: 63 74 74 61 62 5f 61 63 74 69 6f 6e 5f 73 69 7a  cttab_action_siz
7060: 65 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20  e(acttab *p){.  
7070: 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 41 63 74 69  int n = p->nActi
7080: 6f 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  on;.  while( n>0
7090: 20 26 26 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6e   && p->aAction[n
70a0: 2d 31 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20  -1].lookahead<0 
70b0: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75  ){ n--; }.  retu
70c0: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  rn n;.}../******
70d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
70e0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
70f0: 62 75 69 6c 64 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  build.c" *******
7100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7110: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
7120: 75 74 69 6e 65 73 20 74 6f 20 63 6f 6e 73 74 72  utines to constr
7130: 75 63 74 69 6f 6e 20 74 68 65 20 66 69 6e 69 74  uction the finit
7140: 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 20  e state machine 
7150: 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 0a 2a 2a  for the LEMON.**
7160: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
7170: 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61  r..*/../* Find a
7180: 20 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62   precedence symb
7190: 6f 6c 20 6f 66 20 65 76 65 72 79 20 72 75 6c 65  ol of every rule
71a0: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 2e   in the grammar.
71b0: 0a 2a 2a 0a 2a 2a 20 54 68 6f 73 65 20 72 75 6c  .**.** Those rul
71c0: 65 73 20 77 68 69 63 68 20 68 61 76 65 20 61 20  es which have a 
71d0: 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f  precedence symbo
71e0: 6c 20 63 6f 64 65 64 20 69 6e 20 74 68 65 20 69  l coded in the i
71f0: 6e 70 75 74 0a 2a 2a 20 67 72 61 6d 6d 61 72 20  nput.** grammar 
7200: 75 73 69 6e 67 20 74 68 65 20 22 5b 73 79 6d 62  using the "[symb
7210: 6f 6c 5d 22 20 63 6f 6e 73 74 72 75 63 74 20 77  ol]" construct w
7220: 69 6c 6c 20 61 6c 72 65 61 64 79 20 68 61 76 65  ill already have
7230: 20 74 68 65 0a 2a 2a 20 72 70 2d 3e 70 72 65 63   the.** rp->prec
7240: 73 79 6d 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  sym field filled
7250: 2e 20 20 4f 74 68 65 72 20 72 75 6c 65 73 20 74  .  Other rules t
7260: 61 6b 65 20 61 73 20 74 68 65 69 72 20 70 72 65  ake as their pre
7270: 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f  cedence.** symbo
7280: 6c 20 74 68 65 20 66 69 72 73 74 20 52 48 53 20  l the first RHS 
7290: 73 79 6d 62 6f 6c 20 77 69 74 68 20 61 20 64 65  symbol with a de
72a0: 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65  fined precedence
72b0: 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
72c0: 72 65 20 6e 6f 74 20 52 48 53 20 73 79 6d 62 6f  re not RHS symbo
72d0: 6c 73 20 77 69 74 68 20 61 20 64 65 66 69 6e 65  ls with a define
72e0: 64 20 70 72 65 63 65 64 65 6e 63 65 2c 20 74 68  d precedence, th
72f0: 65 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20  e precedence.** 
7300: 73 79 6d 62 6f 6c 20 66 69 65 6c 64 20 69 73 20  symbol field is 
7310: 6c 65 66 74 20 62 6c 61 6e 6b 2e 0a 2a 2f 0a 76  left blank..*/.v
7320: 6f 69 64 20 46 69 6e 64 52 75 6c 65 50 72 65 63  oid FindRulePrec
7330: 65 64 65 6e 63 65 73 28 73 74 72 75 63 74 20 6c  edences(struct l
7340: 65 6d 6f 6e 20 2a 78 70 29 0a 7b 0a 20 20 73 74  emon *xp).{.  st
7350: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
7360: 20 66 6f 72 28 72 70 3d 78 70 2d 3e 72 75 6c 65   for(rp=xp->rule
7370: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
7380: 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  t){.    if( rp->
7390: 70 72 65 63 73 79 6d 3d 3d 30 20 29 7b 0a 20 20  precsym==0 ){.  
73a0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
73b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
73c0: 70 2d 3e 6e 72 68 73 20 26 26 20 72 70 2d 3e 70  p->nrhs && rp->p
73d0: 72 65 63 73 79 6d 3d 3d 30 3b 20 69 2b 2b 29 7b  recsym==0; i++){
73e0: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
73f0: 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d  symbol *sp = rp-
7400: 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  >rhs[i];.       
7410: 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d   if( sp->type==M
7420: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
7430: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
7440: 30 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d  0; j<sp->nsubsym
7450: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
7460: 20 20 20 20 69 66 28 20 73 70 2d 3e 73 75 62 73      if( sp->subs
7470: 79 6d 5b 6a 5d 2d 3e 70 72 65 63 3e 3d 30 20 29  ym[j]->prec>=0 )
7480: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7490: 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 73 70  rp->precsym = sp
74a0: 2d 3e 73 75 62 73 79 6d 5b 6a 5d 3b 0a 20 20 20  ->subsym[j];.   
74b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
74c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
74d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
74e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
74f0: 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20  ->prec>=0 ){.   
7500: 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73         rp->precs
7510: 79 6d 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  ym = rp->rhs[i];
7520: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7530: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
7540: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e  eturn;.}../* Fin
7550: 64 20 61 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61  d all nontermina
7560: 6c 73 20 77 68 69 63 68 20 77 69 6c 6c 20 67 65  ls which will ge
7570: 6e 65 72 61 74 65 20 74 68 65 20 65 6d 70 74 79  nerate the empty
7580: 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e   string..** Then
7590: 20 67 6f 20 62 61 63 6b 20 61 6e 64 20 63 6f 6d   go back and com
75a0: 70 75 74 65 20 74 68 65 20 66 69 72 73 74 20 73  pute the first s
75b0: 65 74 73 20 6f 66 20 65 76 65 72 79 20 6e 6f 6e  ets of every non
75c0: 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65  terminal..** The
75d0: 20 66 69 72 73 74 20 73 65 74 20 69 73 20 74 68   first set is th
75e0: 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 74 65 72  e set of all ter
75f0: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 77 68  minal symbols wh
7600: 69 63 68 20 63 61 6e 20 62 65 67 69 6e 0a 2a 2a  ich can begin.**
7610: 20 61 20 73 74 72 69 6e 67 20 67 65 6e 65 72 61   a string genera
7620: 74 65 64 20 62 79 20 74 68 61 74 20 6e 6f 6e 74  ted by that nont
7630: 65 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64  erminal..*/.void
7640: 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28 73   FindFirstSets(s
7650: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
7660: 70 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  p).{.  int i, j;
7670: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
7680: 72 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65  rp;.  int progre
7690: 73 73 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ss;..  for(i=0; 
76a0: 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
76b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d   i++){.    lemp-
76c0: 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d  >symbols[i]->lam
76d0: 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53  bda = LEMON_FALS
76e0: 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6c  E;.  }.  for(i=l
76f0: 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
7700: 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
7710: 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d   i++){.    lemp-
7720: 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69 72  >symbols[i]->fir
7730: 73 74 73 65 74 20 3d 20 53 65 74 4e 65 77 28 29  stset = SetNew()
7740: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73  ;.  }..  /* Firs
7750: 74 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20 6c 61  t compute all la
7760: 6d 62 64 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20  mbdas */.  do{. 
7770: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b     progress = 0;
7780: 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  .    for(rp=lemp
7790: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
77a0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
77b0: 69 66 28 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d  if( rp->lhs->lam
77c0: 62 64 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  bda ) continue;.
77d0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
77e0: 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
77f0: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
7800: 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d  symbol *sp = rp-
7810: 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  >rhs[i];.       
7820: 20 61 73 73 65 72 74 28 20 73 70 2d 3e 74 79 70   assert( sp->typ
7830: 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c  e==NONTERMINAL |
7840: 7c 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45  | sp->lambda==LE
7850: 4d 4f 4e 5f 46 41 4c 53 45 20 29 3b 0a 20 20 20  MON_FALSE );.   
7860: 20 20 20 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d       if( sp->lam
7870: 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45  bda==LEMON_FALSE
7880: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
7890: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72  }.      if( i==r
78a0: 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20  p->nrhs ){.     
78b0: 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62     rp->lhs->lamb
78c0: 64 61 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b  da = LEMON_TRUE;
78d0: 0a 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73  .        progres
78e0: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 1;.      }. 
78f0: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70     }.  }while( p
7900: 72 6f 67 72 65 73 73 20 29 3b 0a 0a 20 20 2f 2a  rogress );..  /*
7910: 20 4e 6f 77 20 63 6f 6d 70 75 74 65 20 61 6c 6c   Now compute all
7920: 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20   first sets */. 
7930: 20 64 6f 7b 0a 20 20 20 20 73 74 72 75 63 74 20   do{.    struct 
7940: 73 79 6d 62 6f 6c 20 2a 73 31 2c 20 2a 73 32 3b  symbol *s1, *s2;
7950: 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20  .    progress = 
7960: 30 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65  0;.    for(rp=le
7970: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
7980: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
7990: 20 20 73 31 20 3d 20 72 70 2d 3e 6c 68 73 3b 0a    s1 = rp->lhs;.
79a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
79b0: 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
79c0: 0a 20 20 20 20 20 20 20 20 73 32 20 3d 20 72 70  .        s2 = rp
79d0: 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
79e0: 20 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d    if( s2->type==
79f0: 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
7a00: 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b        progress +
7a10: 3d 20 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72  = SetAdd(s1->fir
7a20: 73 74 73 65 74 2c 73 32 2d 3e 69 6e 64 65 78 29  stset,s2->index)
7a30: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
7a40: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
7a50: 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d 4d   if( s2->type==M
7a60: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
7a70: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
7a80: 30 3b 20 6a 3c 73 32 2d 3e 6e 73 75 62 73 79 6d  0; j<s2->nsubsym
7a90: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
7aa0: 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20      progress += 
7ab0: 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72 73 74  SetAdd(s1->first
7ac0: 73 65 74 2c 73 32 2d 3e 73 75 62 73 79 6d 5b 6a  set,s2->subsym[j
7ad0: 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  ]->index);.     
7ae0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7af0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7b00: 7d 65 6c 73 65 20 69 66 28 20 73 31 3d 3d 73 32  }else if( s1==s2
7b10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
7b20: 28 20 73 31 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45  ( s1->lambda==LE
7b30: 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61  MON_FALSE ) brea
7b40: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
7b50: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 67  {.          prog
7b60: 72 65 73 73 20 2b 3d 20 53 65 74 55 6e 69 6f 6e  ress += SetUnion
7b70: 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32  (s1->firstset,s2
7b80: 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20  ->firstset);.   
7b90: 20 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e 6c         if( s2->l
7ba0: 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c  ambda==LEMON_FAL
7bb0: 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SE ) break;.    
7bc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7bd0: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72    }.  }while( pr
7be0: 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 65 74 75  ogress );.  retu
7bf0: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74  rn;.}../* Comput
7c00: 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61 74  e all LR(0) stat
7c10: 65 73 20 66 6f 72 20 74 68 65 20 67 72 61 6d 6d  es for the gramm
7c20: 61 72 2e 20 20 4c 69 6e 6b 73 0a 2a 2a 20 61 72  ar.  Links.** ar
7c30: 65 20 61 64 64 65 64 20 74 6f 20 62 65 74 77 65  e added to betwe
7c40: 65 6e 20 73 6f 6d 65 20 73 74 61 74 65 73 20 73  en some states s
7c50: 6f 20 74 68 61 74 20 74 68 65 20 4c 52 28 31 29  o that the LR(1)
7c60: 20 66 6f 6c 6c 6f 77 20 73 65 74 73 0a 2a 2a 20   follow sets.** 
7c70: 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20  can be computed 
7c80: 6c 61 74 65 72 2e 0a 2a 2f 0a 50 52 49 56 41 54  later..*/.PRIVAT
7c90: 45 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  E struct state *
7ca0: 67 65 74 73 74 61 74 65 28 73 74 72 75 63 74 20  getstate(struct 
7cb0: 6c 65 6d 6f 6e 20 2a 29 3b 20 20 2f 2a 20 66 6f  lemon *);  /* fo
7cc0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
7cd0: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 53 74 61 74  */.void FindStat
7ce0: 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  es(struct lemon 
7cf0: 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63  *lemp).{.  struc
7d00: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20  t symbol *sp;.  
7d10: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
7d20: 0a 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69  ..  Configlist_i
7d30: 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  nit();..  /* Fin
7d40: 64 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62  d the start symb
7d50: 6f 6c 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70  ol */.  if( lemp
7d60: 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73  ->start ){.    s
7d70: 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  p = Symbol_find(
7d80: 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20  lemp->start);.  
7d90: 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20    if( sp==0 ){. 
7da0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
7db0: 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a  mp->filename,0,.
7dc0: 22 54 68 65 20 73 70 65 63 69 66 69 65 64 20 73  "The specified s
7dd0: 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73  tart symbol \"%s
7de0: 5c 22 20 69 73 20 6e 6f 74 20 5c 0a 69 6e 20 61  \" is not \.in a
7df0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f 66 20   nonterminal of 
7e00: 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 5c 22  the grammar.  \"
7e10: 25 73 5c 22 20 77 69 6c 6c 20 62 65 20 75 73 65  %s\" will be use
7e20: 64 20 61 73 20 74 68 65 20 73 74 61 72 74 20 5c  d as the start \
7e30: 0a 73 79 6d 62 6f 6c 20 69 6e 73 74 65 61 64 2e  .symbol instead.
7e40: 22 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 2c 6c 65  ",lemp->start,le
7e50: 6d 70 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c  mp->startRule->l
7e60: 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  hs->name);.     
7e70: 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
7e80: 2b 3b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c 65  +;.      sp = le
7e90: 6d 70 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c  mp->startRule->l
7ea0: 68 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  hs;.    }.  }els
7eb0: 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70  e{.    sp = lemp
7ec0: 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73  ->startRule->lhs
7ed0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
7ee0: 20 73 75 72 65 20 74 68 65 20 73 74 61 72 74 20   sure the start 
7ef0: 73 79 6d 62 6f 6c 20 64 6f 65 73 6e 27 74 20 6f  symbol doesn't o
7f00: 63 63 75 72 20 6f 6e 20 74 68 65 20 72 69 67 68  ccur on the righ
7f10: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 0a 20  t-hand side of. 
7f20: 20 2a 2a 20 61 6e 79 20 72 75 6c 65 2e 20 20 52   ** any rule.  R
7f30: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
7f40: 66 20 69 74 20 64 6f 65 73 2e 20 20 28 59 41 43  f it does.  (YAC
7f50: 43 20 77 6f 75 6c 64 20 67 65 6e 65 72 61 74 65  C would generate
7f60: 20 61 20 6e 65 77 0a 20 20 2a 2a 20 73 74 61 72   a new.  ** star
7f70: 74 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73  t symbol in this
7f80: 20 63 61 73 65 2e 29 20 2a 2f 0a 20 20 66 6f 72   case.) */.  for
7f90: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
7fa0: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
7fb0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
7fc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
7fd0: 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
7fe0: 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d    if( rp->rhs[i]
7ff0: 3d 3d 73 70 20 29 7b 20 20 20 2f 2a 20 46 49 58  ==sp ){   /* FIX
8000: 20 4d 45 3a 20 20 44 65 61 6c 20 77 69 74 68 20   ME:  Deal with 
8010: 6d 75 6c 74 69 74 65 72 6d 69 6e 61 6c 73 20 2a  multiterminals *
8020: 2f 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  /.        ErrorM
8030: 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  sg(lemp->filenam
8040: 65 2c 30 2c 0a 22 54 68 65 20 73 74 61 72 74 20  e,0,."The start 
8050: 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 6f 63  symbol \"%s\" oc
8060: 63 75 72 73 20 6f 6e 20 74 68 65 20 5c 0a 72 69  curs on the \.ri
8070: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
8080: 20 61 20 72 75 6c 65 2e 20 54 68 69 73 20 77 69   a rule. This wi
8090: 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 20 70  ll result in a p
80a0: 61 72 73 65 72 20 77 68 69 63 68 20 5c 0a 64 6f  arser which \.do
80b0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 70 72 6f 70  es not work prop
80c0: 65 72 6c 79 2e 22 2c 73 70 2d 3e 6e 61 6d 65 29  erly.",sp->name)
80d0: 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e  ;.        lemp->
80e0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
80f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
8100: 20 2f 2a 20 54 68 65 20 62 61 73 69 73 20 63 6f   /* The basis co
8110: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 20  nfiguration set 
8120: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 73 74  for the first st
8130: 61 74 65 0a 20 20 2a 2a 20 69 73 20 61 6c 6c 20  ate.  ** is all 
8140: 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76 65  rules which have
8150: 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f   the start symbo
8160: 6c 20 61 73 20 74 68 65 69 72 0a 20 20 2a 2a 20  l as their.  ** 
8170: 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 2a  left-hand side *
8180: 2f 0a 20 20 66 6f 72 28 72 70 3d 73 70 2d 3e 72  /.  for(rp=sp->r
8190: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
81a0: 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20 73 74  nextlhs){.    st
81b0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77  ruct config *new
81c0: 63 66 70 3b 0a 20 20 20 20 72 70 2d 3e 6c 68 73  cfp;.    rp->lhs
81d0: 53 74 61 72 74 20 3d 20 31 3b 0a 20 20 20 20 6e  Start = 1;.    n
81e0: 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69  ewcfp = Configli
81f0: 73 74 5f 61 64 64 62 61 73 69 73 28 72 70 2c 30  st_addbasis(rp,0
8200: 29 3b 0a 20 20 20 20 53 65 74 41 64 64 28 6e 65  );.    SetAdd(ne
8210: 77 63 66 70 2d 3e 66 77 73 2c 30 29 3b 0a 20 20  wcfp->fws,0);.  
8220: 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
8230: 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 2e  the first state.
8240: 20 20 41 6c 6c 20 6f 74 68 65 72 20 73 74 61 74    All other stat
8250: 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  es will be.  ** 
8260: 63 6f 6d 70 75 74 65 64 20 61 75 74 6f 6d 61 74  computed automat
8270: 69 63 61 6c 6c 79 20 64 75 72 69 6e 67 20 74 68  ically during th
8280: 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66  e computation of
8290: 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 0a   the first one..
82a0: 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65    ** The returne
82b0: 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  d pointer to the
82c0: 20 66 69 72 73 74 20 73 74 61 74 65 20 69 73 20   first state is 
82d0: 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 28  not used. */.  (
82e0: 76 6f 69 64 29 67 65 74 73 74 61 74 65 28 6c 65  void)getstate(le
82f0: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  mp);.  return;.}
8300: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
8310: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 65  inter to a state
8320: 20 77 68 69 63 68 20 69 73 20 64 65 73 63 72 69   which is descri
8330: 62 65 64 20 62 79 20 74 68 65 20 63 6f 6e 66 69  bed by the confi
8340: 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74  guration.** list
8350: 20 77 68 69 63 68 20 68 61 73 20 62 65 65 6e 20   which has been 
8360: 62 75 69 6c 74 20 66 72 6f 6d 20 63 61 6c 6c 73  built from calls
8370: 20 74 6f 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61   to Configlist_a
8380: 64 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  dd..*/.PRIVATE v
8390: 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74 73 28  oid buildshifts(
83a0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20  struct lemon *, 
83b0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 3b  struct state *);
83c0: 20 2f 2a 20 46 6f 72 77 64 20 72 65 66 20 2a 2f   /* Forwd ref */
83d0: 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20  .PRIVATE struct 
83e0: 73 74 61 74 65 20 2a 67 65 74 73 74 61 74 65 28  state *getstate(
83f0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
8400: 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63  mp).{.  struct c
8410: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 62 70 3b  onfig *cfp, *bp;
8420: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
8430: 2a 73 74 70 3b 0a 0a 20 20 2f 2a 20 45 78 74 72  *stp;..  /* Extr
8440: 61 63 74 20 74 68 65 20 73 6f 72 74 65 64 20 62  act the sorted b
8450: 61 73 69 73 20 6f 66 20 74 68 65 20 6e 65 77 20  asis of the new 
8460: 73 74 61 74 65 2e 20 20 54 68 65 20 62 61 73 69  state.  The basi
8470: 73 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65  s was constructe
8480: 64 0a 20 20 2a 2a 20 62 79 20 70 72 69 6f 72 20  d.  ** by prior 
8490: 63 61 6c 6c 73 20 74 6f 20 22 43 6f 6e 66 69 67  calls to "Config
84a0: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 29 22  list_addbasis()"
84b0: 2e 20 2a 2f 0a 20 20 43 6f 6e 66 69 67 6c 69 73  . */.  Configlis
84c0: 74 5f 73 6f 72 74 62 61 73 69 73 28 29 3b 0a 20  t_sortbasis();. 
84d0: 20 62 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74   bp = Configlist
84e0: 5f 62 61 73 69 73 28 29 3b 0a 0a 20 20 2f 2a 20  _basis();..  /* 
84f0: 47 65 74 20 61 20 73 74 61 74 65 20 77 69 74 68  Get a state with
8500: 20 74 68 65 20 73 61 6d 65 20 62 61 73 69 73 20   the same basis 
8510: 2a 2f 0a 20 20 73 74 70 20 3d 20 53 74 61 74 65  */.  stp = State
8520: 5f 66 69 6e 64 28 62 70 29 3b 0a 20 20 69 66 28  _find(bp);.  if(
8530: 20 73 74 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41   stp ){.    /* A
8540: 20 73 74 61 74 65 20 77 69 74 68 20 74 68 65 20   state with the 
8550: 73 61 6d 65 20 62 61 73 69 73 20 61 6c 72 65 61  same basis alrea
8560: 64 79 20 65 78 69 73 74 73 21 20 20 43 6f 70 79  dy exists!  Copy
8570: 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 2d   all the follow-
8580: 73 65 74 0a 20 20 20 20 2a 2a 20 70 72 6f 70 61  set.    ** propa
8590: 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f  gation links fro
85a0: 6d 20 74 68 65 20 73 74 61 74 65 20 75 6e 64 65  m the state unde
85b0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
85c0: 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  nto the.    ** p
85d0: 72 65 65 78 69 73 74 69 6e 67 20 73 74 61 74 65  reexisting state
85e0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  , then return a 
85f0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
8600: 72 65 65 78 69 73 74 69 6e 67 20 73 74 61 74 65  reexisting state
8610: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 63   */.    struct c
8620: 6f 6e 66 69 67 20 2a 78 2c 20 2a 79 3b 0a 20 20  onfig *x, *y;.  
8630: 20 20 66 6f 72 28 78 3d 62 70 2c 20 79 3d 73 74    for(x=bp, y=st
8640: 70 2d 3e 62 70 3b 20 78 20 26 26 20 79 3b 20 78  p->bp; x && y; x
8650: 3d 78 2d 3e 62 70 2c 20 79 3d 79 2d 3e 62 70 29  =x->bp, y=y->bp)
8660: 7b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 63 6f  {.      Plink_co
8670: 70 79 28 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62  py(&y->bplp,x->b
8680: 70 6c 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e  plp);.      Plin
8690: 6b 5f 64 65 6c 65 74 65 28 78 2d 3e 66 70 6c 70  k_delete(x->fplp
86a0: 29 3b 0a 20 20 20 20 20 20 78 2d 3e 66 70 6c 70  );.      x->fplp
86b0: 20 3d 20 78 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a   = x->bplp = 0;.
86c0: 20 20 20 20 7d 0a 20 20 20 20 63 66 70 20 3d 20      }.    cfp = 
86d0: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72  Configlist_retur
86e0: 6e 28 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 6c  n();.    Configl
86f0: 69 73 74 5f 65 61 74 28 63 66 70 29 3b 0a 20 20  ist_eat(cfp);.  
8700: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
8710: 69 73 20 72 65 61 6c 6c 79 20 69 73 20 61 20 6e  is really is a n
8720: 65 77 20 73 74 61 74 65 2e 20 20 43 6f 6e 73 74  ew state.  Const
8730: 72 75 63 74 20 61 6c 6c 20 74 68 65 20 64 65 74  ruct all the det
8740: 61 69 6c 73 20 2a 2f 0a 20 20 20 20 43 6f 6e 66  ails */.    Conf
8750: 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c  iglist_closure(l
8760: 65 6d 70 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70  emp);    /* Comp
8770: 75 74 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ute the configur
8780: 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f  ation closure */
8790: 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  .    Configlist_
87a0: 73 6f 72 74 28 29 3b 20 20 20 20 20 20 20 20 20  sort();         
87b0: 20 20 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f    /* Sort the co
87c0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73  nfiguration clos
87d0: 75 72 65 20 2a 2f 0a 20 20 20 20 63 66 70 20 3d  ure */.    cfp =
87e0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75   Configlist_retu
87f0: 72 6e 28 29 3b 20 20 20 2f 2a 20 47 65 74 20 61  rn();   /* Get a
8800: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
8810: 63 6f 6e 66 69 67 20 6c 69 73 74 20 2a 2f 0a 20  config list */. 
8820: 20 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f 6e     stp = State_n
8830: 65 77 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  ew();           
8840: 2f 2a 20 41 20 6e 65 77 20 73 74 61 74 65 20 73  /* A new state s
8850: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
8860: 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 74 70 29  MemoryCheck(stp)
8870: 3b 0a 20 20 20 20 73 74 70 2d 3e 62 70 20 3d 20  ;.    stp->bp = 
8880: 62 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  bp;             
8890: 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74     /* Remember t
88a0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
88b0: 20 62 61 73 69 73 20 2a 2f 0a 20 20 20 20 73 74   basis */.    st
88c0: 70 2d 3e 63 66 70 20 3d 20 63 66 70 3b 20 20 20  p->cfp = cfp;   
88d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
88e0: 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69  member the confi
88f0: 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65  guration closure
8900: 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 73 74 61   */.    stp->sta
8910: 74 65 6e 75 6d 20 3d 20 6c 65 6d 70 2d 3e 6e 73  tenum = lemp->ns
8920: 74 61 74 65 2b 2b 3b 20 2f 2a 20 45 76 65 72 79  tate++; /* Every
8930: 20 73 74 61 74 65 20 67 65 74 73 20 61 20 73 65   state gets a se
8940: 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f  quence number */
8950: 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 30  .    stp->ap = 0
8960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8970: 20 20 2f 2a 20 4e 6f 20 61 63 74 69 6f 6e 73 2c    /* No actions,
8980: 20 79 65 74 2e 20 2a 2f 0a 20 20 20 20 53 74 61   yet. */.    Sta
8990: 74 65 5f 69 6e 73 65 72 74 28 73 74 70 2c 73 74  te_insert(stp,st
89a0: 70 2d 3e 62 70 29 3b 20 20 20 2f 2a 20 41 64 64  p->bp);   /* Add
89b0: 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 61   to the state ta
89c0: 62 6c 65 20 2a 2f 0a 20 20 20 20 62 75 69 6c 64  ble */.    build
89d0: 73 68 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29  shifts(lemp,stp)
89e0: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 63 75 72  ;       /* Recur
89f0: 73 69 76 65 6c 79 20 63 6f 6d 70 75 74 65 20 73  sively compute s
8a00: 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 73 20  uccessor states 
8a10: 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
8a20: 73 74 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  stp;.}../*.** Re
8a30: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 77 6f  turn true if two
8a40: 20 73 79 6d 62 6f 6c 73 20 61 72 65 20 74 68 65   symbols are the
8a50: 20 73 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 61   same..*/.int sa
8a60: 6d 65 5f 73 79 6d 62 6f 6c 28 73 74 72 75 63 74  me_symbol(struct
8a70: 20 73 79 6d 62 6f 6c 20 2a 61 2c 20 73 74 72 75   symbol *a, stru
8a80: 63 74 20 73 79 6d 62 6f 6c 20 2a 62 29 0a 7b 0a  ct symbol *b).{.
8a90: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61    int i;.  if( a
8aa0: 3d 3d 62 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==b ) return 1;.
8ab0: 20 20 69 66 28 20 61 2d 3e 74 79 70 65 21 3d 4d    if( a->type!=M
8ac0: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 20 72  ULTITERMINAL ) r
8ad0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 62  eturn 0;.  if( b
8ae0: 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52  ->type!=MULTITER
8af0: 4d 49 4e 41 4c 20 29 20 72 65 74 75 72 6e 20 30  MINAL ) return 0
8b00: 3b 0a 20 20 69 66 28 20 61 2d 3e 6e 73 75 62 73  ;.  if( a->nsubs
8b10: 79 6d 21 3d 62 2d 3e 6e 73 75 62 73 79 6d 20 29  ym!=b->nsubsym )
8b20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
8b30: 28 69 3d 30 3b 20 69 3c 61 2d 3e 6e 73 75 62 73  (i=0; i<a->nsubs
8b40: 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ym; i++){.    if
8b50: 28 20 61 2d 3e 73 75 62 73 79 6d 5b 69 5d 21 3d  ( a->subsym[i]!=
8b60: 62 2d 3e 73 75 62 73 79 6d 5b 69 5d 20 29 20 72  b->subsym[i] ) r
8b70: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
8b80: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 43  eturn 1;.}../* C
8b90: 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20 73 75 63  onstruct all suc
8ba0: 63 65 73 73 6f 72 20 73 74 61 74 65 73 20 74 6f  cessor states to
8bb0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 61 74 65   the given state
8bc0: 2e 20 20 41 20 22 73 75 63 63 65 73 73 6f 72 22  .  A "successor"
8bd0: 0a 2a 2a 20 73 74 61 74 65 20 69 73 20 61 6e 79  .** state is any
8be0: 20 73 74 61 74 65 20 77 68 69 63 68 20 63 61 6e   state which can
8bf0: 20 62 65 20 72 65 61 63 68 65 64 20 62 79 20 61   be reached by a
8c00: 20 73 68 69 66 74 20 61 63 74 69 6f 6e 2e 0a 2a   shift action..*
8c10: 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 62  /.PRIVATE void b
8c20: 75 69 6c 64 73 68 69 66 74 73 28 73 74 72 75 63  uildshifts(struc
8c30: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73  t lemon *lemp, s
8c40: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
8c50: 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ).{.  struct con
8c60: 66 69 67 20 2a 63 66 70 3b 20 20 2f 2a 20 46 6f  fig *cfp;  /* Fo
8c70: 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 75 20 74  r looping thru t
8c80: 68 65 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72  he config closur
8c90: 65 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20  e of "stp" */.  
8ca0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
8cb0: 63 66 70 3b 20 2f 2a 20 46 6f 72 20 74 68 65 20  cfp; /* For the 
8cc0: 69 6e 6e 65 72 20 6c 6f 6f 70 20 6f 6e 20 63 6f  inner loop on co
8cd0: 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20  nfig closure of 
8ce0: 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63  "stp" */.  struc
8cf0: 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 67  t config *newcfg
8d00: 3b 20 20 2f 2a 20 2a 2f 0a 20 20 73 74 72 75 63  ;  /* */.  struc
8d10: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20  t symbol *sp;   
8d20: 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77  /* Symbol follow
8d30: 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e 20 63  ing the dot in c
8d40: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 63 66  onfiguration "cf
8d50: 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  p" */.  struct s
8d60: 79 6d 62 6f 6c 20 2a 62 73 70 3b 20 20 2f 2a 20  ymbol *bsp;  /* 
8d70: 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67  Symbol following
8d80: 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66   the dot in conf
8d90: 69 67 75 72 61 74 69 6f 6e 20 22 62 63 66 70 22  iguration "bcfp"
8da0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
8db0: 74 65 20 2a 6e 65 77 73 74 70 3b 20 2f 2a 20 41  te *newstp; /* A
8dc0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
8dd0: 63 63 65 73 73 6f 72 20 73 74 61 74 65 20 2a 2f  ccessor state */
8de0: 0a 0a 20 20 2f 2a 20 45 61 63 68 20 63 6f 6e 66  ..  /* Each conf
8df0: 69 67 75 72 61 74 69 6f 6e 20 62 65 63 6f 6d 65  iguration become
8e00: 73 20 63 6f 6d 70 6c 65 74 65 20 61 66 74 65 72  s complete after
8e10: 20 69 74 20 63 6f 6e 74 69 62 75 74 65 73 20 74   it contibutes t
8e20: 6f 20 61 20 73 75 63 63 65 73 73 6f 72 0a 20 20  o a successor.  
8e30: 2a 2a 20 73 74 61 74 65 2e 20 20 49 6e 69 74 69  ** state.  Initi
8e40: 61 6c 6c 79 2c 20 61 6c 6c 20 63 6f 6e 66 69 67  ally, all config
8e50: 75 72 61 74 69 6f 6e 73 20 61 72 65 20 69 6e 63  urations are inc
8e60: 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 66 6f 72  omplete */.  for
8e70: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
8e80: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
8e90: 74 29 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d  t) cfp->status =
8ea0: 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 0a 20 20   INCOMPLETE;..  
8eb0: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
8ec0: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
8ed0: 6e 73 20 6f 66 20 74 68 65 20 73 74 61 74 65 20  ns of the state 
8ee0: 22 73 74 70 22 20 2a 2f 0a 20 20 66 6f 72 28 63  "stp" */.  for(c
8ef0: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
8f00: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
8f10: 7b 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 73  {.    if( cfp->s
8f20: 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20  tatus==COMPLETE 
8f30: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f  ) continue;    /
8f40: 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64 20 62  * Already used b
8f50: 79 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  y inner loop */.
8f60: 20 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74      if( cfp->dot
8f70: 3e 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20  >=cfp->rp->nrhs 
8f80: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20  ) continue;  /* 
8f90: 43 61 6e 27 74 20 73 68 69 66 74 20 74 68 69 73  Can't shift this
8fa0: 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20 43   config */.    C
8fb0: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28  onfiglist_reset(
8fc0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
8fd0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74          /* Reset
8fe0: 20 74 68 65 20 6e 65 77 20 63 6f 6e 66 69 67 20   the new config 
8ff0: 73 65 74 20 2a 2f 0a 20 20 20 20 73 70 20 3d 20  set */.    sp = 
9000: 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 63 66 70  cfp->rp->rhs[cfp
9010: 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20  ->dot];         
9020: 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 61 66      /* Symbol af
9030: 74 65 72 20 74 68 65 20 64 6f 74 20 2a 2f 0a 0a  ter the dot */..
9040: 20 20 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79      /* For every
9050: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69   configuration i
9060: 6e 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70  n the state "stp
9070: 22 20 77 68 69 63 68 20 68 61 73 20 74 68 65 20  " which has the 
9080: 73 79 6d 62 6f 6c 20 22 73 70 22 0a 20 20 20 20  symbol "sp".    
9090: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 73  ** following its
90a0: 20 64 6f 74 2c 20 61 64 64 20 74 68 65 20 73 61   dot, add the sa
90b0: 6d 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  me configuration
90c0: 20 74 6f 20 74 68 65 20 62 61 73 69 73 20 73 65   to the basis se
90d0: 74 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 63  t under.    ** c
90e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 62 75 74 20  onstruction but 
90f0: 77 69 74 68 20 74 68 65 20 64 6f 74 20 73 68 69  with the dot shi
9100: 66 74 65 64 20 6f 6e 65 20 73 79 6d 62 6f 6c 20  fted one symbol 
9110: 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  to the right. */
9120: 0a 20 20 20 20 66 6f 72 28 62 63 66 70 3d 63 66  .    for(bcfp=cf
9130: 70 3b 20 62 63 66 70 3b 20 62 63 66 70 3d 62 63  p; bcfp; bcfp=bc
9140: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
9150: 20 69 66 28 20 62 63 66 70 2d 3e 73 74 61 74 75   if( bcfp->statu
9160: 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f  s==COMPLETE ) co
9170: 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c  ntinue;    /* Al
9180: 72 65 61 64 79 20 75 73 65 64 20 2a 2f 0a 20 20  ready used */.  
9190: 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e 64 6f      if( bcfp->do
91a0: 74 3e 3d 62 63 66 70 2d 3e 72 70 2d 3e 6e 72 68  t>=bcfp->rp->nrh
91b0: 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a  s ) continue; /*
91c0: 20 43 61 6e 27 74 20 73 68 69 66 74 20 74 68 69   Can't shift thi
91d0: 73 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 62  s one */.      b
91e0: 73 70 20 3d 20 62 63 66 70 2d 3e 72 70 2d 3e 72  sp = bcfp->rp->r
91f0: 68 73 5b 62 63 66 70 2d 3e 64 6f 74 5d 3b 20 20  hs[bcfp->dot];  
9200: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20           /* Get 
9210: 73 79 6d 62 6f 6c 20 61 66 74 65 72 20 64 6f 74  symbol after dot
9220: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 73   */.      if( !s
9230: 61 6d 65 5f 73 79 6d 62 6f 6c 28 62 73 70 2c 73  ame_symbol(bsp,s
9240: 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  p) ) continue;  
9250: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 73      /* Must be s
9260: 61 6d 65 20 61 73 20 66 6f 72 20 22 63 66 70 22  ame as for "cfp"
9270: 20 2a 2f 0a 20 20 20 20 20 20 62 63 66 70 2d 3e   */.      bcfp->
9280: 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54  status = COMPLET
9290: 45 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E;              
92a0: 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 69 73      /* Mark this
92b0: 20 63 6f 6e 66 69 67 20 61 73 20 75 73 65 64 20   config as used 
92c0: 2a 2f 0a 20 20 20 20 20 20 6e 65 77 63 66 67 20  */.      newcfg 
92d0: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64  = Configlist_add
92e0: 62 61 73 69 73 28 62 63 66 70 2d 3e 72 70 2c 62  basis(bcfp->rp,b
92f0: 63 66 70 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20 20  cfp->dot+1);.   
9300: 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6e 65     Plink_add(&ne
9310: 77 63 66 67 2d 3e 62 70 6c 70 2c 62 63 66 70 29  wcfg->bplp,bcfp)
9320: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
9330: 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  Get a pointer to
9340: 20 74 68 65 20 73 74 61 74 65 20 64 65 73 63 72   the state descr
9350: 69 62 65 64 20 62 79 20 74 68 65 20 62 61 73 69  ibed by the basi
9360: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
9370: 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74  set.    ** const
9380: 72 75 63 74 65 64 20 69 6e 20 74 68 65 20 70 72  ructed in the pr
9390: 65 63 65 64 69 6e 67 20 6c 6f 6f 70 20 2a 2f 0a  eceding loop */.
93a0: 20 20 20 20 6e 65 77 73 74 70 20 3d 20 67 65 74      newstp = get
93b0: 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 0a 20 20  state(lemp);..  
93c0: 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20 22    /* The state "
93d0: 6e 65 77 73 74 70 22 20 69 73 20 72 65 61 63 68  newstp" is reach
93e0: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74  ed from the stat
93f0: 65 20 22 73 74 70 22 20 62 79 20 61 20 73 68 69  e "stp" by a shi
9400: 66 74 20 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ft action.    **
9410: 20 6f 6e 20 74 68 65 20 73 79 6d 62 6f 6c 20 22   on the symbol "
9420: 73 70 22 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  sp" */.    if( s
9430: 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
9440: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
9450: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
9460: 28 69 3d 30 3b 20 69 3c 73 70 2d 3e 6e 73 75 62  (i=0; i<sp->nsub
9470: 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sym; i++){.     
9480: 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73     Action_add(&s
9490: 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70 2d  tp->ap,SHIFT,sp-
94a0: 3e 73 75 62 73 79 6d 5b 69 5d 2c 28 63 68 61 72  >subsym[i],(char
94b0: 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20 20 20  *)newstp);.     
94c0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
94d0: 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26      Action_add(&
94e0: 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70  stp->ap,SHIFT,sp
94f0: 2c 28 63 68 61 72 20 2a 29 6e 65 77 73 74 70 29  ,(char *)newstp)
9500: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
9510: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74  *.** Construct t
9520: 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  he propagation l
9530: 69 6e 6b 73 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e  inks.*/.void Fin
9540: 64 4c 69 6e 6b 73 28 73 74 72 75 63 74 20 6c 65  dLinks(struct le
9550: 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69  mon *lemp).{.  i
9560: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63  nt i;.  struct c
9570: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6f 74 68  onfig *cfp, *oth
9580: 65 72 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  er;.  struct sta
9590: 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63  te *stp;.  struc
95a0: 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a 20  t plink *plp;.. 
95b0: 20 2f 2a 20 48 6f 75 73 65 6b 65 65 70 69 6e 67   /* Housekeeping
95c0: 20 64 65 74 61 69 6c 3a 0a 20 20 2a 2a 20 41 64   detail:.  ** Ad
95d0: 64 20 74 6f 20 65 76 65 72 79 20 70 72 6f 70 61  d to every propa
95e0: 67 61 74 65 20 6c 69 6e 6b 20 61 20 70 6f 69 6e  gate link a poin
95f0: 74 65 72 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ter back to the 
9600: 73 74 61 74 65 20 74 6f 0a 20 20 2a 2a 20 77 68  state to.  ** wh
9610: 69 63 68 20 74 68 65 20 6c 69 6e 6b 20 69 73 20  ich the link is 
9620: 61 74 74 61 63 68 65 64 2e 20 2a 2f 0a 20 20 66  attached. */.  f
9630: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
9640: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
9650: 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
9660: 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  rted[i];.    for
9670: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
9680: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
9690: 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e 73  t){.      cfp->s
96a0: 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 7d 0a  tp = stp;.    }.
96b0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72    }..  /* Conver
96c0: 74 20 61 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73 20  t all backlinks 
96d0: 69 6e 74 6f 20 66 6f 72 77 61 72 64 20 6c 69 6e  into forward lin
96e0: 6b 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 6f  ks.  Only the fo
96f0: 72 77 61 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b 73  rward.  ** links
9700: 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65   are used in the
9710: 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d 70   follow-set comp
9720: 75 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f  utation. */.  fo
9730: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
9740: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
9750: 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
9760: 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  ted[i];.    for(
9770: 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66  cfp=stp->cfp; cf
9780: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
9790: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 6c 70  ){.      for(plp
97a0: 3d 63 66 70 2d 3e 62 70 6c 70 3b 20 70 6c 70 3b  =cfp->bplp; plp;
97b0: 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b   plp=plp->next){
97c0: 0a 20 20 20 20 20 20 20 20 6f 74 68 65 72 20 3d  .        other =
97d0: 20 70 6c 70 2d 3e 63 66 70 3b 0a 20 20 20 20 20   plp->cfp;.     
97e0: 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6f 74     Plink_add(&ot
97f0: 68 65 72 2d 3e 66 70 6c 70 2c 63 66 70 29 3b 0a  her->fplp,cfp);.
9800: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9810: 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20  }.}../* Compute 
9820: 61 6c 6c 20 66 6f 6c 6c 6f 77 73 65 74 73 2e 0a  all followsets..
9830: 2a 2a 0a 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73 65  **.** A followse
9840: 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66 20  t is the set of 
9850: 61 6c 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69 63  all symbols whic
9860: 68 20 63 61 6e 20 63 6f 6d 65 20 69 6d 6d 65 64  h can come immed
9870: 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20  iately.** after 
9880: 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  a configuration.
9890: 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c  .*/.void FindFol
98a0: 6c 6f 77 53 65 74 73 28 73 74 72 75 63 74 20 6c  lowSets(struct l
98b0: 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
98c0: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
98d0: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73  config *cfp;.  s
98e0: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70  truct plink *plp
98f0: 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73  ;.  int progress
9900: 3b 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 3b 0a  ;.  int change;.
9910: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
9920: 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
9930: 7b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65  {.    for(cfp=le
9940: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63  mp->sorted[i]->c
9950: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
9960: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 63  ->next){.      c
9970: 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43  fp->status = INC
9980: 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20  OMPLETE;.    }. 
9990: 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72   }..  do{.    pr
99a0: 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
99b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
99c0: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
99d0: 20 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d       for(cfp=lem
99e0: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66  p->sorted[i]->cf
99f0: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
9a00: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
9a10: 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d  if( cfp->status=
9a20: 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74  =COMPLETE ) cont
9a30: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f  inue;.        fo
9a40: 72 28 70 6c 70 3d 63 66 70 2d 3e 66 70 6c 70 3b  r(plp=cfp->fplp;
9a50: 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e   plp; plp=plp->n
9a60: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
9a70: 63 68 61 6e 67 65 20 3d 20 53 65 74 55 6e 69 6f  change = SetUnio
9a80: 6e 28 70 6c 70 2d 3e 63 66 70 2d 3e 66 77 73 2c  n(plp->cfp->fws,
9a90: 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 20  cfp->fws);.     
9aa0: 20 20 20 20 20 69 66 28 20 63 68 61 6e 67 65 20       if( change 
9ab0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
9ac0: 6c 70 2d 3e 63 66 70 2d 3e 73 74 61 74 75 73 20  lp->cfp->status 
9ad0: 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20  = INCOMPLETE;.  
9ae0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65            progre
9af0: 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ss = 1;.        
9b00: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
9b10: 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74 75        cfp->statu
9b20: 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 0a 20 20  s = COMPLETE;.  
9b30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
9b40: 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29  hile( progress )
9b50: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
9b60: 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74  resolve_conflict
9b70: 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  (struct action *
9b80: 2c 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  ,struct action *
9b90: 29 3b 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74  );../* Compute t
9ba0: 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e  he reduce action
9bb0: 73 2c 20 61 6e 64 20 72 65 73 6f 6c 76 65 20 63  s, and resolve c
9bc0: 6f 6e 66 6c 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69  onflicts..*/.voi
9bd0: 64 20 46 69 6e 64 41 63 74 69 6f 6e 73 28 73 74  d FindActions(st
9be0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
9bf0: 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b 0a 20  ).{.  int i,j;. 
9c00: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
9c10: 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 73 74  cfp;.  struct st
9c20: 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
9c30: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
9c40: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
9c50: 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20  ;..  /* Add all 
9c60: 6f 66 20 74 68 65 20 72 65 64 75 63 65 20 61 63  of the reduce ac
9c70: 74 69 6f 6e 73 0a 20 20 2a 2a 20 41 20 72 65 64  tions.  ** A red
9c80: 75 63 65 20 61 63 74 69 6f 6e 20 69 73 20 61 64  uce action is ad
9c90: 64 65 64 20 66 6f 72 20 65 61 63 68 20 65 6c 65  ded for each ele
9ca0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ment of the foll
9cb0: 6f 77 73 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20  owset of.  ** a 
9cc0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 77 68  configuration wh
9cd0: 69 63 68 20 68 61 73 20 69 74 73 20 64 6f 74 20  ich has its dot 
9ce0: 61 74 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  at the extreme r
9cf0: 69 67 68 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ight..  */.  for
9d00: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
9d10: 74 61 74 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a  tate; i++){   /*
9d20: 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73   Loop over all s
9d30: 74 61 74 65 73 20 2a 2f 0a 20 20 20 20 73 74 70  tates */.    stp
9d40: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
9d50: 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d  i];.    for(cfp=
9d60: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
9d70: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20  fp=cfp->next){  
9d80: 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  /* Loop over all
9d90: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
9da0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 63 66 70  */.      if( cfp
9db0: 2d 3e 72 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d  ->rp->nrhs==cfp-
9dc0: 3e 64 6f 74 20 29 7b 20 20 20 20 20 20 20 20 2f  >dot ){        /
9dd0: 2a 20 49 73 20 64 6f 74 20 61 74 20 65 78 74 72  * Is dot at extr
9de0: 65 6d 65 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20  eme right? */.  
9df0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
9e00: 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
9e10: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
9e20: 20 20 69 66 28 20 53 65 74 46 69 6e 64 28 63 66    if( SetFind(cf
9e30: 70 2d 3e 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20  p->fws,j) ){.   
9e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
9e50: 61 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20  a reduce action 
9e60: 74 6f 20 74 68 65 20 73 74 61 74 65 20 22 73 74  to the state "st
9e70: 70 22 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65  p" which will re
9e80: 64 75 63 65 20 62 79 20 74 68 65 0a 20 20 20 20  duce by the.    
9e90: 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6c 65 20          ** rule 
9ea0: 22 63 66 70 2d 3e 72 70 22 20 69 66 20 74 68 65  "cfp->rp" if the
9eb0: 20 6c 6f 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f   lookahead symbo
9ec0: 6c 20 69 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62  l is "lemp->symb
9ed0: 6f 6c 73 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20  ols[j]" */.     
9ee0: 20 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64         Action_ad
9ef0: 64 28 26 73 74 70 2d 3e 61 70 2c 52 45 44 55 43  d(&stp->ap,REDUC
9f00: 45 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  E,lemp->symbols[
9f10: 6a 5d 2c 28 63 68 61 72 20 2a 29 63 66 70 2d 3e  j],(char *)cfp->
9f20: 72 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rp);.          }
9f30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9f40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
9f50: 2f 2a 20 41 64 64 20 74 68 65 20 61 63 63 65 70  /* Add the accep
9f60: 74 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  ting token */.  
9f70: 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20  if( lemp->start 
9f80: 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62  ){.    sp = Symb
9f90: 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74  ol_find(lemp->st
9fa0: 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70  art);.    if( sp
9fb0: 3d 3d 30 20 29 20 73 70 20 3d 20 6c 65 6d 70 2d  ==0 ) sp = lemp-
9fc0: 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c 68 73 3b  >startRule->lhs;
9fd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70  .  }else{.    sp
9fe0: 20 3d 20 6c 65 6d 70 2d 3e 73 74 61 72 74 52 75   = lemp->startRu
9ff0: 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 20 20 2f  le->lhs;.  }.  /
a000: 2a 20 41 64 64 20 74 6f 20 74 68 65 20 66 69 72  * Add to the fir
a010: 73 74 20 73 74 61 74 65 20 28 77 68 69 63 68 20  st state (which 
a020: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 73 74  is always the st
a030: 61 72 74 69 6e 67 20 73 74 61 74 65 20 6f 66 20  arting state of 
a040: 74 68 65 0a 20 20 2a 2a 20 66 69 6e 69 74 65 20  the.  ** finite 
a050: 73 74 61 74 65 20 6d 61 63 68 69 6e 65 29 20 61  state machine) a
a060: 6e 20 61 63 74 69 6f 6e 20 74 6f 20 41 43 43 45  n action to ACCE
a070: 50 54 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68  PT if the lookah
a080: 65 61 64 20 69 73 20 74 68 65 0a 20 20 2a 2a 20  ead is the.  ** 
a090: 73 74 61 72 74 20 6e 6f 6e 74 65 72 6d 69 6e 61  start nontermina
a0a0: 6c 2e 20 20 2a 2f 0a 20 20 41 63 74 69 6f 6e 5f  l.  */.  Action_
a0b0: 61 64 64 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65  add(&lemp->sorte
a0c0: 64 5b 30 5d 2d 3e 61 70 2c 41 43 43 45 50 54 2c  d[0]->ap,ACCEPT,
a0d0: 73 70 2c 30 29 3b 0a 0a 20 20 2f 2a 20 52 65 73  sp,0);..  /* Res
a0e0: 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73 20 2a  olve conflicts *
a0f0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
a100: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
a110: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 61 63  ){.    struct ac
a120: 74 69 6f 6e 20 2a 61 70 2c 20 2a 6e 61 70 3b 0a  tion *ap, *nap;.
a130: 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
a140: 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 2f  sorted[i];.    /
a150: 2a 20 61 73 73 65 72 74 28 20 73 74 70 2d 3e 61  * assert( stp->a
a160: 70 20 29 3b 20 2a 2f 0a 20 20 20 20 73 74 70 2d  p ); */.    stp-
a170: 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72  >ap = Action_sor
a180: 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20 20 20  t(stp->ap);.    
a190: 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
a1a0: 61 70 20 26 26 20 61 70 2d 3e 6e 65 78 74 3b 20  ap && ap->next; 
a1b0: 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
a1c0: 20 20 20 20 66 6f 72 28 6e 61 70 3d 61 70 2d 3e      for(nap=ap->
a1d0: 6e 65 78 74 3b 20 6e 61 70 20 26 26 20 6e 61 70  next; nap && nap
a1e0: 2d 3e 73 70 3d 3d 61 70 2d 3e 73 70 3b 20 6e 61  ->sp==ap->sp; na
a1f0: 70 3d 6e 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=nap->next){.  
a200: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77         /* The tw
a210: 6f 20 61 63 74 69 6f 6e 73 20 22 61 70 22 20 61  o actions "ap" a
a220: 6e 64 20 22 6e 61 70 22 20 68 61 76 65 20 74 68  nd "nap" have th
a230: 65 20 73 61 6d 65 20 6c 6f 6f 6b 61 68 65 61 64  e same lookahead
a240: 2e 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 46 69  ..         ** Fi
a250: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f  gure out which o
a260: 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  ne should be use
a270: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 6c 65  d */.         le
a280: 6d 70 2d 3e 6e 63 6f 6e 66 6c 69 63 74 20 2b 3d  mp->nconflict +=
a290: 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63   resolve_conflic
a2a0: 74 28 61 70 2c 6e 61 70 29 3b 0a 20 20 20 20 20  t(ap,nap);.     
a2b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
a2c0: 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  /* Report an err
a2d0: 6f 72 20 66 6f 72 20 65 61 63 68 20 72 75 6c 65  or for each rule
a2e0: 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72 20   that can never 
a2f0: 62 65 20 72 65 64 75 63 65 64 2e 20 2a 2f 0a 20  be reduced. */. 
a300: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
a310: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
a320: 65 78 74 29 20 72 70 2d 3e 63 61 6e 52 65 64 75  ext) rp->canRedu
a330: 63 65 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45  ce = LEMON_FALSE
a340: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
a350: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
a360: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 61 63  ){.    struct ac
a370: 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 20 20 66 6f  tion *ap;.    fo
a380: 72 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65  r(ap=lemp->sorte
a390: 64 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70  d[i]->ap; ap; ap
a3a0: 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
a3b0: 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
a3c0: 52 45 44 55 43 45 20 29 20 61 70 2d 3e 78 2e 72  REDUCE ) ap->x.r
a3d0: 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 4c  p->canReduce = L
a3e0: 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 7d  EMON_TRUE;.    }
a3f0: 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65  .  }.  for(rp=le
a400: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
a410: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
a420: 69 66 28 20 72 70 2d 3e 63 61 6e 52 65 64 75 63  if( rp->canReduc
a430: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
a440: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
a450: 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
a460: 6c 65 6c 69 6e 65 2c 22 54 68 69 73 20 72 75 6c  leline,"This rul
a470: 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 72 65 64  e can not be red
a480: 75 63 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c  uced.\n");.    l
a490: 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
a4a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c  .  }.}../* Resol
a4b0: 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 20 62 65  ve a conflict be
a4c0: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
a4d0: 76 65 6e 20 61 63 74 69 6f 6e 73 2e 20 20 49 66  ven actions.  If
a4e0: 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74   the.** conflict
a4f0: 20 63 61 6e 27 74 20 62 65 20 72 65 73 6f 6c 76   can't be resolv
a500: 65 64 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ed, return non-z
a510: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f  ero..**.** NO LO
a520: 4e 47 45 52 20 54 52 55 45 3a 0a 2a 2a 20 20 20  NGER TRUE:.**   
a530: 54 6f 20 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e  To resolve a con
a540: 66 6c 69 63 74 2c 20 66 69 72 73 74 20 6c 6f 6f  flict, first loo
a550: 6b 20 74 6f 20 73 65 65 20 69 66 20 65 69 74 68  k to see if eith
a560: 65 72 20 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 69  er action.**   i
a570: 73 20 6f 6e 20 61 6e 20 65 72 72 6f 72 20 72 75  s on an error ru
a580: 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  le.  In that cas
a590: 65 2c 20 74 61 6b 65 20 74 68 65 20 61 63 74 69  e, take the acti
a5a0: 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20 69 73  on which.**   is
a5b0: 20 6e 6f 74 20 61 73 73 6f 63 69 61 74 65 64 20   not associated 
a5c0: 77 69 74 68 20 74 68 65 20 65 72 72 6f 72 20 72  with the error r
a5d0: 75 6c 65 2e 20 20 49 66 20 6e 65 69 74 68 65 72  ule.  If neither
a5e0: 20 6f 72 20 62 6f 74 68 0a 2a 2a 20 20 20 61 63   or both.**   ac
a5f0: 74 69 6f 6e 73 20 61 72 65 20 61 73 73 6f 63 69  tions are associ
a600: 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72  ated with an err
a610: 6f 72 20 72 75 6c 65 2c 20 74 68 65 6e 20 74 72  or rule, then tr
a620: 79 20 74 6f 0a 2a 2a 20 20 20 75 73 65 20 70 72  y to.**   use pr
a630: 65 63 65 64 65 6e 63 65 20 74 6f 20 72 65 73 6f  ecedence to reso
a640: 6c 76 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  lve the conflict
a650: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  ..**.** If eithe
a660: 72 20 61 63 74 69 6f 6e 20 69 73 20 61 20 53 48  r action is a SH
a670: 49 46 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  IFT, then it mus
a680: 74 20 62 65 20 61 70 78 2e 20 20 54 68 69 73 0a  t be apx.  This.
a690: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 6e 27  ** function won'
a6a0: 74 20 77 6f 72 6b 20 69 66 20 61 70 78 2d 3e 74  t work if apx->t
a6b0: 79 70 65 3d 3d 52 45 44 55 43 45 20 61 6e 64 20  ype==REDUCE and 
a6c0: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54  apy->type==SHIFT
a6d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a6e0: 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74  resolve_conflict
a6f0: 28 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  (.  struct actio
a700: 6e 20 2a 61 70 78 2c 0a 20 20 73 74 72 75 63 74  n *apx,.  struct
a710: 20 61 63 74 69 6f 6e 20 2a 61 70 79 0a 29 7b 0a   action *apy.){.
a720: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
a730: 2a 73 70 78 2c 20 2a 73 70 79 3b 0a 20 20 69 6e  *spx, *spy;.  in
a740: 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20  t errcnt = 0;.  
a750: 61 73 73 65 72 74 28 20 61 70 78 2d 3e 73 70 3d  assert( apx->sp=
a760: 3d 61 70 79 2d 3e 73 70 20 29 3b 20 20 2f 2a 20  =apy->sp );  /* 
a770: 4f 74 68 65 72 77 69 73 65 20 74 68 65 72 65 20  Otherwise there 
a780: 77 6f 75 6c 64 20 62 65 20 6e 6f 20 63 6f 6e 66  would be no conf
a790: 6c 69 63 74 20 2a 2f 0a 20 20 69 66 28 20 61 70  lict */.  if( ap
a7a0: 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26  x->type==SHIFT &
a7b0: 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49  & apy->type==SHI
a7c0: 46 54 20 29 7b 0a 20 20 20 20 61 70 79 2d 3e 74  FT ){.    apy->t
a7d0: 79 70 65 20 3d 20 53 53 43 4f 4e 46 4c 49 43 54  ype = SSCONFLICT
a7e0: 3b 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a  ;.    errcnt++;.
a7f0: 20 20 7d 0a 20 20 69 66 28 20 61 70 78 2d 3e 74    }.  if( apx->t
a800: 79 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70  ype==SHIFT && ap
a810: 79 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  y->type==REDUCE 
a820: 29 7b 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78  ){.    spx = apx
a830: 2d 3e 73 70 3b 0a 20 20 20 20 73 70 79 20 3d 20  ->sp;.    spy = 
a840: 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73  apy->x.rp->precs
a850: 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 79 3d  ym;.    if( spy=
a860: 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c  =0 || spx->prec<
a870: 30 20 7c 7c 20 73 70 79 2d 3e 70 72 65 63 3c 30  0 || spy->prec<0
a880: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74   ){.      /* Not
a890: 20 65 6e 6f 75 67 68 20 70 72 65 63 65 64 65 6e   enough preceden
a8a0: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ce information. 
a8b0: 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  */.      apy->ty
a8c0: 70 65 20 3d 20 53 52 43 4f 4e 46 4c 49 43 54 3b  pe = SRCONFLICT;
a8d0: 0a 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b  .      errcnt++;
a8e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
a8f0: 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72  px->prec>spy->pr
a900: 65 63 20 29 7b 20 20 20 20 2f 2a 20 68 69 67 68  ec ){    /* high
a910: 65 72 20 70 72 65 63 65 64 65 6e 63 65 20 77 69  er precedence wi
a920: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d  ns */.      apy-
a930: 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c  >type = RD_RESOL
a940: 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  VED;.    }else i
a950: 66 28 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79  f( spx->prec<spy
a960: 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20  ->prec ){.      
a970: 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52  apx->type = SH_R
a980: 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c  ESOLVED;.    }el
a990: 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63  se if( spx->prec
a9a0: 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73  ==spy->prec && s
a9b0: 70 78 2d 3e 61 73 73 6f 63 3d 3d 52 49 47 48 54  px->assoc==RIGHT
a9c0: 20 29 7b 20 2f 2a 20 55 73 65 20 6f 70 65 72 61   ){ /* Use opera
a9d0: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 61 70 79  tor */.      apy
a9e0: 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f  ->type = RD_RESO
a9f0: 4c 56 45 44 3b 20 20 20 20 20 20 20 20 20 20 20  LVED;           
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa10: 20 20 2f 2a 20 61 73 73 6f 63 69 61 74 69 76 69    /* associativi
aa20: 74 79 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  ty */.    }else 
aa30: 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73  if( spx->prec==s
aa40: 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d  py->prec && spx-
aa50: 3e 61 73 73 6f 63 3d 3d 4c 45 46 54 20 29 7b 20  >assoc==LEFT ){ 
aa60: 20 2f 2a 20 74 6f 20 62 72 65 61 6b 20 74 69 65   /* to break tie
aa70: 20 2a 2f 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   */.      apx->t
aa80: 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45  ype = SH_RESOLVE
aa90: 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
aaa0: 20 20 20 20 61 73 73 65 72 74 28 20 73 70 78 2d      assert( spx-
aab0: 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63  >prec==spy->prec
aac0: 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d   && spx->assoc==
aad0: 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 61 70  NONE );.      ap
aae0: 78 2d 3e 74 79 70 65 20 3d 20 45 52 52 4f 52 3b  x->type = ERROR;
aaf0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
ab00: 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45  f( apx->type==RE
ab10: 44 55 43 45 20 26 26 20 61 70 79 2d 3e 74 79 70  DUCE && apy->typ
ab20: 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20  e==REDUCE ){.   
ab30: 20 73 70 78 20 3d 20 61 70 78 2d 3e 78 2e 72 70   spx = apx->x.rp
ab40: 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 73  ->precsym;.    s
ab50: 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e  py = apy->x.rp->
ab60: 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28  precsym;.    if(
ab70: 20 73 70 78 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d   spx==0 || spy==
ab80: 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30  0 || spx->prec<0
ab90: 20 7c 7c 0a 20 20 20 20 73 70 79 2d 3e 70 72 65   ||.    spy->pre
aba0: 63 3c 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63  c<0 || spx->prec
abb0: 3d 3d 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  ==spy->prec ){. 
abc0: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
abd0: 20 52 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20   RRCONFLICT;.   
abe0: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
abf0: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
ac00: 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29  prec>spy->prec )
ac10: 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  {.      apy->typ
ac20: 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b  e = RD_RESOLVED;
ac30: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
ac40: 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72  px->prec<spy->pr
ac50: 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d  ec ){.      apx-
ac60: 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c  >type = RD_RESOL
ac70: 56 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  VED;.    }.  }el
ac80: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 0a  se{.    assert(.
ac90: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d        apx->type=
aca0: 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a  =SH_RESOLVED ||.
acb0: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d        apx->type=
acc0: 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a  =RD_RESOLVED ||.
acd0: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d        apx->type=
ace0: 3d 53 53 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20  =SSCONFLICT ||. 
acf0: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d       apx->type==
ad00: 53 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20  SRCONFLICT ||.  
ad10: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52      apx->type==R
ad20: 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20  RCONFLICT ||.   
ad30: 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48     apy->type==SH
ad40: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
ad50: 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 44     apy->type==RD
ad60: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
ad70: 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 53     apy->type==SS
ad80: 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20  CONFLICT ||.    
ad90: 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 52 43    apy->type==SRC
ada0: 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20  ONFLICT ||.     
adb0: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 52 43 4f   apy->type==RRCO
adc0: 4e 46 4c 49 43 54 0a 20 20 20 20 29 3b 0a 20 20  NFLICT.    );.  
add0: 20 20 2f 2a 20 54 68 65 20 52 45 44 55 43 45 2f    /* The REDUCE/
ade0: 53 48 49 46 54 20 63 61 73 65 20 63 61 6e 6e 6f  SHIFT case canno
adf0: 74 20 68 61 70 70 65 6e 20 62 65 63 61 75 73 65  t happen because
ae00: 20 53 48 49 46 54 73 20 63 6f 6d 65 20 62 65 66   SHIFTs come bef
ae10: 6f 72 65 0a 20 20 20 20 2a 2a 20 52 45 44 55 43  ore.    ** REDUC
ae20: 45 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 20  Es on the list. 
ae30: 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
ae40: 73 20 70 6f 69 6e 74 20 69 74 20 6d 75 73 74 20  s point it must 
ae50: 62 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a  be because.    *
ae60: 2a 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * the parser con
ae70: 66 6c 69 63 74 20 68 61 64 20 61 6c 72 65 61 64  flict had alread
ae80: 79 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  y been resolved.
ae90: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
aea0: 20 65 72 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a   errcnt;.}./****
aeb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aec0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
aed0: 22 63 6f 6e 66 69 67 6c 69 73 74 2e 63 22 20 2a  "configlist.c" *
aee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aef0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
af00: 52 6f 75 74 69 6e 65 73 20 74 6f 20 70 72 6f 63  Routines to proc
af10: 65 73 73 69 6e 67 20 61 20 63 6f 6e 66 69 67 75  essing a configu
af20: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20  ration list and 
af30: 62 75 69 6c 64 69 6e 67 20 61 20 73 74 61 74 65  building a state
af40: 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  .** in the LEMON
af50: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
af60: 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 73 74  r..*/..static st
af70: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 66 72 65  ruct config *fre
af80: 65 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20  elist = 0;      
af90: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20  /* List of free 
afa0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a  configurations *
afb0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
afc0: 63 6f 6e 66 69 67 20 2a 63 75 72 72 65 6e 74 20  config *current 
afd0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f  = 0;       /* To
afe0: 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 63 6f 6e  p of list of con
aff0: 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  figurations */.s
b000: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
b010: 66 69 67 20 2a 2a 63 75 72 72 65 6e 74 65 6e 64  fig **currentend
b020: 20 3d 20 30 3b 20 20 20 2f 2a 20 4c 61 73 74 20   = 0;   /* Last 
b030: 6f 6e 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69  on list of confi
b040: 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  gs */.static str
b050: 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 61 73 69  uct config *basi
b060: 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  s = 0;         /
b070: 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66  * Top of list of
b080: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a   basis configs *
b090: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
b0a0: 63 6f 6e 66 69 67 20 2a 2a 62 61 73 69 73 65 6e  config **basisen
b0b0: 64 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 45 6e  d = 0;     /* En
b0c0: 64 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73  d of list of bas
b0d0: 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 0a 2f  is configs */../
b0e0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
b0f0: 65 72 20 74 6f 20 61 20 6e 65 77 20 63 6f 6e 66  er to a new conf
b100: 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49  iguration */.PRI
b110: 56 41 54 45 20 73 74 72 75 63 74 20 63 6f 6e 66  VATE struct conf
b120: 69 67 20 2a 6e 65 77 63 6f 6e 66 69 67 28 76 6f  ig *newconfig(vo
b130: 69 64 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  id){.  struct co
b140: 6e 66 69 67 20 2a 6e 65 77 63 66 67 3b 0a 20 20  nfig *newcfg;.  
b150: 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20  if( freelist==0 
b160: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
b170: 20 20 69 6e 74 20 61 6d 74 20 3d 20 33 3b 0a 20    int amt = 3;. 
b180: 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20 28 73     freelist = (s
b190: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 63  truct config *)c
b1a0: 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65  alloc( amt, size
b1b0: 6f 66 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  of(struct config
b1c0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 66 72 65  ) );.    if( fre
b1d0: 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
b1e0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
b1f0: 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  ,"Unable to allo
b200: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
b210: 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74  a new configurat
b220: 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65 78  ion.");.      ex
b230: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
b240: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d   for(i=0; i<amt-
b250: 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69 73 74  1; i++) freelist
b260: 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65 65  [i].next = &free
b270: 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66  list[i+1];.    f
b280: 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e  reelist[amt-1].n
b290: 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ext = 0;.  }.  n
b2a0: 65 77 63 66 67 20 3d 20 66 72 65 65 6c 69 73 74  ewcfg = freelist
b2b0: 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66  ;.  freelist = f
b2c0: 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20  reelist->next;. 
b2d0: 20 72 65 74 75 72 6e 20 6e 65 77 63 66 67 3b 0a   return newcfg;.
b2e0: 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67  }../* The config
b2f0: 75 72 61 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73  uration "old" is
b300: 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 64 20   no longer used 
b310: 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
b320: 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 73 74 72  deleteconfig(str
b330: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 29  uct config *old)
b340: 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74 20 3d  .{.  old->next =
b350: 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65   freelist;.  fre
b360: 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a  elist = old;.}..
b370: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 74  /* Initialized t
b380: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
b390: 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20 2a 2f   list builder */
b3a0: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
b3b0: 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 63  _init(void){.  c
b3c0: 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75  urrent = 0;.  cu
b3d0: 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72  rrentend = &curr
b3e0: 65 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30  ent;.  basis = 0
b3f0: 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26  ;.  basisend = &
b400: 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74  basis;.  Configt
b410: 61 62 6c 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72  able_init();.  r
b420: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69  eturn;.}../* Ini
b430: 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e  tialized the con
b440: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
b450: 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20  builder */.void 
b460: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74  Configlist_reset
b470: 28 76 6f 69 64 29 7b 0a 20 20 63 75 72 72 65 6e  (void){.  curren
b480: 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74  t = 0;.  current
b490: 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a  end = &current;.
b4a0: 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62    basis = 0;.  b
b4b0: 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73  asisend = &basis
b4c0: 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  ;.  Configtable_
b4d0: 63 6c 65 61 72 28 30 29 3b 0a 20 20 72 65 74 75  clear(0);.  retu
b4e0: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e  rn;.}../* Add an
b4f0: 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74  other configurat
b500: 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69  ion to the confi
b510: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  guration list */
b520: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
b530: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 0a  Configlist_add(.
b540: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
b550: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c  p,    /* The rul
b560: 65 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 20 20  e */.  int dot  
b570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
b580: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53  dex into the RHS
b590: 20 6f 66 20 74 68 65 20 72 75 6c 65 20 77 68 65   of the rule whe
b5a0: 72 65 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20  re the dot goes 
b5b0: 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 63  */.){.  struct c
b5c0: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65  onfig *cfp, mode
b5d0: 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  l;..  assert( cu
b5e0: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
b5f0: 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a   model.rp = rp;.
b600: 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f    model.dot = do
b610: 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  t;.  cfp = Confi
b620: 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64  gtable_find(&mod
b630: 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d  el);.  if( cfp==
b640: 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e  0 ){.    cfp = n
b650: 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20  ewconfig();.    
b660: 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20  cfp->rp = rp;.  
b670: 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74    cfp->dot = dot
b680: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d  ;.    cfp->fws =
b690: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63   SetNew();.    c
b6a0: 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20  fp->stp = 0;.   
b6b0: 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70   cfp->fplp = cfp
b6c0: 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20  ->bplp = 0;.    
b6d0: 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20  cfp->next = 0;. 
b6e0: 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a     cfp->bp = 0;.
b6f0: 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20      *currentend 
b700: 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65  = cfp;.    curre
b710: 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65  ntend = &cfp->ne
b720: 78 74 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61  xt;.    Configta
b730: 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b  ble_insert(cfp);
b740: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66  .  }.  return cf
b750: 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62  p;.}../* Add a b
b760: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
b770: 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67  on to the config
b780: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
b790: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
b7a0: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
b7b0: 69 73 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a  is(struct rule *
b7c0: 72 70 2c 20 69 6e 74 20 64 6f 74 29 0a 7b 0a 20  rp, int dot).{. 
b7d0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
b7e0: 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61  cfp, model;..  a
b7f0: 73 73 65 72 74 28 20 62 61 73 69 73 65 6e 64 21  ssert( basisend!
b800: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b810: 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b  currentend!=0 );
b820: 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70  .  model.rp = rp
b830: 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20  ;.  model.dot = 
b840: 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e  dot;.  cfp = Con
b850: 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d  figtable_find(&m
b860: 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70  odel);.  if( cfp
b870: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d  ==0 ){.    cfp =
b880: 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20   newconfig();.  
b890: 20 20 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a    cfp->rp = rp;.
b8a0: 20 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64      cfp->dot = d
b8b0: 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73  ot;.    cfp->fws
b8c0: 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20   = SetNew();.   
b8d0: 20 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20   cfp->stp = 0;. 
b8e0: 20 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63     cfp->fplp = c
b8f0: 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20  fp->bplp = 0;.  
b900: 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b    cfp->next = 0;
b910: 0a 20 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30  .    cfp->bp = 0
b920: 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e  ;.    *currenten
b930: 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72  d = cfp;.    cur
b940: 72 65 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e  rentend = &cfp->
b950: 6e 65 78 74 3b 0a 20 20 20 20 2a 62 61 73 69 73  next;.    *basis
b960: 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 62  end = cfp;.    b
b970: 61 73 69 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e  asisend = &cfp->
b980: 62 70 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61  bp;.    Configta
b990: 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b  ble_insert(cfp);
b9a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66  .  }.  return cf
b9b0: 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65  p;.}../* Compute
b9c0: 20 74 68 65 20 63 6c 6f 73 75 72 65 20 6f 66 20   the closure of 
b9d0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
b9e0: 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43  n list */.void C
b9f0: 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72  onfiglist_closur
ba00: 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  e(struct lemon *
ba10: 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74  lemp).{.  struct
ba20: 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6e   config *cfp, *n
ba30: 65 77 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20  ewcfp;.  struct 
ba40: 72 75 6c 65 20 2a 72 70 2c 20 2a 6e 65 77 72 70  rule *rp, *newrp
ba50: 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  ;.  struct symbo
ba60: 6c 20 2a 73 70 2c 20 2a 78 73 70 3b 0a 20 20 69  l *sp, *xsp;.  i
ba70: 6e 74 20 69 2c 20 64 6f 74 3b 0a 0a 20 20 61 73  nt i, dot;..  as
ba80: 73 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64  sert( currentend
ba90: 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 63 66 70  !=0 );.  for(cfp
baa0: 3d 63 75 72 72 65 6e 74 3b 20 63 66 70 3b 20 63  =current; cfp; c
bab0: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
bac0: 20 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b     rp = cfp->rp;
bad0: 0a 20 20 20 20 64 6f 74 20 3d 20 63 66 70 2d 3e  .    dot = cfp->
bae0: 64 6f 74 3b 0a 20 20 20 20 69 66 28 20 64 6f 74  dot;.    if( dot
baf0: 3e 3d 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e  >=rp->nrhs ) con
bb00: 74 69 6e 75 65 3b 0a 20 20 20 20 73 70 20 3d 20  tinue;.    sp = 
bb10: 72 70 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20 20  rp->rhs[dot];.  
bb20: 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
bb30: 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  NONTERMINAL ){. 
bb40: 20 20 20 20 20 69 66 28 20 73 70 2d 3e 72 75 6c       if( sp->rul
bb50: 65 3d 3d 30 20 26 26 20 73 70 21 3d 6c 65 6d 70  e==0 && sp!=lemp
bb60: 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20  ->errsym ){.    
bb70: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
bb80: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
bb90: 6c 69 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61  line,"Nontermina
bba0: 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 6e 6f 20  l \"%s\" has no 
bbb0: 72 75 6c 65 73 2e 22 2c 0a 20 20 20 20 20 20 20  rules.",.       
bbc0: 20 20 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20     sp->name);.  
bbd0: 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
bbe0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
bbf0: 20 20 20 20 20 20 66 6f 72 28 6e 65 77 72 70 3d        for(newrp=
bc00: 73 70 2d 3e 72 75 6c 65 3b 20 6e 65 77 72 70 3b  sp->rule; newrp;
bc10: 20 6e 65 77 72 70 3d 6e 65 77 72 70 2d 3e 6e 65   newrp=newrp->ne
bc20: 78 74 6c 68 73 29 7b 0a 20 20 20 20 20 20 20 20  xtlhs){.        
bc30: 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c  newcfp = Configl
bc40: 69 73 74 5f 61 64 64 28 6e 65 77 72 70 2c 30 29  ist_add(newrp,0)
bc50: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
bc60: 64 6f 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72 68  dot+1; i<rp->nrh
bc70: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
bc80: 20 20 20 78 73 70 20 3d 20 72 70 2d 3e 72 68 73     xsp = rp->rhs
bc90: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
bca0: 66 28 20 78 73 70 2d 3e 74 79 70 65 3d 3d 54 45  f( xsp->type==TE
bcb0: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
bcc0: 20 20 20 20 20 20 53 65 74 41 64 64 28 6e 65 77        SetAdd(new
bcd0: 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 69 6e  cfp->fws,xsp->in
bce0: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dex);.          
bcf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
bd00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 73 70     }else if( xsp
bd10: 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
bd20: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
bd30: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
bd40: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
bd50: 20 6b 3c 78 73 70 2d 3e 6e 73 75 62 73 79 6d 3b   k<xsp->nsubsym;
bd60: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   k++){.         
bd70: 20 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63       SetAdd(newc
bd80: 66 70 2d 3e 66 77 73 2c 20 78 73 70 2d 3e 73 75  fp->fws, xsp->su
bd90: 62 73 79 6d 5b 6b 5d 2d 3e 69 6e 64 65 78 29 3b  bsym[k]->index);
bda0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
bdb0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
bdc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
bdd0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  e{.            S
bde0: 65 74 55 6e 69 6f 6e 28 6e 65 77 63 66 70 2d 3e  etUnion(newcfp->
bdf0: 66 77 73 2c 78 73 70 2d 3e 66 69 72 73 74 73 65  fws,xsp->firstse
be00: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
be10: 69 66 28 20 78 73 70 2d 3e 6c 61 6d 62 64 61 3d  if( xsp->lambda=
be20: 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62  =LEMON_FALSE ) b
be30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
be40: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
be50: 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e      if( i==rp->n
be60: 72 68 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28  rhs ) Plink_add(
be70: 26 63 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66  &cfp->fplp,newcf
be80: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
be90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  }.  }.  return;.
bea0: 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 63  }../* Sort the c
beb0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
bec0: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
bed0: 6c 69 73 74 5f 73 6f 72 74 28 76 6f 69 64 29 7b  list_sort(void){
bee0: 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 28 73 74  .  current = (st
bef0: 72 75 63 74 20 63 6f 6e 66 69 67 2a 29 6d 73 6f  ruct config*)mso
bf00: 72 74 28 28 63 68 61 72 2a 29 63 75 72 72 65 6e  rt((char*)curren
bf10: 74 2c 28 63 68 61 72 2a 2a 29 26 28 63 75 72 72  t,(char**)&(curr
bf20: 65 6e 74 2d 3e 6e 65 78 74 29 2c 0a 20 20 20 20  ent->next),.    
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6f                Co
bf50: 6e 66 69 67 63 6d 70 29 3b 0a 20 20 63 75 72 72  nfigcmp);.  curr
bf60: 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65  entend = 0;.  re
bf70: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74  turn;.}../* Sort
bf80: 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69   the basis confi
bf90: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  guration list */
bfa0: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
bfb0: 5f 73 6f 72 74 62 61 73 69 73 28 76 6f 69 64 29  _sortbasis(void)
bfc0: 7b 0a 20 20 62 61 73 69 73 20 3d 20 28 73 74 72  {.  basis = (str
bfd0: 75 63 74 20 63 6f 6e 66 69 67 2a 29 6d 73 6f 72  uct config*)msor
bfe0: 74 28 28 63 68 61 72 2a 29 63 75 72 72 65 6e 74  t((char*)current
bff0: 2c 28 63 68 61 72 2a 2a 29 26 28 63 75 72 72 65  ,(char**)&(curre
c000: 6e 74 2d 3e 62 70 29 2c 0a 20 20 20 20 20 20 20  nt->bp),.       
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c020: 20 20 20 20 20 20 20 20 20 43 6f 6e 66 69 67 63           Configc
c030: 6d 70 29 3b 0a 20 20 62 61 73 69 73 65 6e 64 20  mp);.  basisend 
c040: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
c050: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
c060: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
c070: 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  d of the configu
c080: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a  ration list and.
c090: 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69 73  ** reset the lis
c0a0: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
c0b0: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72  ig *Configlist_r
c0c0: 65 74 75 72 6e 28 76 6f 69 64 29 7b 0a 20 20 73  eturn(void){.  s
c0d0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c  truct config *ol
c0e0: 64 3b 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72 65  d;.  old = curre
c0f0: 6e 74 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20  nt;.  current = 
c100: 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20  0;.  currentend 
c110: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c  = 0;.  return ol
c120: 64 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  d;.}../* Return 
c130: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
c140: 20 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e   head of the con
c150: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
c160: 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  and.** reset the
c170: 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20   list */.struct 
c180: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
c190: 73 74 5f 62 61 73 69 73 28 76 6f 69 64 29 7b 0a  st_basis(void){.
c1a0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
c1b0: 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 62 61  *old;.  old = ba
c1c0: 73 69 73 3b 0a 20 20 62 61 73 69 73 20 3d 20 30  sis;.  basis = 0
c1d0: 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 30  ;.  basisend = 0
c1e0: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a  ;.  return old;.
c1f0: 7d 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 65  }../* Free all e
c200: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 67  lements of the g
c210: 69 76 65 6e 20 63 6f 6e 66 69 67 75 72 61 74 69  iven configurati
c220: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20  on list */.void 
c230: 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 73  Configlist_eat(s
c240: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
c250: 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  p).{.  struct co
c260: 6e 66 69 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20  nfig *nextcfp;. 
c270: 20 66 6f 72 28 3b 20 63 66 70 3b 20 63 66 70 3d   for(; cfp; cfp=
c280: 6e 65 78 74 63 66 70 29 7b 0a 20 20 20 20 6e 65  nextcfp){.    ne
c290: 78 74 63 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78  xtcfp = cfp->nex
c2a0: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  t;.    assert( c
c2b0: 66 70 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20  fp->fplp==0 );. 
c2c0: 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e     assert( cfp->
c2d0: 62 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69  bplp==0 );.    i
c2e0: 66 28 20 63 66 70 2d 3e 66 77 73 20 29 20 53 65  f( cfp->fws ) Se
c2f0: 74 46 72 65 65 28 63 66 70 2d 3e 66 77 73 29 3b  tFree(cfp->fws);
c300: 0a 20 20 20 20 64 65 6c 65 74 65 63 6f 6e 66 69  .    deleteconfi
c310: 67 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65  g(cfp);.  }.  re
c320: 74 75 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  turn;.}./*******
c330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
c340: 74 68 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e  the file "error.
c350: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
c360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c370: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  ****/./*.** Code
c380: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 65 72   for printing er
c390: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
c3a0: 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63  .void ErrorMsg(c
c3b0: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
c3c0: 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c  ame, int lineno,
c3d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72   const char *for
c3e0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
c3f0: 6c 69 73 74 20 61 70 3b 0a 20 20 66 70 72 69 6e  list ap;.  fprin
c400: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
c410: 64 3a 20 22 2c 20 66 69 6c 65 6e 61 6d 65 2c 20  d: ", filename, 
c420: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 76 61 5f 73 74  lineno);.  va_st
c430: 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b  art(ap, format);
c440: 0a 20 20 76 66 70 72 69 6e 74 66 28 73 74 64 65  .  vfprintf(stde
c450: 72 72 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20  rr,format,ap);. 
c460: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66   va_end(ap);.  f
c470: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
c480: 5c 6e 22 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  \n");.}./*******
c490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
c4a0: 68 65 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22  he file "main.c"
c4b0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
c4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4d0: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69  *****/./*.** Mai
c4e0: 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c 65 20 66  n program file f
c4f0: 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  or the LEMON par
c500: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
c510: 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20  /../* Report an 
c520: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f  out-of-memory co
c530: 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72  ndition and abor
c540: 74 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  t.  This functio
c550: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f 73  n.** is used mos
c560: 74 6c 79 20 62 79 20 74 68 65 20 22 4d 65 6d 6f  tly by the "Memo
c570: 72 79 43 68 65 63 6b 22 20 6d 61 63 72 6f 20 69  ryCheck" macro i
c580: 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f  n struct.h.*/.vo
c590: 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  id memory_error(
c5a0: 76 6f 69 64 29 7b 0a 20 20 66 70 72 69 6e 74 66  void){.  fprintf
c5b0: 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20  (stderr,"Out of 
c5c0: 6d 65 6d 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e  memory.  Abortin
c5d0: 67 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74  g...\n");.  exit
c5e0: 28 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  (1);.}..static i
c5f0: 6e 74 20 6e 44 65 66 69 6e 65 20 3d 20 30 3b 20  nt nDefine = 0; 
c600: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c610: 66 20 2d 44 20 6f 70 74 69 6f 6e 73 20 6f 6e 20  f -D options on 
c620: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
c630: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
c640: 2a 2a 61 7a 44 65 66 69 6e 65 20 3d 20 30 3b 20  **azDefine = 0; 
c650: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
c660: 2d 44 20 6d 61 63 72 6f 73 20 2a 2f 0a 0a 2f 2a  -D macros */../*
c670: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c680: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
c690: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 65 61 63   argument to eac
c6a0: 68 20 2d 44 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  h -D command-lin
c6b0: 65 20 6f 70 74 69 6f 6e 2e 0a 2a 2a 20 41 64 64  e option..** Add
c6c0: 20 74 68 65 20 6d 61 63 72 6f 20 64 65 66 69 6e   the macro defin
c6d0: 65 64 20 74 6f 20 74 68 65 20 61 7a 44 65 66 69  ed to the azDefi
c6e0: 6e 65 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  ne array..*/.sta
c6f0: 74 69 63 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f  tic void handle_
c700: 44 5f 6f 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a  D_option(char *z
c710: 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 61 7a 3b  ){.  char **paz;
c720: 0a 20 20 6e 44 65 66 69 6e 65 2b 2b 3b 0a 20 20  .  nDefine++;.  
c730: 61 7a 44 65 66 69 6e 65 20 3d 20 28 63 68 61 72  azDefine = (char
c740: 20 2a 2a 29 20 72 65 61 6c 6c 6f 63 28 61 7a 44   **) realloc(azD
c750: 65 66 69 6e 65 2c 20 73 69 7a 65 6f 66 28 61 7a  efine, sizeof(az
c760: 44 65 66 69 6e 65 5b 30 5d 29 2a 6e 44 65 66 69  Define[0])*nDefi
c770: 6e 65 29 3b 0a 20 20 69 66 28 20 61 7a 44 65 66  ne);.  if( azDef
c780: 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  ine==0 ){.    fp
c790: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 75  rintf(stderr,"ou
c7a0: 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
c7b0: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
c7c0: 7d 0a 20 20 70 61 7a 20 3d 20 26 61 7a 44 65 66  }.  paz = &azDef
c7d0: 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 3b 0a  ine[nDefine-1];.
c7e0: 20 20 2a 70 61 7a 20 3d 20 28 63 68 61 72 20 2a    *paz = (char *
c7f0: 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53  ) malloc( lemonS
c800: 74 72 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20  trlen(z)+1 );.  
c810: 69 66 28 20 2a 70 61 7a 3d 3d 30 20 29 7b 0a 20  if( *paz==0 ){. 
c820: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
c830: 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"out of memory
c840: 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
c850: 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73  );.  }.  lemon_s
c860: 74 72 63 70 79 28 2a 70 61 7a 2c 20 7a 29 3b 0a  trcpy(*paz, z);.
c870: 20 20 66 6f 72 28 7a 3d 2a 70 61 7a 3b 20 2a 7a    for(z=*paz; *z
c880: 20 26 26 20 2a 7a 21 3d 27 3d 27 3b 20 7a 2b 2b   && *z!='='; z++
c890: 29 7b 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a  ){}.  *z = 0;.}.
c8a0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 73  .static char *us
c8b0: 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20  er_templatename 
c8c0: 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 76  = NULL;.static v
c8d0: 6f 69 64 20 68 61 6e 64 6c 65 5f 54 5f 6f 70 74  oid handle_T_opt
c8e0: 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  ion(char *z){.  
c8f0: 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
c900: 65 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c  e = (char *) mal
c910: 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  loc( lemonStrlen
c920: 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28 20 75  (z)+1 );.  if( u
c930: 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ser_templatename
c940: 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 6f 72  ==0 ){.    memor
c950: 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20  y_error();.  }. 
c960: 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 75 73   lemon_strcpy(us
c970: 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c  er_templatename,
c980: 20 7a 29 3b 0a 7d 0a 0a 2f 2a 20 4d 65 72 67 65   z);.}../* Merge
c990: 20 74 6f 67 65 74 68 65 72 20 74 6f 20 6c 69 73   together to lis
c9a0: 74 73 20 6f 66 20 72 75 6c 65 73 20 6f 72 64 65  ts of rules orde
c9b0: 72 65 64 20 62 79 20 72 75 6c 65 2e 69 52 75 6c  red by rule.iRul
c9c0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  e */.static stru
c9d0: 63 74 20 72 75 6c 65 20 2a 52 75 6c 65 5f 6d 65  ct rule *Rule_me
c9e0: 72 67 65 28 73 74 72 75 63 74 20 72 75 6c 65 20  rge(struct rule 
c9f0: 2a 70 41 2c 20 73 74 72 75 63 74 20 72 75 6c 65  *pA, struct rule
ca00: 20 2a 70 42 29 7b 0a 20 20 73 74 72 75 63 74 20   *pB){.  struct 
ca10: 72 75 6c 65 20 2a 70 46 69 72 73 74 20 3d 20 30  rule *pFirst = 0
ca20: 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
ca30: 2a 2a 70 70 50 72 65 76 20 3d 20 26 70 46 69 72  **ppPrev = &pFir
ca40: 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20  st;.  while( pA 
ca50: 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28  && pB ){.    if(
ca60: 20 70 41 2d 3e 69 52 75 6c 65 3c 70 42 2d 3e 69   pA->iRule<pB->i
ca70: 52 75 6c 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  Rule ){.      *p
ca80: 70 50 72 65 76 20 3d 20 70 41 3b 0a 20 20 20 20  pPrev = pA;.    
ca90: 20 20 70 70 50 72 65 76 20 3d 20 26 70 41 2d 3e    ppPrev = &pA->
caa0: 6e 65 78 74 3b 0a 20 20 20 20 20 20 70 41 20 3d  next;.      pA =
cab0: 20 70 41 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d   pA->next;.    }
cac0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50  else{.      *ppP
cad0: 72 65 76 20 3d 20 70 42 3b 0a 20 20 20 20 20 20  rev = pB;.      
cae0: 70 70 50 72 65 76 20 3d 20 26 70 42 2d 3e 6e 65  ppPrev = &pB->ne
caf0: 78 74 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70  xt;.      pB = p
cb00: 42 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  B->next;.    }. 
cb10: 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20   }.  if( pA ){. 
cb20: 20 20 20 2a 70 70 50 72 65 76 20 3d 20 70 41 3b     *ppPrev = pA;
cb30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
cb40: 70 50 72 65 76 20 3d 20 70 42 3b 0a 20 20 7d 0a  pPrev = pB;.  }.
cb50: 20 20 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b    return pFirst;
cb60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 61  .}../*.** Sort a
cb70: 20 6c 69 73 74 20 6f 66 20 72 75 6c 65 73 20 69   list of rules i
cb80: 6e 20 6f 72 64 65 72 20 6f 66 20 69 6e 63 72 65  n order of incre
cb90: 61 73 69 6e 67 20 69 52 75 6c 65 20 76 61 6c 75  asing iRule valu
cba0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  e.*/.static stru
cbb0: 63 74 20 72 75 6c 65 20 2a 52 75 6c 65 5f 73 6f  ct rule *Rule_so
cbc0: 72 74 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a  rt(struct rule *
cbd0: 72 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rp){.  int i;.  
cbe0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 4e 65  struct rule *pNe
cbf0: 78 74 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  xt;.  struct rul
cc00: 65 20 2a 78 5b 33 32 5d 3b 0a 20 20 6d 65 6d 73  e *x[32];.  mems
cc10: 65 74 28 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(x, 0, sizeof(
cc20: 78 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 70  x));.  while( rp
cc30: 20 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20   ){.    pNext = 
cc40: 72 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 72 70  rp->next;.    rp
cc50: 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ->next = 0;.    
cc60: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
cc70: 66 28 78 29 2f 73 69 7a 65 6f 66 28 78 5b 30 5d  f(x)/sizeof(x[0]
cc80: 29 20 26 26 20 78 5b 69 5d 3b 20 69 2b 2b 29 7b  ) && x[i]; i++){
cc90: 0a 20 20 20 20 20 20 72 70 20 3d 20 52 75 6c 65  .      rp = Rule
cca0: 5f 6d 65 72 67 65 28 78 5b 69 5d 2c 20 72 70 29  _merge(x[i], rp)
ccb0: 3b 0a 20 20 20 20 20 20 78 5b 69 5d 20 3d 20 30  ;.      x[i] = 0
ccc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 78 5b 69 5d  ;.    }.    x[i]
ccd0: 20 3d 20 72 70 3b 0a 20 20 20 20 72 70 20 3d 20   = rp;.    rp = 
cce0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 70 20  pNext;.  }.  rp 
ccf0: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
cd00: 69 3c 73 69 7a 65 6f 66 28 78 29 2f 73 69 7a 65  i<sizeof(x)/size
cd10: 6f 66 28 78 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  of(x[0]); i++){.
cd20: 20 20 20 20 72 70 20 3d 20 52 75 6c 65 5f 6d 65      rp = Rule_me
cd30: 72 67 65 28 78 5b 69 5d 2c 20 72 70 29 3b 0a 20  rge(x[i], rp);. 
cd40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 70 3b 0a   }.  return rp;.
cd50: 7d 0a 0a 2f 2a 20 66 6f 72 77 61 72 64 20 72 65  }../* forward re
cd60: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
cd70: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69  c const char *mi
cd80: 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28  nimum_size_type(
cd90: 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72  int lwr, int upr
cda0: 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 3b 0a  , int *pnByte);.
cdb0: 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  ./* Print a sing
cdc0: 6c 65 20 6c 69 6e 65 20 6f 66 20 74 68 65 20 22  le line of the "
cdd0: 50 61 72 73 65 72 20 53 74 61 74 73 22 20 6f 75  Parser Stats" ou
cde0: 74 70 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tput.*/.static v
cdf0: 6f 69 64 20 73 74 61 74 73 5f 6c 69 6e 65 28 63  oid stats_line(c
ce00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65  onst char *zLabe
ce10: 6c 2c 20 69 6e 74 20 69 56 61 6c 75 65 29 7b 0a  l, int iValue){.
ce20: 20 20 69 6e 74 20 6e 4c 61 62 65 6c 20 3d 20 6c    int nLabel = l
ce30: 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4c 61 62 65  emonStrlen(zLabe
ce40: 6c 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 20  l);.  printf("  
ce50: 25 73 25 2e 2a 73 20 25 35 64 5c 6e 22 2c 20 7a  %s%.*s %5d\n", z
ce60: 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  Label,.         
ce70: 33 35 2d 6e 4c 61 62 65 6c 2c 20 22 2e 2e 2e 2e  35-nLabel, "....
ce80: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
ce90: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 22 2c 0a 20  ............",. 
cea0: 20 20 20 20 20 20 20 20 69 56 61 6c 75 65 29 3b          iValue);
ceb0: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20  .}../* The main 
cec0: 70 72 6f 67 72 61 6d 2e 20 20 50 61 72 73 65 20  program.  Parse 
ced0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
cee0: 20 61 6e 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f   and do it... */
cef0: 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72  .int main(int ar
cf00: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
cf10: 0a 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  .{.  static int 
cf20: 76 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73  version = 0;.  s
cf30: 74 61 74 69 63 20 69 6e 74 20 72 70 66 6c 61 67  tatic int rpflag
cf40: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
cf50: 6e 74 20 62 61 73 69 73 66 6c 61 67 20 3d 20 30  nt basisflag = 0
cf60: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  ;.  static int c
cf70: 6f 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 73  ompress = 0;.  s
cf80: 74 61 74 69 63 20 69 6e 74 20 71 75 69 65 74 20  tatic int quiet 
cf90: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
cfa0: 74 20 73 74 61 74 69 73 74 69 63 73 20 3d 20 30  t statistics = 0
cfb0: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6d  ;.  static int m
cfc0: 68 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  hflag = 0;.  sta
cfd0: 74 69 63 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f  tic int nolineno
cfe0: 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  sflag = 0;.  sta
cff0: 74 69 63 20 69 6e 74 20 6e 6f 52 65 73 6f 72 74  tic int noResort
d000: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 73   = 0;.  static s
d010: 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20  truct s_options 
d020: 6f 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20  options[] = {.  
d030: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22    {OPT_FLAG, "b"
d040: 2c 20 28 63 68 61 72 2a 29 26 62 61 73 69 73 66  , (char*)&basisf
d050: 6c 61 67 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79  lag, "Print only
d060: 20 74 68 65 20 62 61 73 69 73 20 69 6e 20 72 65   the basis in re
d070: 70 6f 72 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  port."},.    {OP
d080: 54 5f 46 4c 41 47 2c 20 22 63 22 2c 20 28 63 68  T_FLAG, "c", (ch
d090: 61 72 2a 29 26 63 6f 6d 70 72 65 73 73 2c 20 22  ar*)&compress, "
d0a0: 44 6f 6e 27 74 20 63 6f 6d 70 72 65 73 73 20 74  Don't compress t
d0b0: 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e  he action table.
d0c0: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54  "},.    {OPT_FST
d0d0: 52 2c 20 22 44 22 2c 20 28 63 68 61 72 2a 29 68  R, "D", (char*)h
d0e0: 61 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20  andle_D_option, 
d0f0: 22 44 65 66 69 6e 65 20 61 6e 20 25 69 66 64 65  "Define an %ifde
d100: 66 20 6d 61 63 72 6f 2e 22 7d 2c 0a 20 20 20 20  f macro."},.    
d110: 7b 4f 50 54 5f 46 53 54 52 2c 20 22 66 22 2c 20  {OPT_FSTR, "f", 
d120: 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20 20 28 50  0, "Ignored.  (P
d130: 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 2d  laceholder for -
d140: 66 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f  f compiler optio
d150: 6e 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ns.)"},.    {OPT
d160: 5f 46 4c 41 47 2c 20 22 67 22 2c 20 28 63 68 61  _FLAG, "g", (cha
d170: 72 2a 29 26 72 70 66 6c 61 67 2c 20 22 50 72 69  r*)&rpflag, "Pri
d180: 6e 74 20 67 72 61 6d 6d 61 72 20 77 69 74 68 6f  nt grammar witho
d190: 75 74 20 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20  ut actions."},. 
d1a0: 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 49     {OPT_FSTR, "I
d1b0: 22 2c 20 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20  ", 0, "Ignored. 
d1c0: 20 28 50 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f   (Placeholder fo
d1d0: 72 20 27 2d 49 27 20 63 6f 6d 70 69 6c 65 72 20  r '-I' compiler 
d1e0: 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20  options.)"},.   
d1f0: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c   {OPT_FLAG, "m",
d200: 20 28 63 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c   (char*)&mhflag,
d210: 20 22 4f 75 74 70 75 74 20 61 20 6d 61 6b 65 68   "Output a makeh
d220: 65 61 64 65 72 73 20 63 6f 6d 70 61 74 69 62 6c  eaders compatibl
d230: 65 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b  e file."},.    {
d240: 4f 50 54 5f 46 4c 41 47 2c 20 22 6c 22 2c 20 28  OPT_FLAG, "l", (
d250: 63 68 61 72 2a 29 26 6e 6f 6c 69 6e 65 6e 6f 73  char*)&nolinenos
d260: 66 6c 61 67 2c 20 22 44 6f 20 6e 6f 74 20 70 72  flag, "Do not pr
d270: 69 6e 74 20 23 6c 69 6e 65 20 73 74 61 74 65 6d  int #line statem
d280: 65 6e 74 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  ents."},.    {OP
d290: 54 5f 46 53 54 52 2c 20 22 4f 22 2c 20 30 2c 20  T_FSTR, "O", 0, 
d2a0: 22 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63  "Ignored.  (Plac
d2b0: 65 68 6f 6c 64 65 72 20 66 6f 72 20 27 2d 4f 27  eholder for '-O'
d2c0: 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e   compiler option
d2d0: 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  s.)"},.    {OPT_
d2e0: 46 4c 41 47 2c 20 22 70 22 2c 20 28 63 68 61 72  FLAG, "p", (char
d2f0: 2a 29 26 73 68 6f 77 50 72 65 63 65 64 65 6e 63  *)&showPrecedenc
d300: 65 43 6f 6e 66 6c 69 63 74 2c 0a 20 20 20 20 20  eConflict,.     
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
d320: 53 68 6f 77 20 63 6f 6e 66 6c 69 63 74 73 20 72  Show conflicts r
d330: 65 73 6f 6c 76 65 64 20 62 79 20 70 72 65 63 65  esolved by prece
d340: 64 65 6e 63 65 20 72 75 6c 65 73 22 7d 2c 0a 20  dence rules"},. 
d350: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71     {OPT_FLAG, "q
d360: 22 2c 20 28 63 68 61 72 2a 29 26 71 75 69 65 74  ", (char*)&quiet
d370: 2c 20 22 28 51 75 69 65 74 29 20 44 6f 6e 27 74  , "(Quiet) Don't
d380: 20 70 72 69 6e 74 20 74 68 65 20 72 65 70 6f 72   print the repor
d390: 74 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b  t file."},.    {
d3a0: 4f 50 54 5f 46 4c 41 47 2c 20 22 72 22 2c 20 28  OPT_FLAG, "r", (
d3b0: 63 68 61 72 2a 29 26 6e 6f 52 65 73 6f 72 74 2c  char*)&noResort,
d3c0: 20 22 44 6f 20 6e 6f 74 20 73 6f 72 74 20 6f 72   "Do not sort or
d3d0: 20 72 65 6e 75 6d 62 65 72 20 73 74 61 74 65 73   renumber states
d3e0: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
d3f0: 47 2c 20 22 73 22 2c 20 28 63 68 61 72 2a 29 26  G, "s", (char*)&
d400: 73 74 61 74 69 73 74 69 63 73 2c 0a 20 20 20 20  statistics,.    
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
d430: 50 72 69 6e 74 20 70 61 72 73 65 72 20 73 74 61  Print parser sta
d440: 74 73 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f  ts to standard o
d450: 75 74 70 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f  utput."},.    {O
d460: 50 54 5f 46 4c 41 47 2c 20 22 78 22 2c 20 28 63  PT_FLAG, "x", (c
d470: 68 61 72 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22  har*)&version, "
d480: 50 72 69 6e 74 20 74 68 65 20 76 65 72 73 69 6f  Print the versio
d490: 6e 20 6e 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20  n number."},.   
d4a0: 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 54 22 2c   {OPT_FSTR, "T",
d4b0: 20 28 63 68 61 72 2a 29 68 61 6e 64 6c 65 5f 54   (char*)handle_T
d4c0: 5f 6f 70 74 69 6f 6e 2c 20 22 53 70 65 63 69 66  _option, "Specif
d4d0: 79 20 61 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  y a template fil
d4e0: 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  e."},.    {OPT_F
d4f0: 53 54 52 2c 20 22 57 22 2c 20 30 2c 20 22 49 67  STR, "W", 0, "Ig
d500: 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63 65 68 6f  nored.  (Placeho
d510: 6c 64 65 72 20 66 6f 72 20 27 2d 57 27 20 63 6f  lder for '-W' co
d520: 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29  mpiler options.)
d530: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
d540: 47 2c 30 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20  G,0,0,0}.  };.  
d550: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 69  int i;.  int exi
d560: 74 63 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20  tcode;.  struct 
d570: 6c 65 6d 6f 6e 20 6c 65 6d 3b 0a 20 20 73 74 72  lemon lem;.  str
d580: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20  uct rule *rp;.. 
d590: 20 4f 70 74 49 6e 69 74 28 61 72 67 76 2c 6f 70   OptInit(argv,op
d5a0: 74 69 6f 6e 73 2c 73 74 64 65 72 72 29 3b 0a 20  tions,stderr);. 
d5b0: 20 69 66 28 20 76 65 72 73 69 6f 6e 20 29 7b 0a   if( version ){.
d5c0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 4c 65 6d       printf("Lem
d5d0: 6f 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30 5c 6e  on version 1.0\n
d5e0: 22 29 3b 0a 20 20 20 20 20 65 78 69 74 28 30 29  ");.     exit(0)
d5f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4f 70 74 4e  ;.  }.  if( OptN
d600: 41 72 67 73 28 29 21 3d 31 20 29 7b 0a 20 20 20  Args()!=1 ){.   
d610: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
d620: 22 45 78 61 63 74 6c 79 20 6f 6e 65 20 66 69 6c  "Exactly one fil
d630: 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
d640: 73 20 72 65 71 75 69 72 65 64 2e 5c 6e 22 29 3b  s required.\n");
d650: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
d660: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6c 65 6d 2c  }.  memset(&lem,
d670: 20 30 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 29 29   0, sizeof(lem))
d680: 3b 0a 20 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74  ;.  lem.errorcnt
d690: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74   = 0;..  /* Init
d6a0: 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 63 68 69  ialize the machi
d6b0: 6e 65 20 2a 2f 0a 20 20 53 74 72 73 61 66 65 5f  ne */.  Strsafe_
d6c0: 69 6e 69 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c  init();.  Symbol
d6d0: 5f 69 6e 69 74 28 29 3b 0a 20 20 53 74 61 74 65  _init();.  State
d6e0: 5f 69 6e 69 74 28 29 3b 0a 20 20 6c 65 6d 2e 61  _init();.  lem.a
d6f0: 72 67 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a  rgv0 = argv[0];.
d700: 20 20 6c 65 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d    lem.filename =
d710: 20 4f 70 74 41 72 67 28 30 29 3b 0a 20 20 6c 65   OptArg(0);.  le
d720: 6d 2e 62 61 73 69 73 66 6c 61 67 20 3d 20 62 61  m.basisflag = ba
d730: 73 69 73 66 6c 61 67 3b 0a 20 20 6c 65 6d 2e 6e  sisflag;.  lem.n
d740: 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 3d 20 6e  olinenosflag = n
d750: 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 3b 0a 20 20  olinenosflag;.  
d760: 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 24 22 29 3b  Symbol_new("$");
d770: 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 20 3d 20  .  lem.errsym = 
d780: 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 65 72 72 6f  Symbol_new("erro
d790: 72 22 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79  r");.  lem.errsy
d7a0: 6d 2d 3e 75 73 65 43 6e 74 20 3d 20 30 3b 0a 0a  m->useCnt = 0;..
d7b0: 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 69    /* Parse the i
d7c0: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 50  nput file */.  P
d7d0: 61 72 73 65 28 26 6c 65 6d 29 3b 0a 20 20 69 66  arse(&lem);.  if
d7e0: 28 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 29  ( lem.errorcnt )
d7f0: 20 65 78 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63   exit(lem.errorc
d800: 6e 74 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 6e  nt);.  if( lem.n
d810: 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66  rule==0 ){.    f
d820: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
d830: 6d 70 74 79 20 67 72 61 6d 6d 61 72 2e 5c 6e 22  mpty grammar.\n"
d840: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
d850: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20    }..  /* Count 
d860: 61 6e 64 20 69 6e 64 65 78 20 74 68 65 20 73 79  and index the sy
d870: 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61  mbols of the gra
d880: 6d 6d 61 72 20 2a 2f 0a 20 20 53 79 6d 62 6f 6c  mmar */.  Symbol
d890: 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74 7d 22  _new("{default}"
d8a0: 29 3b 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c  );.  lem.nsymbol
d8b0: 20 3d 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28   = Symbol_count(
d8c0: 29 3b 0a 20 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73  );.  lem.symbols
d8d0: 20 3d 20 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f   = Symbol_arrayo
d8e0: 66 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  f();.  for(i=0; 
d8f0: 69 3c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69  i<lem.nsymbol; i
d900: 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b  ++) lem.symbols[
d910: 69 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20  i]->index = i;. 
d920: 20 71 73 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f   qsort(lem.symbo
d930: 6c 73 2c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2c 73  ls,lem.nsymbol,s
d940: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
d950: 62 6f 6c 2a 29 2c 20 53 79 6d 62 6f 6c 63 6d 70  bol*), Symbolcmp
d960: 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  p);.  for(i=0; i
d970: 3c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  <lem.nsymbol; i+
d980: 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69  +) lem.symbols[i
d990: 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20  ]->index = i;.  
d9a0: 77 68 69 6c 65 28 20 6c 65 6d 2e 73 79 6d 62 6f  while( lem.symbo
d9b0: 6c 73 5b 69 2d 31 5d 2d 3e 74 79 70 65 3d 3d 4d  ls[i-1]->type==M
d9c0: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 20  ULTITERMINAL ){ 
d9d0: 69 2d 2d 3b 20 7d 0a 20 20 61 73 73 65 72 74 28  i--; }.  assert(
d9e0: 20 73 74 72 63 6d 70 28 6c 65 6d 2e 73 79 6d 62   strcmp(lem.symb
d9f0: 6f 6c 73 5b 69 2d 31 5d 2d 3e 6e 61 6d 65 2c 22  ols[i-1]->name,"
da00: 7b 64 65 66 61 75 6c 74 7d 22 29 3d 3d 30 20 29  {default}")==0 )
da10: 3b 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20  ;.  lem.nsymbol 
da20: 3d 20 69 20 2d 20 31 3b 0a 20 20 66 6f 72 28 69  = i - 1;.  for(i
da30: 3d 31 3b 20 49 53 55 50 50 45 52 28 6c 65 6d 2e  =1; ISUPPER(lem.
da40: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65  symbols[i]->name
da50: 5b 30 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20 6c 65  [0]); i++);.  le
da60: 6d 2e 6e 74 65 72 6d 69 6e 61 6c 20 3d 20 69 3b  m.nterminal = i;
da70: 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 73 65  ..  /* Assign se
da80: 71 75 65 6e 74 69 61 6c 20 72 75 6c 65 20 6e 75  quential rule nu
da90: 6d 62 65 72 73 2e 20 20 53 74 61 72 74 20 77 69  mbers.  Start wi
daa0: 74 68 20 30 2e 20 20 50 75 74 20 72 75 6c 65 73  th 0.  Put rules
dab0: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 0a 20 20   that have no.  
dac0: 2a 2a 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e  ** reduce action
dad0: 20 43 2d 63 6f 64 65 20 61 73 73 6f 63 69 61 74   C-code associat
dae0: 65 64 20 77 69 74 68 20 74 68 65 6d 20 6c 61 73  ed with them las
daf0: 74 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 73  t, so that the s
db00: 77 69 74 63 68 28 29 0a 20 20 2a 2a 20 73 74 61  witch().  ** sta
db10: 74 65 6d 65 6e 74 20 74 68 61 74 20 73 65 6c 65  tement that sele
db20: 63 74 73 20 72 65 64 75 63 74 69 6f 6e 20 61 63  cts reduction ac
db30: 74 69 6f 6e 73 20 77 69 6c 6c 20 68 61 76 65 20  tions will have 
db40: 61 20 73 6d 61 6c 6c 65 72 20 6a 75 6d 70 20 74  a smaller jump t
db50: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  able..  */.  for
db60: 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 2e 72 75 6c  (i=0, rp=lem.rul
db70: 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
db80: 78 74 29 7b 0a 20 20 20 20 72 70 2d 3e 69 52 75  xt){.    rp->iRu
db90: 6c 65 20 3d 20 72 70 2d 3e 63 6f 64 65 20 3f 20  le = rp->code ? 
dba0: 69 2b 2b 20 3a 20 2d 31 3b 0a 20 20 7d 0a 20 20  i++ : -1;.  }.  
dbb0: 66 6f 72 28 72 70 3d 6c 65 6d 2e 72 75 6c 65 3b  for(rp=lem.rule;
dbc0: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
dbd0: 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 69  ){.    if( rp->i
dbe0: 52 75 6c 65 3c 30 20 29 20 72 70 2d 3e 69 52 75  Rule<0 ) rp->iRu
dbf0: 6c 65 20 3d 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20  le = i++;.  }.  
dc00: 6c 65 6d 2e 73 74 61 72 74 52 75 6c 65 20 3d 20  lem.startRule = 
dc10: 6c 65 6d 2e 72 75 6c 65 3b 0a 20 20 6c 65 6d 2e  lem.rule;.  lem.
dc20: 72 75 6c 65 20 3d 20 52 75 6c 65 5f 73 6f 72 74  rule = Rule_sort
dc30: 28 6c 65 6d 2e 72 75 6c 65 29 3b 0a 0a 20 20 2f  (lem.rule);..  /
dc40: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 72 65 70  * Generate a rep
dc50: 72 69 6e 74 20 6f 66 20 74 68 65 20 67 72 61 6d  rint of the gram
dc60: 6d 61 72 2c 20 69 66 20 72 65 71 75 65 73 74 65  mar, if requeste
dc70: 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  d on the command
dc80: 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72   line */.  if( r
dc90: 70 66 6c 61 67 20 29 7b 0a 20 20 20 20 52 65 70  pflag ){.    Rep
dca0: 72 69 6e 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65  rint(&lem);.  }e
dcb0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  lse{.    /* Init
dcc0: 69 61 6c 69 7a 65 20 74 68 65 20 73 69 7a 65 20  ialize the size 
dcd0: 66 6f 72 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61  for all follow a
dce0: 6e 64 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f  nd first sets */
dcf0: 0a 20 20 20 20 53 65 74 53 69 7a 65 28 6c 65 6d  .    SetSize(lem
dd00: 2e 6e 74 65 72 6d 69 6e 61 6c 2b 31 29 3b 0a 0a  .nterminal+1);..
dd10: 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
dd20: 70 72 65 63 65 64 65 6e 63 65 20 66 6f 72 20 65  precedence for e
dd30: 76 65 72 79 20 70 72 6f 64 75 63 74 69 6f 6e 20  very production 
dd40: 72 75 6c 65 20 28 74 68 61 74 20 68 61 73 20 6f  rule (that has o
dd50: 6e 65 29 20 2a 2f 0a 20 20 20 20 46 69 6e 64 52  ne) */.    FindR
dd60: 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28 26  ulePrecedences(&
dd70: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
dd80: 6d 70 75 74 65 20 74 68 65 20 6c 61 6d 62 64 61  mpute the lambda
dd90: 2d 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 61 6e  -nonterminals an
dda0: 64 20 74 68 65 20 66 69 72 73 74 2d 73 65 74 73  d the first-sets
ddb0: 20 66 6f 72 20 65 76 65 72 79 0a 20 20 20 20 2a   for every.    *
ddc0: 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f  * nonterminal */
ddd0: 0a 20 20 20 20 46 69 6e 64 46 69 72 73 74 53 65  .    FindFirstSe
dde0: 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  ts(&lem);..    /
ddf0: 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52  * Compute all LR
de00: 28 30 29 20 73 74 61 74 65 73 2e 20 20 41 6c 73  (0) states.  Als
de10: 6f 20 72 65 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d  o record follow-
de20: 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 0a  set propagation.
de30: 20 20 20 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20      ** links so 
de40: 74 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 2d  that the follow-
de50: 73 65 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 75  set can be compu
de60: 74 65 64 20 6c 61 74 65 72 20 2a 2f 0a 20 20 20  ted later */.   
de70: 20 6c 65 6d 2e 6e 73 74 61 74 65 20 3d 20 30 3b   lem.nstate = 0;
de80: 0a 20 20 20 20 46 69 6e 64 53 74 61 74 65 73 28  .    FindStates(
de90: 26 6c 65 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e 73  &lem);.    lem.s
dea0: 6f 72 74 65 64 20 3d 20 53 74 61 74 65 5f 61 72  orted = State_ar
deb0: 72 61 79 6f 66 28 29 3b 0a 0a 20 20 20 20 2f 2a  rayof();..    /*
dec0: 20 54 69 65 20 75 70 20 6c 6f 6f 73 65 20 65 6e   Tie up loose en
ded0: 64 73 20 6f 6e 20 74 68 65 20 70 72 6f 70 61 67  ds on the propag
dee0: 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20  ation links */. 
def0: 20 20 20 46 69 6e 64 4c 69 6e 6b 73 28 26 6c 65     FindLinks(&le
df00: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
df10: 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 20 73  ute the follow s
df20: 65 74 20 6f 66 20 65 76 65 72 79 20 72 65 64 75  et of every redu
df30: 63 69 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74  cible configurat
df40: 69 6f 6e 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46  ion */.    FindF
df50: 6f 6c 6c 6f 77 53 65 74 73 28 26 6c 65 6d 29 3b  ollowSets(&lem);
df60: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
df70: 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
df80: 65 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64 41 63  es */.    FindAc
df90: 74 69 6f 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  tions(&lem);..  
dfa0: 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 20 74 68    /* Compress th
dfb0: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20  e action tables 
dfc0: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 6d 70 72  */.    if( compr
dfd0: 65 73 73 3d 3d 30 20 29 20 43 6f 6d 70 72 65 73  ess==0 ) Compres
dfe0: 73 54 61 62 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a  sTables(&lem);..
dff0: 20 20 20 20 2f 2a 20 52 65 6f 72 64 65 72 20 61      /* Reorder a
e000: 6e 64 20 72 65 6e 75 6d 62 65 72 20 74 68 65 20  nd renumber the 
e010: 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 73  states so that s
e020: 74 61 74 65 73 20 77 69 74 68 20 66 65 77 65 72  tates with fewer
e030: 20 63 68 6f 69 63 65 73 0a 20 20 20 20 2a 2a 20   choices.    ** 
e040: 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64  occur at the end
e050: 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  .  This is an op
e060: 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20  timization that 
e070: 68 65 6c 70 73 20 6d 61 6b 65 20 74 68 65 0a 20  helps make the. 
e080: 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20     ** generated 
e090: 70 61 72 73 65 72 20 74 61 62 6c 65 73 20 73 6d  parser tables sm
e0a0: 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 69 66  aller. */.    if
e0b0: 28 20 6e 6f 52 65 73 6f 72 74 3d 3d 30 20 29 20  ( noResort==0 ) 
e0c0: 52 65 73 6f 72 74 53 74 61 74 65 73 28 26 6c 65  ResortStates(&le
e0d0: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  m);..    /* Gene
e0e0: 72 61 74 65 20 61 20 72 65 70 6f 72 74 20 6f 66  rate a report of
e0f0: 20 74 68 65 20 70 61 72 73 65 72 20 67 65 6e 65   the parser gene
e100: 72 61 74 65 64 2e 20 20 28 74 68 65 20 22 79 2e  rated.  (the "y.
e110: 6f 75 74 70 75 74 22 20 66 69 6c 65 29 20 2a 2f  output" file) */
e120: 0a 20 20 20 20 69 66 28 20 21 71 75 69 65 74 20  .    if( !quiet 
e130: 29 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 26  ) ReportOutput(&
e140: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  lem);..    /* Ge
e150: 6e 65 72 61 74 65 20 74 68 65 20 73 6f 75 72 63  nerate the sourc
e160: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70  e code for the p
e170: 61 72 73 65 72 20 2a 2f 0a 20 20 20 20 52 65 70  arser */.    Rep
e180: 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d 2c 20 6d  ortTable(&lem, m
e190: 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  hflag);..    /* 
e1a0: 50 72 6f 64 75 63 65 20 61 20 68 65 61 64 65 72  Produce a header
e1b0: 20 66 69 6c 65 20 66 6f 72 20 75 73 65 20 62 79   file for use by
e1c0: 20 74 68 65 20 73 63 61 6e 6e 65 72 2e 20 20 28   the scanner.  (
e1d0: 54 68 69 73 20 73 74 65 70 20 69 73 0a 20 20 20  This step is.   
e1e0: 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74   ** omitted if t
e1f0: 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20 69  he "-m" option i
e200: 73 20 75 73 65 64 20 62 65 63 61 75 73 65 20 6d  s used because m
e210: 61 6b 65 68 65 61 64 65 72 73 20 77 69 6c 6c 0a  akeheaders will.
e220: 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 20      ** generate 
e230: 74 68 65 20 66 69 6c 65 20 66 6f 72 20 75 73 2e  the file for us.
e240: 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 6d 68  ) */.    if( !mh
e250: 66 6c 61 67 20 29 20 52 65 70 6f 72 74 48 65 61  flag ) ReportHea
e260: 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20  der(&lem);.  }. 
e270: 20 69 66 28 20 73 74 61 74 69 73 74 69 63 73 20   if( statistics 
e280: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50  ){.    printf("P
e290: 61 72 73 65 72 20 73 74 61 74 69 73 74 69 63 73  arser statistics
e2a0: 3a 5c 6e 22 29 3b 0a 20 20 20 20 73 74 61 74 73  :\n");.    stats
e2b0: 5f 6c 69 6e 65 28 22 74 65 72 6d 69 6e 61 6c 20  _line("terminal 
e2c0: 73 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e 74  symbols", lem.nt
e2d0: 65 72 6d 69 6e 61 6c 29 3b 0a 20 20 20 20 73 74  erminal);.    st
e2e0: 61 74 73 5f 6c 69 6e 65 28 22 6e 6f 6e 2d 74 65  ats_line("non-te
e2f0: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 22 2c  rminal symbols",
e300: 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d 20 6c   lem.nsymbol - l
e310: 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 29 3b 0a 20  em.nterminal);. 
e320: 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 74     stats_line("t
e330: 6f 74 61 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c  otal symbols", l
e340: 65 6d 2e 6e 73 79 6d 62 6f 6c 29 3b 0a 20 20 20  em.nsymbol);.   
e350: 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 72 75 6c   stats_line("rul
e360: 65 73 22 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b  es", lem.nrule);
e370: 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28  .    stats_line(
e380: 22 73 74 61 74 65 73 22 2c 20 6c 65 6d 2e 6e 78  "states", lem.nx
e390: 73 74 61 74 65 29 3b 0a 20 20 20 20 73 74 61 74  state);.    stat
e3a0: 73 5f 6c 69 6e 65 28 22 63 6f 6e 66 6c 69 63 74  s_line("conflict
e3b0: 73 22 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63  s", lem.nconflic
e3c0: 74 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69  t);.    stats_li
e3d0: 6e 65 28 22 61 63 74 69 6f 6e 20 74 61 62 6c 65  ne("action table
e3e0: 20 65 6e 74 72 69 65 73 22 2c 20 6c 65 6d 2e 6e   entries", lem.n
e3f0: 61 63 74 69 6f 6e 74 61 62 29 3b 0a 20 20 20 20  actiontab);.    
e400: 73 74 61 74 73 5f 6c 69 6e 65 28 22 6c 6f 6f 6b  stats_line("look
e410: 61 68 65 61 64 20 74 61 62 6c 65 20 65 6e 74 72  ahead table entr
e420: 69 65 73 22 2c 20 6c 65 6d 2e 6e 6c 6f 6f 6b 61  ies", lem.nlooka
e430: 68 65 61 64 74 61 62 29 3b 0a 20 20 20 20 73 74  headtab);.    st
e440: 61 74 73 5f 6c 69 6e 65 28 22 74 6f 74 61 6c 20  ats_line("total 
e450: 74 61 62 6c 65 20 73 69 7a 65 20 28 62 79 74 65  table size (byte
e460: 73 29 22 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69  s)", lem.tablesi
e470: 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  ze);.  }.  if( l
e480: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e 20 30  em.nconflict > 0
e490: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
e4a0: 73 74 64 65 72 72 2c 22 25 64 20 70 61 72 73 69  stderr,"%d parsi
e4b0: 6e 67 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22  ng conflicts.\n"
e4c0: 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b  ,lem.nconflict);
e4d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 72 65 74 75 72  .  }..  /* retur
e4e0: 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  n 0 on success, 
e4f0: 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 2a 2f  1 on failure. */
e500: 0a 20 20 65 78 69 74 63 6f 64 65 20 3d 20 28 28  .  exitcode = ((
e510: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3e 20 30  lem.errorcnt > 0
e520: 29 20 7c 7c 20 28 6c 65 6d 2e 6e 63 6f 6e 66 6c  ) || (lem.nconfl
e530: 69 63 74 20 3e 20 30 29 29 20 3f 20 31 20 3a 20  ict > 0)) ? 1 : 
e540: 30 3b 0a 20 20 65 78 69 74 28 65 78 69 74 63 6f  0;.  exit(exitco
e550: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 65  de);.  return (e
e560: 78 69 74 63 6f 64 65 29 3b 0a 7d 0a 2f 2a 2a 2a  xitcode);.}./***
e570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e580: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
e590: 22 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  "msort.c" ******
e5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
e5c0: 20 41 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65   A generic merge
e5d0: 2d 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a  -sort program..*
e5e0: 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c  *.** USAGE:.** L
e5f0: 65 74 20 22 70 74 72 22 20 62 65 20 61 20 70 6f  et "ptr" be a po
e600: 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74  inter to some st
e610: 72 75 63 74 75 72 65 20 77 68 69 63 68 20 69 73  ructure which is
e620: 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a   at the head of.
e630: 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e  ** a null-termin
e640: 61 74 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e  ated list.  Then
e650: 20 74 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73   to sort the lis
e660: 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  t call:.**.**   
e670: 20 20 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74    ptr = msort(pt
e680: 72 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63  r,&(ptr->next),c
e690: 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e  mpfnc);.**.** In
e6a0: 20 74 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70   the above, "cmp
e6b0: 66 6e 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65  fnc" is a pointe
e6c0: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
e6d0: 77 68 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a  which compares.*
e6e0: 2a 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20  * two instances 
e6f0: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
e700: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20   and returns an 
e710: 69 6e 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a  integer, as in.*
e720: 2a 20 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73  * strcmp.  The s
e730: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
e740: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
e750: 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  he pointer to th
e760: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d  e.** second elem
e770: 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65  ent of the linke
e780: 64 20 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64  d list.  This ad
e790: 64 72 65 73 73 20 69 73 20 75 73 65 64 20 74 6f  dress is used to
e7a0: 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   compute.** the 
e7b0: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e  offset to the "n
e7c0: 65 78 74 22 20 66 69 65 6c 64 20 77 69 74 68 69  ext" field withi
e7d0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  n the structure.
e7e0: 20 20 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a    The offset to.
e7f0: 2a 2a 20 74 68 65 20 22 6e 65 78 74 22 20 66 69  ** the "next" fi
e800: 65 6c 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  eld must be cons
e810: 74 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72  tant for all str
e820: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c  uctures in the l
e830: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ist..**.** The f
e840: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
e850: 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68  a new pointer wh
e860: 69 63 68 20 69 73 20 74 68 65 20 68 65 61 64 20  ich is the head 
e870: 6f 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61  of the list.** a
e880: 66 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a  fter sorting..**
e890: 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a  .** ALGORITHM:.*
e8a0: 2a 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f  * Merge-sort..*/
e8b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
e8c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
e8d0: 6e 65 78 74 20 73 74 72 75 63 74 75 72 65 20 69  next structure i
e8e0: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
e8f0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45  t..*/.#define NE
e900: 58 54 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29  XT(A) (*(char**)
e910: 28 28 28 63 68 61 72 2a 29 41 29 2b 6f 66 66 73  (((char*)A)+offs
e920: 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75  et))../*.** Inpu
e930: 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20  ts:.**   a:     
e940: 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c    A sorted, null
e950: 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b  -terminated link
e960: 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62  ed list.  (May b
e970: 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a  e null)..**   b:
e980: 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c         A sorted,
e990: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
e9a0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28   linked list.  (
e9b0: 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a  May be null)..**
e9c0: 20 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70 6f     cmp:     A po
e9d0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6d  inter to the com
e9e0: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
e9f0: 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20 20  ..**   offset:  
ea00: 4f 66 66 73 65 74 20 69 6e 20 74 68 65 20 73 74  Offset in the st
ea10: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 22  ructure to the "
ea20: 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a  next" field..**.
ea30: 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a  ** Return Value:
ea40: 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20  .**   A pointer 
ea50: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  to the head of a
ea60: 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e   sorted list con
ea70: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d  taining the elem
ea80: 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74  ents.**   of bot
ea90: 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a  h a and b..**.**
eaa0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a   Side effects:.*
eab0: 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70  *   The "next" p
eac0: 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d  ointers for elem
ead0: 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ents in the list
eae0: 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a  s a and b are.**
eaf0: 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73     changed..*/.s
eb00: 74 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72 67  tatic char *merg
eb10: 65 28 0a 20 20 63 68 61 72 20 2a 61 2c 0a 20 20  e(.  char *a,.  
eb20: 63 68 61 72 20 2a 62 2c 0a 20 20 69 6e 74 20 28  char *b,.  int (
eb30: 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72  *cmp)(const char
eb40: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 0a  *,const char*),.
eb50: 20 20 69 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a    int offset.){.
eb60: 20 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68 65    char *ptr, *he
eb70: 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20  ad;..  if( a==0 
eb80: 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62 3b  ){.    head = b;
eb90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d  .  }else if( b==
eba0: 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20  0 ){.    head = 
ebb0: 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
ebc0: 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c  if( (*cmp)(a,b)<
ebd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20  =0 ){.      ptr 
ebe0: 3d 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e  = a;.      a = N
ebf0: 45 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73  EXT(a);.    }els
ec00: 65 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62  e{.      ptr = b
ec10: 3b 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54  ;.      b = NEXT
ec20: 28 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  (b);.    }.    h
ec30: 65 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77  ead = ptr;.    w
ec40: 68 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a  hile( a && b ){.
ec50: 20 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29        if( (*cmp)
ec60: 28 61 2c 62 29 3c 3d 30 20 29 7b 0a 20 20 20 20  (a,b)<=0 ){.    
ec70: 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20      NEXT(ptr) = 
ec80: 61 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d  a;.        ptr =
ec90: 20 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20   a;.        a = 
eca0: 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d  NEXT(a);.      }
ecb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45  else{.        NE
ecc0: 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20  XT(ptr) = b;.   
ecd0: 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20       ptr = b;.  
ece0: 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62        b = NEXT(b
ecf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ed00: 0a 20 20 20 20 69 66 28 20 61 20 29 20 4e 45 58  .    if( a ) NEX
ed10: 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20  T(ptr) = a;.    
ed20: 65 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74 72  else    NEXT(ptr
ed30: 29 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74  ) = b;.  }.  ret
ed40: 75 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a  urn head;.}../*.
ed50: 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20  ** Inputs:.**   
ed60: 6c 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74  list:      Point
ed70: 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c  er to a singly-l
ed80: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74  inked list of st
ed90: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e  ructures..**   n
eda0: 65 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65  ext:      Pointe
edb0: 72 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20  r to pointer to 
edc0: 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  the second eleme
edd0: 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a  nt of the list..
ede0: 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20  **   cmp:       
edf0: 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  A comparison fun
ee00: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ction..**.** Ret
ee10: 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20  urn Value:.**   
ee20: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
ee30: 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65   head of a sorte
ee40: 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  d list containin
ee50: 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a  g the elements.*
ee60: 2a 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e  *   orginally in
ee70: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64   list..**.** Sid
ee80: 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20  e effects:.**   
ee90: 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74  The "next" point
eea0: 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73  ers for elements
eeb0: 20 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61   in list are cha
eec0: 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  nged..*/.#define
eed0: 20 4c 49 53 54 53 49 5a 45 20 33 30 0a 73 74 61   LISTSIZE 30.sta
eee0: 74 69 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28  tic char *msort(
eef0: 0a 20 20 63 68 61 72 20 2a 6c 69 73 74 2c 0a 20  .  char *list,. 
ef00: 20 63 68 61 72 20 2a 2a 6e 65 78 74 2c 0a 20 20   char **next,.  
ef10: 69 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74  int (*cmp)(const
ef20: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
ef30: 72 2a 29 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  r*).){.  unsigne
ef40: 64 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20  d long offset;. 
ef50: 20 63 68 61 72 20 2a 65 70 3b 0a 20 20 63 68 61   char *ep;.  cha
ef60: 72 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d  r *set[LISTSIZE]
ef70: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66  ;.  int i;.  off
ef80: 73 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  set = (unsigned 
ef90: 6c 6f 6e 67 29 28 28 63 68 61 72 2a 29 6e 65 78  long)((char*)nex
efa0: 74 20 2d 20 28 63 68 61 72 2a 29 6c 69 73 74 29  t - (char*)list)
efb0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c  ;.  for(i=0; i<L
efc0: 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65  ISTSIZE; i++) se
efd0: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c  t[i] = 0;.  whil
efe0: 65 28 20 6c 69 73 74 20 29 7b 0a 20 20 20 20 65  e( list ){.    e
eff0: 70 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69  p = list;.    li
f000: 73 74 20 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b  st = NEXT(list);
f010: 0a 20 20 20 20 4e 45 58 54 28 65 70 29 20 3d 20  .    NEXT(ep) = 
f020: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
f030: 69 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26 26 20  i<LISTSIZE-1 && 
f040: 73 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b  set[i]!=0; i++){
f050: 0a 20 20 20 20 20 20 65 70 20 3d 20 6d 65 72 67  .      ep = merg
f060: 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c  e(ep,set[i],cmp,
f070: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  offset);.      s
f080: 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  et[i] = 0;.    }
f090: 0a 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 65 70  .    set[i] = ep
f0a0: 3b 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a  ;.  }.  ep = 0;.
f0b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53    for(i=0; i<LIS
f0c0: 54 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20  TSIZE; i++) if( 
f0d0: 73 65 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65  set[i] ) ep = me
f0e0: 72 67 65 28 73 65 74 5b 69 5d 2c 65 70 2c 63 6d  rge(set[i],ep,cm
f0f0: 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74  p,offset);.  ret
f100: 75 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn ep;.}./*****
f110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f120: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
f130: 65 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a  e "option.c" ***
f140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f150: 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20  *******/.static 
f160: 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61  char **argv;.sta
f170: 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74  tic struct s_opt
f180: 69 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63  ions *op;.static
f190: 20 46 49 4c 45 20 2a 65 72 72 73 74 72 65 61 6d   FILE *errstream
f1a0: 3b 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f 50 54  ;..#define ISOPT
f1b0: 28 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27  (X) ((X)[0]=='-'
f1c0: 7c 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73  ||(X)[0]=='+'||s
f1d0: 74 72 63 68 72 28 28 58 29 2c 27 3d 27 29 21 3d  trchr((X),'=')!=
f1e0: 30 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  0)../*.** Print 
f1f0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
f200: 20 77 69 74 68 20 61 20 63 61 72 72 6f 74 20 70   with a carrot p
f210: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6b  ointing to the k
f220: 2d 74 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  -th character.**
f230: 20 6f 66 20 74 68 65 20 6e 2d 74 68 20 66 69 65   of the n-th fie
f240: 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ld..*/.static vo
f250: 69 64 20 65 72 72 6c 69 6e 65 28 69 6e 74 20 6e  id errline(int n
f260: 2c 20 69 6e 74 20 6b 2c 20 46 49 4c 45 20 2a 65  , int k, FILE *e
f270: 72 72 29 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e  rr).{.  int spcn
f280: 74 2c 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76  t, i;.  if( argv
f290: 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72  [0] ) fprintf(er
f2a0: 72 2c 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b  r,"%s",argv[0]);
f2b0: 0a 20 20 73 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e  .  spcnt = lemon
f2c0: 53 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20  Strlen(argv[0]) 
f2d0: 2b 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  + 1;.  for(i=1; 
f2e0: 69 3c 6e 20 26 26 20 61 72 67 76 5b 69 5d 3b 20  i<n && argv[i]; 
f2f0: 69 2b 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  i++){.    fprint
f300: 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76  f(err," %s",argv
f310: 5b 69 5d 29 3b 0a 20 20 20 20 73 70 63 6e 74 20  [i]);.    spcnt 
f320: 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61  += lemonStrlen(a
f330: 72 67 76 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20  rgv[i])+1;.  }. 
f340: 20 73 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66   spcnt += k;.  f
f350: 6f 72 28 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b  or(; argv[i]; i+
f360: 2b 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22  +) fprintf(err,"
f370: 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20   %s",argv[i]);. 
f380: 20 69 66 28 20 73 70 63 6e 74 3c 32 30 20 29 7b   if( spcnt<20 ){
f390: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
f3a0: 2c 22 5c 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c  ,"\n%*s^-- here\
f3b0: 6e 22 2c 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20  n",spcnt,"");.  
f3c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
f3d0: 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72  tf(err,"\n%*sher
f3e0: 65 20 2d 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37  e --^\n",spcnt-7
f3f0: 2c 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ,"");.  }.}../*.
f400: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
f410: 64 65 78 20 6f 66 20 74 68 65 20 4e 2d 74 68 20  dex of the N-th 
f420: 6e 6f 6e 2d 73 77 69 74 63 68 20 61 72 67 75 6d  non-switch argum
f430: 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  ent.  Return -1.
f440: 2a 2a 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f  ** if N is out o
f450: 66 20 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74  f range..*/.stat
f460: 69 63 20 69 6e 74 20 61 72 67 69 6e 64 65 78 28  ic int argindex(
f470: 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69  int n).{.  int i
f480: 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68  ;.  int dashdash
f490: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76   = 0;.  if( argv
f4a0: 21 3d 30 20 26 26 20 2a 61 72 67 76 21 3d 30 20  !=0 && *argv!=0 
f4b0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
f4c0: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
f4d0: 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73       if( dashdas
f4e0: 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76  h || !ISOPT(argv
f4f0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
f500: 69 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72  if( n==0 ) retur
f510: 6e 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d  n i;.        n--
f520: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f530: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
f540: 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61  i],"--")==0 ) da
f550: 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20  shdash = 1;.    
f560: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  }.  }.  return -
f570: 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61  1;.}..static cha
f580: 72 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d  r emsg[] = "Comm
f590: 61 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20  and line syntax 
f5a0: 65 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a  error: ";../*.**
f5b0: 20 50 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20   Process a flag 
f5c0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67  command line arg
f5d0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
f5e0: 20 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73   int handleflags
f5f0: 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72  (int i, FILE *er
f600: 72 29 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20  r).{.  int v;.  
f610: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
f620: 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
f630: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
f640: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
f650: 74 72 6e 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b  trncmp(&argv[i][
f660: 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c  1],op[j].label,l
f670: 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d  emonStrlen(op[j]
f680: 2e 6c 61 62 65 6c 29 29 3d 3d 30 20 29 20 62 72  .label))==0 ) br
f690: 65 61 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61  eak;.  }.  v = a
f6a0: 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f  rgv[i][0]=='-' ?
f6b0: 20 31 20 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70   1 : 0;.  if( op
f6c0: 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a  [j].label==0 ){.
f6d0: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( 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 75 6e 64 65 66 69 6e 65 64 20 6f 70  ,"%sundefined op
f700: 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  tion.\n",emsg);.
f710: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
f720: 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  1,err);.    }.  
f730: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65    errcnt++;.  }e
f740: 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 61 72  lse if( op[j].ar
f750: 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
f760: 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f  gnore this optio
f770: 6e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  n */.  }else if(
f780: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
f790: 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a 28 28  _FLAG ){.    *((
f7a0: 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20  int*)op[j].arg) 
f7b0: 3d 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = v;.  }else if(
f7c0: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
f7d0: 5f 46 46 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a  _FFLAG ){.    (*
f7e0: 28 76 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f  (void(*)(int))(o
f7f0: 70 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20  p[j].arg))(v);. 
f800: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d   }else if( op[j]
f810: 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 53 54 52 20  .type==OPT_FSTR 
f820: 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a  ){.    (*(void(*
f830: 29 28 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d  )(char *))(op[j]
f840: 2e 61 72 67 29 29 28 26 61 72 67 76 5b 69 5d 5b  .arg))(&argv[i][
f850: 32 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  2]);.  }else{.  
f860: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
f870: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
f880: 25 73 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65  %smissing argume
f890: 6e 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c 6e 22  nt on switch.\n"
f8a0: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72  ,emsg);.      er
f8b0: 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a  rline(i,1,err);.
f8c0: 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74      }.    errcnt
f8d0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
f8e0: 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   errcnt;.}../*.*
f8f0: 2a 20 50 72 6f 63 65 73 73 20 61 20 63 6f 6d 6d  * Process a comm
f900: 61 6e 64 20 6c 69 6e 65 20 73 77 69 74 63 68 20  and line switch 
f910: 77 68 69 63 68 20 68 61 73 20 61 6e 20 61 72 67  which has an arg
f920: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
f930: 20 69 6e 74 20 68 61 6e 64 6c 65 73 77 69 74 63   int handleswitc
f940: 68 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65  h(int i, FILE *e
f950: 72 72 29 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d  rr).{.  int lv =
f960: 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64 76 20   0;.  double dv 
f970: 3d 20 30 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73  = 0.0;.  char *s
f980: 76 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63  v = 0, *end;.  c
f990: 68 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a  har *cp;.  int j
f9a0: 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  ;.  int errcnt =
f9b0: 20 30 3b 0a 20 20 63 70 20 3d 20 73 74 72 63 68   0;.  cp = strch
f9c0: 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a  r(argv[i],'=');.
f9d0: 20 20 61 73 73 65 72 74 28 20 63 70 21 3d 30 20    assert( cp!=0 
f9e0: 29 3b 0a 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20  );.  *cp = 0;.  
f9f0: 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c  for(j=0; op[j].l
fa00: 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  abel; j++){.    
fa10: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
fa20: 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d  i],op[j].label)=
fa30: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
fa40: 20 20 2a 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69    *cp = '=';.  i
fa50: 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d  f( op[j].label==
fa60: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72  0 ){.    if( err
fa70: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
fa80: 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e  f(err,"%sundefin
fa90: 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d  ed option.\n",em
faa0: 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69  sg);.      errli
fab0: 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20  ne(i,0,err);.   
fac0: 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b   }.    errcnt++;
fad0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70  .  }else{.    cp
fae0: 2b 2b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  ++;.    switch( 
faf0: 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[j].type ){.  
fb00: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
fb10: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
fb20: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
fb30: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
fb40: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
fb50: 72 2c 22 25 73 6f 70 74 69 6f 6e 20 72 65 71 75  r,"%soption requ
fb60: 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
fb70: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
fb80: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
fb90: 30 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  0,err);.        
fba0: 7d 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74  }.        errcnt
fbb0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
fbc0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
fbd0: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73  T_DBL:.      cas
fbe0: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
fbf0: 20 20 20 20 64 76 20 3d 20 73 74 72 74 6f 64 28      dv = strtod(
fc00: 63 70 2c 26 65 6e 64 29 3b 0a 20 20 20 20 20 20  cp,&end);.      
fc10: 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20    if( *end ){.  
fc20: 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20          if( err 
fc30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
fc40: 70 72 69 6e 74 66 28 65 72 72 2c 0a 20 20 20 20  printf(err,.    
fc50: 20 20 20 20 20 20 20 20 20 20 20 22 25 73 69 6c             "%sil
fc60: 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
fc70: 69 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  in floating-poin
fc80: 74 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65  t argument.\n",e
fc90: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
fca0: 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 69 6e 74    errline(i,(int
fcb0: 29 28 28 63 68 61 72 2a 29 65 6e 64 2d 28 63 68  )((char*)end-(ch
fcc0: 61 72 2a 29 61 72 67 76 5b 69 5d 29 2c 65 72 72  ar*)argv[i]),err
fcd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
fce0: 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b           errcnt+
fcf0: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
fd00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fd10: 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a    case OPT_INT:.
fd20: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
fd30: 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 76 20  INT:.        lv 
fd40: 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26 65 6e 64  = strtol(cp,&end
fd50: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,0);.        if(
fd60: 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20   *end ){.       
fd70: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
fd80: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
fd90: 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c  f(err,"%sillegal
fda0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 69 6e   character in in
fdb0: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 5c  teger argument.\
fdc0: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
fdd0: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
fde0: 28 69 6e 74 29 28 28 63 68 61 72 2a 29 65 6e 64  (int)((char*)end
fdf0: 2d 28 63 68 61 72 2a 29 61 72 67 76 5b 69 5d 29  -(char*)argv[i])
fe00: 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ,err);.         
fe10: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72   }.          err
fe20: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
fe30: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
fe40: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53        case OPT_S
fe50: 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  TR:.      case O
fe60: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
fe70: 20 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20 20   sv = cp;.      
fe80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
fe90: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d     switch( op[j]
fea0: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
feb0: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
fec0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
fed0: 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61  AG:.        brea
fee0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
fef0: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a  T_DBL:.        *
ff00: 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e  (double*)(op[j].
ff10: 61 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20 20  arg) = dv;.     
ff20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ff30: 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20  case OPT_FDBL:. 
ff40: 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a         (*(void(*
ff50: 29 28 64 6f 75 62 6c 65 29 29 28 6f 70 5b 6a 5d  )(double))(op[j]
ff60: 2e 61 72 67 29 29 28 64 76 29 3b 0a 20 20 20 20  .arg))(dv);.    
ff70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ff80: 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
ff90: 20 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 28 6f         *(int*)(o
ffa0: 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 6c 76 3b 0a  p[j].arg) = lv;.
ffb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ffc0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
ffd0: 4e 54 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76  NT:.        (*(v
ffe0: 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b  oid(*)(int))(op[
fff0: 6a 5d 2e 61 72 67 29 29 28 28 69 6e 74 29 6c 76  j].arg))((int)lv
10000 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
10010 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
10020 5f 53 54 52 3a 0a 20 20 20 20 20 20 20 20 2a 28  _STR:.        *(
10030 63 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72  char**)(op[j].ar
10040 67 29 20 3d 20 73 76 3b 0a 20 20 20 20 20 20 20  g) = sv;.       
10050 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
10060 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20  se OPT_FSTR:.   
10070 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28       (*(void(*)(
10080 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61  char *))(op[j].a
10090 72 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20 20  rg))(sv);.      
100a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
100b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
100c0 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e  nt;.}..int OptIn
100d0 69 74 28 63 68 61 72 20 2a 2a 61 2c 20 73 74 72  it(char **a, str
100e0 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f  uct s_options *o
100f0 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20  , FILE *err).{. 
10100 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b   int errcnt = 0;
10110 0a 20 20 61 72 67 76 20 3d 20 61 3b 0a 20 20 6f  .  argv = a;.  o
10120 70 20 3d 20 6f 3b 0a 20 20 65 72 72 73 74 72 65  p = o;.  errstre
10130 61 6d 20 3d 20 65 72 72 3b 0a 20 20 69 66 28 20  am = err;.  if( 
10140 61 72 67 76 20 26 26 20 2a 61 72 67 76 20 26 26  argv && *argv &&
10150 20 6f 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69   op ){.    int i
10160 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  ;.    for(i=1; a
10170 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
10180 20 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 5b      if( argv[i][
10190 30 5d 3d 3d 27 2b 27 20 7c 7c 20 61 72 67 76 5b  0]=='+' || argv[
101a0 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  i][0]=='-' ){.  
101b0 20 20 20 20 20 20 65 72 72 63 6e 74 20 2b 3d 20        errcnt += 
101c0 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72  handleflags(i,er
101d0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
101e0 69 66 28 20 73 74 72 63 68 72 28 61 72 67 76 5b  if( strchr(argv[
101f0 69 5d 2c 27 3d 27 29 20 29 7b 0a 20 20 20 20 20  i],'=') ){.     
10200 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e     errcnt += han
10210 64 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72 29  dleswitch(i,err)
10220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10230 20 20 7d 0a 20 20 69 66 28 20 65 72 72 63 6e 74    }.  if( errcnt
10240 3e 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  >0 ){.    fprint
10250 66 28 65 72 72 2c 22 56 61 6c 69 64 20 63 6f 6d  f(err,"Valid com
10260 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand line option
10270 73 20 66 6f 72 20 5c 22 25 73 5c 22 20 61 72 65  s for \"%s\" are
10280 3a 5c 6e 22 2c 2a 61 29 3b 0a 20 20 20 20 4f 70  :\n",*a);.    Op
10290 74 50 72 69 6e 74 28 29 3b 0a 20 20 20 20 65 78  tPrint();.    ex
102a0 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  it(1);.  }.  ret
102b0 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70  urn 0;.}..int Op
102c0 74 4e 41 72 67 73 28 76 6f 69 64 29 7b 0a 20 20  tNArgs(void){.  
102d0 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
102e0 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b  nt dashdash = 0;
102f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
10300 61 72 67 76 21 3d 30 20 26 26 20 61 72 67 76 5b  argv!=0 && argv[
10310 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  0]!=0 ){.    for
10320 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69  (i=1; argv[i]; i
10330 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64  ++){.      if( d
10340 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53 4f 50  ashdash || !ISOP
10350 54 28 61 72 67 76 5b 69 5d 29 20 29 20 63 6e 74  T(argv[i]) ) cnt
10360 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ++;.      if( st
10370 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d  rcmp(argv[i],"--
10380 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73 68  ")==0 ) dashdash
10390 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
103a0 20 20 72 65 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a    return cnt;.}.
103b0 0a 63 68 61 72 20 2a 4f 70 74 41 72 67 28 69 6e  .char *OptArg(in
103c0 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  t n).{.  int i;.
103d0 20 20 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e    i = argindex(n
103e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3e 3d 30  );.  return i>=0
103f0 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 30 3b 0a   ? argv[i] : 0;.
10400 7d 0a 0a 76 6f 69 64 20 4f 70 74 45 72 72 28 69  }..void OptErr(i
10410 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  nt n).{.  int i;
10420 0a 20 20 69 20 3d 20 61 72 67 69 6e 64 65 78 28  .  i = argindex(
10430 6e 29 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29  n);.  if( i>=0 )
10440 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72   errline(i,0,err
10450 73 74 72 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64  stream);.}..void
10460 20 4f 70 74 50 72 69 6e 74 28 76 6f 69 64 29 7b   OptPrint(void){
10470 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
10480 6d 61 78 2c 20 6c 65 6e 3b 0a 20 20 6d 61 78 20  max, len;.  max 
10490 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
104a0 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b  op[i].label; i++
104b0 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d  ){.    len = lem
104c0 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c  onStrlen(op[i].l
104d0 61 62 65 6c 29 20 2b 20 31 3b 0a 20 20 20 20 73  abel) + 1;.    s
104e0 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70  witch( op[i].typ
104f0 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
10500 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
10510 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
10520 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10530 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e       case OPT_IN
10540 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  T:.      case OP
10550 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20  T_FINT:.        
10560 6c 65 6e 20 2b 3d 20 39 3b 20 20 20 20 20 20 20  len += 9;       
10570 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 69  /* length of "<i
10580 6e 74 65 67 65 72 3e 22 20 2a 2f 0a 20 20 20 20  nteger>" */.    
10590 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
105a0 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20   case OPT_DBL:. 
105b0 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44       case OPT_FD
105c0 42 4c 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20  BL:.        len 
105d0 2b 3d 20 36 3b 20 20 20 20 20 20 20 2f 2a 20 6c  += 6;       /* l
105e0 65 6e 67 74 68 20 6f 66 20 22 3c 72 65 61 6c 3e  ength of "<real>
105f0 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  " */.        bre
10600 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
10610 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61  PT_STR:.      ca
10620 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20  se OPT_FSTR:.   
10630 20 20 20 20 20 6c 65 6e 20 2b 3d 20 38 3b 20 20       len += 8;  
10640 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
10650 66 20 22 3c 73 74 72 69 6e 67 3e 22 20 2a 2f 0a  f "<string>" */.
10660 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10670 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 65 6e     }.    if( len
10680 3e 6d 61 78 20 29 20 6d 61 78 20 3d 20 6c 65 6e  >max ) max = len
10690 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
106a0 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b   op[i].label; i+
106b0 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20  +){.    switch( 
106c0 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[i].type ){.  
106d0 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
106e0 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
106f0 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
10700 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65   fprintf(errstre
10710 61 6d 2c 22 20 20 2d 25 2d 2a 73 20 20 25 73 5c  am,"  -%-*s  %s\
10720 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c 61 62  n",max,op[i].lab
10730 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  el,op[i].message
10740 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
10750 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
10760 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65  _INT:.      case
10770 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20   OPT_FINT:.     
10780 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74     fprintf(errst
10790 72 65 61 6d 2c 22 20 20 2d 25 73 3c 69 6e 74 65  ream,"  -%s<inte
107a0 67 65 72 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f  ger>%*s  %s\n",o
107b0 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20  p[i].label,.    
107c0 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d        (int)(max-
107d0 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69  lemonStrlen(op[i
107e0 5d 2e 6c 61 62 65 6c 29 2d 39 29 2c 22 22 2c 6f  ].label)-9),"",o
107f0 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20  p[i].message);. 
10800 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10810 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
10820 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
10830 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 66  _FDBL:.        f
10840 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d  printf(errstream
10850 2c 22 20 20 2d 25 73 3c 72 65 61 6c 3e 25 2a 73  ,"  -%s<real>%*s
10860 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61    %s\n",op[i].la
10870 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  bel,.          (
10880 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74  int)(max-lemonSt
10890 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c  rlen(op[i].label
108a0 29 2d 36 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65  )-6),"",op[i].me
108b0 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
108c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
108d0 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20  e OPT_STR:.     
108e0 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a   case OPT_FSTR:.
108f0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
10900 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 73  errstream,"  -%s
10910 3c 73 74 72 69 6e 67 3e 25 2a 73 20 20 25 73 5c  <string>%*s  %s\
10920 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a  n",op[i].label,.
10930 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
10940 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  max-lemonStrlen(
10950 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38 29 2c  op[i].label)-8),
10960 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  "",op[i].message
10970 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
10980 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
10990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109a0 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
109b0 66 69 6c 65 20 22 70 61 72 73 65 2e 63 22 20 2a  file "parse.c" *
109c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
109e0 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65 20 70 61  ** Input file pa
109f0 72 73 65 72 20 66 6f 72 20 74 68 65 20 4c 45 4d  rser for the LEM
10a00 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
10a10 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68 65 20  tor..*/../* The 
10a20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72  state of the par
10a30 73 65 72 20 2a 2f 0a 65 6e 75 6d 20 65 5f 73 74  ser */.enum e_st
10a40 61 74 65 20 7b 0a 20 20 49 4e 49 54 49 41 4c 49  ate {.  INITIALI
10a50 5a 45 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  ZE,.  WAITING_FO
10a60 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a  R_DECL_OR_RULE,.
10a70 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45    WAITING_FOR_DE
10a80 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20 20 57 41  CL_KEYWORD,.  WA
10a90 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
10aa0 52 47 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  RG,.  WAITING_FO
10ab0 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
10ac0 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  BOL,.  WAITING_F
10ad0 4f 52 5f 41 52 52 4f 57 2c 0a 20 20 49 4e 5f 52  OR_ARROW,.  IN_R
10ae0 48 53 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f  HS,.  LHS_ALIAS_
10af0 31 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32  1,.  LHS_ALIAS_2
10b00 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c  ,.  LHS_ALIAS_3,
10b10 0a 20 20 52 48 53 5f 41 4c 49 41 53 5f 31 2c 0a  .  RHS_ALIAS_1,.
10b20 20 20 52 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20    RHS_ALIAS_2,. 
10b30 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
10b40 5f 31 2c 0a 20 20 50 52 45 43 45 44 45 4e 43 45  _1,.  PRECEDENCE
10b50 5f 4d 41 52 4b 5f 32 2c 0a 20 20 52 45 53 59 4e  _MARK_2,.  RESYN
10b60 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
10b70 4f 52 2c 0a 20 20 52 45 53 59 4e 43 5f 41 46 54  OR,.  RESYNC_AFT
10b80 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 2c 0a 20  ER_DECL_ERROR,. 
10b90 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53   WAITING_FOR_DES
10ba0 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a  TRUCTOR_SYMBOL,.
10bb0 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41    WAITING_FOR_DA
10bc0 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a 20  TATYPE_SYMBOL,. 
10bd0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c   WAITING_FOR_FAL
10be0 4c 42 41 43 4b 5f 49 44 2c 0a 20 20 57 41 49 54  LBACK_ID,.  WAIT
10bf0 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44  ING_FOR_WILDCARD
10c00 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  _ID,.  WAITING_F
10c10 4f 52 5f 43 4c 41 53 53 5f 49 44 2c 0a 20 20 57  OR_CLASS_ID,.  W
10c20 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53  AITING_FOR_CLASS
10c30 5f 54 4f 4b 45 4e 2c 0a 20 20 57 41 49 54 49 4e  _TOKEN,.  WAITIN
10c40 47 5f 46 4f 52 5f 54 4f 4b 45 4e 5f 4e 41 4d 45  G_FOR_TOKEN_NAME
10c50 0a 7d 3b 0a 73 74 72 75 63 74 20 70 73 74 61 74  .};.struct pstat
10c60 65 20 7b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65  e {.  char *file
10c70 6e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e  name;       /* N
10c80 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ame of the input
10c90 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74   file */.  int t
10ca0 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20  okenlineno;     
10cb0 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61   /* Linenumber a
10cc0 74 20 77 68 69 63 68 20 63 75 72 72 65 6e 74 20  t which current 
10cd0 74 6f 6b 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a  token starts */.
10ce0 20 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20    int errorcnt; 
10cf0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10d00 72 20 6f 66 20 65 72 72 6f 72 73 20 73 6f 20 66  r of errors so f
10d10 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  ar */.  char *to
10d20 6b 65 6e 73 74 61 72 74 3b 20 20 20 20 20 2f 2a  kenstart;     /*
10d30 20 54 65 78 74 20 6f 66 20 63 75 72 72 65 6e 74   Text of current
10d40 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75   token */.  stru
10d50 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20  ct lemon *gp;   
10d60 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74    /* Global stat
10d70 65 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e  e vector */.  en
10d80 75 6d 20 65 5f 73 74 61 74 65 20 73 74 61 74 65  um e_state state
10d90 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
10da0 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72  state of the par
10db0 73 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ser */.  struct 
10dc0 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b  symbol *fallback
10dd0 3b 20 20 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62  ;   /* The fallb
10de0 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73  ack token */.  s
10df0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 74 6b  truct symbol *tk
10e00 63 6c 61 73 73 3b 20 20 20 20 2f 2a 20 54 6f 6b  class;    /* Tok
10e10 65 6e 20 63 6c 61 73 73 20 73 79 6d 62 6f 6c 20  en class symbol 
10e20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
10e30 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 20 20  ol *lhs;        
10e40 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64  /* Left-hand sid
10e50 65 20 6f 66 20 63 75 72 72 65 6e 74 20 72 75 6c  e of current rul
10e60 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
10e70 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20  r *lhsalias;    
10e80 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74    /* Alias for t
10e90 68 65 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he LHS */.  int 
10ea0 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  nrhs;           
10eb0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10ec0 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 73   of right-hand s
10ed0 69 64 65 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e  ide symbols seen
10ee0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
10ef0 62 6f 6c 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d  bol *rhs[MAXRHS]
10f00 3b 20 20 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c  ;  /* RHS symbol
10f10 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
10f20 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d  r *alias[MAXRHS]
10f30 3b 20 2f 2a 20 41 6c 69 61 73 65 73 20 66 6f 72  ; /* Aliases for
10f40 20 65 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c   each RHS symbol
10f50 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
10f60 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 72 65  struct rule *pre
10f70 76 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72  vrule;     /* Pr
10f80 65 76 69 6f 75 73 20 72 75 6c 65 20 70 61 72 73  evious rule pars
10f90 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
10fa0 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b  ar *declkeyword;
10fb0 20 20 20 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66     /* Keyword of
10fc0 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a   a declaration *
10fd0 2f 0a 20 20 63 68 61 72 20 2a 2a 64 65 63 6c 61  /.  char **decla
10fe0 72 67 73 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f  rgslot;        /
10ff0 2a 20 57 68 65 72 65 20 74 68 65 20 64 65 63 6c  * Where the decl
11000 61 72 61 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  aration argument
11010 20 73 68 6f 75 6c 64 20 62 65 20 70 75 74 20 2a   should be put *
11020 2f 0a 20 20 69 6e 74 20 69 6e 73 65 72 74 4c 69  /.  int insertLi
11030 6e 65 4d 61 63 72 6f 3b 20 20 20 20 20 20 20 2f  neMacro;       /
11040 2a 20 41 64 64 20 23 6c 69 6e 65 20 62 65 66 6f  * Add #line befo
11050 72 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69  re declaration i
11060 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  nsert */.  int *
11070 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20  decllinenoslot; 
11080 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
11090 6f 20 77 72 69 74 65 20 64 65 63 6c 61 72 61 74  o write declarat
110a0 69 6f 6e 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ion line number 
110b0 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f  */.  enum e_asso
110c0 63 20 64 65 63 6c 61 73 73 6f 63 3b 20 20 20 20  c declassoc;    
110d0 2f 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20 61  /* Assign this a
110e0 73 73 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64 65  ssociation to de
110f0 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  cl arguments */.
11100 20 20 69 6e 74 20 70 72 65 63 63 6f 75 6e 74 65    int preccounte
11110 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
11120 41 73 73 69 67 6e 20 74 68 69 73 20 70 72 65 63  Assign this prec
11130 65 64 65 6e 63 65 20 74 6f 20 64 65 63 6c 20 61  edence to decl a
11140 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74  rguments */.  st
11150 72 75 63 74 20 72 75 6c 65 20 2a 66 69 72 73 74  ruct rule *first
11160 72 75 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e  rule;    /* Poin
11170 74 65 72 20 74 6f 20 66 69 72 73 74 20 72 75 6c  ter to first rul
11180 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72  e in the grammar
11190 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
111a0 65 20 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20 20  e *lastrule;    
111b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
111c0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
111d0 20 70 61 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a   parsed rule */.
111e0 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20 73  };../* Parse a s
111f0 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73  ingle token */.s
11200 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73 65  tatic void parse
11210 6f 6e 65 74 6f 6b 65 6e 28 73 74 72 75 63 74 20  onetoken(struct 
11220 70 73 74 61 74 65 20 2a 70 73 70 29 0a 7b 0a 20  pstate *psp).{. 
11230 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 3b 0a   const char *x;.
11240 20 20 78 20 3d 20 53 74 72 73 61 66 65 28 70 73    x = Strsafe(ps
11250 70 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20  p->tokenstart); 
11260 20 20 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20      /* Save the 
11270 74 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c  token permanentl
11280 79 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72 69  y */.#if 0.  pri
11290 6e 74 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65  ntf("%s:%d: Toke
112a0 6e 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25 64 5c  n=[%s] state=%d\
112b0 6e 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  n",psp->filename
112c0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
112d0 6f 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73 74  o,.    x,psp->st
112e0 61 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ate);.#endif.  s
112f0 77 69 74 63 68 28 20 70 73 70 2d 3e 73 74 61 74  witch( psp->stat
11300 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 49 4e  e ){.    case IN
11310 49 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20  ITIALIZE:.      
11320 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20  psp->prevrule = 
11330 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72  0;.      psp->pr
11340 65 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20  eccounter = 0;. 
11350 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72       psp->firstr
11360 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72  ule = psp->lastr
11370 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ule = 0;.      p
11380 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20  sp->gp->nrule = 
11390 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  0;.      /* Fall
113a0 20 74 68 72 75 20 74 6f 20 6e 65 78 74 20 63 61   thru to next ca
113b0 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 57  se */.    case W
113c0 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
113d0 4f 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20 69  OR_RULE:.      i
113e0 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a  f( x[0]=='%' ){.
113f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11400 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
11410 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20  _DECL_KEYWORD;. 
11420 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49       }else if( I
11430 53 4c 4f 57 45 52 28 78 5b 30 5d 29 20 29 7b 0a  SLOWER(x[0]) ){.
11440 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
11450 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
11460 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e  ;.        psp->n
11470 72 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rhs = 0;.       
11480 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d   psp->lhsalias =
11490 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
114a0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
114b0 5f 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20  _FOR_ARROW;.    
114c0 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
114d0 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='{' ){.       
114e0 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75   if( psp->prevru
114f0 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
11500 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
11510 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
11520 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65  okenlineno,."The
11530 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72  re is no prior r
11540 75 6c 65 20 75 70 6f 6e 20 77 68 69 63 68 20 74  ule upon which t
11550 6f 20 61 74 74 61 63 68 20 74 68 65 20 63 6f 64  o attach the cod
11560 65 20 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68 69  e \.fragment whi
11570 63 68 20 62 65 67 69 6e 73 20 6f 6e 20 74 68 69  ch begins on thi
11580 73 20 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20  s line.");.     
11590 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
115a0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  nt++;.        }e
115b0 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65  lse if( psp->pre
115c0 76 72 75 6c 65 2d 3e 63 6f 64 65 21 3d 30 20 29  vrule->code!=0 )
115d0 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
115e0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
115f0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
11600 65 6e 6f 2c 0a 22 43 6f 64 65 20 66 72 61 67 6d  eno,."Code fragm
11610 65 6e 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f 6e  ent beginning on
11620 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
11630 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f  t the first \.to
11640 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76   follow the prev
11650 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20  ious rule.");.  
11660 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11670 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
11680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11690 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d    psp->prevrule-
116a0 3e 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b  >line = psp->tok
116b0 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  enlineno;.      
116c0 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c      psp->prevrul
116d0 65 2d 3e 63 6f 64 65 20 3d 20 26 78 5b 31 5d 3b  e->code = &x[1];
116e0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
116f0 70 72 65 76 72 75 6c 65 2d 3e 6e 6f 43 6f 64 65  prevrule->noCode
11700 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
11710 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11720 78 5b 30 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20  x[0]=='[' ){.   
11730 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11740 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52  = PRECEDENCE_MAR
11750 4b 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  K_1;.      }else
11760 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
11770 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11780 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11790 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54 6f  o,.          "To
117a0 6b 65 6e 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c  ken \"%s\" shoul
117b0 64 20 62 65 20 65 69 74 68 65 72 20 5c 22 25 25  d be either \"%%
117c0 5c 22 20 6f 72 20 61 20 6e 6f 6e 74 65 72 6d 69  \" or a nontermi
117d0 6e 61 6c 20 6e 61 6d 65 2e 22 2c 0a 20 20 20 20  nal name.",.    
117e0 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20        x);.      
117f0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11800 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
11810 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
11820 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
11830 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 21 49  _1:.      if( !I
11840 53 55 50 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a  SUPPER(x[0]) ){.
11850 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11860 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11870 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11880 0a 20 20 20 20 20 20 20 20 20 20 22 54 68 65 20  .          "The 
11890 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f  precedence symbo
118a0 6c 20 6d 75 73 74 20 62 65 20 61 20 74 65 72 6d  l must be a term
118b0 69 6e 61 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20  inal.");.       
118c0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
118d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
118e0 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d  ( psp->prevrule=
118f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  =0 ){.        Er
11900 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
11910 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
11920 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
11930 20 22 54 68 65 72 65 20 69 73 20 6e 6f 20 70 72   "There is no pr
11940 69 6f 72 20 72 75 6c 65 20 74 6f 20 61 73 73 69  ior rule to assi
11950 67 6e 20 70 72 65 63 65 64 65 6e 63 65 20 5c 22  gn precedence \"
11960 5b 25 73 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20 20  [%s]\".",x);.   
11970 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11980 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
11990 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72  e if( psp->prevr
119a0 75 6c 65 2d 3e 70 72 65 63 73 79 6d 21 3d 30 20  ule->precsym!=0 
119b0 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
119c0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
119d0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
119e0 6e 6f 2c 0a 22 50 72 65 63 65 64 65 6e 63 65 20  no,."Precedence 
119f0 6d 61 72 6b 20 6f 6e 20 74 68 69 73 20 6c 69 6e  mark on this lin
11a00 65 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72  e is not the fir
11a10 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74  st \.to follow t
11a20 68 65 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65  he previous rule
11a30 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  .");.        psp
11a40 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
11a50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11a60 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
11a70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 53 79 6d 62  ->precsym = Symb
11a80 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
11a90 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74   }.      psp->st
11aa0 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e 43 45  ate = PRECEDENCE
11ab0 5f 4d 41 52 4b 5f 32 3b 0a 20 20 20 20 20 20 62  _MARK_2;.      b
11ac0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50  reak;.    case P
11ad0 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32  RECEDENCE_MARK_2
11ae0 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
11af0 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  !=']' ){.       
11b00 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
11b10 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
11b20 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
11b30 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 5d      "Missing \"]
11b40 5c 22 20 6f 6e 20 70 72 65 63 65 64 65 6e 63 65  \" on precedence
11b50 20 6d 61 72 6b 2e 22 29 3b 0a 20 20 20 20 20 20   mark.");.      
11b60 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11b70 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
11b80 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
11b90 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
11ba0 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 62 72  R_RULE;.      br
11bb0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
11bc0 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3a  ITING_FOR_ARROW:
11bd0 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
11be0 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a  =':' && x[1]==':
11bf0 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29  ' && x[2]=='=' )
11c00 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
11c10 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20  tate = IN_RHS;. 
11c20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
11c30 5b 30 5d 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20  [0]=='(' ){.    
11c40 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
11c50 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20   LHS_ALIAS_1;.  
11c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11c70 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
11c80 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
11c90 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
11ca0 20 20 20 20 20 20 22 45 78 70 65 63 74 65 64 20        "Expected 
11cb0 74 6f 20 73 65 65 20 61 20 5c 22 3a 5c 22 20 66  to see a \":\" f
11cc0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4c 48 53  ollowing the LHS
11cd0 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e 22   symbol \"%s\"."
11ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ,.          psp-
11cf0 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  >lhs->name);.   
11d00 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11d10 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
11d20 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11d30 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
11d40 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
11d50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11d60 65 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20  e LHS_ALIAS_1:. 
11d70 20 20 20 20 20 69 66 28 20 49 53 41 4c 50 48 41       if( ISALPHA
11d80 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
11d90 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20    psp->lhsalias 
11da0 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = x;.        psp
11db0 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c  ->state = LHS_AL
11dc0 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_2;.      }el
11dd0 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
11de0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
11df0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
11e00 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
11e10 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20  \"%s\" is not a 
11e20 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72 20  valid alias for 
11e30 74 68 65 20 4c 48 53 20 5c 22 25 73 5c 22 5c 6e  the LHS \"%s\"\n
11e40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70  ",.          x,p
11e50 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a  sp->lhs->name);.
11e60 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11e70 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
11e80 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
11e90 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
11ea0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
11eb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11ec0 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 32  case LHS_ALIAS_2
11ed0 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
11ee0 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20  ==')' ){.       
11ef0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48   psp->state = LH
11f00 53 5f 41 4c 49 41 53 5f 33 3b 0a 20 20 20 20 20  S_ALIAS_3;.     
11f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11f20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
11f30 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
11f40 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
11f50 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c     "Missing \")\
11f60 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20  " following LHS 
11f70 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c  alias name \"%s\
11f80 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61  ".",psp->lhsalia
11f90 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  s);.        psp-
11fa0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11fb0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11fc0 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
11fd0 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
11fe0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
11ff0 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49      case LHS_ALI
12000 41 53 5f 33 3a 0a 20 20 20 20 20 20 69 66 28 20  AS_3:.      if( 
12010 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31  x[0]==':' && x[1
12020 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d  ]==':' && x[2]==
12030 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '=' ){.        p
12040 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52  sp->state = IN_R
12050 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  HS;.      }else{
12060 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
12070 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
12080 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
12090 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
120a0 73 69 6e 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c  sing \"->\" foll
120b0 6f 77 69 6e 67 3a 20 5c 22 25 73 28 25 73 29 5c  owing: \"%s(%s)\
120c0 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ".",.           
120d0 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70  psp->lhs->name,p
120e0 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20  sp->lhsalias);. 
120f0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
12100 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
12110 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
12120 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
12130 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
12140 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
12150 61 73 65 20 49 4e 5f 52 48 53 3a 0a 20 20 20 20  ase IN_RHS:.    
12160 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
12170 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
12180 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 20 20  t rule *rp;.    
12190 20 20 20 20 72 70 20 3d 20 28 73 74 72 75 63 74      rp = (struct
121a0 20 72 75 6c 65 20 2a 29 63 61 6c 6c 6f 63 28 20   rule *)calloc( 
121b0 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 72 75  sizeof(struct ru
121c0 6c 65 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20  le) +.          
121d0 20 20 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74     sizeof(struct
121e0 20 73 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e   symbol*)*psp->n
121f0 72 68 73 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  rhs + sizeof(cha
12200 72 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 2c 20 31  r*)*psp->nrhs, 1
12210 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
12220 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p==0 ){.        
12230 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
12240 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
12250 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
12260 20 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 6c         "Can't al
12270 6c 6f 63 61 74 65 20 65 6e 6f 75 67 68 20 6d 65  locate enough me
12280 6d 6f 72 79 20 66 6f 72 20 74 68 69 73 20 72 75  mory for this ru
12290 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  le.");.         
122a0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
122b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
122c0 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20  >prevrule = 0;. 
122d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
122e0 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
122f0 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 75 6c           rp->rul
12300 65 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b  eline = psp->tok
12310 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  enlineno;.      
12320 20 20 20 20 72 70 2d 3e 72 68 73 20 3d 20 28 73      rp->rhs = (s
12330 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 2a 29 26  truct symbol**)&
12340 72 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  rp[1];.         
12350 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 20 3d 20   rp->rhsalias = 
12360 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 28  (const char**)&(
12370 72 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68  rp->rhs[psp->nrh
12380 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  s]);.          f
12390 6f 72 28 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e  or(i=0; i<psp->n
123a0 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
123b0 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69         rp->rhs[i
123c0 5d 20 3d 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b  ] = psp->rhs[i];
123d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d  .            rp-
123e0 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70  >rhsalias[i] = p
123f0 73 70 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a 20 20  sp->alias[i];.  
12400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12410 20 20 20 20 72 70 2d 3e 6c 68 73 20 3d 20 70 73      rp->lhs = ps
12420 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 20 20  p->lhs;.        
12430 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d    rp->lhsalias =
12440 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a   psp->lhsalias;.
12450 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 72            rp->nr
12460 68 73 20 3d 20 70 73 70 2d 3e 6e 72 68 73 3b 0a  hs = psp->nrhs;.
12470 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 63 6f            rp->co
12480 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
12490 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 31    rp->noCode = 1
124a0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
124b0 70 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20  precsym = 0;.   
124c0 20 20 20 20 20 20 20 72 70 2d 3e 69 6e 64 65 78         rp->index
124d0 20 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c   = psp->gp->nrul
124e0 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e++;.          r
124f0 70 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d  p->nextlhs = rp-
12500 3e 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20  >lhs->rule;.    
12510 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72        rp->lhs->r
12520 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20  ule = rp;.      
12530 20 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30      rp->next = 0
12540 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
12550 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d  psp->firstrule==
12560 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
12570 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20   psp->firstrule 
12580 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20  = psp->lastrule 
12590 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20  = rp;.          
125a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
125b0 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65     psp->lastrule
125c0 2d 3e 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20 20  ->next = rp;.   
125d0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61           psp->la
125e0 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20  strule = rp;.   
125f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12600 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
12610 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 7d   = rp;.        }
12620 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
12630 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
12640 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
12650 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12660 49 53 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b  ISALPHA(x[0]) ){
12670 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70  .        if( psp
12680 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20 29  ->nrhs>=MAXRHS )
12690 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
126a0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
126b0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
126c0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
126d0 20 22 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62 6f   "Too many symbo
126e0 6c 73 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c  ls on RHS of rul
126f0 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 5c  e beginning at \
12700 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20  "%s\".",.       
12710 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20       x);.       
12720 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
12730 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
12740 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
12750 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
12760 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OR;.        }els
12770 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  e{.          psp
12780 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  ->rhs[psp->nrhs]
12790 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
127a0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
127b0 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73  >alias[psp->nrhs
127c0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
127d0 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 20 20   psp->nrhs++;.  
127e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
127f0 6c 73 65 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27  lse if( (x[0]=='
12800 7c 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29  |' || x[0]=='/')
12810 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20   && psp->nrhs>0 
12820 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
12830 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20  t symbol *msp = 
12840 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72  psp->rhs[psp->nr
12850 68 73 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  hs-1];.        i
12860 66 28 20 6d 73 70 2d 3e 74 79 70 65 21 3d 4d 55  f( msp->type!=MU
12870 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
12880 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
12890 73 79 6d 62 6f 6c 20 2a 6f 72 69 67 73 70 20 3d  symbol *origsp =
128a0 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20   msp;.          
128b0 6d 73 70 20 3d 20 28 73 74 72 75 63 74 20 73 79  msp = (struct sy
128c0 6d 62 6f 6c 20 2a 29 20 63 61 6c 6c 6f 63 28 31  mbol *) calloc(1
128d0 2c 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a  ,sizeof(*msp));.
128e0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
128f0 28 6d 73 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (msp, 0, sizeof(
12900 2a 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20  *msp));.        
12910 20 20 6d 73 70 2d 3e 74 79 70 65 20 3d 20 4d 55    msp->type = MU
12920 4c 54 49 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20  LTITERMINAL;.   
12930 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62         msp->nsub
12940 73 79 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sym = 1;.       
12950 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d     msp->subsym =
12960 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20   (struct symbol 
12970 2a 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a  **) calloc(1,siz
12980 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
12990 6c 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l*));.          
129a0 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 20 3d  msp->subsym[0] =
129b0 20 6f 72 69 67 73 70 3b 0a 20 20 20 20 20 20 20   origsp;.       
129c0 20 20 20 6d 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f     msp->name = o
129d0 72 69 67 73 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20  rigsp->name;.   
129e0 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b         psp->rhs[
129f0 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d  psp->nrhs-1] = m
12a00 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sp;.        }.  
12a10 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73        msp->nsubs
12a20 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73  ym++;.        ms
12a30 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74 72  p->subsym = (str
12a40 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72  uct symbol **) r
12a50 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73  ealloc(msp->subs
12a60 79 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 73 69  ym,.          si
12a70 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
12a80 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79  ol*)*msp->nsubsy
12a90 6d 29 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d  m);.        msp-
12aa0 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75  >subsym[msp->nsu
12ab0 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c  bsym-1] = Symbol
12ac0 5f 6e 65 77 28 26 78 5b 31 5d 29 3b 0a 20 20 20  _new(&x[1]);.   
12ad0 20 20 20 20 20 69 66 28 20 49 53 4c 4f 57 45 52       if( ISLOWER
12ae0 28 78 5b 31 5d 29 20 7c 7c 20 49 53 4c 4f 57 45  (x[1]) || ISLOWE
12af0 52 28 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d  R(msp->subsym[0]
12b00 2d 3e 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20  ->name[0]) ){.  
12b10 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
12b20 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
12b30 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
12b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61  .            "Ca
12b50 6e 6e 6f 74 20 66 6f 72 6d 20 61 20 63 6f 6d 70  nnot form a comp
12b60 6f 75 6e 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ound containing 
12b70 61 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 22 29  a non-terminal")
12b80 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12b90 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
12ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
12bb0 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27  se if( x[0]=='('
12bc0 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20   && psp->nrhs>0 
12bd0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
12be0 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41  state = RHS_ALIA
12bf0 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_1;.      }else
12c00 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
12c10 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
12c20 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
12c30 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c  o,.          "Il
12c40 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
12c50 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 3a 20  on RHS of rule: 
12c60 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20  \"%s\".",x);.   
12c70 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
12c80 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
12c90 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
12ca0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
12cb0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
12cc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
12cd0 65 20 52 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20  e RHS_ALIAS_1:. 
12ce0 20 20 20 20 20 69 66 28 20 49 53 41 4c 50 48 41       if( ISALPHA
12cf0 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
12d00 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70    psp->alias[psp
12d10 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20  ->nrhs-1] = x;. 
12d20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12d30 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b  e = RHS_ALIAS_2;
12d40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12d50 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
12d60 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
12d70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
12d80 20 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22           "\"%s\"
12d90 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
12da0 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 48  alias for the RH
12db0 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c  S symbol \"%s\"\
12dc0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c  n",.          x,
12dd0 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72  psp->rhs[psp->nr
12de0 68 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  hs-1]->name);.  
12df0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
12e00 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
12e10 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
12e20 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
12e30 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
12e40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
12e50 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a  se RHS_ALIAS_2:.
12e60 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
12e70 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ')' ){.        p
12e80 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52  sp->state = IN_R
12e90 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  HS;.      }else{
12ea0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
12eb0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
12ec0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
12ed0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
12ee0 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f  sing \")\" follo
12ef0 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e  wing LHS alias n
12f00 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70  ame \"%s\".",psp
12f10 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
12f20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
12f30 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
12f40 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
12f50 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
12f60 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
12f70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
12f80 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  e WAITING_FOR_DE
12f90 43 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20  CL_KEYWORD:.    
12fa0 20 20 69 66 28 20 49 53 41 4c 50 48 41 28 78 5b    if( ISALPHA(x[
12fb0 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
12fc0 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20  sp->declkeyword 
12fd0 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = x;.        psp
12fe0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
12ff0 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
13000 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d  decllinenoslot =
13010 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
13020 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
13030 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73   = 1;.        ps
13040 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
13050 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b  NG_FOR_DECL_ARG;
13060 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
13070 63 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30  cmp(x,"name")==0
13080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
13090 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
130a0 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65   &(psp->gp->name
130b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
130c0 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
130d0 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  o = 0;.        }
130e0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
130f0 78 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20  x,"include")==0 
13100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
13110 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
13120 26 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75  &(psp->gp->inclu
13130 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  de);.        }el
13140 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
13150 22 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20  "code")==0 ){.  
13160 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
13170 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
13180 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 29  ->gp->extracode)
13190 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
131a0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f  if( strcmp(x,"to
131b0 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72 22 29  ken_destructor")
131c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
131d0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
131e0 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f  t = &psp->gp->to
131f0 6b 65 6e 64 65 73 74 3b 0a 20 20 20 20 20 20 20  kendest;.       
13200 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13210 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 64 65 73  p(x,"default_des
13220 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a  tructor")==0 ){.
13230 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
13240 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73  eclargslot = &ps
13250 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b 0a  p->gp->vardest;.
13260 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
13270 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
13280 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30 20 29 7b  n_prefix")==0 ){
13290 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
132a0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70  declargslot = &p
132b0 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65  sp->gp->tokenpre
132c0 66 69 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70  fix;.          p
132d0 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
132e0 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
132f0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13300 70 28 78 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f  p(x,"syntax_erro
13310 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
13320 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
13330 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
13340 2d 3e 65 72 72 6f 72 29 3b 0a 20 20 20 20 20 20  ->error);.      
13350 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
13360 6d 70 28 78 2c 22 70 61 72 73 65 5f 61 63 63 65  mp(x,"parse_acce
13370 70 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pt")==0 ){.     
13380 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
13390 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
133a0 70 2d 3e 61 63 63 65 70 74 29 3b 0a 20 20 20 20  p->accept);.    
133b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
133c0 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 66 61  rcmp(x,"parse_fa
133d0 69 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ilure")==0 ){.  
133e0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
133f0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
13400 2d 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a  ->gp->failure);.
13410 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
13420 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63  ( strcmp(x,"stac
13430 6b 5f 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20  k_overflow")==0 
13440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
13450 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
13460 26 28 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66  &(psp->gp->overf
13470 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  low);.        }e
13480 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
13490 2c 22 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74  ,"extra_argument
134a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
134b0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
134c0 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
134d0 3e 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20  >arg);.         
134e0 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
134f0 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Macro = 0;.     
13500 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
13510 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70  cmp(x,"token_typ
13520 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
13530 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
13540 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
13550 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20  ->tokentype);.  
13560 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
13570 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30  ertLineMacro = 0
13580 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
13590 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65  if( strcmp(x,"de
135a0 66 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20  fault_type")==0 
135b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
135c0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
135d0 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79  &(psp->gp->varty
135e0 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pe);.          p
135f0 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
13600 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
13610 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13620 70 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22  p(x,"stack_size"
13630 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
13640 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
13650 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
13660 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20  stacksize);.    
13670 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
13680 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a  tLineMacro = 0;.
13690 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
136a0 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 72  ( strcmp(x,"star
136b0 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b  t_symbol")==0 ){
136c0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
136d0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
136e0 70 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b  psp->gp->start);
136f0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13700 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
13710 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
13720 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
13730 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20  "left")==0 ){.  
13740 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
13750 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
13760 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
13770 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20  ssoc = LEFT;.   
13780 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13790 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
137a0 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
137b0 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
137c0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 72   if( strcmp(x,"r
137d0 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ight")==0 ){.   
137e0 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63         psp->prec
137f0 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20  counter++;.     
13800 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73       psp->declas
13810 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20 20 20  soc = RIGHT;.   
13820 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
13830 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
13840 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
13850 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
13860 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e   if( strcmp(x,"n
13870 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a  onassoc")==0 ){.
13880 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
13890 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  reccounter++;.  
138a0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
138b0 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20  lassoc = NONE;. 
138c0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
138d0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
138e0 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
138f0 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  BOL;.        }el
13900 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
13910 22 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30  "destructor")==0
13920 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
13930 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
13940 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f  NG_FOR_DESTRUCTO
13950 52 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20  R_SYMBOL;.      
13960 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
13970 6d 70 28 78 2c 22 74 79 70 65 22 29 3d 3d 30 20  mp(x,"type")==0 
13980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
13990 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
139a0 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
139b0 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
139c0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
139d0 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30  x,"fallback")==0
139e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
139f0 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  p->fallback = 0;
13a00 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13a10 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
13a20 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b  FOR_FALLBACK_ID;
13a30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
13a40 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b  f( strcmp(x,"tok
13a50 65 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  en")==0 ){.     
13a60 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
13a70 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 54 4f  = WAITING_FOR_TO
13a80 4b 45 4e 5f 4e 41 4d 45 3b 0a 20 20 20 20 20 20  KEN_NAME;.      
13a90 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
13aa0 6d 70 28 78 2c 22 77 69 6c 64 63 61 72 64 22 29  mp(x,"wildcard")
13ab0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13ac0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
13ad0 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41  ITING_FOR_WILDCA
13ae0 52 44 5f 49 44 3b 0a 20 20 20 20 20 20 20 20 7d  RD_ID;.        }
13af0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13b00 78 2c 22 74 6f 6b 65 6e 5f 63 6c 61 73 73 22 29  x,"token_class")
13b10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13b20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
13b30 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f  ITING_FOR_CLASS_
13b40 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ID;.        }els
13b50 65 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  e{.          Err
13b60 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
13b70 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
13b80 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
13b90 20 20 22 55 6e 6b 6e 6f 77 6e 20 64 65 63 6c 61    "Unknown decla
13ba0 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20  ration keyword: 
13bb0 5c 22 25 25 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  \"%%%s\".",x);. 
13bc0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
13bd0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
13be0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
13bf0 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
13c00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
13c10 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
13c20 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
13c30 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
13c40 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
13c50 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c  ,.          "Ill
13c60 65 67 61 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e  egal declaration
13c70 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22   keyword: \"%s\"
13c80 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  .",x);.        p
13c90 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
13ca0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
13cb0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
13cc0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
13cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
13ce0 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
13cf0 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54  ING_FOR_DESTRUCT
13d00 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20  OR_SYMBOL:.     
13d10 20 69 66 28 20 21 49 53 41 4c 50 48 41 28 78 5b   if( !ISALPHA(x[
13d20 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
13d30 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
13d40 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
13d50 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
13d60 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d    "Symbol name m
13d70 69 73 73 69 6e 67 20 61 66 74 65 72 20 25 25 64  issing after %%d
13d80 65 73 74 72 75 63 74 6f 72 20 6b 65 79 77 6f 72  estructor keywor
13d90 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  d");.        psp
13da0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
13db0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
13dc0 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
13dd0 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20  DECL_ERROR;.    
13de0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13df0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
13e00 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
13e10 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
13e20 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
13e30 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a  sp->destructor;.
13e40 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
13e50 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20 26 73  llinenoslot = &s
13e60 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 3b 0a 20  p->destLineno;. 
13e70 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
13e80 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 31 3b  rtLineMacro = 1;
13e90 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
13ea0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
13eb0 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20  R_DECL_ARG;.    
13ec0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
13ed0 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
13ee0 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
13ef0 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28  YMBOL:.      if(
13f00 20 21 49 53 41 4c 50 48 41 28 78 5b 30 5d 29 20   !ISALPHA(x[0]) 
13f10 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
13f20 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
13f30 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
13f40 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53  no,.          "S
13f50 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69  ymbol name missi
13f60 6e 67 20 61 66 74 65 72 20 25 25 74 79 70 65 20  ng after %%type 
13f70 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20 20  keyword");.     
13f80 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
13f90 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
13fa0 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
13fb0 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
13fc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13fd0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
13fe0 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f  mbol *sp = Symbo
13ff0 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20 20 20 20  l_find(x);.     
14000 20 20 20 69 66 28 28 73 70 29 20 26 26 20 28 73     if((sp) && (s
14010 70 2d 3e 64 61 74 61 74 79 70 65 29 29 7b 0a 20  p->datatype)){. 
14020 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
14030 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
14040 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
14050 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53  ,.            "S
14060 79 6d 62 6f 6c 20 25 25 74 79 70 65 20 5c 22 25  ymbol %%type \"%
14070 73 5c 22 20 61 6c 72 65 61 64 79 20 64 65 66 69  s\" already defi
14080 6e 65 64 22 2c 20 78 29 3b 0a 20 20 20 20 20 20  ned", x);.      
14090 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
140a0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t++;.          p
140b0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
140c0 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
140d0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ROR;.        }el
140e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
140f0 20 28 21 73 70 29 7b 0a 20 20 20 20 20 20 20 20   (!sp){.        
14100 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f      sp = Symbol_
14110 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
14120 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 73    }.          ps
14130 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
14140 20 26 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a   &sp->datatype;.
14150 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69            psp->i
14160 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
14170 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73   0;.          ps
14180 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
14190 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b  NG_FOR_DECL_ARG;
141a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
141b0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
141c0 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
141d0 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f  _FOR_PRECEDENCE_
141e0 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66  SYMBOL:.      if
141f0 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
14200 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
14210 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
14220 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
14230 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53      }else if( IS
14240 55 50 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20  UPPER(x[0]) ){. 
14250 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
14260 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 20 20 20 20  mbol *sp;.      
14270 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65    sp = Symbol_ne
14280 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  w(x);.        if
14290 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b  ( sp->prec>=0 ){
142a0 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
142b0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
142c0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
142d0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
142e0 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 68  "Symbol \"%s\" h
142f0 61 73 20 61 6c 72 65 61 64 79 20 62 65 20 67 69  as already be gi
14300 76 65 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65  ven a precedence
14310 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20  .",x);.         
14320 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
14330 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
14340 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 70  .          sp->p
14350 72 65 63 20 3d 20 70 73 70 2d 3e 70 72 65 63 63  rec = psp->precc
14360 6f 75 6e 74 65 72 3b 0a 20 20 20 20 20 20 20 20  ounter;.        
14370 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73    sp->assoc = ps
14380 70 2d 3e 64 65 63 6c 61 73 73 6f 63 3b 0a 20 20  p->declassoc;.  
14390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
143a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
143b0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
143c0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
143d0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
143e0 22 43 61 6e 27 74 20 61 73 73 69 67 6e 20 61 20  "Can't assign a 
143f0 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20 5c 22  precedence to \"
14400 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  %s\".",x);.     
14410 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
14420 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
14430 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
14440 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  e WAITING_FOR_DE
14450 43 4c 5f 41 52 47 3a 0a 20 20 20 20 20 20 69 66  CL_ARG:.      if
14460 28 20 78 5b 30 5d 3d 3d 27 7b 27 20 7c 7c 20 78  ( x[0]=='{' || x
14470 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20 49 53 41  [0]=='\"' || ISA
14480 4c 4e 55 4d 28 78 5b 30 5d 29 20 29 7b 0a 20 20  LNUM(x[0]) ){.  
14490 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
144a0 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e 65 77 3b 0a 20   *zOld, *zNew;. 
144b0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75         char *zBu
144c0 66 2c 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 69  f, *z;.        i
144d0 6e 74 20 6e 4f 6c 64 2c 20 6e 2c 20 6e 4c 69 6e  nt nOld, n, nLin
144e0 65 20 3d 20 30 2c 20 6e 4e 65 77 2c 20 6e 42 61  e = 0, nNew, nBa
144f0 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ck;.        int 
14500 61 64 64 4c 69 6e 65 4d 61 63 72 6f 3b 0a 20 20  addLineMacro;.  
14510 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65        char zLine
14520 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4e  [50];.        zN
14530 65 77 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  ew = x;.        
14540 69 66 28 20 7a 4e 65 77 5b 30 5d 3d 3d 27 22 27  if( zNew[0]=='"'
14550 20 7c 7c 20 7a 4e 65 77 5b 30 5d 3d 3d 27 7b 27   || zNew[0]=='{'
14560 20 29 20 7a 4e 65 77 2b 2b 3b 0a 20 20 20 20 20   ) zNew++;.     
14570 20 20 20 6e 4e 65 77 20 3d 20 6c 65 6d 6f 6e 53     nNew = lemonS
14580 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a 20 20 20  trlen(zNew);.   
14590 20 20 20 20 20 69 66 28 20 2a 70 73 70 2d 3e 64       if( *psp->d
145a0 65 63 6c 61 72 67 73 6c 6f 74 20 29 7b 0a 20 20  eclargslot ){.  
145b0 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20 2a          zOld = *
145c0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
145d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
145e0 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20  .          zOld 
145f0 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = "";.        }.
14600 20 20 20 20 20 20 20 20 6e 4f 6c 64 20 3d 20 6c          nOld = l
14610 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f 6c 64 29  emonStrlen(zOld)
14620 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 4f  ;.        n = nO
14630 6c 64 20 2b 20 6e 4e 65 77 20 2b 20 32 30 3b 0a  ld + nNew + 20;.
14640 20 20 20 20 20 20 20 20 61 64 64 4c 69 6e 65 4d          addLineM
14650 61 63 72 6f 20 3d 20 21 70 73 70 2d 3e 67 70 2d  acro = !psp->gp-
14660 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 26  >nolinenosflag &
14670 26 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e  & psp->insertLin
14680 65 4d 61 63 72 6f 20 26 26 0a 20 20 20 20 20 20  eMacro &&.      
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 20 20 28 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65    (psp->declline
146b0 6e 6f 73 6c 6f 74 3d 3d 30 20 7c 7c 20 70 73 70  noslot==0 || psp
146c0 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74  ->decllinenoslot
146d0 5b 30 5d 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  [0]!=0);.       
146e0 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61 63 72   if( addLineMacr
146f0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  o ){.          f
14700 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e 61  or(z=psp->filena
14710 6d 65 2c 20 6e 42 61 63 6b 3d 30 3b 20 2a 7a 3b  me, nBack=0; *z;
14720 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   z++){.         
14730 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20     if( *z=='\\' 
14740 29 20 6e 42 61 63 6b 2b 2b 3b 0a 20 20 20 20 20  ) nBack++;.     
14750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14760 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a   lemon_sprintf(z
14770 4c 69 6e 65 2c 20 22 23 6c 69 6e 65 20 25 64 20  Line, "#line %d 
14780 22 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  ", psp->tokenlin
14790 65 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eno);.          
147a0 6e 4c 69 6e 65 20 3d 20 6c 65 6d 6f 6e 53 74 72  nLine = lemonStr
147b0 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  len(zLine);.    
147c0 20 20 20 20 20 20 6e 20 2b 3d 20 6e 4c 69 6e 65        n += nLine
147d0 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70   + lemonStrlen(p
147e0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b 20  sp->filename) + 
147f0 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nBack;.        }
14800 0a 20 20 20 20 20 20 20 20 2a 70 73 70 2d 3e 64  .        *psp->d
14810 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 28 63 68  eclargslot = (ch
14820 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63 28 2a 70  ar *) realloc(*p
14830 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 2c  sp->declargslot,
14840 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75   n);.        zBu
14850 66 20 3d 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72  f = *psp->declar
14860 67 73 6c 6f 74 20 2b 20 6e 4f 6c 64 3b 0a 20 20  gslot + nOld;.  
14870 20 20 20 20 20 20 69 66 28 20 61 64 64 4c 69 6e        if( addLin
14880 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20 20 20  eMacro ){.      
14890 20 20 20 20 69 66 28 20 6e 4f 6c 64 20 26 26 20      if( nOld && 
148a0 7a 42 75 66 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29  zBuf[-1]!='\n' )
148b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 28  {.            *(
148c0 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a  zBuf++) = '\n';.
148d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
148e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
148f0 66 2c 20 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  f, zLine, nLine)
14900 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 42 75 66  ;.          zBuf
14910 20 2b 3d 20 6e 4c 69 6e 65 3b 0a 20 20 20 20 20   += nLine;.     
14920 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
14930 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '"';.          
14940 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e  for(z=psp->filen
14950 61 6d 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ame; *z; z++){. 
14960 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a             if( *
14970 7a 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  z=='\\' ){.     
14980 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b           *(zBuf+
14990 2b 29 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20  +) = '\\';.     
149a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
149b0 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
149c0 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   *z;.          }
149d0 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75  .          *(zBu
149e0 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20 20  f++) = '"';.    
149f0 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20        *(zBuf++) 
14a00 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
14a10 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  }.        if( ps
14a20 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f  p->decllinenoslo
14a30 74 20 26 26 20 70 73 70 2d 3e 64 65 63 6c 6c 69  t && psp->declli
14a40 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 3d 3d 30 20 29  nenoslot[0]==0 )
14a50 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
14a60 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b  >decllinenoslot[
14a70 30 5d 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  0] = psp->tokenl
14a80 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d  ineno;.        }
14a90 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
14aa0 7a 42 75 66 2c 20 7a 4e 65 77 2c 20 6e 4e 65 77  zBuf, zNew, nNew
14ab0 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 20  );.        zBuf 
14ac0 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20  += nNew;.       
14ad0 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20 20 20 20   *zBuf = 0;.    
14ae0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
14af0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
14b00 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
14b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14b20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
14b30 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
14b40 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
14b50 20 20 20 22 49 6c 6c 65 67 61 6c 20 61 72 67 75     "Illegal argu
14b60 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a 20 25 73  ment to %%%s: %s
14b70 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f  ",psp->declkeywo
14b80 72 64 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  rd,x);.        p
14b90 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
14ba0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
14bb0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
14bc0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
14bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
14be0 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
14bf0 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b  ING_FOR_FALLBACK
14c00 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78  _ID:.      if( x
14c10 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
14c20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
14c30 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
14c40 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
14c50 20 7d 65 6c 73 65 20 69 66 28 20 21 49 53 55 50   }else if( !ISUP
14c60 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  PER(x[0]) ){.   
14c70 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
14c80 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70  p->filename, psp
14c90 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
14ca0 20 20 20 20 20 20 20 20 20 22 25 25 66 61 6c 6c           "%%fall
14cb0 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 5c 22  back argument \"
14cc0 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61  %s\" should be a
14cd0 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20   token", x);.   
14ce0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
14cf0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
14d00 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
14d10 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53  t symbol *sp = S
14d20 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
14d30 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 66        if( psp->f
14d40 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20  allback==0 ){.  
14d50 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c          psp->fal
14d60 6c 62 61 63 6b 20 3d 20 73 70 3b 0a 20 20 20 20  lback = sp;.    
14d70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
14d80 2d 3e 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ->fallback ){.  
14d90 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
14da0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
14db0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
14dc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 4d  ,.            "M
14dd0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 66 61 6c  ore than one fal
14de0 6c 62 61 63 6b 20 61 73 73 69 67 6e 65 64 20 74  lback assigned t
14df0 6f 20 74 6f 6b 65 6e 20 25 73 22 2c 20 78 29 3b  o token %s", x);
14e00 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
14e10 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
14e20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14e30 20 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63       sp->fallbac
14e40 6b 20 3d 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63  k = psp->fallbac
14e50 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  k;.          psp
14e60 2d 3e 67 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61  ->gp->has_fallba
14e70 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ck = 1;.        
14e80 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
14e90 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
14ea0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 54 4f 4b 45  WAITING_FOR_TOKE
14eb0 4e 5f 4e 41 4d 45 3a 0a 20 20 20 20 20 20 2f 2a  N_NAME:.      /*
14ec0 20 54 6f 6b 65 6e 73 20 64 6f 20 6e 6f 74 20 68   Tokens do not h
14ed0 61 76 65 20 74 6f 20 62 65 20 64 65 63 6c 61 72  ave to be declar
14ee0 65 64 20 62 65 66 6f 72 65 20 75 73 65 2e 20 20  ed before use.  
14ef0 42 75 74 20 74 68 65 79 20 63 61 6e 20 62 65 0a  But they can be.
14f00 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f 72 64 65        ** in orde
14f10 72 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  r to control the
14f20 69 72 20 61 73 73 69 67 6e 65 64 20 69 6e 74 65  ir assigned inte
14f30 67 65 72 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ger number.  The
14f40 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20 20 20   number for.    
14f50 20 20 2a 2a 20 65 61 63 68 20 74 6f 6b 65 6e 20    ** each token 
14f60 69 73 20 61 73 73 69 67 6e 65 64 20 77 68 65 6e  is assigned when
14f70 20 69 74 20 69 73 20 66 69 72 73 74 20 73 65 65   it is first see
14f80 6e 2e 20 20 53 6f 20 62 79 20 69 6e 63 6c 75 64  n.  So by includ
14f90 69 6e 67 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ing.      **.   
14fa0 20 20 20 2a 2a 20 20 20 20 20 25 74 6f 6b 65 6e     **     %token
14fb0 20 4f 4e 45 20 54 57 4f 20 54 48 52 45 45 0a 20   ONE TWO THREE. 
14fc0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
14fd0 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 67 72   early in the gr
14fe0 61 6d 6d 61 72 20 66 69 6c 65 2c 20 74 68 61 74  ammar file, that
14ff0 20 61 73 73 69 67 6e 73 20 73 6d 61 6c 6c 20 63   assigns small c
15000 6f 6e 73 65 63 75 74 69 76 65 20 76 61 6c 75 65  onsecutive value
15010 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 61  s.      ** to ea
15020 63 68 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 73  ch of the tokens
15030 20 4f 4e 45 20 54 57 4f 20 61 6e 64 20 54 48 52   ONE TWO and THR
15040 45 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  EE..      */.   
15050 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
15060 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
15070 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
15080 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
15090 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
150a0 66 28 20 21 49 53 55 50 50 45 52 28 78 5b 30 5d  f( !ISUPPER(x[0]
150b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ) ){.        Err
150c0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
150d0 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ame, psp->tokenl
150e0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
150f0 20 22 25 25 74 6f 6b 65 6e 20 61 72 67 75 6d 65   "%%token argume
15100 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64  nt \"%s\" should
15110 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29   be a token", x)
15120 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
15130 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
15140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15150 28 76 6f 69 64 29 53 79 6d 62 6f 6c 5f 6e 65 77  (void)Symbol_new
15160 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (x);.      }.   
15170 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
15180 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57  se WAITING_FOR_W
15190 49 4c 44 43 41 52 44 5f 49 44 3a 0a 20 20 20 20  ILDCARD_ID:.    
151a0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
151b0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
151c0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
151d0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
151e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
151f0 28 20 21 49 53 55 50 50 45 52 28 78 5b 30 5d 29  ( !ISUPPER(x[0])
15200 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
15210 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
15220 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
15230 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
15240 22 25 25 77 69 6c 64 63 61 72 64 20 61 72 67 75  "%%wildcard argu
15250 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75  ment \"%s\" shou
15260 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20  ld be a token", 
15270 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
15280 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
15290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
152a0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
152b0 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
152c0 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
152d0 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61   psp->gp->wildca
152e0 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rd==0 ){.       
152f0 20 20 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64     psp->gp->wild
15300 63 61 72 64 20 3d 20 73 70 3b 0a 20 20 20 20 20  card = sp;.     
15310 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15320 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
15330 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
15340 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
15350 20 20 20 20 20 20 20 20 20 20 22 45 78 74 72 61            "Extra
15360 20 77 69 6c 64 63 61 72 64 20 74 6f 20 74 6f 6b   wildcard to tok
15370 65 6e 3a 20 25 73 22 2c 20 78 29 3b 0a 20 20 20  en: %s", x);.   
15380 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
15390 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
153a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
153b0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
153c0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53  WAITING_FOR_CLAS
153d0 53 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20  S_ID:.      if( 
153e0 21 49 53 4c 4f 57 45 52 28 78 5b 30 5d 29 20 29  !ISLOWER(x[0]) )
153f0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
15400 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
15410 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  , psp->tokenline
15420 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25  no,.          "%
15430 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 6d 75 73  %token_class mus
15440 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62 79  t be followed by
15450 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 3a 20   an identifier: 
15460 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ", x);.        p
15470 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
15480 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
15490 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
154a0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
154b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 79 6d     }else if( Sym
154c0 62 6f 6c 5f 66 69 6e 64 28 78 29 20 29 7b 0a 20  bol_find(x) ){. 
154d0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
154e0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70  psp->filename, p
154f0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
15500 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62  .          "Symb
15510 6f 6c 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64  ol \"%s\" alread
15520 79 20 75 73 65 64 22 2c 20 78 29 3b 0a 20 20 20  y used", x);.   
15530 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
15540 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
15550 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
15560 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
15570 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
15580 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 74 6b  .        psp->tk
15590 63 6c 61 73 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e  class = Symbol_n
155a0 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ew(x);.        p
155b0 73 70 2d 3e 74 6b 63 6c 61 73 73 2d 3e 74 79 70  sp->tkclass->typ
155c0 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41  e = MULTITERMINA
155d0 4c 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  L;.        psp->
155e0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
155f0 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 3b  FOR_CLASS_TOKEN;
15600 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
15610 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
15620 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53  AITING_FOR_CLASS
15630 5f 54 4f 4b 45 4e 3a 0a 20 20 20 20 20 20 69 66  _TOKEN:.      if
15640 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
15650 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
15660 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
15670 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
15680 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53      }else if( IS
15690 55 50 50 45 52 28 78 5b 30 5d 29 20 7c 7c 20 28  UPPER(x[0]) || (
156a0 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78 5b  (x[0]=='|' || x[
156b0 30 5d 3d 3d 27 2f 27 29 20 26 26 20 49 53 55 50  0]=='/') && ISUP
156c0 50 45 52 28 78 5b 31 5d 29 29 20 29 7b 0a 20 20  PER(x[1])) ){.  
156d0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
156e0 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d 3e  bol *msp = psp->
156f0 74 6b 63 6c 61 73 73 3b 0a 20 20 20 20 20 20 20  tkclass;.       
15700 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b 3b   msp->nsubsym++;
15710 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75  .        msp->su
15720 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20 73  bsym = (struct s
15730 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c 6c 6f  ymbol **) reallo
15740 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c 0a 20  c(msp->subsym,. 
15750 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
15760 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a  struct symbol*)*
15770 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a 20  msp->nsubsym);. 
15780 20 20 20 20 20 20 20 69 66 28 20 21 49 53 55 50         if( !ISUP
15790 50 45 52 28 78 5b 30 5d 29 20 29 20 78 2b 2b 3b  PER(x[0]) ) x++;
157a0 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75  .        msp->su
157b0 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79  bsym[msp->nsubsy
157c0 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  m-1] = Symbol_ne
157d0 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  w(x);.      }els
157e0 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
157f0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
15800 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
15810 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
15820 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 61 72  %%token_class ar
15830 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68  gument \"%s\" sh
15840 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22  ould be a token"
15850 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  , x);.        ps
15860 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
15870 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
15880 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
15890 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
158a0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
158b0 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 59 4e  ;.    case RESYN
158c0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
158d0 4f 52 3a 0a 2f 2a 20 20 20 20 20 20 69 66 28 20  OR:./*      if( 
158e0 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d  x[0]=='.' ) psp-
158f0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
15900 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
15910 45 3b 0a 2a 2a 20 20 20 20 20 20 62 72 65 61 6b  E;.**      break
15920 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 52 45  ; */.    case RE
15930 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
15940 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 69 66 28  ERROR:.      if(
15950 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70   x[0]=='.' ) psp
15960 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
15970 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
15980 4c 45 3b 0a 20 20 20 20 20 20 69 66 28 20 78 5b  LE;.      if( x[
15990 30 5d 3d 3d 27 25 27 20 29 20 70 73 70 2d 3e 73  0]=='%' ) psp->s
159a0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
159b0 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b  OR_DECL_KEYWORD;
159c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
159d0 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 74 68 65 20  }.}../* Run the 
159e0 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6f 76 65  preprocessor ove
159f0 72 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  r the input file
15a00 20 74 65 78 74 2e 20 20 54 68 65 20 67 6c 6f 62   text.  The glob
15a10 61 6c 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  al variables.** 
15a20 61 7a 44 65 66 69 6e 65 5b 30 5d 20 74 68 72 6f  azDefine[0] thro
15a30 75 67 68 20 61 7a 44 65 66 69 6e 65 5b 6e 44 65  ugh azDefine[nDe
15a40 66 69 6e 65 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  fine-1] contains
15a50 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
15a60 6c 20 64 65 66 69 6e 65 64 0a 2a 2a 20 6d 61 63  l defined.** mac
15a70 72 6f 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ros.  This routi
15a80 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20 22 25 69  ne looks for "%i
15a90 66 64 65 66 22 20 61 6e 64 20 22 25 69 66 6e 64  fdef" and "%ifnd
15aa0 65 66 22 20 61 6e 64 20 22 25 65 6e 64 69 66 22  ef" and "%endif"
15ab0 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73   and.** comments
15ac0 20 74 68 65 6d 20 6f 75 74 2e 20 20 54 65 78 74   them out.  Text
15ad0 20 69 6e 20 62 65 74 77 65 65 6e 20 69 73 20 61   in between is a
15ae0 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  lso commented ou
15af0 74 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  t as appropriate
15b00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15b10 20 70 72 65 70 72 6f 63 65 73 73 5f 69 6e 70 75   preprocess_inpu
15b20 74 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t(char *z){.  in
15b30 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20  t i, j, k, n;.  
15b40 69 6e 74 20 65 78 63 6c 75 64 65 20 3d 20 30 3b  int exclude = 0;
15b50 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30  .  int start = 0
15b60 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d  ;.  int lineno =
15b70 20 31 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 5f   1;.  int start_
15b80 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f  lineno = 1;.  fo
15b90 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
15ba0 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
15bb0 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
15bc0 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 21 3d  ;.    if( z[i]!=
15bd0 27 25 27 20 7c 7c 20 28 69 3e 30 20 26 26 20 7a  '%' || (i>0 && z
15be0 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29 20 29 20 63  [i-1]!='\n') ) c
15bf0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
15c00 20 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22   strncmp(&z[i],"
15c10 25 65 6e 64 69 66 22 2c 36 29 3d 3d 30 20 26 26  %endif",6)==0 &&
15c20 20 49 53 53 50 41 43 45 28 7a 5b 69 2b 36 5d 29   ISSPACE(z[i+6])
15c30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78   ){.      if( ex
15c40 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20  clude ){.       
15c50 20 65 78 63 6c 75 64 65 2d 2d 3b 0a 20 20 20 20   exclude--;.    
15c60 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 3d      if( exclude=
15c70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
15c80 66 6f 72 28 6a 3d 73 74 61 72 74 3b 20 6a 3c 69  for(j=start; j<i
15c90 3b 20 6a 2b 2b 29 20 69 66 28 20 7a 5b 6a 5d 21  ; j++) if( z[j]!
15ca0 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d 20 3d 20 27  ='\n' ) z[j] = '
15cb0 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
15cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
15cd0 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a  j=i; z[j] && z[j
15ce0 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b  ]!='\n'; j++) z[
15cf0 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 65  j] = ' ';.    }e
15d00 6c 73 65 20 69 66 28 20 28 73 74 72 6e 63 6d 70  lse if( (strncmp
15d10 28 26 7a 5b 69 5d 2c 22 25 69 66 64 65 66 22 2c  (&z[i],"%ifdef",
15d20 36 29 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45  6)==0 && ISSPACE
15d30 28 7a 5b 69 2b 36 5d 29 29 0a 20 20 20 20 20 20  (z[i+6])).      
15d40 20 20 20 20 7c 7c 20 28 73 74 72 6e 63 6d 70 28      || (strncmp(
15d50 26 7a 5b 69 5d 2c 22 25 69 66 6e 64 65 66 22 2c  &z[i],"%ifndef",
15d60 37 29 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45  7)==0 && ISSPACE
15d70 28 7a 5b 69 2b 37 5d 29 29 20 29 7b 0a 20 20 20  (z[i+7])) ){.   
15d80 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29     if( exclude )
15d90 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64  {.        exclud
15da0 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e++;.      }else
15db0 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
15dc0 69 2b 37 3b 20 49 53 53 50 41 43 45 28 7a 5b 6a  i+7; ISSPACE(z[j
15dd0 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); j++){}.     
15de0 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b     for(n=0; z[j+
15df0 6e 5d 20 26 26 20 21 49 53 53 50 41 43 45 28 7a  n] && !ISSPACE(z
15e00 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20  [j+n]); n++){}. 
15e10 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d         exclude =
15e20 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   1;.        for(
15e30 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69 6e 65 3b 20  k=0; k<nDefine; 
15e40 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
15e50 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 44 65  if( strncmp(azDe
15e60 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29  fine[k],&z[j],n)
15e70 3d 3d 30 20 26 26 20 6c 65 6d 6f 6e 53 74 72 6c  ==0 && lemonStrl
15e80 65 6e 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 29 3d  en(azDefine[k])=
15e90 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =n ){.          
15ea0 20 20 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20    exclude = 0;. 
15eb0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
15ec0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15ee0 69 66 28 20 7a 5b 69 2b 33 5d 3d 3d 27 6e 27 20  if( z[i+3]=='n' 
15ef0 29 20 65 78 63 6c 75 64 65 20 3d 20 21 65 78 63  ) exclude = !exc
15f00 6c 75 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66  lude;.        if
15f10 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20  ( exclude ){.   
15f20 20 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 69         start = i
15f30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72  ;.          star
15f40 74 5f 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e  t_lineno = linen
15f50 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  o;.        }.   
15f60 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
15f70 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d  =i; z[j] && z[j]
15f80 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a  !='\n'; j++) z[j
15f90 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20  ] = ' ';.    }. 
15fa0 20 7d 0a 20 20 69 66 28 20 65 78 63 6c 75 64 65   }.  if( exclude
15fb0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
15fc0 73 74 64 65 72 72 2c 22 75 6e 74 65 72 6d 69 6e  stderr,"untermin
15fd0 61 74 65 64 20 25 25 69 66 64 65 66 20 73 74 61  ated %%ifdef sta
15fe0 72 74 69 6e 67 20 6f 6e 20 6c 69 6e 65 20 25 64  rting on line %d
15ff0 5c 6e 22 2c 20 73 74 61 72 74 5f 6c 69 6e 65 6e  \n", start_linen
16000 6f 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  o);.    exit(1);
16010 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70  .  }.}../* In sp
16020 69 74 65 20 6f 66 20 69 74 73 20 6e 61 6d 65 2c  ite of its name,
16030 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
16040 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6e 6e  s really a scann
16050 65 72 2e 20 20 49 74 20 72 65 61 64 0a 2a 2a 20  er.  It read.** 
16060 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e  in the entire in
16070 70 75 74 20 66 69 6c 65 20 28 61 6c 6c 20 61 74  put file (all at
16080 20 6f 6e 63 65 29 20 74 68 65 6e 20 74 6f 6b 65   once) then toke
16090 6e 69 7a 65 73 20 69 74 2e 20 20 45 61 63 68 0a  nizes it.  Each.
160a0 2a 2a 20 74 6f 6b 65 6e 20 69 73 20 70 61 73 73  ** token is pass
160b0 65 64 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ed to the functi
160c0 6f 6e 20 22 70 61 72 73 65 6f 6e 65 74 6f 6b 65  on "parseonetoke
160d0 6e 22 20 77 68 69 63 68 20 62 75 69 6c 64 73 20  n" which builds 
160e0 61 6c 6c 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f  all.** the appro
160f0 70 72 69 61 74 65 20 64 61 74 61 20 73 74 72 75  priate data stru
16100 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 67 6c  ctures in the gl
16110 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f  obal state vecto
16120 72 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20  r "gp"..*/.void 
16130 50 61 72 73 65 28 73 74 72 75 63 74 20 6c 65 6d  Parse(struct lem
16140 6f 6e 20 2a 67 70 29 0a 7b 0a 20 20 73 74 72 75  on *gp).{.  stru
16150 63 74 20 70 73 74 61 74 65 20 70 73 3b 0a 20 20  ct pstate ps;.  
16160 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63 68 61 72  FILE *fp;.  char
16170 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20 75 6e 73   *filebuf;.  uns
16180 69 67 6e 65 64 20 69 6e 74 20 66 69 6c 65 73 69  igned int filesi
16190 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f  ze;.  int lineno
161a0 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61  ;.  int c;.  cha
161b0 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70 3b 0a  r *cp, *nextcp;.
161c0 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e 65 20    int startline 
161d0 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  = 0;..  memset(&
161e0 70 73 2c 20 27 5c 30 27 2c 20 73 69 7a 65 6f 66  ps, '\0', sizeof
161f0 28 70 73 29 29 3b 0a 20 20 70 73 2e 67 70 20 3d  (ps));.  ps.gp =
16200 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65 6e 61   gp;.  ps.filena
16210 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e 61 6d  me = gp->filenam
16220 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63 6e 74  e;.  ps.errorcnt
16230 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61 74 65   = 0;.  ps.state
16240 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a   = INITIALIZE;..
16250 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 65    /* Begin by re
16260 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20  ading the input 
16270 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d 20 66  file */.  fp = f
16280 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61 6d 65  open(ps.filename
16290 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"rb");.  if( fp
162a0 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
162b0 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
162c0 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68  0,"Can't open th
162d0 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  is file for read
162e0 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70 2d 3e  ing.");.    gp->
162f0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
16300 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 73  return;.  }.  fs
16310 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20 20 66  eek(fp,0,2);.  f
16320 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c 6c 28  ilesize = ftell(
16330 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 70  fp);.  rewind(fp
16340 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d 20 28  );.  filebuf = (
16350 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 66  char *)malloc( f
16360 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20 20 69  ilesize+1 );.  i
16370 66 28 20 66 69 6c 65 73 69 7a 65 3e 31 30 30 30  f( filesize>1000
16380 30 30 30 30 30 20 7c 7c 20 66 69 6c 65 62 75 66  00000 || filebuf
16390 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
163a0 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
163b0 30 2c 22 49 6e 70 75 74 20 66 69 6c 65 20 74 6f  0,"Input file to
163c0 6f 20 6c 61 72 67 65 2e 22 29 3b 0a 20 20 20 20  o large.");.    
163d0 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  gp->errorcnt++;.
163e0 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a      fclose(fp);.
163f0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
16400 20 20 69 66 28 20 66 72 65 61 64 28 66 69 6c 65    if( fread(file
16410 62 75 66 2c 31 2c 66 69 6c 65 73 69 7a 65 2c 66  buf,1,filesize,f
16420 70 29 21 3d 66 69 6c 65 73 69 7a 65 20 29 7b 0a  p)!=filesize ){.
16430 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e      ErrorMsg(ps.
16440 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27  filename,0,"Can'
16450 74 20 72 65 61 64 20 69 6e 20 61 6c 6c 20 25 64  t read in all %d
16460 20 62 79 74 65 73 20 6f 66 20 74 68 69 73 20 66   bytes of this f
16470 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66 69 6c  ile.",.      fil
16480 65 73 69 7a 65 29 3b 0a 20 20 20 20 66 72 65 65  esize);.    free
16490 28 66 69 6c 65 62 75 66 29 3b 0a 20 20 20 20 67  (filebuf);.    g
164a0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
164b0 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20     fclose(fp);. 
164c0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
164d0 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 66   fclose(fp);.  f
164e0 69 6c 65 62 75 66 5b 66 69 6c 65 73 69 7a 65 5d  ilebuf[filesize]
164f0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65   = 0;..  /* Make
16500 20 61 6e 20 69 6e 69 74 69 61 6c 20 70 61 73 73   an initial pass
16510 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c   through the fil
16520 65 20 74 6f 20 68 61 6e 64 6c 65 20 25 69 66 64  e to handle %ifd
16530 65 66 20 61 6e 64 20 25 69 66 6e 64 65 66 20 2a  ef and %ifndef *
16540 2f 0a 20 20 70 72 65 70 72 6f 63 65 73 73 5f 69  /.  preprocess_i
16550 6e 70 75 74 28 66 69 6c 65 62 75 66 29 3b 0a 0a  nput(filebuf);..
16560 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e 20 74 68    /* Now scan th
16570 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 69 6e  e text of the in
16580 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 6c 69  put file */.  li
16590 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28  neno = 1;.  for(
165a0 63 70 3d 66 69 6c 65 62 75 66 3b 20 28 63 3d 20  cp=filebuf; (c= 
165b0 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20 20 20 20  *cp)!=0; ){.    
165c0 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
165d0 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20 20 20 20  neno++;         
165e0 20 20 20 20 20 2f 2a 20 4b 65 65 70 20 74 72 61       /* Keep tra
165f0 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e  ck of the line n
16600 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 66 28  umber */.    if(
16610 20 49 53 53 50 41 43 45 28 63 29 20 29 7b 20 63   ISSPACE(c) ){ c
16620 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  p++; continue; }
16630 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c 20 77 68    /* Skip all wh
16640 69 74 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ite space */.   
16650 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
16660 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 20 20  p[1]=='/' ){    
16670 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 2b        /* Skip C+
16680 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73  + style comments
16690 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b   */.      cp+=2;
166a0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
166b0 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d  = *cp)!=0 && c!=
166c0 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20  '\n' ) cp++;.   
166d0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
166e0 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f   }.    if( c=='/
166f0 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20  ' && cp[1]=='*' 
16700 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ){          /* S
16710 6b 69 70 20 43 20 73 74 79 6c 65 20 63 6f 6d 6d  kip C style comm
16720 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70  ents */.      cp
16730 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  +=2;.      while
16740 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ( (c= *cp)!=0 &&
16750 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63 70 5b 2d   (c!='/' || cp[-
16760 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20  1]!='*') ){.    
16770 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
16780 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
16790 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
167a0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 20  }.      if( c ) 
167b0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74  cp++;.      cont
167c0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
167d0 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74 20 3d 20  ps.tokenstart = 
167e0 63 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  cp;             
167f0 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 62     /* Mark the b
16800 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
16810 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 73 2e  token */.    ps.
16820 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20 6c 69  tokenlineno = li
16830 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  neno;           
16840 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 6f 6e  /* Linenumber on
16850 20 77 68 69 63 68 20 74 6f 6b 65 6e 20 62 65 67   which token beg
16860 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 63  ins */.    if( c
16870 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 20 20 20  =='\"' ){       
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16890 20 53 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73   String literals
168a0 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a   */.      cp++;.
168b0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
168c0 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27   *cp)!=0 && c!='
168d0 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  \"' ){.        i
168e0 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
168f0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63  eno++;.        c
16900 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p++;.      }.   
16910 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
16920 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
16930 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73 74 61 72  ps.filename,star
16940 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e 67 20 73  tline,."String s
16950 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20  tarting on this 
16960 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d  line is not term
16970 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74 68  inated before th
16980 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
16990 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  e.");.        ps
169a0 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  .errorcnt++;.   
169b0 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
169c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
169d0 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20         nextcp = 
169e0 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cp+1;.      }.  
169f0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
16a00 7b 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  {' ){           
16a10 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20 6f      /* A block o
16a20 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  f C code */.    
16a30 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a 20 20 20    int level;.   
16a40 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 66     cp++;.      f
16a50 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28 63 3d 20  or(level=1; (c= 
16a60 2a 63 70 29 21 3d 30 20 26 26 20 28 6c 65 76 65  *cp)!=0 && (leve
16a70 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27 29 3b 20  l>1 || c!='}'); 
16a80 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  cp++){.        i
16a90 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
16aa0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65  eno++;.        e
16ab0 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29  lse if( c=='{' )
16ac0 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20   level++;.      
16ad0 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7d    else if( c=='}
16ae0 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20 20 20  ' ) level--;.   
16af0 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d       else if( c=
16b00 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
16b10 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 63  *' ){  /* Skip c
16b20 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  omments */.     
16b30 20 20 20 20 20 69 6e 74 20 70 72 65 76 63 3b 0a       int prevc;.
16b40 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26            cp = &
16b50 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20  cp[2];.         
16b60 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20   prevc = 0;.    
16b70 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
16b80 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d   *cp)!=0 && (c!=
16b90 27 2f 27 20 7c 7c 20 70 72 65 76 63 21 3d 27 2a  '/' || prevc!='*
16ba0 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ') ){.          
16bb0 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
16bc0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
16bd0 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b        prevc = c;
16be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 70 2b  .            cp+
16bf0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
16c00 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
16c10 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
16c20 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20 53 6b 69  =='/' ){  /* Ski
16c30 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d  p C++ style comm
16c40 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20 20 20 20  ents too */.    
16c50 20 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32        cp = &cp[2
16c60 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ];.          whi
16c70 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
16c80 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b  && c!='\n' ) cp+
16c90 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  +;.          if(
16ca0 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20   c ) lineno++;. 
16cb0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
16cc0 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27   c=='\'' || c=='
16cd0 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20 53 74 72  \"' ){    /* Str
16ce0 69 6e 67 20 61 20 63 68 61 72 61 63 74 65 72 20  ing a character 
16cf0 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20  literals */.    
16d00 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 63        int startc
16d10 68 61 72 2c 20 70 72 65 76 63 3b 0a 20 20 20 20  har, prevc;.    
16d20 20 20 20 20 20 20 73 74 61 72 74 63 68 61 72 20        startchar 
16d30 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = c;.          p
16d40 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  revc = 0;.      
16d50 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b 20 28 63      for(cp++; (c
16d60 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21  = *cp)!=0 && (c!
16d70 3d 73 74 61 72 74 63 68 61 72 20 7c 7c 20 70 72  =startchar || pr
16d80 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63 70 2b 2b  evc=='\\'); cp++
16d90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
16da0 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
16db0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  eno++;.         
16dc0 20 20 20 69 66 28 20 70 72 65 76 63 3d 3d 27 5c     if( prevc=='\
16dd0 5c 27 20 29 20 70 72 65 76 63 20 3d 20 30 3b 0a  \' ) prevc = 0;.
16de0 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
16df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
16e00 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  evc = c;.       
16e10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
16e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16e30 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
16e40 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c   ErrorMsg(ps.fil
16e50 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b 65 6e 6c 69  ename,ps.tokenli
16e60 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64 65 20 73 74  neno,."C code st
16e70 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c  arting on this l
16e80 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69  ine is not termi
16e90 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74 68 65  nated before the
16ea0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
16eb0 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e  .");.        ps.
16ec0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
16ed0 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
16ee0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16ef0 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
16f00 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p+1;.      }.   
16f10 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 4c 4e   }else if( ISALN
16f20 55 4d 28 63 29 20 29 7b 20 20 20 20 20 20 20 20  UM(c) ){        
16f30 20 20 2f 2a 20 49 64 65 6e 74 69 66 69 65 72 73    /* Identifiers
16f40 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
16f50 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
16f60 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c 7c 20 63  (ISALNUM(c) || c
16f70 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20  =='_') ) cp++;. 
16f80 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
16f90 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
16fa0 63 3d 3d 27 3a 27 20 26 26 20 63 70 5b 31 5d 3d  c==':' && cp[1]=
16fb0 3d 27 3a 27 20 26 26 20 63 70 5b 32 5d 3d 3d 27  =':' && cp[2]=='
16fc0 3d 27 20 29 7b 20 2f 2a 20 54 68 65 20 6f 70 65  =' ){ /* The ope
16fd0 72 61 74 6f 72 20 22 3a 3a 3d 22 20 2a 2f 0a 20  rator "::=" */. 
16fe0 20 20 20 20 20 63 70 20 2b 3d 20 33 3b 0a 20 20       cp += 3;.  
16ff0 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
17000 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
17010 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27 7c 27  c=='/' || c=='|'
17020 29 20 26 26 20 49 53 41 4c 50 48 41 28 63 70 5b  ) && ISALPHA(cp[
17030 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 63 70 20  1]) ){.      cp 
17040 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c  += 2;.      whil
17050 65 28 20 28 63 20 3d 20 2a 63 70 29 21 3d 30 20  e( (c = *cp)!=0 
17060 26 26 20 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c  && (ISALNUM(c) |
17070 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b  | c=='_') ) cp++
17080 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
17090 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20   cp;.    }else{ 
170a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
170c0 6f 74 68 65 72 20 28 6f 6e 65 20 63 68 61 72 61  other (one chara
170d0 63 74 65 72 29 20 6f 70 65 72 61 74 6f 72 73 20  cter) operators 
170e0 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  */.      cp++;. 
170f0 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
17100 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 20 3d 20  ;.    }.    c = 
17110 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30  *cp;.    *cp = 0
17120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17130 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 6c           /* Null
17140 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 74   terminate the t
17150 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 61 72 73  oken */.    pars
17160 65 6f 6e 65 74 6f 6b 65 6e 28 26 70 73 29 3b 20  eonetoken(&ps); 
17170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
17180 61 72 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a  arse the token *
17190 2f 0a 20 20 20 20 2a 63 70 20 3d 20 28 63 68 61  /.    *cp = (cha
171a0 72 29 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  r)c;            
171b0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65        /* Restore
171c0 20 74 68 65 20 62 75 66 66 65 72 20 2a 2f 0a 20   the buffer */. 
171d0 20 20 20 63 70 20 3d 20 6e 65 78 74 63 70 3b 0a     cp = nextcp;.
171e0 20 20 7d 0a 20 20 66 72 65 65 28 66 69 6c 65 62    }.  free(fileb
171f0 75 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  uf);            
17200 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61          /* Relea
17210 73 65 20 74 68 65 20 62 75 66 66 65 72 20 61 66  se the buffer af
17220 74 65 72 20 70 61 72 73 69 6e 67 20 2a 2f 0a 20  ter parsing */. 
17230 20 67 70 2d 3e 72 75 6c 65 20 3d 20 70 73 2e 66   gp->rule = ps.f
17240 69 72 73 74 72 75 6c 65 3b 0a 20 20 67 70 2d 3e  irstrule;.  gp->
17250 65 72 72 6f 72 63 6e 74 20 3d 20 70 73 2e 65 72  errorcnt = ps.er
17260 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  rorcnt;.}./*****
17270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17280 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
17290 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 63 22 20 2a  file "plink.c" *
172a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172b0 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ****/./*.** Rout
172c0 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20  ines processing 
172d0 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f  configuration fo
172e0 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
172f0 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a 20 69 6e  tion links.** in
17300 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
17310 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
17320 73 74 61 74 69 63 20 73 74 72 75 63 74 20 70 6c  static struct pl
17330 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72 65 65 6c  ink *plink_freel
17340 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20 41 6c 6c  ist = 0;../* All
17350 6f 63 61 74 65 20 61 20 6e 65 77 20 70 6c 69 6e  ocate a new plin
17360 6b 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e  k */.struct plin
17370 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28 76 6f 69  k *Plink_new(voi
17380 64 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  d){.  struct pli
17390 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 0a 20 20  nk *newlink;..  
173a0 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  if( plink_freeli
173b0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  st==0 ){.    int
173c0 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   i;.    int amt 
173d0 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b  = 100;.    plink
173e0 5f 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72  _freelist = (str
173f0 75 63 74 20 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c  uct plink *)call
17400 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28  oc( amt, sizeof(
17410 73 74 72 75 63 74 20 70 6c 69 6e 6b 29 20 29 3b  struct plink) );
17420 0a 20 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66  .    if( plink_f
17430 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reelist==0 ){.  
17440 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
17450 72 72 2c 0a 20 20 20 20 20 20 22 55 6e 61 62 6c  rr,.      "Unabl
17460 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  e to allocate me
17470 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 66  mory for a new f
17480 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67  ollow-set propag
17490 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b  ation link.\n");
174a0 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
174b0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
174c0 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29  0; i<amt-1; i++)
174d0 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b   plink_freelist[
174e0 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e 6b  i].next = &plink
174f0 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a  _freelist[i+1];.
17500 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69      plink_freeli
17510 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d  st[amt-1].next =
17520 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 6c 69 6e   0;.  }.  newlin
17530 6b 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  k = plink_freeli
17540 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66 72 65 65  st;.  plink_free
17550 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65  list = plink_fre
17560 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72  elist->next;.  r
17570 65 74 75 72 6e 20 6e 65 77 6c 69 6e 6b 3b 0a 7d  eturn newlink;.}
17580 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c 69 6e 6b  ../* Add a plink
17590 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c 69 73 74   to a plink list
175a0 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 61   */.void Plink_a
175b0 64 64 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  dd(struct plink 
175c0 2a 2a 70 6c 70 70 2c 20 73 74 72 75 63 74 20 63  **plpp, struct c
175d0 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20  onfig *cfp).{.  
175e0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
175f0 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b  wlink;.  newlink
17600 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b 0a   = Plink_new();.
17610 20 20 6e 65 77 6c 69 6e 6b 2d 3e 6e 65 78 74 20    newlink->next 
17620 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70 70  = *plpp;.  *plpp
17630 20 3d 20 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65   = newlink;.  ne
17640 77 6c 69 6e 6b 2d 3e 63 66 70 20 3d 20 63 66 70  wlink->cfp = cfp
17650 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66 65 72  ;.}../* Transfer
17660 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20   every plink on 
17670 74 68 65 20 6c 69 73 74 20 22 66 72 6f 6d 22 20  the list "from" 
17680 74 6f 20 74 68 65 20 6c 69 73 74 20 22 74 6f 22  to the list "to"
17690 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63   */.void Plink_c
176a0 6f 70 79 28 73 74 72 75 63 74 20 70 6c 69 6e 6b  opy(struct plink
176b0 20 2a 2a 74 6f 2c 20 73 74 72 75 63 74 20 70 6c   **to, struct pl
176c0 69 6e 6b 20 2a 66 72 6f 6d 29 0a 7b 0a 20 20 73  ink *from).{.  s
176d0 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78  truct plink *nex
176e0 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66 72  tpl;.  while( fr
176f0 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c  om ){.    nextpl
17700 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a 20   = from->next;. 
17710 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d 20     from->next = 
17720 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20 66  *to;.    *to = f
17730 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d 20  rom;.    from = 
17740 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  nextpl;.  }.}../
17750 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 20 70  * Delete every p
17760 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74  link on the list
17770 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64   */.void Plink_d
17780 65 6c 65 74 65 28 73 74 72 75 63 74 20 70 6c 69  elete(struct pli
17790 6e 6b 20 2a 70 6c 70 29 0a 7b 0a 20 20 73 74 72  nk *plp).{.  str
177a0 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70  uct plink *nextp
177b0 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 6c 70  l;..  while( plp
177c0 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d   ){.    nextpl =
177d0 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20   plp->next;.    
177e0 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70 6c 69 6e  plp->next = plin
177f0 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 20 20  k_freelist;.    
17800 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d  plink_freelist =
17810 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70 20 3d 20   plp;.    plp = 
17820 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a  nextpl;.  }.}./*
17830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17840 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
17850 66 69 6c 65 20 22 72 65 70 6f 72 74 2e 63 22 20  file "report.c" 
17860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
17880 2a 20 50 72 6f 63 65 64 75 72 65 73 20 66 6f 72  * Procedures for
17890 20 67 65 6e 65 72 61 74 69 6e 67 20 72 65 70 6f   generating repo
178a0 72 74 73 20 61 6e 64 20 74 61 62 6c 65 73 20 69  rts and tables i
178b0 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
178c0 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
178d0 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20  ../* Generate a 
178e0 66 69 6c 65 6e 61 6d 65 20 77 69 74 68 20 74 68  filename with th
178f0 65 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e 20  e given suffix. 
17900 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
17910 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65 73  he.** name comes
17920 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61   from malloc() a
17930 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
17940 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
17950 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ** function..*/.
17960 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 66 69  PRIVATE char *fi
17970 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 73 74 72 75  le_makename(stru
17980 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20  ct lemon *lemp, 
17990 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66 66  const char *suff
179a0 69 78 29 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61  ix).{.  char *na
179b0 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a  me;.  char *cp;.
179c0 0a 20 20 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  .  name = (char*
179d0 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74  )malloc( lemonSt
179e0 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rlen(lemp->filen
179f0 61 6d 65 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c  ame) + lemonStrl
17a00 65 6e 28 73 75 66 66 69 78 29 20 2b 20 35 20 29  en(suffix) + 5 )
17a10 3b 0a 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20  ;.  if( name==0 
17a20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
17a30 74 64 65 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c  tderr,"Can't all
17a40 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
17a50 61 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b  a filename.\n");
17a60 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
17a70 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79  }.  lemon_strcpy
17a80 28 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65  (name,lemp->file
17a90 6e 61 6d 65 29 3b 0a 20 20 63 70 20 3d 20 73 74  name);.  cp = st
17aa0 72 72 63 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b  rrchr(name,'.');
17ab0 0a 20 20 69 66 28 20 63 70 20 29 20 2a 63 70 20  .  if( cp ) *cp 
17ac0 3d 20 30 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72  = 0;.  lemon_str
17ad0 63 61 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29  cat(name,suffix)
17ae0 3b 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b  ;.  return name;
17af0 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69  .}../* Open a fi
17b00 6c 65 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62  le with a name b
17b10 61 73 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65  ased on the name
17b20 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69   of the input fi
17b30 6c 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20  le,.** but with 
17b40 61 20 64 69 66 66 65 72 65 6e 74 20 28 73 70 65  a different (spe
17b50 63 69 66 69 65 64 29 20 73 75 66 66 69 78 2c 20  cified) suffix, 
17b60 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
17b70 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  nter.** to the s
17b80 74 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45  tream */.PRIVATE
17b90 20 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e   FILE *file_open
17ba0 28 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  (.  struct lemon
17bb0 20 2a 6c 65 6d 70 2c 0a 20 20 63 6f 6e 73 74 20   *lemp,.  const 
17bc0 63 68 61 72 20 2a 73 75 66 66 69 78 2c 0a 20 20  char *suffix,.  
17bd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65  const char *mode
17be0 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a  .){.  FILE *fp;.
17bf0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74  .  if( lemp->out
17c00 6e 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d 70  name ) free(lemp
17c10 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65  ->outname);.  le
17c20 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69  mp->outname = fi
17c30 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70  le_makename(lemp
17c40 2c 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70 20  , suffix);.  fp 
17c50 3d 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75  = fopen(lemp->ou
17c60 74 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69  tname,mode);.  i
17c70 66 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64  f( fp==0 && *mod
17c80 65 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66 70  e=='w' ){.    fp
17c90 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61  rintf(stderr,"Ca
17ca0 6e 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22  n't open file \"
17cb0 25 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f  %s\".\n",lemp->o
17cc0 75 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d  utname);.    lem
17cd0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
17ce0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
17cf0 0a 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a  .  return fp;.}.
17d00 0a 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 74 65  ./* Print the te
17d10 78 74 20 6f 66 20 61 20 72 75 6c 65 0a 2a 2f 0a  xt of a rule.*/.
17d20 76 6f 69 64 20 72 75 6c 65 5f 70 72 69 6e 74 28  void rule_print(
17d30 46 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75 63  FILE *out, struc
17d40 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20 69  t rule *rp){.  i
17d50 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 70 72 69 6e  nt i, j;.  fprin
17d60 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 72 70 2d  tf(out, "%s",rp-
17d70 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 2f  >lhs->name);.  /
17d80 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73  *    if( rp->lhs
17d90 61 6c 69 61 73 20 29 20 66 70 72 69 6e 74 66 28  alias ) fprintf(
17da0 6f 75 74 2c 22 28 25 73 29 22 2c 72 70 2d 3e 6c  out,"(%s)",rp->l
17db0 68 73 61 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 66  hsalias); */.  f
17dc0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 3a 3a 3d  printf(out," ::=
17dd0 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
17de0 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
17df0 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62  .    struct symb
17e00 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73  ol *sp = rp->rhs
17e10 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d  [i];.    if( sp-
17e20 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
17e30 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 70  INAL ){.      fp
17e40 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c  rintf(out," %s",
17e50 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e   sp->subsym[0]->
17e60 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  name);.      for
17e70 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62  (j=1; j<sp->nsub
17e80 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  sym; j++){.     
17e90 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
17ea0 7c 25 73 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d  |%s", sp->subsym
17eb0 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [j]->name);.    
17ec0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
17ed0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
17ee0 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65  ," %s", sp->name
17ef0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
17f00 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
17f10 5b 69 5d 20 29 20 66 70 72 69 6e 74 66 28 6f 75  [i] ) fprintf(ou
17f20 74 2c 22 28 25 73 29 22 2c 72 70 2d 3e 72 68 73  t,"(%s)",rp->rhs
17f30 61 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20  alias[i]); */.  
17f40 7d 0a 7d 0a 0a 2f 2a 20 44 75 70 6c 69 63 61 74  }.}../* Duplicat
17f50 65 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  e the input file
17f60 20 77 69 74 68 6f 75 74 20 63 6f 6d 6d 65 6e 74   without comment
17f70 73 20 61 6e 64 20 77 69 74 68 6f 75 74 20 61 63  s and without ac
17f80 74 69 6f 6e 73 0a 2a 2a 20 6f 6e 20 72 75 6c 65  tions.** on rule
17f90 73 20 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e  s */.void Reprin
17fa0 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  t(struct lemon *
17fb0 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74  lemp).{.  struct
17fc0 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72   rule *rp;.  str
17fd0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
17fe0 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6d 61 78 6c    int i, j, maxl
17ff0 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e  en, len, ncolumn
18000 73 2c 20 73 6b 69 70 3b 0a 20 20 70 72 69 6e 74  s, skip;.  print
18010 66 28 22 2f 2f 20 52 65 70 72 69 6e 74 20 6f 66  f("// Reprint of
18020 20 69 6e 70 75 74 20 66 69 6c 65 20 5c 22 25 73   input file \"%s
18030 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a  \".\n// Symbols:
18040 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  \n",lemp->filena
18050 6d 65 29 3b 0a 20 20 6d 61 78 6c 65 6e 20 3d 20  me);.  maxlen = 
18060 31 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  10;.  for(i=0; i
18070 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
18080 69 2b 2b 29 7b 0a 20 20 20 20 73 70 20 3d 20 6c  i++){.    sp = l
18090 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
180a0 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e  .    len = lemon
180b0 53 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29  Strlen(sp->name)
180c0 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61  ;.    if( len>ma
180d0 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20  xlen ) maxlen = 
180e0 6c 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75  len;.  }.  ncolu
180f0 6d 6e 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e  mns = 76/(maxlen
18100 2b 35 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75  +5);.  if( ncolu
18110 6d 6e 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73  mns<1 ) ncolumns
18120 20 3d 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28   = 1;.  skip = (
18130 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20  lemp->nsymbol + 
18140 6e 63 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63  ncolumns - 1)/nc
18150 6f 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d  olumns;.  for(i=
18160 30 3b 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b  0; i<skip; i++){
18170 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22  .    printf("//"
18180 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20  );.    for(j=i; 
18190 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  j<lemp->nsymbol;
181a0 20 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20   j+=skip){.     
181b0 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   sp = lemp->symb
181c0 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73  ols[j];.      as
181d0 73 65 72 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d  sert( sp->index=
181e0 3d 6a 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6e  =j );.      prin
181f0 74 66 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22  tf(" %3d %-*.*s"
18200 2c 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e  ,j,maxlen,maxlen
18210 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  ,sp->name);.    
18220 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e  }.    printf("\n
18230 22 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70  ");.  }.  for(rp
18240 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
18250 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
18260 20 20 20 72 75 6c 65 5f 70 72 69 6e 74 28 73 74     rule_print(st
18270 64 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 70  dout, rp);.    p
18280 72 69 6e 74 66 28 22 2e 22 29 3b 0a 20 20 20 20  rintf(".");.    
18290 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 20  if( rp->precsym 
182a0 29 20 70 72 69 6e 74 66 28 22 20 5b 25 73 5d 22  ) printf(" [%s]"
182b0 2c 72 70 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e 61  ,rp->precsym->na
182c0 6d 65 29 3b 0a 20 20 20 20 2f 2a 20 69 66 28 20  me);.    /* if( 
182d0 72 70 2d 3e 63 6f 64 65 20 29 20 70 72 69 6e 74  rp->code ) print
182e0 66 28 22 5c 6e 20 20 20 20 25 73 22 2c 72 70 2d  f("\n    %s",rp-
182f0 3e 63 6f 64 65 29 3b 20 2a 2f 0a 20 20 20 20 70  >code); */.    p
18300 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
18310 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73  .}../* Print a s
18320 69 6e 67 6c 65 20 72 75 6c 65 2e 0a 2a 2f 0a 76  ingle rule..*/.v
18330 6f 69 64 20 52 75 6c 65 50 72 69 6e 74 28 46 49  oid RulePrint(FI
18340 4c 45 20 2a 66 70 2c 20 73 74 72 75 63 74 20 72  LE *fp, struct r
18350 75 6c 65 20 2a 72 70 2c 20 69 6e 74 20 69 43 75  ule *rp, int iCu
18360 72 73 6f 72 29 7b 0a 20 20 73 74 72 75 63 74 20  rsor){.  struct 
18370 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e  symbol *sp;.  in
18380 74 20 69 2c 20 6a 3b 0a 20 20 66 70 72 69 6e 74  t i, j;.  fprint
18390 66 28 66 70 2c 22 25 73 20 3a 3a 3d 22 2c 72 70  f(fp,"%s ::=",rp
183a0 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ->lhs->name);.  
183b0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 72 70 2d 3e  for(i=0; i<=rp->
183c0 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
183d0 69 66 28 20 69 3d 3d 69 43 75 72 73 6f 72 20 29  if( i==iCursor )
183e0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 2a 22   fprintf(fp," *"
183f0 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 72 70  );.    if( i==rp
18400 2d 3e 6e 72 68 73 20 29 20 62 72 65 61 6b 3b 0a  ->nrhs ) break;.
18410 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73      sp = rp->rhs
18420 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d  [i];.    if( sp-
18430 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
18440 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 70  INAL ){.      fp
18450 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22 2c 20  rintf(fp," %s", 
18460 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e  sp->subsym[0]->n
18470 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
18480 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73  j=1; j<sp->nsubs
18490 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ym; j++){.      
184a0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 7c 25    fprintf(fp,"|%
184b0 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d  s",sp->subsym[j]
184c0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  ->name);.      }
184d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
184e0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25    fprintf(fp," %
184f0 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  s", sp->name);. 
18500 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 50     }.  }.}../* P
18510 72 69 6e 74 20 74 68 65 20 72 75 6c 65 20 66 6f  rint the rule fo
18520 72 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  r a configuratio
18530 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  n..*/.void Confi
18540 67 50 72 69 6e 74 28 46 49 4c 45 20 2a 66 70 2c  gPrint(FILE *fp,
18550 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
18560 63 66 70 29 7b 0a 20 20 52 75 6c 65 50 72 69 6e  cfp){.  RulePrin
18570 74 28 66 70 2c 20 63 66 70 2d 3e 72 70 2c 20 63  t(fp, cfp->rp, c
18580 66 70 2d 3e 64 6f 74 29 3b 0a 7d 0a 0a 2f 2a 20  fp->dot);.}../* 
18590 23 64 65 66 69 6e 65 20 54 45 53 54 20 2a 2f 0a  #define TEST */.
185a0 23 69 66 20 30 0a 2f 2a 20 50 72 69 6e 74 20 61  #if 0./* Print a
185b0 20 73 65 74 20 2a 2f 0a 50 52 49 56 41 54 45 20   set */.PRIVATE 
185c0 76 6f 69 64 20 53 65 74 50 72 69 6e 74 28 6f 75  void SetPrint(ou
185d0 74 2c 73 65 74 2c 6c 65 6d 70 29 0a 46 49 4c 45  t,set,lemp).FILE
185e0 20 2a 6f 75 74 3b 0a 63 68 61 72 20 2a 73 65 74   *out;.char *set
185f0 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ;.struct lemon *
18600 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b  lemp;.{.  int i;
18610 0a 20 20 63 68 61 72 20 2a 73 70 61 63 65 72 3b  .  char *spacer;
18620 0a 20 20 73 70 61 63 65 72 20 3d 20 22 22 3b 0a  .  spacer = "";.
18630 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
18640 31 32 73 5b 22 2c 22 22 29 3b 0a 20 20 66 6f 72  12s[","");.  for
18650 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74  (i=0; i<lemp->nt
18660 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20  erminal; i++){. 
18670 20 20 20 69 66 28 20 53 65 74 46 69 6e 64 28 73     if( SetFind(s
18680 65 74 2c 69 29 20 29 7b 0a 20 20 20 20 20 20 66  et,i) ){.      f
18690 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 25 73  printf(out,"%s%s
186a0 22 2c 73 70 61 63 65 72 2c 6c 65 6d 70 2d 3e 73  ",spacer,lemp->s
186b0 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29  ymbols[i]->name)
186c0 3b 0a 20 20 20 20 20 20 73 70 61 63 65 72 20 3d  ;.      spacer =
186d0 20 22 20 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   " ";.    }.  }.
186e0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5d    fprintf(out,"]
186f0 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e  \n");.}../* Prin
18700 74 20 61 20 70 6c 69 6e 6b 20 63 68 61 69 6e 20  t a plink chain 
18710 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
18720 50 6c 69 6e 6b 50 72 69 6e 74 28 6f 75 74 2c 70  PlinkPrint(out,p
18730 6c 70 2c 74 61 67 29 0a 46 49 4c 45 20 2a 6f 75  lp,tag).FILE *ou
18740 74 3b 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  t;.struct plink 
18750 2a 70 6c 70 3b 0a 63 68 61 72 20 2a 74 61 67 3b  *plp;.char *tag;
18760 0a 7b 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20  .{.  while( plp 
18770 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
18780 75 74 2c 22 25 31 32 73 25 73 20 28 73 74 61 74  ut,"%12s%s (stat
18790 65 20 25 32 64 29 20 22 2c 22 22 2c 74 61 67 2c  e %2d) ","",tag,
187a0 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 70 2d 3e 73  plp->cfp->stp->s
187b0 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 43 6f  tatenum);.    Co
187c0 6e 66 69 67 50 72 69 6e 74 28 6f 75 74 2c 70 6c  nfigPrint(out,pl
187d0 70 2d 3e 63 66 70 29 3b 0a 20 20 20 20 66 70 72  p->cfp);.    fpr
187e0 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a  intf(out,"\n");.
187f0 20 20 20 20 70 6c 70 20 3d 20 70 6c 70 2d 3e 6e      plp = plp->n
18800 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ext;.  }.}.#endi
18810 66 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 6e 20 61  f../* Print an a
18820 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 67 69 76  ction to the giv
18830 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
18840 6f 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  or.  Return FALS
18850 45 20 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20  E if.** nothing 
18860 77 61 73 20 61 63 74 75 61 6c 6c 79 20 70 72 69  was actually pri
18870 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50 72 69  nted..*/.int Pri
18880 6e 74 41 63 74 69 6f 6e 28 0a 20 20 73 74 72 75  ntAction(.  stru
18890 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 20  ct action *ap,  
188a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
188b0 63 74 69 6f 6e 20 74 6f 20 70 72 69 6e 74 20 2a  ction to print *
188c0 2f 0a 20 20 46 49 4c 45 20 2a 66 70 2c 20 20 20  /.  FILE *fp,   
188d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188e0 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 61 63 74  /* Print the act
188f0 69 6f 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ion here */.  in
18900 74 20 69 6e 64 65 6e 74 20 20 20 20 20 20 20 20  t indent        
18910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
18920 65 6e 74 20 62 79 20 74 68 69 73 20 61 6d 6f 75  ent by this amou
18930 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
18940 65 73 75 6c 74 20 3d 20 31 3b 0a 20 20 73 77 69  esult = 1;.  swi
18950 74 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b  tch( ap->type ){
18960 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54 3a  .    case SHIFT:
18970 20 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20   {.      struct 
18980 73 74 61 74 65 20 2a 73 74 70 20 3d 20 61 70 2d  state *stp = ap-
18990 3e 78 2e 73 74 70 3b 0a 20 20 20 20 20 20 66 70  >x.stp;.      fp
189a0 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68  rintf(fp,"%*s sh
189b0 69 66 74 20 20 20 20 20 20 20 20 25 2d 37 64 22  ift        %-7d"
189c0 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
189d0 6e 61 6d 65 2c 73 74 70 2d 3e 73 74 61 74 65 6e  name,stp->staten
189e0 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  um);.      break
189f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18a00 20 52 45 44 55 43 45 3a 20 7b 0a 20 20 20 20 20   REDUCE: {.     
18a10 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
18a20 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20   = ap->x.rp;.   
18a30 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
18a40 2a 73 20 72 65 64 75 63 65 20 20 20 20 20 20 20  *s reduce       
18a50 25 2d 37 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d  %-7d",indent,ap-
18a60 3e 73 70 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 69 52  >sp->name,rp->iR
18a70 75 6c 65 29 3b 0a 20 20 20 20 20 20 52 75 6c 65  ule);.      Rule
18a80 50 72 69 6e 74 28 66 70 2c 20 72 70 2c 20 2d 31  Print(fp, rp, -1
18a90 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
18aa0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
18ab0 48 49 46 54 52 45 44 55 43 45 3a 20 7b 0a 20 20  HIFTREDUCE: {.  
18ac0 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20      struct rule 
18ad0 2a 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a  *rp = ap->x.rp;.
18ae0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
18af0 2c 22 25 2a 73 20 73 68 69 66 74 2d 72 65 64 75  ,"%*s shift-redu
18b00 63 65 20 25 2d 37 64 22 2c 69 6e 64 65 6e 74 2c  ce %-7d",indent,
18b10 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 72 70 2d  ap->sp->name,rp-
18b20 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20 52  >iRule);.      R
18b30 75 6c 65 50 72 69 6e 74 28 66 70 2c 20 72 70 2c  ulePrint(fp, rp,
18b40 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   -1);.      brea
18b50 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
18b60 65 20 41 43 43 45 50 54 3a 0a 20 20 20 20 20 20  e ACCEPT:.      
18b70 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
18b80 61 63 63 65 70 74 22 2c 69 6e 64 65 6e 74 2c 61  accept",indent,a
18b90 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  p->sp->name);.  
18ba0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
18bb0 61 73 65 20 45 52 52 4f 52 3a 0a 20 20 20 20 20  ase ERROR:.     
18bc0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
18bd0 20 65 72 72 6f 72 22 2c 69 6e 64 65 6e 74 2c 61   error",indent,a
18be0 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  p->sp->name);.  
18bf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
18c00 61 73 65 20 53 52 43 4f 4e 46 4c 49 43 54 3a 0a  ase SRCONFLICT:.
18c10 20 20 20 20 63 61 73 65 20 52 52 43 4f 4e 46 4c      case RRCONFL
18c20 49 43 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  ICT:.      fprin
18c30 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75 63  tf(fp,"%*s reduc
18c40 65 20 20 20 20 20 20 20 25 2d 37 64 20 2a 2a 20  e       %-7d ** 
18c50 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74  Parsing conflict
18c60 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20 69 6e   **",.        in
18c70 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
18c80 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c  e,ap->x.rp->iRul
18c90 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
18ca0 0a 20 20 20 20 63 61 73 65 20 53 53 43 4f 4e 46  .    case SSCONF
18cb0 4c 49 43 54 3a 0a 20 20 20 20 20 20 66 70 72 69  LICT:.      fpri
18cc0 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66  ntf(fp,"%*s shif
18cd0 74 20 20 20 20 20 20 20 20 25 2d 37 64 20 2a 2a  t        %-7d **
18ce0 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63   Parsing conflic
18cf0 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20 69  t **",.        i
18d00 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
18d10 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74  me,ap->x.stp->st
18d20 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62  atenum);.      b
18d30 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
18d40 48 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20  H_RESOLVED:.    
18d50 20 20 69 66 28 20 73 68 6f 77 50 72 65 63 65 64    if( showPreced
18d60 65 6e 63 65 43 6f 6e 66 6c 69 63 74 20 29 7b 0a  enceConflict ){.
18d70 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
18d80 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20 20  fp,"%*s shift   
18d90 20 20 20 20 20 25 2d 37 64 20 2d 2d 20 64 72 6f       %-7d -- dro
18da0 70 70 65 64 20 62 79 20 70 72 65 63 65 64 65 6e  pped by preceden
18db0 63 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ce",.           
18dc0 20 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e       indent,ap->
18dd0 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73  sp->name,ap->x.s
18de0 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20  tp->statenum);. 
18df0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18e00 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a      result = 0;.
18e10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
18e20 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 44  eak;.    case RD
18e30 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 20  _RESOLVED:.     
18e40 20 69 66 28 20 73 68 6f 77 50 72 65 63 65 64 65   if( showPrecede
18e50 6e 63 65 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20  nceConflict ){. 
18e60 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
18e70 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25 2d  p,"%*s reduce %-
18e80 37 64 20 2d 2d 20 64 72 6f 70 70 65 64 20 62 79  7d -- dropped by
18e90 20 70 72 65 63 65 64 65 6e 63 65 22 2c 0a 20 20   precedence",.  
18ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
18eb0 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
18ec0 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75 6c  e,ap->x.rp->iRul
18ed0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
18ee0 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20  .        result 
18ef0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
18f00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
18f10 73 65 20 4e 4f 54 5f 55 53 45 44 3a 0a 20 20 20  se NOT_USED:.   
18f20 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20     result = 0;. 
18f30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
18f40 20 20 69 66 28 20 72 65 73 75 6c 74 20 26 26 20    if( result && 
18f50 61 70 2d 3e 73 70 4f 70 74 20 29 7b 0a 20 20 20  ap->spOpt ){.   
18f60 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 20 2f   fprintf(fp,"  /
18f70 2a 20 62 65 63 61 75 73 65 20 25 73 3d 3d 25 73  * because %s==%s
18f80 20 2a 2f 22 2c 20 61 70 2d 3e 73 70 2d 3e 6e 61   */", ap->sp->na
18f90 6d 65 2c 20 61 70 2d 3e 73 70 4f 70 74 2d 3e 6e  me, ap->spOpt->n
18fa0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame);.  }.  retu
18fb0 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a  rn result;.}../*
18fc0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 22 2a   Generate the "*
18fd0 2e 6f 75 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a  .out" log file *
18fe0 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74  /.void ReportOut
18ff0 70 75 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  put(struct lemon
19000 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20   *lemp).{.  int 
19010 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
19020 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
19030 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20   config *cfp;.  
19040 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
19050 70 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a  p;.  FILE *fp;..
19060 20 20 66 70 20 3d 20 66 69 6c 65 5f 6f 70 65 6e    fp = file_open
19070 28 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c 22 77 62  (lemp,".out","wb
19080 22 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20  ");.  if( fp==0 
19090 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
190a0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73  i=0; i<lemp->nxs
190b0 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
190c0 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
190d0 65 64 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e  ed[i];.    fprin
190e0 74 66 28 66 70 2c 22 53 74 61 74 65 20 25 64 3a  tf(fp,"State %d:
190f0 5c 6e 22 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75  \n",stp->statenu
19100 6d 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70  m);.    if( lemp
19110 2d 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63 66  ->basisflag ) cf
19120 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20 20 20 65  p=stp->bp;.    e
19130 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
19140 20 20 20 20 20 63 66 70 3d 73 74 70 2d 3e 63 66       cfp=stp->cf
19150 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 66  p;.    while( cf
19160 70 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  p ){.      char 
19170 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20 20 20 69  buf[20];.      i
19180 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d 63 66 70  f( cfp->dot==cfp
19190 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20  ->rp->nrhs ){.  
191a0 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69        lemon_spri
191b0 6e 74 66 28 62 75 66 2c 22 28 25 64 29 22 2c 63  ntf(buf,"(%d)",c
191c0 66 70 2d 3e 72 70 2d 3e 69 52 75 6c 65 29 3b 0a  fp->rp->iRule);.
191d0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
191e0 66 70 2c 22 20 20 20 20 25 35 73 20 22 2c 62 75  fp,"    %5s ",bu
191f0 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  f);.      }else{
19200 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
19210 28 66 70 2c 22 20 20 20 20 20 20 20 20 20 20 22  (fp,"          "
19220 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19230 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 66 70 2c   ConfigPrint(fp,
19240 63 66 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69  cfp);.      fpri
19250 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69  ntf(fp,"\n");.#i
19260 66 20 30 0a 20 20 20 20 20 20 53 65 74 50 72 69  f 0.      SetPri
19270 6e 74 28 66 70 2c 63 66 70 2d 3e 66 77 73 2c 6c  nt(fp,cfp->fws,l
19280 65 6d 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e  emp);.      Plin
19290 6b 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66  kPrint(fp,cfp->f
192a0 70 6c 70 2c 22 54 6f 20 20 22 29 3b 0a 20 20 20  plp,"To  ");.   
192b0 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70     PlinkPrint(fp
192c0 2c 63 66 70 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d  ,cfp->bplp,"From
192d0 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ");.#endif.     
192e0 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73   if( lemp->basis
192f0 66 6c 61 67 20 29 20 63 66 70 3d 63 66 70 2d 3e  flag ) cfp=cfp->
19300 62 70 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 20  bp;.      else  
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 3b 0a 20  cfp=cfp->next;. 
19330 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
19340 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 66  (fp,"\n");.    f
19350 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
19360 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
19370 0a 20 20 20 20 20 20 69 66 28 20 50 72 69 6e 74  .      if( Print
19380 41 63 74 69 6f 6e 28 61 70 2c 66 70 2c 33 30 29  Action(ap,fp,30)
19390 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c   ) fprintf(fp,"\
193a0 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  n");.    }.    f
193b0 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b  printf(fp,"\n");
193c0 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 66  .  }.  fprintf(f
193d0 70 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  p, "------------
193e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
193f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19400 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20  --------\n");.  
19410 66 70 72 69 6e 74 66 28 66 70 2c 20 22 53 79 6d  fprintf(fp, "Sym
19420 62 6f 6c 73 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72  bols:\n");.  for
19430 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
19440 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
19450 20 69 6e 74 20 6a 3b 0a 20 20 20 20 73 74 72 75   int j;.    stru
19460 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a  ct symbol *sp;..
19470 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73      sp = lemp->s
19480 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 66  ymbols[i];.    f
19490 70 72 69 6e 74 66 28 66 70 2c 20 22 20 20 25 33  printf(fp, "  %3
194a0 64 3a 20 25 73 22 2c 20 69 2c 20 73 70 2d 3e 6e  d: %s", i, sp->n
194b0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 70  ame);.    if( sp
194c0 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49  ->type==NONTERMI
194d0 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72  NAL ){.      fpr
194e0 69 6e 74 66 28 66 70 2c 20 22 3a 22 29 3b 0a 20  intf(fp, ":");. 
194f0 20 20 20 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d       if( sp->lam
19500 62 64 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66  bda ){.        f
19510 70 72 69 6e 74 66 28 66 70 2c 20 22 20 3c 6c 61  printf(fp, " <la
19520 6d 62 64 61 3e 22 29 3b 0a 20 20 20 20 20 20 7d  mbda>");.      }
19530 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
19540 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  j<lemp->ntermina
19550 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
19560 20 69 66 28 20 73 70 2d 3e 66 69 72 73 74 73 65   if( sp->firstse
19570 74 20 26 26 20 53 65 74 46 69 6e 64 28 73 70 2d  t && SetFind(sp-
19580 3e 66 69 72 73 74 73 65 74 2c 20 6a 29 20 29 7b  >firstset, j) ){
19590 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
195a0 74 66 28 66 70 2c 20 22 20 25 73 22 2c 20 6c 65  tf(fp, " %s", le
195b0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e  mp->symbols[j]->
195c0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
195d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
195e0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
195f0 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f  \n");.  }.  fclo
19600 73 65 28 66 70 29 3b 0a 20 20 72 65 74 75 72 6e  se(fp);.  return
19610 3b 0a 7d 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66  ;.}../* Search f
19620 6f 72 20 74 68 65 20 66 69 6c 65 20 22 6e 61 6d  or the file "nam
19630 65 22 20 77 68 69 63 68 20 69 73 20 69 6e 20 74  e" which is in t
19640 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
19650 79 20 61 73 0a 2a 2a 20 74 68 65 20 65 78 61 63  y as.** the exac
19660 75 74 61 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54  utable */.PRIVAT
19670 45 20 63 68 61 72 20 2a 70 61 74 68 73 65 61 72  E char *pathsear
19680 63 68 28 63 68 61 72 20 2a 61 72 67 76 30 2c 20  ch(char *argv0, 
19690 63 68 61 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 20  char *name, int 
196a0 6d 6f 64 65 6d 61 73 6b 29 0a 7b 0a 20 20 63 6f  modemask).{.  co
196b0 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 6c 69  nst char *pathli
196c0 73 74 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68  st;.  char *path
196d0 62 75 66 70 74 72 3b 0a 20 20 63 68 61 72 20 2a  bufptr;.  char *
196e0 70 61 74 68 62 75 66 3b 0a 20 20 63 68 61 72 20  pathbuf;.  char 
196f0 2a 70 61 74 68 2c 2a 63 70 3b 0a 20 20 63 68 61  *path,*cp;.  cha
19700 72 20 63 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57  r c;..#ifdef __W
19710 49 4e 33 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74  IN32__.  cp = st
19720 72 72 63 68 72 28 61 72 67 76 30 2c 27 5c 5c 27  rrchr(argv0,'\\'
19730 29 3b 0a 23 65 6c 73 65 0a 20 20 63 70 20 3d 20  );.#else.  cp = 
19740 73 74 72 72 63 68 72 28 61 72 67 76 30 2c 27 2f  strrchr(argv0,'/
19750 27 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ');.#endif.  if(
19760 20 63 70 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a   cp ){.    c = *
19770 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b  cp;.    *cp = 0;
19780 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63 68 61  .    path = (cha
19790 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f  r *)malloc( lemo
197a0 6e 53 74 72 6c 65 6e 28 61 72 67 76 30 29 20 2b  nStrlen(argv0) +
197b0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d   lemonStrlen(nam
197c0 65 29 20 2b 20 32 20 29 3b 0a 20 20 20 20 69 66  e) + 2 );.    if
197d0 28 20 70 61 74 68 20 29 20 6c 65 6d 6f 6e 5f 73  ( path ) lemon_s
197e0 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f  printf(path,"%s/
197f0 25 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b  %s",argv0,name);
19800 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20  .    *cp = c;.  
19810 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61 74 68 6c  }else{.    pathl
19820 69 73 74 20 3d 20 67 65 74 65 6e 76 28 22 50 41  ist = getenv("PA
19830 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20 70 61  TH");.    if( pa
19840 74 68 6c 69 73 74 3d 3d 30 20 29 20 70 61 74 68  thlist==0 ) path
19850 6c 69 73 74 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f  list = ".:/bin:/
19860 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20 70 61  usr/bin";.    pa
19870 74 68 62 75 66 20 3d 20 28 63 68 61 72 20 2a 29  thbuf = (char *)
19880 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74   malloc( lemonSt
19890 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 20 2b  rlen(pathlist) +
198a0 20 31 20 29 3b 0a 20 20 20 20 70 61 74 68 20 3d   1 );.    path =
198b0 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
198c0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74   lemonStrlen(pat
198d0 68 6c 69 73 74 29 2b 6c 65 6d 6f 6e 53 74 72 6c  hlist)+lemonStrl
198e0 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b 0a 20 20  en(name)+2 );.  
198f0 20 20 69 66 28 20 28 70 61 74 68 62 75 66 20 21    if( (pathbuf !
19900 3d 20 30 29 20 26 26 20 28 70 61 74 68 21 3d 30  = 0) && (path!=0
19910 29 20 29 7b 0a 20 20 20 20 20 20 70 61 74 68 62  ) ){.      pathb
19920 75 66 70 74 72 20 3d 20 70 61 74 68 62 75 66 3b  ufptr = pathbuf;
19930 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72  .      lemon_str
19940 63 70 79 28 70 61 74 68 62 75 66 2c 20 70 61 74  cpy(pathbuf, pat
19950 68 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  hlist);.      wh
19960 69 6c 65 28 20 2a 70 61 74 68 62 75 66 20 29 7b  ile( *pathbuf ){
19970 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20 73 74  .        cp = st
19980 72 63 68 72 28 70 61 74 68 62 75 66 2c 27 3a 27  rchr(pathbuf,':'
19990 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
199a0 70 3d 3d 30 20 29 20 63 70 20 3d 20 26 70 61 74  p==0 ) cp = &pat
199b0 68 62 75 66 5b 6c 65 6d 6f 6e 53 74 72 6c 65 6e  hbuf[lemonStrlen
199c0 28 70 61 74 68 62 75 66 29 5d 3b 0a 20 20 20 20  (pathbuf)];.    
199d0 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20      c = *cp;.   
199e0 20 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20       *cp = 0;.  
199f0 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69        lemon_spri
19a00 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25 73 22  ntf(path,"%s/%s"
19a10 2c 70 61 74 68 62 75 66 2c 6e 61 6d 65 29 3b 0a  ,pathbuf,name);.
19a20 20 20 20 20 20 20 20 20 2a 63 70 20 3d 20 63 3b          *cp = c;
19a30 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
19a40 30 20 29 20 70 61 74 68 62 75 66 5b 30 5d 20 3d  0 ) pathbuf[0] =
19a50 20 30 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65   0;.        else
19a60 20 70 61 74 68 62 75 66 20 3d 20 26 63 70 5b 31   pathbuf = &cp[1
19a70 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ];.        if( a
19a80 63 63 65 73 73 28 70 61 74 68 2c 6d 6f 64 65 6d  ccess(path,modem
19a90 61 73 6b 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ask)==0 ) break;
19aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
19ab0 72 65 65 28 70 61 74 68 62 75 66 70 74 72 29 3b  ree(pathbufptr);
19ac0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19ad0 75 72 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20  urn path;.}../* 
19ae0 47 69 76 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c  Given an action,
19af0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 69 6e 74   compute the int
19b00 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74  eger value for t
19b10 68 61 74 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68  hat action.** wh
19b20 69 63 68 20 69 73 20 74 6f 20 62 65 20 70 75 74  ich is to be put
19b30 20 69 6e 20 74 68 65 20 61 63 74 69 6f 6e 20 74   in the action t
19b40 61 62 6c 65 20 6f 66 20 74 68 65 20 67 65 6e 65  able of the gene
19b50 72 61 74 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a  rated machine..*
19b60 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76  * Return negativ
19b70 65 20 69 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73  e if no action s
19b80 68 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74  hould be generat
19b90 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69  ed..*/.PRIVATE i
19ba0 6e 74 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f  nt compute_actio
19bb0 6e 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  n(struct lemon *
19bc0 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 61 63 74  lemp, struct act
19bd0 69 6f 6e 20 2a 61 70 29 0a 7b 0a 20 20 69 6e 74  ion *ap).{.  int
19be0 20 61 63 74 3b 0a 20 20 73 77 69 74 63 68 28 20   act;.  switch( 
19bf0 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20 20  ap->type ){.    
19c00 63 61 73 65 20 53 48 49 46 54 3a 20 20 61 63 74  case SHIFT:  act
19c10 20 3d 20 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74   = ap->x.stp->st
19c20 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  atenum;         
19c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
19c40 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
19c50 48 49 46 54 52 45 44 55 43 45 3a 20 7b 0a 20 20  HIFTREDUCE: {.  
19c60 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 61 20 53      /* Since a S
19c70 48 49 46 54 20 69 73 20 69 6e 68 65 72 69 65 6e  HIFT is inherien
19c80 74 20 61 66 74 65 72 20 61 20 70 72 69 6f 72 20  t after a prior 
19c90 52 45 44 55 43 45 2c 20 63 6f 6e 76 65 72 74 20  REDUCE, convert 
19ca0 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 53 48 49  any.      ** SHI
19cb0 46 54 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20  FTREDUCE action 
19cc0 77 69 74 68 20 61 20 6e 6f 6e 74 65 72 6d 69 6e  with a nontermin
19cd0 61 6c 20 6f 6e 20 74 68 65 20 4c 48 53 20 69 6e  al on the LHS in
19ce0 74 6f 20 61 20 73 69 6d 70 6c 65 0a 20 20 20 20  to a simple.    
19cf0 20 20 2a 2a 20 52 45 44 55 43 45 20 61 63 74 69    ** REDUCE acti
19d00 6f 6e 3a 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  on: */.      if(
19d10 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d   ap->sp->index>=
19d20 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
19d30 29 7b 0a 20 20 20 20 20 20 20 20 61 63 74 20 3d  ){.        act =
19d40 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64 75 63 65   lemp->minReduce
19d50 20 2b 20 61 70 2d 3e 78 2e 72 70 2d 3e 69 52 75   + ap->x.rp->iRu
19d60 6c 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  le;.      }else{
19d70 0a 20 20 20 20 20 20 20 20 61 63 74 20 3d 20 6c  .        act = l
19d80 65 6d 70 2d 3e 6d 69 6e 53 68 69 66 74 52 65 64  emp->minShiftRed
19d90 75 63 65 20 2b 20 61 70 2d 3e 78 2e 72 70 2d 3e  uce + ap->x.rp->
19da0 69 52 75 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  iRule;.      }. 
19db0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19dc0 7d 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43  }.    case REDUC
19dd0 45 3a 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6d  E: act = lemp->m
19de0 69 6e 52 65 64 75 63 65 20 2b 20 61 70 2d 3e 78  inReduce + ap->x
19df0 2e 72 70 2d 3e 69 52 75 6c 65 3b 20 20 20 20 20  .rp->iRule;     
19e00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19e10 63 61 73 65 20 45 52 52 4f 52 3a 20 20 61 63 74  case ERROR:  act
19e20 20 3d 20 6c 65 6d 70 2d 3e 65 72 72 41 63 74 69   = lemp->errActi
19e30 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
19e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
19e50 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41  reak;.    case A
19e60 43 43 45 50 54 3a 20 61 63 74 20 3d 20 6c 65 6d  CCEPT: act = lem
19e70 70 2d 3e 61 63 63 41 63 74 69 6f 6e 3b 20 20 20  p->accAction;   
19e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e90 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
19ea0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
19eb0 20 61 63 74 20 3d 20 2d 31 3b 20 62 72 65 61 6b   act = -1; break
19ec0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
19ed0 63 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4c  ct;.}..#define L
19ee0 49 4e 45 53 49 5a 45 20 31 30 30 30 0a 2f 2a 20  INESIZE 1000./* 
19ef0 54 68 65 20 6e 65 78 74 20 63 6c 75 73 74 65 72  The next cluster
19f00 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
19f10 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68 65   for reading the
19f20 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 0a 2a   template file.*
19f30 2a 20 61 6e 64 20 77 72 69 74 69 6e 67 20 74 68  * and writing th
19f40 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65  e results to the
19f50 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
19f60 72 20 2a 2f 0a 2f 2a 20 54 68 65 20 66 69 72 73  r */./* The firs
19f70 74 20 66 75 6e 63 74 69 6f 6e 20 74 72 61 6e 73  t function trans
19f80 66 65 72 73 20 64 61 74 61 20 66 72 6f 6d 20 22  fers data from "
19f90 69 6e 22 20 74 6f 20 22 6f 75 74 22 20 75 6e 74  in" to "out" unt
19fa0 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20 69 73 20  il.** a line is 
19fb0 73 65 65 6e 20 77 68 69 63 68 20 62 65 67 69 6e  seen which begin
19fc0 73 20 77 69 74 68 20 22 25 25 22 2e 20 20 54 68  s with "%%".  Th
19fd0 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73  e line number is
19fe0 0a 2a 2a 20 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a  .** tracked..**.
19ff0 2a 2a 20 69 66 20 6e 61 6d 65 21 3d 30 2c 20 74  ** if name!=0, t
1a000 68 65 6e 20 61 6e 79 20 77 6f 72 64 20 74 68 61  hen any word tha
1a010 74 20 62 65 67 69 6e 20 77 69 74 68 20 22 50 61  t begin with "Pa
1a020 72 73 65 22 20 69 73 20 63 68 61 6e 67 65 64 20  rse" is changed 
1a030 74 6f 0a 2a 2a 20 62 65 67 69 6e 20 77 69 74 68  to.** begin with
1a040 20 2a 6e 61 6d 65 20 69 6e 73 74 65 61 64 2e 0a   *name instead..
1a050 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
1a060 74 70 6c 74 5f 78 66 65 72 28 63 68 61 72 20 2a  tplt_xfer(char *
1a070 6e 61 6d 65 2c 20 46 49 4c 45 20 2a 69 6e 2c 20  name, FILE *in, 
1a080 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74 20 2a  FILE *out, int *
1a090 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20 69 6e 74 20  lineno).{.  int 
1a0a0 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 63 68 61  i, iStart;.  cha
1a0b0 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d  r line[LINESIZE]
1a0c0 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73  ;.  while( fgets
1a0d0 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69  (line,LINESIZE,i
1a0e0 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21 3d  n) && (line[0]!=
1a0f0 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d  '%' || line[1]!=
1a100 27 25 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c 69  '%') ){.    (*li
1a110 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53 74  neno)++;.    iSt
1a120 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  art = 0;.    if(
1a130 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 66   name ){.      f
1a140 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b  or(i=0; line[i];
1a150 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
1a160 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27 20  f( line[i]=='P' 
1a170 26 26 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e 65  && strncmp(&line
1a180 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d 3d  [i],"Parse",5)==
1a190 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
1a1a0 69 3d 3d 30 20 7c 7c 20 21 49 53 41 4c 50 48 41  i==0 || !ISALPHA
1a1b0 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20 20  (line[i-1])).   
1a1c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1a1d0 20 20 69 66 28 20 69 3e 69 53 74 61 72 74 20 29    if( i>iStart )
1a1e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e   fprintf(out,"%.
1a1f0 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c 69  *s",i-iStart,&li
1a200 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 20  ne[iStart]);.   
1a210 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1a220 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a 20  ut,"%s",name);. 
1a230 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b           i += 4;
1a240 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72  .          iStar
1a250 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20  t = i+1;.       
1a260 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1a270 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1a280 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74 61  ,"%s",&line[iSta
1a290 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  rt]);.  }.}../* 
1a2a0 54 68 65 20 6e 65 78 74 20 66 75 6e 63 74 69 6f  The next functio
1a2b0 6e 20 66 69 6e 64 73 20 74 68 65 20 74 65 6d 70  n finds the temp
1a2c0 6c 61 74 65 20 66 69 6c 65 20 61 6e 64 20 6f 70  late file and op
1a2d0 65 6e 73 20 69 74 2c 20 72 65 74 75 72 6e 69 6e  ens it, returnin
1a2e0 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  g.** a pointer t
1a2f0 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c  o the opened fil
1a300 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49  e. */.PRIVATE FI
1a310 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 73 74  LE *tplt_open(st
1a320 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
1a330 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  ).{.  static cha
1a340 72 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 5b 5d  r templatename[]
1a350 20 3d 20 22 6c 65 6d 70 61 72 2e 63 22 3b 0a 20   = "lempar.c";. 
1a360 20 63 68 61 72 20 62 75 66 5b 31 30 30 30 5d 3b   char buf[1000];
1a370 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63  .  FILE *in;.  c
1a380 68 61 72 20 2a 74 70 6c 74 6e 61 6d 65 3b 0a 20  har *tpltname;. 
1a390 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20 2f 2a   char *cp;..  /*
1a3a0 20 66 69 72 73 74 2c 20 73 65 65 20 69 66 20 75   first, see if u
1a3b0 73 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20  ser specified a 
1a3c0 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 6e 61 6d  template filenam
1a3d0 65 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  e on the command
1a3e0 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28   line. */.  if (
1a3f0 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
1a400 65 20 21 3d 20 30 29 20 7b 0a 20 20 20 20 69 66  e != 0) {.    if
1a410 28 20 61 63 63 65 73 73 28 75 73 65 72 5f 74 65  ( access(user_te
1a420 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29 3d  mplatename,004)=
1a430 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  =-1 ){.      fpr
1a440 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
1a450 27 74 20 66 69 6e 64 20 74 68 65 20 70 61 72 73  't find the pars
1a460 65 72 20 64 72 69 76 65 72 20 74 65 6d 70 6c 61  er driver templa
1a470 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c  te file \"%s\".\
1a480 6e 22 2c 0a 20 20 20 20 20 20 20 20 75 73 65 72  n",.        user
1a490 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a  _templatename);.
1a4a0 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
1a4b0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65  rcnt++;.      re
1a4c0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1a4d0 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 75 73 65    in = fopen(use
1a4e0 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 22  r_templatename,"
1a4f0 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  rb");.    if( in
1a500 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
1a510 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
1a520 27 74 20 6f 70 65 6e 20 74 68 65 20 74 65 6d 70  't open the temp
1a530 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22  late file \"%s\"
1a540 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  .\n",.          
1a550 20 20 20 20 75 73 65 72 5f 74 65 6d 70 6c 61 74      user_templat
1a560 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65  ename);.      le
1a570 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
1a580 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1a590 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1a5a0 20 69 6e 3b 0a 20 20 7d 0a 0a 20 20 63 70 20 3d   in;.  }..  cp =
1a5b0 20 73 74 72 72 63 68 72 28 6c 65 6d 70 2d 3e 66   strrchr(lemp->f
1a5c0 69 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20  ilename,'.');.  
1a5d0 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20 6c 65  if( cp ){.    le
1a5e0 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 62 75 66 2c  mon_sprintf(buf,
1a5f0 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e 74 29 28  "%.*s.lt",(int)(
1a600 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  cp-lemp->filenam
1a610 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  e),lemp->filenam
1a620 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
1a630 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 62   lemon_sprintf(b
1a640 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d  uf,"%s.lt",lemp-
1a650 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  >filename);.  }.
1a660 20 20 69 66 28 20 61 63 63 65 73 73 28 62 75 66    if( access(buf
1a670 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ,004)==0 ){.    
1a680 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75 66 3b 0a  tpltname = buf;.
1a690 20 20 7d 65 6c 73 65 20 69 66 28 20 61 63 63 65    }else if( acce
1a6a0 73 73 28 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c  ss(templatename,
1a6b0 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74  004)==0 ){.    t
1a6c0 70 6c 74 6e 61 6d 65 20 3d 20 74 65 6d 70 6c 61  pltname = templa
1a6d0 74 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b  tename;.  }else{
1a6e0 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20  .    tpltname = 
1a6f0 70 61 74 68 73 65 61 72 63 68 28 6c 65 6d 70 2d  pathsearch(lemp-
1a700 3e 61 72 67 76 30 2c 74 65 6d 70 6c 61 74 65 6e  >argv0,templaten
1a710 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 66  ame,0);.  }.  if
1a720 28 20 74 70 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b  ( tpltname==0 ){
1a730 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
1a740 65 72 72 2c 22 43 61 6e 27 74 20 66 69 6e 64 20  err,"Can't find 
1a750 74 68 65 20 70 61 72 73 65 72 20 64 72 69 76 65  the parser drive
1a760 72 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20  r template file 
1a770 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20  \"%s\".\n",.    
1a780 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20  templatename);. 
1a790 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
1a7a0 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t++;.    return 
1a7b0 30 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f  0;.  }.  in = fo
1a7c0 70 65 6e 28 74 70 6c 74 6e 61 6d 65 2c 22 72 62  pen(tpltname,"rb
1a7d0 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  ");.  if( in==0 
1a7e0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
1a7f0 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65  tderr,"Can't ope
1a800 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66  n the template f
1a810 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 74  ile \"%s\".\n",t
1a820 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20  emplatename);.  
1a830 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
1a840 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ++;.    return 0
1a850 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1a860 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61  n;.}../* Print a
1a870 20 23 6c 69 6e 65 20 64 69 72 65 63 74 69 76 65   #line directive
1a880 20 6c 69 6e 65 20 74 6f 20 74 68 65 20 6f 75 74   line to the out
1a890 70 75 74 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49  put file. */.PRI
1a8a0 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 6c  VATE void tplt_l
1a8b0 69 6e 65 64 69 72 28 46 49 4c 45 20 2a 6f 75 74  inedir(FILE *out
1a8c0 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 68  , int lineno, ch
1a8d0 61 72 20 2a 66 69 6c 65 6e 61 6d 65 29 0a 7b 0a  ar *filename).{.
1a8e0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1a8f0 6c 69 6e 65 20 25 64 20 5c 22 22 2c 6c 69 6e 65  line %d \"",line
1a900 6e 6f 29 3b 0a 20 20 77 68 69 6c 65 28 20 2a 66  no);.  while( *f
1a910 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69  ilename ){.    i
1a920 66 28 20 2a 66 69 6c 65 6e 61 6d 65 20 3d 3d 20  f( *filename == 
1a930 27 5c 5c 27 20 29 20 70 75 74 63 28 27 5c 5c 27  '\\' ) putc('\\'
1a940 2c 6f 75 74 29 3b 0a 20 20 20 20 70 75 74 63 28  ,out);.    putc(
1a950 2a 66 69 6c 65 6e 61 6d 65 2c 6f 75 74 29 3b 0a  *filename,out);.
1a960 20 20 20 20 66 69 6c 65 6e 61 6d 65 2b 2b 3b 0a      filename++;.
1a970 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
1a980 74 2c 22 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a  t,"\"\n");.}../*
1a990 20 50 72 69 6e 74 20 61 20 73 74 72 69 6e 67 20   Print a string 
1a9a0 74 6f 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  to the file and 
1a9b0 6b 65 65 70 20 74 68 65 20 6c 69 6e 65 6e 75 6d  keep the linenum
1a9c0 62 65 72 20 75 70 20 74 6f 20 64 61 74 65 20 2a  ber up to date *
1a9d0 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74  /.PRIVATE void t
1a9e0 70 6c 74 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a  plt_print(FILE *
1a9f0 6f 75 74 2c 20 73 74 72 75 63 74 20 6c 65 6d 6f  out, struct lemo
1aa00 6e 20 2a 6c 65 6d 70 2c 20 63 68 61 72 20 2a 73  n *lemp, char *s
1aa10 74 72 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29  tr, int *lineno)
1aa20 0a 7b 0a 20 20 69 66 28 20 73 74 72 3d 3d 30 20  .{.  if( str==0 
1aa30 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c  ) return;.  whil
1aa40 65 28 20 2a 73 74 72 20 29 7b 0a 20 20 20 20 70  e( *str ){.    p
1aa50 75 74 63 28 2a 73 74 72 2c 6f 75 74 29 3b 0a 20  utc(*str,out);. 
1aa60 20 20 20 69 66 28 20 2a 73 74 72 3d 3d 27 5c 6e     if( *str=='\n
1aa70 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ' ) (*lineno)++;
1aa80 0a 20 20 20 20 73 74 72 2b 2b 3b 0a 20 20 7d 0a  .    str++;.  }.
1aa90 20 20 69 66 28 20 73 74 72 5b 2d 31 5d 21 3d 27    if( str[-1]!='
1aaa0 5c 6e 27 20 29 7b 0a 20 20 20 20 70 75 74 63 28  \n' ){.    putc(
1aab0 27 5c 6e 27 2c 6f 75 74 29 3b 0a 20 20 20 20 28  '\n',out);.    (
1aac0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 7d 0a  *lineno)++;.  }.
1aad0 20 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c    if (!lemp->nol
1aae0 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 0a 20 20  inenosflag) {.  
1aaf0 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74    (*lineno)++; t
1ab00 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c  plt_linedir(out,
1ab10 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75  *lineno,lemp->ou
1ab20 74 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65  tname);.  }.  re
1ab30 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  turn;.}../*.** T
1ab40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
1ab50 74 69 6e 65 20 65 6d 69 74 73 20 63 6f 64 65 20  tine emits code 
1ab60 66 6f 72 20 74 68 65 20 64 65 73 74 72 75 63 74  for the destruct
1ab70 6f 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 79  or for the.** sy
1ab80 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64 20  mbol sp.*/.void 
1ab90 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  emit_destructor_
1aba0 63 6f 64 65 28 0a 20 20 46 49 4c 45 20 2a 6f 75  code(.  FILE *ou
1abb0 74 2c 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  t,.  struct symb
1abc0 6f 6c 20 2a 73 70 2c 0a 20 20 73 74 72 75 63 74  ol *sp,.  struct
1abd0 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20   lemon *lemp,.  
1abe0 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a 20  int *lineno.){. 
1abf0 63 68 61 72 20 2a 63 70 20 3d 20 30 3b 0a 0a 20  char *cp = 0;.. 
1ac00 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45  if( sp->type==TE
1ac10 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 63 70 20  RMINAL ){.   cp 
1ac20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73  = lemp->tokendes
1ac30 74 3b 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20  t;.   if( cp==0 
1ac40 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 66 70 72  ) return;.   fpr
1ac50 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b  intf(out,"{\n");
1ac60 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d   (*lineno)++;. }
1ac70 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 64 65 73  else if( sp->des
1ac80 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 63 70  tructor ){.   cp
1ac90 20 3d 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f   = sp->destructo
1aca0 72 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  r;.   fprintf(ou
1acb0 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65  t,"{\n"); (*line
1acc0 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 28 20 21 6c  no)++;.   if( !l
1acd0 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c  emp->nolinenosfl
1ace0 61 67 20 29 7b 0a 20 20 20 20 20 28 2a 6c 69 6e  ag ){.     (*lin
1acf0 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 74 70 6c  eno)++;.     tpl
1ad00 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 73 70  t_linedir(out,sp
1ad10 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 2c 6c 65 6d  ->destLineno,lem
1ad20 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
1ad30 20 7d 0a 20 7d 65 6c 73 65 20 69 66 28 20 6c 65   }. }else if( le
1ad40 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a 20  mp->vardest ){. 
1ad50 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61 72    cp = lemp->var
1ad60 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70 3d  dest;.   if( cp=
1ad70 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
1ad80 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e  fprintf(out,"{\n
1ad90 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
1ada0 0a 20 7d 65 6c 73 65 7b 0a 20 20 20 61 73 73 65  . }else{.   asse
1adb0 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e  rt( 0 );  /* Can
1adc0 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20 7d  not happen */. }
1add0 0a 20 66 6f 72 28 3b 20 2a 63 70 3b 20 63 70 2b  . for(; *cp; cp+
1ade0 2b 29 7b 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d  +){.   if( *cp==
1adf0 27 24 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 24  '$' && cp[1]=='$
1ae00 27 20 29 7b 0a 20 20 20 20 20 66 70 72 69 6e 74  ' ){.     fprint
1ae10 66 28 6f 75 74 2c 22 28 79 79 70 6d 69 6e 6f 72  f(out,"(yypminor
1ae20 2d 3e 79 79 25 64 29 22 2c 73 70 2d 3e 64 74 6e  ->yy%d)",sp->dtn
1ae30 75 6d 29 3b 0a 20 20 20 20 20 63 70 2b 2b 3b 0a  um);.     cp++;.
1ae40 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1ae50 20 20 7d 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d    }.   if( *cp==
1ae60 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29  '\n' ) (*lineno)
1ae70 2b 2b 3b 0a 20 20 20 66 70 75 74 63 28 2a 63 70  ++;.   fputc(*cp
1ae80 2c 6f 75 74 29 3b 0a 20 7d 0a 20 66 70 72 69 6e  ,out);. }. fprin
1ae90 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 28 2a  tf(out,"\n"); (*
1aea0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 69 66 20 28  lineno)++;. if (
1aeb0 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73  !lemp->nolinenos
1aec0 66 6c 61 67 29 20 7b 0a 20 20 20 28 2a 6c 69 6e  flag) {.   (*lin
1aed0 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e  eno)++; tplt_lin
1aee0 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f  edir(out,*lineno
1aef0 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b  ,lemp->outname);
1af00 0a 20 7d 0a 20 66 70 72 69 6e 74 66 28 6f 75 74  . }. fprintf(out
1af10 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e  ,"}\n"); (*linen
1af20 6f 29 2b 2b 3b 0a 20 72 65 74 75 72 6e 3b 0a 7d  o)++;. return;.}
1af30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1af40 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  RUE (non-zero) i
1af50 66 20 74 68 65 20 67 69 76 65 6e 20 73 79 6d 62  f the given symb
1af60 6f 6c 20 68 61 73 20 61 20 64 65 73 74 72 75 63  ol has a destruc
1af70 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 68 61 73 5f  tor..*/.int has_
1af80 64 65 73 74 72 75 63 74 6f 72 28 73 74 72 75 63  destructor(struc
1af90 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 20 73 74  t symbol *sp, st
1afa0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
1afb0 29 0a 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20  ).{.  int ret;. 
1afc0 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54   if( sp->type==T
1afd0 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 72  ERMINAL ){.    r
1afe0 65 74 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  et = lemp->token
1aff0 64 65 73 74 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  dest!=0;.  }else
1b000 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70  {.    ret = lemp
1b010 2d 3e 76 61 72 64 65 73 74 21 3d 30 20 7c 7c 20  ->vardest!=0 || 
1b020 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d  sp->destructor!=
1b030 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1b040 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ret;.}../*.** Ap
1b050 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61 20 64  pend text to a d
1b060 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
1b070 61 74 65 64 20 73 74 72 69 6e 67 2e 20 20 49 66  ated string.  If
1b080 20 7a 54 65 78 74 20 69 73 20 30 20 74 68 65 6e   zText is 0 then
1b090 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 73 74  .** reset the st
1b0a0 72 69 6e 67 20 74 6f 20 62 65 20 65 6d 70 74 79  ring to be empty
1b0b0 20 61 67 61 69 6e 2e 20 20 41 6c 77 61 79 73 20   again.  Always 
1b0c0 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6d 70 6c  return the compl
1b0d0 65 74 65 20 74 65 78 74 0a 2a 2a 20 6f 66 20 74  ete text.** of t
1b0e0 68 65 20 73 74 72 69 6e 67 20 28 77 68 69 63 68  he string (which
1b0f0 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
1b100 77 69 74 68 20 65 61 63 68 20 63 61 6c 6c 29 2e  with each call).
1b110 0a 2a 2a 0a 2a 2a 20 6e 20 62 79 74 65 73 20 6f  .**.** n bytes o
1b120 66 20 7a 54 65 78 74 20 61 72 65 20 73 74 6f 72  f zText are stor
1b130 65 64 2e 20 20 49 66 20 6e 3d 3d 30 20 74 68 65  ed.  If n==0 the
1b140 6e 20 61 6c 6c 20 6f 66 20 7a 54 65 78 74 20 75  n all of zText u
1b150 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  p to the first.*
1b160 2a 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 6f  * \000 terminato
1b170 72 20 69 73 20 73 74 6f 72 65 64 2e 20 20 7a 54  r is stored.  zT
1b180 65 78 74 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20  ext can contain 
1b190 75 70 20 74 6f 20 74 77 6f 20 69 6e 73 74 61 6e  up to two instan
1b1a0 63 65 73 20 6f 66 0a 2a 2a 20 25 64 2e 20 20 54  ces of.** %d.  T
1b1b0 68 65 20 76 61 6c 75 65 73 20 6f 66 20 70 31 20  he values of p1 
1b1c0 61 6e 64 20 70 32 20 61 72 65 20 77 72 69 74 74  and p2 are writt
1b1d0 65 6e 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73  en into the firs
1b1e0 74 20 61 6e 64 20 73 65 63 6f 6e 64 0a 2a 2a 20  t and second.** 
1b1f0 25 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  %d..**.** If n==
1b200 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 70 72 65  -1, then the pre
1b210 76 69 6f 75 73 20 63 68 61 72 61 63 74 65 72 20  vious character 
1b220 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  is overwritten..
1b230 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72 20  */.PRIVATE char 
1b240 2a 61 70 70 65 6e 64 5f 73 74 72 28 63 6f 6e 73  *append_str(cons
1b250 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69  t char *zText, i
1b260 6e 74 20 6e 2c 20 69 6e 74 20 70 31 2c 20 69 6e  nt n, int p1, in
1b270 74 20 70 32 29 7b 0a 20 20 73 74 61 74 69 63 20  t p2){.  static 
1b280 63 68 61 72 20 65 6d 70 74 79 5b 31 5d 20 3d 20  char empty[1] = 
1b290 7b 20 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  { 0 };.  static 
1b2a0 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 73  char *z = 0;.  s
1b2b0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 65  tatic int alloce
1b2c0 64 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  d = 0;.  static 
1b2d0 69 6e 74 20 75 73 65 64 20 3d 20 30 3b 0a 20 20  int used = 0;.  
1b2e0 69 6e 74 20 63 3b 0a 20 20 63 68 61 72 20 7a 49  int c;.  char zI
1b2f0 6e 74 5b 34 30 5d 3b 0a 20 20 69 66 28 20 7a 54  nt[40];.  if( zT
1b300 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ext==0 ){.    if
1b310 28 20 75 73 65 64 3d 3d 30 20 26 26 20 7a 21 3d  ( used==0 && z!=
1b320 30 20 29 20 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20  0 ) z[0] = 0;.  
1b330 20 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 20 20    used = 0;.    
1b340 72 65 74 75 72 6e 20 7a 3b 0a 20 20 7d 0a 20 20  return z;.  }.  
1b350 69 66 28 20 6e 3c 3d 30 20 29 7b 0a 20 20 20 20  if( n<=0 ){.    
1b360 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20  if( n<0 ){.     
1b370 20 75 73 65 64 20 2b 3d 20 6e 3b 0a 20 20 20 20   used += n;.    
1b380 20 20 61 73 73 65 72 74 28 20 75 73 65 64 3e 3d    assert( used>=
1b390 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  0 );.    }.    n
1b3a0 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a   = lemonStrlen(z
1b3b0 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Text);.  }.  if(
1b3c0 20 28 69 6e 74 29 20 28 6e 2b 73 69 7a 65 6f 66   (int) (n+sizeof
1b3d0 28 7a 49 6e 74 29 2a 32 2b 75 73 65 64 29 20 3e  (zInt)*2+used) >
1b3e0 3d 20 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20  = alloced ){.   
1b3f0 20 61 6c 6c 6f 63 65 64 20 3d 20 6e 20 2b 20 73   alloced = n + s
1b400 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 20 2b 20  izeof(zInt)*2 + 
1b410 75 73 65 64 20 2b 20 32 30 30 3b 0a 20 20 20 20  used + 200;.    
1b420 7a 20 3d 20 28 63 68 61 72 20 2a 29 20 72 65 61  z = (char *) rea
1b430 6c 6c 6f 63 28 7a 2c 20 20 61 6c 6c 6f 63 65 64  lloc(z,  alloced
1b440 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 3d 3d  );.  }.  if( z==
1b450 30 20 29 20 72 65 74 75 72 6e 20 65 6d 70 74 79  0 ) return empty
1b460 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
1b470 20 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 28   0 ){.    c = *(
1b480 7a 54 65 78 74 2b 2b 29 3b 0a 20 20 20 20 69 66  zText++);.    if
1b490 28 20 63 3d 3d 27 25 27 20 26 26 20 6e 3e 30 20  ( c=='%' && n>0 
1b4a0 26 26 20 7a 54 65 78 74 5b 30 5d 3d 3d 27 64 27  && zText[0]=='d'
1b4b0 20 29 7b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f   ){.      lemon_
1b4c0 73 70 72 69 6e 74 66 28 7a 49 6e 74 2c 20 22 25  sprintf(zInt, "%
1b4d0 64 22 2c 20 70 31 29 3b 0a 20 20 20 20 20 20 70  d", p1);.      p
1b4e0 31 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 6c 65  1 = p2;.      le
1b4f0 6d 6f 6e 5f 73 74 72 63 70 79 28 26 7a 5b 75 73  mon_strcpy(&z[us
1b500 65 64 5d 2c 20 7a 49 6e 74 29 3b 0a 20 20 20 20  ed], zInt);.    
1b510 20 20 75 73 65 64 20 2b 3d 20 6c 65 6d 6f 6e 53    used += lemonS
1b520 74 72 6c 65 6e 28 26 7a 5b 75 73 65 64 5d 29 3b  trlen(&z[used]);
1b530 0a 20 20 20 20 20 20 7a 54 65 78 74 2b 2b 3b 0a  .      zText++;.
1b540 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d        n--;.    }
1b550 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b 75 73  else{.      z[us
1b560 65 64 2b 2b 5d 20 3d 20 28 63 68 61 72 29 63 3b  ed++] = (char)c;
1b570 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b 75  .    }.  }.  z[u
1b580 73 65 64 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  sed] = 0;.  retu
1b590 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  rn z;.}../*.** W
1b5a0 72 69 74 65 20 61 6e 64 20 74 72 61 6e 73 66 6f  rite and transfo
1b5b0 72 6d 20 74 68 65 20 72 70 2d 3e 63 6f 64 65 20  rm the rp->code 
1b5c0 73 74 72 69 6e 67 20 73 6f 20 74 68 61 74 20 73  string so that s
1b5d0 79 6d 62 6f 6c 73 20 61 72 65 20 65 78 70 61 6e  ymbols are expan
1b5e0 64 65 64 2e 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ded..** Populate
1b5f0 20 74 68 65 20 72 70 2d 3e 63 6f 64 65 50 72 65   the rp->codePre
1b600 66 69 78 20 61 6e 64 20 72 70 2d 3e 63 6f 64 65  fix and rp->code
1b610 53 75 66 66 69 78 20 73 74 72 69 6e 67 73 2c 20  Suffix strings, 
1b620 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
1b630 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  **.** Return 1 i
1b640 66 20 74 68 65 20 65 78 70 61 6e 64 65 64 20 63  f the expanded c
1b650 6f 64 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ode requires tha
1b660 74 20 22 79 79 6c 68 73 6d 69 6e 6f 72 22 20 6c  t "yylhsminor" l
1b670 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ocal variable.**
1b680 20 74 6f 20 62 65 20 64 65 66 69 6e 65 64 2e 0a   to be defined..
1b690 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 74  */.PRIVATE int t
1b6a0 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28 73 74  ranslate_code(st
1b6b0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
1b6c0 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72  , struct rule *r
1b6d0 70 29 7b 0a 20 20 63 68 61 72 20 2a 63 70 2c 20  p){.  char *cp, 
1b6e0 2a 78 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *xp;.  int i;.  
1b6f0 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
1b700 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1b710 66 20 79 79 6c 68 73 6d 69 6e 6f 72 20 69 73 20  f yylhsminor is 
1b720 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 6f  used */.  int do
1b730 6e 74 55 73 65 52 68 73 30 20 3d 20 30 3b 20 20  ntUseRhs0 = 0;  
1b740 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 75 73 65   /* If true, use
1b750 20 6f 66 20 6c 65 66 74 2d 6d 6f 73 74 20 52 48   of left-most RH
1b760 53 20 6c 61 62 65 6c 20 69 73 20 69 6c 6c 65 67  S label is illeg
1b770 61 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  al */.  const ch
1b780 61 72 20 2a 7a 53 6b 69 70 20 3d 20 30 3b 20 2f  ar *zSkip = 0; /
1b790 2a 20 54 68 65 20 7a 4f 76 77 72 74 20 63 6f 6d  * The zOvwrt com
1b7a0 6d 65 6e 74 20 77 69 74 68 69 6e 20 72 70 2d 3e  ment within rp->
1b7b0 63 6f 64 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  code, or NULL */
1b7c0 0a 20 20 63 68 61 72 20 6c 68 73 75 73 65 64 20  .  char lhsused 
1b7d0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  = 0;      /* Tru
1b7e0 65 20 69 66 20 74 68 65 20 4c 48 53 20 65 6c 65  e if the LHS ele
1b7f0 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 20 75 73  ment has been us
1b800 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 6c 68 73  ed */.  char lhs
1b810 64 69 72 65 63 74 3b 20 20 20 20 20 20 20 20 2f  direct;        /
1b820 2a 20 54 72 75 65 20 69 66 20 4c 48 53 20 77 72  * True if LHS wr
1b830 69 74 65 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ites directly in
1b840 74 6f 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68  to stack */.  ch
1b850 61 72 20 75 73 65 64 5b 4d 41 58 52 48 53 5d 3b  ar used[MAXRHS];
1b860 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1b870 20 65 61 63 68 20 52 48 53 20 65 6c 65 6d 65 6e   each RHS elemen
1b880 74 20 77 68 69 63 68 20 69 73 20 75 73 65 64 20  t which is used 
1b890 2a 2f 0a 20 20 63 68 61 72 20 7a 4c 68 73 5b 35  */.  char zLhs[5
1b8a0 30 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  0];         /* C
1b8b0 6f 6e 76 65 72 74 20 74 68 65 20 4c 48 53 20 73  onvert the LHS s
1b8c0 79 6d 62 6f 6c 20 69 6e 74 6f 20 74 68 69 73 20  ymbol into this 
1b8d0 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  string */.  char
1b8e0 20 7a 4f 76 77 72 74 5b 39 30 30 5d 3b 20 20 20   zOvwrt[900];   
1b8f0 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 74 68     /* Comment th
1b900 61 74 20 74 6f 20 61 6c 6c 6f 77 20 4c 48 53 20  at to allow LHS 
1b910 74 6f 20 6f 76 65 72 77 72 69 74 65 20 52 48 53  to overwrite RHS
1b920 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */..  for(i=0; 
1b930 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
1b940 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20   used[i] = 0;.  
1b950 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  lhsused = 0;..  
1b960 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20  if( rp->code==0 
1b970 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68  ){.    static ch
1b980 61 72 20 6e 65 77 6c 69 6e 65 73 74 72 5b 32 5d  ar newlinestr[2]
1b990 20 3d 20 7b 20 27 5c 6e 27 2c 20 27 5c 30 27 20   = { '\n', '\0' 
1b9a0 7d 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20  };.    rp->code 
1b9b0 3d 20 6e 65 77 6c 69 6e 65 73 74 72 3b 0a 20 20  = newlinestr;.  
1b9c0 20 20 72 70 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d    rp->line = rp-
1b9d0 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20 20 20 20 72  >ruleline;.    r
1b9e0 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 31 3b 0a 20  p->noCode = 1;. 
1b9f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 70 2d 3e   }else{.    rp->
1ba00 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a  noCode = 0;.  }.
1ba10 0a 0a 20 20 69 66 28 20 72 70 2d 3e 6e 72 68 73  ..  if( rp->nrhs
1ba20 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
1ba30 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 52 48   there are no RH
1ba40 53 20 73 79 6d 62 6f 6c 73 2c 20 74 68 65 6e 20  S symbols, then 
1ba50 77 72 69 74 69 6e 67 20 64 69 72 65 63 74 6c 79  writing directly
1ba60 20 74 6f 20 74 68 65 20 4c 48 53 20 69 73 20 6f   to the LHS is o
1ba70 6b 20 2a 2f 0a 20 20 20 20 6c 68 73 64 69 72 65  k */.    lhsdire
1ba80 63 74 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ct = 1;.  }else 
1ba90 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
1baa0 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  [0]==0 ){.    /*
1bab0 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 52   The left-most R
1bac0 48 53 20 73 79 6d 62 6f 6c 20 68 61 73 20 6e 6f  HS symbol has no
1bad0 20 76 61 6c 75 65 2e 20 20 4c 48 53 20 64 69 72   value.  LHS dir
1bae0 65 63 74 20 69 73 20 6f 6b 2e 20 20 42 75 74 0a  ect is ok.  But.
1baf0 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74      ** we have t
1bb00 6f 20 63 61 6c 6c 20 74 68 65 20 64 69 73 74 72  o call the distr
1bb10 75 63 74 6f 72 20 6f 6e 20 74 68 65 20 52 48 53  uctor on the RHS
1bb20 20 73 79 6d 62 6f 6c 20 66 69 72 73 74 2e 20 2a   symbol first. *
1bb30 2f 0a 20 20 20 20 6c 68 73 64 69 72 65 63 74 20  /.    lhsdirect 
1bb40 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 68 61 73  = 1;.    if( has
1bb50 5f 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d 3e  _destructor(rp->
1bb60 72 68 73 5b 30 5d 2c 6c 65 6d 70 29 20 29 7b 0a  rhs[0],lemp) ){.
1bb70 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
1bb80 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20  (0,0,0,0);.     
1bb90 20 61 70 70 65 6e 64 5f 73 74 72 28 22 20 20 79   append_str("  y
1bba0 79 5f 64 65 73 74 72 75 63 74 6f 72 28 79 79 70  y_destructor(yyp
1bbb0 50 61 72 73 65 72 2c 25 64 2c 26 79 79 6d 73 70  Parser,%d,&yymsp
1bbc0 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e 22 2c  [%d].minor);\n",
1bbd0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1bbe0 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 30 5d 2d       rp->rhs[0]-
1bbf0 3e 69 6e 64 65 78 2c 31 2d 72 70 2d 3e 6e 72 68  >index,1-rp->nrh
1bc00 73 29 3b 0a 20 20 20 20 20 20 72 70 2d 3e 63 6f  s);.      rp->co
1bc10 64 65 50 72 65 66 69 78 20 3d 20 53 74 72 73 61  dePrefix = Strsa
1bc20 66 65 28 61 70 70 65 6e 64 5f 73 74 72 28 30 2c  fe(append_str(0,
1bc30 30 2c 30 2c 30 29 29 3b 0a 20 20 20 20 20 20 72  0,0,0));.      r
1bc40 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a 20  p->noCode = 0;. 
1bc50 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1bc60 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 3d 3d 30   rp->lhsalias==0
1bc70 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
1bc80 20 69 73 20 6e 6f 20 4c 48 53 20 76 61 6c 75 65   is no LHS value
1bc90 20 73 79 6d 62 6f 6c 2e 20 2a 2f 0a 20 20 20 20   symbol. */.    
1bca0 6c 68 73 64 69 72 65 63 74 20 3d 20 31 3b 0a 20  lhsdirect = 1;. 
1bcb0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1bcc0 70 28 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72  p(rp->lhsalias,r
1bcd0 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d 29 3d  p->rhsalias[0])=
1bce0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
1bcf0 20 4c 48 53 20 73 79 6d 62 6f 6c 20 61 6e 64 20   LHS symbol and 
1bd00 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 52 48  the left-most RH
1bd10 53 20 73 79 6d 62 6f 6c 20 61 72 65 20 74 68 65  S symbol are the
1bd20 20 73 61 6d 65 2c 20 73 6f 0a 20 20 20 20 2a 2a   same, so.    **
1bd30 20 64 69 72 65 63 74 20 77 72 69 74 69 6e 67 20   direct writing 
1bd40 69 73 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20  is allowed */.  
1bd50 20 20 6c 68 73 64 69 72 65 63 74 20 3d 20 31 3b    lhsdirect = 1;
1bd60 0a 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20 31  .    lhsused = 1
1bd70 3b 0a 20 20 20 20 75 73 65 64 5b 30 5d 20 3d 20  ;.    used[0] = 
1bd80 31 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 6c  1;.    if( rp->l
1bd90 68 73 2d 3e 64 74 6e 75 6d 21 3d 72 70 2d 3e 72  hs->dtnum!=rp->r
1bda0 68 73 5b 30 5d 2d 3e 64 74 6e 75 6d 20 29 7b 0a  hs[0]->dtnum ){.
1bdb0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
1bdc0 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70  emp->filename,rp
1bdd0 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20  ->ruleline,.    
1bde0 20 20 20 20 22 25 73 28 25 73 29 20 61 6e 64 20      "%s(%s) and 
1bdf0 25 73 28 25 73 29 20 73 68 61 72 65 20 74 68 65  %s(%s) share the
1be00 20 73 61 6d 65 20 6c 61 62 65 6c 20 62 75 74 20   same label but 
1be10 68 61 76 65 20 22 0a 20 20 20 20 20 20 20 20 22  have ".        "
1be20 64 69 66 66 65 72 65 6e 74 20 64 61 74 61 74 79  different dataty
1be30 70 65 73 2e 22 2c 0a 20 20 20 20 20 20 20 20 72  pes.",.        r
1be40 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 20 72 70  p->lhs->name, rp
1be50 2d 3e 6c 68 73 61 6c 69 61 73 2c 20 72 70 2d 3e  ->lhsalias, rp->
1be60 72 68 73 5b 30 5d 2d 3e 6e 61 6d 65 2c 20 72 70  rhs[0]->name, rp
1be70 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d 29 3b 0a  ->rhsalias[0]);.
1be80 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
1be90 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  rcnt++;.    }.  
1bea0 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 65 6d 6f 6e  }else{.    lemon
1beb0 5f 73 70 72 69 6e 74 66 28 7a 4f 76 77 72 74 2c  _sprintf(zOvwrt,
1bec0 20 22 2f 2a 25 73 2d 6f 76 65 72 77 72 69 74 65   "/*%s-overwrite
1bed0 73 2d 25 73 2a 2f 22 2c 0a 20 20 20 20 20 20 20  s-%s*/",.       
1bee0 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c             rp->l
1bef0 68 73 61 6c 69 61 73 2c 20 72 70 2d 3e 72 68 73  hsalias, rp->rhs
1bf00 61 6c 69 61 73 5b 30 5d 29 3b 0a 20 20 20 20 7a  alias[0]);.    z
1bf10 53 6b 69 70 20 3d 20 73 74 72 73 74 72 28 72 70  Skip = strstr(rp
1bf20 2d 3e 63 6f 64 65 2c 20 7a 4f 76 77 72 74 29 3b  ->code, zOvwrt);
1bf30 0a 20 20 20 20 69 66 28 20 7a 53 6b 69 70 21 3d  .    if( zSkip!=
1bf40 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
1bf50 65 20 63 6f 64 65 20 63 6f 6e 74 61 69 6e 73 20  e code contains 
1bf60 61 20 73 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e  a special commen
1bf70 74 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73  t that indicates
1bf80 20 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65   that it is safe
1bf90 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
1bfa0 65 20 4c 48 53 20 6c 61 62 65 6c 20 74 6f 20 6f  e LHS label to o
1bfb0 76 65 72 77 72 69 74 65 20 6c 65 66 74 2d 6d 6f  verwrite left-mo
1bfc0 73 74 20 52 48 53 20 6c 61 62 65 6c 2e 20 2a 2f  st RHS label. */
1bfd0 0a 20 20 20 20 20 20 6c 68 73 64 69 72 65 63 74  .      lhsdirect
1bfe0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
1bff0 0a 20 20 20 20 20 20 6c 68 73 64 69 72 65 63 74  .      lhsdirect
1c000 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1c010 20 20 69 66 28 20 6c 68 73 64 69 72 65 63 74 20    if( lhsdirect 
1c020 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  ){.    sprintf(z
1c030 4c 68 73 2c 20 22 79 79 6d 73 70 5b 25 64 5d 2e  Lhs, "yymsp[%d].
1c040 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 31 2d 72 70  minor.yy%d",1-rp
1c050 2d 3e 6e 72 68 73 2c 72 70 2d 3e 6c 68 73 2d 3e  ->nrhs,rp->lhs->
1c060 64 74 6e 75 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b  dtnum);.  }else{
1c070 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
1c080 20 73 70 72 69 6e 74 66 28 7a 4c 68 73 2c 20 22   sprintf(zLhs, "
1c090 79 79 6c 68 73 6d 69 6e 6f 72 2e 79 79 25 64 22  yylhsminor.yy%d"
1c0a0 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 29  ,rp->lhs->dtnum)
1c0b0 3b 0a 20 20 7d 0a 0a 20 20 61 70 70 65 6e 64 5f  ;.  }..  append_
1c0c0 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 0a 20  str(0,0,0,0);.. 
1c0d0 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 20 63   /* This const c
1c0e0 61 73 74 20 69 73 20 77 72 6f 6e 67 20 62 75 74  ast is wrong but
1c0f0 20 68 61 72 6d 6c 65 73 73 2c 20 69 66 20 77 65   harmless, if we
1c100 27 72 65 20 63 61 72 65 66 75 6c 2e 20 2a 2f 0a  're careful. */.
1c110 20 20 66 6f 72 28 63 70 3d 28 63 68 61 72 20 2a    for(cp=(char *
1c120 29 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20  )rp->code; *cp; 
1c130 63 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63  cp++){.    if( c
1c140 70 3d 3d 7a 53 6b 69 70 20 29 7b 0a 20 20 20 20  p==zSkip ){.    
1c150 20 20 61 70 70 65 6e 64 5f 73 74 72 28 7a 4f 76    append_str(zOv
1c160 77 72 74 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20  wrt,0,0,0);.    
1c170 20 20 63 70 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72    cp += lemonStr
1c180 6c 65 6e 28 7a 4f 76 77 72 74 29 2d 31 3b 0a 20  len(zOvwrt)-1;. 
1c190 20 20 20 20 20 64 6f 6e 74 55 73 65 52 68 73 30       dontUseRhs0
1c1a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 1;.      cont
1c1b0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
1c1c0 69 66 28 20 49 53 41 4c 50 48 41 28 2a 63 70 29  if( ISALPHA(*cp)
1c1d0 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63 6f 64   && (cp==rp->cod
1c1e0 65 20 7c 7c 20 28 21 49 53 41 4c 4e 55 4d 28 63  e || (!ISALNUM(c
1c1f0 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d 31 5d  p[-1]) && cp[-1]
1c200 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20 20 20  !='_')) ){.     
1c210 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20 20 20   char saved;.   
1c220 20 20 20 66 6f 72 28 78 70 3d 20 26 63 70 5b 31     for(xp= &cp[1
1c230 5d 3b 20 49 53 41 4c 4e 55 4d 28 2a 78 70 29 20  ]; ISALNUM(*xp) 
1c240 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20 78 70 2b  || *xp=='_'; xp+
1c250 2b 29 3b 0a 20 20 20 20 20 20 73 61 76 65 64 20  +);.      saved 
1c260 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20 2a 78 70  = *xp;.      *xp
1c270 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1c280 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20  rp->lhsalias && 
1c290 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 6c 68  strcmp(cp,rp->lh
1c2a0 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a 20 20  salias)==0 ){.  
1c2b0 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
1c2c0 28 7a 4c 68 73 2c 30 2c 30 2c 30 29 3b 0a 20 20  (zLhs,0,0,0);.  
1c2d0 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20        cp = xp;. 
1c2e0 20 20 20 20 20 20 20 6c 68 73 75 73 65 64 20 3d         lhsused =
1c2f0 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
1c300 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
1c310 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
1c320 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
1c330 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  ( rp->rhsalias[i
1c340 5d 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72  ] && strcmp(cp,r
1c350 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d  p->rhsalias[i])=
1c360 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1c370 20 20 69 66 28 20 69 3d 3d 30 20 26 26 20 64 6f    if( i==0 && do
1c380 6e 74 55 73 65 52 68 73 30 20 29 7b 0a 20 20 20  ntUseRhs0 ){.   
1c390 20 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72             Error
1c3a0 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
1c3b0 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c  me,rp->ruleline,
1c3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c3d0 20 20 22 4c 61 62 65 6c 20 25 73 20 75 73 65 64    "Label %s used
1c3e0 20 61 66 74 65 72 20 27 25 73 27 2e 22 2c 0a 20   after '%s'.",. 
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c400 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 30 5d 2c  rp->rhsalias[0],
1c410 20 7a 4f 76 77 72 74 29 3b 0a 20 20 20 20 20 20   zOvwrt);.      
1c420 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72          lemp->er
1c430 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
1c440 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c450 63 70 21 3d 72 70 2d 3e 63 6f 64 65 20 26 26 20  cp!=rp->code && 
1c460 63 70 5b 2d 31 5d 3d 3d 27 40 27 20 29 7b 0a 20  cp[-1]=='@' ){. 
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c480 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  If the argument 
1c490 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 40  is of the form @
1c4a0 58 20 74 68 65 6e 20 73 75 62 73 74 69 74 75 74  X then substitut
1c4b0 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ed.             
1c4c0 20 2a 2a 20 74 68 65 20 74 6f 6b 65 6e 20 6e 75   ** the token nu
1c4d0 6d 62 65 72 20 6f 66 20 58 2c 20 6e 6f 74 20 74  mber of X, not t
1c4e0 68 65 20 76 61 6c 75 65 20 6f 66 20 58 20 2a 2f  he value of X */
1c4f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
1c500 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73 70  ppend_str("yymsp
1c510 5b 25 64 5d 2e 6d 61 6a 6f 72 22 2c 2d 31 2c 69  [%d].major",-1,i
1c520 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 30 29 3b 0a  -rp->nrhs+1,0);.
1c530 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1c540 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
1c550 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1c560 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
1c570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1c580 6e 74 20 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20  nt dtnum;.      
1c590 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e          if( sp->
1c5a0 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
1c5b0 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
1c5c0 20 20 20 20 20 20 20 64 74 6e 75 6d 20 3d 20 73         dtnum = s
1c5d0 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 64 74  p->subsym[0]->dt
1c5e0 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  num;.           
1c5f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c600 20 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20            dtnum 
1c610 3d 20 73 70 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20  = sp->dtnum;.   
1c620 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1c630 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
1c640 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25 64 5d  d_str("yymsp[%d]
1c650 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30 2c 69  .minor.yy%d",0,i
1c660 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 20 64 74 6e  -rp->nrhs+1, dtn
1c670 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  um);.           
1c680 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   }.            c
1c690 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20 20 20  p = xp;.        
1c6a0 20 20 20 20 75 73 65 64 5b 69 5d 20 3d 20 31 3b      used[i] = 1;
1c6b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
1c6c0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
1c6d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c6e0 7d 0a 20 20 20 20 20 20 2a 78 70 20 3d 20 73 61  }.      *xp = sa
1c6f0 76 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ved;.    }.    a
1c700 70 70 65 6e 64 5f 73 74 72 28 63 70 2c 20 31 2c  ppend_str(cp, 1,
1c710 20 30 2c 20 30 29 3b 0a 20 20 7d 20 2f 2a 20 45   0, 0);.  } /* E
1c720 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 2f 2a  nd loop */..  /*
1c730 20 4d 61 69 6e 20 63 6f 64 65 20 67 65 6e 65 72   Main code gener
1c740 61 74 69 6f 6e 20 63 6f 6d 70 6c 65 74 65 64 20  ation completed 
1c750 2a 2f 0a 20 20 63 70 20 3d 20 61 70 70 65 6e 64  */.  cp = append
1c760 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20  _str(0,0,0,0);. 
1c770 20 69 66 28 20 63 70 20 26 26 20 63 70 5b 30 5d   if( cp && cp[0]
1c780 20 29 20 72 70 2d 3e 63 6f 64 65 20 3d 20 53 74   ) rp->code = St
1c790 72 73 61 66 65 28 63 70 29 3b 0a 20 20 61 70 70  rsafe(cp);.  app
1c7a0 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29  end_str(0,0,0,0)
1c7b0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
1c7c0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4c   make sure the L
1c7d0 48 53 20 68 61 73 20 62 65 65 6e 20 75 73 65 64  HS has been used
1c7e0 20 2a 2f 0a 20 20 69 66 28 20 72 70 2d 3e 6c 68   */.  if( rp->lh
1c7f0 73 61 6c 69 61 73 20 26 26 20 21 6c 68 73 75 73  salias && !lhsus
1c800 65 64 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d  ed ){.    ErrorM
1c810 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  sg(lemp->filenam
1c820 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a  e,rp->ruleline,.
1c830 20 20 20 20 20 20 22 4c 61 62 65 6c 20 5c 22 25        "Label \"%
1c840 73 5c 22 20 66 6f 72 20 5c 22 25 73 28 25 73 29  s\" for \"%s(%s)
1c850 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  \" is never used
1c860 2e 22 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e  .",.        rp->
1c870 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 6c 68 73  lhsalias,rp->lhs
1c880 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c  ->name,rp->lhsal
1c890 69 61 73 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e  ias);.    lemp->
1c8a0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a  errorcnt++;.  }.
1c8b0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 64  .  /* Generate d
1c8c0 65 73 74 72 75 63 74 6f 72 20 63 6f 64 65 20 66  estructor code f
1c8d0 6f 72 20 52 48 53 20 6d 69 6e 6f 72 20 76 61 6c  or RHS minor val
1c8e0 75 65 73 20 77 68 69 63 68 20 61 72 65 20 6e 6f  ues which are no
1c8f0 74 20 72 65 66 65 72 65 6e 63 65 64 2e 0a 20 20  t referenced..  
1c900 2a 2a 20 47 65 6e 65 72 61 74 65 20 65 72 72 6f  ** Generate erro
1c910 72 20 6d 65 73 73 61 67 65 73 20 66 6f 72 20 75  r messages for u
1c920 6e 75 73 65 64 20 6c 61 62 65 6c 73 20 61 6e 64  nused labels and
1c930 20 64 75 70 6c 69 63 61 74 65 20 6c 61 62 65 6c   duplicate label
1c940 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
1c950 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
1c960 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d  ++){.    if( rp-
1c970 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 29 7b 0a  >rhsalias[i] ){.
1c980 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b        if( i>0 ){
1c990 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
1c9a0 20 20 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e          if( rp->
1c9b0 6c 68 73 61 6c 69 61 73 20 26 26 20 73 74 72 63  lhsalias && strc
1c9c0 6d 70 28 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c  mp(rp->lhsalias,
1c9d0 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29  rp->rhsalias[i])
1c9e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1c9f0 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
1ca00 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c  filename,rp->rul
1ca10 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 20  eline,.         
1ca20 20 20 20 22 25 73 28 25 73 29 20 68 61 73 20 74     "%s(%s) has t
1ca30 68 65 20 73 61 6d 65 20 6c 61 62 65 6c 20 61 73  he same label as
1ca40 20 74 68 65 20 4c 48 53 20 62 75 74 20 69 73 20   the LHS but is 
1ca50 6e 6f 74 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  not the left-mos
1ca60 74 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  t ".            
1ca70 22 73 79 6d 62 6f 6c 20 6f 6e 20 74 68 65 20 52  "symbol on the R
1ca80 48 53 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  HS.",.          
1ca90 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61    rp->rhs[i]->na
1caa0 6d 65 2c 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  me, rp->rhsalias
1cab0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6d  );.          lem
1cac0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
1cad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1cae0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a   for(j=0; j<i; j
1caf0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1cb00 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  f( rp->rhsalias[
1cb10 6a 5d 20 26 26 20 73 74 72 63 6d 70 28 72 70 2d  j] && strcmp(rp-
1cb20 3e 72 68 73 61 6c 69 61 73 5b 6a 5d 2c 72 70 2d  >rhsalias[j],rp-
1cb30 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30  >rhsalias[i])==0
1cb40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1cb50 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
1cb60 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65  ilename,rp->rule
1cb70 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 20 20  line,.          
1cb80 20 20 20 20 22 4c 61 62 65 6c 20 25 73 20 75 73      "Label %s us
1cb90 65 64 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20  ed for multiple 
1cba0 73 79 6d 62 6f 6c 73 20 6f 6e 20 74 68 65 20 52  symbols on the R
1cbb0 48 53 20 6f 66 20 61 20 72 75 6c 65 2e 22 2c 0a  HS of a rule.",.
1cbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 70                rp
1cbd0 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 0a  ->rhsalias[i]);.
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 6d 70              lemp
1cbf0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
1cc00 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1cc10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1cc20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1cc30 20 20 20 20 20 69 66 28 20 21 75 73 65 64 5b 69       if( !used[i
1cc40 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ] ){.        Err
1cc50 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
1cc60 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e  name,rp->rulelin
1cc70 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4c 61  e,.          "La
1cc80 62 65 6c 20 25 73 20 66 6f 72 20 5c 22 25 73 28  bel %s for \"%s(
1cc90 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75  %s)\" is never u
1cca0 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  sed.",.         
1ccb0 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
1ccc0 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d  ,rp->rhs[i]->nam
1ccd0 65 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  e,rp->rhsalias[i
1cce0 5d 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70  ]);.        lemp
1ccf0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
1cd00 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
1cd10 69 66 28 20 69 3e 30 20 26 26 20 68 61 73 5f 64  if( i>0 && has_d
1cd20 65 73 74 72 75 63 74 6f 72 28 72 70 2d 3e 72 68  estructor(rp->rh
1cd30 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20  s[i],lemp) ){.  
1cd40 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
1cd50 20 20 79 79 5f 64 65 73 74 72 75 63 74 6f 72 28    yy_destructor(
1cd60 79 79 70 50 61 72 73 65 72 2c 25 64 2c 26 79 79  yypParser,%d,&yy
1cd70 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c  msp[%d].minor);\
1cd80 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  n", 0,.         
1cd90 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 69 6e 64 65  rp->rhs[i]->inde
1cda0 78 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 29 3b  x,i-rp->nrhs+1);
1cdb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1cdc0 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 77 72   If unable to wr
1cdd0 69 74 65 20 4c 48 53 20 76 61 6c 75 65 73 20 64  ite LHS values d
1cde0 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65  irectly into the
1cdf0 20 73 74 61 63 6b 2c 20 77 72 69 74 65 20 74 68   stack, write th
1ce00 65 0a 20 20 2a 2a 20 73 61 76 65 64 20 4c 48 53  e.  ** saved LHS
1ce10 20 76 61 6c 75 65 20 6e 6f 77 2e 20 2a 2f 0a 20   value now. */. 
1ce20 20 69 66 28 20 6c 68 73 64 69 72 65 63 74 3d 3d   if( lhsdirect==
1ce30 30 20 29 7b 0a 20 20 20 20 61 70 70 65 6e 64 5f  0 ){.    append_
1ce40 73 74 72 28 22 20 20 79 79 6d 73 70 5b 25 64 5d  str("  yymsp[%d]
1ce50 2e 6d 69 6e 6f 72 2e 79 79 25 64 20 3d 20 22 2c  .minor.yy%d = ",
1ce60 20 30 2c 20 31 2d 72 70 2d 3e 6e 72 68 73 2c 20   0, 1-rp->nrhs, 
1ce70 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 29 3b  rp->lhs->dtnum);
1ce80 0a 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28  .    append_str(
1ce90 7a 4c 68 73 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  zLhs, 0, 0, 0);.
1cea0 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
1ceb0 3b 5c 6e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ;\n", 0, 0, 0);.
1cec0 20 20 7d 0a 0a 20 20 2f 2a 20 53 75 66 66 69 78    }..  /* Suffix
1ced0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
1cee0 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 63   complete */.  c
1cef0 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72 28 30  p = append_str(0
1cf00 2c 30 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 63  ,0,0,0);.  if( c
1cf10 70 20 26 26 20 63 70 5b 30 5d 20 29 7b 0a 20 20  p && cp[0] ){.  
1cf20 20 20 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78    rp->codeSuffix
1cf30 20 3d 20 53 74 72 73 61 66 65 28 63 70 29 3b 0a   = Strsafe(cp);.
1cf40 20 20 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d      rp->noCode =
1cf50 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   0;.  }..  retur
1cf60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
1cf70 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
1cf80 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e  ch executes when
1cf90 20 74 68 65 20 72 75 6c 65 20 22 72 70 22 20 69   the rule "rp" i
1cfa0 73 20 72 65 64 75 63 65 64 2e 20 20 57 72 69 74  s reduced.  Writ
1cfb0 65 0a 2a 2a 20 74 68 65 20 63 6f 64 65 20 74 6f  e.** the code to
1cfc0 20 22 6f 75 74 22 2e 20 20 4d 61 6b 65 20 73 75   "out".  Make su
1cfd0 72 65 20 6c 69 6e 65 6e 6f 20 73 74 61 79 73 20  re lineno stays 
1cfe0 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 50  up-to-date..*/.P
1cff0 52 49 56 41 54 45 20 76 6f 69 64 20 65 6d 69 74  RIVATE void emit
1d000 5f 63 6f 64 65 28 0a 20 20 46 49 4c 45 20 2a 6f  _code(.  FILE *o
1d010 75 74 2c 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ut,.  struct rul
1d020 65 20 2a 72 70 2c 0a 20 20 73 74 72 75 63 74 20  e *rp,.  struct 
1d030 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69  lemon *lemp,.  i
1d040 6e 74 20 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a 20 63  nt *lineno.){. c
1d050 6f 6e 73 74 20 63 68 61 72 20 2a 63 70 3b 0a 0a  onst char *cp;..
1d060 20 2f 2a 20 53 65 74 75 70 20 63 6f 64 65 20 70   /* Setup code p
1d070 72 69 6f 72 20 74 6f 20 74 68 65 20 23 6c 69 6e  rior to the #lin
1d080 65 20 64 69 72 65 63 74 69 76 65 20 2a 2f 0a 20  e directive */. 
1d090 69 66 28 20 72 70 2d 3e 63 6f 64 65 50 72 65 66  if( rp->codePref
1d0a0 69 78 20 26 26 20 72 70 2d 3e 63 6f 64 65 50 72  ix && rp->codePr
1d0b0 65 66 69 78 5b 30 5d 20 29 7b 0a 20 20 20 66 70  efix[0] ){.   fp
1d0c0 72 69 6e 74 66 28 6f 75 74 2c 20 22 7b 25 73 22  rintf(out, "{%s"
1d0d0 2c 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78  , rp->codePrefix
1d0e0 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d  );.   for(cp=rp-
1d0f0 3e 63 6f 64 65 50 72 65 66 69 78 3b 20 2a 63 70  >codePrefix; *cp
1d100 3b 20 63 70 2b 2b 29 7b 20 69 66 28 20 2a 63 70  ; cp++){ if( *cp
1d110 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e  =='\n' ) (*linen
1d120 6f 29 2b 2b 3b 20 7d 0a 20 7d 0a 0a 20 2f 2a 20  o)++; }. }.. /* 
1d130 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
1d140 20 64 6f 20 74 68 65 20 72 65 64 75 63 65 20 61   do the reduce a
1d150 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70  ction */. if( rp
1d160 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 69 66 28  ->code ){.   if(
1d170 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f   !lemp->nolineno
1d180 73 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 28 2a  sflag ){.     (*
1d190 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  lineno)++;.     
1d1a0 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74  tplt_linedir(out
1d1b0 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e  ,rp->line,lemp->
1d1c0 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 7d 0a  filename);.   }.
1d1d0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1d1e0 7b 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 0a  {%s",rp->code);.
1d1f0 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f     for(cp=rp->co
1d200 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 20  de; *cp; cp++){ 
1d210 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20  if( *cp=='\n' ) 
1d220 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 7d 0a 20  (*lineno)++; }. 
1d230 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d    fprintf(out,"}
1d240 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n"); (*lineno)+
1d250 2b 3b 0a 20 20 20 69 66 28 20 21 6c 65 6d 70 2d  +;.   if( !lemp-
1d260 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 29  >nolinenosflag )
1d270 7b 0a 20 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29  {.     (*lineno)
1d280 2b 2b 3b 0a 20 20 20 20 20 74 70 6c 74 5f 6c 69  ++;.     tplt_li
1d290 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e  nedir(out,*linen
1d2a0 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29  o,lemp->outname)
1d2b0 3b 0a 20 20 20 7d 0a 20 7d 0a 0a 20 2f 2a 20 47  ;.   }. }.. /* G
1d2c0 65 6e 65 72 61 74 65 20 62 72 65 61 6b 64 6f 77  enerate breakdow
1d2d0 6e 20 63 6f 64 65 20 74 68 61 74 20 6f 63 63 75  n code that occu
1d2e0 72 73 20 61 66 74 65 72 20 74 68 65 20 23 6c 69  rs after the #li
1d2f0 6e 65 20 64 69 72 65 63 74 69 76 65 20 2a 2f 0a  ne directive */.
1d300 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 53 75 66   if( rp->codeSuf
1d310 66 69 78 20 26 26 20 72 70 2d 3e 63 6f 64 65 53  fix && rp->codeS
1d320 75 66 66 69 78 5b 30 5d 20 29 7b 0a 20 20 20 66  uffix[0] ){.   f
1d330 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
1d340 2c 20 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78  , rp->codeSuffix
1d350 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d  );.   for(cp=rp-
1d360 3e 63 6f 64 65 53 75 66 66 69 78 3b 20 2a 63 70  >codeSuffix; *cp
1d370 3b 20 63 70 2b 2b 29 7b 20 69 66 28 20 2a 63 70  ; cp++){ if( *cp
1d380 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e  =='\n' ) (*linen
1d390 6f 29 2b 2b 3b 20 7d 0a 20 7d 0a 0a 20 69 66 28  o)++; }. }.. if(
1d3a0 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 20   rp->codePrefix 
1d3b0 29 7b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ){.   fprintf(ou
1d3c0 74 2c 20 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e  t, "}\n"); (*lin
1d3d0 65 6e 6f 29 2b 2b 3b 0a 20 7d 0a 0a 20 72 65 74  eno)++;. }.. ret
1d3e0 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  urn;.}../*.** Pr
1d3f0 69 6e 74 20 74 68 65 20 64 65 66 69 6e 69 74 69  int the definiti
1d400 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f 6e 20  on of the union 
1d410 75 73 65 64 20 66 6f 72 20 74 68 65 20 70 61 72  used for the par
1d420 73 65 72 27 73 20 64 61 74 61 20 73 74 61 63 6b  ser's data stack
1d430 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f 6e 20  ..** This union 
1d440 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64 73 20  contains fields 
1d450 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69 62  for every possib
1d460 6c 65 20 64 61 74 61 20 74 79 70 65 20 66 6f 72  le data type for
1d470 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20 6e   tokens.** and n
1d480 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20 49 6e  onterminals.  In
1d490 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
1d4a0 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20 70 72  computing and pr
1d4b0 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a 20 75  inting this.** u
1d4c0 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74 20 74  nion, also set t
1d4d0 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c  he ".dtnum" fiel
1d4e0 64 20 6f 66 20 65 76 65 72 79 20 74 65 72 6d 69  d of every termi
1d4f0 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69  nal and nontermi
1d500 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a 2a  nal.** symbol..*
1d510 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73 74 61  /.void print_sta
1d520 63 6b 5f 75 6e 69 6f 6e 28 0a 20 20 46 49 4c 45  ck_union(.  FILE
1d530 20 2a 6f 75 74 2c 20 20 20 20 20 20 20 20 20 20   *out,          
1d540 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1d550 75 74 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a  utput stream */.
1d560 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a    struct lemon *
1d570 6c 65 6d 70 2c 20 20 20 20 20 20 20 20 20 2f 2a  lemp,         /*
1d580 20 54 68 65 20 6d 61 69 6e 20 69 6e 66 6f 20 73   The main info s
1d590 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 69  tructure for thi
1d5a0 73 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 69 6e  s parser */.  in
1d5b0 74 20 2a 70 6c 69 6e 65 6e 6f 2c 20 20 20 20 20  t *plineno,     
1d5c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1d5d0 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 69 6e 65  nter to the line
1d5e0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
1d5f0 20 6d 68 66 6c 61 67 20 20 20 20 20 20 20 20 20   mhflag         
1d600 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1d610 20 69 66 20 67 65 6e 65 72 61 74 69 6e 67 20 6d   if generating m
1d620 61 6b 65 68 65 61 64 65 72 73 20 6f 75 74 70 75  akeheaders outpu
1d630 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6c 69  t */.){.  int li
1d640 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b  neno = *plineno;
1d650 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20      /* The line 
1d660 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6f 75  number of the ou
1d670 74 70 75 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tput */.  char *
1d680 2a 74 79 70 65 73 3b 20 20 20 20 20 20 20 20 20  *types;         
1d690 20 20 20 20 2f 2a 20 41 20 68 61 73 68 20 74 61      /* A hash ta
1d6a0 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65 73  ble of datatypes
1d6b0 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61 79 73   */.  int arrays
1d6c0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1d6d0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 22  /* Size of the "
1d6e0 74 79 70 65 73 22 20 61 72 72 61 79 20 2a 2f 0a  types" array */.
1d6f0 20 20 69 6e 74 20 6d 61 78 64 74 6c 65 6e 67 74    int maxdtlengt
1d700 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  h;          /* M
1d710 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66  aximum length of
1d720 20 61 6e 79 20 22 2e 64 61 74 61 74 79 70 65 22   any ".datatype"
1d730 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 63 68 61   field. */.  cha
1d740 72 20 2a 73 74 64 64 74 3b 20 20 20 20 20 20 20  r *stddt;       
1d750 20 20 20 20 20 20 20 2f 2a 20 53 74 61 6e 64 61         /* Standa
1d760 72 64 69 7a 65 64 20 6e 61 6d 65 20 66 6f 72 20  rdized name for 
1d770 61 20 64 61 74 61 74 79 70 65 20 2a 2f 0a 20 20  a datatype */.  
1d780 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20 20 20 20  int i,j;        
1d790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1d7a0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1d7b0 75 6e 73 69 67 6e 65 64 20 68 61 73 68 3b 20 20  unsigned hash;  
1d7c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1d7d0 20 68 61 73 68 69 6e 67 20 74 68 65 20 6e 61 6d   hashing the nam
1d7e0 65 20 6f 66 20 61 20 74 79 70 65 20 2a 2f 0a 20  e of a type */. 
1d7f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d   const char *nam
1d800 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  e;         /* Na
1d810 6d 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  me of the parser
1d820 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
1d830 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
1d840 65 20 74 79 70 65 73 5b 5d 20 61 6e 64 20 61 6c  e types[] and al
1d850 6c 6f 63 61 74 65 20 73 74 64 64 74 5b 5d 20 2a  locate stddt[] *
1d860 2f 0a 20 20 61 72 72 61 79 73 69 7a 65 20 3d 20  /.  arraysize = 
1d870 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20  lemp->nsymbol * 
1d880 32 3b 0a 20 20 74 79 70 65 73 20 3d 20 28 63 68  2;.  types = (ch
1d890 61 72 2a 2a 29 63 61 6c 6c 6f 63 28 20 61 72 72  ar**)calloc( arr
1d8a0 61 79 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28 63  aysize, sizeof(c
1d8b0 68 61 72 2a 29 20 29 3b 0a 20 20 69 66 28 20 74  har*) );.  if( t
1d8c0 79 70 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ypes==0 ){.    f
1d8d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
1d8e0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22  ut of memory.\n"
1d8f0 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
1d900 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1d910 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29  <arraysize; i++)
1d920 20 74 79 70 65 73 5b 69 5d 20 3d 20 30 3b 0a 20   types[i] = 0;. 
1d930 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 30   maxdtlength = 0
1d940 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61  ;.  if( lemp->va
1d950 72 74 79 70 65 20 29 7b 0a 20 20 20 20 6d 61 78  rtype ){.    max
1d960 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6d 6f 6e  dtlength = lemon
1d970 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61 72  Strlen(lemp->var
1d980 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  type);.  }.  for
1d990 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1d9a0 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
1d9b0 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 73 74   int len;.    st
1d9c0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
1d9d0 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
1d9e0 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e  i];.    if( sp->
1d9f0 64 61 74 61 74 79 70 65 3d 3d 30 20 29 20 63 6f  datatype==0 ) co
1da00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c 65 6e 20  ntinue;.    len 
1da10 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 70  = lemonStrlen(sp
1da20 2d 3e 64 61 74 61 74 79 70 65 29 3b 0a 20 20 20  ->datatype);.   
1da30 20 69 66 28 20 6c 65 6e 3e 6d 61 78 64 74 6c 65   if( len>maxdtle
1da40 6e 67 74 68 20 29 20 6d 61 78 64 74 6c 65 6e 67  ngth ) maxdtleng
1da50 74 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20  th = len;.  }.  
1da60 73 74 64 64 74 20 3d 20 28 63 68 61 72 2a 29 6d  stddt = (char*)m
1da70 61 6c 6c 6f 63 28 20 6d 61 78 64 74 6c 65 6e 67  alloc( maxdtleng
1da80 74 68 2a 32 20 2b 20 31 20 29 3b 0a 20 20 69 66  th*2 + 1 );.  if
1da90 28 20 73 74 64 64 74 3d 3d 30 20 29 7b 0a 20 20  ( stddt==0 ){.  
1daa0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1dab0 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  ,"Out of memory.
1dac0 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
1dad0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69  );.  }..  /* Bui
1dae0 6c 64 20 61 20 68 61 73 68 20 74 61 62 6c 65 20  ld a hash table 
1daf0 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20 54 68  of datatypes. Th
1db00 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64  e ".dtnum" field
1db10 20 6f 66 20 65 61 63 68 20 73 79 6d 62 6f 6c 0a   of each symbol.
1db20 20 20 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 69    ** is filled i
1db30 6e 20 77 69 74 68 20 74 68 65 20 68 61 73 68 20  n with the hash 
1db40 69 6e 64 65 78 20 70 6c 75 73 20 31 2e 20 20 41  index plus 1.  A
1db50 20 22 2e 64 74 6e 75 6d 22 20 76 61 6c 75 65 20   ".dtnum" value 
1db60 6f 66 20 30 20 69 73 0a 20 20 2a 2a 20 75 73 65  of 0 is.  ** use
1db70 64 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 20 73  d for terminal s
1db80 79 6d 62 6f 6c 73 2e 20 20 49 66 20 74 68 65 72  ymbols.  If ther
1db90 65 20 69 73 20 6e 6f 20 25 64 65 66 61 75 6c 74  e is no %default
1dba0 5f 74 79 70 65 20 64 65 66 69 6e 65 64 20 74 68  _type defined th
1dbb0 65 6e 0a 20 20 2a 2a 20 30 20 69 73 20 61 6c 73  en.  ** 0 is als
1dbc0 6f 20 75 73 65 64 20 61 73 20 74 68 65 20 2e 64  o used as the .d
1dbd0 74 6e 75 6d 20 76 61 6c 75 65 20 66 6f 72 20 6e  tnum value for n
1dbe0 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69 63  onterminals whic
1dbf0 68 20 64 6f 20 6e 6f 74 20 73 70 65 63 69 66 79  h do not specify
1dc00 0a 20 20 2a 2a 20 61 20 64 61 74 61 74 79 70 65  .  ** a datatype
1dc10 20 75 73 69 6e 67 20 74 68 65 20 25 74 79 70 65   using the %type
1dc20 20 64 69 72 65 63 74 69 76 65 2e 0a 20 20 2a 2f   directive..  */
1dc30 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
1dc40 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
1dc50 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79  ){.    struct sy
1dc60 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
1dc70 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
1dc80 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 20 20 69   char *cp;.    i
1dc90 66 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e 65 72 72  f( sp==lemp->err
1dca0 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 73 70 2d  sym ){.      sp-
1dcb0 3e 64 74 6e 75 6d 20 3d 20 61 72 72 61 79 73 69  >dtnum = arraysi
1dcc0 7a 65 2b 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74  ze+1;.      cont
1dcd0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
1dce0 69 66 28 20 73 70 2d 3e 74 79 70 65 21 3d 4e 4f  if( sp->type!=NO
1dcf0 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 28 73 70  NTERMINAL || (sp
1dd00 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 26 26  ->datatype==0 &&
1dd10 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3d 3d   lemp->vartype==
1dd20 30 29 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e  0) ){.      sp->
1dd30 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20  dtnum = 0;.     
1dd40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
1dd50 0a 20 20 20 20 63 70 20 3d 20 73 70 2d 3e 64 61  .    cp = sp->da
1dd60 74 61 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20  tatype;.    if( 
1dd70 63 70 3d 3d 30 20 29 20 63 70 20 3d 20 6c 65 6d  cp==0 ) cp = lem
1dd80 70 2d 3e 76 61 72 74 79 70 65 3b 0a 20 20 20 20  p->vartype;.    
1dd90 6a 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  j = 0;.    while
1dda0 28 20 49 53 53 50 41 43 45 28 2a 63 70 29 20 29  ( ISSPACE(*cp) )
1ddb0 20 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65   cp++;.    while
1ddc0 28 20 2a 63 70 20 29 20 73 74 64 64 74 5b 6a 2b  ( *cp ) stddt[j+
1ddd0 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20 20 20 20  +] = *cp++;.    
1dde0 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 49 53  while( j>0 && IS
1ddf0 53 50 41 43 45 28 73 74 64 64 74 5b 6a 2d 31 5d  SPACE(stddt[j-1]
1de00 29 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 73 74 64  ) ) j--;.    std
1de10 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 69  dt[j] = 0;.    i
1de20 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79  f( lemp->tokenty
1de30 70 65 20 26 26 20 73 74 72 63 6d 70 28 73 74 64  pe && strcmp(std
1de40 64 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74  dt, lemp->tokent
1de50 79 70 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ype)==0 ){.     
1de60 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a   sp->dtnum = 0;.
1de70 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1de80 20 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20 3d      }.    hash =
1de90 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   0;.    for(j=0;
1dea0 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b   stddt[j]; j++){
1deb0 0a 20 20 20 20 20 20 68 61 73 68 20 3d 20 68 61  .      hash = ha
1dec0 73 68 2a 35 33 20 2b 20 73 74 64 64 74 5b 6a 5d  sh*53 + stddt[j]
1ded0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73 68  ;.    }.    hash
1dee0 20 3d 20 28 68 61 73 68 20 26 20 30 78 37 66 66   = (hash & 0x7ff
1def0 66 66 66 66 66 29 25 61 72 72 61 79 73 69 7a 65  fffff)%arraysize
1df00 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 74 79 70  ;.    while( typ
1df10 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20 20 20 20  es[hash] ){.    
1df20 20 20 69 66 28 20 73 74 72 63 6d 70 28 74 79 70    if( strcmp(typ
1df30 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3d  es[hash],stddt)=
1df40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70  =0 ){.        sp
1df50 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b  ->dtnum = hash +
1df60 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
1df70 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1df80 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20 20 20 69   hash++;.      i
1df90 66 28 20 68 61 73 68 3e 3d 28 75 6e 73 69 67 6e  f( hash>=(unsign
1dfa0 65 64 29 61 72 72 61 79 73 69 7a 65 20 29 20 68  ed)arraysize ) h
1dfb0 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ash = 0;.    }. 
1dfc0 20 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73     if( types[has
1dfd0 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  h]==0 ){.      s
1dfe0 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20  p->dtnum = hash 
1dff0 2b 20 31 3b 0a 20 20 20 20 20 20 74 79 70 65 73  + 1;.      types
1e000 5b 68 61 73 68 5d 20 3d 20 28 63 68 61 72 2a 29  [hash] = (char*)
1e010 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72  malloc( lemonStr
1e020 6c 65 6e 28 73 74 64 64 74 29 2b 31 20 29 3b 0a  len(stddt)+1 );.
1e030 20 20 20 20 20 20 69 66 28 20 74 79 70 65 73 5b        if( types[
1e040 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  hash]==0 ){.    
1e050 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1e060 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72  rr,"Out of memor
1e070 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  y.\n");.        
1e080 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d  exit(1);.      }
1e090 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72  .      lemon_str
1e0a0 63 70 79 28 74 79 70 65 73 5b 68 61 73 68 5d 2c  cpy(types[hash],
1e0b0 73 74 64 64 74 29 3b 0a 20 20 20 20 7d 0a 20 20  stddt);.    }.  
1e0c0 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74 20 6f 75  }..  /* Print ou
1e0d0 74 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  t the definition
1e0e0 20 6f 66 20 59 59 54 4f 4b 45 4e 54 59 50 45 20   of YYTOKENTYPE 
1e0f0 61 6e 64 20 59 59 4d 49 4e 4f 52 54 59 50 45 20  and YYMINORTYPE 
1e100 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70  */.  name = lemp
1e110 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e  ->name ? lemp->n
1e120 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20  ame : "Parse";. 
1e130 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65   lineno = *pline
1e140 6e 6f 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67  no;.  if( mhflag
1e150 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   ){ fprintf(out,
1e160 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e  "#if INTERFACE\n
1e170 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a  "); lineno++; }.
1e180 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1e190 64 65 66 69 6e 65 20 25 73 54 4f 4b 45 4e 54 59  define %sTOKENTY
1e1a0 50 45 20 25 73 5c 6e 22 2c 6e 61 6d 65 2c 0a 20  PE %s\n",name,. 
1e1b0 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79     lemp->tokenty
1e1c0 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79  pe?lemp->tokenty
1e1d0 70 65 3a 22 76 6f 69 64 2a 22 29 3b 20 20 6c 69  pe:"void*");  li
1e1e0 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68  neno++;.  if( mh
1e1f0 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28  flag ){ fprintf(
1e200 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b  out,"#endif\n");
1e210 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66   lineno++; }.  f
1e220 70 72 69 6e 74 66 28 6f 75 74 2c 22 74 79 70 65  printf(out,"type
1e230 64 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e 22 29 3b  def union {\n");
1e240 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1e250 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e 74 20  intf(out,"  int 
1e260 79 79 69 6e 69 74 3b 5c 6e 22 29 3b 20 6c 69 6e  yyinit;\n"); lin
1e270 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1e280 28 6f 75 74 2c 22 20 20 25 73 54 4f 4b 45 4e 54  (out,"  %sTOKENT
1e290 59 50 45 20 79 79 30 3b 5c 6e 22 2c 6e 61 6d 65  YPE yy0;\n",name
1e2a0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1e2b0 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 73  or(i=0; i<arrays
1e2c0 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ize; i++){.    i
1e2d0 66 28 20 74 79 70 65 73 5b 69 5d 3d 3d 30 20 29  f( types[i]==0 )
1e2e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
1e2f0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 73  printf(out,"  %s
1e300 20 79 79 25 64 3b 5c 6e 22 2c 74 79 70 65 73 5b   yy%d;\n",types[
1e310 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b  i],i+1); lineno+
1e320 2b 3b 0a 20 20 20 20 66 72 65 65 28 74 79 70 65  +;.    free(type
1e330 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s[i]);.  }.  if(
1e340 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75   lemp->errsym->u
1e350 73 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70 72  seCnt ){.    fpr
1e360 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e 74 20  intf(out,"  int 
1e370 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e 65  yy%d;\n",lemp->e
1e380 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c  rrsym->dtnum); l
1e390 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66  ineno++;.  }.  f
1e3a0 72 65 65 28 73 74 64 64 74 29 3b 0a 20 20 66 72  ree(stddt);.  fr
1e3b0 65 65 28 74 79 70 65 73 29 3b 0a 20 20 66 70 72  ee(types);.  fpr
1e3c0 69 6e 74 66 28 6f 75 74 2c 22 7d 20 59 59 4d 49  intf(out,"} YYMI
1e3d0 4e 4f 52 54 59 50 45 3b 5c 6e 22 29 3b 20 6c 69  NORTYPE;\n"); li
1e3e0 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c 69 6e 65  neno++;.  *pline
1e3f0 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 7d 0a 0a  no = lineno;.}..
1e400 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1e410 20 6e 61 6d 65 20 6f 66 20 61 20 43 20 64 61 74   name of a C dat
1e420 61 74 79 70 65 20 61 62 6c 65 20 74 6f 20 72 65  atype able to re
1e430 70 72 65 73 65 6e 74 20 76 61 6c 75 65 73 20 62  present values b
1e440 65 74 77 65 65 6e 0a 2a 2a 20 6c 77 72 20 61 6e  etween.** lwr an
1e450 64 20 75 70 72 2c 20 69 6e 63 6c 75 73 69 76 65  d upr, inclusive
1e460 2e 20 20 49 66 20 70 6e 42 79 74 65 21 3d 4e 55  .  If pnByte!=NU
1e470 4c 4c 20 74 68 65 6e 20 61 6c 73 6f 20 77 72 69  LL then also wri
1e480 74 65 20 74 68 65 20 73 69 7a 65 6f 66 0a 2a 2a  te the sizeof.**
1e490 20 66 6f 72 20 74 68 61 74 20 74 79 70 65 20 28   for that type (
1e4a0 31 2c 20 32 2c 20 6f 72 20 34 29 20 69 6e 74 6f  1, 2, or 4) into
1e4b0 20 2a 70 6e 42 79 74 65 2e 0a 2a 2f 0a 73 74 61   *pnByte..*/.sta
1e4c0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
1e4d0 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
1e4e0 65 28 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75  e(int lwr, int u
1e4f0 70 72 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65 29  pr, int *pnByte)
1e500 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1e510 7a 54 79 70 65 20 3d 20 22 69 6e 74 22 3b 0a 20  zType = "int";. 
1e520 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 34 3b 0a   int nByte = 4;.
1e530 20 20 69 66 28 20 6c 77 72 3e 3d 30 20 29 7b 0a    if( lwr>=0 ){.
1e540 20 20 20 20 69 66 28 20 75 70 72 3c 3d 32 35 35      if( upr<=255
1e550 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   ){.      zType 
1e560 3d 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = "unsigned char
1e570 22 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d  ";.      nByte =
1e580 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
1e590 28 20 75 70 72 3c 36 35 35 33 35 20 29 7b 0a 20  ( upr<65535 ){. 
1e5a0 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 75 6e       zType = "un
1e5b0 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74  signed short int
1e5c0 22 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 3d  ";.      nByte =
1e5d0 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   2;.    }else{. 
1e5e0 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 75 6e       zType = "un
1e5f0 73 69 67 6e 65 64 20 69 6e 74 22 3b 0a 20 20 20  signed int";.   
1e600 20 20 20 6e 42 79 74 65 20 3d 20 34 3b 0a 20 20     nByte = 4;.  
1e610 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
1e620 6c 77 72 3e 3d 2d 31 32 37 20 26 26 20 75 70 72  lwr>=-127 && upr
1e630 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 7a 54 79  <=127 ){.    zTy
1e640 70 65 20 3d 20 22 73 69 67 6e 65 64 20 63 68 61  pe = "signed cha
1e650 72 22 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  r";.    nByte = 
1e660 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  1;.  }else if( l
1e670 77 72 3e 3d 2d 33 32 37 36 37 20 26 26 20 75 70  wr>=-32767 && up
1e680 72 3c 33 32 37 36 37 20 29 7b 0a 20 20 20 20 7a  r<32767 ){.    z
1e690 54 79 70 65 20 3d 20 22 73 68 6f 72 74 22 3b 0a  Type = "short";.
1e6a0 20 20 20 20 6e 42 79 74 65 20 3d 20 32 3b 0a 20      nByte = 2;. 
1e6b0 20 7d 0a 20 20 69 66 28 20 70 6e 42 79 74 65 20   }.  if( pnByte 
1e6c0 29 20 2a 70 6e 42 79 74 65 20 3d 20 6e 42 79 74  ) *pnByte = nByt
1e6d0 65 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  e;.  return zTyp
1e6e0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  e;.}../*.** Each
1e6f0 20 73 74 61 74 65 20 63 6f 6e 74 61 69 6e 73 20   state contains 
1e700 61 20 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20 74  a set of token t
1e710 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
1e720 20 73 65 74 20 6f 66 0a 2a 2a 20 6e 6f 6e 74 65   set of.** nonte
1e730 72 6d 69 6e 61 6c 20 74 72 61 6e 73 61 63 74 69  rminal transacti
1e740 6f 6e 73 2e 20 20 45 61 63 68 20 6f 66 20 74 68  ons.  Each of th
1e750 65 73 65 20 73 65 74 73 20 6d 61 6b 65 73 20 61  ese sets makes a
1e760 6e 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66  n instance.** of
1e770 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1e780 74 72 75 63 74 75 72 65 2e 20 20 41 6e 20 61 72  tructure.  An ar
1e790 72 61 79 20 6f 66 20 74 68 65 73 65 20 73 74 72  ray of these str
1e7a0 75 63 74 75 72 65 73 20 69 73 20 75 73 65 64 0a  uctures is used.
1e7b0 2a 2a 20 74 6f 20 6f 72 64 65 72 20 74 68 65 20  ** to order the 
1e7c0 63 72 65 61 74 69 6f 6e 20 6f 66 20 65 6e 74 72  creation of entr
1e7d0 69 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61 63  ies in the yy_ac
1e7e0 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f  tion[] table..*/
1e7f0 0a 73 74 72 75 63 74 20 61 78 73 65 74 20 7b 0a  .struct axset {.
1e800 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
1e810 73 74 70 3b 20 20 20 2f 2a 20 41 20 70 6f 69 6e  stp;   /* A poin
1e820 74 65 72 20 74 6f 20 61 20 73 74 61 74 65 20 2a  ter to a state *
1e830 2f 0a 20 20 69 6e 74 20 69 73 54 6b 6e 3b 20 20  /.  int isTkn;  
1e840 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e850 20 74 6f 20 75 73 65 20 74 6f 6b 65 6e 73 2e 20   to use tokens. 
1e860 20 46 61 6c 73 65 20 66 6f 72 20 6e 6f 6e 2d 74   False for non-t
1e870 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e  erminals */.  in
1e880 74 20 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20  t nAction;      
1e890 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e8a0 61 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  actions */.  int
1e8b0 20 69 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20   iOrder;        
1e8c0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6f 72    /* Original or
1e8d0 64 65 72 20 6f 66 20 61 63 74 69 6f 6e 20 73 65  der of action se
1e8e0 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ts */.};../*.** 
1e8f0 43 6f 6d 70 61 72 65 20 74 6f 20 61 78 73 65 74  Compare to axset
1e900 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20   structures for 
1e910 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
1e920 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1e930 78 73 65 74 5f 63 6f 6d 70 61 72 65 28 63 6f 6e  xset_compare(con
1e940 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73  st void *a, cons
1e950 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 73 74  t void *b){.  st
1e960 72 75 63 74 20 61 78 73 65 74 20 2a 70 31 20 3d  ruct axset *p1 =
1e970 20 28 73 74 72 75 63 74 20 61 78 73 65 74 2a 29   (struct axset*)
1e980 61 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65  a;.  struct axse
1e990 74 20 2a 70 32 20 3d 20 28 73 74 72 75 63 74 20  t *p2 = (struct 
1e9a0 61 78 73 65 74 2a 29 62 3b 0a 20 20 69 6e 74 20  axset*)b;.  int 
1e9b0 63 3b 0a 20 20 63 20 3d 20 70 32 2d 3e 6e 41 63  c;.  c = p2->nAc
1e9c0 74 69 6f 6e 20 2d 20 70 31 2d 3e 6e 41 63 74 69  tion - p1->nActi
1e9d0 6f 6e 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20 29  on;.  if( c==0 )
1e9e0 7b 0a 20 20 20 20 63 20 3d 20 70 31 2d 3e 69 4f  {.    c = p1->iO
1e9f0 72 64 65 72 20 2d 20 70 32 2d 3e 69 4f 72 64 65  rder - p2->iOrde
1ea00 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  r;.  }.  assert(
1ea10 20 63 21 3d 30 20 7c 7c 20 70 31 3d 3d 70 32 20   c!=0 || p1==p2 
1ea20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d  );.  return c;.}
1ea30 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 65  ../*.** Write te
1ea40 78 74 20 6f 6e 20 22 6f 75 74 22 20 74 68 61 74  xt on "out" that
1ea50 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72   describes the r
1ea60 75 6c 65 20 22 72 70 22 2e 0a 2a 2f 0a 73 74 61  ule "rp"..*/.sta
1ea70 74 69 63 20 76 6f 69 64 20 77 72 69 74 65 52 75  tic void writeRu
1ea80 6c 65 54 65 78 74 28 46 49 4c 45 20 2a 6f 75 74  leText(FILE *out
1ea90 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72  , struct rule *r
1eaa0 70 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66  p){.  int j;.  f
1eab0 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 20 3a  printf(out,"%s :
1eac0 3a 3d 22 2c 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61  :=", rp->lhs->na
1ead0 6d 65 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  me);.  for(j=0; 
1eae0 6a 3c 72 70 2d 3e 6e 72 68 73 3b 20 6a 2b 2b 29  j<rp->nrhs; j++)
1eaf0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  {.    struct sym
1eb00 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68  bol *sp = rp->rh
1eb10 73 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 73 70  s[j];.    if( sp
1eb20 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52  ->type!=MULTITER
1eb30 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 66  MINAL ){.      f
1eb40 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22  printf(out," %s"
1eb50 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  , sp->name);.   
1eb60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1eb70 74 20 6b 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  t k;.      fprin
1eb80 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73 70  tf(out," %s", sp
1eb90 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d  ->subsym[0]->nam
1eba0 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  e);.      for(k=
1ebb0 31 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62 73 79 6d  1; k<sp->nsubsym
1ebc0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
1ebd0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c 25 73  fprintf(out,"|%s
1ebe0 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d  ",sp->subsym[k]-
1ebf0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  >name);.      }.
1ec00 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
1ec10 20 47 65 6e 65 72 61 74 65 20 43 20 73 6f 75 72   Generate C sour
1ec20 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ce code for the 
1ec30 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52  parser */.void R
1ec40 65 70 6f 72 74 54 61 62 6c 65 28 0a 20 20 73 74  eportTable(.  st
1ec50 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
1ec60 2c 0a 20 20 69 6e 74 20 6d 68 66 6c 61 67 20 20  ,.  int mhflag  
1ec70 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 69 6e 20     /* Output in 
1ec80 6d 61 6b 65 68 65 61 64 65 72 73 20 66 6f 72 6d  makeheaders form
1ec90 61 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  at if true */.){
1eca0 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69  .  FILE *out, *i
1ecb0 6e 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c  n;.  char line[L
1ecc0 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20  INESIZE];.  int 
1ecd0 20 6c 69 6e 65 6e 6f 3b 0a 20 20 73 74 72 75 63   lineno;.  struc
1ece0 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20  t state *stp;.  
1ecf0 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
1ed00 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  p;.  struct rule
1ed10 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20 61   *rp;.  struct a
1ed20 63 74 74 61 62 20 2a 70 41 63 74 74 61 62 3b 0a  cttab *pActtab;.
1ed30 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 2c 20 73    int i, j, n, s
1ed40 7a 3b 0a 20 20 69 6e 74 20 73 7a 41 63 74 69 6f  z;.  int szActio
1ed50 6e 54 79 70 65 3b 20 20 20 20 20 2f 2a 20 73 69  nType;     /* si
1ed60 7a 65 6f 66 28 59 59 41 43 54 49 4f 4e 54 59 50  zeof(YYACTIONTYP
1ed70 45 29 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 6f  E) */.  int szCo
1ed80 64 65 54 79 70 65 3b 20 20 20 20 20 20 20 2f 2a  deType;       /*
1ed90 20 73 69 7a 65 6f 66 28 59 59 43 4f 44 45 54 59   sizeof(YYCODETY
1eda0 50 45 29 20 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  PE)   */.  const
1edb0 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 69   char *name;.  i
1edc0 6e 74 20 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6d 78  nt mnTknOfst, mx
1edd0 54 6b 6e 4f 66 73 74 3b 0a 20 20 69 6e 74 20 6d  TknOfst;.  int m
1ede0 6e 4e 74 4f 66 73 74 2c 20 6d 78 4e 74 4f 66 73  nNtOfst, mxNtOfs
1edf0 74 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65  t;.  struct axse
1ee00 74 20 2a 61 78 3b 0a 0a 20 20 6c 65 6d 70 2d 3e  t *ax;..  lemp->
1ee10 6d 69 6e 53 68 69 66 74 52 65 64 75 63 65 20 3d  minShiftReduce =
1ee20 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20   lemp->nstate;. 
1ee30 20 6c 65 6d 70 2d 3e 65 72 72 41 63 74 69 6f 6e   lemp->errAction
1ee40 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 53 68 69 66   = lemp->minShif
1ee50 74 52 65 64 75 63 65 20 2b 20 6c 65 6d 70 2d 3e  tReduce + lemp->
1ee60 6e 72 75 6c 65 3b 0a 20 20 6c 65 6d 70 2d 3e 61  nrule;.  lemp->a
1ee70 63 63 41 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d  ccAction = lemp-
1ee80 3e 65 72 72 41 63 74 69 6f 6e 20 2b 20 31 3b 0a  >errAction + 1;.
1ee90 20 20 6c 65 6d 70 2d 3e 6e 6f 41 63 74 69 6f 6e    lemp->noAction
1eea0 20 3d 20 6c 65 6d 70 2d 3e 61 63 63 41 63 74 69   = lemp->accActi
1eeb0 6f 6e 20 2b 20 31 3b 0a 20 20 6c 65 6d 70 2d 3e  on + 1;.  lemp->
1eec0 6d 69 6e 52 65 64 75 63 65 20 3d 20 6c 65 6d 70  minReduce = lemp
1eed0 2d 3e 6e 6f 41 63 74 69 6f 6e 20 2b 20 31 3b 0a  ->noAction + 1;.
1eee0 20 20 6c 65 6d 70 2d 3e 6d 61 78 41 63 74 69 6f    lemp->maxActio
1eef0 6e 20 3d 20 6c 65 6d 70 2d 3e 6d 69 6e 52 65 64  n = lemp->minRed
1ef00 75 63 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  uce + lemp->nrul
1ef10 65 3b 0a 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f  e;..  in = tplt_
1ef20 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66  open(lemp);.  if
1ef30 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( in==0 ) return
1ef40 3b 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f  ;.  out = file_o
1ef50 70 65 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77  pen(lemp,".c","w
1ef60 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d  b");.  if( out==
1ef70 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28  0 ){.    fclose(
1ef80 69 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  in);.    return;
1ef90 0a 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20  .  }.  lineno = 
1efa0 31 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  1;.  tplt_xfer(l
1efb0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1efc0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1efd0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 69 6e   Generate the in
1efe0 63 6c 75 64 65 20 63 6f 64 65 2c 20 69 66 20 61  clude code, if a
1eff0 6e 79 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ny */.  tplt_pri
1f000 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1f010 2d 3e 69 6e 63 6c 75 64 65 2c 26 6c 69 6e 65 6e  ->include,&linen
1f020 6f 29 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67  o);.  if( mhflag
1f030 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 69 6e   ){.    char *in
1f040 63 4e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b  cName = file_mak
1f050 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 22 2e 68 22  ename(lemp, ".h"
1f060 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1f070 75 74 2c 22 23 69 6e 63 6c 75 64 65 20 5c 22 25  ut,"#include \"%
1f080 73 5c 22 5c 6e 22 2c 20 69 6e 63 4e 61 6d 65 29  s\"\n", incName)
1f090 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1f0a0 66 72 65 65 28 69 6e 63 4e 61 6d 65 29 3b 0a 20  free(incName);. 
1f0b0 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
1f0c0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1f0d0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1f0e0 20 47 65 6e 65 72 61 74 65 20 23 64 65 66 69 6e   Generate #defin
1f0f0 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e  es for all token
1f100 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c 61  s */.  if( mhfla
1f110 67 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  g ){.    const c
1f120 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20  har *prefix;.   
1f130 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
1f140 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b  f INTERFACE\n");
1f150 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69   lineno++;.    i
1f160 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72  f( lemp->tokenpr
1f170 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20  efix ) prefix = 
1f180 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
1f190 78 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20  x;.    else     
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1f1b0 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20  refix = "";.    
1f1c0 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d  for(i=1; i<lemp-
1f1d0 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
1f1e0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1f1f0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25  out,"#define %s%
1f200 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66  -30s %2d\n",pref
1f210 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ix,lemp->symbols
1f220 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20  [i]->name,i);.  
1f230 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
1f240 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
1f250 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b  out,"#endif\n");
1f260 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1f270 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1f280 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1f290 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1f2a0 65 72 61 74 65 20 74 68 65 20 64 65 66 69 6e 65  erate the define
1f2b0 73 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  s */.  fprintf(o
1f2c0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f  ut,"#define YYCO
1f2d0 44 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20  DETYPE %s\n",.  
1f2e0 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74    minimum_size_t
1f2f0 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79  ype(0, lemp->nsy
1f300 6d 62 6f 6c 2b 31 2c 20 26 73 7a 43 6f 64 65 54  mbol+1, &szCodeT
1f310 79 70 65 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ype)); lineno++;
1f320 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1f330 23 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45  #define YYNOCODE
1f340 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79   %d\n",lemp->nsy
1f350 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f  mbol+1);  lineno
1f360 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1f370 74 2c 22 23 64 65 66 69 6e 65 20 59 59 41 43 54  t,"#define YYACT
1f380 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20  IONTYPE %s\n",. 
1f390 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f     minimum_size_
1f3a0 74 79 70 65 28 30 2c 6c 65 6d 70 2d 3e 6d 61 78  type(0,lemp->max
1f3b0 41 63 74 69 6f 6e 2c 26 73 7a 41 63 74 69 6f 6e  Action,&szAction
1f3c0 54 79 70 65 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  Type)); lineno++
1f3d0 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 77 69  ;.  if( lemp->wi
1f3e0 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20 66 70  ldcard ){.    fp
1f3f0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1f400 6e 65 20 59 59 57 49 4c 44 43 41 52 44 20 25 64  ne YYWILDCARD %d
1f410 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6c 65 6d 70  \n",.       lemp
1f420 2d 3e 77 69 6c 64 63 61 72 64 2d 3e 69 6e 64 65  ->wildcard->inde
1f430 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  x); lineno++;.  
1f440 7d 0a 20 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f  }.  print_stack_
1f450 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26  union(out,lemp,&
1f460 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a  lineno,mhflag);.
1f470 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1f480 23 69 66 6e 64 65 66 20 59 59 53 54 41 43 4b 44  #ifndef YYSTACKD
1f490 45 50 54 48 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  EPTH\n"); lineno
1f4a0 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ++;.  if( lemp->
1f4b0 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20  stacksize ){.   
1f4c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1f4d0 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50  efine YYSTACKDEP
1f4e0 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73  TH %s\n",lemp->s
1f4f0 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65  tacksize);  line
1f500 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no++;.  }else{. 
1f510 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1f520 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44  #define YYSTACKD
1f530 45 50 54 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c  EPTH 100\n");  l
1f540 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66  ineno++;.  }.  f
1f550 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 65 6e  printf(out, "#en
1f560 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
1f570 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  +;.  if( mhflag 
1f580 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1f590 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
1f5a0 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
1f5b0 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65  .  }.  name = le
1f5c0 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d  mp->name ? lemp-
1f5d0 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b  >name : "Parse";
1f5e0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67  .  if( lemp->arg
1f5f0 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d   && lemp->arg[0]
1f600 20 29 7b 0a 20 20 20 20 69 20 3d 20 6c 65 6d 6f   ){.    i = lemo
1f610 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72  nStrlen(lemp->ar
1f620 67 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  g);.    while( i
1f630 3e 3d 31 20 26 26 20 49 53 53 50 41 43 45 28 6c  >=1 && ISSPACE(l
1f640 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29  emp->arg[i-1]) )
1f650 20 69 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28   i--;.    while(
1f660 20 69 3e 3d 31 20 26 26 20 28 49 53 41 4c 4e 55   i>=1 && (ISALNU
1f670 4d 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d  M(lemp->arg[i-1]
1f680 29 20 7c 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69  ) || lemp->arg[i
1f690 2d 31 5d 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b  -1]=='_') ) i--;
1f6a0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1f6b0 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1f6c0 53 44 45 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d  SDECL %s;\n",nam
1f6d0 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c  e,lemp->arg);  l
1f6e0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
1f6f0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1f700 65 20 25 73 41 52 47 5f 50 44 45 43 4c 20 2c 25  e %sARG_PDECL ,%
1f710 73 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e  s\n",name,lemp->
1f720 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  arg);  lineno++;
1f730 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1f740 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1f750 46 45 54 43 48 20 25 73 20 3d 20 79 79 70 50 61  FETCH %s = yypPa
1f760 72 73 65 72 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20  rser->%s\n",.   
1f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
1f780 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65  me,lemp->arg,&le
1f790 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69  mp->arg[i]);  li
1f7a0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1f7b0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1f7c0 20 25 73 41 52 47 5f 53 54 4f 52 45 20 79 79 70   %sARG_STORE yyp
1f7d0 50 61 72 73 65 72 2d 3e 25 73 20 3d 20 25 73 5c  Parser->%s = %s\
1f7e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1f7f0 20 20 20 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d       name,&lemp-
1f800 3e 61 72 67 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61  >arg[i],&lemp->a
1f810 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b  rg[i]);  lineno+
1f820 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1f830 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1f840 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c  fine %sARG_SDECL
1f850 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65  \n",name);  line
1f860 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1f870 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1f880 73 41 52 47 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61  sARG_PDECL\n",na
1f890 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  me);  lineno++;.
1f8a0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1f8b0 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46  "#define %sARG_F
1f8c0 45 54 43 48 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c  ETCH\n",name); l
1f8d0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
1f8e0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1f8f0 65 20 25 73 41 52 47 5f 53 54 4f 52 45 5c 6e 22  e %sARG_STORE\n"
1f900 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ,name); lineno++
1f910 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c  ;.  }.  if( mhfl
1f920 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  ag ){.    fprint
1f930 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22  f(out,"#endif\n"
1f940 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1f950 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72  .  if( lemp->err
1f960 73 79 6d 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20  sym->useCnt ){. 
1f970 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1f980 23 64 65 66 69 6e 65 20 59 59 45 52 52 4f 52 53  #define YYERRORS
1f990 59 4d 42 4f 4c 20 25 64 5c 6e 22 2c 6c 65 6d 70  YMBOL %d\n",lemp
1f9a0 2d 3e 65 72 72 73 79 6d 2d 3e 69 6e 64 65 78 29  ->errsym->index)
1f9b0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1f9c0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1f9d0 66 69 6e 65 20 59 59 45 52 52 53 59 4d 44 54 20  fine YYERRSYMDT 
1f9e0 79 79 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72  yy%d\n",lemp->er
1f9f0 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69  rsym->dtnum); li
1fa00 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  neno++;.  }.  if
1fa10 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c  ( lemp->has_fall
1fa20 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 70 72 69  back ){.    fpri
1fa30 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1fa40 20 59 59 46 41 4c 4c 42 41 43 4b 20 31 5c 6e 22   YYFALLBACK 1\n"
1fa50 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1fa60 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
1fa70 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
1fa80 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 6f 75 74  , but do not out
1fa90 70 75 74 20 69 74 20 79 65 74 2e 20 20 54 68 65  put it yet.  The
1faa0 20 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 61 62   action.  ** tab
1fab0 6c 65 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 75  le must be compu
1fac0 74 65 64 20 62 65 66 6f 72 65 20 67 65 6e 65 72  ted before gener
1fad0 61 74 69 6e 67 20 74 68 65 20 59 59 4e 53 54 41  ating the YYNSTA
1fae0 54 45 20 6d 61 63 72 6f 20 62 65 63 61 75 73 65  TE macro because
1faf0 0a 20 20 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f  .  ** we need to
1fb00 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e 79 20 73   know how many s
1fb10 74 61 74 65 73 20 63 61 6e 20 62 65 20 65 6c 69  tates can be eli
1fb20 6d 69 6e 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  minated..  */.  
1fb30 61 78 20 3d 20 28 73 74 72 75 63 74 20 61 78 73  ax = (struct axs
1fb40 65 74 20 2a 29 20 63 61 6c 6c 6f 63 28 6c 65 6d  et *) calloc(lem
1fb50 70 2d 3e 6e 78 73 74 61 74 65 2a 32 2c 20 73 69  p->nxstate*2, si
1fb60 7a 65 6f 66 28 61 78 5b 30 5d 29 29 3b 0a 20 20  zeof(ax[0]));.  
1fb70 69 66 28 20 61 78 3d 3d 30 20 29 7b 0a 20 20 20  if( ax==0 ){.   
1fb80 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1fb90 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e  "malloc failed\n
1fba0 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
1fbb0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1fbc0 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b  i<lemp->nxstate;
1fbd0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
1fbe0 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
1fbf0 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 73 74  ;.    ax[i*2].st
1fc00 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78 5b  p = stp;.    ax[
1fc10 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a  i*2].isTkn = 1;.
1fc20 20 20 20 20 61 78 5b 69 2a 32 5d 2e 6e 41 63 74      ax[i*2].nAct
1fc30 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41  ion = stp->nTknA
1fc40 63 74 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31  ct;.    ax[i*2+1
1fc50 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20  ].stp = stp;.   
1fc60 20 61 78 5b 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e   ax[i*2+1].isTkn
1fc70 20 3d 20 30 3b 0a 20 20 20 20 61 78 5b 69 2a 32   = 0;.    ax[i*2
1fc80 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74  +1].nAction = st
1fc90 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 7d 0a 20  p->nNtAct;.  }. 
1fca0 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54   mxTknOfst = mnT
1fcb0 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a 20 20 6d 78  knOfst = 0;.  mx
1fcc0 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73  NtOfst = mnNtOfs
1fcd0 74 20 3d 20 30 3b 0a 20 20 2f 2a 20 49 6e 20 61  t = 0;.  /* In a
1fce0 6e 20 65 66 66 6f 72 74 20 74 6f 20 6d 69 6e 69  n effort to mini
1fcf0 6d 69 7a 65 20 74 68 65 20 61 63 74 69 6f 6e 20  mize the action 
1fd00 74 61 62 6c 65 20 73 69 7a 65 2c 20 75 73 65 20  table size, use 
1fd10 74 68 65 20 68 65 75 72 69 73 74 69 63 0a 20 20  the heuristic.  
1fd20 2a 2a 20 6f 66 20 70 6c 61 63 69 6e 67 20 74 68  ** of placing th
1fd30 65 20 6c 61 72 67 65 73 74 20 61 63 74 69 6f 6e  e largest action
1fd40 20 73 65 74 73 20 66 69 72 73 74 20 2a 2f 0a 20   sets first */. 
1fd50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1fd60 2d 3e 6e 78 73 74 61 74 65 2a 32 3b 20 69 2b 2b  ->nxstate*2; i++
1fd70 29 20 61 78 5b 69 5d 2e 69 4f 72 64 65 72 20 3d  ) ax[i].iOrder =
1fd80 20 69 3b 0a 20 20 71 73 6f 72 74 28 61 78 2c 20   i;.  qsort(ax, 
1fd90 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2a 32 2c  lemp->nxstate*2,
1fda0 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 2c 20   sizeof(ax[0]), 
1fdb0 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 29 3b 0a  axset_compare);.
1fdc0 20 20 70 41 63 74 74 61 62 20 3d 20 61 63 74 74    pActtab = actt
1fdd0 61 62 5f 61 6c 6c 6f 63 28 6c 65 6d 70 2d 3e 6e  ab_alloc(lemp->n
1fde0 73 79 6d 62 6f 6c 2c 20 6c 65 6d 70 2d 3e 6e 74  symbol, lemp->nt
1fdf0 65 72 6d 69 6e 61 6c 29 3b 0a 20 20 66 6f 72 28  erminal);.  for(
1fe00 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73  i=0; i<lemp->nxs
1fe10 74 61 74 65 2a 32 20 26 26 20 61 78 5b 69 5d 2e  tate*2 && ax[i].
1fe20 6e 41 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b 29 7b  nAction>0; i++){
1fe30 0a 20 20 20 20 73 74 70 20 3d 20 61 78 5b 69 5d  .    stp = ax[i]
1fe40 2e 73 74 70 3b 0a 20 20 20 20 69 66 28 20 61 78  .stp;.    if( ax
1fe50 5b 69 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20 20 20  [i].isTkn ){.   
1fe60 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
1fe70 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
1fe80 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  xt){.        int
1fe90 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20   action;.       
1fea0 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
1feb0 65 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ex>=lemp->ntermi
1fec0 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  nal ) continue;.
1fed0 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d          action =
1fee0 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28   compute_action(
1fef0 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20  lemp, ap);.     
1ff00 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20     if( action<0 
1ff10 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1ff20 20 20 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f      acttab_actio
1ff30 6e 28 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73  n(pActtab, ap->s
1ff40 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e  p->index, action
1ff50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ff60 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d   stp->iTknOfst =
1ff70 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70   acttab_insert(p
1ff80 41 63 74 74 61 62 2c 20 31 29 3b 0a 20 20 20 20  Acttab, 1);.    
1ff90 20 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f    if( stp->iTknO
1ffa0 66 73 74 3c 6d 6e 54 6b 6e 4f 66 73 74 20 29 20  fst<mnTknOfst ) 
1ffb0 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d  mnTknOfst = stp-
1ffc0 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 20  >iTknOfst;.     
1ffd0 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66   if( stp->iTknOf
1ffe0 73 74 3e 6d 78 54 6b 6e 4f 66 73 74 20 29 20 6d  st>mxTknOfst ) m
1fff0 78 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e  xTknOfst = stp->
20000 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 7d 65  iTknOfst;.    }e
20010 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 61  lse{.      for(a
20020 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
20030 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
20040 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b       int action;
20050 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d  .        if( ap-
20060 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d  >sp->index<lemp-
20070 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e  >nterminal ) con
20080 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
20090 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
200a0 3d 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  ==lemp->nsymbol 
200b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
200c0 20 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d      action = com
200d0 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70  pute_action(lemp
200e0 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69  , ap);.        i
200f0 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f  f( action<0 ) co
20100 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
20110 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41  acttab_action(pA
20120 63 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69  cttab, ap->sp->i
20130 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20  ndex, action);. 
20140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70       }.      stp
20150 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 61 63 74 74  ->iNtOfst = actt
20160 61 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61  ab_insert(pActta
20170 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  b, 0);.      if(
20180 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e   stp->iNtOfst<mn
20190 4e 74 4f 66 73 74 20 29 20 6d 6e 4e 74 4f 66 73  NtOfst ) mnNtOfs
201a0 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  t = stp->iNtOfst
201b0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d  ;.      if( stp-
201c0 3e 69 4e 74 4f 66 73 74 3e 6d 78 4e 74 4f 66 73  >iNtOfst>mxNtOfs
201d0 74 20 29 20 6d 78 4e 74 4f 66 73 74 20 3d 20 73  t ) mxNtOfst = s
201e0 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20  tp->iNtOfst;.   
201f0 20 7d 0a 23 69 66 20 30 20 20 2f 2a 20 55 6e 63   }.#if 0  /* Unc
20200 6f 6d 6d 65 6e 74 20 66 6f 72 20 61 20 74 72 61  omment for a tra
20210 63 65 20 6f 66 20 68 6f 77 20 74 68 65 20 79 79  ce of how the yy
20220 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20  _action[] table 
20230 66 69 6c 6c 73 20 6f 75 74 20 2a 2f 0a 20 20 20  fills out */.   
20240 20 7b 20 69 6e 74 20 6a 6a 2c 20 6e 6e 3b 0a 20   { int jj, nn;. 
20250 20 20 20 20 20 66 6f 72 28 6a 6a 3d 6e 6e 3d 30       for(jj=nn=0
20260 3b 20 6a 6a 3c 70 41 63 74 74 61 62 2d 3e 6e 41  ; jj<pActtab->nA
20270 63 74 69 6f 6e 3b 20 6a 6a 2b 2b 29 7b 0a 20 20  ction; jj++){.  
20280 20 20 20 20 20 20 69 66 28 20 70 41 63 74 74 61        if( pActta
20290 62 2d 3e 61 41 63 74 69 6f 6e 5b 6a 6a 5d 2e 61  b->aAction[jj].a
202a0 63 74 69 6f 6e 3c 30 20 29 20 6e 6e 2b 2b 3b 0a  ction<0 ) nn++;.
202b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72        }.      pr
202c0 69 6e 74 66 28 22 25 34 64 3a 20 53 74 61 74 65  intf("%4d: State
202d0 20 25 33 64 20 25 73 20 6e 3a 20 25 32 64 20 73   %3d %s n: %2d s
202e0 69 7a 65 3a 20 25 35 64 20 66 72 65 65 73 70 61  ize: %5d freespa
202f0 63 65 3a 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ce: %d\n",.     
20300 20 20 20 20 20 20 20 20 69 2c 20 73 74 70 2d 3e          i, stp->
20310 73 74 61 74 65 6e 75 6d 2c 20 61 78 5b 69 5d 2e  statenum, ax[i].
20320 69 73 54 6b 6e 20 3f 20 22 54 6f 6b 65 6e 22 20  isTkn ? "Token" 
20330 3a 20 22 56 61 72 20 20 22 2c 0a 20 20 20 20 20  : "Var  ",.     
20340 20 20 20 20 20 20 20 20 61 78 5b 69 5d 2e 6e 41          ax[i].nA
20350 63 74 69 6f 6e 2c 20 70 41 63 74 74 61 62 2d 3e  ction, pActtab->
20360 6e 41 63 74 69 6f 6e 2c 20 6e 6e 29 3b 0a 20 20  nAction, nn);.  
20370 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
20380 20 66 72 65 65 28 61 78 29 3b 0a 0a 20 20 2f 2a   free(ax);..  /*
20390 20 4d 61 72 6b 20 72 75 6c 65 73 20 74 68 61 74   Mark rules that
203a0 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73   are actually us
203b0 65 64 20 66 6f 72 20 72 65 64 75 63 65 20 61 63  ed for reduce ac
203c0 74 69 6f 6e 73 20 61 66 74 65 72 20 61 6c 6c 0a  tions after all.
203d0 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f    ** optimizatio
203e0 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 70 70  ns have been app
203f0 6c 69 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  lied.  */.  for(
20400 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
20410 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 20  p; rp=rp->next) 
20420 72 70 2d 3e 64 6f 65 73 52 65 64 75 63 65 20 3d  rp->doesReduce =
20430 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20   LEMON_FALSE;.  
20440 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
20450 3e 6e 78 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  >nxstate; i++){.
20460 20 20 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d      for(ap=lemp-
20470 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20  >sorted[i]->ap; 
20480 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
20490 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  {.      if( ap->
204a0 74 79 70 65 3d 3d 52 45 44 55 43 45 20 7c 7c 20  type==REDUCE || 
204b0 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 52  ap->type==SHIFTR
204c0 45 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 20  EDUCE ){.       
204d0 20 61 70 2d 3e 78 2e 72 70 2d 3e 64 6f 65 73 52   ap->x.rp->doesR
204e0 65 64 75 63 65 20 3d 20 31 3b 0a 20 20 20 20 20  educe = 1;.     
204f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
20500 2f 2a 20 46 69 6e 69 73 68 20 72 65 6e 64 65 72  /* Finish render
20510 69 6e 67 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  ing the constant
20520 73 20 6e 6f 77 20 74 68 61 74 20 74 68 65 20 61  s now that the a
20530 63 74 69 6f 6e 20 74 61 62 6c 65 20 68 61 73 0a  ction table has.
20540 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 75 74    ** been comput
20550 65 64 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  ed */.  fprintf(
20560 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e  out,"#define YYN
20570 53 54 41 54 45 20 20 20 20 20 20 20 20 20 20 20  STATE           
20580 20 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 78    %d\n",lemp->nx
20590 73 74 61 74 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  state);  lineno+
205a0 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
205b0 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 52 55 4c  ,"#define YYNRUL
205c0 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25  E              %
205d0 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65  d\n",lemp->nrule
205e0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
205f0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
20600 66 69 6e 65 20 59 59 4e 54 4f 4b 45 4e 20 20 20  fine YYNTOKEN   
20610 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
20620 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 29  lemp->nterminal)
20630 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
20640 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
20650 6e 65 20 59 59 5f 4d 41 58 5f 53 48 49 46 54 20  ne YY_MAX_SHIFT 
20660 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 6c 65          %d\n",le
20670 6d 70 2d 3e 6e 78 73 74 61 74 65 2d 31 29 3b 20  mp->nxstate-1); 
20680 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 20 3d 20  lineno++;.  i = 
20690 6c 65 6d 70 2d 3e 6d 69 6e 53 68 69 66 74 52 65  lemp->minShiftRe
206a0 64 75 63 65 3b 0a 20 20 66 70 72 69 6e 74 66 28  duce;.  fprintf(
206b0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f  out,"#define YY_
206c0 4d 49 4e 5f 53 48 49 46 54 52 45 44 55 43 45 20  MIN_SHIFTREDUCE 
206d0 20 20 25 64 5c 6e 22 2c 69 29 3b 20 6c 69 6e 65    %d\n",i); line
206e0 6e 6f 2b 2b 3b 0a 20 20 69 20 2b 3d 20 6c 65 6d  no++;.  i += lem
206f0 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 66 70 72 69  p->nrule;.  fpri
20700 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
20710 20 59 59 5f 4d 41 58 5f 53 48 49 46 54 52 45 44   YY_MAX_SHIFTRED
20720 55 43 45 20 20 20 25 64 5c 6e 22 2c 20 69 2d 31  UCE   %d\n", i-1
20730 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
20740 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
20750 69 6e 65 20 59 59 5f 45 52 52 4f 52 5f 41 43 54  ine YY_ERROR_ACT
20760 49 4f 4e 20 20 20 20 20 20 25 64 5c 6e 22 2c 20  ION      %d\n", 
20770 6c 65 6d 70 2d 3e 65 72 72 41 63 74 69 6f 6e 29  lemp->errAction)
20780 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
20790 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
207a0 6e 65 20 59 59 5f 41 43 43 45 50 54 5f 41 43 54  ne YY_ACCEPT_ACT
207b0 49 4f 4e 20 20 20 20 20 25 64 5c 6e 22 2c 20 6c  ION     %d\n", l
207c0 65 6d 70 2d 3e 61 63 63 41 63 74 69 6f 6e 29 3b  emp->accAction);
207d0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
207e0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
207f0 65 20 59 59 5f 4e 4f 5f 41 43 54 49 4f 4e 20 20  e YY_NO_ACTION  
20800 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 6c 65         %d\n", le
20810 6d 70 2d 3e 6e 6f 41 63 74 69 6f 6e 29 3b 20 6c  mp->noAction); l
20820 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
20830 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
20840 59 59 5f 4d 49 4e 5f 52 45 44 55 43 45 20 20 20  YY_MIN_REDUCE   
20850 20 20 20 20 20 25 64 5c 6e 22 2c 20 6c 65 6d 70       %d\n", lemp
20860 2d 3e 6d 69 6e 52 65 64 75 63 65 29 3b 20 6c 69  ->minReduce); li
20870 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 20 3d 20 6c 65  neno++;.  i = le
20880 6d 70 2d 3e 6d 69 6e 52 65 64 75 63 65 20 2b 20  mp->minReduce + 
20890 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 66  lemp->nrule;.  f
208a0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
208b0 69 6e 65 20 59 59 5f 4d 41 58 5f 52 45 44 55 43  ine YY_MAX_REDUC
208c0 45 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20  E        %d\n", 
208d0 69 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i-1); lineno++;.
208e0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
208f0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
20900 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  ineno);..  /* No
20910 77 20 6f 75 74 70 75 74 20 74 68 65 20 61 63 74  w output the act
20920 69 6f 6e 20 74 61 62 6c 65 20 61 6e 64 20 69 74  ion table and it
20930 73 20 61 73 73 6f 63 69 61 74 65 73 3a 0a 20 20  s associates:.  
20940 2a 2a 0a 20 20 2a 2a 20 20 79 79 5f 61 63 74 69  **.  **  yy_acti
20950 6f 6e 5b 5d 20 20 20 20 20 20 20 20 41 20 73 69  on[]        A si
20960 6e 67 6c 65 20 74 61 62 6c 65 20 63 6f 6e 74 61  ngle table conta
20970 69 6e 69 6e 67 20 61 6c 6c 20 61 63 74 69 6f 6e  ining all action
20980 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b  s..  **  yy_look
20990 61 68 65 61 64 5b 5d 20 20 20 20 20 41 20 74 61  ahead[]     A ta
209a0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
209b0 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72  he lookahead for
209c0 20 65 61 63 68 20 65 6e 74 72 79 20 69 6e 0a 20   each entry in. 
209d0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
209e0 20 20 20 20 20 20 20 20 79 79 5f 61 63 74 69 6f          yy_actio
209f0 6e 2e 20 20 55 73 65 64 20 74 6f 20 64 65 74 65  n.  Used to dete
20a00 63 74 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ct hash collisio
20a10 6e 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 73 68 69  ns..  **  yy_shi
20a20 66 74 5f 6f 66 73 74 5b 5d 20 20 20 20 46 6f 72  ft_ofst[]    For
20a30 20 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65   each state, the
20a40 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f   offset into yy_
20a50 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20  action for.  ** 
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a70 20 20 20 20 73 68 69 66 74 69 6e 67 20 74 65 72      shifting ter
20a80 6d 69 6e 61 6c 73 2e 0a 20 20 2a 2a 20 20 79 79  minals..  **  yy
20a90 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 20  _reduce_ofst[]  
20aa0 20 46 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c   For each state,
20ab0 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f   the offset into
20ac0 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20   yy_action for. 
20ad0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
20ae0 20 20 20 20 20 20 20 20 73 68 69 66 74 69 6e 67          shifting
20af0 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 61   non-terminals a
20b00 66 74 65 72 20 61 20 72 65 64 75 63 65 2e 0a 20  fter a reduce.. 
20b10 20 2a 2a 20 20 79 79 5f 64 65 66 61 75 6c 74 5b   **  yy_default[
20b20 5d 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 20  ]       Default 
20b30 61 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  action for each 
20b40 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  state..  */..  /
20b50 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f  * Output the yy_
20b60 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a  action table */.
20b70 20 20 6c 65 6d 70 2d 3e 6e 61 63 74 69 6f 6e 74    lemp->nactiont
20b80 61 62 20 3d 20 6e 20 3d 20 61 63 74 74 61 62 5f  ab = n = acttab_
20b90 61 63 74 69 6f 6e 5f 73 69 7a 65 28 70 41 63 74  action_size(pAct
20ba0 74 61 62 29 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61  tab);.  lemp->ta
20bb0 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 41  blesize += n*szA
20bc0 63 74 69 6f 6e 54 79 70 65 3b 0a 20 20 66 70 72  ctionType;.  fpr
20bd0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
20be0 65 20 59 59 5f 41 43 54 54 41 42 5f 43 4f 55 4e  e YY_ACTTAB_COUN
20bf0 54 20 28 25 64 29 5c 6e 22 2c 20 6e 29 3b 20 6c  T (%d)\n", n); l
20c00 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
20c10 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20 63  tf(out,"static c
20c20 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e 54 59 50  onst YYACTIONTYP
20c30 45 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20  E yy_action[] = 
20c40 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  {\n"); lineno++;
20c50 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
20c60 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
20c70 20 61 63 74 69 6f 6e 20 3d 20 61 63 74 74 61 62   action = acttab
20c80 5f 79 79 61 63 74 69 6f 6e 28 70 41 63 74 74 61  _yyaction(pActta
20c90 62 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 61  b, i);.    if( a
20ca0 63 74 69 6f 6e 3c 30 20 29 20 61 63 74 69 6f 6e  ction<0 ) action
20cb0 20 3d 20 6c 65 6d 70 2d 3e 6e 6f 41 63 74 69 6f   = lemp->noActio
20cc0 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20  n;.    if( j==0 
20cd0 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20  ) fprintf(out," 
20ce0 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b  /* %5d */ ", i);
20cf0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
20d00 2c 20 22 20 25 34 64 2c 22 2c 20 61 63 74 69 6f  , " %4d,", actio
20d10 6e 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39  n);.    if( j==9
20d20 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20   || i==n-1 ){.  
20d30 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
20d40 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   "\n"); lineno++
20d50 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20  ;.      j = 0;. 
20d60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20d70 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  j++;.    }.  }. 
20d80 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d   fprintf(out, "}
20d90 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
20da0 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
20db0 65 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 74  e yy_lookahead t
20dc0 61 62 6c 65 20 2a 2f 0a 20 20 6c 65 6d 70 2d 3e  able */.  lemp->
20dd0 6e 6c 6f 6f 6b 61 68 65 61 64 74 61 62 20 3d 20  nlookaheadtab = 
20de0 6e 20 3d 20 61 63 74 74 61 62 5f 6c 6f 6f 6b 61  n = acttab_looka
20df0 68 65 61 64 5f 73 69 7a 65 28 70 41 63 74 74 61  head_size(pActta
20e00 62 29 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c  b);.  lemp->tabl
20e10 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 43 6f 64  esize += n*szCod
20e20 65 54 79 70 65 3b 0a 20 20 66 70 72 69 6e 74 66  eType;.  fprintf
20e30 28 6f 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e  (out,"static con
20e40 73 74 20 59 59 43 4f 44 45 54 59 50 45 20 79 79  st YYCODETYPE yy
20e50 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 3d 20 7b  _lookahead[] = {
20e60 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
20e70 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
20e80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
20e90 6c 61 20 3d 20 61 63 74 74 61 62 5f 79 79 6c 6f  la = acttab_yylo
20ea0 6f 6b 61 68 65 61 64 28 70 41 63 74 74 61 62 2c  okahead(pActtab,
20eb0 20 69 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 3c   i);.    if( la<
20ec0 30 20 29 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e  0 ) la = lemp->n
20ed0 73 79 6d 62 6f 6c 3b 0a 20 20 20 20 69 66 28 20  symbol;.    if( 
20ee0 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
20ef0 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
20f00 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
20f10 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
20f20 6c 61 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  la);.    if( j==
20f30 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
20f40 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
20f50 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
20f60 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
20f70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20f80 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
20f90 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
20fa0 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
20fb0 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
20fc0 68 65 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74  he yy_shift_ofst
20fd0 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6e 20  [] table */.  n 
20fe0 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b  = lemp->nxstate;
20ff0 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
21000 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d   lemp->sorted[n-
21010 31 5d 2d 3e 69 54 6b 6e 4f 66 73 74 3d 3d 4e 4f  1]->iTknOfst==NO
21020 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20  _OFFSET ) n--;. 
21030 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
21040 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f  define YY_SHIFT_
21050 43 4f 55 4e 54 20 20 20 20 28 25 64 29 5c 6e 22  COUNT    (%d)\n"
21060 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  , n-1); lineno++
21070 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
21080 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49   "#define YY_SHI
21090 46 54 5f 4d 49 4e 20 20 20 20 20 20 28 25 64 29  FT_MIN      (%d)
210a0 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 29 3b  \n", mnTknOfst);
210b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
210c0 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
210d0 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 41 58 20  ne YY_SHIFT_MAX 
210e0 20 20 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 78       (%d)\n", mx
210f0 54 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f  TknOfst); lineno
21100 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
21110 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74  t, "static const
21120 20 25 73 20 79 79 5f 73 68 69 66 74 5f 6f 66 73   %s yy_shift_ofs
21130 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 0a 20 20 20 20  t[] = {\n",.    
21140 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f     minimum_size_
21150 74 79 70 65 28 6d 6e 54 6b 6e 4f 66 73 74 2c 20  type(mnTknOfst, 
21160 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 2b  lemp->nterminal+
21170 6c 65 6d 70 2d 3e 6e 61 63 74 69 6f 6e 74 61 62  lemp->nactiontab
21180 2c 20 26 73 7a 29 29 3b 0a 20 20 20 20 20 20 20  , &sz));.       
21190 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6c 65 6d 70  lineno++;.  lemp
211a0 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e  ->tablesize += n
211b0 2a 73 7a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  *sz;.  for(i=j=0
211c0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
211d0 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73   int ofst;.    s
211e0 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
211f0 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d  d[i];.    ofst =
21200 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a   stp->iTknOfst;.
21210 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f      if( ofst==NO
21220 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d  _OFFSET ) ofst =
21230 20 6c 65 6d 70 2d 3e 6e 61 63 74 69 6f 6e 74 61   lemp->nactionta
21240 62 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20  b;.    if( j==0 
21250 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20  ) fprintf(out," 
21260 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b  /* %5d */ ", i);
21270 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
21280 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66 73 74 29  , " %4d,", ofst)
21290 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c  ;.    if( j==9 |
212a0 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20  | i==n-1 ){.    
212b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
212c0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
212d0 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
212e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b   }else{.      j+
212f0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  +;.    }.  }.  f
21300 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c  printf(out, "};\
21310 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a  n"); lineno++;..
21320 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
21330 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d  yy_reduce_ofst[]
21340 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6e 20 3d 20   table */.  n = 
21350 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 0a 20  lemp->nxstate;. 
21360 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c   while( n>0 && l
21370 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d  emp->sorted[n-1]
21380 2d 3e 69 4e 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46  ->iNtOfst==NO_OF
21390 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70  FSET ) n--;.  fp
213a0 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
213b0 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 43 4f  ine YY_REDUCE_CO
213c0 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31  UNT (%d)\n", n-1
213d0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
213e0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65  printf(out, "#de
213f0 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 4d  fine YY_REDUCE_M
21400 49 4e 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e  IN   (%d)\n", mn
21410 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b  NtOfst); lineno+
21420 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
21430 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45  , "#define YY_RE
21440 44 55 43 45 5f 4d 41 58 20 20 20 28 25 64 29 5c  DUCE_MAX   (%d)\
21450 6e 22 2c 20 6d 78 4e 74 4f 66 73 74 29 3b 20 6c  n", mxNtOfst); l
21460 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
21470 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20  tf(out, "static 
21480 63 6f 6e 73 74 20 25 73 20 79 79 5f 72 65 64 75  const %s yy_redu
21490 63 65 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22  ce_ofst[] = {\n"
214a0 2c 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69  ,.          mini
214b0 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e  mum_size_type(mn
214c0 4e 74 4f 66 73 74 2d 31 2c 20 6d 78 4e 74 4f 66  NtOfst-1, mxNtOf
214d0 73 74 2c 20 26 73 7a 29 29 3b 20 6c 69 6e 65 6e  st, &sz)); linen
214e0 6f 2b 2b 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62  o++;.  lemp->tab
214f0 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a 73 7a 3b 0a  lesize += n*sz;.
21500 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
21510 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
21520 6f 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20  ofst;.    stp = 
21530 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
21540 0a 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d  .    ofst = stp-
21550 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 69 66  >iNtOfst;.    if
21560 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45  ( ofst==NO_OFFSE
21570 54 20 29 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f  T ) ofst = mnNtO
21580 66 73 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28  fst - 1;.    if(
21590 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28   j==0 ) fprintf(
215a0 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20  out," /* %5d */ 
215b0 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e  ", i);.    fprin
215c0 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c  tf(out, " %4d,",
215d0 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20   ofst);.    if( 
215e0 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29  j==9 || i==n-1 )
215f0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
21600 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65  out, "\n"); line
21610 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20  no++;.      j = 
21620 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
21630 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      j++;.    }. 
21640 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
21650 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  , "};\n"); linen
21660 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  o++;..  /* Outpu
21670 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 63  t the default ac
21680 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tion table */.  
21690 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74  fprintf(out, "st
216a0 61 74 69 63 20 63 6f 6e 73 74 20 59 59 41 43 54  atic const YYACT
216b0 49 4f 4e 54 59 50 45 20 79 79 5f 64 65 66 61 75  IONTYPE yy_defau
216c0 6c 74 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69  lt[] = {\n"); li
216d0 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65  neno++;.  n = le
216e0 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 0a 20 20 6c  mp->nxstate;.  l
216f0 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b  emp->tablesize +
21700 3d 20 6e 2a 73 7a 41 63 74 69 6f 6e 54 79 70 65  = n*szActionType
21710 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
21720 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  <n; i++){.    st
21730 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
21740 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  [i];.    if( j==
21750 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
21760 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
21770 29 3b 0a 20 20 20 20 69 66 28 20 73 74 70 2d 3e  );.    if( stp->
21780 69 44 66 6c 74 52 65 64 75 63 65 3c 30 20 29 7b  iDfltReduce<0 ){
21790 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
217a0 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 65 6d  ut, " %4d,", lem
217b0 70 2d 3e 65 72 72 41 63 74 69 6f 6e 29 3b 0a 20  p->errAction);. 
217c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
217d0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
217e0 34 64 2c 22 2c 20 73 74 70 2d 3e 69 44 66 6c 74  4d,", stp->iDflt
217f0 52 65 64 75 63 65 20 2b 20 6c 65 6d 70 2d 3e 6d  Reduce + lemp->m
21800 69 6e 52 65 64 75 63 65 29 3b 0a 20 20 20 20 7d  inReduce);.    }
21810 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
21820 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
21830 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
21840 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
21850 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
21860 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
21870 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
21880 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
21890 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
218a0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
218b0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
218c0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
218d0 72 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f  rate the table o
218e0 66 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e  f fallback token
218f0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65  s..  */.  if( le
21900 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b  mp->has_fallback
21910 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 78 20 3d   ){.    int mx =
21920 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c   lemp->nterminal
21930 20 2d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28   - 1;.    while(
21940 20 6d 78 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73   mx>0 && lemp->s
21950 79 6d 62 6f 6c 73 5b 6d 78 5d 2d 3e 66 61 6c 6c  ymbols[mx]->fall
21960 62 61 63 6b 3d 3d 30 20 29 7b 20 6d 78 2d 2d 3b  back==0 ){ mx--;
21970 20 7d 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 61 62   }.    lemp->tab
21980 6c 65 73 69 7a 65 20 2b 3d 20 28 6d 78 2b 31 29  lesize += (mx+1)
21990 2a 73 7a 43 6f 64 65 54 79 70 65 3b 0a 20 20 20  *szCodeType;.   
219a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 3b   for(i=0; i<=mx;
219b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
219c0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70 20 3d 20  uct symbol *p = 
219d0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
219e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66  ;.      if( p->f
219f0 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20  allback==0 ){.  
21a00 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
21a10 74 2c 20 22 20 20 20 20 30 2c 20 20 2f 2a 20 25  t, "    0,  /* %
21a20 31 30 73 20 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a  10s => nothing *
21a30 2f 5c 6e 22 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a  /\n", p->name);.
21a40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21a50 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
21a60 2c 20 22 20 20 25 33 64 2c 20 20 2f 2a 20 25 31  , "  %3d,  /* %1
21a70 30 73 20 3d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20  0s => %s */\n", 
21a80 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64  p->fallback->ind
21a90 65 78 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ex,.          p-
21aa0 3e 6e 61 6d 65 2c 20 70 2d 3e 66 61 6c 6c 62 61  >name, p->fallba
21ab0 63 6b 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  ck->name);.     
21ac0 20 7d 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b   }.      lineno+
21ad0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74  +;.    }.  }.  t
21ae0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
21af0 61 6d 65 2c 20 69 6e 2c 20 6f 75 74 2c 20 26 6c  ame, in, out, &l
21b00 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
21b10 6e 65 72 61 74 65 20 61 20 74 61 62 6c 65 20 63  nerate a table c
21b20 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 79  ontaining the sy
21b30 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 6f 66 20 65  mbolic name of e
21b40 76 65 72 79 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f  very symbol.  */
21b50 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
21b60 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
21b70 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72  ){.    lemon_spr
21b80 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25 73 5c  intf(line,"\"%s\
21b90 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  ",",lemp->symbol
21ba0 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  s[i]->name);.   
21bb0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
21bc0 2f 2a 20 25 34 64 20 2a 2f 20 5c 22 25 73 5c 22  /* %4d */ \"%s\"
21bd0 2c 5c 6e 22 2c 69 2c 20 6c 65 6d 70 2d 3e 73 79  ,\n",i, lemp->sy
21be0 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b  mbols[i]->name);
21bf0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
21c00 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
21c10 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
21c20 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
21c30 65 72 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f  erate a table co
21c40 6e 74 61 69 6e 69 6e 67 20 61 20 74 65 78 74 20  ntaining a text 
21c50 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
21c60 72 69 62 65 73 20 65 76 65 72 79 0a 20 20 2a 2a  ribes every.  **
21c70 20 72 75 6c 65 20 69 6e 20 74 68 65 20 72 75 6c   rule in the rul
21c80 65 20 73 65 74 20 6f 66 20 74 68 65 20 67 72 61  e set of the gra
21c90 6d 6d 61 72 2e 20 20 54 68 69 73 20 69 6e 66 6f  mmar.  This info
21ca0 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 0a  rmation is used.
21cb0 20 20 2a 2a 20 77 68 65 6e 20 74 72 61 63 69 6e    ** when tracin
21cc0 67 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73  g REDUCE actions
21cd0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
21ce0 2c 20 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  , rp=lemp->rule;
21cf0 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
21d00 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  , i++){.    asse
21d10 72 74 28 20 72 70 2d 3e 69 52 75 6c 65 3d 3d 69  rt( rp->iRule==i
21d20 20 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   );.    fprintf(
21d30 6f 75 74 2c 22 20 2f 2a 20 25 33 64 20 2a 2f 20  out," /* %3d */ 
21d40 5c 22 22 2c 20 69 29 3b 0a 20 20 20 20 77 72 69  \"", i);.    wri
21d50 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20  teRuleText(out, 
21d60 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  rp);.    fprintf
21d70 28 6f 75 74 2c 22 5c 22 2c 5c 6e 22 29 3b 20 6c  (out,"\",\n"); l
21d80 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
21d90 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
21da0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
21db0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
21dc0 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
21dd0 78 65 63 75 74 65 73 20 65 76 65 72 79 20 74 69  xecutes every ti
21de0 6d 65 20 61 20 73 79 6d 62 6f 6c 20 69 73 20 70  me a symbol is p
21df0 6f 70 70 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20  opped from.  ** 
21e00 74 68 65 20 73 74 61 63 6b 20 77 68 69 6c 65 20  the stack while 
21e10 70 72 6f 63 65 73 73 69 6e 67 20 65 72 72 6f 72  processing error
21e20 73 20 6f 72 20 77 68 69 6c 65 20 64 65 73 74 72  s or while destr
21e30 6f 79 69 6e 67 20 74 68 65 20 70 61 72 73 65 72  oying the parser
21e40 2e 0a 20 20 2a 2a 20 28 49 6e 20 6f 74 68 65 72  ..  ** (In other
21e50 20 77 6f 72 64 73 2c 20 67 65 6e 65 72 61 74 65   words, generate
21e60 20 74 68 65 20 25 64 65 73 74 72 75 63 74 6f 72   the %destructor
21e70 20 61 63 74 69 6f 6e 73 29 0a 20 20 2a 2f 0a 20   actions).  */. 
21e80 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e   if( lemp->token
21e90 64 65 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  dest ){.    int 
21ea0 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 66 6f  once = 1;.    fo
21eb0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
21ec0 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
21ed0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
21ee0 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  l *sp = lemp->sy
21ef0 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20  mbols[i];.      
21f00 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d  if( sp==0 || sp-
21f10 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20  >type!=TERMINAL 
21f20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
21f30 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20    if( once ){.  
21f40 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
21f50 74 2c 20 22 20 20 20 20 20 20 2f 2a 20 54 45 52  t, "      /* TER
21f60 4d 49 4e 41 4c 20 44 65 73 74 72 75 63 74 6f 72  MINAL Destructor
21f70 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b   */\n"); lineno+
21f80 2b 3b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20  +;.        once 
21f90 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
21fa0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
21fb0 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20      case %d: /* 
21fc0 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e  %s */\n", sp->in
21fd0 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20  dex, sp->name); 
21fe0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
21ff0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c      for(i=0; i<l
22000 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 26 26 20  emp->nsymbol && 
22010 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
22020 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c  ->type!=TERMINAL
22030 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20  ; i++);.    if( 
22040 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  i<lemp->nsymbol 
22050 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65  ){.      emit_de
22060 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75  structor_code(ou
22070 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  t,lemp->symbols[
22080 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  i],lemp,&lineno)
22090 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
220a0 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b  out,"      break
220b0 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
220c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
220d0 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29   lemp->vardest )
220e0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  {.    struct sym
220f0 62 6f 6c 20 2a 64 66 6c 74 5f 73 70 20 3d 20 30  bol *dflt_sp = 0
22100 3b 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d  ;.    int once =
22110 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   1;.    for(i=0;
22120 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
22130 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
22140 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
22150 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
22160 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70  i];.      if( sp
22170 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d  ==0 || sp->type=
22180 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 0a 20 20 20  =TERMINAL ||.   
22190 20 20 20 20 20 20 20 73 70 2d 3e 69 6e 64 65 78         sp->index
221a0 3c 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72  <=0 || sp->destr
221b0 75 63 74 6f 72 21 3d 30 20 29 20 63 6f 6e 74 69  uctor!=0 ) conti
221c0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  nue;.      if( o
221d0 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66  nce ){.        f
221e0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20  printf(out, "   
221f0 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 4e 4f     /* Default NO
22200 4e 2d 54 45 52 4d 49 4e 41 4c 20 44 65 73 74 72  N-TERMINAL Destr
22210 75 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b 6c 69 6e  uctor */\n");lin
22220 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6f  eno++;.        o
22230 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nce = 0;.      }
22240 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
22250 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a  ut,"    case %d:
22260 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70   /* %s */\n", sp
22270 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d  ->index, sp->nam
22280 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
22290 20 20 20 20 64 66 6c 74 5f 73 70 20 3d 20 73 70      dflt_sp = sp
222a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
222b0 64 66 6c 74 5f 73 70 21 3d 30 20 29 7b 0a 20 20  dflt_sp!=0 ){.  
222c0 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63      emit_destruc
222d0 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 64 66 6c  tor_code(out,dfl
222e0 74 5f 73 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e  t_sp,lemp,&linen
222f0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  o);.    }.    fp
22300 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
22310 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
22320 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72  eno++;.  }.  for
22330 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
22340 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
22350 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
22360 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
22370 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73  ls[i];.    if( s
22380 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65  p==0 || sp->type
22390 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70  ==TERMINAL || sp
223a0 2d 3e 64 65 73 74 72 75 63 74 6f 72 3d 3d 30 20  ->destructor==0 
223b0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
223c0 69 66 28 20 73 70 2d 3e 64 65 73 74 4c 69 6e 65  if( sp->destLine
223d0 6e 6f 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  no<0 ) continue;
223e0 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 65 6d 69    /* Already emi
223f0 74 74 65 64 20 2a 2f 0a 20 20 20 20 66 70 72 69  tted */.    fpri
22400 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
22410 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e  e %d: /* %s */\n
22420 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70  ", sp->index, sp
22430 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ->name); lineno+
22440 2b 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69  +;..    /* Combi
22450 6e 65 20 64 75 70 6c 69 63 61 74 65 20 64 65 73  ne duplicate des
22460 74 72 75 63 74 6f 72 73 20 69 6e 74 6f 20 61 20  tructors into a 
22470 73 69 6e 67 6c 65 20 63 61 73 65 20 2a 2f 0a 20  single case */. 
22480 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c     for(j=i+1; j<
22490 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a  lemp->nsymbol; j
224a0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
224b0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 32 20 3d 20  t symbol *sp2 = 
224c0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d  lemp->symbols[j]
224d0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 32 20  ;.      if( sp2 
224e0 26 26 20 73 70 32 2d 3e 74 79 70 65 21 3d 54 45  && sp2->type!=TE
224f0 52 4d 49 4e 41 4c 20 26 26 20 73 70 32 2d 3e 64  RMINAL && sp2->d
22500 65 73 74 72 75 63 74 6f 72 0a 20 20 20 20 20 20  estructor.      
22510 20 20 20 20 26 26 20 73 70 32 2d 3e 64 74 6e 75      && sp2->dtnu
22520 6d 3d 3d 73 70 2d 3e 64 74 6e 75 6d 0a 20 20 20  m==sp->dtnum.   
22530 20 20 20 20 20 20 20 26 26 20 73 74 72 63 6d 70         && strcmp
22540 28 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 2c  (sp->destructor,
22550 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 29  sp2->destructor)
22560 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
22570 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
22580 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20   case %d: /* %s 
22590 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  */\n",.         
225a0 20 20 20 20 20 20 20 20 73 70 32 2d 3e 69 6e 64          sp2->ind
225b0 65 78 2c 20 73 70 32 2d 3e 6e 61 6d 65 29 3b 20  ex, sp2->name); 
225c0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
225d0 20 20 20 73 70 32 2d 3e 64 65 73 74 4c 69 6e 65     sp2->destLine
225e0 6e 6f 20 3d 20 2d 31 3b 20 20 2f 2a 20 41 76 6f  no = -1;  /* Avo
225f0 69 64 20 65 6d 69 74 74 69 6e 67 20 74 68 69 73  id emitting this
22600 20 64 65 73 74 72 75 63 74 6f 72 20 61 67 61 69   destructor agai
22610 6e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  n */.      }.   
22620 20 7d 0a 0a 20 20 20 20 65 6d 69 74 5f 64 65 73   }..    emit_des
22630 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74  tructor_code(out
22640 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
22650 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b  ],lemp,&lineno);
22660 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
22670 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e  ,"      break;\n
22680 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
22690 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
226a0 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
226b0 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
226c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
226d0 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65  ich executes whe
226e0 6e 65 76 65 72 20 74 68 65 20 70 61 72 73 65 72  never the parser
226f0 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 73   stack overflows
22700 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
22710 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
22720 6f 76 65 72 66 6c 6f 77 2c 26 6c 69 6e 65 6e 6f  overflow,&lineno
22730 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
22740 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
22750 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
22760 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 61   Generate the ta
22770 62 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e 66 6f  ble of rule info
22780 72 6d 61 74 69 6f 6e 0a 20 20 2a 2a 0a 20 20 2a  rmation.  **.  *
22790 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 63 6f 64  * Note: This cod
227a0 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
227b0 20 66 61 63 74 20 74 68 61 74 20 72 75 6c 65 73   fact that rules
227c0 20 61 72 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a   are number.  **
227d0 20 73 65 71 75 65 6e 74 75 61 6c 6c 79 20 62 65   sequentually be
227e0 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 2e 0a  ginning with 0..
227f0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
22800 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
22810 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 2c 20  p; rp=rp->next, 
22820 69 2b 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  i++){.    fprint
22830 66 28 6f 75 74 2c 22 20 20 7b 20 25 34 64 2c 20  f(out,"  { %4d, 
22840 25 34 64 20 7d 2c 20 2f 2a 20 28 25 64 29 20 22  %4d }, /* (%d) "
22850 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c  ,rp->lhs->index,
22860 2d 72 70 2d 3e 6e 72 68 73 2c 69 29 3b 0a 20 20  -rp->nrhs,i);.  
22870 20 20 72 75 6c 65 5f 70 72 69 6e 74 28 6f 75 74    rule_print(out
22880 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e  , rp);.    fprin
22890 74 66 28 6f 75 74 2c 22 20 2a 2f 5c 6e 22 29 3b  tf(out," */\n");
228a0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
228b0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
228c0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
228d0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
228e0 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
228f0 20 65 78 65 63 75 74 69 6f 6e 20 64 75 72 69 6e   execution durin
22900 67 20 65 61 63 68 20 52 45 44 55 43 45 20 61 63  g each REDUCE ac
22910 74 69 6f 6e 20 2a 2f 0a 20 20 69 20 3d 20 30 3b  tion */.  i = 0;
22920 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
22930 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
22940 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 20 2b 3d  >next){.    i +=
22950 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28   translate_code(
22960 6c 65 6d 70 2c 20 72 70 29 3b 0a 20 20 7d 0a 20  lemp, rp);.  }. 
22970 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20 66 70   if( i ){.    fp
22980 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
22990 20 20 20 59 59 4d 49 4e 4f 52 54 59 50 45 20 79     YYMINORTYPE y
229a0 79 6c 68 73 6d 69 6e 6f 72 3b 5c 6e 22 29 3b 20  ylhsminor;\n"); 
229b0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
229c0 2f 2a 20 46 69 72 73 74 20 6f 75 74 70 75 74 20  /* First output 
229d0 72 75 6c 65 73 20 6f 74 68 65 72 20 74 68 61 6e  rules other than
229e0 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20 72 75   the default: ru
229f0 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c  le */.  for(rp=l
22a00 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
22a10 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
22a20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
22a30 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
22a40 20 2f 2a 20 4f 74 68 65 72 20 72 75 6c 65 73 20   /* Other rules 
22a50 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 61 63  with the same ac
22a60 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tion */.    if( 
22a70 72 70 2d 3e 63 6f 64 65 45 6d 69 74 74 65 64 20  rp->codeEmitted 
22a80 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
22a90 69 66 28 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 29  if( rp->noCode )
22aa0 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 43 20  {.      /* No C 
22ab0 63 6f 64 65 20 61 63 74 69 6f 6e 73 2c 20 73 6f  code actions, so
22ac0 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 70 61   this will be pa
22ad0 72 74 20 6f 66 20 74 68 65 20 22 64 65 66 61 75  rt of the "defau
22ae0 6c 74 3a 22 20 72 75 6c 65 20 2a 2f 0a 20 20 20  lt:" rule */.   
22af0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
22b00 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f   }.    fprintf(o
22b10 75 74 2c 22 20 20 20 20 20 20 63 61 73 65 20 25  ut,"      case %
22b20 64 3a 20 2f 2a 20 22 2c 20 72 70 2d 3e 69 52 75  d: /* ", rp->iRu
22b30 6c 65 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75  le);.    writeRu
22b40 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b  leText(out, rp);
22b50 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
22b60 2c 20 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65  , " */\n"); line
22b70 6e 6f 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 72 70  no++;.    for(rp
22b80 32 3d 72 70 2d 3e 6e 65 78 74 3b 20 72 70 32 3b  2=rp->next; rp2;
22b90 20 72 70 32 3d 72 70 32 2d 3e 6e 65 78 74 29 7b   rp2=rp2->next){
22ba0 0a 20 20 20 20 20 20 69 66 28 20 72 70 32 2d 3e  .      if( rp2->
22bb0 63 6f 64 65 3d 3d 72 70 2d 3e 63 6f 64 65 20 26  code==rp->code &
22bc0 26 20 72 70 32 2d 3e 63 6f 64 65 50 72 65 66 69  & rp2->codePrefi
22bd0 78 3d 3d 72 70 2d 3e 63 6f 64 65 50 72 65 66 69  x==rp->codePrefi
22be0 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  x.             &
22bf0 26 20 72 70 32 2d 3e 63 6f 64 65 53 75 66 66 69  & rp2->codeSuffi
22c00 78 3d 3d 72 70 2d 3e 63 6f 64 65 53 75 66 66 69  x==rp->codeSuffi
22c10 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  x ){.        fpr
22c20 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
22c30 63 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72  case %d: /* ", r
22c40 70 32 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20  p2->iRule);.    
22c50 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65 78      writeRuleTex
22c60 74 28 6f 75 74 2c 20 72 70 32 29 3b 0a 20 20 20  t(out, rp2);.   
22c70 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
22c80 2c 22 20 2a 2f 20 79 79 74 65 73 74 63 61 73 65  ," */ yytestcase
22c90 28 79 79 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c  (yyruleno==%d);\
22ca0 6e 22 2c 20 72 70 32 2d 3e 69 52 75 6c 65 29 3b  n", rp2->iRule);
22cb0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
22cc0 20 20 20 72 70 32 2d 3e 63 6f 64 65 45 6d 69 74     rp2->codeEmit
22cd0 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ted = 1;.      }
22ce0 0a 20 20 20 20 7d 0a 20 20 20 20 65 6d 69 74 5f  .    }.    emit_
22cf0 63 6f 64 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70  code(out,rp,lemp
22d00 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66  ,&lineno);.    f
22d10 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
22d20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20      break;\n"); 
22d30 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 72 70  lineno++;.    rp
22d40 2d 3e 63 6f 64 65 45 6d 69 74 74 65 64 20 3d 20  ->codeEmitted = 
22d50 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 6e 61  1;.  }.  /* Fina
22d60 6c 6c 79 2c 20 6f 75 74 70 75 74 20 74 68 65 20  lly, output the 
22d70 64 65 66 61 75 6c 74 3a 20 72 75 6c 65 2e 20 20  default: rule.  
22d80 57 65 20 63 68 6f 6f 73 65 20 61 73 20 74 68 65  We choose as the
22d90 20 64 65 66 61 75 6c 74 3a 20 61 6c 6c 0a 20 20   default: all.  
22da0 2a 2a 20 65 6d 70 74 79 20 61 63 74 69 6f 6e 73  ** empty actions
22db0 2e 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  . */.  fprintf(o
22dc0 75 74 2c 22 20 20 20 20 20 20 64 65 66 61 75 6c  ut,"      defaul
22dd0 74 3a 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  t:\n"); lineno++
22de0 3b 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  ;.  for(rp=lemp-
22df0 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
22e00 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  ->next){.    if(
22e10 20 72 70 2d 3e 63 6f 64 65 45 6d 69 74 74 65 64   rp->codeEmitted
22e20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22e30 20 61 73 73 65 72 74 28 20 72 70 2d 3e 6e 6f 43   assert( rp->noC
22e40 6f 64 65 20 29 3b 0a 20 20 20 20 66 70 72 69 6e  ode );.    fprin
22e50 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 2f 2a  tf(out,"      /*
22e60 20 28 25 64 29 20 22 2c 20 72 70 2d 3e 69 52 75   (%d) ", rp->iRu
22e70 6c 65 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75  le);.    writeRu
22e80 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b  leText(out, rp);
22e90 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 64 6f 65  .    if( rp->doe
22ea0 73 52 65 64 75 63 65 20 29 7b 0a 20 20 20 20 20  sReduce ){.     
22eb0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
22ec0 2a 2f 20 79 79 74 65 73 74 63 61 73 65 28 79 79  */ yytestcase(yy
22ed0 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c  ruleno==%d);\n",
22ee0 20 72 70 2d 3e 69 52 75 6c 65 29 3b 20 6c 69 6e   rp->iRule); lin
22ef0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  eno++;.    }else
22f00 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
22f10 6f 75 74 2c 20 22 20 28 4f 50 54 49 4d 49 5a 45  out, " (OPTIMIZE
22f20 44 20 4f 55 54 29 20 2a 2f 20 61 73 73 65 72 74  D OUT) */ assert
22f30 28 79 79 72 75 6c 65 6e 6f 21 3d 25 64 29 3b 5c  (yyruleno!=%d);\
22f40 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
22f50 20 20 72 70 2d 3e 69 52 75 6c 65 29 3b 20 6c 69    rp->iRule); li
22f60 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
22f70 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
22f80 22 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 5c  "        break;\
22f90 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
22fa0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
22fb0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
22fc0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
22fd0 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
22fe0 20 65 78 65 63 75 74 65 73 20 69 66 20 61 20 70   executes if a p
22ff0 61 72 73 65 20 66 61 69 6c 73 20 2a 2f 0a 20 20  arse fails */.  
23000 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
23010 65 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75 72  emp,lemp->failur
23020 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70  e,&lineno);.  tp
23030 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
23040 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
23050 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
23060 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
23070 65 63 75 74 65 73 20 77 68 65 6e 20 61 20 73 79  ecutes when a sy
23080 6e 74 61 78 20 65 72 72 6f 72 20 6f 63 63 75 72  ntax error occur
23090 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  s */.  tplt_prin
230a0 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
230b0 3e 65 72 72 6f 72 2c 26 6c 69 6e 65 6e 6f 29 3b  >error,&lineno);
230c0 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
230d0 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
230e0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
230f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
23100 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e  ch executes when
23110 20 74 68 65 20 70 61 72 73 65 72 20 61 63 63 65   the parser acce
23120 70 74 73 20 69 74 73 20 69 6e 70 75 74 20 2a 2f  pts its input */
23130 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
23140 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61 63 63  t,lemp,lemp->acc
23150 65 70 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  ept,&lineno);.  
23160 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
23170 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
23180 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65  eno);..  /* Appe
23190 6e 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e 20  nd any addition 
231a0 63 6f 64 65 20 74 68 65 20 75 73 65 72 20 64 65  code the user de
231b0 73 69 72 65 73 20 2a 2f 0a 20 20 74 70 6c 74 5f  sires */.  tplt_
231c0 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
231d0 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65 2c 26  emp->extracode,&
231e0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63 6c 6f  lineno);..  fclo
231f0 73 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65  se(in);.  fclose
23200 28 6f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  (out);.  return;
23210 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
23220 61 20 68 65 61 64 65 72 20 66 69 6c 65 20 66 6f  a header file fo
23230 72 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a  r the parser */.
23240 76 6f 69 64 20 52 65 70 6f 72 74 48 65 61 64 65  void ReportHeade
23250 72 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  r(struct lemon *
23260 6c 65 6d 70 29 0a 7b 0a 20 20 46 49 4c 45 20 2a  lemp).{.  FILE *
23270 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 6f 6e 73  out, *in;.  cons
23280 74 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a  t char *prefix;.
23290 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45    char line[LINE
232a0 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70 61  SIZE];.  char pa
232b0 74 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d 3b  ttern[LINESIZE];
232c0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
232d0 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66   lemp->tokenpref
232e0 69 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65  ix ) prefix = le
232f0 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b  mp->tokenprefix;
23300 0a 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20  .  else         
23310 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69             prefi
23320 78 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d 20 66  x = "";.  in = f
23330 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e  ile_open(lemp,".
23340 68 22 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20  h","rb");.  if( 
23350 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65  in ){.    int ne
23360 78 74 43 68 61 72 3b 0a 20 20 20 20 66 6f 72 28  xtChar;.    for(
23370 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=1; i<lemp->nte
23380 72 6d 69 6e 61 6c 20 26 26 20 66 67 65 74 73 28  rminal && fgets(
23390 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e  line,LINESIZE,in
233a0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6c  ); i++){.      l
233b0 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 70 61 74  emon_sprintf(pat
233c0 74 65 72 6e 2c 22 23 64 65 66 69 6e 65 20 25 73  tern,"#define %s
233d0 25 2d 33 30 73 20 25 33 64 5c 6e 22 2c 0a 20 20  %-30s %3d\n",.  
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233f0 20 20 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73    prefix,lemp->s
23400 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c  ymbols[i]->name,
23410 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  i);.      if( st
23420 72 63 6d 70 28 6c 69 6e 65 2c 70 61 74 74 65 72  rcmp(line,patter
23430 6e 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  n) ) break;.    
23440 7d 0a 20 20 20 20 6e 65 78 74 43 68 61 72 20 3d  }.    nextChar =
23450 20 66 67 65 74 63 28 69 6e 29 3b 0a 20 20 20 20   fgetc(in);.    
23460 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
23470 69 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65  if( i==lemp->nte
23480 72 6d 69 6e 61 6c 20 26 26 20 6e 65 78 74 43 68  rminal && nextCh
23490 61 72 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20  ar==EOF ){.     
234a0 20 2f 2a 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e   /* No change in
234b0 20 74 68 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27   the file.  Don'
234c0 74 20 72 65 77 72 69 74 65 20 69 74 2e 20 2a 2f  t rewrite it. */
234d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
234e0 20 20 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d     }.  }.  out =
234f0 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c   file_open(lemp,
23500 22 2e 68 22 2c 22 77 62 22 29 3b 0a 20 20 69 66  ".h","wb");.  if
23510 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 66 6f 72  ( out ){.    for
23520 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74  (i=1; i<lemp->nt
23530 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20  erminal; i++){. 
23540 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
23550 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30  ,"#define %s%-30
23560 73 20 25 33 64 5c 6e 22 2c 70 72 65 66 69 78 2c  s %3d\n",prefix,
23570 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
23580 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d  ->name,i);.    }
23590 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29  .    fclose(out)
235a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  ;.  }.  return;.
235b0 7d 0a 0a 2f 2a 20 52 65 64 75 63 65 20 74 68 65  }../* Reduce the
235c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63 74   size of the act
235d0 69 6f 6e 20 74 61 62 6c 65 73 2c 20 69 66 20 70  ion tables, if p
235e0 6f 73 73 69 62 6c 65 2c 20 62 79 20 6d 61 6b 69  ossible, by maki
235f0 6e 67 20 75 73 65 0a 2a 2a 20 6f 66 20 64 65 66  ng use.** of def
23600 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  aults..**.** In 
23610 74 68 69 73 20 76 65 72 73 69 6f 6e 2c 20 77 65  this version, we
23620 20 74 61 6b 65 20 74 68 65 20 6d 6f 73 74 20 66   take the most f
23630 72 65 71 75 65 6e 74 20 52 45 44 55 43 45 20 61  requent REDUCE a
23640 63 74 69 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a  ction and make.*
23650 2a 20 69 74 20 74 68 65 20 64 65 66 61 75 6c 74  * it the default
23660 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 72 65  .  Except, there
23670 20 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 69   is no default i
23680 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74  f the wildcard t
23690 6f 6b 65 6e 0a 2a 2a 20 69 73 20 61 20 70 6f 73  oken.** is a pos
236a0 73 69 62 6c 65 20 6c 6f 6f 6b 2d 61 68 65 61 64  sible look-ahead
236b0 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70 72 65  ..*/.void Compre
236c0 73 73 54 61 62 6c 65 73 28 73 74 72 75 63 74 20  ssTables(struct 
236d0 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
236e0 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
236f0 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74  tp;.  struct act
23700 69 6f 6e 20 2a 61 70 2c 20 2a 61 70 32 2c 20 2a  ion *ap, *ap2, *
23710 6e 65 78 74 61 70 3b 0a 20 20 73 74 72 75 63 74  nextap;.  struct
23720 20 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c   rule *rp, *rp2,
23730 20 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e   *rbest;.  int n
23740 62 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69  best, n;.  int i
23750 3b 0a 20 20 69 6e 74 20 75 73 65 73 57 69 6c 64  ;.  int usesWild
23760 63 61 72 64 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  card;..  for(i=0
23770 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
23780 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
23790 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
237a0 5d 3b 0a 20 20 20 20 6e 62 65 73 74 20 3d 20 30  ];.    nbest = 0
237b0 3b 0a 20 20 20 20 72 62 65 73 74 20 3d 20 30 3b  ;.    rbest = 0;
237c0 0a 20 20 20 20 75 73 65 73 57 69 6c 64 63 61 72  .    usesWildcar
237d0 64 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28  d = 0;..    for(
237e0 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
237f0 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
23800 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
23810 3d 3d 53 48 49 46 54 20 26 26 20 61 70 2d 3e 73  ==SHIFT && ap->s
23820 70 3d 3d 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72  p==lemp->wildcar
23830 64 20 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65  d ){.        use
23840 73 57 69 6c 64 63 61 72 64 20 3d 20 31 3b 0a 20  sWildcard = 1;. 
23850 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23860 20 61 70 2d 3e 74 79 70 65 21 3d 52 45 44 55 43   ap->type!=REDUC
23870 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  E ) continue;.  
23880 20 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72      rp = ap->x.r
23890 70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d  p;.      if( rp-
238a0 3e 6c 68 73 53 74 61 72 74 20 29 20 63 6f 6e 74  >lhsStart ) cont
238b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
238c0 72 70 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74  rp==rbest ) cont
238d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20  inue;.      n = 
238e0 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 32  1;.      for(ap2
238f0 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20  =ap->next; ap2; 
23900 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a  ap2=ap2->next){.
23910 20 20 20 20 20 20 20 20 69 66 28 20 61 70 32 2d          if( ap2-
23920 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20 29 20  >type!=REDUCE ) 
23930 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23940 20 20 72 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72    rp2 = ap2->x.r
23950 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  p;.        if( r
23960 70 32 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74  p2==rbest ) cont
23970 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
23980 28 20 72 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b  ( rp2==rp ) n++;
23990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
239a0 66 28 20 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20  f( n>nbest ){.  
239b0 20 20 20 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b        nbest = n;
239c0 0a 20 20 20 20 20 20 20 20 72 62 65 73 74 20 3d  .        rbest =
239d0 20 72 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rp;.      }.   
239e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f   }..    /* Do no
239f0 74 20 6d 61 6b 65 20 61 20 64 65 66 61 75 6c 74  t make a default
23a00 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   if the number o
23a10 66 20 72 75 6c 65 73 20 74 6f 20 64 65 66 61 75  f rules to defau
23a20 6c 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  lt.    ** is not
23a30 20 61 74 20 6c 65 61 73 74 20 31 20 6f 72 20 69   at least 1 or i
23a40 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74  f the wildcard t
23a50 6f 6b 65 6e 20 69 73 20 61 20 70 6f 73 73 69 62  oken is a possib
23a60 6c 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 6b 61 68  le.    ** lookah
23a70 65 61 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ead..    */.    
23a80 69 66 28 20 6e 62 65 73 74 3c 31 20 7c 7c 20 75  if( nbest<1 || u
23a90 73 65 73 57 69 6c 64 63 61 72 64 20 29 20 63 6f  sesWildcard ) co
23aa0 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a  ntinue;...    /*
23ab0 20 43 6f 6d 62 69 6e 65 20 6d 61 74 63 68 69 6e   Combine matchin
23ac0 67 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73  g REDUCE actions
23ad0 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 64   into a single d
23ae0 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f  efault */.    fo
23af0 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
23b00 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
23b10 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
23b20 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70  pe==REDUCE && ap
23b30 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20  ->x.rp==rbest ) 
23b40 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
23b50 20 61 73 73 65 72 74 28 20 61 70 20 29 3b 0a 20   assert( ap );. 
23b60 20 20 20 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62     ap->sp = Symb
23b70 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74  ol_new("{default
23b80 7d 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  }");.    for(ap=
23b90 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70  ap->next; ap; ap
23ba0 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
23bb0 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
23bc0 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e  REDUCE && ap->x.
23bd0 72 70 3d 3d 72 62 65 73 74 20 29 20 61 70 2d 3e  rp==rbest ) ap->
23be0 74 79 70 65 20 3d 20 4e 4f 54 5f 55 53 45 44 3b  type = NOT_USED;
23bf0 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 70 2d 3e  .    }.    stp->
23c00 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74  ap = Action_sort
23c10 28 73 74 70 2d 3e 61 70 29 3b 0a 0a 20 20 20 20  (stp->ap);..    
23c20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
23c30 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
23c40 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  {.      if( ap->
23c50 74 79 70 65 3d 3d 53 48 49 46 54 20 29 20 62 72  type==SHIFT ) br
23c60 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61  eak;.      if( a
23c70 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  p->type==REDUCE 
23c80 26 26 20 61 70 2d 3e 78 2e 72 70 21 3d 72 62 65  && ap->x.rp!=rbe
23c90 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  st ) break;.    
23ca0 7d 0a 20 20 20 20 69 66 28 20 61 70 3d 3d 30 20  }.    if( ap==0 
23cb0 29 7b 0a 20 20 20 20 20 20 73 74 70 2d 3e 61 75  ){.      stp->au
23cc0 74 6f 52 65 64 75 63 65 20 3d 20 31 3b 0a 20 20  toReduce = 1;.  
23cd0 20 20 20 20 73 74 70 2d 3e 70 44 66 6c 74 52 65      stp->pDfltRe
23ce0 64 75 63 65 20 3d 20 72 62 65 73 74 3b 0a 20 20  duce = rbest;.  
23cf0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
23d00 6b 65 20 61 20 73 65 63 6f 6e 64 20 70 61 73 73  ke a second pass
23d10 20 6f 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73   over all states
23d20 20 61 6e 64 20 61 63 74 69 6f 6e 73 2e 20 20 43   and actions.  C
23d30 6f 6e 76 65 72 74 0a 20 20 2a 2a 20 65 76 65 72  onvert.  ** ever
23d40 79 20 61 63 74 69 6f 6e 20 74 68 61 74 20 69 73  y action that is
23d50 20 61 20 53 48 49 46 54 20 74 6f 20 61 6e 20 61   a SHIFT to an a
23d60 75 74 6f 52 65 64 75 63 65 20 73 74 61 74 65 20  utoReduce state 
23d70 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 53 48 49 46  into.  ** a SHIF
23d80 54 52 45 44 55 43 45 20 61 63 74 69 6f 6e 2e 0a  TREDUCE action..
23d90 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
23da0 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
23db0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
23dc0 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
23dd0 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
23de0 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
23df0 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 73 74 72  next){.      str
23e00 75 63 74 20 73 74 61 74 65 20 2a 70 4e 65 78 74  uct state *pNext
23e10 53 74 61 74 65 3b 0a 20 20 20 20 20 20 69 66 28  State;.      if(
23e20 20 61 70 2d 3e 74 79 70 65 21 3d 53 48 49 46 54   ap->type!=SHIFT
23e30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23e40 20 20 20 70 4e 65 78 74 53 74 61 74 65 20 3d 20     pNextState = 
23e50 61 70 2d 3e 78 2e 73 74 70 3b 0a 20 20 20 20 20  ap->x.stp;.     
23e60 20 69 66 28 20 70 4e 65 78 74 53 74 61 74 65 2d   if( pNextState-
23e70 3e 61 75 74 6f 52 65 64 75 63 65 20 26 26 20 70  >autoReduce && p
23e80 4e 65 78 74 53 74 61 74 65 2d 3e 70 44 66 6c 74  NextState->pDflt
23e90 52 65 64 75 63 65 21 3d 30 20 29 7b 0a 20 20 20  Reduce!=0 ){.   
23ea0 20 20 20 20 20 61 70 2d 3e 74 79 70 65 20 3d 20       ap->type = 
23eb0 53 48 49 46 54 52 45 44 55 43 45 3b 0a 20 20 20  SHIFTREDUCE;.   
23ec0 20 20 20 20 20 61 70 2d 3e 78 2e 72 70 20 3d 20       ap->x.rp = 
23ed0 70 4e 65 78 74 53 74 61 74 65 2d 3e 70 44 66 6c  pNextState->pDfl
23ee0 74 52 65 64 75 63 65 3b 0a 20 20 20 20 20 20 7d  tReduce;.      }
23ef0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
23f00 20 49 66 20 61 20 53 48 49 46 54 52 45 44 55 43   If a SHIFTREDUC
23f10 45 20 61 63 74 69 6f 6e 20 73 70 65 63 69 66 69  E action specifi
23f20 65 73 20 61 20 72 75 6c 65 20 74 68 61 74 20 68  es a rule that h
23f30 61 73 20 61 20 73 69 6e 67 6c 65 20 52 48 53 20  as a single RHS 
23f40 74 65 72 6d 0a 20 20 2a 2a 20 28 6d 65 61 6e 69  term.  ** (meani
23f50 6e 67 20 74 68 61 74 20 74 68 65 20 53 48 49 46  ng that the SHIF
23f60 54 52 45 44 55 43 45 20 77 69 6c 6c 20 6c 61 6e  TREDUCE will lan
23f70 64 20 62 61 63 6b 20 69 6e 20 74 68 65 20 73 74  d back in the st
23f80 61 74 65 20 77 68 65 72 65 20 69 74 0a 20 20 2a  ate where it.  *
23f90 2a 20 73 74 61 72 74 65 64 29 20 61 6e 64 20 69  * started) and i
23fa0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 43 2d  f there is no C-
23fb0 63 6f 64 65 20 61 73 73 6f 63 69 61 74 65 64 20  code associated 
23fc0 77 69 74 68 20 74 68 65 20 72 65 64 75 63 65 20  with the reduce 
23fd0 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65  action,.  ** the
23fe0 6e 20 77 65 20 63 61 6e 20 67 6f 20 61 68 65 61  n we can go ahea
23ff0 64 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68  d and convert th
24000 65 20 61 63 74 69 6f 6e 20 74 6f 20 62 65 20 74  e action to be t
24010 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 20  he same as the. 
24020 20 2a 2a 20 61 63 74 69 6f 6e 20 66 6f 72 20 74   ** action for t
24030 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 72 75  he RHS of the ru
24040 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  le..  */.  for(i
24050 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
24060 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
24070 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
24080 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  [i];.    for(ap=
24090 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
240a0 6e 65 78 74 61 70 29 7b 0a 20 20 20 20 20 20 6e  nextap){.      n
240b0 65 78 74 61 70 20 3d 20 61 70 2d 3e 6e 65 78 74  extap = ap->next
240c0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  ;.      if( ap->
240d0 74 79 70 65 21 3d 53 48 49 46 54 52 45 44 55 43  type!=SHIFTREDUC
240e0 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  E ) continue;.  
240f0 20 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72      rp = ap->x.r
24100 70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d  p;.      if( rp-
24110 3e 6e 6f 43 6f 64 65 3d 3d 30 20 29 20 63 6f 6e  >noCode==0 ) con
24120 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
24130 20 72 70 2d 3e 6e 72 68 73 21 3d 31 20 29 20 63   rp->nrhs!=1 ) c
24140 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 20 31 0a 20  ontinue;.#if 1. 
24150 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 70 70       /* Only app
24160 6c 79 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  ly this optimiza
24170 74 69 6f 6e 20 74 6f 20 6e 6f 6e 2d 74 65 72 6d  tion to non-term
24180 69 6e 61 6c 73 2e 20 20 49 74 20 77 6f 75 6c 64  inals.  It would
24190 20 62 65 20 4f 4b 20 74 6f 0a 20 20 20 20 20 20   be OK to.      
241a0 2a 2a 20 61 70 70 6c 79 20 69 74 20 74 6f 20 74  ** apply it to t
241b0 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20  erminal symbols 
241c0 74 6f 6f 2c 20 62 75 74 20 74 68 61 74 20 6d 61  too, but that ma
241d0 6b 65 73 20 74 68 65 20 70 61 72 73 65 72 20 74  kes the parser t
241e0 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 6c  ables.      ** l
241f0 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
24200 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
24210 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  x<lemp->ntermina
24220 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65  l ) continue;.#e
24230 6e 64 69 66 0a 20 20 20 20 20 20 2f 2a 20 49 66  ndif.      /* If
24240 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
24250 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
24260 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
24270 63 61 6e 20 62 65 20 61 70 70 6c 69 65 64 20 2a  can be applied *
24280 2f 0a 20 20 20 20 20 20 6e 65 78 74 61 70 20 3d  /.      nextap =
24290 20 61 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 61   ap;.      for(a
242a0 70 32 3d 73 74 70 2d 3e 61 70 3b 20 61 70 32 20  p2=stp->ap; ap2 
242b0 26 26 20 28 61 70 32 3d 3d 61 70 20 7c 7c 20 61  && (ap2==ap || a
242c0 70 32 2d 3e 73 70 21 3d 72 70 2d 3e 6c 68 73 29  p2->sp!=rp->lhs)
242d0 3b 20 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29  ; ap2=ap2->next)
242e0 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  {}.      assert(
242f0 20 61 70 32 21 3d 30 20 29 3b 0a 20 20 20 20 20   ap2!=0 );.     
24300 20 61 70 2d 3e 73 70 4f 70 74 20 3d 20 61 70 32   ap->spOpt = ap2
24310 2d 3e 73 70 3b 0a 20 20 20 20 20 20 61 70 2d 3e  ->sp;.      ap->
24320 74 79 70 65 20 3d 20 61 70 32 2d 3e 74 79 70 65  type = ap2->type
24330 3b 0a 20 20 20 20 20 20 61 70 2d 3e 78 20 3d 20  ;.      ap->x = 
24340 61 70 32 2d 3e 78 3b 0a 20 20 20 20 7d 0a 20 20  ap2->x;.    }.  
24350 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  }.}.../*.** Comp
24360 61 72 65 20 74 77 6f 20 73 74 61 74 65 73 20 66  are two states f
24370 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f  or sorting purpo
24380 73 65 73 2e 20 20 54 68 65 20 73 6d 61 6c 6c 65  ses.  The smalle
24390 72 20 73 74 61 74 65 20 69 73 20 74 68 65 0a 2a  r state is the.*
243a0 2a 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d  * one with the m
243b0 6f 73 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  ost non-terminal
243c0 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68   actions.  If th
243d0 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
243e0 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f   number.** of no
243f0 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f  n-terminal actio
24400 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 73 6d 61  ns, then the sma
24410 6c 6c 65 72 20 69 73 20 74 68 65 20 6f 6e 65 20  ller is the one 
24420 77 69 74 68 20 74 68 65 20 6d 6f 73 74 0a 2a 2a  with the most.**
24430 20 74 6f 6b 65 6e 20 61 63 74 69 6f 6e 73 2e 0a   token actions..
24440 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74  */.static int st
24450 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65  ateResortCompare
24460 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20  (const void *a, 
24470 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a  const void *b){.
24480 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
24490 74 61 74 65 20 2a 70 41 20 3d 20 2a 28 63 6f 6e  tate *pA = *(con
244a0 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65 2a  st struct state*
244b0 2a 29 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72  *)a;.  const str
244c0 75 63 74 20 73 74 61 74 65 20 2a 70 42 20 3d 20  uct state *pB = 
244d0 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73  *(const struct s
244e0 74 61 74 65 2a 2a 29 62 3b 0a 20 20 69 6e 74 20  tate**)b;.  int 
244f0 6e 3b 0a 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e  n;..  n = pB->nN
24500 74 41 63 74 20 2d 20 70 41 2d 3e 6e 4e 74 41 63  tAct - pA->nNtAc
24510 74 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  t;.  if( n==0 ){
24520 0a 20 20 20 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b  .    n = pB->nTk
24530 6e 41 63 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41  nAct - pA->nTknA
24540 63 74 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30  ct;.    if( n==0
24550 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 42   ){.      n = pB
24560 2d 3e 73 74 61 74 65 6e 75 6d 20 2d 20 70 41 2d  ->statenum - pA-
24570 3e 73 74 61 74 65 6e 75 6d 3b 0a 20 20 20 20 7d  >statenum;.    }
24580 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
24590 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
245a0 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e  n;.}.../*.** Ren
245b0 75 6d 62 65 72 20 61 6e 64 20 72 65 73 6f 72 74  umber and resort
245c0 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20   states so that 
245d0 73 74 61 74 65 73 20 77 69 74 68 20 66 65 77 65  states with fewe
245e0 72 20 63 68 6f 69 63 65 73 0a 2a 2a 20 6f 63 63  r choices.** occ
245f0 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ur at the end.  
24600 45 78 63 65 70 74 2c 20 6b 65 65 70 20 73 74 61  Except, keep sta
24610 74 65 20 30 20 61 73 20 74 68 65 20 66 69 72 73  te 0 as the firs
24620 74 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64  t state..*/.void
24630 20 52 65 73 6f 72 74 53 74 61 74 65 73 28 73 74   ResortStates(st
24640 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
24650 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  ).{.  int i;.  s
24660 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
24670 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
24680 6e 20 2a 61 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  n *ap;..  for(i=
24690 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
246a0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
246b0 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
246c0 69 5d 3b 0a 20 20 20 20 73 74 70 2d 3e 6e 54 6b  i];.    stp->nTk
246d0 6e 41 63 74 20 3d 20 73 74 70 2d 3e 6e 4e 74 41  nAct = stp->nNtA
246e0 63 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 70 2d  ct = 0;.    stp-
246f0 3e 69 44 66 6c 74 52 65 64 75 63 65 20 3d 20 2d  >iDfltReduce = -
24700 31 3b 20 2f 2a 20 49 6e 69 74 20 64 66 6c 74 20  1; /* Init dflt 
24710 61 63 74 69 6f 6e 20 74 6f 20 22 73 79 6e 74 61  action to "synta
24720 78 20 65 72 72 6f 72 22 20 2a 2f 0a 20 20 20 20  x error" */.    
24730 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20  stp->iTknOfst = 
24740 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 73  NO_OFFSET;.    s
24750 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f  tp->iNtOfst = NO
24760 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 66 6f 72  _OFFSET;.    for
24770 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
24780 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
24790 20 20 20 20 20 69 6e 74 20 69 41 63 74 69 6f 6e       int iAction
247a0 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f   = compute_actio
247b0 6e 28 6c 65 6d 70 2c 61 70 29 3b 0a 20 20 20 20  n(lemp,ap);.    
247c0 20 20 69 66 28 20 69 41 63 74 69 6f 6e 3e 3d 30    if( iAction>=0
247d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
247e0 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65  ap->sp->index<le
247f0 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b  mp->nterminal ){
24800 0a 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e  .          stp->
24810 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20 20 20 20 20  nTknAct++;.     
24820 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70 2d     }else if( ap-
24830 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d  >sp->index<lemp-
24840 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20  >nsymbol ){.    
24850 20 20 20 20 20 20 73 74 70 2d 3e 6e 4e 74 41 63        stp->nNtAc
24860 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t++;.        }el
24870 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
24880 73 65 72 74 28 20 73 74 70 2d 3e 61 75 74 6f 52  sert( stp->autoR
24890 65 64 75 63 65 3d 3d 30 20 7c 7c 20 73 74 70 2d  educe==0 || stp-
248a0 3e 70 44 66 6c 74 52 65 64 75 63 65 3d 3d 61 70  >pDfltReduce==ap
248b0 2d 3e 78 2e 72 70 20 29 3b 0a 20 20 20 20 20 20  ->x.rp );.      
248c0 20 20 20 20 73 74 70 2d 3e 69 44 66 6c 74 52 65      stp->iDfltRe
248d0 64 75 63 65 20 3d 20 69 41 63 74 69 6f 6e 3b 0a  duce = iAction;.
248e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
248f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 71 73  }.    }.  }.  qs
24900 6f 72 74 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65  ort(&lemp->sorte
24910 64 5b 31 5d 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61  d[1], lemp->nsta
24920 74 65 2d 31 2c 20 73 69 7a 65 6f 66 28 6c 65 6d  te-1, sizeof(lem
24930 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 29 2c 0a 20  p->sorted[0]),. 
24940 20 20 20 20 20 20 20 73 74 61 74 65 52 65 73 6f         stateReso
24950 72 74 43 6f 6d 70 61 72 65 29 3b 0a 20 20 66 6f  rtCompare);.  fo
24960 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
24970 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
24980 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
24990 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20 69 3b 0a  ->statenum = i;.
249a0 20 20 7d 0a 20 20 6c 65 6d 70 2d 3e 6e 78 73 74    }.  lemp->nxst
249b0 61 74 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  ate = lemp->nsta
249c0 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 6c 65 6d  te;.  while( lem
249d0 70 2d 3e 6e 78 73 74 61 74 65 3e 31 20 26 26 20  p->nxstate>1 && 
249e0 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6c 65 6d  lemp->sorted[lem
249f0 70 2d 3e 6e 78 73 74 61 74 65 2d 31 5d 2d 3e 61  p->nxstate-1]->a
24a00 75 74 6f 52 65 64 75 63 65 20 29 7b 0a 20 20 20  utoReduce ){.   
24a10 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2d 2d   lemp->nxstate--
24a20 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a  ;.  }.}.../*****
24a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
24a40 6d 20 74 68 65 20 66 69 6c 65 20 22 73 65 74 2e  m the file "set.
24a50 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
24a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a70 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53  *******/./*.** S
24a80 65 74 20 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 20  et manipulation 
24a90 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 68 65  routines for the
24aa0 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
24ab0 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61  nerator..*/..sta
24ac0 74 69 63 20 69 6e 74 20 73 69 7a 65 20 3d 20 30  tic int size = 0
24ad0 3b 0a 0a 2f 2a 20 53 65 74 20 74 68 65 20 73 65  ;../* Set the se
24ae0 74 20 73 69 7a 65 20 2a 2f 0a 76 6f 69 64 20 53  t size */.void S
24af0 65 74 53 69 7a 65 28 69 6e 74 20 6e 29 0a 7b 0a  etSize(int n).{.
24b00 20 20 73 69 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a    size = n+1;.}.
24b10 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
24b20 65 77 20 73 65 74 20 2a 2f 0a 63 68 61 72 20 2a  ew set */.char *
24b30 53 65 74 4e 65 77 28 76 6f 69 64 29 7b 0a 20 20  SetNew(void){.  
24b40 63 68 61 72 20 2a 73 3b 0a 20 20 73 20 3d 20 28  char *s;.  s = (
24b50 63 68 61 72 2a 29 63 61 6c 6c 6f 63 28 20 73 69  char*)calloc( si
24b60 7a 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73 3d  ze, 1);.  if( s=
24b70 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  =0 ){.    extern
24b80 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72   void memory_err
24b90 6f 72 28 29 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  or();.    memory
24ba0 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20  _error();.  }.  
24bb0 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20  return s;.}../* 
24bc0 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65 74  Deallocate a set
24bd0 20 2a 2f 0a 76 6f 69 64 20 53 65 74 46 72 65 65   */.void SetFree
24be0 28 63 68 61 72 20 2a 73 29 0a 7b 0a 20 20 66 72  (char *s).{.  fr
24bf0 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64  ee(s);.}../* Add
24c00 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
24c10 6f 20 74 68 65 20 73 65 74 2e 20 20 52 65 74 75  o the set.  Retu
24c20 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 65  rn TRUE if the e
24c30 6c 65 6d 65 6e 74 20 77 61 73 20 61 64 64 65 64  lement was added
24c40 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20 69 66  .** and FALSE if
24c50 20 69 74 20 77 61 73 20 61 6c 72 65 61 64 79 20   it was already 
24c60 74 68 65 72 65 2e 20 2a 2f 0a 69 6e 74 20 53 65  there. */.int Se
24c70 74 41 64 64 28 63 68 61 72 20 2a 73 2c 20 69 6e  tAdd(char *s, in
24c80 74 20 65 29 0a 7b 0a 20 20 69 6e 74 20 72 76 3b  t e).{.  int rv;
24c90 0a 20 20 61 73 73 65 72 74 28 20 65 3e 3d 30 20  .  assert( e>=0 
24ca0 26 26 20 65 3c 73 69 7a 65 20 29 3b 0a 20 20 72  && e<size );.  r
24cb0 76 20 3d 20 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d  v = s[e];.  s[e]
24cc0 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 21   = 1;.  return !
24cd0 72 76 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65 76  rv;.}../* Add ev
24ce0 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 73  ery element of s
24cf0 32 20 74 6f 20 73 31 2e 20 20 52 65 74 75 72 6e  2 to s1.  Return
24d00 20 54 52 55 45 20 69 66 20 73 31 20 63 68 61 6e   TRUE if s1 chan
24d10 67 65 73 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 55  ges. */.int SetU
24d20 6e 69 6f 6e 28 63 68 61 72 20 2a 73 31 2c 20 63  nion(char *s1, c
24d30 68 61 72 20 2a 73 32 29 0a 7b 0a 20 20 69 6e 74  har *s2).{.  int
24d40 20 69 2c 20 70 72 6f 67 72 65 73 73 3b 0a 20 20   i, progress;.  
24d50 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
24d60 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
24d70 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
24d80 32 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  2[i]==0 ) contin
24d90 75 65 3b 0a 20 20 20 20 69 66 28 20 73 31 5b 69  ue;.    if( s1[i
24da0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72  ]==0 ){.      pr
24db0 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20  ogress = 1;.    
24dc0 20 20 73 31 5b 69 5d 20 3d 20 31 3b 0a 20 20 20    s1[i] = 1;.   
24dd0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
24de0 70 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a  progress;.}./***
24df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24e00 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
24e10 65 20 22 74 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a  e "table.c" ****
24e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24e30 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
24e40 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73  All code in this
24e50 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61   file has been a
24e60 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
24e70 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61  erated.** from a
24e80 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69   specification i
24e90 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  n the file.**   
24ea0 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c             "tabl
24eb0 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61  e.q".** by the a
24ec0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
24ed0 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70   code building p
24ee0 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a  rogram "aagen"..
24ef0 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74  ** Do not edit t
24f00 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65  his file!  Inste
24f10 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70 65  ad, edit the spe
24f20 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69  cification.** fi
24f30 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61  le, then rerun a
24f40 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43  agen..*/./*.** C
24f50 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ode for processi
24f60 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ng tables in the
24f70 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
24f80 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49  nerator..*/..PRI
24f90 56 41 54 45 20 75 6e 73 69 67 6e 65 64 20 73 74  VATE unsigned st
24fa0 72 68 61 73 68 28 63 6f 6e 73 74 20 63 68 61 72  rhash(const char
24fb0 20 2a 78 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65   *x).{.  unsigne
24fc0 64 20 68 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  d h = 0;.  while
24fd0 28 20 2a 78 20 29 20 68 20 3d 20 68 2a 31 33 20  ( *x ) h = h*13 
24fe0 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20 72 65 74 75  + *(x++);.  retu
24ff0 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b  rn h;.}../* Work
25000 73 20 6c 69 6b 65 20 73 74 72 64 75 70 2c 20 73  s like strdup, s
25010 6f 72 74 20 6f 66 2e 20 20 53 61 76 65 20 61 20  ort of.  Save a 
25020 73 74 72 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63  string in malloc
25030 65 64 20 6d 65 6d 6f 72 79 2c 20 62 75 74 0a 2a  ed memory, but.*
25040 2a 20 6b 65 65 70 20 73 74 72 69 6e 67 73 20 69  * keep strings i
25050 6e 20 61 20 74 61 62 6c 65 20 73 6f 20 74 68 61  n a table so tha
25060 74 20 74 68 65 20 73 61 6d 65 20 73 74 72 69 6e  t the same strin
25070 67 20 69 73 20 6e 6f 74 20 69 6e 20 6d 6f 72 65  g is not in more
25080 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 70 6c 61  .** than one pla
25090 63 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ce..*/.const cha
250a0 72 20 2a 53 74 72 73 61 66 65 28 63 6f 6e 73 74  r *Strsafe(const
250b0 20 63 68 61 72 20 2a 79 29 0a 7b 0a 20 20 63 6f   char *y).{.  co
250c0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63  nst char *z;.  c
250d0 68 61 72 20 2a 63 70 79 3b 0a 0a 20 20 69 66 28  har *cpy;..  if(
250e0 20 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   y==0 ) return 0
250f0 3b 0a 20 20 7a 20 3d 20 53 74 72 73 61 66 65 5f  ;.  z = Strsafe_
25100 66 69 6e 64 28 79 29 3b 0a 20 20 69 66 28 20 7a  find(y);.  if( z
25110 3d 3d 30 20 26 26 20 28 63 70 79 3d 28 63 68 61  ==0 && (cpy=(cha
25120 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f  r *)malloc( lemo
25130 6e 53 74 72 6c 65 6e 28 79 29 2b 31 20 29 29 21  nStrlen(y)+1 ))!
25140 3d 30 20 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f  =0 ){.    lemon_
25150 73 74 72 63 70 79 28 63 70 79 2c 79 29 3b 0a 20  strcpy(cpy,y);. 
25160 20 20 20 7a 20 3d 20 63 70 79 3b 0a 20 20 20 20     z = cpy;.    
25170 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 7a  Strsafe_insert(z
25180 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72 79 43  );.  }.  MemoryC
25190 68 65 63 6b 28 7a 29 3b 0a 20 20 72 65 74 75 72  heck(z);.  retur
251a0 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65  n z;.}../* There
251b0 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
251c0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
251d0 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  g structure for 
251e0 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74  each.** associat
251f0 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
25200 65 20 22 78 31 22 2e 0a 2a 2f 0a 73 74 72 75 63  e "x1"..*/.struc
25210 74 20 73 5f 78 31 20 7b 0a 20 20 69 6e 74 20 73  t s_x1 {.  int s
25220 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
25230 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
25240 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c   of available sl
25250 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ots. */.        
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25270 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61    /*   Must be a
25280 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61   power of 2 grea
25290 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20  ter than or */. 
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71           /*   eq
252c0 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e  ual to 1 */.  in
252d0 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  t count;        
252e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
252f0 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f  of currently slo
25300 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73  ts filled */.  s
25310 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a  truct s_x1node *
25320 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  tbl;  /* The dat
25330 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f  a stored here */
25340 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f  .  struct s_x1no
25350 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73  de **ht;  /* Has
25360 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b  h table for look
25370 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  ups */.};../* Th
25380 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
25390 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
253a0 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20  cture for every 
253b0 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  data element.** 
253c0 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76  in an associativ
253d0 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
253e0 22 78 31 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  "x1"..*/.typedef
253f0 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
25400 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
25410 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 2f 2a  *data;        /*
25420 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73   The data */.  s
25430 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a  truct s_x1node *
25440 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20  next;   /* Next 
25450 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
25460 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74  ame hash */.  st
25470 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a  ruct s_x1node **
25480 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f  from;  /* Previo
25490 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e  us link */.} x1n
254a0 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  ode;../* There i
254b0 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61  s only one insta
254c0 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  nce of the array
254d0 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66  , which is the f
254e0 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74  ollowing */.stat
254f0 69 63 20 73 74 72 75 63 74 20 73 5f 78 31 20 2a  ic struct s_x1 *
25500 78 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  x1a;../* Allocat
25510 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74  e a new associat
25520 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69  ive array */.voi
25530 64 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 76  d Strsafe_init(v
25540 6f 69 64 29 7b 0a 20 20 69 66 28 20 78 31 61 20  oid){.  if( x1a 
25550 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 31 61 20  ) return;.  x1a 
25560 3d 20 28 73 74 72 75 63 74 20 73 5f 78 31 2a 29  = (struct s_x1*)
25570 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
25580 74 72 75 63 74 20 73 5f 78 31 29 20 29 3b 0a 20  truct s_x1) );. 
25590 20 69 66 28 20 78 31 61 20 29 7b 0a 20 20 20 20   if( x1a ){.    
255a0 78 31 61 2d 3e 73 69 7a 65 20 3d 20 31 30 32 34  x1a->size = 1024
255b0 3b 0a 20 20 20 20 78 31 61 2d 3e 63 6f 75 6e 74  ;.    x1a->count
255c0 20 3d 20 30 3b 0a 20 20 20 20 78 31 61 2d 3e 74   = 0;.    x1a->t
255d0 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 63 61  bl = (x1node*)ca
255e0 6c 6c 6f 63 28 31 30 32 34 2c 20 73 69 7a 65 6f  lloc(1024, sizeo
255f0 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x1node) + size
25600 6f 66 28 78 31 6e 6f 64 65 2a 29 29 3b 0a 20 20  of(x1node*));.  
25610 20 20 69 66 28 20 78 31 61 2d 3e 74 62 6c 3d 3d    if( x1a->tbl==
25620 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
25630 78 31 61 29 3b 0a 20 20 20 20 20 20 78 31 61 20  x1a);.      x1a 
25640 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
25650 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
25660 20 20 20 78 31 61 2d 3e 68 74 20 3d 20 28 78 31     x1a->ht = (x1
25670 6e 6f 64 65 2a 2a 29 26 28 78 31 61 2d 3e 74 62  node**)&(x1a->tb
25680 6c 5b 31 30 32 34 5d 29 3b 0a 20 20 20 20 20 20  l[1024]);.      
25690 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30 32 34 3b  for(i=0; i<1024;
256a0 20 69 2b 2b 29 20 78 31 61 2d 3e 68 74 5b 69 5d   i++) x1a->ht[i]
256b0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
256c0 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
256d0 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
256e0 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
256f0 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
25700 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
25710 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
25720 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
25730 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53  written */.int S
25740 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 63 6f  trsafe_insert(co
25750 6e 73 74 20 63 68 61 72 20 2a 64 61 74 61 29 0a  nst char *data).
25760 7b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a  {.  x1node *np;.
25770 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20    unsigned h;.  
25780 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20  unsigned ph;..  
25790 69 66 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74  if( x1a==0 ) ret
257a0 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74  urn 0;.  ph = st
257b0 72 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68  rhash(data);.  h
257c0 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69   = ph & (x1a->si
257d0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31  ze-1);.  np = x1
257e0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
257f0 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
25800 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61   strcmp(np->data
25810 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20  ,data)==0 ){.   
25820 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
25830 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  g entry with the
25840 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75   same key is fou
25850 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  nd. */.      /* 
25860 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65  Fail because ove
25870 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c  rwrite is not al
25880 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lows. */.      r
25890 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
258a0 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
258b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 31 61 2d  ;.  }.  if( x1a-
258c0 3e 63 6f 75 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a  >count>=x1a->siz
258d0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  e ){.    /* Need
258e0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
258f0 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a  h table bigger *
25900 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61 72 72 53  /.    int i,arrS
25910 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ize;.    struct 
25920 73 5f 78 31 20 61 72 72 61 79 3b 0a 20 20 20 20  s_x1 array;.    
25930 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 61 72 72  array.size = arr
25940 53 69 7a 65 20 3d 20 78 31 61 2d 3e 73 69 7a 65  Size = x1a->size
25950 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f  *2;.    array.co
25960 75 6e 74 20 3d 20 78 31 61 2d 3e 63 6f 75 6e 74  unt = x1a->count
25970 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20  ;.    array.tbl 
25980 3d 20 28 78 31 6e 6f 64 65 2a 29 63 61 6c 6c 6f  = (x1node*)callo
25990 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f  c(arrSize, sizeo
259a0 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x1node) + size
259b0 6f 66 28 78 31 6e 6f 64 65 2a 29 29 3b 0a 20 20  of(x1node*));.  
259c0 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d    if( array.tbl=
259d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
259e0 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d  /* Fail due to m
259f0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f  alloc failure */
25a00 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20  .    array.ht = 
25a10 28 78 31 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61  (x1node**)&(arra
25a20 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d 29 3b  y.tbl[arrSize]);
25a30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
25a40 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72  arrSize; i++) ar
25a50 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  ray.ht[i] = 0;. 
25a60 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 31     for(i=0; i<x1
25a70 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a  a->count; i++){.
25a80 20 20 20 20 20 20 78 31 6e 6f 64 65 20 2a 6f 6c        x1node *ol
25a90 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20  dnp, *newnp;.   
25aa0 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 31 61     oldnp = &(x1a
25ab0 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  ->tbl[i]);.     
25ac0 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64   h = strhash(old
25ad0 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 61 72 72  np->data) & (arr
25ae0 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e  Size-1);.      n
25af0 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74  ewnp = &(array.t
25b00 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  bl[i]);.      if
25b10 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20  ( array.ht[h] ) 
25b20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f  array.ht[h]->fro
25b30 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78  m = &(newnp->nex
25b40 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  t);.      newnp-
25b50 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74  >next = array.ht
25b60 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  [h];.      newnp
25b70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e  ->data = oldnp->
25b80 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e  data;.      newn
25b90 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61  p->from = &(arra
25ba0 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20  y.ht[h]);.      
25bb0 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65  array.ht[h] = ne
25bc0 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  wnp;.    }.    f
25bd0 72 65 65 28 78 31 61 2d 3e 74 62 6c 29 3b 0a 20  ree(x1a->tbl);. 
25be0 20 20 20 2a 78 31 61 20 3d 20 61 72 72 61 79 3b     *x1a = array;
25bf0 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74  .  }.  /* Insert
25c00 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f   the new data */
25c10 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 31 61  .  h = ph & (x1a
25c20 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
25c30 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 78 31 61  = &(x1a->tbl[x1a
25c40 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e  ->count++]);.  n
25c50 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a  p->data = data;.
25c60 20 20 69 66 28 20 78 31 61 2d 3e 68 74 5b 68 5d    if( x1a->ht[h]
25c70 20 29 20 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66   ) x1a->ht[h]->f
25c80 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74  rom = &(np->next
25c90 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20  );.  np->next = 
25ca0 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 31  x1a->ht[h];.  x1
25cb0 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20  a->ht[h] = np;. 
25cc0 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 31   np->from = &(x1
25cd0 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74  a->ht[h]);.  ret
25ce0 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  urn 1;.}../* Ret
25cf0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
25d00 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74   data assigned t
25d10 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e  o the given key.
25d20 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a    Return NULL.**
25d30 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e   if no such key.
25d40 20 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a   */.const char *
25d50 53 74 72 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e  Strsafe_find(con
25d60 73 74 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a  st char *key).{.
25d70 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20    unsigned h;.  
25d80 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69  x1node *np;..  i
25d90 66 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75  f( x1a==0 ) retu
25da0 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68  rn 0;.  h = strh
25db0 61 73 68 28 6b 65 79 29 20 26 20 28 78 31 61 2d  ash(key) & (x1a-
25dc0 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
25dd0 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77   x1a->ht[h];.  w
25de0 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20  hile( np ){.    
25df0 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64  if( strcmp(np->d
25e00 61 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72  ata,key)==0 ) br
25e10 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70  eak;.    np = np
25e20 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  ->next;.  }.  re
25e30 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61  turn np ? np->da
25e40 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  ta : 0;.}../* Re
25e50 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
25e60 6f 20 74 68 65 20 28 74 65 72 6d 69 6e 61 6c 20  o the (terminal 
25e70 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20  or nonterminal) 
25e80 73 79 6d 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43  symbol "x"..** C
25e90 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
25ea0 6f 6c 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ol if this is th
25eb0 65 20 66 69 72 73 74 20 74 69 6d 65 20 22 78 22  e first time "x"
25ec0 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a   has been seen..
25ed0 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  */.struct symbol
25ee0 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e   *Symbol_new(con
25ef0 73 74 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20  st char *x).{.  
25f00 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
25f10 70 3b 0a 0a 20 20 73 70 20 3d 20 53 79 6d 62 6f  p;..  sp = Symbo
25f20 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20 69 66 28  l_find(x);.  if(
25f30 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 70   sp==0 ){.    sp
25f40 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f   = (struct symbo
25f50 6c 20 2a 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69  l *)calloc(1, si
25f60 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
25f70 6f 6c 29 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72  ol) );.    Memor
25f80 79 43 68 65 63 6b 28 73 70 29 3b 0a 20 20 20 20  yCheck(sp);.    
25f90 73 70 2d 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61  sp->name = Strsa
25fa0 66 65 28 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74  fe(x);.    sp->t
25fb0 79 70 65 20 3d 20 49 53 55 50 50 45 52 28 2a 78  ype = ISUPPER(*x
25fc0 29 20 3f 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e  ) ? TERMINAL : N
25fd0 4f 4e 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20  ONTERMINAL;.    
25fe0 73 70 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20  sp->rule = 0;.  
25ff0 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d    sp->fallback =
26000 20 30 3b 0a 20 20 20 20 73 70 2d 3e 70 72 65 63   0;.    sp->prec
26010 20 3d 20 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61   = -1;.    sp->a
26020 73 73 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20  ssoc = UNK;.    
26030 73 70 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 30  sp->firstset = 0
26040 3b 0a 20 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61  ;.    sp->lambda
26050 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a   = LEMON_FALSE;.
26060 20 20 20 20 73 70 2d 3e 64 65 73 74 72 75 63 74      sp->destruct
26070 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  or = 0;.    sp->
26080 64 65 73 74 4c 69 6e 65 6e 6f 20 3d 20 30 3b 0a  destLineno = 0;.
26090 20 20 20 20 73 70 2d 3e 64 61 74 61 74 79 70 65      sp->datatype
260a0 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 75 73   = 0;.    sp->us
260b0 65 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 53 79  eCnt = 0;.    Sy
260c0 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 70 2c 73  mbol_insert(sp,s
260d0 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  p->name);.  }.  
260e0 73 70 2d 3e 75 73 65 43 6e 74 2b 2b 3b 0a 20 20  sp->useCnt++;.  
260f0 72 65 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a  return sp;.}../*
26100 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 79 6d   Compare two sym
26110 62 6f 6c 73 20 66 6f 72 20 73 6f 72 74 69 6e 67  bols for sorting
26120 20 70 75 72 70 6f 73 65 73 2e 20 20 52 65 74 75   purposes.  Retu
26130 72 6e 20 6e 65 67 61 74 69 76 65 2c 0a 2a 2a 20  rn negative,.** 
26140 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
26150 65 20 69 66 20 61 20 69 73 20 6c 65 73 73 20 74  e if a is less t
26160 68 65 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  hen, equal to, o
26170 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61  r greater.** tha
26180 6e 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 79 6d 62 6f  n b..**.** Symbo
26190 6c 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  ls that begin wi
261a0 74 68 20 75 70 70 65 72 20 63 61 73 65 20 6c 65  th upper case le
261b0 74 74 65 72 73 20 28 74 65 72 6d 69 6e 61 6c 73  tters (terminals
261c0 20 6f 72 20 74 6f 6b 65 6e 73 29 0a 2a 2a 20 6d   or tokens).** m
261d0 75 73 74 20 73 6f 72 74 20 62 65 66 6f 72 65 20  ust sort before 
261e0 73 79 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67  symbols that beg
261f0 69 6e 20 77 69 74 68 20 6c 6f 77 65 72 20 63 61  in with lower ca
26200 73 65 20 6c 65 74 74 65 72 73 0a 2a 2a 20 28 6e  se letters.** (n
26210 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 29 2e 20 20  on-terminals).  
26220 41 6e 64 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41  And MULTITERMINA
26230 4c 20 73 79 6d 62 6f 6c 73 20 28 63 72 65 61 74  L symbols (creat
26240 65 64 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20  ed using the.** 
26250 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 64 69 72  %token_class dir
26260 65 63 74 69 76 65 29 20 6d 75 73 74 20 73 6f 72  ective) must sor
26270 74 20 61 74 20 74 68 65 20 76 65 72 79 20 65 6e  t at the very en
26280 64 2e 20 4f 74 68 65 72 20 74 68 61 6e 0a 2a 2a  d. Other than.**
26290 20 74 68 61 74 2c 20 74 68 65 20 6f 72 64 65 72   that, the order
262a0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
262b0 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 66 69 6e 64 20  ..**.** We find 
262c0 65 78 70 65 72 69 6d 65 6e 74 61 6c 6c 79 20 74  experimentally t
262d0 68 61 74 20 6c 65 61 76 69 6e 67 20 74 68 65 20  hat leaving the 
262e0 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 69 72  symbols in their
262f0 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64   original.** ord
26300 65 72 20 28 74 68 65 20 6f 72 64 65 72 20 74 68  er (the order th
26310 65 79 20 61 70 70 65 61 72 65 64 20 69 6e 20 74  ey appeared in t
26320 68 65 20 67 72 61 6d 6d 61 72 20 66 69 6c 65 29  he grammar file)
26330 20 67 69 76 65 73 20 74 68 65 0a 2a 2a 20 73 6d   gives the.** sm
26340 61 6c 6c 65 73 74 20 70 61 72 73 65 72 20 74 61  allest parser ta
26350 62 6c 65 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a  bles in SQLite..
26360 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70  */.int Symbolcmp
26370 70 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 61  p(const void *_a
26380 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 62  , const void *_b
26390 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  ).{.  const stru
263a0 63 74 20 73 79 6d 62 6f 6c 20 2a 61 20 3d 20 2a  ct symbol *a = *
263b0 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79  (const struct sy
263c0 6d 62 6f 6c 20 2a 2a 29 20 5f 61 3b 0a 20 20 63  mbol **) _a;.  c
263d0 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62  onst struct symb
263e0 6f 6c 20 2a 62 20 3d 20 2a 28 63 6f 6e 73 74 20  ol *b = *(const 
263f0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
26400 29 20 5f 62 3b 0a 20 20 69 6e 74 20 69 31 20 3d  ) _b;.  int i1 =
26410 20 61 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54   a->type==MULTIT
26420 45 52 4d 49 4e 41 4c 20 3f 20 33 20 3a 20 61 2d  ERMINAL ? 3 : a-
26430 3e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 20 3f 20 32  >name[0]>'Z' ? 2
26440 20 3a 20 31 3b 0a 20 20 69 6e 74 20 69 32 20 3d   : 1;.  int i2 =
26450 20 62 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54   b->type==MULTIT
26460 45 52 4d 49 4e 41 4c 20 3f 20 33 20 3a 20 62 2d  ERMINAL ? 3 : b-
26470 3e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 20 3f 20 32  >name[0]>'Z' ? 2
26480 20 3a 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 69   : 1;.  return i
26490 31 3d 3d 69 32 20 3f 20 61 2d 3e 69 6e 64 65 78  1==i2 ? a->index
264a0 20 2d 20 62 2d 3e 69 6e 64 65 78 20 3a 20 69 31   - b->index : i1
264b0 20 2d 20 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65   - i2;.}../* The
264c0 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
264d0 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
264e0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f  ing structure fo
264f0 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69  r each.** associ
26500 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
26510 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 73 74 72  ype "x2"..*/.str
26520 75 63 74 20 73 5f 78 32 20 7b 0a 20 20 69 6e 74  uct s_x2 {.  int
26530 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
26540 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
26550 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
26560 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  slots. */.      
26570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26580 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65      /*   Must be
26590 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72   a power of 2 gr
265a0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f  eater than or */
265b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
265c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
265d0 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20  equal to 1 */.  
265e0 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20  int count;      
265f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
26600 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73  r of currently s
26610 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20  lots filled */. 
26620 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
26630 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64   *tbl;  /* The d
26640 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20  ata stored here 
26650 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32  */.  struct s_x2
26660 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48  node **ht;  /* H
26670 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f  ash table for lo
26680 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  okups */.};../* 
26690 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
266a0 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
266b0 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72  ructure for ever
266c0 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a  y data element.*
266d0 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74  * in an associat
266e0 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
266f0 65 20 22 78 32 22 2e 0a 2a 2f 0a 74 79 70 65 64  e "x2"..*/.typed
26700 65 66 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  ef struct s_x2no
26710 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79  de {.  struct sy
26720 6d 62 6f 6c 20 2a 64 61 74 61 3b 20 20 20 20 20  mbol *data;     
26730 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
26740 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79   const char *key
26750 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
26760 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74   key */.  struct
26770 20 73 5f 78 32 6e 6f 64 65 20 2a 6e 65 78 74 3b   s_x2node *next;
26780 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79     /* Next entry
26790 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68   with the same h
267a0 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ash */.  struct 
267b0 73 5f 78 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b  s_x2node **from;
267c0 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69    /* Previous li
267d0 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a  nk */.} x2node;.
267e0 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c  ./* There is onl
267f0 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  y one instance o
26800 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69  f the array, whi
26810 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ch is the follow
26820 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ing */.static st
26830 72 75 63 74 20 73 5f 78 32 20 2a 78 32 61 3b 0a  ruct s_x2 *x2a;.
26840 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
26850 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ew associative a
26860 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 79 6d  rray */.void Sym
26870 62 6f 6c 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a  bol_init(void){.
26880 20 20 69 66 28 20 78 32 61 20 29 20 72 65 74 75    if( x2a ) retu
26890 72 6e 3b 0a 20 20 78 32 61 20 3d 20 28 73 74 72  rn;.  x2a = (str
268a0 75 63 74 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63  uct s_x2*)malloc
268b0 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
268c0 73 5f 78 32 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x2) );.  if( x
268d0 32 61 20 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73  2a ){.    x2a->s
268e0 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78  ize = 128;.    x
268f0 32 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  2a->count = 0;. 
26900 20 20 20 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78     x2a->tbl = (x
26910 32 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 31 32  2node*)calloc(12
26920 38 2c 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65  8, sizeof(x2node
26930 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64  ) + sizeof(x2nod
26940 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 78 32  e*));.    if( x2
26950 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
26960 20 20 20 66 72 65 65 28 78 32 61 29 3b 0a 20 20     free(x2a);.  
26970 20 20 20 20 78 32 61 20 3d 20 30 3b 0a 20 20 20      x2a = 0;.   
26980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
26990 74 20 69 3b 0a 20 20 20 20 20 20 78 32 61 2d 3e  t i;.      x2a->
269a0 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26  ht = (x2node**)&
269b0 28 78 32 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b  (x2a->tbl[128]);
269c0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
269d0 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 32 61 2d  i<128; i++) x2a-
269e0 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
269f0 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
26a00 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
26a10 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
26a20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
26a30 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
26a40 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
26a50 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
26a60 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
26a70 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .int Symbol_inse
26a80 72 74 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  rt(struct symbol
26a90 20 2a 64 61 74 61 2c 20 63 6f 6e 73 74 20 63 68   *data, const ch
26aa0 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 78 32 6e  ar *key).{.  x2n
26ab0 6f 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67  ode *np;.  unsig
26ac0 6e 65 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65  ned h;.  unsigne
26ad0 64 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 32 61  d ph;..  if( x2a
26ae0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
26af0 20 20 70 68 20 3d 20 73 74 72 68 61 73 68 28 6b    ph = strhash(k
26b00 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ey);.  h = ph & 
26b10 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x2a->size-1);. 
26b20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d   np = x2a->ht[h]
26b30 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
26b40 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
26b50 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20  np->key,key)==0 
26b60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ){.      /* An e
26b70 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69  xisting entry wi
26b80 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
26b90 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20  is found. */.   
26ba0 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75     /* Fail becau
26bb0 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20  se overwrite is 
26bc0 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20  not allows. */. 
26bd0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
26be0 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70     }.    np = np
26bf0 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  ->next;.  }.  if
26c00 28 20 78 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32  ( x2a->count>=x2
26c10 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f  a->size ){.    /
26c20 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74  * Need to make t
26c30 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69  he hash table bi
26c40 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  gger */.    int 
26c50 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20 20 73  i,arrSize;.    s
26c60 74 72 75 63 74 20 73 5f 78 32 20 61 72 72 61 79  truct s_x2 array
26c70 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65  ;.    array.size
26c80 20 3d 20 61 72 72 53 69 7a 65 20 3d 20 78 32 61   = arrSize = x2a
26c90 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72  ->size*2;.    ar
26ca0 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 32 61 2d  ray.count = x2a-
26cb0 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61  >count;.    arra
26cc0 79 2e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a  y.tbl = (x2node*
26cd0 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c  )calloc(arrSize,
26ce0 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20   sizeof(x2node) 
26cf0 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a  + sizeof(x2node*
26d00 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61  ));.    if( arra
26d10 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72  y.tbl==0 ) retur
26d20 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75  n 0;  /* Fail du
26d30 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e to malloc fail
26d40 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79  ure */.    array
26d50 2e 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29  .ht = (x2node**)
26d60 26 28 61 72 72 61 79 2e 74 62 6c 5b 61 72 72 53  &(array.tbl[arrS
26d70 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  ize]);.    for(i
26d80 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69  =0; i<arrSize; i
26d90 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20  ++) array.ht[i] 
26da0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
26db0 3b 20 69 3c 78 32 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x2a->count; 
26dc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 32 6e 6f  i++){.      x2no
26dd0 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e  de *oldnp, *newn
26de0 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d  p;.      oldnp =
26df0 20 26 28 78 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b   &(x2a->tbl[i]);
26e00 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72 68 61  .      h = strha
26e10 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26  sh(oldnp->key) &
26e20 20 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20   (arrSize-1);.  
26e30 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
26e40 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
26e50 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
26e60 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
26e70 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
26e80 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
26e90 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
26ea0 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
26eb0 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64  newnp->key = old
26ec0 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e  np->key;.      n
26ed0 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64  ewnp->data = old
26ee0 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20  np->data;.      
26ef0 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  newnp->from = &(
26f00 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20  array.ht[h]);.  
26f10 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20      array.ht[h] 
26f20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20  = newnp;.    }. 
26f30 20 20 20 66 72 65 65 28 78 32 61 2d 3e 74 62 6c     free(x2a->tbl
26f40 29 3b 0a 20 20 20 20 2a 78 32 61 20 3d 20 61 72  );.    *x2a = ar
26f50 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e  ray;.  }.  /* In
26f60 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74  sert the new dat
26f70 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20  a */.  h = ph & 
26f80 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x2a->size-1);. 
26f90 20 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c   np = &(x2a->tbl
26fa0 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b  [x2a->count++]);
26fb0 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79  .  np->key = key
26fc0 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
26fd0 61 74 61 3b 0a 20 20 69 66 28 20 78 32 61 2d 3e  ata;.  if( x2a->
26fe0 68 74 5b 68 5d 20 29 20 78 32 61 2d 3e 68 74 5b  ht[h] ) x2a->ht[
26ff0 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
27000 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
27010 78 74 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b  xt = x2a->ht[h];
27020 0a 20 20 78 32 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x2a->ht[h] = 
27030 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
27040 20 26 28 78 32 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x2a->ht[h]);.
27050 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
27060 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
27070 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
27080 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
27090 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
270a0 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
270b0 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20   key. */.struct 
270c0 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66  symbol *Symbol_f
270d0 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ind(const char *
270e0 6b 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  key).{.  unsigne
270f0 64 20 68 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e  d h;.  x2node *n
27100 70 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30  p;..  if( x2a==0
27110 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68   ) return 0;.  h
27120 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20   = strhash(key) 
27130 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x2a->size-1);
27140 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b  .  np = x2a->ht[
27150 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
27160 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
27170 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d  p(np->key,key)==
27180 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e  0 ) break;.    n
27190 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
271a0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20  }.  return np ? 
271b0 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a  np->data : 0;.}.
271c0 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ./* Return the n
271d0 2d 74 68 20 64 61 74 61 2e 20 20 52 65 74 75 72  -th data.  Retur
271e0 6e 20 4e 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f  n NULL if n is o
271f0 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a  ut of range. */.
27200 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
27210 79 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74 20 6e 29  ymbol_Nth(int n)
27220 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  .{.  struct symb
27230 6f 6c 20 2a 64 61 74 61 3b 0a 20 20 69 66 28 20  ol *data;.  if( 
27240 78 32 61 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c  x2a && n>0 && n<
27250 3d 78 32 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20  =x2a->count ){. 
27260 20 20 20 64 61 74 61 20 3d 20 78 32 61 2d 3e 74     data = x2a->t
27270 62 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20  bl[n-1].data;.  
27280 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20  }else{.    data 
27290 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
272a0 6e 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65  n data;.}../* Re
272b0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
272c0 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e   the array */.in
272d0 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29  t Symbol_count()
272e0 0a 7b 0a 20 20 72 65 74 75 72 6e 20 78 32 61 20  .{.  return x2a 
272f0 3f 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30  ? x2a->count : 0
27300 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
27310 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
27320 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20  ers to all data 
27330 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
27340 20 54 68 65 20 61 72 72 61 79 20 69 73 20 6f 62   The array is ob
27350 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
27360 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  oc.  Return NULL
27370 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   if memory alloc
27380 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d  ation.** problem
27390 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72 72  s, or if the arr
273a0 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  ay is empty. */.
273b0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
273c0 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29  Symbol_arrayof()
273d0 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  .{.  struct symb
273e0 6f 6c 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e  ol **array;.  in
273f0 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 69  t i,arrSize;.  i
27400 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75  f( x2a==0 ) retu
27410 72 6e 20 30 3b 0a 20 20 61 72 72 53 69 7a 65 20  rn 0;.  arrSize 
27420 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x2a->count;.  
27430 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20  array = (struct 
27440 73 79 6d 62 6f 6c 20 2a 2a 29 63 61 6c 6c 6f 63  symbol **)calloc
27450 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66  (arrSize, sizeof
27460 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
27470 29 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20  ));.  if( array 
27480 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
27490 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20  i<arrSize; i++) 
274a0 61 72 72 61 79 5b 69 5d 20 3d 20 78 32 61 2d 3e  array[i] = x2a->
274b0 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d  tbl[i].data;.  }
274c0 0a 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b  .  return array;
274d0 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74  .}../* Compare t
274e0 77 6f 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  wo configuration
274f0 73 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 63  s */.int Configc
27500 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f  mp(const char *_
27510 61 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f 62  a,const char *_b
27520 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  ).{.  const stru
27530 63 74 20 63 6f 6e 66 69 67 20 2a 61 20 3d 20 28  ct config *a = (
27540 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
27550 20 5f 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72   _a;.  const str
27560 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 20 3d 20  uct config *b = 
27570 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
27580 29 20 5f 62 3b 0a 20 20 69 6e 74 20 78 3b 0a 20  ) _b;.  int x;. 
27590 20 78 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65   x = a->rp->inde
275a0 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78  x - b->rp->index
275b0 3b 0a 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78  ;.  if( x==0 ) x
275c0 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64   = a->dot - b->d
275d0 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a  ot;.  return x;.
275e0 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77  }../* Compare tw
275f0 6f 20 73 74 61 74 65 73 20 2a 2f 0a 50 52 49 56  o states */.PRIV
27600 41 54 45 20 69 6e 74 20 73 74 61 74 65 63 6d 70  ATE int statecmp
27610 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
27620 61 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  a, struct config
27630 20 2a 62 29 0a 7b 0a 20 20 69 6e 74 20 72 63 3b   *b).{.  int rc;
27640 0a 20 20 66 6f 72 28 72 63 3d 30 3b 20 72 63 3d  .  for(rc=0; rc=
27650 3d 30 20 26 26 20 61 20 26 26 20 62 3b 20 20 61  =0 && a && b;  a
27660 3d 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e 62 70 29  =a->bp, b=b->bp)
27670 7b 0a 20 20 20 20 72 63 20 3d 20 61 2d 3e 72 70  {.    rc = a->rp
27680 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d  ->index - b->rp-
27690 3e 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  >index;.    if( 
276a0 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 61 2d 3e  rc==0 ) rc = a->
276b0 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20  dot - b->dot;.  
276c0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  }.  if( rc==0 ){
276d0 0a 20 20 20 20 69 66 28 20 61 20 29 20 72 63 20  .    if( a ) rc 
276e0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 62 20 29  = 1;.    if( b )
276f0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20   rc = -1;.  }.  
27700 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27710 20 48 61 73 68 20 61 20 73 74 61 74 65 20 2a 2f   Hash a state */
27720 0a 50 52 49 56 41 54 45 20 75 6e 73 69 67 6e 65  .PRIVATE unsigne
27730 64 20 73 74 61 74 65 68 61 73 68 28 73 74 72 75  d statehash(stru
27740 63 74 20 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a  ct config *a).{.
27750 20 20 75 6e 73 69 67 6e 65 64 20 68 3d 30 3b 0a    unsigned h=0;.
27760 20 20 77 68 69 6c 65 28 20 61 20 29 7b 0a 20 20    while( a ){.  
27770 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d    h = h*571 + a-
27780 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20  >rp->index*37 + 
27790 61 2d 3e 64 6f 74 3b 0a 20 20 20 20 61 20 3d 20  a->dot;.    a = 
277a0 61 2d 3e 62 70 3b 0a 20 20 7d 0a 20 20 72 65 74  a->bp;.  }.  ret
277b0 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c  urn h;.}../* All
277c0 6f 63 61 74 65 20 61 20 6e 65 77 20 73 74 61 74  ocate a new stat
277d0 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 73  e structure */.s
277e0 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61  truct state *Sta
277f0 74 65 5f 6e 65 77 28 29 0a 7b 0a 20 20 73 74 72  te_new().{.  str
27800 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73 74  uct state *newst
27810 61 74 65 3b 0a 20 20 6e 65 77 73 74 61 74 65 20  ate;.  newstate 
27820 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20  = (struct state 
27830 2a 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65  *)calloc(1, size
27840 6f 66 28 73 74 72 75 63 74 20 73 74 61 74 65 29  of(struct state)
27850 20 29 3b 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63   );.  MemoryChec
27860 6b 28 6e 65 77 73 74 61 74 65 29 3b 0a 20 20 72  k(newstate);.  r
27870 65 74 75 72 6e 20 6e 65 77 73 74 61 74 65 3b 0a  eturn newstate;.
27880 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  }../* There is o
27890 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
278a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
278b0 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a  ucture for each.
278c0 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ** associative a
278d0 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 33  rray of type "x3
278e0 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78  "..*/.struct s_x
278f0 33 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20  3 {.  int size; 
27900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27910 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   The number of a
27920 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20  vailable slots. 
27930 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
27940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27950 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65    Must be a powe
27960 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
27970 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20  han or */.      
27980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27990 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74      /*   equal t
279a0 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  o 1 */.  int cou
279b0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
279c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
279d0 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69  rrently slots fi
279e0 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  lled */.  struct
279f0 20 73 5f 78 33 6e 6f 64 65 20 2a 74 62 6c 3b 20   s_x3node *tbl; 
27a00 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f   /* The data sto
27a10 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  red here */.  st
27a20 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a  ruct s_x3node **
27a30 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ht;  /* Hash tab
27a40 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a  le for lookups *
27a50 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  /.};../* There i
27a60 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
27a70 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
27a80 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20   for every data 
27a90 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e  element.** in an
27aa0 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
27ab0 61 79 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e  ay of type "x3".
27ac0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
27ad0 63 74 20 73 5f 78 33 6e 6f 64 65 20 7b 0a 20 20  ct s_x3node {.  
27ae0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 64 61  struct state *da
27af0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
27b00 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
27b10 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
27b20 66 69 67 20 2a 6b 65 79 3b 20 20 20 20 20 20 20  fig *key;       
27b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27b40 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75  he key */.  stru
27b50 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 6e 65 78  ct s_x3node *nex
27b60 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  t;   /* Next ent
27b70 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
27b80 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63   hash */.  struc
27b90 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 66 72 6f  t s_x3node **fro
27ba0 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  m;  /* Previous 
27bb0 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65  link */.} x3node
27bc0 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
27bd0 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  nly one instance
27be0 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77   of the array, w
27bf0 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c  hich is the foll
27c00 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  owing */.static 
27c10 73 74 72 75 63 74 20 73 5f 78 33 20 2a 78 33 61  struct s_x3 *x3a
27c20 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  ;../* Allocate a
27c30 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65   new associative
27c40 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53   array */.void S
27c50 74 61 74 65 5f 69 6e 69 74 28 76 6f 69 64 29 7b  tate_init(void){
27c60 0a 20 20 69 66 28 20 78 33 61 20 29 20 72 65 74  .  if( x3a ) ret
27c70 75 72 6e 3b 0a 20 20 78 33 61 20 3d 20 28 73 74  urn;.  x3a = (st
27c80 72 75 63 74 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f  ruct s_x3*)mallo
27c90 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
27ca0 20 73 5f 78 33 29 20 29 3b 0a 20 20 69 66 28 20   s_x3) );.  if( 
27cb0 78 33 61 20 29 7b 0a 20 20 20 20 78 33 61 2d 3e  x3a ){.    x3a->
27cc0 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20  size = 128;.    
27cd0 78 33 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x3a->count = 0;.
27ce0 20 20 20 20 78 33 61 2d 3e 74 62 6c 20 3d 20 28      x3a->tbl = (
27cf0 78 33 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 31  x3node*)calloc(1
27d00 32 38 2c 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64  28, sizeof(x3nod
27d10 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f  e) + sizeof(x3no
27d20 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 78  de*));.    if( x
27d30 33 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20  3a->tbl==0 ){.  
27d40 20 20 20 20 66 72 65 65 28 78 33 61 29 3b 0a 20      free(x3a);. 
27d50 20 20 20 20 20 78 33 61 20 3d 20 30 3b 0a 20 20       x3a = 0;.  
27d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
27d70 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 33 61 2d  nt i;.      x3a-
27d80 3e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29  >ht = (x3node**)
27d90 26 28 78 33 61 2d 3e 74 62 6c 5b 31 32 38 5d 29  &(x3a->tbl[128])
27da0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
27db0 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 33 61   i<128; i++) x3a
27dc0 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  ->ht[i] = 0;.   
27dd0 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65   }.  }.}./* Inse
27de0 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
27df0 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20  into the array. 
27e00 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
27e10 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50  successful..** P
27e20 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74  rior data with t
27e30 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e  he same key is N
27e40 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a  OT overwritten *
27e50 2f 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65  /.int State_inse
27e60 72 74 28 73 74 72 75 63 74 20 73 74 61 74 65 20  rt(struct state 
27e70 2a 64 61 74 61 2c 20 73 74 72 75 63 74 20 63 6f  *data, struct co
27e80 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 78  nfig *key).{.  x
27e90 33 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73  3node *np;.  uns
27ea0 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73 69 67  igned h;.  unsig
27eb0 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66 28 20 78  ned ph;..  if( x
27ec0 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  3a==0 ) return 0
27ed0 3b 0a 20 20 70 68 20 3d 20 73 74 61 74 65 68 61  ;.  ph = stateha
27ee0 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70  sh(key);.  h = p
27ef0 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31  h & (x3a->size-1
27f00 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68  );.  np = x3a->h
27f10 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
27f20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61  p ){.    if( sta
27f30 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65  tecmp(np->key,ke
27f40 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  y)==0 ){.      /
27f50 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  * An existing en
27f60 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
27f70 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20  e key is found. 
27f80 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  */.      /* Fail
27f90 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69   because overwri
27fa0 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73  te is not allows
27fb0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
27fc0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
27fd0 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
27fe0 7d 0a 20 20 69 66 28 20 78 33 61 2d 3e 63 6f 75  }.  if( x3a->cou
27ff0 6e 74 3e 3d 78 33 61 2d 3e 73 69 7a 65 20 29 7b  nt>=x3a->size ){
28000 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
28010 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
28020 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20  ble bigger */.  
28030 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b    int i,arrSize;
28040 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 33  .    struct s_x3
28050 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61   array;.    arra
28060 79 2e 73 69 7a 65 20 3d 20 61 72 72 53 69 7a 65  y.size = arrSize
28070 20 3d 20 78 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a   = x3a->size*2;.
28080 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20      array.count 
28090 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x3a->count;.  
280a0 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78    array.tbl = (x
280b0 33 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61 72  3node*)calloc(ar
280c0 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78 33  rSize, sizeof(x3
280d0 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
280e0 33 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66  3node*));.    if
280f0 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29  ( array.tbl==0 )
28100 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46   return 0;  /* F
28110 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f  ail due to mallo
28120 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20  c failure */.   
28130 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 33 6e   array.ht = (x3n
28140 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62  ode**)&(array.tb
28150 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20 20  l[arrSize]);.   
28160 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53   for(i=0; i<arrS
28170 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e  ize; i++) array.
28180 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66  ht[i] = 0;.    f
28190 6f 72 28 69 3d 30 3b 20 69 3c 78 33 61 2d 3e 63  or(i=0; i<x3a->c
281a0 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
281b0 20 20 78 33 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c    x3node *oldnp,
281c0 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f   *newnp;.      o
281d0 6c 64 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62  ldnp = &(x3a->tb
281e0 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d  l[i]);.      h =
281f0 20 73 74 61 74 65 68 61 73 68 28 6f 6c 64 6e 70   statehash(oldnp
28200 2d 3e 6b 65 79 29 20 26 20 28 61 72 72 53 69 7a  ->key) & (arrSiz
28210 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
28220 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
28230 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
28240 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
28250 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
28260 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
28270 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
28280 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
28290 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b  ;.      newnp->k
282a0 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b  ey = oldnp->key;
282b0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
282c0 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
282d0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
282e0 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
282f0 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
28300 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
28310 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
28320 78 33 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x3a->tbl);.    *
28330 78 33 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x3a = array;.  }
28340 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
28350 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
28360 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73 69   = ph & (x3a->si
28370 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
28380 78 33 61 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63 6f  x3a->tbl[x3a->co
28390 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b  unt++]);.  np->k
283a0 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e  ey = key;.  np->
283b0 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
283c0 66 28 20 78 33 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x3a->ht[h] ) 
283d0 78 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x3a->ht[h]->from
283e0 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
283f0 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 33 61    np->next = x3a
28400 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 33 61 2d 3e  ->ht[h];.  x3a->
28410 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
28420 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 33 61 2d 3e  ->from = &(x3a->
28430 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
28440 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
28450 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
28460 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
28470 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
28480 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
28490 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
284a0 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53  .struct state *S
284b0 74 61 74 65 5f 66 69 6e 64 28 73 74 72 75 63 74  tate_find(struct
284c0 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b 0a   config *key).{.
284d0 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20    unsigned h;.  
284e0 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69  x3node *np;..  i
284f0 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75  f( x3a==0 ) retu
28500 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 61 74  rn 0;.  h = stat
28510 65 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 33  ehash(key) & (x3
28520 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
28530 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x3a->ht[h];. 
28540 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
28550 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e    if( statecmp(n
28560 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29  p->key,key)==0 )
28570 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
28580 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
28590 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
285a0 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
285b0 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79   Return an array
285c0 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
285d0 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20  all data in the 
285e0 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72  table..** The ar
285f0 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ray is obtained 
28600 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65  from malloc.  Re
28610 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d  turn NULL if mem
28620 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
28630 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69  * problems, or i
28640 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65  f the array is e
28650 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20  mpty. */.struct 
28660 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72  state **State_ar
28670 72 61 79 6f 66 28 76 6f 69 64 29 0a 7b 0a 20 20  rayof(void).{.  
28680 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 61  struct state **a
28690 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 61 72  rray;.  int i,ar
286a0 72 53 69 7a 65 3b 0a 20 20 69 66 28 20 78 33 61  rSize;.  if( x3a
286b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
286c0 20 20 61 72 72 53 69 7a 65 20 3d 20 78 33 61 2d    arrSize = x3a-
286d0 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20  >count;.  array 
286e0 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20  = (struct state 
286f0 2a 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a  **)calloc(arrSiz
28700 65 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  e, sizeof(struct
28710 20 73 74 61 74 65 20 2a 29 29 3b 0a 20 20 69 66   state *));.  if
28720 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66  ( array ){.    f
28730 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a  or(i=0; i<arrSiz
28740 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d  e; i++) array[i]
28750 20 3d 20 78 33 61 2d 3e 74 62 6c 5b 69 5d 2e 64   = x3a->tbl[i].d
28760 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ata;.  }.  retur
28770 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 48  n array;.}../* H
28780 61 73 68 20 61 20 63 6f 6e 66 69 67 75 72 61 74  ash a configurat
28790 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 75  ion */.PRIVATE u
287a0 6e 73 69 67 6e 65 64 20 63 6f 6e 66 69 67 68 61  nsigned configha
287b0 73 68 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  sh(struct config
287c0 20 2a 61 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65   *a).{.  unsigne
287d0 64 20 68 3d 30 3b 0a 20 20 68 20 3d 20 68 2a 35  d h=0;.  h = h*5
287e0 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65  71 + a->rp->inde
287f0 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20  x*37 + a->dot;. 
28800 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a   return h;.}../*
28810 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
28820 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
28830 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
28840 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73  e for each.** as
28850 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
28860 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f  of type "x4"..*/
28870 0a 73 74 72 75 63 74 20 73 5f 78 34 20 7b 0a 20  .struct s_x4 {. 
28880 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
28890 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
288a0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
288b0 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20  ble slots. */.  
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288d0 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73          /*   Mus
288e0 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
288f0 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  2 greater than o
28900 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  r */.           
28910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28920 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a  *   equal to 1 *
28930 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20  /.  int count;  
28940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28950 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74  umber of current
28960 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20  ly slots filled 
28970 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34  */.  struct s_x4
28980 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54  node *tbl;  /* T
28990 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68  he data stored h
289a0 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ere */.  struct 
289b0 73 5f 78 34 6e 6f 64 65 20 2a 2a 68 74 3b 20 20  s_x4node **ht;  
289c0 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f  /* Hash table fo
289d0 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a  r lookups */.};.
289e0 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
289f0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
28a00 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  s structure for 
28a10 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65  every data eleme
28a20 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f  nt.** in an asso
28a30 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
28a40 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 74   type "x4"..*/.t
28a50 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f  ypedef struct s_
28a60 78 34 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63  x4node {.  struc
28a70 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b 20  t config *data; 
28a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a90 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
28aa0 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64    struct s_x4nod
28ab0 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65  e *next;   /* Ne
28ac0 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  xt entry with th
28ad0 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20  e same hash */. 
28ae0 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65   struct s_x4node
28af0 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65   **from;  /* Pre
28b00 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20  vious link */.} 
28b10 78 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72  x4node;../* Ther
28b20 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e  e is only one in
28b30 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72  stance of the ar
28b40 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68  ray, which is th
28b50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
28b60 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78  tatic struct s_x
28b70 34 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f  4 *x4a;../* Allo
28b80 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63  cate a new assoc
28b90 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a  iative array */.
28ba0 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65  void Configtable
28bb0 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 69  _init(void){.  i
28bc0 66 28 20 78 34 61 20 29 20 72 65 74 75 72 6e 3b  f( x4a ) return;
28bd0 0a 20 20 78 34 61 20 3d 20 28 73 74 72 75 63 74  .  x4a = (struct
28be0 20 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73   s_x4*)malloc( s
28bf0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78  izeof(struct s_x
28c00 34 29 20 29 3b 0a 20 20 69 66 28 20 78 34 61 20  4) );.  if( x4a 
28c10 29 7b 0a 20 20 20 20 78 34 61 2d 3e 73 69 7a 65  ){.    x4a->size
28c20 20 3d 20 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e   = 64;.    x4a->
28c30 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78  count = 0;.    x
28c40 34 61 2d 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64  4a->tbl = (x4nod
28c50 65 2a 29 63 61 6c 6c 6f 63 28 36 34 2c 20 73 69  e*)calloc(64, si
28c60 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73  zeof(x4node) + s
28c70 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 3b  izeof(x4node*));
28c80 0a 20 20 20 20 69 66 28 20 78 34 61 2d 3e 74 62  .    if( x4a->tb
28c90 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  l==0 ){.      fr
28ca0 65 65 28 78 34 61 29 3b 0a 20 20 20 20 20 20 78  ee(x4a);.      x
28cb0 34 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  4a = 0;.    }els
28cc0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
28cd0 20 20 20 20 20 20 78 34 61 2d 3e 68 74 20 3d 20        x4a->ht = 
28ce0 28 78 34 6e 6f 64 65 2a 2a 29 26 28 78 34 61 2d  (x4node**)&(x4a-
28cf0 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20 20 20 20 20  >tbl[64]);.     
28d00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 36 34 3b 20   for(i=0; i<64; 
28d10 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20  i++) x4a->ht[i] 
28d20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
28d30 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  ./* Insert a new
28d40 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
28d50 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
28d60 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66  TRUE if successf
28d70 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74  ul..** Prior dat
28d80 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  a with the same 
28d90 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77  key is NOT overw
28da0 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f  ritten */.int Co
28db0 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74  nfigtable_insert
28dc0 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
28dd0 64 61 74 61 29 0a 7b 0a 20 20 78 34 6e 6f 64 65  data).{.  x4node
28de0 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64   *np;.  unsigned
28df0 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   h;.  unsigned p
28e00 68 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d 30  h;..  if( x4a==0
28e10 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
28e20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 64  h = confighash(d
28e30 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26  ata);.  h = ph &
28e40 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x4a->size-1);.
28e50 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68    np = x4a->ht[h
28e60 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
28e70 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67  {.    if( Config
28e80 63 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 20  cmp((const char 
28e90 2a 29 20 6e 70 2d 3e 64 61 74 61 2c 28 63 6f 6e  *) np->data,(con
28ea0 73 74 20 63 68 61 72 20 2a 29 20 64 61 74 61 29  st char *) data)
28eb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
28ec0 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  An existing entr
28ed0 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
28ee0 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f  key is found. */
28ef0 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62  .      /* Fail b
28f00 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65  ecause overwrite
28f10 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20   is not allows. 
28f20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
28f30 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20  0;.    }.    np 
28f40 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
28f50 20 20 69 66 28 20 78 34 61 2d 3e 63 6f 75 6e 74    if( x4a->count
28f60 3e 3d 78 34 61 2d 3e 73 69 7a 65 20 29 7b 0a 20  >=x4a->size ){. 
28f70 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61     /* Need to ma
28f80 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  ke the hash tabl
28f90 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20  e bigger */.    
28fa0 69 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20  int i,arrSize;. 
28fb0 20 20 20 73 74 72 75 63 74 20 73 5f 78 34 20 61     struct s_x4 a
28fc0 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e  rray;.    array.
28fd0 73 69 7a 65 20 3d 20 61 72 72 53 69 7a 65 20 3d  size = arrSize =
28fe0 20 78 34 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20   x4a->size*2;.  
28ff0 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20    array.count = 
29000 78 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20  x4a->count;.    
29010 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 34 6e  array.tbl = (x4n
29020 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53  ode*)calloc(arrS
29030 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78 34 6e 6f  ize, sizeof(x4no
29040 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e  de) + sizeof(x4n
29050 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20  ode*));.    if( 
29060 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72  array.tbl==0 ) r
29070 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69  eturn 0;  /* Fai
29080 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  l due to malloc 
29090 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61  failure */.    a
290a0 72 72 61 79 2e 68 74 20 3d 20 28 78 34 6e 6f 64  rray.ht = (x4nod
290b0 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b  e**)&(array.tbl[
290c0 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66  arrSize]);.    f
290d0 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a  or(i=0; i<arrSiz
290e0 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74  e; i++) array.ht
290f0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  [i] = 0;.    for
29100 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75  (i=0; i<x4a->cou
29110 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
29120 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a  x4node *oldnp, *
29130 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64  newnp;.      old
29140 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b  np = &(x4a->tbl[
29150 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 63  i]);.      h = c
29160 6f 6e 66 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d  onfighash(oldnp-
29170 3e 64 61 74 61 29 20 26 20 28 61 72 72 53 69 7a  >data) & (arrSiz
29180 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
29190 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
291a0 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
291b0 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
291c0 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
291d0 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
291e0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
291f0 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
29200 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
29210 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
29220 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
29230 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
29240 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
29250 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
29260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
29270 28 78 34 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x4a->tbl);.    
29280 2a 78 34 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x4a = array;.  
29290 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
292a0 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
292b0 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73  h = ph & (x4a->s
292c0 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
292d0 28 78 34 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63  (x4a->tbl[x4a->c
292e0 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
292f0 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
29300 66 28 20 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x4a->ht[h] ) 
29310 78 34 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x4a->ht[h]->from
29320 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
29330 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61    np->next = x4a
29340 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e  ->ht[h];.  x4a->
29350 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
29360 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e  ->from = &(x4a->
29370 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
29380 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
29390 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
293a0 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
293b0 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
293c0 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
293d0 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
293e0 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
293f0 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64  Configtable_find
29400 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
29410 6b 65 79 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a  key).{.  int h;.
29420 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20    x4node *np;.. 
29430 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65   if( x4a==0 ) re
29440 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f  turn 0;.  h = co
29450 6e 66 69 67 68 61 73 68 28 6b 65 79 29 20 26 20  nfighash(key) & 
29460 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x4a->size-1);. 
29470 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d   np = x4a->ht[h]
29480 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
29490 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63  .    if( Configc
294a0 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  mp((const char *
294b0 29 20 6e 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73  ) np->data,(cons
294c0 74 20 63 68 61 72 20 2a 29 20 6b 65 79 29 3d 3d  t char *) key)==
294d0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e  0 ) break;.    n
294e0 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
294f0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20  }.  return np ? 
29500 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a  np->data : 0;.}.
29510 0a 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64  ./* Remove all d
29520 61 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61 62  ata from the tab
29530 6c 65 2e 20 20 50 61 73 73 20 65 61 63 68 20 64  le.  Pass each d
29540 61 74 61 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ata to the funct
29550 69 6f 6e 20 22 66 22 0a 2a 2a 20 61 73 20 69 74  ion "f".** as it
29560 20 69 73 20 72 65 6d 6f 76 65 64 2e 20 20 28 22   is removed.  ("
29570 66 22 20 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74  f" may be null t
29580 6f 20 61 76 6f 69 64 20 74 68 69 73 20 73 74 65  o avoid this ste
29590 70 2e 29 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  p.) */.void Conf
295a0 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e  igtable_clear(in
295b0 74 28 2a 66 29 28 73 74 72 75 63 74 20 63 6f 6e  t(*f)(struct con
295c0 66 69 67 20 2a 29 29 0a 7b 0a 20 20 69 6e 74 20  fig *)).{.  int 
295d0 69 3b 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20  i;.  if( x4a==0 
295e0 7c 7c 20 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30  || x4a->count==0
295f0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
29600 20 66 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c   f ) for(i=0; i<
29610 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x4a->count; i++)
29620 20 28 2a 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69   (*f)(x4a->tbl[i
29630 5d 2e 64 61 74 61 29 3b 0a 20 20 66 6f 72 28 69  ].data);.  for(i
29640 3d 30 3b 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b  =0; i<x4a->size;
29650 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d   i++) x4a->ht[i]
29660 20 3d 20 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75   = 0;.  x4a->cou
29670 6e 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  nt = 0;.  return
29680 3b 0a 7d 0a                                      ;.}.