/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact e4fb7d888873ac88f20a41c84a7d1e61f5209a6d:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0190: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
01a0: 0a 23 64 65 66 69 6e 65 20 49 53 53 50 41 43 45  .#define ISSPACE
01b0: 28 58 29 20 69 73 73 70 61 63 65 28 28 75 6e 73  (X) isspace((uns
01c0: 69 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a  igned char)(X)).
01d0: 23 64 65 66 69 6e 65 20 49 53 44 49 47 49 54 28  #define ISDIGIT(
01e0: 58 29 20 69 73 64 69 67 69 74 28 28 75 6e 73 69  X) isdigit((unsi
01f0: 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23  gned char)(X)).#
0200: 64 65 66 69 6e 65 20 49 53 41 4c 4e 55 4d 28 58  define ISALNUM(X
0210: 29 20 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67  ) isalnum((unsig
0220: 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64  ned char)(X)).#d
0230: 65 66 69 6e 65 20 49 53 41 4c 50 48 41 28 58 29  efine ISALPHA(X)
0240: 20 69 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e   isalpha((unsign
0250: 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65  ed char)(X)).#de
0260: 66 69 6e 65 20 49 53 55 50 50 45 52 28 58 29 20  fine ISUPPER(X) 
0270: 69 73 75 70 70 65 72 28 28 75 6e 73 69 67 6e 65  isupper((unsigne
0280: 64 20 63 68 61 72 29 28 58 29 29 0a 23 64 65 66  d char)(X)).#def
0290: 69 6e 65 20 49 53 4c 4f 57 45 52 28 58 29 20 69  ine ISLOWER(X) i
02a0: 73 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65 64  slower((unsigned
02b0: 20 63 68 61 72 29 28 58 29 29 0a 0a 0a 23 69 66   char)(X))...#if
02c0: 6e 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  ndef __WIN32__.#
02d0: 20 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 57     if defined(_W
02e0: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
02f0: 28 57 49 4e 33 32 29 0a 23 20 20 20 20 20 20 20  (WIN32).#       
0300: 64 65 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f  define __WIN32__
0310: 0a 23 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  .#   endif.#endi
0320: 66 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33  f..#ifdef __WIN3
0330: 32 5f 5f 0a 23 69 66 64 65 66 20 5f 5f 63 70 6c  2__.#ifdef __cpl
0340: 75 73 70 6c 75 73 0a 65 78 74 65 72 6e 20 22 43  usplus.extern "C
0350: 22 20 7b 0a 23 65 6e 64 69 66 0a 65 78 74 65 72  " {.#endif.exter
0360: 6e 20 69 6e 74 20 61 63 63 65 73 73 28 63 6f 6e  n int access(con
0370: 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 69  st char *path, i
0380: 6e 74 20 6d 6f 64 65 29 3b 0a 23 69 66 64 65 66  nt mode);.#ifdef
0390: 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 7d 0a 23   __cplusplus.}.#
03a0: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 23 69 6e 63  endif.#else.#inc
03b0: 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a  lude <unistd.h>.
03c0: 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66 69  #endif../* #defi
03d0: 6e 65 20 50 52 49 56 41 54 45 20 73 74 61 74 69  ne PRIVATE stati
03e0: 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 49  c */.#define PRI
03f0: 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54 45 53  VATE..#ifdef TES
0400: 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48 53  T.#define MAXRHS
0410: 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20   5       /* Set 
0420: 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73 65 20  low to exercise 
0430: 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65 20 2a  exception code *
0440: 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  /.#else.#define 
0450: 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65 6e 64  MAXRHS 1000.#end
0460: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  if..static int s
0470: 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e  howPrecedenceCon
0480: 66 6c 69 63 74 20 3d 20 30 3b 0a 73 74 61 74 69  flict = 0;.stati
0490: 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 63 68  c char *msort(ch
04a0: 61 72 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 28 2a  ar*,char**,int(*
04b0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
04c0: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a  nst char*));../*
04d0: 0a 2a 2a 20 43 6f 6d 70 69 6c 65 72 73 20 61 72  .** Compilers ar
04e0: 65 20 67 65 74 74 69 6e 67 20 69 6e 63 72 65 61  e getting increa
04f0: 73 69 6e 67 6c 79 20 70 65 64 61 6e 74 69 63 20  singly pedantic 
0500: 61 62 6f 75 74 20 74 79 70 65 20 63 6f 6e 76 65  about type conve
0510: 72 73 69 6f 6e 73 0a 2a 2a 20 61 73 20 43 20 65  rsions.** as C e
0520: 76 6f 6c 76 65 73 20 65 76 65 72 20 63 6c 6f 73  volves ever clos
0530: 65 72 20 74 6f 20 41 64 61 2e 2e 2e 2e 20 20 54  er to Ada....  T
0540: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
0550: 65 20 6c 61 74 65 73 74 20 70 72 6f 62 6c 65 6d  e latest problem
0560: 73 0a 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20  s.** we have to 
0570: 64 65 66 69 6e 65 20 74 68 65 20 66 6f 6c 6c 6f  define the follo
0580: 77 69 6e 67 20 76 61 72 69 61 6e 74 20 6f 66 20  wing variant of 
0590: 73 74 72 6c 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65  strlen()..*/.#de
05a0: 66 69 6e 65 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  fine lemonStrlen
05b0: 28 58 29 20 20 20 28 28 69 6e 74 29 73 74 72 6c  (X)   ((int)strl
05c0: 65 6e 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6f  en(X))../*.** Co
05d0: 6d 70 69 6c 65 72 73 20 61 72 65 20 73 74 61 72  mpilers are star
05e0: 74 69 6e 67 20 74 6f 20 63 6f 6d 70 6c 61 69 6e  ting to complain
05f0: 20 61 62 6f 75 74 20 74 68 65 20 75 73 65 20 6f   about the use o
0600: 66 20 73 70 72 69 6e 74 66 28 29 20 61 6e 64 20  f sprintf() and 
0610: 73 74 72 63 70 79 28 29 2c 0a 2a 2a 20 73 61 79  strcpy(),.** say
0620: 69 6e 67 20 74 68 65 79 20 61 72 65 20 75 6e 73  ing they are uns
0630: 61 66 65 2e 20 20 53 6f 20 77 65 20 64 65 66 69  afe.  So we defi
0640: 6e 65 20 6f 75 72 20 6f 77 6e 20 76 65 72 73 69  ne our own versi
0650: 6f 6e 73 20 6f 66 20 74 68 6f 73 65 20 72 6f 75  ons of those rou
0660: 74 69 6e 65 73 20 74 6f 6f 2e 0a 2a 2a 0a 2a 2a  tines too..**.**
0670: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
0680: 20 72 6f 75 74 69 6e 65 73 20 68 65 72 65 3a 20   routines here: 
0690: 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 29   lemon_sprintf()
06a0: 2c 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74 66  , lemon_vsprintf
06b0: 28 29 2c 20 61 6e 64 0a 2a 2a 20 6c 65 6d 6f 6e  (), and.** lemon
06c0: 5f 61 64 64 74 65 78 74 28 29 2e 20 54 68 65 20  _addtext(). The 
06d0: 66 69 72 73 74 20 74 77 6f 20 61 72 65 20 72 65  first two are re
06e0: 70 6c 61 63 65 6d 65 6e 74 73 20 66 6f 72 20 73  placements for s
06f0: 70 72 69 6e 74 66 28 29 20 61 6e 64 20 76 73 70  printf() and vsp
0700: 72 69 6e 74 66 28 29 2e 0a 2a 2a 20 54 68 65 20  rintf()..** The 
0710: 74 68 69 72 64 20 69 73 20 61 20 68 65 6c 70 65  third is a helpe
0720: 72 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 76 73  r routine for vs
0730: 6e 70 72 69 6e 74 66 28 29 20 74 68 61 74 20 61  nprintf() that a
0740: 64 64 73 20 74 65 78 74 73 20 74 6f 20 74 68 65  dds texts to the
0750: 20 65 6e 64 20 6f 66 20 61 0a 2a 2a 20 62 75 66   end of a.** buf
0760: 66 65 72 2c 20 6d 61 6b 69 6e 67 20 73 75 72 65  fer, making sure
0770: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 61   the buffer is a
0780: 6c 77 61 79 73 20 7a 65 72 6f 2d 74 65 72 6d 69  lways zero-termi
0790: 6e 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nated..**.** The
07a0: 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 65   string formatte
07b0: 72 20 69 73 20 61 20 6d 69 6e 69 6d 61 6c 20 73  r is a minimal s
07c0: 75 62 73 65 74 20 6f 66 20 73 74 64 6c 69 62 20  ubset of stdlib 
07d0: 73 70 72 69 6e 74 66 28 29 20 73 75 70 70 6f 72  sprintf() suppor
07e0: 74 69 6e 67 20 6f 6e 6c 79 0a 2a 2a 20 61 20 66  ting only.** a f
07f0: 65 77 20 73 69 6d 70 6c 79 20 63 6f 6e 76 65 72  ew simply conver
0800: 73 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 25  sions:.**.**   %
0810: 64 0a 2a 2a 20 20 20 25 73 0a 2a 2a 20 20 20 25  d.**   %s.**   %
0820: 2e 2a 73 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  .*s.**.*/.static
0830: 20 76 6f 69 64 20 6c 65 6d 6f 6e 5f 61 64 64 74   void lemon_addt
0840: 65 78 74 28 0a 20 20 63 68 61 72 20 2a 7a 42 75  ext(.  char *zBu
0850: 66 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  f,           /* 
0860: 54 68 65 20 62 75 66 66 65 72 20 74 6f 20 77 68  The buffer to wh
0870: 69 63 68 20 74 65 78 74 20 69 73 20 61 64 64 65  ich text is adde
0880: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 55 73  d */.  int *pnUs
0890: 65 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed,          /* 
08a0: 53 6c 6f 74 73 20 6f 66 20 74 68 65 20 62 75 66  Slots of the buf
08b0: 66 65 72 20 75 73 65 64 20 73 6f 20 66 61 72 20  fer used so far 
08c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
08d0: 2a 7a 49 6e 2c 20 20 20 20 20 20 2f 2a 20 54 65  *zIn,      /* Te
08e0: 78 74 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69  xt to add */.  i
08f0: 6e 74 20 6e 49 6e 2c 20 20 20 20 20 20 20 20 20  nt nIn,         
0900: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
0910: 20 74 65 78 74 20 74 6f 20 61 64 64 2e 20 20 2d   text to add.  -
0920: 31 20 74 6f 20 75 73 65 20 73 74 72 6c 65 6e 28  1 to use strlen(
0930: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 57 69 64 74  ) */.  int iWidt
0940: 68 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h            /* 
0950: 46 69 65 6c 64 20 77 69 64 74 68 2e 20 20 4e 65  Field width.  Ne
0960: 67 61 74 69 76 65 20 74 6f 20 6c 65 66 74 20 6a  gative to left j
0970: 75 73 74 69 66 79 20 2a 2f 0a 29 7b 0a 20 20 69  ustify */.){.  i
0980: 66 28 20 6e 49 6e 3c 30 20 29 20 66 6f 72 28 6e  f( nIn<0 ) for(n
0990: 49 6e 3d 30 3b 20 7a 49 6e 5b 6e 49 6e 5d 3b 20  In=0; zIn[nIn]; 
09a0: 6e 49 6e 2b 2b 29 7b 7d 0a 20 20 77 68 69 6c 65  nIn++){}.  while
09b0: 28 20 69 57 69 64 74 68 3e 6e 49 6e 20 29 7b 20  ( iWidth>nIn ){ 
09c0: 7a 42 75 66 5b 28 2a 70 6e 55 73 65 64 29 2b 2b  zBuf[(*pnUsed)++
09d0: 5d 20 3d 20 27 20 27 3b 20 69 57 69 64 74 68 2d  ] = ' '; iWidth-
09e0: 2d 3b 20 7d 0a 20 20 69 66 28 20 6e 49 6e 3d 3d  -; }.  if( nIn==
09f0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65  0 ) return;.  me
0a00: 6d 63 70 79 28 26 7a 42 75 66 5b 2a 70 6e 55 73  mcpy(&zBuf[*pnUs
0a10: 65 64 5d 2c 20 7a 49 6e 2c 20 6e 49 6e 29 3b 0a  ed], zIn, nIn);.
0a20: 20 20 2a 70 6e 55 73 65 64 20 2b 3d 20 6e 49 6e    *pnUsed += nIn
0a30: 3b 0a 20 20 77 68 69 6c 65 28 20 28 2d 69 57 69  ;.  while( (-iWi
0a40: 64 74 68 29 3e 6e 49 6e 20 29 7b 20 7a 42 75 66  dth)>nIn ){ zBuf
0a50: 5b 28 2a 70 6e 55 73 65 64 29 2b 2b 5d 20 3d 20  [(*pnUsed)++] = 
0a60: 27 20 27 3b 20 69 57 69 64 74 68 2b 2b 3b 20 7d  ' '; iWidth++; }
0a70: 0a 20 20 7a 42 75 66 5b 2a 70 6e 55 73 65 64 5d  .  zBuf[*pnUsed]
0a80: 20 3d 20 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69   = 0;.}.static i
0a90: 6e 74 20 6c 65 6d 6f 6e 5f 76 73 70 72 69 6e 74  nt lemon_vsprint
0aa0: 66 28 63 68 61 72 20 2a 73 74 72 2c 20 63 6f 6e  f(char *str, con
0ab0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
0ac0: 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20  , va_list ap){. 
0ad0: 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 63 3b   int i, j, k, c;
0ae0: 0a 20 20 69 6e 74 20 6e 55 73 65 64 20 3d 20 30  .  int nUsed = 0
0af0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
0b00: 7a 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  z;.  char zTemp[
0b10: 35 30 5d 3b 0a 20 20 73 74 72 5b 30 5d 20 3d 20  50];.  str[0] = 
0b20: 30 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  0;.  for(i=j=0; 
0b30: 28 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 69 5d 29  (c = zFormat[i])
0b40: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  !=0; i++){.    i
0b50: 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a 20 20 20  f( c=='%' ){.   
0b60: 20 20 20 69 6e 74 20 69 57 69 64 74 68 20 3d 20     int iWidth = 
0b70: 30 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  0;.      lemon_a
0b80: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0b90: 65 64 2c 20 26 7a 46 6f 72 6d 61 74 5b 6a 5d 2c  ed, &zFormat[j],
0ba0: 20 69 2d 6a 2c 20 30 29 3b 0a 20 20 20 20 20 20   i-j, 0);.      
0bb0: 63 20 3d 20 7a 46 6f 72 6d 61 74 5b 2b 2b 69 5d  c = zFormat[++i]
0bc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 44 49  ;.      if( ISDI
0bd0: 47 49 54 28 63 29 20 7c 7c 20 28 63 3d 3d 27 2d  GIT(c) || (c=='-
0be0: 27 20 26 26 20 49 53 44 49 47 49 54 28 7a 46 6f  ' && ISDIGIT(zFo
0bf0: 72 6d 61 74 5b 69 2b 31 5d 29 29 20 29 7b 0a 20  rmat[i+1])) ){. 
0c00: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2d         if( c=='-
0c10: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) i++;.       
0c20: 20 77 68 69 6c 65 28 20 49 53 44 49 47 49 54 28   while( ISDIGIT(
0c30: 7a 46 6f 72 6d 61 74 5b 69 5d 29 20 29 20 69 57  zFormat[i]) ) iW
0c40: 69 64 74 68 20 3d 20 69 57 69 64 74 68 2a 31 30  idth = iWidth*10
0c50: 20 2b 20 7a 46 6f 72 6d 61 74 5b 69 2b 2b 5d 20   + zFormat[i++] 
0c60: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69  - '0';.        i
0c70: 66 28 20 63 3d 3d 27 2d 27 20 29 20 69 57 69 64  f( c=='-' ) iWid
0c80: 74 68 20 3d 20 2d 69 57 69 64 74 68 3b 0a 20 20  th = -iWidth;.  
0c90: 20 20 20 20 20 20 63 20 3d 20 7a 46 6f 72 6d 61        c = zForma
0ca0: 74 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t[i];.      }.  
0cb0: 20 20 20 20 69 66 28 20 63 3d 3d 27 64 27 20 29      if( c=='d' )
0cc0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 76 20  {.        int v 
0cd0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
0ce0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
0cf0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
0d00: 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74  lemon_addtext(st
0d10: 72 2c 20 26 6e 55 73 65 64 2c 20 22 2d 22 2c 20  r, &nUsed, "-", 
0d20: 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20 20 20  1, iWidth);.    
0d30: 20 20 20 20 20 20 76 20 3d 20 2d 76 3b 0a 20 20        v = -v;.  
0d40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
0d50: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  v==0 ){.        
0d60: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0d70: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 22 30 22  str, &nUsed, "0"
0d80: 2c 20 31 2c 20 69 57 69 64 74 68 29 3b 0a 20 20  , 1, iWidth);.  
0d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0da0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77  k = 0;.        w
0db0: 68 69 6c 65 28 20 76 3e 30 20 29 7b 0a 20 20 20  hile( v>0 ){.   
0dc0: 20 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20         k++;.    
0dd0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 73 69 7a 65        zTemp[size
0de0: 6f 66 28 7a 54 65 6d 70 29 2d 6b 5d 20 3d 20 28  of(zTemp)-k] = (
0df0: 76 25 31 30 29 20 2b 20 27 30 27 3b 0a 20 20 20  v%10) + '0';.   
0e00: 20 20 20 20 20 20 20 76 20 2f 3d 20 31 30 3b 0a         v /= 10;.
0e10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0e20: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0e30: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 26 7a 54  str, &nUsed, &zT
0e40: 65 6d 70 5b 73 69 7a 65 6f 66 28 7a 54 65 6d 70  emp[sizeof(zTemp
0e50: 29 2d 6b 5d 2c 20 6b 2c 20 69 57 69 64 74 68 29  )-k], k, iWidth)
0e60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
0e70: 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20  ( c=='s' ){.    
0e80: 20 20 20 20 7a 20 3d 20 76 61 5f 61 72 67 28 61      z = va_arg(a
0e90: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  p, const char*);
0ea0: 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61  .        lemon_a
0eb0: 64 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73  ddtext(str, &nUs
0ec0: 65 64 2c 20 7a 2c 20 2d 31 2c 20 69 57 69 64 74  ed, z, -1, iWidt
0ed0: 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  h);.      }else 
0ee0: 69 66 28 20 63 3d 3d 27 2e 27 20 26 26 20 6d 65  if( c=='.' && me
0ef0: 6d 63 6d 70 28 26 7a 46 6f 72 6d 61 74 5b 69 5d  mcmp(&zFormat[i]
0f00: 2c 20 22 2e 2a 73 22 2c 20 33 29 3d 3d 30 20 29  , ".*s", 3)==0 )
0f10: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  {.        i += 2
0f20: 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 76 61  ;.        k = va
0f30: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
0f40: 20 20 20 20 20 20 20 7a 20 3d 20 76 61 5f 61 72         z = va_ar
0f50: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
0f60: 2a 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f  *);.        lemo
0f70: 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20 26  n_addtext(str, &
0f80: 6e 55 73 65 64 2c 20 7a 2c 20 6b 2c 20 69 57 69  nUsed, z, k, iWi
0f90: 64 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dth);.      }els
0fa0: 65 20 69 66 28 20 63 3d 3d 27 25 27 20 29 7b 0a  e if( c=='%' ){.
0fb0: 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64          lemon_ad
0fc0: 64 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65  dtext(str, &nUse
0fd0: 64 2c 20 22 25 22 2c 20 31 2c 20 30 29 3b 0a 20  d, "%", 1, 0);. 
0fe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
0ff0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1000: 72 72 2c 20 22 69 6c 6c 65 67 61 6c 20 66 6f 72  rr, "illegal for
1010: 6d 61 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  mat\n");.       
1020: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
1030: 7d 0a 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b  }.      j = i+1;
1040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 65 6d  .    }.  }.  lem
1050: 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20  on_addtext(str, 
1060: 26 6e 55 73 65 64 2c 20 26 7a 46 6f 72 6d 61 74  &nUsed, &zFormat
1070: 5b 6a 5d 2c 20 69 2d 6a 2c 20 30 29 3b 0a 20 20  [j], i-j, 0);.  
1080: 72 65 74 75 72 6e 20 6e 55 73 65 64 3b 0a 7d 0a  return nUsed;.}.
1090: 73 74 61 74 69 63 20 69 6e 74 20 6c 65 6d 6f 6e  static int lemon
10a0: 5f 73 70 72 69 6e 74 66 28 63 68 61 72 20 2a 73  _sprintf(char *s
10b0: 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
10c0: 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  format, ...){.  
10d0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
10e0: 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  t rc;.  va_start
10f0: 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20  (ap, format);.  
1100: 72 63 20 3d 20 6c 65 6d 6f 6e 5f 76 73 70 72 69  rc = lemon_vspri
1110: 6e 74 66 28 73 74 72 2c 20 66 6f 72 6d 61 74 2c  ntf(str, format,
1120: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1130: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1140: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
1150: 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63 68 61 72  emon_strcpy(char
1160: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
1170: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
1180: 65 28 20 28 2a 28 64 65 73 74 2b 2b 29 20 3d 20  e( (*(dest++) = 
1190: 2a 28 73 72 63 2b 2b 29 29 21 3d 30 20 29 7b 7d  *(src++))!=0 ){}
11a0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  .}.static void l
11b0: 65 6d 6f 6e 5f 73 74 72 63 61 74 28 63 68 61 72  emon_strcat(char
11c0: 20 2a 64 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   *dest, const ch
11d0: 61 72 20 2a 73 72 63 29 7b 0a 20 20 77 68 69 6c  ar *src){.  whil
11e0: 65 28 20 2a 64 65 73 74 20 29 20 64 65 73 74 2b  e( *dest ) dest+
11f0: 2b 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70  +;.  lemon_strcp
1200: 79 28 64 65 73 74 2c 20 73 72 63 29 3b 0a 7d 0a  y(dest, src);.}.
1210: 0a 0a 2f 2a 20 61 20 66 65 77 20 66 6f 72 77 61  ../* a few forwa
1220: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e  rd declarations.
1230: 2e 2e 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c  .. */.struct rul
1240: 65 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 3b  e;.struct lemon;
1250: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 3b 0a  .struct action;.
1260: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
1270: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65  ction *Action_ne
1280: 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63 20  w(void);.static 
1290: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
12a0: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72 75 63  ction_sort(struc
12b0: 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a  t action *);../*
12c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
12d0: 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 68  he file "build.h
12e0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
12f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1300: 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e  ******/.void Fin
1310: 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73  dRulePrecedences
1320: 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 69 72  ();.void FindFir
1330: 73 74 53 65 74 73 28 29 3b 0a 76 6f 69 64 20 46  stSets();.void F
1340: 69 6e 64 53 74 61 74 65 73 28 29 3b 0a 76 6f 69  indStates();.voi
1350: 64 20 46 69 6e 64 4c 69 6e 6b 73 28 29 3b 0a 76  d FindLinks();.v
1360: 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65  oid FindFollowSe
1370: 74 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 41  ts();.void FindA
1380: 63 74 69 6f 6e 73 28 29 3b 0a 0a 2f 2a 2a 2a 2a  ctions();../****
1390: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
13a0: 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e  ile "configlist.
13b0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
13c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d0: 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  ****/.void Confi
13e0: 67 6c 69 73 74 5f 69 6e 69 74 28 76 6f 69 64 29  glist_init(void)
13f0: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
1400: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28  *Configlist_add(
1410: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69  struct rule *, i
1420: 6e 74 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  nt);.struct conf
1430: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61  ig *Configlist_a
1440: 64 64 62 61 73 69 73 28 73 74 72 75 63 74 20 72  ddbasis(struct r
1450: 75 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69  ule *, int);.voi
1460: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f  d Configlist_clo
1470: 73 75 72 65 28 73 74 72 75 63 74 20 6c 65 6d 6f  sure(struct lemo
1480: 6e 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  n *);.void Confi
1490: 67 6c 69 73 74 5f 73 6f 72 74 28 76 6f 69 64 29  glist_sort(void)
14a0: 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  ;.void Configlis
14b0: 74 5f 73 6f 72 74 62 61 73 69 73 28 76 6f 69 64  t_sortbasis(void
14c0: 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  );.struct config
14d0: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74   *Configlist_ret
14e0: 75 72 6e 28 76 6f 69 64 29 3b 0a 73 74 72 75 63  urn(void);.struc
14f0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
1500: 6c 69 73 74 5f 62 61 73 69 73 28 76 6f 69 64 29  list_basis(void)
1510: 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  ;.void Configlis
1520: 74 5f 65 61 74 28 73 74 72 75 63 74 20 63 6f 6e  t_eat(struct con
1530: 66 69 67 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e  fig *);.void Con
1540: 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 76 6f  figlist_reset(vo
1550: 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  id);../*********
1560: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
1570: 65 72 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  error.h" *******
1580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a0: 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28  /.void ErrorMsg(
15b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e  const char *, in
15c0: 74 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20  t,const char *, 
15d0: 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 20 46  ...);../****** F
15e0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70  rom the file "op
15f0: 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  tion.h" ********
1600: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1620: 2a 2a 2f 0a 65 6e 75 6d 20 6f 70 74 69 6f 6e 5f  **/.enum option_
1630: 74 79 70 65 20 7b 20 4f 50 54 5f 46 4c 41 47 3d  type { OPT_FLAG=
1640: 31 2c 20 20 4f 50 54 5f 49 4e 54 2c 20 20 4f 50  1,  OPT_INT,  OP
1650: 54 5f 44 42 4c 2c 20 20 4f 50 54 5f 53 54 52 2c  T_DBL,  OPT_STR,
1660: 0a 20 20 20 20 20 20 20 20 20 4f 50 54 5f 46 46  .         OPT_FF
1670: 4c 41 47 2c 20 4f 50 54 5f 46 49 4e 54 2c 20 4f  LAG, OPT_FINT, O
1680: 50 54 5f 46 44 42 4c 2c 20 4f 50 54 5f 46 53 54  PT_FDBL, OPT_FST
1690: 52 7d 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70 74  R};.struct s_opt
16a0: 69 6f 6e 73 20 7b 0a 20 20 65 6e 75 6d 20 6f 70  ions {.  enum op
16b0: 74 69 6f 6e 5f 74 79 70 65 20 74 79 70 65 3b 0a  tion_type type;.
16c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 61    const char *la
16d0: 62 65 6c 3b 0a 20 20 63 68 61 72 20 2a 61 72 67  bel;.  char *arg
16e0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
16f0: 6d 65 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e 74 20  message;.};.int 
1700: 20 20 20 4f 70 74 49 6e 69 74 28 63 68 61 72 2a     OptInit(char*
1710: 2a 2c 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  *,struct s_optio
1720: 6e 73 2a 2c 46 49 4c 45 2a 29 3b 0a 69 6e 74 20  ns*,FILE*);.int 
1730: 20 20 20 4f 70 74 4e 41 72 67 73 28 76 6f 69 64     OptNArgs(void
1740: 29 3b 0a 63 68 61 72 20 20 2a 4f 70 74 41 72 67  );.char  *OptArg
1750: 28 69 6e 74 29 3b 0a 76 6f 69 64 20 20 20 4f 70  (int);.void   Op
1760: 74 45 72 72 28 69 6e 74 29 3b 0a 76 6f 69 64 20  tErr(int);.void 
1770: 20 20 4f 70 74 50 72 69 6e 74 28 76 6f 69 64 29    OptPrint(void)
1780: 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ;../******** Fro
1790: 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61 72 73  m the file "pars
17a0: 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.h" ***********
17b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
17d0: 76 6f 69 64 20 50 61 72 73 65 28 73 74 72 75 63  void Parse(struc
17e0: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 3b 0a  t lemon *lemp);.
17f0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  ./********* From
1800: 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b   the file "plink
1810: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
1820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72  ***********/.str
1840: 75 63 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b  uct plink *Plink
1850: 5f 6e 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64  _new(void);.void
1860: 20 50 6c 69 6e 6b 5f 61 64 64 28 73 74 72 75 63   Plink_add(struc
1870: 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75  t plink **, stru
1880: 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f  ct config *);.vo
1890: 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74  id Plink_copy(st
18a0: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73  ruct plink **, s
18b0: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 3b 0a  truct plink *);.
18c0: 76 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74  void Plink_delet
18d0: 65 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  e(struct plink *
18e0: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  );../********** 
18f0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72  From the file "r
1900: 65 70 6f 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  eport.h" *******
1910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1930: 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73 74 72  void Reprint(str
1940: 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f  uct lemon *);.vo
1950: 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28  id ReportOutput(
1960: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b  struct lemon *);
1970: 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c  .void ReportTabl
1980: 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  e(struct lemon *
1990: 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20 52 65 70  , int);.void Rep
19a0: 6f 72 74 48 65 61 64 65 72 28 73 74 72 75 63 74  ortHeader(struct
19b0: 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20   lemon *);.void 
19c0: 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28 73  CompressTables(s
19d0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a  truct lemon *);.
19e0: 76 6f 69 64 20 52 65 73 6f 72 74 53 74 61 74 65  void ResortState
19f0: 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
1a00: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  );../********** 
1a10: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73  From the file "s
1a20: 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  et.h" **********
1a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1a50: 76 6f 69 64 20 20 53 65 74 53 69 7a 65 28 69 6e  void  SetSize(in
1a60: 74 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  t);             
1a70: 2f 2a 20 41 6c 6c 20 73 65 74 73 20 77 69 6c 6c  /* All sets will
1a80: 20 62 65 20 6f 66 20 73 69 7a 65 20 4e 20 2a 2f   be of size N */
1a90: 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f  .char *SetNew(vo
1aa0: 69 64 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  id);            
1ab0: 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 65 74 20     /* A new set 
1ac0: 66 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e 4e  for element 0..N
1ad0: 20 2a 2f 0a 76 6f 69 64 20 20 53 65 74 46 72 65   */.void  SetFre
1ae0: 65 28 63 68 61 72 2a 29 3b 20 20 20 20 20 20 20  e(char*);       
1af0: 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63        /* Dealloc
1b00: 61 74 65 20 61 20 73 65 74 20 2a 2f 0a 69 6e 74  ate a set */.int
1b10: 20 53 65 74 41 64 64 28 63 68 61 72 2a 2c 69 6e   SetAdd(char*,in
1b20: 74 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  t);            /
1b30: 2a 20 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f  * Add element to
1b40: 20 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65   a set */.int Se
1b50: 74 55 6e 69 6f 6e 28 63 68 61 72 20 2a 2c 63 68  tUnion(char *,ch
1b60: 61 72 20 2a 29 3b 20 20 20 20 2f 2a 20 41 20 3c  ar *);    /* A <
1b70: 2d 20 41 20 55 20 42 2c 20 74 68 72 75 20 65 6c  - A U B, thru el
1b80: 65 6d 65 6e 74 20 4e 20 2a 2f 0a 23 64 65 66 69  ement N */.#defi
1b90: 6e 65 20 53 65 74 46 69 6e 64 28 58 2c 59 29 20  ne SetFind(X,Y) 
1ba0: 28 58 5b 59 5d 29 20 20 20 20 20 20 20 2f 2a 20  (X[Y])       /* 
1bb0: 54 72 75 65 20 69 66 20 59 20 69 73 20 69 6e 20  True if Y is in 
1bc0: 73 65 74 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  set X */../*****
1bd0: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
1be0: 69 6c 65 20 22 73 74 72 75 63 74 2e 68 22 20 2a  ile "struct.h" *
1bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c10: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ****/./*.** Prin
1c20: 63 69 70 61 6c 20 64 61 74 61 20 73 74 72 75 63  cipal data struc
1c30: 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 4c 45  tures for the LE
1c40: 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
1c50: 61 74 6f 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65  ator..*/..typede
1c60: 66 20 65 6e 75 6d 20 7b 4c 45 4d 4f 4e 5f 46 41  f enum {LEMON_FA
1c70: 4c 53 45 3d 30 2c 20 4c 45 4d 4f 4e 5f 54 52 55  LSE=0, LEMON_TRU
1c80: 45 7d 20 42 6f 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20  E} Boolean;../* 
1c90: 53 79 6d 62 6f 6c 73 20 28 74 65 72 6d 69 6e 61  Symbols (termina
1ca0: 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e  ls and nontermin
1cb0: 61 6c 73 29 20 6f 66 20 74 68 65 20 67 72 61 6d  als) of the gram
1cc0: 6d 61 72 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  mar are stored.*
1cd0: 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * in the followi
1ce0: 6e 67 3a 20 2a 2f 0a 65 6e 75 6d 20 73 79 6d 62  ng: */.enum symb
1cf0: 6f 6c 5f 74 79 70 65 20 7b 0a 20 20 54 45 52 4d  ol_type {.  TERM
1d00: 49 4e 41 4c 2c 0a 20 20 4e 4f 4e 54 45 52 4d 49  INAL,.  NONTERMI
1d10: 4e 41 4c 2c 0a 20 20 4d 55 4c 54 49 54 45 52 4d  NAL,.  MULTITERM
1d20: 49 4e 41 4c 0a 7d 3b 0a 65 6e 75 6d 20 65 5f 61  INAL.};.enum e_a
1d30: 73 73 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c  ssoc {.    LEFT,
1d40: 0a 20 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20  .    RIGHT,.    
1d50: 4e 4f 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 7d 3b  NONE,.    UNK.};
1d60: 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 7b  .struct symbol {
1d70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e  .  const char *n
1d80: 61 6d 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ame;        /* N
1d90: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 6d 62 6f  ame of the symbo
1da0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78  l */.  int index
1db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dc0: 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20  /* Index number 
1dd0: 66 6f 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20  for this symbol 
1de0: 2a 2f 0a 20 20 65 6e 75 6d 20 73 79 6d 62 6f 6c  */.  enum symbol
1df0: 5f 74 79 70 65 20 74 79 70 65 3b 20 20 20 2f 2a  _type type;   /*
1e00: 20 53 79 6d 62 6f 6c 73 20 61 72 65 20 61 6c 6c   Symbols are all
1e10: 20 65 69 74 68 65 72 20 54 45 52 4d 49 4e 41 4c   either TERMINAL
1e20: 53 20 6f 72 20 4e 54 73 20 2a 2f 0a 20 20 73 74  S or NTs */.  st
1e30: 72 75 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b  ruct rule *rule;
1e40: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64         /* Linked
1e50: 20 6c 69 73 74 20 6f 66 20 72 75 6c 65 73 20 6f   list of rules o
1e60: 66 20 74 68 69 73 20 28 69 66 20 61 6e 20 4e 54  f this (if an NT
1e70: 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  ) */.  struct sy
1e80: 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20  mbol *fallback; 
1e90: 2f 2a 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65  /* fallback toke
1ea0: 6e 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 74  n in case this t
1eb0: 6f 6b 65 6e 20 64 6f 65 73 6e 27 74 20 70 61 72  oken doesn't par
1ec0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63  se */.  int prec
1ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ee0: 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65 20 69   /* Precedence i
1ef0: 66 20 64 65 66 69 6e 65 64 20 28 2d 31 20 6f 74  f defined (-1 ot
1f00: 68 65 72 77 69 73 65 29 20 2a 2f 0a 20 20 65 6e  herwise) */.  en
1f10: 75 6d 20 65 5f 61 73 73 6f 63 20 61 73 73 6f 63  um e_assoc assoc
1f20: 3b 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69  ;      /* Associ
1f30: 61 74 69 76 69 74 79 20 69 66 20 70 72 65 63 65  ativity if prece
1f40: 64 65 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64  dence is defined
1f50: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73   */.  char *firs
1f60: 74 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  tset;          /
1f70: 2a 20 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20  * First-set for 
1f80: 61 6c 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69  all rules of thi
1f90: 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f  s symbol */.  Bo
1fa0: 6f 6c 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20  olean lambda;   
1fb0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1fc0: 66 20 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e  f NT and can gen
1fd0: 65 72 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73  erate an empty s
1fe0: 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 75  tring */.  int u
1ff0: 73 65 43 6e 74 3b 20 20 20 20 20 20 20 20 20 20  seCnt;          
2000: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2010: 20 74 69 6d 65 73 20 75 73 65 64 20 2a 2f 0a 20   times used */. 
2020: 20 63 68 61 72 20 2a 64 65 73 74 72 75 63 74 6f   char *destructo
2030: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64  r;        /* Cod
2040: 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
2050: 20 77 68 65 6e 65 76 65 72 20 74 68 69 73 20 73   whenever this s
2060: 79 6d 62 6f 6c 20 69 73 0a 20 20 20 20 20 20 20  ymbol is.       
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 20 20 2a 2a 20 70 6f 70 70 65 64 20 66 72      ** popped fr
2090: 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 64 75 72  om the stack dur
20a0: 69 6e 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73  ing error proces
20b0: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sing */.  int de
20c0: 73 74 4c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20  stLineno;       
20d0: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
20e0: 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 64  r for start of d
20f0: 65 73 74 72 75 63 74 6f 72 2e 20 20 53 65 74 20  estructor.  Set 
2100: 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  to.             
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2120: 20 2d 31 20 66 6f 72 20 64 75 70 6c 69 63 61 74   -1 for duplicat
2130: 65 20 64 65 73 74 72 75 63 74 6f 72 73 2e 20 2a  e destructors. *
2140: 2f 0a 20 20 63 68 61 72 20 2a 64 61 74 61 74 79  /.  char *dataty
2150: 70 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pe;          /* 
2160: 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6f 66  The data type of
2170: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c   information hel
2180: 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 20 20  d by this.      
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20       ** object. 
21b0: 4f 6e 6c 79 20 75 73 65 64 20 69 66 20 74 79 70  Only used if typ
21c0: 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a  e==NONTERMINAL *
21d0: 2f 0a 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20  /.  int dtnum;  
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f0: 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6e 75  The data type nu
2200: 6d 62 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61  mber.  In the pa
2210: 72 73 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a  rser, the value.
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74             ** st
2240: 61 63 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20  ack is a union. 
2250: 20 54 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65   The .yy%d eleme
2260: 6e 74 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20  nt of this.     
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69        ** union i
2290: 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 64 61  s the correct da
22a0: 74 61 20 74 79 70 65 20 66 6f 72 20 74 68 69 73  ta type for this
22b0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a 20   object */.  /* 
22c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
22d0: 65 6c 64 73 20 61 72 65 20 75 73 65 64 20 62 79  elds are used by
22e0: 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73 20   MULTITERMINALs 
22f0: 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 73  only */.  int ns
2300: 75 62 73 79 6d 3b 20 20 20 20 20 20 20 20 20 20  ubsym;          
2310: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2320: 63 6f 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62  constituent symb
2330: 6f 6c 73 20 69 6e 20 74 68 65 20 4d 55 4c 54 49  ols in the MULTI
2340: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
2350: 62 6f 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20 2f  bol **subsym;  /
2360: 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6e 73 74  * Array of const
2370: 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 2a  ituent symbols *
2380: 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70 72  /.};../* Each pr
2390: 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 69 6e  oduction rule in
23a0: 20 74 68 65 20 67 72 61 6d 6d 61 72 20 69 73 20   the grammar is 
23b0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 66 6f  stored in the fo
23c0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
23d0: 74 75 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63 74  ture.  */.struct
23e0: 20 72 75 6c 65 20 7b 0a 20 20 73 74 72 75 63 74   rule {.  struct
23f0: 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20   symbol *lhs;   
2400: 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20     /* Left-hand 
2410: 73 69 64 65 20 6f 66 20 74 68 65 20 72 75 6c 65  side of the rule
2420: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2430: 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 2f   *lhsalias;    /
2440: 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20  * Alias for the 
2450: 4c 48 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e  LHS (NULL if non
2460: 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73 53  e) */.  int lhsS
2470: 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20  tart;           
2480: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 65 66 74   /* True if left
2490: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 74 68  -hand side is th
24a0: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a  e start symbol *
24b0: 2f 0a 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e 65  /.  int ruleline
24c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
24d0: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Line number for 
24e0: 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e  the rule */.  in
24f0: 74 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20  t nrhs;         
2500: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2510: 20 6f 66 20 52 48 53 20 73 79 6d 62 6f 6c 73 20   of RHS symbols 
2520: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
2530: 6f 6c 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f 2a  ol **rhs;     /*
2540: 20 54 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 73   The RHS symbols
2550: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2560: 20 2a 2a 72 68 73 61 6c 69 61 73 3b 20 20 20 2f   **rhsalias;   /
2570: 2a 20 41 6e 20 61 6c 69 61 73 20 66 6f 72 20 65  * An alias for e
2580: 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28  ach RHS symbol (
2590: 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f  NULL if none) */
25a0: 0a 20 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20 20  .  int line;    
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
25c0: 69 6e 65 20 6e 75 6d 62 65 72 20 61 74 20 77 68  ine number at wh
25d0: 69 63 68 20 63 6f 64 65 20 62 65 67 69 6e 73 20  ich code begins 
25e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
25f0: 2a 63 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a  *code;        /*
2600: 20 54 68 65 20 63 6f 64 65 20 65 78 65 63 75 74   The code execut
2610: 65 64 20 77 68 65 6e 20 74 68 69 73 20 72 75 6c  ed when this rul
2620: 65 20 69 73 20 72 65 64 75 63 65 64 20 2a 2f 0a  e is reduced */.
2630: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f    const char *co
2640: 64 65 50 72 65 66 69 78 3b 20 20 2f 2a 20 53 65  dePrefix;  /* Se
2650: 74 75 70 20 63 6f 64 65 20 62 65 66 6f 72 65 20  tup code before 
2660: 63 6f 64 65 5b 5d 20 61 62 6f 76 65 20 2a 2f 0a  code[] above */.
2670: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f    const char *co
2680: 64 65 53 75 66 66 69 78 3b 20 20 2f 2a 20 42 72  deSuffix;  /* Br
2690: 65 61 6b 64 6f 77 6e 20 63 6f 64 65 20 61 66 74  eakdown code aft
26a0: 65 72 20 63 6f 64 65 5b 5d 20 61 62 6f 76 65 20  er code[] above 
26b0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 64 65 3b  */.  int noCode;
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 72 75   True if this ru
26e0: 6c 65 20 68 61 73 20 6e 6f 20 61 73 73 6f 63 69  le has no associ
26f0: 61 74 65 64 20 43 20 63 6f 64 65 20 2a 2f 0a 20  ated C code */. 
2700: 20 69 6e 74 20 63 6f 64 65 45 6d 69 74 74 65 64   int codeEmitted
2710: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
2720: 65 20 69 66 20 74 68 65 20 63 6f 64 65 20 68 61  e if the code ha
2730: 73 20 62 65 65 6e 20 65 6d 69 74 74 65 64 20 61  s been emitted a
2740: 6c 72 65 61 64 79 20 2a 2f 0a 20 20 73 74 72 75  lready */.  stru
2750: 63 74 20 73 79 6d 62 6f 6c 20 2a 70 72 65 63 73  ct symbol *precs
2760: 79 6d 3b 20 20 2f 2a 20 50 72 65 63 65 64 65 6e  ym;  /* Preceden
2770: 63 65 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68  ce symbol for th
2780: 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74  is rule */.  int
2790: 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20   index;         
27a0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65        /* An inde
27b0: 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  x number for thi
27c0: 73 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s rule */.  int 
27d0: 69 52 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20  iRule;          
27e0: 20 20 20 20 20 2f 2a 20 52 75 6c 65 20 6e 75 6d       /* Rule num
27f0: 62 65 72 20 61 73 20 75 73 65 64 20 69 6e 20 74  ber as used in t
2800: 68 65 20 67 65 6e 65 72 61 74 65 64 20 74 61 62  he generated tab
2810: 6c 65 73 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e  les */.  Boolean
2820: 20 63 61 6e 52 65 64 75 63 65 3b 20 20 20 20 20   canReduce;     
2830: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2840: 73 20 72 75 6c 65 20 69 73 20 65 76 65 72 20 72  s rule is ever r
2850: 65 64 75 63 65 64 20 2a 2f 0a 20 20 42 6f 6f 6c  educed */.  Bool
2860: 65 61 6e 20 64 6f 65 73 52 65 64 75 63 65 3b 20  ean doesReduce; 
2870: 20 20 20 20 20 2f 2a 20 52 65 64 75 63 65 20 61       /* Reduce a
2880: 63 74 69 6f 6e 73 20 6f 63 63 75 72 20 61 66 74  ctions occur aft
2890: 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
28a0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
28b0: 20 2a 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a   *nextlhs;    /*
28c0: 20 4e 65 78 74 20 72 75 6c 65 20 77 69 74 68 20   Next rule with 
28d0: 74 68 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a  the same LHS */.
28e0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e    struct rule *n
28f0: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  ext;       /* Ne
2900: 78 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67  xt rule in the g
2910: 6c 6f 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b  lobal list */.};
2920: 0a 0a 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72 61  ../* A configura
2930: 74 69 6f 6e 20 69 73 20 61 20 70 72 6f 64 75 63  tion is a produc
2940: 74 69 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68 65  tion rule of the
2950: 20 67 72 61 6d 6d 61 72 20 74 6f 67 65 74 68 65   grammar togethe
2960: 72 20 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b  r with.** a mark
2970: 20 28 64 6f 74 29 20 73 68 6f 77 69 6e 67 20 68   (dot) showing h
2980: 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 61 74 20  ow much of that 
2990: 72 75 6c 65 20 68 61 73 20 62 65 65 6e 20 70 72  rule has been pr
29a0: 6f 63 65 73 73 65 64 20 73 6f 20 66 61 72 2e 0a  ocessed so far..
29b0: 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ** Configuration
29c0: 73 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61  s also contain a
29d0: 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63   follow-set whic
29e0: 68 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  h is a list of t
29f0: 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f  erminal.** symbo
2a00: 6c 73 20 77 68 69 63 68 20 61 72 65 20 61 6c 6c  ls which are all
2a10: 6f 77 65 64 20 74 6f 20 69 6d 6d 65 64 69 61 74  owed to immediat
2a20: 65 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65  ely follow the e
2a30: 6e 64 20 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a  nd of the rule..
2a40: 2a 2a 20 45 76 65 72 79 20 63 6f 6e 66 69 67 75  ** Every configu
2a50: 72 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64  ration is record
2a60: 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63  ed as an instanc
2a70: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2a80: 6e 67 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67 73  ng: */.enum cfgs
2a90: 74 61 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c 45  tatus {.  COMPLE
2aa0: 54 45 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54 45  TE,.  INCOMPLETE
2ab0: 0a 7d 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  .};.struct confi
2ac0: 67 20 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  g {.  struct rul
2ad0: 65 20 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f  e *rp;         /
2ae0: 2a 20 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20  * The rule upon 
2af0: 77 68 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67  which the config
2b00: 75 72 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64  uration is based
2b10: 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20   */.  int dot;  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b30: 2a 20 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e  * The parse poin
2b40: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73  t */.  char *fws
2b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b60: 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f  /* Follow-set fo
2b70: 72 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61  r this configura
2b80: 74 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73  tion only */.  s
2b90: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c  truct plink *fpl
2ba0: 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f  p;      /* Follo
2bb0: 77 2d 73 65 74 20 66 6f 72 77 61 72 64 20 70 72  w-set forward pr
2bc0: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20  opagation links 
2bd0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  */.  struct plin
2be0: 6b 20 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a  k *bplp;      /*
2bf0: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b   Follow-set back
2c00: 77 61 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f  wards propagatio
2c10: 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72  n links */.  str
2c20: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
2c30: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2c40: 20 74 6f 20 73 74 61 74 65 20 77 68 69 63 68 20   to state which 
2c50: 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f  contains this */
2c60: 0a 20 20 65 6e 75 6d 20 63 66 67 73 74 61 74 75  .  enum cfgstatu
2c70: 73 20 73 74 61 74 75 73 3b 20 20 20 2f 2a 20 75  s status;   /* u
2c80: 73 65 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f  sed during follo
2c90: 77 73 65 74 20 61 6e 64 20 73 68 69 66 74 20 63  wset and shift c
2ca0: 6f 6d 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20  omputations */. 
2cb0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
2cc0: 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78  next;     /* Nex
2cd0: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t configuration 
2ce0: 69 6e 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a  in the state */.
2cf0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
2d00: 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *bp;       /* Th
2d10: 65 20 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e  e next basis con
2d20: 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b  figuration */.};
2d30: 0a 0a 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20  ..enum e_action 
2d40: 7b 0a 20 20 53 48 49 46 54 2c 0a 20 20 41 43 43  {.  SHIFT,.  ACC
2d50: 45 50 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a 20  EPT,.  REDUCE,. 
2d60: 20 45 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e 46   ERROR,.  SSCONF
2d70: 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20  LICT,           
2d80: 20 20 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68     /* A shift/sh
2d90: 69 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ift conflict */.
2da0: 20 20 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20    SRCONFLICT,   
2db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
2dc0: 73 20 61 20 72 65 64 75 63 65 2c 20 62 75 74 20  s a reduce, but 
2dd0: 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69  part of a confli
2de0: 63 74 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c 49  ct */.  RRCONFLI
2df0: 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CT,             
2e00: 20 2f 2a 20 57 61 73 20 61 20 72 65 64 75 63 65   /* Was a reduce
2e10: 2c 20 62 75 74 20 70 61 72 74 20 6f 66 20 61 20  , but part of a 
2e20: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 48  conflict */.  SH
2e30: 5f 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20  _RESOLVED,      
2e40: 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20         /* Was a 
2e50: 73 68 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e  shift.  Preceden
2e60: 63 65 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66  ce resolved conf
2e70: 6c 69 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45 53  lict */.  RD_RES
2e80: 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20 20  OLVED,          
2e90: 20 20 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65     /* Was reduce
2ea0: 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20 72 65  .  Precedence re
2eb0: 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20  solved conflict 
2ec0: 2a 2f 0a 20 20 4e 4f 54 5f 55 53 45 44 2c 20 20  */.  NOT_USED,  
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ee0: 20 44 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70   Deleted by comp
2ef0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 48 49  ression */.  SHI
2f00: 46 54 52 45 44 55 43 45 20 20 20 20 20 20 20 20  FTREDUCE        
2f10: 20 20 20 20 20 20 2f 2a 20 53 68 69 66 74 20 66        /* Shift f
2f20: 69 72 73 74 2c 20 74 68 65 6e 20 72 65 64 75 63  irst, then reduc
2f30: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72  e */.};../* Ever
2f40: 79 20 73 68 69 66 74 20 6f 72 20 72 65 64 75 63  y shift or reduc
2f50: 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73  e operation is s
2f60: 74 6f 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20  tored as one of 
2f70: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
2f80: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b  .struct action {
2f90: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
2fa0: 20 2a 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *sp;       /* T
2fb0: 68 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79  he look-ahead sy
2fc0: 6d 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65  mbol */.  enum e
2fd0: 5f 61 63 74 69 6f 6e 20 74 79 70 65 3b 0a 20 20  _action type;.  
2fe0: 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75  union {.    stru
2ff0: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
3000: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 73 74     /* The new st
3010: 61 74 65 2c 20 69 66 20 61 20 73 68 69 66 74 20  ate, if a shift 
3020: 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 72 75  */.    struct ru
3030: 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20 2f 2a  le *rp;       /*
3040: 20 54 68 65 20 72 75 6c 65 2c 20 69 66 20 61 20   The rule, if a 
3050: 72 65 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78 3b  reduce */.  } x;
3060: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
3070: 20 2a 73 70 4f 70 74 3b 20 20 20 20 2f 2a 20 53   *spOpt;    /* S
3080: 48 49 46 54 52 45 44 55 43 45 20 6f 70 74 69 6d  HIFTREDUCE optim
3090: 69 7a 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  ization to this 
30a0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75  symbol */.  stru
30b0: 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b  ct action *next;
30c0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 63 74       /* Next act
30d0: 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 73 74 61  ion for this sta
30e0: 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61  te */.  struct a
30f0: 63 74 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20  ction *collide; 
3100: 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20   /* Next action 
3110: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
3120: 73 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63  sh */.};../* Eac
3130: 68 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 67  h state of the g
3140: 65 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 27  enerated parser'
3150: 73 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d  s finite state m
3160: 61 63 68 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63  achine.** is enc
3170: 6f 64 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61  oded as an insta
3180: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
3190: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  wing structure. 
31a0: 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  */.struct state 
31b0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
31c0: 67 20 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20  g *bp;       /* 
31d0: 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67  The basis config
31e0: 75 72 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 69  urations for thi
31f0: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  s state */.  str
3200: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
3210: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e        /* All con
3220: 66 69 67 75 72 61 74 69 6f 6e 73 20 69 6e 20 74  figurations in t
3230: 68 69 73 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  his set */.  int
3240: 20 73 74 61 74 65 6e 75 6d 3b 20 20 20 20 20 20   statenum;      
3250: 20 20 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 74        /* Sequent
3260: 69 61 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ial number for t
3270: 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73  his state */.  s
3280: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
3290: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
32a0: 6f 66 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74  of actions for t
32b0: 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 69  his state */.  i
32c0: 6e 74 20 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41  nt nTknAct, nNtA
32d0: 63 74 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ct;     /* Numbe
32e0: 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20  r of actions on 
32f0: 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f  terminals and no
3300: 6e 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20  nterminals */.  
3310: 69 6e 74 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e  int iTknOfst, iN
3320: 74 4f 66 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61  tOfst;   /* yy_a
3330: 63 74 69 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66  ction[] offset f
3340: 6f 72 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64  or terminals and
3350: 20 6e 6f 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69   nonterms */.  i
3360: 6e 74 20 69 44 66 6c 74 52 65 64 75 63 65 3b 20  nt iDfltReduce; 
3370: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75          /* Defau
3380: 6c 74 20 61 63 74 69 6f 6e 20 69 73 20 74 6f 20  lt action is to 
3390: 52 45 44 55 43 45 20 62 79 20 74 68 69 73 20 72  REDUCE by this r
33a0: 75 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ule */.  struct 
33b0: 72 75 6c 65 20 2a 70 44 66 6c 74 52 65 64 75 63  rule *pDfltReduc
33c0: 65 3b 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74  e;/* The default
33d0: 20 52 45 44 55 43 45 20 72 75 6c 65 2e 20 2a 2f   REDUCE rule. */
33e0: 0a 20 20 69 6e 74 20 61 75 74 6f 52 65 64 75 63  .  int autoReduc
33f0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
3400: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
3410: 6e 20 61 75 74 6f 2d 72 65 64 75 63 65 20 73 74  n auto-reduce st
3420: 61 74 65 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e  ate */.};.#defin
3430: 65 20 4e 4f 5f 4f 46 46 53 45 54 20 28 2d 32 31  e NO_OFFSET (-21
3440: 34 37 34 38 33 36 34 37 29 0a 0a 2f 2a 20 41 20  47483647)../* A 
3450: 66 6f 6c 6c 6f 77 73 65 74 20 70 72 6f 70 61 67  followset propag
3460: 61 74 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64 69 63  ation link indic
3470: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  ates that the co
3480: 6e 74 65 6e 74 73 20 6f 66 20 6f 6e 65 0a 2a 2a  ntents of one.**
3490: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
34a0: 6f 6c 6c 6f 77 73 65 74 20 73 68 6f 75 6c 64 20  ollowset should 
34b0: 62 65 20 70 72 6f 70 61 67 61 74 65 64 20 74 6f  be propagated to
34c0: 20 61 6e 6f 74 68 65 72 20 77 68 65 6e 65 76 65   another wheneve
34d0: 72 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  r.** the first c
34e0: 68 61 6e 67 65 73 2e 20 2a 2f 0a 73 74 72 75 63  hanges. */.struc
34f0: 74 20 70 6c 69 6e 6b 20 7b 0a 20 20 73 74 72 75  t plink {.  stru
3500: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20  ct config *cfp; 
3510: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66       /* The conf
3520: 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 77 68 69  iguration to whi
3530: 63 68 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20 20 73  ch linked */.  s
3540: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78  truct plink *nex
3550: 74 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  t;      /* The n
3560: 65 78 74 20 70 72 6f 70 61 67 61 74 65 20 6c 69  ext propagate li
3570: 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  nk */.};../* The
3580: 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f   state vector fo
3590: 72 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 72  r the entire par
35a0: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 73  ser generator is
35b0: 20 72 65 63 6f 72 64 65 64 20 61 73 0a 2a 2a 20   recorded as.** 
35c0: 66 6f 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d 4f 4e  follows.  (LEMON
35d0: 20 75 73 65 73 20 6e 6f 20 67 6c 6f 62 61 6c 20   uses no global 
35e0: 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6d 61  variables and ma
35f0: 6b 65 73 20 6c 69 74 74 6c 65 20 75 73 65 20 6f  kes little use o
3600: 66 0a 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69  f.** static vari
3610: 61 62 6c 65 73 2e 20 20 46 69 65 6c 64 73 20 69  ables.  Fields i
3620: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
3630: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
3640: 20 74 68 6f 75 67 68 74 0a 2a 2a 20 6f 66 20 61   thought.** of a
3650: 73 20 62 65 67 69 6e 20 67 6c 6f 62 61 6c 20 76  s begin global v
3660: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
3670: 70 72 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73 74 72  program.) */.str
3680: 75 63 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20 73 74  uct lemon {.  st
3690: 72 75 63 74 20 73 74 61 74 65 20 2a 2a 73 6f 72  ruct state **sor
36a0: 74 65 64 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20  ted;   /* Table 
36b0: 6f 66 20 73 74 61 74 65 73 20 73 6f 72 74 65 64  of states sorted
36c0: 20 62 79 20 73 74 61 74 65 20 6e 75 6d 62 65 72   by state number
36d0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
36e0: 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f  e *rule;       /
36f0: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 72 75  * List of all ru
3700: 6c 65 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  les */.  struct 
3710: 72 75 6c 65 20 2a 73 74 61 72 74 52 75 6c 65 3b  rule *startRule;
3720: 20 20 2f 2a 20 46 69 72 73 74 20 72 75 6c 65 20    /* First rule 
3730: 2a 2f 0a 20 20 69 6e 74 20 6e 73 74 61 74 65 3b  */.  int nstate;
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3750: 20 4e 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65   Number of state
3760: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 73 74 61  s */.  int nxsta
3770: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
3780: 2f 2a 20 6e 73 74 61 74 65 20 77 69 74 68 20 74  /* nstate with t
3790: 61 69 6c 20 64 65 67 65 6e 65 72 61 74 65 20 73  ail degenerate s
37a0: 74 61 74 65 73 20 72 65 6d 6f 76 65 64 20 2a 2f  tates removed */
37b0: 0a 20 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20 20  .  int nrule;   
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37d0: 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73 20 2a  umber of rules *
37e0: 2f 0a 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b  /.  int nsymbol;
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3800: 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 69 6e  Number of termin
3810: 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e  al and nontermin
3820: 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  al symbols */.  
3830: 69 6e 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20 20  int nterminal;  
3840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3850: 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73  er of terminal s
3860: 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75  ymbols */.  stru
3870: 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d 62  ct symbol **symb
3880: 6f 6c 73 3b 20 2f 2a 20 53 6f 72 74 65 64 20 61  ols; /* Sorted a
3890: 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
38a0: 20 74 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20   to symbols */. 
38b0: 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20   int errorcnt;  
38c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
38d0: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  ber of errors */
38e0: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
38f0: 20 2a 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20 54   *errsym;   /* T
3900: 68 65 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c 20  he error symbol 
3910: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
3920: 6f 6c 20 2a 77 69 6c 64 63 61 72 64 3b 20 2f 2a  ol *wildcard; /*
3930: 20 54 6f 6b 65 6e 20 74 68 61 74 20 6d 61 74 63   Token that matc
3940: 68 65 73 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  hes anything */.
3950: 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20    char *name;   
3960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
3970: 6d 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  me of the genera
3980: 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 20 20  ted parser */.  
3990: 63 68 61 72 20 2a 61 72 67 3b 20 20 20 20 20 20  char *arg;      
39a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6c           /* Decl
39b0: 61 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 33  aration of the 3
39c0: 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70  th argument to p
39d0: 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  arser */.  char 
39e0: 2a 74 6f 6b 65 6e 74 79 70 65 3b 20 20 20 20 20  *tokentype;     
39f0: 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
3a00: 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20  erminal symbols 
3a10: 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 73 74  in the parser st
3a20: 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 76  ack */.  char *v
3a30: 61 72 74 79 70 65 3b 20 20 20 20 20 20 20 20 20  artype;         
3a40: 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
3a50: 20 74 79 70 65 20 6f 66 20 6e 6f 6e 2d 74 65 72   type of non-ter
3a60: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f  minal symbols */
3a70: 0a 20 20 63 68 61 72 20 2a 73 74 61 72 74 3b 20  .  char *start; 
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3a90: 61 6d 65 20 6f 66 20 74 68 65 20 73 74 61 72 74  ame of the start
3aa0: 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 65 20   symbol for the 
3ab0: 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 63 68 61  grammar */.  cha
3ac0: 72 20 2a 73 74 61 63 6b 73 69 7a 65 3b 20 20 20  r *stacksize;   
3ad0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
3ae0: 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61 63   the parser stac
3af0: 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 69 6e 63  k */.  char *inc
3b00: 6c 75 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  lude;           
3b10: 2f 2a 20 43 6f 64 65 20 74 6f 20 70 75 74 20 61  /* Code to put a
3b20: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
3b30: 68 65 20 43 20 66 69 6c 65 20 2a 2f 0a 20 20 63  he C file */.  c
3b40: 68 61 72 20 2a 65 72 72 6f 72 3b 20 20 20 20 20  har *error;     
3b50: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
3b60: 74 6f 20 65 78 65 63 75 74 65 20 77 68 65 6e 20  to execute when 
3b70: 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e  an error is seen
3b80: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 76 65 72   */.  char *over
3b90: 66 6c 6f 77 3b 20 20 20 20 20 20 20 20 20 20 2f  flow;          /
3ba0: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
3bb0: 65 20 6f 6e 20 61 20 73 74 61 63 6b 20 6f 76 65  e on a stack ove
3bc0: 72 66 6c 6f 77 20 2a 2f 0a 20 20 63 68 61 72 20  rflow */.  char 
3bd0: 2a 66 61 69 6c 75 72 65 3b 20 20 20 20 20 20 20  *failure;       
3be0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65      /* Code to e
3bf0: 78 65 63 75 74 65 20 6f 6e 20 70 61 72 73 65 72  xecute on parser
3c00: 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 63 68   failure */.  ch
3c10: 61 72 20 2a 61 63 63 65 70 74 3b 20 20 20 20 20  ar *accept;     
3c20: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
3c30: 6f 20 65 78 65 63 75 74 65 20 77 68 65 6e 20 74  o execute when t
3c40: 68 65 20 70 61 72 73 65 72 20 65 78 63 65 70 74  he parser except
3c50: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 78 74  s */.  char *ext
3c60: 72 61 63 6f 64 65 3b 20 20 20 20 20 20 20 20 20  racode;         
3c70: 2f 2a 20 43 6f 64 65 20 61 70 70 65 6e 64 65 64  /* Code appended
3c80: 20 74 6f 20 74 68 65 20 67 65 6e 65 72 61 74 65   to the generate
3c90: 64 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  d file */.  char
3ca0: 20 2a 74 6f 6b 65 6e 64 65 73 74 3b 20 20 20 20   *tokendest;    
3cb0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
3cc0: 65 78 65 63 75 74 65 20 74 6f 20 64 65 73 74 72  execute to destr
3cd0: 6f 79 20 74 6f 6b 65 6e 20 64 61 74 61 20 2a 2f  oy token data */
3ce0: 0a 20 20 63 68 61 72 20 2a 76 61 72 64 65 73 74  .  char *vardest
3cf0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
3d00: 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65 66 61  ode for the defa
3d10: 75 6c 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  ult non-terminal
3d20: 20 64 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20   destructor */. 
3d30: 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b   char *filename;
3d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
3d50: 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66  e of the input f
3d60: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f  ile */.  char *o
3d70: 75 74 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  utname;         
3d80: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3d90: 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20   current output 
3da0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
3db0: 74 6f 6b 65 6e 70 72 65 66 69 78 3b 20 20 20 20  tokenprefix;    
3dc0: 20 20 20 2f 2a 20 41 20 70 72 65 66 69 78 20 61     /* A prefix a
3dd0: 64 64 65 64 20 74 6f 20 74 6f 6b 65 6e 20 6e 61  dded to token na
3de0: 6d 65 73 20 69 6e 20 74 68 65 20 2e 68 20 66 69  mes in the .h fi
3df0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e  le */.  int ncon
3e00: 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 20 20  flict;          
3e10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
3e20: 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20  rsing conflicts 
3e30: 2a 2f 0a 20 20 69 6e 74 20 6e 61 63 74 69 6f 6e  */.  int naction
3e40: 74 61 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tab;          /*
3e50: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
3e60: 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74  es in the yy_act
3e70: 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20  ion[] table */. 
3e80: 20 69 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b 20   int tablesize; 
3e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
3ea0: 61 6c 20 74 61 62 6c 65 20 73 69 7a 65 20 6f 66  al table size of
3eb0: 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 62   all tables in b
3ec0: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 61  ytes */.  int ba
3ed0: 73 69 73 66 6c 61 67 3b 20 20 20 20 20 20 20 20  sisflag;        
3ee0: 20 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e 6c 79     /* Print only
3ef0: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
3f00: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 68  tions */.  int h
3f10: 61 73 5f 66 61 6c 6c 62 61 63 6b 3b 20 20 20 20  as_fallback;    
3f20: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
3f30: 6e 79 20 25 66 61 6c 6c 62 61 63 6b 20 69 73 20  ny %fallback is 
3f40: 73 65 65 6e 20 69 6e 20 74 68 65 20 67 72 61 6d  seen in the gram
3f50: 6d 61 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 6c  mar */.  int nol
3f60: 69 6e 65 6e 6f 73 66 6c 61 67 3b 20 20 20 20 20  inenosflag;     
3f70: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 23 6c 69    /* True if #li
3f80: 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 20 73 68  ne statements sh
3f90: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 72 69 6e  ould not be prin
3fa0: 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ted */.  char *a
3fb0: 72 67 76 30 3b 20 20 20 20 20 20 20 20 20 20 20  rgv0;           
3fc0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
3fd0: 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a   program */.};..
3fe0: 23 64 65 66 69 6e 65 20 4d 65 6d 6f 72 79 43 68  #define MemoryCh
3ff0: 65 63 6b 28 58 29 20 69 66 28 28 58 29 3d 3d 30  eck(X) if((X)==0
4000: 29 7b 20 5c 0a 20 20 65 78 74 65 72 6e 20 76 6f  ){ \.  extern vo
4010: 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  id memory_error(
4020: 29 3b 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f 65 72  ); \.  memory_er
4030: 72 6f 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a  ror(); \.}../***
4040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
4050: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74 61 62  om the file "tab
4060: 6c 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le.h" **********
4070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4080: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41  *******/./*.** A
4090: 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20  ll code in this 
40a0: 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75  file has been au
40b0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
40c0: 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20  rated.** from a 
40d0: 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e  specification in
40e0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20   the file.**    
40f0: 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
4100: 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73  .q".** by the as
4110: 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
4120: 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72  code building pr
4130: 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a  ogram "aagen"..*
4140: 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68  * Do not edit th
4150: 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61  is file!  Instea
4160: 64 2c 20 65 64 69 74 20 74 68 65 20 73 70 65 63  d, edit the spec
4170: 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c  ification.** fil
4180: 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61  e, then rerun aa
4190: 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f  gen..*/./*.** Co
41a0: 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  de for processin
41b0: 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  g tables in the 
41c0: 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
41d0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 2f 2a 20 52 6f  erator..*/./* Ro
41e0: 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c  utines for handl
41f0: 69 6e 67 20 61 20 73 74 72 69 6e 67 73 20 2a 2f  ing a strings */
4200: 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74  ..const char *St
4210: 72 73 61 66 65 28 63 6f 6e 73 74 20 63 68 61 72  rsafe(const char
4220: 20 2a 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73 61   *);..void Strsa
4230: 66 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69  fe_init(void);.i
4240: 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72  nt Strsafe_inser
4250: 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  t(const char *);
4260: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72  .const char *Str
4270: 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20  safe_find(const 
4280: 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 20 52 6f 75  char *);../* Rou
4290: 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69  tines for handli
42a0: 6e 67 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68  ng symbols of th
42b0: 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73 74  e grammar */..st
42c0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
42d0: 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74 20 63 68  bol_new(const ch
42e0: 61 72 20 2a 29 3b 0a 69 6e 74 20 53 79 6d 62 6f  ar *);.int Symbo
42f0: 6c 63 6d 70 70 28 63 6f 6e 73 74 20 76 6f 69 64  lcmpp(const void
4300: 20 2a 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   *, const void *
4310: 29 3b 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69  );.void Symbol_i
4320: 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53  nit(void);.int S
4330: 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72  ymbol_insert(str
4340: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2c 20 63 6f  uct symbol *, co
4350: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72  nst char *);.str
4360: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
4370: 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68  ol_find(const ch
4380: 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 79  ar *);.struct sy
4390: 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68  mbol *Symbol_Nth
43a0: 28 69 6e 74 29 3b 0a 69 6e 74 20 53 79 6d 62 6f  (int);.int Symbo
43b0: 6c 5f 63 6f 75 6e 74 28 76 6f 69 64 29 3b 0a 73  l_count(void);.s
43c0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53  truct symbol **S
43d0: 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 76 6f  ymbol_arrayof(vo
43e0: 69 64 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65  id);../* Routine
43f0: 73 20 74 6f 20 6d 61 6e 61 67 65 20 74 68 65 20  s to manage the 
4400: 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 0a  state table */..
4410: 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 63 6f  int Configcmp(co
4420: 6e 73 74 20 63 68 61 72 20 2a 2c 20 63 6f 6e 73  nst char *, cons
4430: 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72 75 63  t char *);.struc
4440: 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e  t state *State_n
4450: 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 53  ew(void);.void S
4460: 74 61 74 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b  tate_init(void);
4470: 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72  .int State_inser
4480: 74 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  t(struct state *
4490: 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
44a0: 2a 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65  *);.struct state
44b0: 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 73 74 72   *State_find(str
44c0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73  uct config *);.s
44d0: 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74  truct state **St
44e0: 61 74 65 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20  ate_arrayof(/*  
44f0: 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65  */);../* Routine
4500: 73 20 75 73 65 64 20 66 6f 72 20 65 66 66 69 63  s used for effic
4510: 69 65 6e 63 79 20 69 6e 20 43 6f 6e 66 69 67 6c  iency in Configl
4520: 69 73 74 5f 61 64 64 20 2a 2f 0a 0a 76 6f 69 64  ist_add */..void
4530: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69   Configtable_ini
4540: 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 43 6f 6e  t(void);.int Con
4550: 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
4560: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
4570: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
4580: 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e  *Configtable_fin
4590: 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  d(struct config 
45a0: 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74  *);.void Configt
45b0: 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74 28 2a  able_clear(int(*
45c0: 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  )(struct config 
45d0: 2a 29 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *));../*********
45e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
45f0: 68 65 20 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e  he file "action.
4600: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
4610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4620: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  **/./*.** Routin
4630: 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20 70 61  es processing pa
4640: 72 73 65 72 20 61 63 74 69 6f 6e 73 20 69 6e 20  rser actions in 
4650: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
4660: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
4670: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
4680: 77 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 20  w parser action 
4690: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
46a0: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
46b0: 6e 65 77 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  new(void){.  sta
46c0: 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f  tic struct actio
46d0: 6e 20 2a 66 72 65 65 6c 69 73 74 20 3d 20 30 3b  n *freelist = 0;
46e0: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
46f0: 20 2a 6e 65 77 61 63 74 69 6f 6e 3b 0a 0a 20 20   *newaction;..  
4700: 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20  if( freelist==0 
4710: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
4720: 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b    int amt = 100;
4730: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20  .    freelist = 
4740: 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  (struct action *
4750: 29 63 61 6c 6c 6f 63 28 61 6d 74 2c 20 73 69 7a  )calloc(amt, siz
4760: 65 6f 66 28 73 74 72 75 63 74 20 61 63 74 69 6f  eof(struct actio
4770: 6e 29 29 3b 0a 20 20 20 20 69 66 28 20 66 72 65  n));.    if( fre
4780: 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
4790: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
47a0: 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  ,"Unable to allo
47b0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
47c0: 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63 74  a new parser act
47d0: 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65 78  ion.");.      ex
47e0: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
47f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d   for(i=0; i<amt-
4800: 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69 73 74  1; i++) freelist
4810: 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65 65  [i].next = &free
4820: 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66  list[i+1];.    f
4830: 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e  reelist[amt-1].n
4840: 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ext = 0;.  }.  n
4850: 65 77 61 63 74 69 6f 6e 20 3d 20 66 72 65 65 6c  ewaction = freel
4860: 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20  ist;.  freelist 
4870: 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74  = freelist->next
4880: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 61 63  ;.  return newac
4890: 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70  tion;.}../* Comp
48a0: 61 72 65 20 74 77 6f 20 61 63 74 69 6f 6e 73 20  are two actions 
48b0: 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70  for sorting purp
48c0: 6f 73 65 73 2e 20 20 52 65 74 75 72 6e 20 6e 65  oses.  Return ne
48d0: 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
48e0: 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 69 66 20  .** positive if 
48f0: 74 68 65 20 66 69 72 73 74 20 61 63 74 69 6f 6e  the first action
4900: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
4910: 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
4920: 74 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ter than.** the 
4930: 66 69 72 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  first.*/.static 
4940: 69 6e 74 20 61 63 74 69 6f 6e 63 6d 70 28 0a 20  int actioncmp(. 
4950: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
4960: 61 70 31 2c 0a 20 20 73 74 72 75 63 74 20 61 63  ap1,.  struct ac
4970: 74 69 6f 6e 20 2a 61 70 32 0a 29 7b 0a 20 20 69  tion *ap2.){.  i
4980: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 61 70  nt rc;.  rc = ap
4990: 31 2d 3e 73 70 2d 3e 69 6e 64 65 78 20 2d 20 61  1->sp->index - a
49a0: 70 32 2d 3e 73 70 2d 3e 69 6e 64 65 78 3b 0a 20  p2->sp->index;. 
49b0: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
49c0: 20 20 72 63 20 3d 20 28 69 6e 74 29 61 70 31 2d    rc = (int)ap1-
49d0: 3e 74 79 70 65 20 2d 20 28 69 6e 74 29 61 70 32  >type - (int)ap2
49e0: 2d 3e 74 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66  ->type;.  }.  if
49f0: 28 20 72 63 3d 3d 30 20 26 26 20 28 61 70 31 2d  ( rc==0 && (ap1-
4a00: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 7c 7c  >type==REDUCE ||
4a10: 20 61 70 31 2d 3e 74 79 70 65 3d 3d 53 48 49 46   ap1->type==SHIF
4a20: 54 52 45 44 55 43 45 29 20 29 7b 0a 20 20 20 20  TREDUCE) ){.    
4a30: 72 63 20 3d 20 61 70 31 2d 3e 78 2e 72 70 2d 3e  rc = ap1->x.rp->
4a40: 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e 78 2e 72  index - ap2->x.r
4a50: 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  p->index;.  }.  
4a60: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
4a70: 20 72 63 20 3d 20 28 69 6e 74 29 20 28 61 70 32   rc = (int) (ap2
4a80: 20 2d 20 61 70 31 29 3b 0a 20 20 7d 0a 20 20 72   - ap1);.  }.  r
4a90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
4aa0: 53 6f 72 74 20 70 61 72 73 65 72 20 61 63 74 69  Sort parser acti
4ab0: 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ons */.static st
4ac0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74  ruct action *Act
4ad0: 69 6f 6e 5f 73 6f 72 74 28 0a 20 20 73 74 72 75  ion_sort(.  stru
4ae0: 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 0a 29 7b  ct action *ap.){
4af0: 0a 20 20 61 70 20 3d 20 28 73 74 72 75 63 74 20  .  ap = (struct 
4b00: 61 63 74 69 6f 6e 20 2a 29 6d 73 6f 72 74 28 28  action *)msort((
4b10: 63 68 61 72 20 2a 29 61 70 2c 28 63 68 61 72 20  char *)ap,(char 
4b20: 2a 2a 29 26 61 70 2d 3e 6e 65 78 74 2c 0a 20 20  **)&ap->next,.  
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
4b50: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
4b60: 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 63 74  const char*))act
4b70: 69 6f 6e 63 6d 70 29 3b 0a 20 20 72 65 74 75 72  ioncmp);.  retur
4b80: 6e 20 61 70 3b 0a 7d 0a 0a 76 6f 69 64 20 41 63  n ap;.}..void Ac
4b90: 74 69 6f 6e 5f 61 64 64 28 0a 20 20 73 74 72 75  tion_add(.  stru
4ba0: 63 74 20 61 63 74 69 6f 6e 20 2a 2a 61 70 70 2c  ct action **app,
4bb0: 0a 20 20 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e  .  enum e_action
4bc0: 20 74 79 70 65 2c 0a 20 20 73 74 72 75 63 74 20   type,.  struct 
4bd0: 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20 63 68  symbol *sp,.  ch
4be0: 61 72 20 2a 61 72 67 0a 29 7b 0a 20 20 73 74 72  ar *arg.){.  str
4bf0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 61  uct action *newa
4c00: 63 74 69 6f 6e 3b 0a 20 20 6e 65 77 61 63 74 69  ction;.  newacti
4c10: 6f 6e 20 3d 20 41 63 74 69 6f 6e 5f 6e 65 77 28  on = Action_new(
4c20: 29 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e  );.  newaction->
4c30: 6e 65 78 74 20 3d 20 2a 61 70 70 3b 0a 20 20 2a  next = *app;.  *
4c40: 61 70 70 20 3d 20 6e 65 77 61 63 74 69 6f 6e 3b  app = newaction;
4c50: 0a 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 74 79  .  newaction->ty
4c60: 70 65 20 3d 20 74 79 70 65 3b 0a 20 20 6e 65 77  pe = type;.  new
4c70: 61 63 74 69 6f 6e 2d 3e 73 70 20 3d 20 73 70 3b  action->sp = sp;
4c80: 0a 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 73 70  .  newaction->sp
4c90: 4f 70 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 74  Opt = 0;.  if( t
4ca0: 79 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20  ype==SHIFT ){.  
4cb0: 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78 2e 73    newaction->x.s
4cc0: 74 70 20 3d 20 28 73 74 72 75 63 74 20 73 74 61  tp = (struct sta
4cd0: 74 65 20 2a 29 61 72 67 3b 0a 20 20 7d 65 6c 73  te *)arg;.  }els
4ce0: 65 7b 0a 20 20 20 20 6e 65 77 61 63 74 69 6f 6e  e{.    newaction
4cf0: 2d 3e 78 2e 72 70 20 3d 20 28 73 74 72 75 63 74  ->x.rp = (struct
4d00: 20 72 75 6c 65 20 2a 29 61 72 67 3b 0a 20 20 7d   rule *)arg;.  }
4d10: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
4d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 65 77 20 63  ********** New c
4d30: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
4d40: 20 74 68 65 20 22 61 63 74 74 61 62 22 20 6d 6f   the "acttab" mo
4d50: 64 75 6c 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  dule ***********
4d60: 2f 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f 64  /./*.** This mod
4d70: 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72  ule implements r
4d80: 6f 75 74 69 6e 65 73 20 75 73 65 20 74 6f 20 63  outines use to c
4d90: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 79 79 5f  onstruct the yy_
4da0: 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a  action[] table..
4db0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74  */../*.** The st
4dc0: 61 74 65 20 6f 66 20 74 68 65 20 79 79 5f 61 63  ate of the yy_ac
4dd0: 74 69 6f 6e 20 74 61 62 6c 65 20 75 6e 64 65 72  tion table under
4de0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 73   construction is
4df0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a   an instance of.
4e00: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
4e10: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
4e20: 2a 20 54 68 65 20 79 79 5f 61 63 74 69 6f 6e 20  * The yy_action 
4e30: 74 61 62 6c 65 20 6d 61 70 73 20 74 68 65 20 70  table maps the p
4e40: 61 69 72 20 28 73 74 61 74 65 5f 6e 75 6d 62 65  air (state_numbe
4e50: 72 2c 20 6c 6f 6f 6b 61 68 65 61 64 29 20 69 6e  r, lookahead) in
4e60: 74 6f 20 61 6e 0a 2a 2a 20 61 63 74 69 6f 6e 5f  to an.** action_
4e70: 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 74 61 62  number.  The tab
4e80: 6c 65 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  le is an array o
4e90: 66 20 69 6e 74 65 67 65 72 73 20 70 61 69 72 73  f integers pairs
4ea0: 2e 20 20 54 68 65 20 73 74 61 74 65 5f 6e 75 6d  .  The state_num
4eb0: 62 65 72 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  ber.** determine
4ec0: 73 20 61 6e 20 69 6e 69 74 69 61 6c 20 6f 66 66  s an initial off
4ed0: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 79 79 5f  set into the yy_
4ee0: 61 63 74 69 6f 6e 20 61 72 72 61 79 2e 20 20 54  action array.  T
4ef0: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 0a 2a 2a 20  he lookahead.** 
4f00: 76 61 6c 75 65 20 69 73 20 74 68 65 6e 20 61 64  value is then ad
4f10: 64 65 64 20 74 6f 20 74 68 69 73 20 69 6e 69 74  ded to this init
4f20: 69 61 6c 20 6f 66 66 73 65 74 20 74 6f 20 67 65  ial offset to ge
4f30: 74 20 61 6e 20 69 6e 64 65 78 20 58 20 69 6e 74  t an index X int
4f40: 6f 20 74 68 65 0a 2a 2a 20 79 79 5f 61 63 74 69  o the.** yy_acti
4f50: 6f 6e 20 61 72 72 61 79 2e 20 49 66 20 74 68 65  on array. If the
4f60: 20 61 41 63 74 69 6f 6e 5b 58 5d 2e 6c 6f 6f 6b   aAction[X].look
4f70: 61 68 65 61 64 20 65 71 75 61 6c 73 20 74 68 65  ahead equals the
4f80: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
4f90: 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   of the lookahea
4fa0: 64 20 69 6e 70 75 74 2c 20 74 68 65 6e 20 74 68  d input, then th
4fb0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61  e value of the a
4fc0: 63 74 69 6f 6e 5f 6e 75 6d 62 65 72 20 6f 75 74  ction_number out
4fd0: 70 75 74 20 69 73 0a 2a 2a 20 61 41 63 74 69 6f  put is.** aActio
4fe0: 6e 5b 58 5d 2e 61 63 74 69 6f 6e 2e 20 20 49 66  n[X].action.  If
4ff0: 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 73 20   the lookaheads 
5000: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  do not match the
5010: 6e 20 74 68 65 0a 2a 2a 20 64 65 66 61 75 6c 74  n the.** default
5020: 20 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   action for the 
5030: 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 69 73 20  state_number is 
5040: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
5050: 41 6c 6c 20 61 63 74 69 6f 6e 73 20 61 73 73 6f  All actions asso
5060: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 73 69  ciated with a si
5070: 6e 67 6c 65 20 73 74 61 74 65 5f 6e 75 6d 62 65  ngle state_numbe
5080: 72 20 61 72 65 20 66 69 72 73 74 20 65 6e 74 65  r are first ente
5090: 72 65 64 0a 2a 2a 20 69 6e 74 6f 20 61 4c 6f 6f  red.** into aLoo
50a0: 6b 61 68 65 61 64 5b 5d 20 75 73 69 6e 67 20 6d  kahead[] using m
50b0: 75 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20 74 6f  ultiple calls to
50c0: 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29   acttab_action()
50d0: 2e 20 20 54 68 65 6e 20 74 68 65 20 0a 2a 2a 20  .  Then the .** 
50e0: 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 61 74  actions for that
50f0: 20 73 69 6e 67 6c 65 20 73 74 61 74 65 5f 6e 75   single state_nu
5100: 6d 62 65 72 20 61 72 65 20 70 6c 61 63 65 64 20  mber are placed 
5110: 69 6e 74 6f 20 74 68 65 20 61 41 63 74 69 6f 6e  into the aAction
5120: 5b 5d 20 0a 2a 2a 20 61 72 72 61 79 20 77 69 74  [] .** array wit
5130: 68 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20  h a single call 
5140: 74 6f 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74  to acttab_insert
5150: 28 29 2e 20 20 54 68 65 20 61 63 74 74 61 62 5f  ().  The acttab_
5160: 69 6e 73 65 72 74 28 29 20 63 61 6c 6c 0a 2a 2a  insert() call.**
5170: 20 61 6c 73 6f 20 72 65 73 65 74 73 20 74 68 65   also resets the
5180: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 61 72   aLookahead[] ar
5190: 72 61 79 20 69 6e 20 70 72 65 70 61 72 61 74 69  ray in preparati
51a0: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a  on for the next.
51b0: 2a 2a 20 73 74 61 74 65 20 6e 75 6d 62 65 72 2e  ** state number.
51c0: 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 6f 6b 61  .*/.struct looka
51d0: 68 65 61 64 5f 61 63 74 69 6f 6e 20 7b 0a 20 20  head_action {.  
51e0: 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 3b 20 20  int lookahead;  
51f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
5200: 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61  lue of the looka
5210: 68 65 61 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  head token */.  
5220: 69 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20 20 20  int action;     
5230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
5240: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 6f 6e 20  tion to take on 
5250: 74 68 65 20 67 69 76 65 6e 20 6c 6f 6f 6b 61 68  the given lookah
5260: 65 61 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65  ead */.};.typede
5270: 66 20 73 74 72 75 63 74 20 61 63 74 74 61 62 20  f struct acttab 
5280: 61 63 74 74 61 62 3b 0a 73 74 72 75 63 74 20 61  acttab;.struct a
5290: 63 74 74 61 62 20 7b 0a 20 20 69 6e 74 20 6e 41  cttab {.  int nA
52a0: 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
52b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
52c0: 20 6f 66 20 75 73 65 64 20 73 6c 6f 74 73 20 69   of used slots i
52d0: 6e 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20  n aAction[] */. 
52e0: 20 69 6e 74 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f   int nActionAllo
52f0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
5300: 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64   Slots allocated
5310: 20 66 6f 72 20 61 41 63 74 69 6f 6e 5b 5d 20 2a   for aAction[] *
5320: 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 6f 6b 61  /.  struct looka
5330: 68 65 61 64 5f 61 63 74 69 6f 6e 0a 20 20 20 20  head_action.    
5340: 2a 61 41 63 74 69 6f 6e 2c 20 20 20 20 20 20 20  *aAction,       
5350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5360: 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61  e yy_action[] ta
5370: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
5380: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 2a 61  uction */.    *a
5390: 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  Lookahead;      
53a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
53b0: 6e 67 6c 65 20 6e 65 77 20 74 72 61 6e 73 61 63  ngle new transac
53c0: 74 69 6f 6e 20 73 65 74 20 2a 2f 0a 20 20 69 6e  tion set */.  in
53d0: 74 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 20  t mnLookahead;  
53e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69             /* Mi
53f0: 6e 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64  nimum aLookahead
5400: 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a  [].lookahead */.
5410: 20 20 69 6e 74 20 6d 6e 41 63 74 69 6f 6e 3b 20    int mnAction; 
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5430: 2a 20 41 63 74 69 6f 6e 20 61 73 73 6f 63 69 61  * Action associa
5440: 74 65 64 20 77 69 74 68 20 6d 6e 4c 6f 6f 6b 61  ted with mnLooka
5450: 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  head */.  int mx
5460: 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  Lookahead;      
5470: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
5480: 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c  m aLookahead[].l
5490: 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e  ookahead */.  in
54a0: 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20  t nLookahead;   
54b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
54c0: 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 4c 6f 6f  ed slots in aLoo
54d0: 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e  kahead[] */.  in
54e0: 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f  t nLookaheadAllo
54f0: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c  c;         /* Sl
5500: 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  ots allocated in
5510: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f   aLookahead[] */
5520: 0a 7d 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  .};../* Return t
5530: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
5540: 72 69 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61  ries in the yy_a
5550: 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 23  ction table */.#
5560: 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 73 69  define acttab_si
5570: 7a 65 28 58 29 20 28 28 58 29 2d 3e 6e 41 63 74  ze(X) ((X)->nAct
5580: 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61 6c  ion)../* The val
5590: 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  ue for the N-th 
55a0: 65 6e 74 72 79 20 69 6e 20 79 79 5f 61 63 74 69  entry in yy_acti
55b0: 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63  on */.#define ac
55c0: 74 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 58 2c  ttab_yyaction(X,
55d0: 4e 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69 6f  N)  ((X)->aActio
55e0: 6e 5b 4e 5d 2e 61 63 74 69 6f 6e 29 0a 0a 2f 2a  n[N].action)../*
55f0: 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   The value for t
5600: 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20 69 6e  he N-th entry in
5610: 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f   yy_lookahead */
5620: 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f  .#define acttab_
5630: 79 79 6c 6f 6f 6b 61 68 65 61 64 28 58 2c 4e 29  yylookahead(X,N)
5640: 20 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b    ((X)->aAction[
5650: 4e 5d 2e 6c 6f 6f 6b 61 68 65 61 64 29 0a 0a 2f  N].lookahead)../
5660: 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  * Free all memor
5670: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
5680: 68 20 74 68 65 20 67 69 76 65 6e 20 61 63 74 74  h the given actt
5690: 61 62 20 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61  ab */.void actta
56a0: 62 5f 66 72 65 65 28 61 63 74 74 61 62 20 2a 70  b_free(acttab *p
56b0: 29 7b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 41  ){.  free( p->aA
56c0: 63 74 69 6f 6e 20 29 3b 0a 20 20 66 72 65 65 28  ction );.  free(
56d0: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 29   p->aLookahead )
56e0: 3b 0a 20 20 66 72 65 65 28 20 70 20 29 3b 0a 7d  ;.  free( p );.}
56f0: 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
5700: 6e 65 77 20 61 63 74 74 61 62 20 73 74 72 75 63  new acttab struc
5710: 74 75 72 65 20 2a 2f 0a 61 63 74 74 61 62 20 2a  ture */.acttab *
5720: 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28 76 6f 69  acttab_alloc(voi
5730: 64 29 7b 0a 20 20 61 63 74 74 61 62 20 2a 70 20  d){.  acttab *p 
5740: 3d 20 28 61 63 74 74 61 62 20 2a 29 20 63 61 6c  = (acttab *) cal
5750: 6c 6f 63 28 20 31 2c 20 73 69 7a 65 6f 66 28 2a  loc( 1, sizeof(*
5760: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
5770: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
5780: 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74  stderr,"Unable t
5790: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
57a0: 79 20 66 6f 72 20 61 20 6e 65 77 20 61 63 74 74  y for a new actt
57b0: 61 62 2e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  ab.");.    exit(
57c0: 31 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  1);.  }.  memset
57d0: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
57e0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ));.  return p;.
57f0: 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20  }../* Add a new 
5800: 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 75  action to the cu
5810: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
5820: 6e 20 73 65 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  n set.  .**.** T
5830: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5840: 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
5850: 61 63 68 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f  ach lookahead fo
5860: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 0a 2a  r a particular.*
5870: 2a 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64  * state..*/.void
5880: 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 61   acttab_action(a
5890: 63 74 74 61 62 20 2a 70 2c 20 69 6e 74 20 6c 6f  cttab *p, int lo
58a0: 6f 6b 61 68 65 61 64 2c 20 69 6e 74 20 61 63 74  okahead, int act
58b0: 69 6f 6e 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e  ion){.  if( p->n
58c0: 4c 6f 6f 6b 61 68 65 61 64 3e 3d 70 2d 3e 6e 4c  Lookahead>=p->nL
58d0: 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29 7b  ookaheadAlloc ){
58e0: 0a 20 20 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  .    p->nLookahe
58f0: 61 64 41 6c 6c 6f 63 20 2b 3d 20 32 35 3b 0a 20  adAlloc += 25;. 
5900: 20 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64     p->aLookahead
5910: 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 6f 6b 61   = (struct looka
5920: 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a 29 20 72  head_action *) r
5930: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b  ealloc( p->aLook
5940: 61 68 65 61 64 2c 0a 20 20 20 20 20 20 20 20 20  ahead,.         
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c      sizeof(p->aL
5970: 6f 6f 6b 61 68 65 61 64 5b 30 5d 29 2a 70 2d 3e  ookahead[0])*p->
5980: 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20  nLookaheadAlloc 
5990: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4c  );.    if( p->aL
59a0: 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20  ookahead==0 ){. 
59b0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
59c0: 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  err,"malloc fail
59d0: 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78  ed\n");.      ex
59e0: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  it(1);.    }.  }
59f0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61  .  if( p->nLooka
5a00: 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70  head==0 ){.    p
5a10: 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20  ->mxLookahead = 
5a20: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70  lookahead;.    p
5a30: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20  ->mnLookahead = 
5a40: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70  lookahead;.    p
5a50: 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63 74  ->mnAction = act
5a60: 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ion;.  }else{.  
5a70: 20 20 69 66 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61    if( p->mxLooka
5a80: 68 65 61 64 3c 6c 6f 6f 6b 61 68 65 61 64 20 29  head<lookahead )
5a90: 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20   p->mxLookahead 
5aa0: 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20  = lookahead;.   
5ab0: 20 69 66 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68   if( p->mnLookah
5ac0: 65 61 64 3e 6c 6f 6f 6b 61 68 65 61 64 20 29 7b  ead>lookahead ){
5ad0: 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b  .      p->mnLook
5ae0: 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61  ahead = lookahea
5af0: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 41 63  d;.      p->mnAc
5b00: 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20  tion = action;. 
5b10: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c     }.  }.  p->aL
5b20: 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f  ookahead[p->nLoo
5b30: 6b 61 68 65 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61  kahead].lookahea
5b40: 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20  d = lookahead;. 
5b50: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 70   p->aLookahead[p
5b60: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 61 63  ->nLookahead].ac
5b70: 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20  tion = action;. 
5b80: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b   p->nLookahead++
5b90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
5ba0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
5bb0: 65 74 20 62 75 69 6c 74 20 75 70 20 77 69 74 68  et built up with
5bc0: 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20   prior calls to 
5bd0: 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 0a  acttab_action().
5be0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  ** into the curr
5bf0: 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ent action table
5c00: 2e 20 20 54 68 65 6e 20 72 65 73 65 74 20 74 68  .  Then reset th
5c10: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  e transaction se
5c20: 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20  t back.** to an 
5c30: 65 6d 70 74 79 20 73 65 74 20 69 6e 20 70 72 65  empty set in pre
5c40: 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 61 20 6e  paration for a n
5c50: 65 77 20 72 6f 75 6e 64 20 6f 66 20 61 63 74 74  ew round of actt
5c60: 61 62 5f 61 63 74 69 6f 6e 28 29 20 63 61 6c 6c  ab_action() call
5c70: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
5c80: 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
5c90: 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
5ca0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 72 61 6e   of the new tran
5cb0: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
5cc0: 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 61 63  acttab_insert(ac
5cd0: 74 74 61 62 20 2a 70 29 7b 0a 20 20 69 6e 74 20  ttab *p){.  int 
5ce0: 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73  i, j, k, n;.  as
5cf0: 73 65 72 74 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68  sert( p->nLookah
5d00: 65 61 64 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ead>0 );..  /* M
5d10: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
5d20: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
5d30: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 61 6e 64   hold the expand
5d40: 65 64 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a  ed action table.
5d50: 20 20 2a 2a 20 69 6e 20 74 68 65 20 77 6f 72 73    ** in the wors
5d60: 74 20 63 61 73 65 2e 20 20 54 68 65 20 77 6f 72  t case.  The wor
5d70: 73 74 20 63 61 73 65 20 6f 63 63 75 72 73 20 69  st case occurs i
5d80: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
5d90: 6e 20 73 65 74 0a 20 20 2a 2a 20 6d 75 73 74 20  n set.  ** must 
5da0: 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
5db0: 68 65 20 63 75 72 72 65 6e 74 20 61 63 74 69 6f  he current actio
5dc0: 6e 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e  n table.  */.  n
5dd0: 20 3d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61   = p->mxLookahea
5de0: 64 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e  d + 1;.  if( p->
5df0: 6e 41 63 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70  nAction + n >= p
5e00: 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29  ->nActionAlloc )
5e10: 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64 41 6c 6c  {.    int oldAll
5e20: 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41  oc = p->nActionA
5e30: 6c 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e 41 63  lloc;.    p->nAc
5e40: 74 69 6f 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  tionAlloc = p->n
5e50: 41 63 74 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e  Action + n + p->
5e60: 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32  nActionAlloc + 2
5e70: 30 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f  0;.    p->aActio
5e80: 6e 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 6f 6b  n = (struct look
5e90: 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a 29 20  ahead_action *) 
5ea0: 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 41 63 74  realloc( p->aAct
5eb0: 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
5ed0: 69 7a 65 6f 66 28 70 2d 3e 61 41 63 74 69 6f 6e  izeof(p->aAction
5ee0: 5b 30 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41  [0])*p->nActionA
5ef0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70  lloc);.    if( p
5f00: 2d 3e 61 41 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a  ->aAction==0 ){.
5f10: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
5f20: 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69  derr,"malloc fai
5f30: 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65  led\n");.      e
5f40: 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
5f50: 20 20 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63    for(i=oldAlloc
5f60: 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c  ; i<p->nActionAl
5f70: 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  loc; i++){.     
5f80: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c   p->aAction[i].l
5f90: 6f 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b 0a 20  ookahead = -1;. 
5fa0: 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b       p->aAction[
5fb0: 69 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a  i].action = -1;.
5fc0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
5fd0: 53 63 61 6e 20 74 68 65 20 65 78 69 73 74 69 6e  Scan the existin
5fe0: 67 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6c  g action table l
5ff0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20 6f 66  ooking for an of
6000: 66 73 65 74 20 74 68 61 74 20 69 73 20 61 20 0a  fset that is a .
6010: 20 20 2a 2a 20 64 75 70 6c 69 63 61 74 65 20 6f    ** duplicate o
6020: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
6030: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 20 20  ansaction set.  
6040: 46 61 6c 6c 20 6f 75 74 20 6f 66 20 74 68 65 20  Fall out of the 
6050: 6c 6f 6f 70 0a 20 20 2a 2a 20 69 66 20 61 6e 64  loop.  ** if and
6060: 20 77 68 65 6e 20 74 68 65 20 64 75 70 6c 69 63   when the duplic
6070: 61 74 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20  ate is found..  
6080: 2a 2a 0a 20 20 2a 2a 20 69 20 69 73 20 74 68 65  **.  ** i is the
6090: 20 69 6e 64 65 78 20 69 6e 20 70 2d 3e 61 41 63   index in p->aAc
60a0: 74 69 6f 6e 5b 5d 20 77 68 65 72 65 20 70 2d 3e  tion[] where p->
60b0: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 69 73 20 69  mnLookahead is i
60c0: 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  nserted..  */.  
60d0: 66 6f 72 28 69 3d 70 2d 3e 6e 41 63 74 69 6f 6e  for(i=p->nAction
60e0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
60f0: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
6100: 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d  on[i].lookahead=
6110: 3d 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20  =p->mnLookahead 
6120: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20  ){.      /* All 
6130: 6c 6f 6f 6b 61 68 65 61 64 73 20 61 6e 64 20 61  lookaheads and a
6140: 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 61 4c  ctions in the aL
6150: 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e 73  ookahead[] trans
6160: 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
6170: 6d 75 73 74 20 6d 61 74 63 68 20 61 67 61 69 6e  must match again
6180: 73 74 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  st the candidate
6190: 20 61 41 63 74 69 6f 6e 5b 69 5d 20 65 6e 74 72   aAction[i] entr
61a0: 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  y. */.      if( 
61b0: 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 61 63  p->aAction[i].ac
61c0: 74 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63 74 69 6f  tion!=p->mnActio
61d0: 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
61e0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
61f0: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b  ->nLookahead; j+
6200: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  +){.        k = 
6210: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
6220: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
6230: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
6240: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3c 30  .        if( k<0
6250: 20 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f   || k>=p->nActio
6260: 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  n ) break;.     
6270: 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61     if( p->aLooka
6280: 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  head[j].lookahea
6290: 64 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d  d!=p->aAction[k]
62a0: 2e 6c 6f 6f 6b 61 68 65 61 64 20 29 20 62 72 65  .lookahead ) bre
62b0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
62c0: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
62d0: 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 61 41 63 74  .action!=p->aAct
62e0: 69 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e 20 29 20  ion[k].action ) 
62f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6300: 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c       if( j<p->nL
6310: 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74 69  ookahead ) conti
6320: 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4e  nue;..      /* N
6330: 6f 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 61  o possible looka
6340: 68 65 61 64 20 76 61 6c 75 65 20 74 68 61 74 20  head value that 
6350: 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 61 4c  is not in the aL
6360: 6f 6f 6b 61 68 65 61 64 5b 5d 0a 20 20 20 20 20  ookahead[].     
6370: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
6380: 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61  is allowed to ma
6390: 74 63 68 20 61 41 63 74 69 6f 6e 5b 69 5d 20 2a  tch aAction[i] *
63a0: 2f 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20  /.      n = 0;. 
63b0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
63c0: 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29  p->nAction; j++)
63d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
63e0: 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b  >aAction[j].look
63f0: 61 68 65 61 64 3c 30 20 29 20 63 6f 6e 74 69 6e  ahead<0 ) contin
6400: 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
6410: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f  p->aAction[j].lo
6420: 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e  okahead==j+p->mn
6430: 4c 6f 6f 6b 61 68 65 61 64 2d 69 20 29 20 6e 2b  Lookahead-i ) n+
6440: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
6450: 20 69 66 28 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b   if( n==p->nLook
6460: 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 20  ahead ){.       
6470: 20 62 72 65 61 6b 3b 20 20 2f 2a 20 41 6e 20 65   break;  /* An e
6480: 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 66 6f  xact match is fo
6490: 75 6e 64 20 61 74 20 6f 66 66 73 65 74 20 69 20  und at offset i 
64a0: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
64b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
64c0: 20 65 78 69 73 74 69 6e 67 20 6f 66 66 73 65 74   existing offset
64d0: 73 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 20  s exactly match 
64e0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
64f0: 73 61 63 74 69 6f 6e 2c 20 66 69 6e 64 20 61 6e  saction, find an
6500: 0a 20 20 2a 2a 20 61 6e 20 65 6d 70 74 79 20 6f  .  ** an empty o
6510: 66 66 73 65 74 20 69 6e 20 74 68 65 20 61 41 63  ffset in the aAc
6520: 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 69 6e 20  tion[] table in 
6530: 77 68 69 63 68 20 77 65 20 63 61 6e 20 61 64 64  which we can add
6540: 20 74 68 65 0a 20 20 2a 2a 20 61 4c 6f 6f 6b 61   the.  ** aLooka
6550: 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74 69  head[] transacti
6560: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  on..  */.  if( i
6570: 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f  <0 ){.    /* Loo
6580: 6b 20 66 6f 72 20 68 6f 6c 65 73 20 69 6e 20 74  k for holes in t
6590: 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 74 61 62  he aAction[] tab
65a0: 6c 65 20 74 68 61 74 20 66 69 74 20 74 68 65 20  le that fit the 
65b0: 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 61  current.    ** a
65c0: 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e  Lookahead[] tran
65d0: 73 61 63 74 69 6f 6e 2e 20 20 4c 65 61 76 65 20  saction.  Leave 
65e0: 69 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  i set to the off
65f0: 73 65 74 20 6f 66 20 74 68 65 20 68 6f 6c 65 2e  set of the hole.
6600: 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 20 68 6f  .    ** If no ho
6610: 6c 65 73 20 61 72 65 20 66 6f 75 6e 64 2c 20 69  les are found, i
6620: 20 69 73 20 6c 65 66 74 20 61 74 20 70 2d 3e 6e   is left at p->n
6630: 41 63 74 69 6f 6e 2c 20 77 68 69 63 68 20 6d 65  Action, which me
6640: 61 6e 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  ans the.    ** t
6650: 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
6660: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 2a 2f 0a  be appended. */.
6670: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
6680: 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2d  ->nActionAlloc -
6690: 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b   p->mxLookahead;
66a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
66b0: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c   p->aAction[i].l
66c0: 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b 0a 20 20  ookahead<0 ){.  
66d0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
66e0: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  <p->nLookahead; 
66f0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
6700: 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  k = p->aLookahea
6710: 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d  d[j].lookahead -
6720: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
6730: 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  + i;.          i
6740: 66 28 20 6b 3c 30 20 29 20 62 72 65 61 6b 3b 0a  f( k<0 ) break;.
6750: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
6760: 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b  >aAction[k].look
6770: 61 68 65 61 64 3e 3d 30 20 29 20 62 72 65 61 6b  ahead>=0 ) break
6780: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6790: 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f      if( j<p->nLo
67a0: 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74 69 6e  okahead ) contin
67b0: 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ue;.        for(
67c0: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f  j=0; j<p->nActio
67d0: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
67e0: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
67f0: 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d  n[j].lookahead==
6800: 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  j+p->mnLookahead
6810: 2d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  -i ) break;.    
6820: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
6830: 28 20 6a 3d 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20  ( j==p->nAction 
6840: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
6850: 61 6b 3b 20 20 2f 2a 20 46 69 74 73 20 69 6e 20  ak;  /* Fits in 
6860: 65 6d 70 74 79 20 73 6c 6f 74 73 20 2a 2f 0a 20  empty slots */. 
6870: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6880: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
6890: 49 6e 73 65 72 74 20 74 72 61 6e 73 61 63 74 69  Insert transacti
68a0: 6f 6e 20 73 65 74 20 61 74 20 69 6e 64 65 78 20  on set at index 
68b0: 69 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b  i. */.  for(j=0;
68c0: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
68d0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d 20  ; j++){.    k = 
68e0: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
68f0: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
6900: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
6910: 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b  .    p->aAction[
6920: 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65  k] = p->aLookahe
6930: 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b  ad[j];.    if( k
6940: 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 70  >=p->nAction ) p
6950: 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b  ->nAction = k+1;
6960: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61  .  }.  p->nLooka
6970: 68 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  head = 0;..  /* 
6980: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
6990: 74 20 74 68 61 74 20 69 73 20 61 64 64 65 64 20  t that is added 
69a0: 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  to the lookahead
69b0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
69c0: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
69d0: 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 6f  into yy_action o
69e0: 66 20 74 68 65 20 61 63 74 69 6f 6e 20 2a 2f 0a  f the action */.
69f0: 20 20 72 65 74 75 72 6e 20 69 20 2d 20 70 2d 3e    return i - p->
6a00: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a  mnLookahead;.}..
6a10: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
6a20: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
6a30: 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 63 22 20   file "build.c" 
6a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
6a60: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  *.** Routines to
6a70: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 68   construction th
6a80: 65 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d  e finite state m
6a90: 61 63 68 69 6e 65 20 66 6f 72 20 74 68 65 20 4c  achine for the L
6aa0: 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65 72 20 67  EMON.** parser g
6ab0: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
6ac0: 20 46 69 6e 64 20 61 20 70 72 65 63 65 64 65 6e   Find a preceden
6ad0: 63 65 20 73 79 6d 62 6f 6c 20 6f 66 20 65 76 65  ce symbol of eve
6ae0: 72 79 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67  ry rule in the g
6af0: 72 61 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54  rammar..** .** T
6b00: 68 6f 73 65 20 72 75 6c 65 73 20 77 68 69 63 68  hose rules which
6b10: 20 68 61 76 65 20 61 20 70 72 65 63 65 64 65 6e   have a preceden
6b20: 63 65 20 73 79 6d 62 6f 6c 20 63 6f 64 65 64 20  ce symbol coded 
6b30: 69 6e 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20  in the input.** 
6b40: 67 72 61 6d 6d 61 72 20 75 73 69 6e 67 20 74 68  grammar using th
6b50: 65 20 22 5b 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e  e "[symbol]" con
6b60: 73 74 72 75 63 74 20 77 69 6c 6c 20 61 6c 72 65  struct will alre
6b70: 61 64 79 20 68 61 76 65 20 74 68 65 0a 2a 2a 20  ady have the.** 
6b80: 72 70 2d 3e 70 72 65 63 73 79 6d 20 66 69 65 6c  rp->precsym fiel
6b90: 64 20 66 69 6c 6c 65 64 2e 20 20 4f 74 68 65 72  d filled.  Other
6ba0: 20 72 75 6c 65 73 20 74 61 6b 65 20 61 73 20 74   rules take as t
6bb0: 68 65 69 72 20 70 72 65 63 65 64 65 6e 63 65 0a  heir precedence.
6bc0: 2a 2a 20 73 79 6d 62 6f 6c 20 74 68 65 20 66 69  ** symbol the fi
6bd0: 72 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 77  rst RHS symbol w
6be0: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 70 72  ith a defined pr
6bf0: 65 63 65 64 65 6e 63 65 2e 20 20 49 66 20 74 68  ecedence.  If th
6c00: 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 52  ere.** are not R
6c10: 48 53 20 73 79 6d 62 6f 6c 73 20 77 69 74 68 20  HS symbols with 
6c20: 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64  a defined preced
6c30: 65 6e 63 65 2c 20 74 68 65 20 70 72 65 63 65 64  ence, the preced
6c40: 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66  ence.** symbol f
6c50: 69 65 6c 64 20 69 73 20 6c 65 66 74 20 62 6c 61  ield is left bla
6c60: 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  nk..*/.void Find
6c70: 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28  RulePrecedences(
6c80: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 78 70  struct lemon *xp
6c90: 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ).{.  struct rul
6ca0: 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72 70 3d  e *rp;.  for(rp=
6cb0: 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  xp->rule; rp; rp
6cc0: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
6cd0: 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d  if( rp->precsym=
6ce0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
6cf0: 69 2c 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  i, j;.      for(
6d00: 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 20  i=0; i<rp->nrhs 
6d10: 26 26 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d  && rp->precsym==
6d20: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  0; i++){.       
6d30: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
6d40: 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
6d50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d  .        if( sp-
6d60: 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
6d70: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
6d80: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 70 2d    for(j=0; j<sp-
6d90: 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a  >nsubsym; j++){.
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6db0: 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 70  sp->subsym[j]->p
6dc0: 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rec>=0 ){.      
6dd0: 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
6de0: 73 79 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d  sym = sp->subsym
6df0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [j];.           
6e00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6e20: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
6e30: 65 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d  e if( sp->prec>=
6e40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
6e50: 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 72 70 2d  p->precsym = rp-
6e60: 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  >rhs[i];.       
6e70: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6e80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
6e90: 0a 0a 2f 2a 20 46 69 6e 64 20 61 6c 6c 20 6e 6f  ../* Find all no
6ea0: 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68  nterminals which
6eb0: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 74   will generate t
6ec0: 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  he empty string.
6ed0: 0a 2a 2a 20 54 68 65 6e 20 67 6f 20 62 61 63 6b  .** Then go back
6ee0: 20 61 6e 64 20 63 6f 6d 70 75 74 65 20 74 68 65   and compute the
6ef0: 20 66 69 72 73 74 20 73 65 74 73 20 6f 66 20 65   first sets of e
6f00: 76 65 72 79 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  very nonterminal
6f10: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 73  ..** The first s
6f20: 65 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66  et is the set of
6f30: 20 61 6c 6c 20 74 65 72 6d 69 6e 61 6c 20 73 79   all terminal sy
6f40: 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20  mbols which can 
6f50: 62 65 67 69 6e 0a 2a 2a 20 61 20 73 74 72 69 6e  begin.** a strin
6f60: 67 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  g generated by t
6f70: 68 61 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e  hat nonterminal.
6f80: 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 69 72  .*/.void FindFir
6f90: 73 74 53 65 74 73 28 73 74 72 75 63 74 20 6c 65  stSets(struct le
6fa0: 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69  mon *lemp).{.  i
6fb0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63  nt i, j;.  struc
6fc0: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e  t rule *rp;.  in
6fd0: 74 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20 66  t progress;..  f
6fe0: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
6ff0: 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
7000: 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73     lemp->symbols
7010: 5b 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45  [i]->lambda = LE
7020: 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 7d 0a 20  MON_FALSE;.  }. 
7030: 20 66 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65   for(i=lemp->nte
7040: 72 6d 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e  rminal; i<lemp->
7050: 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
7060: 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73     lemp->symbols
7070: 5b 69 5d 2d 3e 66 69 72 73 74 73 65 74 20 3d 20  [i]->firstset = 
7080: 53 65 74 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a 20  SetNew();.  }.. 
7090: 20 2f 2a 20 46 69 72 73 74 20 63 6f 6d 70 75 74   /* First comput
70a0: 65 20 61 6c 6c 20 6c 61 6d 62 64 61 73 20 2a 2f  e all lambdas */
70b0: 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72  .  do{.    progr
70c0: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ess = 0;.    for
70d0: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
70e0: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
70f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e  {.      if( rp->
7100: 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 29 20 63 6f  lhs->lambda ) co
7110: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
7120: 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
7130: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
7140: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
7150: 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
7160: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7170: 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45   sp->type==NONTE
7180: 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 6c 61  RMINAL || sp->la
7190: 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53  mbda==LEMON_FALS
71a0: 45 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  E );.        if(
71b0: 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d   sp->lambda==LEM
71c0: 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b  ON_FALSE ) break
71d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
71e0: 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20  if( i==rp->nrhs 
71f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c  ){.        rp->l
7200: 68 73 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d  hs->lambda = LEM
7210: 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 20 20 20  ON_TRUE;.       
7220: 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20   progress = 1;. 
7230: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7240: 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20  while( progress 
7250: 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 6f 6d  );..  /* Now com
7260: 70 75 74 65 20 61 6c 6c 20 66 69 72 73 74 20 73  pute all first s
7270: 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20  ets */.  do{.   
7280: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
7290: 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70 72 6f  s1, *s2;.    pro
72a0: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66  gress = 0;.    f
72b0: 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
72c0: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
72d0: 74 29 7b 0a 20 20 20 20 20 20 73 31 20 3d 20 72  t){.      s1 = r
72e0: 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 66 6f  p->lhs;.      fo
72f0: 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
7300: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
7310: 20 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d   s2 = rp->rhs[i]
7320: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 32  ;.        if( s2
7330: 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
7340: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72   ){.          pr
7350: 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64 64  ogress += SetAdd
7360: 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32  (s1->firstset,s2
7370: 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
7380: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
7390: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 32 2d     }else if( s2-
73a0: 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
73b0: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
73c0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 32 2d    for(j=0; j<s2-
73d0: 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a  >nsubsym; j++){.
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 67              prog
73f0: 72 65 73 73 20 2b 3d 20 53 65 74 41 64 64 28 73  ress += SetAdd(s
7400: 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e  1->firstset,s2->
7410: 73 75 62 73 79 6d 5b 6a 5d 2d 3e 69 6e 64 65 78  subsym[j]->index
7420: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
7430: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7440: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
7450: 28 20 73 31 3d 3d 73 32 20 29 7b 0a 20 20 20 20  ( s1==s2 ){.    
7460: 20 20 20 20 20 20 69 66 28 20 73 31 2d 3e 6c 61        if( s1->la
7470: 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53  mbda==LEMON_FALS
7480: 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  E ) break;.     
7490: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
74a0: 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20      progress += 
74b0: 53 65 74 55 6e 69 6f 6e 28 73 31 2d 3e 66 69 72  SetUnion(s1->fir
74c0: 73 74 73 65 74 2c 73 32 2d 3e 66 69 72 73 74 73  stset,s2->firsts
74d0: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  et);.          i
74e0: 66 28 20 73 32 2d 3e 6c 61 6d 62 64 61 3d 3d 4c  f( s2->lambda==L
74f0: 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65  EMON_FALSE ) bre
7500: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
7510: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
7520: 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29  hile( progress )
7530: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
7540: 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52  * Compute all LR
7550: 28 30 29 20 73 74 61 74 65 73 20 66 6f 72 20 74  (0) states for t
7560: 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e  he grammar.  Lin
7570: 6b 73 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20  ks.** are added 
7580: 74 6f 20 62 65 74 77 65 65 6e 20 73 6f 6d 65 20  to between some 
7590: 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 74  states so that t
75a0: 68 65 20 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20  he LR(1) follow 
75b0: 73 65 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  sets.** can be c
75c0: 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a  omputed later..*
75d0: 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74  /.PRIVATE struct
75e0: 20 73 74 61 74 65 20 2a 67 65 74 73 74 61 74 65   state *getstate
75f0: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29  (struct lemon *)
7600: 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64 20 72 65  ;  /* forward re
7610: 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f 69 64 20  ference */.void 
7620: 46 69 6e 64 53 74 61 74 65 73 28 73 74 72 75 63  FindStates(struc
7630: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
7640: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
7650: 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20 72   *sp;.  struct r
7660: 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 43 6f 6e 66  ule *rp;..  Conf
7670: 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 3b 0a 0a  iglist_init();..
7680: 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 74    /* Find the st
7690: 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  art symbol */.  
76a0: 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20  if( lemp->start 
76b0: 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62  ){.    sp = Symb
76c0: 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74  ol_find(lemp->st
76d0: 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70  art);.    if( sp
76e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 72 72  ==0 ){.      Err
76f0: 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
7700: 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 70 65  name,0,."The spe
7710: 63 69 66 69 65 64 20 73 74 61 72 74 20 73 79 6d  cified start sym
7720: 62 6f 6c 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f  bol \"%s\" is no
7730: 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e 74 65 72 6d  t \.in a nonterm
7740: 69 6e 61 6c 20 6f 66 20 74 68 65 20 67 72 61 6d  inal of the gram
7750: 6d 61 72 2e 20 20 5c 22 25 73 5c 22 20 77 69 6c  mar.  \"%s\" wil
7760: 6c 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65  l be used as the
7770: 20 73 74 61 72 74 20 5c 0a 73 79 6d 62 6f 6c 20   start \.symbol 
7780: 69 6e 73 74 65 61 64 2e 22 2c 6c 65 6d 70 2d 3e  instead.",lemp->
7790: 73 74 61 72 74 2c 6c 65 6d 70 2d 3e 73 74 61 72  start,lemp->star
77a0: 74 52 75 6c 65 2d 3e 6c 68 73 2d 3e 6e 61 6d 65  tRule->lhs->name
77b0: 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65  );.      lemp->e
77c0: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
77d0: 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 74 61 72   sp = lemp->star
77e0: 74 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 20 20  tRule->lhs;.    
77f0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
7800: 70 20 3d 20 6c 65 6d 70 2d 3e 73 74 61 72 74 52  p = lemp->startR
7810: 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 0a 20  ule->lhs;.  }.. 
7820: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
7830: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 64  e start symbol d
7840: 6f 65 73 6e 27 74 20 6f 63 63 75 72 20 6f 6e 20  oesn't occur on 
7850: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
7860: 69 64 65 20 6f 66 0a 20 20 2a 2a 20 61 6e 79 20  ide of.  ** any 
7870: 72 75 6c 65 2e 20 20 52 65 70 6f 72 74 20 61 6e  rule.  Report an
7880: 20 65 72 72 6f 72 20 69 66 20 69 74 20 64 6f 65   error if it doe
7890: 73 2e 20 20 28 59 41 43 43 20 77 6f 75 6c 64 20  s.  (YACC would 
78a0: 67 65 6e 65 72 61 74 65 20 61 20 6e 65 77 0a 20  generate a new. 
78b0: 20 2a 2a 20 73 74 61 72 74 20 73 79 6d 62 6f 6c   ** start symbol
78c0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 29 20   in this case.) 
78d0: 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
78e0: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
78f0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 6e  p->next){.    in
7900: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
7910: 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
7920: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70  +){.      if( rp
7930: 2d 3e 72 68 73 5b 69 5d 3d 3d 73 70 20 29 7b 20  ->rhs[i]==sp ){ 
7940: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 44 65    /* FIX ME:  De
7950: 61 6c 20 77 69 74 68 20 6d 75 6c 74 69 74 65 72  al with multiter
7960: 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20  minals */.      
7970: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
7980: 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68  >filename,0,."Th
7990: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c  e start symbol \
79a0: 22 25 73 5c 22 20 6f 63 63 75 72 73 20 6f 6e 20  "%s\" occurs on 
79b0: 74 68 65 20 5c 0a 72 69 67 68 74 2d 68 61 6e 64  the \.right-hand
79c0: 20 73 69 64 65 20 6f 66 20 61 20 72 75 6c 65 2e   side of a rule.
79d0: 20 54 68 69 73 20 77 69 6c 6c 20 72 65 73 75 6c   This will resul
79e0: 74 20 69 6e 20 61 20 70 61 72 73 65 72 20 77 68  t in a parser wh
79f0: 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f 74 20 77  ich \.does not w
7a00: 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e 22 2c 73  ork properly.",s
7a10: 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
7a20: 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
7a30: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
7a40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
7a50: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
7a60: 69 6f 6e 20 73 65 74 20 66 6f 72 20 74 68 65 20  ion set for the 
7a70: 66 69 72 73 74 20 73 74 61 74 65 0a 20 20 2a 2a  first state.  **
7a80: 20 69 73 20 61 6c 6c 20 72 75 6c 65 73 20 77 68   is all rules wh
7a90: 69 63 68 20 68 61 76 65 20 74 68 65 20 73 74 61  ich have the sta
7aa0: 72 74 20 73 79 6d 62 6f 6c 20 61 73 20 74 68 65  rt symbol as the
7ab0: 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d 68 61 6e  ir.  ** left-han
7ac0: 64 20 73 69 64 65 20 2a 2f 0a 20 20 66 6f 72 28  d side */.  for(
7ad0: 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  rp=sp->rule; rp;
7ae0: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c 68 73 29   rp=rp->nextlhs)
7af0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e  {.    struct con
7b00: 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a 20 20 20  fig *newcfp;.   
7b10: 20 72 70 2d 3e 6c 68 73 53 74 61 72 74 20 3d 20   rp->lhsStart = 
7b20: 31 3b 0a 20 20 20 20 6e 65 77 63 66 70 20 3d 20  1;.    newcfp = 
7b30: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61  Configlist_addba
7b40: 73 69 73 28 72 70 2c 30 29 3b 0a 20 20 20 20 53  sis(rp,0);.    S
7b50: 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77  etAdd(newcfp->fw
7b60: 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  s,0);.  }..  /* 
7b70: 43 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72 73  Compute the firs
7b80: 74 20 73 74 61 74 65 2e 20 20 41 6c 6c 20 6f 74  t state.  All ot
7b90: 68 65 72 20 73 74 61 74 65 73 20 77 69 6c 6c 20  her states will 
7ba0: 62 65 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  be.  ** computed
7bb0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
7bc0: 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 70 75 74  uring the comput
7bd0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72  ation of the fir
7be0: 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54 68 65  st one..  ** The
7bf0: 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
7c00: 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 73  r to the first s
7c10: 74 61 74 65 20 69 73 20 6e 6f 74 20 75 73 65 64  tate is not used
7c20: 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
7c30: 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 20 20 72  state(lemp);.  r
7c40: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  eturn;.}../* Ret
7c50: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
7c60: 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 69   a state which i
7c70: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74  s described by t
7c80: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
7c90: 0a 2a 2a 20 6c 69 73 74 20 77 68 69 63 68 20 68  .** list which h
7ca0: 61 73 20 62 65 65 6e 20 62 75 69 6c 74 20 66 72  as been built fr
7cb0: 6f 6d 20 63 61 6c 6c 73 20 74 6f 20 43 6f 6e 66  om calls to Conf
7cc0: 69 67 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f 0a 50  iglist_add..*/.P
7cd0: 52 49 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c  RIVATE void buil
7ce0: 64 73 68 69 66 74 73 28 73 74 72 75 63 74 20 6c  dshifts(struct l
7cf0: 65 6d 6f 6e 20 2a 2c 20 73 74 72 75 63 74 20 73  emon *, struct s
7d00: 74 61 74 65 20 2a 29 3b 20 2f 2a 20 46 6f 72 77  tate *); /* Forw
7d10: 64 20 72 65 66 20 2a 2f 0a 50 52 49 56 41 54 45  d ref */.PRIVATE
7d20: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 67   struct state *g
7d30: 65 74 73 74 61 74 65 28 73 74 72 75 63 74 20 6c  etstate(struct l
7d40: 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
7d50: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
7d60: 66 70 2c 20 2a 62 70 3b 0a 20 20 73 74 72 75 63  fp, *bp;.  struc
7d70: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 0a 20  t state *stp;.. 
7d80: 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
7d90: 73 6f 72 74 65 64 20 62 61 73 69 73 20 6f 66 20  sorted basis of 
7da0: 74 68 65 20 6e 65 77 20 73 74 61 74 65 2e 20 20  the new state.  
7db0: 54 68 65 20 62 61 73 69 73 20 77 61 73 20 63 6f  The basis was co
7dc0: 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 62  nstructed.  ** b
7dd0: 79 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f  y prior calls to
7de0: 20 22 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   "Configlist_add
7df0: 62 61 73 69 73 28 29 22 2e 20 2a 2f 0a 20 20 43  basis()". */.  C
7e00: 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62 61  onfiglist_sortba
7e10: 73 69 73 28 29 3b 0a 20 20 62 70 20 3d 20 43 6f  sis();.  bp = Co
7e20: 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29  nfiglist_basis()
7e30: 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 73 74  ;..  /* Get a st
7e40: 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ate with the sam
7e50: 65 20 62 61 73 69 73 20 2a 2f 0a 20 20 73 74 70  e basis */.  stp
7e60: 20 3d 20 53 74 61 74 65 5f 66 69 6e 64 28 62 70   = State_find(bp
7e70: 29 3b 0a 20 20 69 66 28 20 73 74 70 20 29 7b 0a  );.  if( stp ){.
7e80: 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65 20 77      /* A state w
7e90: 69 74 68 20 74 68 65 20 73 61 6d 65 20 62 61 73  ith the same bas
7ea0: 69 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  is already exist
7eb0: 73 21 20 20 43 6f 70 79 20 61 6c 6c 20 74 68 65  s!  Copy all the
7ec0: 20 66 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20 20 20   follow-set.    
7ed0: 2a 2a 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  ** propagation l
7ee0: 69 6e 6b 73 20 66 72 6f 6d 20 74 68 65 20 73 74  inks from the st
7ef0: 61 74 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ate under constr
7f00: 75 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 0a  uction into the.
7f10: 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69      ** preexisti
7f20: 6e 67 20 73 74 61 74 65 2c 20 74 68 65 6e 20 72  ng state, then r
7f30: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
7f40: 74 6f 20 74 68 65 20 70 72 65 65 78 69 73 74 69  to the preexisti
7f50: 6e 67 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  ng state */.    
7f60: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 78  struct config *x
7f70: 2c 20 2a 79 3b 0a 20 20 20 20 66 6f 72 28 78 3d  , *y;.    for(x=
7f80: 62 70 2c 20 79 3d 73 74 70 2d 3e 62 70 3b 20 78  bp, y=stp->bp; x
7f90: 20 26 26 20 79 3b 20 78 3d 78 2d 3e 62 70 2c 20   && y; x=x->bp, 
7fa0: 79 3d 79 2d 3e 62 70 29 7b 0a 20 20 20 20 20 20  y=y->bp){.      
7fb0: 50 6c 69 6e 6b 5f 63 6f 70 79 28 26 79 2d 3e 62  Plink_copy(&y->b
7fc0: 70 6c 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a 20 20  plp,x->bplp);.  
7fd0: 20 20 20 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65      Plink_delete
7fe0: 28 78 2d 3e 66 70 6c 70 29 3b 0a 20 20 20 20 20  (x->fplp);.     
7ff0: 20 78 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e 62 70   x->fplp = x->bp
8000: 6c 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  lp = 0;.    }.  
8010: 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69    cfp = Configli
8020: 73 74 5f 72 65 74 75 72 6e 28 29 3b 0a 20 20 20  st_return();.   
8030: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28   Configlist_eat(
8040: 63 66 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  cfp);.  }else{. 
8050: 20 20 20 2f 2a 20 54 68 69 73 20 72 65 61 6c 6c     /* This reall
8060: 79 20 69 73 20 61 20 6e 65 77 20 73 74 61 74 65  y is a new state
8070: 2e 20 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c  .  Construct all
8080: 20 74 68 65 20 64 65 74 61 69 6c 73 20 2a 2f 0a   the details */.
8090: 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63      Configlist_c
80a0: 6c 6f 73 75 72 65 28 6c 65 6d 70 29 3b 20 20 20  losure(lemp);   
80b0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
80c0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c  configuration cl
80d0: 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 43 6f 6e  osure */.    Con
80e0: 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29 3b 20  figlist_sort(); 
80f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72            /* Sor
8100: 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  t the configurat
8110: 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20  ion closure */. 
8120: 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c     cfp = Configl
8130: 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 20 20 20  ist_return();   
8140: 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72  /* Get a pointer
8150: 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 20 6c   to the config l
8160: 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d  ist */.    stp =
8170: 20 53 74 61 74 65 5f 6e 65 77 28 29 3b 20 20 20   State_new();   
8180: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77          /* A new
8190: 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65   state structure
81a0: 20 2a 2f 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68   */.    MemoryCh
81b0: 65 63 6b 28 73 74 70 29 3b 0a 20 20 20 20 73 74  eck(stp);.    st
81c0: 70 2d 3e 62 70 20 3d 20 62 70 3b 20 20 20 20 20  p->bp = bp;     
81d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
81e0: 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69  member the confi
81f0: 67 75 72 61 74 69 6f 6e 20 62 61 73 69 73 20 2a  guration basis *
8200: 2f 0a 20 20 20 20 73 74 70 2d 3e 63 66 70 20 3d  /.    stp->cfp =
8210: 20 63 66 70 3b 20 20 20 20 20 20 20 20 20 20 20   cfp;           
8220: 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74     /* Remember t
8230: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
8240: 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20   closure */.    
8250: 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20  stp->statenum = 
8260: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b 20  lemp->nstate++; 
8270: 2f 2a 20 45 76 65 72 79 20 73 74 61 74 65 20 67  /* Every state g
8280: 65 74 73 20 61 20 73 65 71 75 65 6e 63 65 20 6e  ets a sequence n
8290: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 73 74 70  umber */.    stp
82a0: 2d 3e 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  ->ap = 0;       
82b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
82c0: 61 63 74 69 6f 6e 73 2c 20 79 65 74 2e 20 2a 2f  actions, yet. */
82d0: 0a 20 20 20 20 53 74 61 74 65 5f 69 6e 73 65 72  .    State_inser
82e0: 74 28 73 74 70 2c 73 74 70 2d 3e 62 70 29 3b 20  t(stp,stp->bp); 
82f0: 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20    /* Add to the 
8300: 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20  state table */. 
8310: 20 20 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c     buildshifts(l
8320: 65 6d 70 2c 73 74 70 29 3b 20 20 20 20 20 20 20  emp,stp);       
8330: 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 63  /* Recursively c
8340: 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 6f 72  ompute successor
8350: 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 7d 0a 20   states */.  }. 
8360: 20 72 65 74 75 72 6e 20 73 74 70 3b 0a 7d 0a 0a   return stp;.}..
8370: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
8380: 65 20 69 66 20 74 77 6f 20 73 79 6d 62 6f 6c 73  e if two symbols
8390: 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a   are the same..*
83a0: 2f 0a 69 6e 74 20 73 61 6d 65 5f 73 79 6d 62 6f  /.int same_symbo
83b0: 6c 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  l(struct symbol 
83c0: 2a 61 2c 20 73 74 72 75 63 74 20 73 79 6d 62 6f  *a, struct symbo
83d0: 6c 20 2a 62 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  l *b).{.  int i;
83e0: 0a 20 20 69 66 28 20 61 3d 3d 62 20 29 20 72 65  .  if( a==b ) re
83f0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 61 2d  turn 1;.  if( a-
8400: 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d  >type!=MULTITERM
8410: 49 4e 41 4c 20 29 20 72 65 74 75 72 6e 20 30 3b  INAL ) return 0;
8420: 0a 20 20 69 66 28 20 62 2d 3e 74 79 70 65 21 3d  .  if( b->type!=
8430: 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 20  MULTITERMINAL ) 
8440: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
8450: 61 2d 3e 6e 73 75 62 73 79 6d 21 3d 62 2d 3e 6e  a->nsubsym!=b->n
8460: 73 75 62 73 79 6d 20 29 20 72 65 74 75 72 6e 20  subsym ) return 
8470: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
8480: 61 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b 29  a->nsubsym; i++)
8490: 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 73 75 62  {.    if( a->sub
84a0: 73 79 6d 5b 69 5d 21 3d 62 2d 3e 73 75 62 73 79  sym[i]!=b->subsy
84b0: 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b  m[i] ) return 0;
84c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
84d0: 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63 74  .}../* Construct
84e0: 20 61 6c 6c 20 73 75 63 63 65 73 73 6f 72 20 73   all successor s
84f0: 74 61 74 65 73 20 74 6f 20 74 68 65 20 67 69 76  tates to the giv
8500: 65 6e 20 73 74 61 74 65 2e 20 20 41 20 22 73 75  en state.  A "su
8510: 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74 61 74  ccessor".** stat
8520: 65 20 69 73 20 61 6e 79 20 73 74 61 74 65 20 77  e is any state w
8530: 68 69 63 68 20 63 61 6e 20 62 65 20 72 65 61 63  hich can be reac
8540: 68 65 64 20 62 79 20 61 20 73 68 69 66 74 20 61  hed by a shift a
8550: 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54  ction..*/.PRIVAT
8560: 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66  E void buildshif
8570: 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  ts(struct lemon 
8580: 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 73 74  *lemp, struct st
8590: 61 74 65 20 2a 73 74 70 29 0a 7b 0a 20 20 73 74  ate *stp).{.  st
85a0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
85b0: 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  ;  /* For loopin
85c0: 67 20 74 68 72 75 20 74 68 65 20 63 6f 6e 66 69  g thru the confi
85d0: 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74  g closure of "st
85e0: 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63  p" */.  struct c
85f0: 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20 2f 2a 20  onfig *bcfp; /* 
8600: 46 6f 72 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f  For the inner lo
8610: 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20 63 6c 6f  op on config clo
8620: 73 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a 2f  sure of "stp" */
8630: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
8640: 20 2a 6e 65 77 63 66 67 3b 20 20 2f 2a 20 2a 2f   *newcfg;  /* */
8650: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
8660: 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62 6f   *sp;   /* Symbo
8670: 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  l following the 
8680: 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61  dot in configura
8690: 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20 20  tion "cfp" */.  
86a0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62  struct symbol *b
86b0: 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66  sp;  /* Symbol f
86c0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74  ollowing the dot
86d0: 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f   in configuratio
86e0: 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20 20 73 74  n "bcfp" */.  st
86f0: 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73  ruct state *news
8700: 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72  tp; /* A pointer
8710: 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72 20   to a successor 
8720: 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45  state */..  /* E
8730: 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ach configuratio
8740: 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c 65  n becomes comple
8750: 74 65 20 61 66 74 65 72 20 69 74 20 63 6f 6e 74  te after it cont
8760: 69 62 75 74 65 73 20 74 6f 20 61 20 73 75 63 63  ibutes to a succ
8770: 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65  essor.  ** state
8780: 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61 6c  .  Initially, al
8790: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  l configurations
87a0: 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65 20   are incomplete 
87b0: 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70  */.  for(cfp=stp
87c0: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
87d0: 63 66 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d 3e  cfp->next) cfp->
87e0: 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c  status = INCOMPL
87f0: 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  ETE;..  /* Loop 
8800: 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e 66  through all conf
8810: 69 67 75 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  igurations of th
8820: 65 20 73 74 61 74 65 20 22 73 74 70 22 20 2a 2f  e state "stp" */
8830: 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e  .  for(cfp=stp->
8840: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
8850: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66  p->next){.    if
8860: 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43  ( cfp->status==C
8870: 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e  OMPLETE ) contin
8880: 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64  ue;    /* Alread
8890: 79 20 75 73 65 64 20 62 79 20 69 6e 6e 65 72 20  y used by inner 
88a0: 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20  loop */.    if( 
88b0: 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72  cfp->dot>=cfp->r
88c0: 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e  p->nrhs ) contin
88d0: 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73 68  ue;  /* Can't sh
88e0: 69 66 74 20 74 68 69 73 20 63 6f 6e 66 69 67 20  ift this config 
88f0: 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73  */.    Configlis
8900: 74 5f 72 65 73 65 74 28 29 3b 20 20 20 20 20 20  t_reset();      
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8920: 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6e 65 77  /* Reset the new
8930: 20 63 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a 20   config set */. 
8940: 20 20 20 73 70 20 3d 20 63 66 70 2d 3e 72 70 2d     sp = cfp->rp-
8950: 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20  >rhs[cfp->dot]; 
8960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8970: 79 6d 62 6f 6c 20 61 66 74 65 72 20 74 68 65 20  ymbol after the 
8980: 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  dot */..    /* F
8990: 6f 72 20 65 76 65 72 79 20 63 6f 6e 66 69 67 75  or every configu
89a0: 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74  ration in the st
89b0: 61 74 65 20 22 73 74 70 22 20 77 68 69 63 68 20  ate "stp" which 
89c0: 68 61 73 20 74 68 65 20 73 79 6d 62 6f 6c 20 22  has the symbol "
89d0: 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  sp".    ** follo
89e0: 77 69 6e 67 20 69 74 73 20 64 6f 74 2c 20 61 64  wing its dot, ad
89f0: 64 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 66 69  d the same confi
8a00: 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  guration to the 
8a10: 62 61 73 69 73 20 73 65 74 20 75 6e 64 65 72 0a  basis set under.
8a20: 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
8a30: 69 6f 6e 20 62 75 74 20 77 69 74 68 20 74 68 65  ion but with the
8a40: 20 64 6f 74 20 73 68 69 66 74 65 64 20 6f 6e 65   dot shifted one
8a50: 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20 72   symbol to the r
8a60: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ight. */.    for
8a70: 28 62 63 66 70 3d 63 66 70 3b 20 62 63 66 70 3b  (bcfp=cfp; bcfp;
8a80: 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78 74   bcfp=bcfp->next
8a90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 63 66  ){.      if( bcf
8aa0: 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c  p->status==COMPL
8ab0: 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ETE ) continue; 
8ac0: 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73     /* Already us
8ad0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
8ae0: 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d  bcfp->dot>=bcfp-
8af0: 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74  >rp->nrhs ) cont
8b00: 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20 73  inue; /* Can't s
8b10: 68 69 66 74 20 74 68 69 73 20 6f 6e 65 20 2a 2f  hift this one */
8b20: 0a 20 20 20 20 20 20 62 73 70 20 3d 20 62 63 66  .      bsp = bcf
8b30: 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70 2d  p->rp->rhs[bcfp-
8b40: 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20  >dot];          
8b50: 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20 61   /* Get symbol a
8b60: 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20 20  fter dot */.    
8b70: 20 20 69 66 28 20 21 73 61 6d 65 5f 73 79 6d 62    if( !same_symb
8b80: 6f 6c 28 62 73 70 2c 73 70 29 20 29 20 63 6f 6e  ol(bsp,sp) ) con
8b90: 74 69 6e 75 65 3b 20 20 20 20 20 20 2f 2a 20 4d  tinue;      /* M
8ba0: 75 73 74 20 62 65 20 73 61 6d 65 20 61 73 20 66  ust be same as f
8bb0: 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20 20 20 20  or "cfp" */.    
8bc0: 20 20 62 63 66 70 2d 3e 73 74 61 74 75 73 20 3d    bcfp->status =
8bd0: 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20 20   COMPLETE;      
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
8bf0: 61 72 6b 20 74 68 69 73 20 63 6f 6e 66 69 67 20  ark this config 
8c00: 61 73 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20  as used */.     
8c10: 20 6e 65 77 63 66 67 20 3d 20 43 6f 6e 66 69 67   newcfg = Config
8c20: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 62 63  list_addbasis(bc
8c30: 66 70 2d 3e 72 70 2c 62 63 66 70 2d 3e 64 6f 74  fp->rp,bcfp->dot
8c40: 2b 31 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b  +1);.      Plink
8c50: 5f 61 64 64 28 26 6e 65 77 63 66 67 2d 3e 62 70  _add(&newcfg->bp
8c60: 6c 70 2c 62 63 66 70 29 3b 0a 20 20 20 20 7d 0a  lp,bcfp);.    }.
8c70: 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 20 70 6f  .    /* Get a po
8c80: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 61  inter to the sta
8c90: 74 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20  te described by 
8ca0: 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67  the basis config
8cb0: 75 72 61 74 69 6f 6e 20 73 65 74 0a 20 20 20 20  uration set.    
8cc0: 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  ** constructed i
8cd0: 6e 20 74 68 65 20 70 72 65 63 65 64 69 6e 67 20  n the preceding 
8ce0: 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 6e 65 77 73  loop */.    news
8cf0: 74 70 20 3d 20 67 65 74 73 74 61 74 65 28 6c 65  tp = getstate(le
8d00: 6d 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  mp);..    /* The
8d10: 20 73 74 61 74 65 20 22 6e 65 77 73 74 70 22 20   state "newstp" 
8d20: 69 73 20 72 65 61 63 68 65 64 20 66 72 6f 6d 20  is reached from 
8d30: 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20  the state "stp" 
8d40: 62 79 20 61 20 73 68 69 66 74 20 61 63 74 69 6f  by a shift actio
8d50: 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  n.    ** on the 
8d60: 73 79 6d 62 6f 6c 20 22 73 70 22 20 2a 2f 0a 20  symbol "sp" */. 
8d70: 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d     if( sp->type=
8d80: 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
8d90: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
8da0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
8db0: 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b  sp->nsubsym; i++
8dc0: 29 7b 0a 20 20 20 20 20 20 20 20 41 63 74 69 6f  ){.        Actio
8dd0: 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 53  n_add(&stp->ap,S
8de0: 48 49 46 54 2c 73 70 2d 3e 73 75 62 73 79 6d 5b  HIFT,sp->subsym[
8df0: 69 5d 2c 28 63 68 61 72 2a 29 6e 65 77 73 74 70  i],(char*)newstp
8e00: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8e10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 41 63 74 69  else{.      Acti
8e20: 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c  on_add(&stp->ap,
8e30: 53 48 49 46 54 2c 73 70 2c 28 63 68 61 72 20 2a  SHIFT,sp,(char *
8e40: 29 6e 65 77 73 74 70 29 3b 0a 20 20 20 20 7d 0a  )newstp);.    }.
8e50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
8e60: 73 74 72 75 63 74 20 74 68 65 20 70 72 6f 70 61  struct the propa
8e70: 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a  gation links.*/.
8e80: 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 73  void FindLinks(s
8e90: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
8ea0: 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p).{.  int i;.  
8eb0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
8ec0: 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20 20 73 74  fp, *other;.  st
8ed0: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
8ee0: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
8ef0: 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f 75 73  *plp;..  /* Hous
8f00: 65 6b 65 65 70 69 6e 67 20 64 65 74 61 69 6c 3a  ekeeping detail:
8f10: 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20 65 76 65  .  ** Add to eve
8f20: 72 79 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e  ry propagate lin
8f30: 6b 20 61 20 70 6f 69 6e 74 65 72 20 62 61 63 6b  k a pointer back
8f40: 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 6f   to the state to
8f50: 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65 20  .  ** which the 
8f60: 6c 69 6e 6b 20 69 73 20 61 74 74 61 63 68 65 64  link is attached
8f70: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
8f80: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
8f90: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
8fa0: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
8fb0: 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70  .    for(cfp=stp
8fc0: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
8fd0: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
8fe0: 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 73 74 70    cfp->stp = stp
8ff0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
9000: 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 62 61  * Convert all ba
9010: 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20 66 6f 72  cklinks into for
9020: 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20 4f 6e 6c  ward links.  Onl
9030: 79 20 74 68 65 20 66 6f 72 77 61 72 64 0a 20 20  y the forward.  
9040: 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20 75 73 65  ** links are use
9050: 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 2d  d in the follow-
9060: 73 65 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e  set computation.
9070: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
9080: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
9090: 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
90a0: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
90b0: 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d      for(cfp=stp-
90c0: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
90d0: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
90e0: 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 62 70   for(plp=cfp->bp
90f0: 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70  lp; plp; plp=plp
9100: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
9110: 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d 3e 63 66   other = plp->cf
9120: 70 3b 0a 20 20 20 20 20 20 20 20 50 6c 69 6e 6b  p;.        Plink
9130: 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e 66 70 6c  _add(&other->fpl
9140: 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a  p,cfp);.      }.
9150: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20      }.  }.}../* 
9160: 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66 6f 6c 6c  Compute all foll
9170: 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  owsets..**.** A 
9180: 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20 74 68 65  followset is the
9190: 20 73 65 74 20 6f 66 20 61 6c 6c 20 73 79 6d 62   set of all symb
91a0: 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20 63 6f  ols which can co
91b0: 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  me immediately.*
91c0: 2a 20 61 66 74 65 72 20 61 20 63 6f 6e 66 69 67  * after a config
91d0: 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  uration..*/.void
91e0: 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28   FindFollowSets(
91f0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
9200: 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp).{.  int i;. 
9210: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
9220: 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c  cfp;.  struct pl
9230: 69 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e 74 20  ink *plp;.  int 
9240: 70 72 6f 67 72 65 73 73 3b 0a 20 20 69 6e 74 20  progress;.  int 
9250: 63 68 61 6e 67 65 3b 0a 0a 20 20 66 6f 72 28 69  change;..  for(i
9260: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
9270: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f  te; i++){.    fo
9280: 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74  r(cfp=lemp->sort
9290: 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b  ed[i]->cfp; cfp;
92a0: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
92b0: 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74  .      cfp->stat
92c0: 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b  us = INCOMPLETE;
92d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
92e0: 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73  do{.    progress
92f0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
9300: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
9310: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  e; i++){.      f
9320: 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72  or(cfp=lemp->sor
9330: 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70  ted[i]->cfp; cfp
9340: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
9350: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 66  {.        if( cf
9360: 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c  p->status==COMPL
9370: 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ETE ) continue;.
9380: 20 20 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d          for(plp=
9390: 63 66 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b 20  cfp->fplp; plp; 
93a0: 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a  plp=plp->next){.
93b0: 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 67 65            change
93c0: 20 3d 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70 2d   = SetUnion(plp-
93d0: 3e 63 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e 66  >cfp->fws,cfp->f
93e0: 77 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ws);.          i
93f0: 66 28 20 63 68 61 6e 67 65 20 29 7b 0a 20 20 20  f( change ){.   
9400: 20 20 20 20 20 20 20 20 20 70 6c 70 2d 3e 63 66           plp->cf
9410: 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f  p->status = INCO
9420: 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20  MPLETE;.        
9430: 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31      progress = 1
9440: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
9450: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9460: 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f  cfp->status = CO
9470: 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a  MPLETE;.      }.
9480: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
9490: 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a 73  progress );.}..s
94a0: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76  tatic int resolv
94b0: 65 5f 63 6f 6e 66 6c 69 63 74 28 73 74 72 75 63  e_conflict(struc
94c0: 74 20 61 63 74 69 6f 6e 20 2a 2c 73 74 72 75 63  t action *,struc
94d0: 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a  t action *);../*
94e0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72 65 64   Compute the red
94f0: 75 63 65 20 61 63 74 69 6f 6e 73 2c 20 61 6e 64  uce actions, and
9500: 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63   resolve conflic
9510: 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  ts..*/.void Find
9520: 41 63 74 69 6f 6e 73 28 73 74 72 75 63 74 20 6c  Actions(struct l
9530: 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
9540: 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74 72 75 63  int i,j;.  struc
9550: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20  t config *cfp;. 
9560: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
9570: 74 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  tp;.  struct sym
9580: 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63  bol *sp;.  struc
9590: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f  t rule *rp;..  /
95a0: 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20 74 68 65  * Add all of the
95b0: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20   reduce actions 
95c0: 0a 20 20 2a 2a 20 41 20 72 65 64 75 63 65 20 61  .  ** A reduce a
95d0: 63 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 66  ction is added f
95e0: 6f 72 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20  or each element 
95f0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 73 65 74  of the followset
9600: 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f 6e 66 69   of.  ** a confi
9610: 67 75 72 61 74 69 6f 6e 20 77 68 69 63 68 20 68  guration which h
9620: 61 73 20 69 74 73 20 64 6f 74 20 61 74 20 74 68  as its dot at th
9630: 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2e  e extreme right.
9640: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
9650: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
9660: 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70   i++){   /* Loop
9670: 20 6f 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73   over all states
9680: 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c 65   */.    stp = le
9690: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
96a0: 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e     for(cfp=stp->
96b0: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
96c0: 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a 20 4c 6f  p->next){  /* Lo
96d0: 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63 6f 6e 66  op over all conf
96e0: 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  igurations */.  
96f0: 20 20 20 20 69 66 28 20 63 66 70 2d 3e 72 70 2d      if( cfp->rp-
9700: 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64 6f 74 20  >nrhs==cfp->dot 
9710: 29 7b 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20  ){        /* Is 
9720: 64 6f 74 20 61 74 20 65 78 74 72 65 6d 65 20 72  dot at extreme r
9730: 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20 20 20 20  ight? */.       
9740: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70   for(j=0; j<lemp
9750: 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b  ->nterminal; j++
9760: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
9770: 20 53 65 74 46 69 6e 64 28 63 66 70 2d 3e 66 77   SetFind(cfp->fw
9780: 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20  s,j) ){.        
9790: 20 20 20 20 2f 2a 20 41 64 64 20 61 20 72 65 64      /* Add a red
97a0: 75 63 65 20 61 63 74 69 6f 6e 20 74 6f 20 74 68  uce action to th
97b0: 65 20 73 74 61 74 65 20 22 73 74 70 22 20 77 68  e state "stp" wh
97c0: 69 63 68 20 77 69 6c 6c 20 72 65 64 75 63 65 20  ich will reduce 
97d0: 62 79 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  by the.         
97e0: 20 20 20 2a 2a 20 72 75 6c 65 20 22 63 66 70 2d     ** rule "cfp-
97f0: 3e 72 70 22 20 69 66 20 74 68 65 20 6c 6f 6f 6b  >rp" if the look
9800: 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 69 73 20  ahead symbol is 
9810: 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a  "lemp->symbols[j
9820: 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ]" */.          
9830: 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74    Action_add(&st
9840: 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c 6c 65 6d  p->ap,REDUCE,lem
9850: 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 28 63  p->symbols[j],(c
9860: 68 61 72 20 2a 29 63 66 70 2d 3e 72 70 29 3b 0a  har *)cfp->rp);.
9870: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9880: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9890: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64    }.  }..  /* Ad
98a0: 64 20 74 68 65 20 61 63 63 65 70 74 69 6e 67 20  d the accepting 
98b0: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66 28 20 6c  token */.  if( l
98c0: 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20  emp->start ){.  
98d0: 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69    sp = Symbol_fi
98e0: 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b  nd(lemp->start);
98f0: 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 29  .    if( sp==0 )
9900: 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 74 61 72   sp = lemp->star
9910: 74 52 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65  tRule->lhs;.  }e
9920: 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65  lse{.    sp = le
9930: 6d 70 2d 3e 73 74 61 72 74 52 75 6c 65 2d 3e 6c  mp->startRule->l
9940: 68 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 64 64  hs;.  }.  /* Add
9950: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 73 74   to the first st
9960: 61 74 65 20 28 77 68 69 63 68 20 69 73 20 61 6c  ate (which is al
9970: 77 61 79 73 20 74 68 65 20 73 74 61 72 74 69 6e  ways the startin
9980: 67 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 20  g state of the. 
9990: 20 2a 2a 20 66 69 6e 69 74 65 20 73 74 61 74 65   ** finite state
99a0: 20 6d 61 63 68 69 6e 65 29 20 61 6e 20 61 63 74   machine) an act
99b0: 69 6f 6e 20 74 6f 20 41 43 43 45 50 54 20 69 66  ion to ACCEPT if
99c0: 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69   the lookahead i
99d0: 73 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74  s the.  ** start
99e0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 20 2a   nonterminal.  *
99f0: 2f 0a 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26  /.  Action_add(&
9a00: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 2d  lemp->sorted[0]-
9a10: 3e 61 70 2c 41 43 43 45 50 54 2c 73 70 2c 30 29  >ap,ACCEPT,sp,0)
9a20: 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  ;..  /* Resolve 
9a30: 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20 66  conflicts */.  f
9a40: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
9a50: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
9a60: 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
9a70: 2a 61 70 2c 20 2a 6e 61 70 3b 0a 20 20 20 20 73  *ap, *nap;.    s
9a80: 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
9a90: 64 5b 69 5d 3b 0a 20 20 20 20 2f 2a 20 61 73 73  d[i];.    /* ass
9aa0: 65 72 74 28 20 73 74 70 2d 3e 61 70 20 29 3b 20  ert( stp->ap ); 
9ab0: 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d  */.    stp->ap =
9ac0: 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70   Action_sort(stp
9ad0: 2d 3e 61 70 29 3b 0a 20 20 20 20 66 6f 72 28 61  ->ap);.    for(a
9ae0: 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26  p=stp->ap; ap &&
9af0: 20 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70   ap->next; ap=ap
9b00: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66  ->next){.      f
9b10: 6f 72 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b  or(nap=ap->next;
9b20: 20 6e 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d   nap && nap->sp=
9b30: 3d 61 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70  =ap->sp; nap=nap
9b40: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
9b50: 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74    /* The two act
9b60: 69 6f 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e  ions "ap" and "n
9b70: 61 70 22 20 68 61 76 65 20 74 68 65 20 73 61 6d  ap" have the sam
9b80: 65 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20  e lookahead..   
9b90: 20 20 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20        ** Figure 
9ba0: 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68  out which one sh
9bb0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a  ould be used */.
9bc0: 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e           lemp->n
9bd0: 63 6f 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f  conflict += reso
9be0: 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c  lve_conflict(ap,
9bf0: 6e 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nap);.      }.  
9c00: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
9c10: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 66 6f  port an error fo
9c20: 72 20 65 61 63 68 20 72 75 6c 65 20 74 68 61 74  r each rule that
9c30: 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 72 65   can never be re
9c40: 64 75 63 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28  duced. */.  for(
9c50: 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
9c60: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 20  p; rp=rp->next) 
9c70: 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20  rp->canReduce = 
9c80: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 66  LEMON_FALSE;.  f
9c90: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
9ca0: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
9cb0: 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
9cc0: 2a 61 70 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  *ap;.    for(ap=
9cd0: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d  lemp->sorted[i]-
9ce0: 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
9cf0: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
9d00: 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43   ap->type==REDUC
9d10: 45 20 29 20 61 70 2d 3e 78 2e 72 70 2d 3e 63 61  E ) ap->x.rp->ca
9d20: 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f  nReduce = LEMON_
9d30: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
9d40: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
9d50: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
9d60: 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72  next){.    if( r
9d70: 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 29 20 63  p->canReduce ) c
9d80: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 45 72 72  ontinue;.    Err
9d90: 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
9da0: 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e  name,rp->rulelin
9db0: 65 2c 22 54 68 69 73 20 72 75 6c 65 20 63 61 6e  e,"This rule can
9dc0: 20 6e 6f 74 20 62 65 20 72 65 64 75 63 65 64 2e   not be reduced.
9dd0: 5c 6e 22 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e  \n");.    lemp->
9de0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a  errorcnt++;.  }.
9df0: 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61 20  }../* Resolve a 
9e00: 63 6f 6e 66 6c 69 63 74 20 62 65 74 77 65 65 6e  conflict between
9e10: 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20 61   the two given a
9e20: 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 0a  ctions.  If the.
9e30: 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 63 61 6e 27  ** conflict can'
9e40: 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2c 20 72  t be resolved, r
9e50: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
9e60: 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47 45 52 20  **.** NO LONGER 
9e70: 54 52 55 45 3a 0a 2a 2a 20 20 20 54 6f 20 72 65  TRUE:.**   To re
9e80: 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63 74  solve a conflict
9e90: 2c 20 66 69 72 73 74 20 6c 6f 6f 6b 20 74 6f 20  , first look to 
9ea0: 73 65 65 20 69 66 20 65 69 74 68 65 72 20 61 63  see if either ac
9eb0: 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20 6f 6e 20  tion.**   is on 
9ec0: 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2e 20 20  an error rule.  
9ed0: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 61  In that case, ta
9ee0: 6b 65 20 74 68 65 20 61 63 74 69 6f 6e 20 77 68  ke the action wh
9ef0: 69 63 68 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ich.**   is not 
9f00: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
9f10: 74 68 65 20 65 72 72 6f 72 20 72 75 6c 65 2e 20  the error rule. 
9f20: 20 49 66 20 6e 65 69 74 68 65 72 20 6f 72 20 62   If neither or b
9f30: 6f 74 68 0a 2a 2a 20 20 20 61 63 74 69 6f 6e 73  oth.**   actions
9f40: 20 61 72 65 20 61 73 73 6f 63 69 61 74 65 64 20   are associated 
9f50: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 72 75  with an error ru
9f60: 6c 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 0a  le, then try to.
9f70: 2a 2a 20 20 20 75 73 65 20 70 72 65 63 65 64 65  **   use precede
9f80: 6e 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  nce to resolve t
9f90: 68 65 20 63 6f 6e 66 6c 69 63 74 2e 0a 2a 2a 0a  he conflict..**.
9fa0: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 61 63 74  ** If either act
9fb0: 69 6f 6e 20 69 73 20 61 20 53 48 49 46 54 2c 20  ion is a SHIFT, 
9fc0: 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20  then it must be 
9fd0: 61 70 78 2e 20 20 54 68 69 73 0a 2a 2a 20 66 75  apx.  This.** fu
9fe0: 6e 63 74 69 6f 6e 20 77 6f 6e 27 74 20 77 6f 72  nction won't wor
9ff0: 6b 20 69 66 20 61 70 78 2d 3e 74 79 70 65 3d 3d  k if apx->type==
a000: 52 45 44 55 43 45 20 61 6e 64 20 61 70 79 2d 3e  REDUCE and apy->
a010: 74 79 70 65 3d 3d 53 48 49 46 54 2e 0a 2a 2f 0a  type==SHIFT..*/.
a020: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
a030: 76 65 5f 63 6f 6e 66 6c 69 63 74 28 0a 20 20 73  ve_conflict(.  s
a040: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
a050: 78 2c 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  x,.  struct acti
a060: 6f 6e 20 2a 61 70 79 0a 29 7b 0a 20 20 73 74 72  on *apy.){.  str
a070: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 78 2c  uct symbol *spx,
a080: 20 2a 73 70 79 3b 0a 20 20 69 6e 74 20 65 72 72   *spy;.  int err
a090: 63 6e 74 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  cnt = 0;.  asser
a0a0: 74 28 20 61 70 78 2d 3e 73 70 3d 3d 61 70 79 2d  t( apx->sp==apy-
a0b0: 3e 73 70 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72  >sp );  /* Other
a0c0: 77 69 73 65 20 74 68 65 72 65 20 77 6f 75 6c 64  wise there would
a0d0: 20 62 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 20   be no conflict 
a0e0: 2a 2f 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79  */.  if( apx->ty
a0f0: 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79  pe==SHIFT && apy
a100: 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 29 7b  ->type==SHIFT ){
a110: 0a 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d  .    apy->type =
a120: 20 53 53 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20   SSCONFLICT;.   
a130: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20   errcnt++;.  }. 
a140: 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d   if( apx->type==
a150: 53 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79  SHIFT && apy->ty
a160: 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20  pe==REDUCE ){.  
a170: 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 73 70 3b    spx = apx->sp;
a180: 0a 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e  .    spy = apy->
a190: 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20  x.rp->precsym;. 
a1a0: 20 20 20 69 66 28 20 73 70 79 3d 3d 30 20 7c 7c     if( spy==0 ||
a1b0: 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 20   spx->prec<0 || 
a1c0: 73 70 79 2d 3e 70 72 65 63 3c 30 20 29 7b 0a 20  spy->prec<0 ){. 
a1d0: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f 75       /* Not enou
a1e0: 67 68 20 70 72 65 63 65 64 65 6e 63 65 20 69 6e  gh precedence in
a1f0: 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  formation. */.  
a200: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
a210: 53 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20  SRCONFLICT;.    
a220: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20    errcnt++;.    
a230: 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70  }else if( spx->p
a240: 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b  rec>spy->prec ){
a250: 20 20 20 20 2f 2a 20 68 69 67 68 65 72 20 70 72      /* higher pr
a260: 65 63 65 64 65 6e 63 65 20 77 69 6e 73 20 2a 2f  ecedence wins */
a270: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
a280: 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a   = RD_RESOLVED;.
a290: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
a2a0: 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65  x->prec<spy->pre
a2b0: 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e  c ){.      apx->
a2c0: 74 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56  type = SH_RESOLV
a2d0: 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ED;.    }else if
a2e0: 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  ( spx->prec==spy
a2f0: 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61  ->prec && spx->a
a300: 73 73 6f 63 3d 3d 52 49 47 48 54 20 29 7b 20 2f  ssoc==RIGHT ){ /
a310: 2a 20 55 73 65 20 6f 70 65 72 61 74 6f 72 20 2a  * Use operator *
a320: 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  /.      apy->typ
a330: 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b  e = RD_RESOLVED;
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a360: 61 73 73 6f 63 69 61 74 69 76 69 74 79 20 2a 2f  associativity */
a370: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
a380: 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70  px->prec==spy->p
a390: 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f  rec && spx->asso
a3a0: 63 3d 3d 4c 45 46 54 20 29 7b 20 20 2f 2a 20 74  c==LEFT ){  /* t
a3b0: 6f 20 62 72 65 61 6b 20 74 69 65 20 2a 2f 0a 20  o break tie */. 
a3c0: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d       apx->type =
a3d0: 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   SH_RESOLVED;.  
a3e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
a3f0: 73 73 65 72 74 28 20 73 70 78 2d 3e 70 72 65 63  ssert( spx->prec
a400: 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73  ==spy->prec && s
a410: 70 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20  px->assoc==NONE 
a420: 29 3b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  );.      apx->ty
a430: 70 65 20 3d 20 45 52 52 4f 52 3b 0a 20 20 20 20  pe = ERROR;.    
a440: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70  }.  }else if( ap
a450: 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  x->type==REDUCE 
a460: 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45  && apy->type==RE
a470: 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20  DUCE ){.    spx 
a480: 3d 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72 65  = apx->x.rp->pre
a490: 63 73 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d 20  csym;.    spy = 
a4a0: 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73  apy->x.rp->precs
a4b0: 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 78 3d  ym;.    if( spx=
a4c0: 3d 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c 20  =0 || spy==0 || 
a4d0: 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a 20  spx->prec<0 ||. 
a4e0: 20 20 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 7c     spy->prec<0 |
a4f0: 7c 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  | spx->prec==spy
a500: 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20  ->prec ){.      
a510: 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 52 43 4f  apy->type = RRCO
a520: 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72  NFLICT;.      er
a530: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  rcnt++;.    }els
a540: 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e  e if( spx->prec>
a550: 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20  spy->prec ){.   
a560: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52     apy->type = R
a570: 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20  D_RESOLVED;.    
a580: 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70  }else if( spx->p
a590: 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b  rec<spy->prec ){
a5a0: 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65  .      apx->type
a5b0: 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a   = RD_RESOLVED;.
a5c0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
a5d0: 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20     assert( .    
a5e0: 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 5f    apx->type==SH_
a5f0: 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20  RESOLVED ||.    
a600: 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44 5f    apx->type==RD_
a610: 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20  RESOLVED ||.    
a620: 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 53 43    apx->type==SSC
a630: 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20  ONFLICT ||.     
a640: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 52 43 4f   apx->type==SRCO
a650: 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20  NFLICT ||.      
a660: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e  apx->type==RRCON
a670: 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61  FLICT ||.      a
a680: 70 79 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53  py->type==SH_RES
a690: 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61  OLVED ||.      a
a6a0: 70 79 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53  py->type==RD_RES
a6b0: 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61  OLVED ||.      a
a6c0: 70 79 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e 46  py->type==SSCONF
a6d0: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
a6e0: 79 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46 4c  y->type==SRCONFL
a6f0: 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  ICT ||.      apy
a700: 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c 49  ->type==RRCONFLI
a710: 43 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f 2a  CT.    );.    /*
a720: 20 54 68 65 20 52 45 44 55 43 45 2f 53 48 49 46   The REDUCE/SHIF
a730: 54 20 63 61 73 65 20 63 61 6e 6e 6f 74 20 68 61  T case cannot ha
a740: 70 70 65 6e 20 62 65 63 61 75 73 65 20 53 48 49  ppen because SHI
a750: 46 54 73 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a  FTs come before.
a760: 20 20 20 20 2a 2a 20 52 45 44 55 43 45 73 20 6f      ** REDUCEs o
a770: 6e 20 74 68 65 20 6c 69 73 74 2e 20 20 49 66 20  n the list.  If 
a780: 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
a790: 69 6e 74 20 69 74 20 6d 75 73 74 20 62 65 20 62  int it must be b
a7a0: 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68  ecause.    ** th
a7b0: 65 20 70 61 72 73 65 72 20 63 6f 6e 66 6c 69 63  e parser conflic
a7c0: 74 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  t had already be
a7d0: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a  en resolved. */.
a7e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72    }.  return err
a7f0: 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  cnt;.}./********
a800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
a810: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e  om the file "con
a820: 66 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a  figlist.c" *****
a830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a840: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ****/./*.** Rout
a850: 69 6e 65 73 20 74 6f 20 70 72 6f 63 65 73 73 69  ines to processi
a860: 6e 67 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69  ng a configurati
a870: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 62 75 69 6c  on list and buil
a880: 64 69 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a 20  ding a state.** 
a890: 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  in the LEMON par
a8a0: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
a8b0: 2f 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  /..static struct
a8c0: 20 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69 73   config *freelis
a8d0: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c  t = 0;      /* L
a8e0: 69 73 74 20 6f 66 20 66 72 65 65 20 63 6f 6e 66  ist of free conf
a8f0: 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  igurations */.st
a900: 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66  atic struct conf
a910: 69 67 20 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b  ig *current = 0;
a920: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
a930: 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75   list of configu
a940: 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
a950: 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  c struct config 
a960: 2a 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30  **currentend = 0
a970: 3b 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c  ;   /* Last on l
a980: 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a  ist of configs *
a990: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
a9a0: 63 6f 6e 66 69 67 20 2a 62 61 73 69 73 20 3d 20  config *basis = 
a9b0: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  0;         /* To
a9c0: 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73  p of list of bas
a9d0: 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74  is configs */.st
a9e0: 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66  atic struct conf
a9f0: 69 67 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20  ig **basisend = 
aa00: 30 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  0;     /* End of
aa10: 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20 63   list of basis c
aa20: 6f 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65  onfigs */../* Re
aa30: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
aa40: 6f 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72  o a new configur
aa50: 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45  ation */.PRIVATE
aa60: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
aa70: 6e 65 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20 73  newconfig(){.  s
aa80: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
aa90: 77 63 66 67 3b 0a 20 20 69 66 28 20 66 72 65 65  wcfg;.  if( free
aaa0: 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  list==0 ){.    i
aab0: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d  nt i;.    int am
aac0: 74 20 3d 20 33 3b 0a 20 20 20 20 66 72 65 65 6c  t = 3;.    freel
aad0: 69 73 74 20 3d 20 28 73 74 72 75 63 74 20 63 6f  ist = (struct co
aae0: 6e 66 69 67 20 2a 29 63 61 6c 6c 6f 63 28 20 61  nfig *)calloc( a
aaf0: 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63  mt, sizeof(struc
ab00: 74 20 63 6f 6e 66 69 67 29 20 29 3b 0a 20 20 20  t config) );.   
ab10: 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30   if( freelist==0
ab20: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
ab30: 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65  f(stderr,"Unable
ab40: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
ab50: 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 63 6f  ory for a new co
ab60: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 22 29 3b 0a  nfiguration.");.
ab70: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
ab80: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
ab90: 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20  ; i<amt-1; i++) 
aba0: 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74  freelist[i].next
abb0: 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31   = &freelist[i+1
abc0: 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b  ];.    freelist[
abd0: 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b  amt-1].next = 0;
abe0: 0a 20 20 7d 0a 20 20 6e 65 77 63 66 67 20 3d 20  .  }.  newcfg = 
abf0: 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65  freelist;.  free
ac00: 6c 69 73 74 20 3d 20 66 72 65 65 6c 69 73 74 2d  list = freelist-
ac10: 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20  >next;.  return 
ac20: 6e 65 77 63 66 67 3b 0a 7d 0a 0a 2f 2a 20 54 68  newcfg;.}../* Th
ac30: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
ac40: 22 6f 6c 64 22 20 69 73 20 6e 6f 20 6c 6f 6e 67  "old" is no long
ac50: 65 72 20 75 73 65 64 20 2a 2f 0a 50 52 49 56 41  er used */.PRIVA
ac60: 54 45 20 76 6f 69 64 20 64 65 6c 65 74 65 63 6f  TE void deleteco
ac70: 6e 66 69 67 28 73 74 72 75 63 74 20 63 6f 6e 66  nfig(struct conf
ac80: 69 67 20 2a 6f 6c 64 29 0a 7b 0a 20 20 6f 6c 64  ig *old).{.  old
ac90: 2d 3e 6e 65 78 74 20 3d 20 66 72 65 65 6c 69 73  ->next = freelis
aca0: 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20  t;.  freelist = 
acb0: 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69  old;.}../* Initi
acc0: 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69  alized the confi
acd0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75  guration list bu
ace0: 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f  ilder */.void Co
acf0: 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 7b  nfiglist_init(){
ad00: 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a  .  current = 0;.
ad10: 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26    currentend = &
ad20: 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73  current;.  basis
ad30: 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64   = 0;.  basisend
ad40: 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e   = &basis;.  Con
ad50: 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 3b  figtable_init();
ad60: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
ad70: 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65   Initialized the
ad80: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
ad90: 69 73 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76  ist builder */.v
ada0: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72  oid Configlist_r
adb0: 65 73 65 74 28 29 7b 0a 20 20 63 75 72 72 65 6e  eset(){.  curren
adc0: 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74  t = 0;.  current
add0: 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a  end = &current;.
ade0: 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62    basis = 0;.  b
adf0: 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73  asisend = &basis
ae00: 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  ;.  Configtable_
ae10: 63 6c 65 61 72 28 30 29 3b 0a 20 20 72 65 74 75  clear(0);.  retu
ae20: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e  rn;.}../* Add an
ae30: 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74  other configurat
ae40: 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69  ion to the confi
ae50: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  guration list */
ae60: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
ae70: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 0a  Configlist_add(.
ae80: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
ae90: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c  p,    /* The rul
aea0: 65 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 20 20  e */.  int dot  
aeb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
aec0: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53  dex into the RHS
aed0: 20 6f 66 20 74 68 65 20 72 75 6c 65 20 77 68 65   of the rule whe
aee0: 72 65 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20  re the dot goes 
aef0: 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 63  */.){.  struct c
af00: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65  onfig *cfp, mode
af10: 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  l;..  assert( cu
af20: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
af30: 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a   model.rp = rp;.
af40: 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f    model.dot = do
af50: 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  t;.  cfp = Confi
af60: 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64  gtable_find(&mod
af70: 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d  el);.  if( cfp==
af80: 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e  0 ){.    cfp = n
af90: 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20  ewconfig();.    
afa0: 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20  cfp->rp = rp;.  
afb0: 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74    cfp->dot = dot
afc0: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d  ;.    cfp->fws =
afd0: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63   SetNew();.    c
afe0: 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20  fp->stp = 0;.   
aff0: 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70   cfp->fplp = cfp
b000: 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20  ->bplp = 0;.    
b010: 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20  cfp->next = 0;. 
b020: 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a     cfp->bp = 0;.
b030: 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20      *currentend 
b040: 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65  = cfp;.    curre
b050: 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65  ntend = &cfp->ne
b060: 78 74 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61  xt;.    Configta
b070: 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b  ble_insert(cfp);
b080: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66  .  }.  return cf
b090: 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62  p;.}../* Add a b
b0a0: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
b0b0: 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67  on to the config
b0c0: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
b0d0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
b0e0: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
b0f0: 69 73 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a  is(struct rule *
b100: 72 70 2c 20 69 6e 74 20 64 6f 74 29 0a 7b 0a 20  rp, int dot).{. 
b110: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
b120: 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61  cfp, model;..  a
b130: 73 73 65 72 74 28 20 62 61 73 69 73 65 6e 64 21  ssert( basisend!
b140: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b150: 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b  currentend!=0 );
b160: 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70  .  model.rp = rp
b170: 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20  ;.  model.dot = 
b180: 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e  dot;.  cfp = Con
b190: 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d  figtable_find(&m
b1a0: 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70  odel);.  if( cfp
b1b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d  ==0 ){.    cfp =
b1c0: 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20   newconfig();.  
b1d0: 20 20 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a    cfp->rp = rp;.
b1e0: 20 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64      cfp->dot = d
b1f0: 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73  ot;.    cfp->fws
b200: 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20   = SetNew();.   
b210: 20 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20   cfp->stp = 0;. 
b220: 20 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63     cfp->fplp = c
b230: 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20  fp->bplp = 0;.  
b240: 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b    cfp->next = 0;
b250: 0a 20 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30  .    cfp->bp = 0
b260: 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e  ;.    *currenten
b270: 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72  d = cfp;.    cur
b280: 72 65 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e  rentend = &cfp->
b290: 6e 65 78 74 3b 0a 20 20 20 20 2a 62 61 73 69 73  next;.    *basis
b2a0: 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 62  end = cfp;.    b
b2b0: 61 73 69 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e  asisend = &cfp->
b2c0: 62 70 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61  bp;.    Configta
b2d0: 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b  ble_insert(cfp);
b2e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66  .  }.  return cf
b2f0: 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65  p;.}../* Compute
b300: 20 74 68 65 20 63 6c 6f 73 75 72 65 20 6f 66 20   the closure of 
b310: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
b320: 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43  n list */.void C
b330: 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72  onfiglist_closur
b340: 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  e(struct lemon *
b350: 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74  lemp).{.  struct
b360: 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6e   config *cfp, *n
b370: 65 77 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20  ewcfp;.  struct 
b380: 72 75 6c 65 20 2a 72 70 2c 20 2a 6e 65 77 72 70  rule *rp, *newrp
b390: 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  ;.  struct symbo
b3a0: 6c 20 2a 73 70 2c 20 2a 78 73 70 3b 0a 20 20 69  l *sp, *xsp;.  i
b3b0: 6e 74 20 69 2c 20 64 6f 74 3b 0a 0a 20 20 61 73  nt i, dot;..  as
b3c0: 73 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64  sert( currentend
b3d0: 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 63 66 70  !=0 );.  for(cfp
b3e0: 3d 63 75 72 72 65 6e 74 3b 20 63 66 70 3b 20 63  =current; cfp; c
b3f0: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
b400: 20 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b     rp = cfp->rp;
b410: 0a 20 20 20 20 64 6f 74 20 3d 20 63 66 70 2d 3e  .    dot = cfp->
b420: 64 6f 74 3b 0a 20 20 20 20 69 66 28 20 64 6f 74  dot;.    if( dot
b430: 3e 3d 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e  >=rp->nrhs ) con
b440: 74 69 6e 75 65 3b 0a 20 20 20 20 73 70 20 3d 20  tinue;.    sp = 
b450: 72 70 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20 20  rp->rhs[dot];.  
b460: 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
b470: 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  NONTERMINAL ){. 
b480: 20 20 20 20 20 69 66 28 20 73 70 2d 3e 72 75 6c       if( sp->rul
b490: 65 3d 3d 30 20 26 26 20 73 70 21 3d 6c 65 6d 70  e==0 && sp!=lemp
b4a0: 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20  ->errsym ){.    
b4b0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
b4c0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
b4d0: 6c 69 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61  line,"Nontermina
b4e0: 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 6e 6f 20  l \"%s\" has no 
b4f0: 72 75 6c 65 73 2e 22 2c 0a 20 20 20 20 20 20 20  rules.",.       
b500: 20 20 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20     sp->name);.  
b510: 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
b520: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
b530: 20 20 20 20 20 20 66 6f 72 28 6e 65 77 72 70 3d        for(newrp=
b540: 73 70 2d 3e 72 75 6c 65 3b 20 6e 65 77 72 70 3b  sp->rule; newrp;
b550: 20 6e 65 77 72 70 3d 6e 65 77 72 70 2d 3e 6e 65   newrp=newrp->ne
b560: 78 74 6c 68 73 29 7b 0a 20 20 20 20 20 20 20 20  xtlhs){.        
b570: 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c  newcfp = Configl
b580: 69 73 74 5f 61 64 64 28 6e 65 77 72 70 2c 30 29  ist_add(newrp,0)
b590: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
b5a0: 64 6f 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72 68  dot+1; i<rp->nrh
b5b0: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
b5c0: 20 20 20 78 73 70 20 3d 20 72 70 2d 3e 72 68 73     xsp = rp->rhs
b5d0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
b5e0: 66 28 20 78 73 70 2d 3e 74 79 70 65 3d 3d 54 45  f( xsp->type==TE
b5f0: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
b600: 20 20 20 20 20 20 53 65 74 41 64 64 28 6e 65 77        SetAdd(new
b610: 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 69 6e  cfp->fws,xsp->in
b620: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dex);.          
b630: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
b640: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 73 70     }else if( xsp
b650: 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
b660: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
b670: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
b680: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
b690: 20 6b 3c 78 73 70 2d 3e 6e 73 75 62 73 79 6d 3b   k<xsp->nsubsym;
b6a0: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   k++){.         
b6b0: 20 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63       SetAdd(newc
b6c0: 66 70 2d 3e 66 77 73 2c 20 78 73 70 2d 3e 73 75  fp->fws, xsp->su
b6d0: 62 73 79 6d 5b 6b 5d 2d 3e 69 6e 64 65 78 29 3b  bsym[k]->index);
b6e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
b6f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b700: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
b710: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  e{.            S
b720: 65 74 55 6e 69 6f 6e 28 6e 65 77 63 66 70 2d 3e  etUnion(newcfp->
b730: 66 77 73 2c 78 73 70 2d 3e 66 69 72 73 74 73 65  fws,xsp->firstse
b740: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
b750: 69 66 28 20 78 73 70 2d 3e 6c 61 6d 62 64 61 3d  if( xsp->lambda=
b760: 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62  =LEMON_FALSE ) b
b770: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b780: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
b790: 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e      if( i==rp->n
b7a0: 72 68 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28  rhs ) Plink_add(
b7b0: 26 63 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66  &cfp->fplp,newcf
b7c0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
b7d0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  }.  }.  return;.
b7e0: 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 63  }../* Sort the c
b7f0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
b800: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
b810: 6c 69 73 74 5f 73 6f 72 74 28 29 7b 0a 20 20 63  list_sort(){.  c
b820: 75 72 72 65 6e 74 20 3d 20 28 73 74 72 75 63 74  urrent = (struct
b830: 20 63 6f 6e 66 69 67 2a 29 6d 73 6f 72 74 28 28   config*)msort((
b840: 63 68 61 72 2a 29 63 75 72 72 65 6e 74 2c 28 63  char*)current,(c
b850: 68 61 72 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d  har**)&(current-
b860: 3e 6e 65 78 74 29 2c 0a 20 20 20 20 20 20 20 20  >next),.        
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 20 20 20 20 20 20 20 20 20 20 43 6f 6e 66 69 67            Config
b890: 63 6d 70 29 3b 0a 20 20 63 75 72 72 65 6e 74 65  cmp);.  currente
b8a0: 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  nd = 0;.  return
b8b0: 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65  ;.}../* Sort the
b8c0: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
b8d0: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69  tion list */.voi
b8e0: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72  d Configlist_sor
b8f0: 74 62 61 73 69 73 28 29 7b 0a 20 20 62 61 73 69  tbasis(){.  basi
b900: 73 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  s = (struct conf
b910: 69 67 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 2a  ig*)msort((char*
b920: 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72 2a 2a  )current,(char**
b930: 29 26 28 63 75 72 72 65 6e 74 2d 3e 62 70 29 2c  )&(current->bp),
b940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20 62   Configcmp);.  b
b970: 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72  asisend = 0;.  r
b980: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  eturn;.}../* Ret
b990: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
b9a0: 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65   the head of the
b9b0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
b9c0: 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65 74  ist and.** reset
b9d0: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74 72   the list */.str
b9e0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
b9f0: 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 7b  iglist_return(){
ba00: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
ba10: 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 63   *old;.  old = c
ba20: 75 72 72 65 6e 74 3b 0a 20 20 63 75 72 72 65 6e  urrent;.  curren
ba30: 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74  t = 0;.  current
ba40: 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  end = 0;.  retur
ba50: 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  n old;.}../* Ret
ba60: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
ba70: 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65   the head of the
ba80: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
ba90: 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65 74  ist and.** reset
baa0: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74 72   the list */.str
bab0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
bac0: 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29 7b 0a  iglist_basis(){.
bad0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
bae0: 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 62 61  *old;.  old = ba
baf0: 73 69 73 3b 0a 20 20 62 61 73 69 73 20 3d 20 30  sis;.  basis = 0
bb00: 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 30  ;.  basisend = 0
bb10: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a  ;.  return old;.
bb20: 7d 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 65  }../* Free all e
bb30: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 67  lements of the g
bb40: 69 76 65 6e 20 63 6f 6e 66 69 67 75 72 61 74 69  iven configurati
bb50: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20  on list */.void 
bb60: 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 73  Configlist_eat(s
bb70: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
bb80: 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  p).{.  struct co
bb90: 6e 66 69 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20  nfig *nextcfp;. 
bba0: 20 66 6f 72 28 3b 20 63 66 70 3b 20 63 66 70 3d   for(; cfp; cfp=
bbb0: 6e 65 78 74 63 66 70 29 7b 0a 20 20 20 20 6e 65  nextcfp){.    ne
bbc0: 78 74 63 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78  xtcfp = cfp->nex
bbd0: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  t;.    assert( c
bbe0: 66 70 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20  fp->fplp==0 );. 
bbf0: 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e     assert( cfp->
bc00: 62 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69  bplp==0 );.    i
bc10: 66 28 20 63 66 70 2d 3e 66 77 73 20 29 20 53 65  f( cfp->fws ) Se
bc20: 74 46 72 65 65 28 63 66 70 2d 3e 66 77 73 29 3b  tFree(cfp->fws);
bc30: 0a 20 20 20 20 64 65 6c 65 74 65 63 6f 6e 66 69  .    deleteconfi
bc40: 67 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65  g(cfp);.  }.  re
bc50: 74 75 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  turn;.}./*******
bc60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
bc70: 74 68 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e  the file "error.
bc80: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
bc90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bca0: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  ****/./*.** Code
bcb0: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 65 72   for printing er
bcc0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
bcd0: 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63  .void ErrorMsg(c
bce0: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
bcf0: 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c  ame, int lineno,
bd00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72   const char *for
bd10: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
bd20: 6c 69 73 74 20 61 70 3b 0a 20 20 66 70 72 69 6e  list ap;.  fprin
bd30: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
bd40: 64 3a 20 22 2c 20 66 69 6c 65 6e 61 6d 65 2c 20  d: ", filename, 
bd50: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 76 61 5f 73 74  lineno);.  va_st
bd60: 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b  art(ap, format);
bd70: 0a 20 20 76 66 70 72 69 6e 74 66 28 73 74 64 65  .  vfprintf(stde
bd80: 72 72 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20  rr,format,ap);. 
bd90: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66   va_end(ap);.  f
bda0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
bdb0: 5c 6e 22 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  \n");.}./*******
bdc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
bdd0: 68 65 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22  he file "main.c"
bde0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
bdf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be00: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69  *****/./*.** Mai
be10: 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c 65 20 66  n program file f
be20: 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  or the LEMON par
be30: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
be40: 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20  /../* Report an 
be50: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f  out-of-memory co
be60: 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72  ndition and abor
be70: 74 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  t.  This functio
be80: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f 73  n.** is used mos
be90: 74 6c 79 20 62 79 20 74 68 65 20 22 4d 65 6d 6f  tly by the "Memo
bea0: 72 79 43 68 65 63 6b 22 20 6d 61 63 72 6f 20 69  ryCheck" macro i
beb0: 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f  n struct.h.*/.vo
bec0: 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  id memory_error(
bed0: 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  ){.  fprintf(std
bee0: 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f  err,"Out of memo
bef0: 72 79 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e 2e  ry.  Aborting...
bf00: 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b  \n");.  exit(1);
bf10: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .}..static int n
bf20: 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 20 20 20  Define = 0;     
bf30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 2d 44   /* Number of -D
bf40: 20 6f 70 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20   options on the 
bf50: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a  command line */.
bf60: 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 61 7a  static char **az
bf70: 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 2f 2a 20  Define = 0;  /* 
bf80: 4e 61 6d 65 20 6f 66 20 74 68 65 20 2d 44 20 6d  Name of the -D m
bf90: 61 63 72 6f 73 20 2a 2f 0a 0a 2f 2a 20 54 68 69  acros */../* Thi
bfa0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
bfb0: 6c 65 64 20 77 69 74 68 20 74 68 65 20 61 72 67  led with the arg
bfc0: 75 6d 65 6e 74 20 74 6f 20 65 61 63 68 20 2d 44  ument to each -D
bfd0: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
bfe0: 74 69 6f 6e 2e 0a 2a 2a 20 41 64 64 20 74 68 65  tion..** Add the
bff0: 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 20 74   macro defined t
c000: 6f 20 74 68 65 20 61 7a 44 65 66 69 6e 65 20 61  o the azDefine a
c010: 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
c020: 76 6f 69 64 20 68 61 6e 64 6c 65 5f 44 5f 6f 70  void handle_D_op
c030: 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20  tion(char *z){. 
c040: 20 63 68 61 72 20 2a 2a 70 61 7a 3b 0a 20 20 6e   char **paz;.  n
c050: 44 65 66 69 6e 65 2b 2b 3b 0a 20 20 61 7a 44 65  Define++;.  azDe
c060: 66 69 6e 65 20 3d 20 28 63 68 61 72 20 2a 2a 29  fine = (char **)
c070: 20 72 65 61 6c 6c 6f 63 28 61 7a 44 65 66 69 6e   realloc(azDefin
c080: 65 2c 20 73 69 7a 65 6f 66 28 61 7a 44 65 66 69  e, sizeof(azDefi
c090: 6e 65 5b 30 5d 29 2a 6e 44 65 66 69 6e 65 29 3b  ne[0])*nDefine);
c0a0: 0a 20 20 69 66 28 20 61 7a 44 65 66 69 6e 65 3d  .  if( azDefine=
c0b0: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
c0c0: 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20 6f 66  f(stderr,"out of
c0d0: 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
c0e0: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
c0f0: 70 61 7a 20 3d 20 26 61 7a 44 65 66 69 6e 65 5b  paz = &azDefine[
c100: 6e 44 65 66 69 6e 65 2d 31 5d 3b 0a 20 20 2a 70  nDefine-1];.  *p
c110: 61 7a 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61  az = (char *) ma
c120: 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65  lloc( lemonStrle
c130: 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28 20  n(z)+1 );.  if( 
c140: 2a 70 61 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66  *paz==0 ){.    f
c150: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6f  printf(stderr,"o
c160: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29  ut of memory\n")
c170: 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
c180: 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70   }.  lemon_strcp
c190: 79 28 2a 70 61 7a 2c 20 7a 29 3b 0a 20 20 66 6f  y(*paz, z);.  fo
c1a0: 72 28 7a 3d 2a 70 61 7a 3b 20 2a 7a 20 26 26 20  r(z=*paz; *z && 
c1b0: 2a 7a 21 3d 27 3d 27 3b 20 7a 2b 2b 29 7b 7d 0a  *z!='='; z++){}.
c1c0: 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61    *z = 0;.}..sta
c1d0: 74 69 63 20 63 68 61 72 20 2a 75 73 65 72 5f 74  tic char *user_t
c1e0: 65 6d 70 6c 61 74 65 6e 61 6d 65 20 3d 20 4e 55  emplatename = NU
c1f0: 4c 4c 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  LL;.static void 
c200: 68 61 6e 64 6c 65 5f 54 5f 6f 70 74 69 6f 6e 28  handle_T_option(
c210: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 73 65 72  char *z){.  user
c220: 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20 3d 20  _templatename = 
c230: 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28  (char *) malloc(
c240: 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b   lemonStrlen(z)+
c250: 31 20 29 3b 0a 20 20 69 66 28 20 75 73 65 72 5f  1 );.  if( user_
c260: 74 65 6d 70 6c 61 74 65 6e 61 6d 65 3d 3d 30 20  templatename==0 
c270: 29 7b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72  ){.    memory_er
c280: 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d  ror();.  }.  lem
c290: 6f 6e 5f 73 74 72 63 70 79 28 75 73 65 72 5f 74  on_strcpy(user_t
c2a0: 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 20 7a 29 3b  emplatename, z);
c2b0: 0a 7d 0a 0a 2f 2a 20 4d 65 72 67 65 20 74 6f 67  .}../* Merge tog
c2c0: 65 74 68 65 72 20 74 6f 20 6c 69 73 74 73 20 6f  ether to lists o
c2d0: 66 20 72 75 6c 65 73 20 6f 72 64 65 72 65 64 20  f rules ordered 
c2e0: 62 79 20 72 75 6c 65 2e 69 52 75 6c 65 20 2a 2f  by rule.iRule */
c2f0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 72  .static struct r
c300: 75 6c 65 20 2a 52 75 6c 65 5f 6d 65 72 67 65 28  ule *Rule_merge(
c310: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 41 2c  struct rule *pA,
c320: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 42   struct rule *pB
c330: 29 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  ){.  struct rule
c340: 20 2a 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20   *pFirst = 0;.  
c350: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 2a 70 70  struct rule **pp
c360: 50 72 65 76 20 3d 20 26 70 46 69 72 73 74 3b 0a  Prev = &pFirst;.
c370: 20 20 77 68 69 6c 65 28 20 70 41 20 26 26 20 70    while( pA && p
c380: 42 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d  B ){.    if( pA-
c390: 3e 69 52 75 6c 65 3c 70 42 2d 3e 69 52 75 6c 65  >iRule<pB->iRule
c3a0: 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 72 65   ){.      *ppPre
c3b0: 76 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 70  v = pA;.      pp
c3c0: 50 72 65 76 20 3d 20 26 70 41 2d 3e 6e 65 78 74  Prev = &pA->next
c3d0: 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d  ;.      pA = pA-
c3e0: 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  >next;.    }else
c3f0: 7b 0a 20 20 20 20 20 20 2a 70 70 50 72 65 76 20  {.      *ppPrev 
c400: 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 70 50 72  = pB;.      ppPr
c410: 65 76 20 3d 20 26 70 42 2d 3e 6e 65 78 74 3b 0a  ev = &pB->next;.
c420: 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 6e        pB = pB->n
c430: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ext;.    }.  }. 
c440: 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20 20 2a   if( pA ){.    *
c450: 70 70 50 72 65 76 20 3d 20 70 41 3b 0a 20 20 7d  ppPrev = pA;.  }
c460: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 72 65  else{.    *ppPre
c470: 76 20 3d 20 70 42 3b 0a 20 20 7d 0a 20 20 72 65  v = pB;.  }.  re
c480: 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a  turn pFirst;.}..
c490: 2f 2a 0a 2a 2a 20 53 6f 72 74 20 61 20 6c 69 73  /*.** Sort a lis
c4a0: 74 20 6f 66 20 72 75 6c 65 73 20 69 6e 20 6f 72  t of rules in or
c4b0: 64 65 72 20 6f 66 20 69 6e 63 72 65 61 73 69 6e  der of increasin
c4c0: 67 20 69 52 75 6c 65 20 76 61 6c 75 65 0a 2a 2f  g iRule value.*/
c4d0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 72  .static struct r
c4e0: 75 6c 65 20 2a 52 75 6c 65 5f 73 6f 72 74 28 73  ule *Rule_sort(s
c4f0: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b  truct rule *rp){
c500: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
c510: 63 74 20 72 75 6c 65 20 2a 70 4e 65 78 74 3b 0a  ct rule *pNext;.
c520: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 78    struct rule *x
c530: 5b 33 32 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 78  [32];.  memset(x
c540: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b  , 0, sizeof(x));
c550: 0a 20 20 77 68 69 6c 65 28 20 72 70 20 29 7b 0a  .  while( rp ){.
c560: 20 20 20 20 70 4e 65 78 74 20 3d 20 72 70 2d 3e      pNext = rp->
c570: 6e 65 78 74 3b 0a 20 20 20 20 72 70 2d 3e 6e 65  next;.    rp->ne
c580: 78 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  xt = 0;.    for(
c590: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 78 29  i=0; i<sizeof(x)
c5a0: 2f 73 69 7a 65 6f 66 28 78 5b 30 5d 29 20 26 26  /sizeof(x[0]) &&
c5b0: 20 78 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   x[i]; i++){.   
c5c0: 20 20 20 72 70 20 3d 20 52 75 6c 65 5f 6d 65 72     rp = Rule_mer
c5d0: 67 65 28 78 5b 69 5d 2c 20 72 70 29 3b 0a 20 20  ge(x[i], rp);.  
c5e0: 20 20 20 20 78 5b 69 5d 20 3d 20 30 3b 0a 20 20      x[i] = 0;.  
c5f0: 20 20 7d 0a 20 20 20 20 78 5b 69 5d 20 3d 20 72    }.    x[i] = r
c600: 70 3b 0a 20 20 20 20 72 70 20 3d 20 70 4e 65 78  p;.    rp = pNex
c610: 74 3b 0a 20 20 7d 0a 20 20 72 70 20 3d 20 30 3b  t;.  }.  rp = 0;
c620: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
c630: 7a 65 6f 66 28 78 29 2f 73 69 7a 65 6f 66 28 78  zeof(x)/sizeof(x
c640: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
c650: 72 70 20 3d 20 52 75 6c 65 5f 6d 65 72 67 65 28  rp = Rule_merge(
c660: 78 5b 69 5d 2c 20 72 70 29 3b 0a 20 20 7d 0a 20  x[i], rp);.  }. 
c670: 20 72 65 74 75 72 6e 20 72 70 3b 0a 7d 0a 0a 2f   return rp;.}../
c680: 2a 20 66 6f 72 77 61 72 64 20 72 65 66 65 72 65  * forward refere
c690: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  nce */.static co
c6a0: 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d 75  nst char *minimu
c6b0: 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74 20  m_size_type(int 
c6c0: 6c 77 72 2c 20 69 6e 74 20 75 70 72 2c 20 69 6e  lwr, int upr, in
c6d0: 74 20 2a 70 6e 42 79 74 65 29 3b 0a 0a 2f 2a 20  t *pnByte);../* 
c6e0: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6c  Print a single l
c6f0: 69 6e 65 20 6f 66 20 74 68 65 20 22 50 61 72 73  ine of the "Pars
c700: 65 72 20 53 74 61 74 73 22 20 6f 75 74 70 75 74  er Stats" output
c710: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c720: 73 74 61 74 73 5f 6c 69 6e 65 28 63 6f 6e 73 74  stats_line(const
c730: 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 69   char *zLabel, i
c740: 6e 74 20 69 56 61 6c 75 65 29 7b 0a 20 20 69 6e  nt iValue){.  in
c750: 74 20 6e 4c 61 62 65 6c 20 3d 20 6c 65 6d 6f 6e  t nLabel = lemon
c760: 53 74 72 6c 65 6e 28 7a 4c 61 62 65 6c 29 3b 0a  Strlen(zLabel);.
c770: 20 20 70 72 69 6e 74 66 28 22 20 20 25 73 25 2e    printf("  %s%.
c780: 2a 73 20 25 35 64 5c 6e 22 2c 20 7a 4c 61 62 65  *s %5d\n", zLabe
c790: 6c 2c 0a 20 20 20 20 20 20 20 20 20 33 35 2d 6e  l,.         35-n
c7a0: 4c 61 62 65 6c 2c 20 22 2e 2e 2e 2e 2e 2e 2e 2e  Label, "........
c7b0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
c7c0: 2e 2e 2e 2e 2e 2e 2e 2e 22 2c 0a 20 20 20 20 20  ........",.     
c7d0: 20 20 20 20 69 56 61 6c 75 65 29 3b 0a 7d 0a 0a      iValue);.}..
c7e0: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70 72 6f 67  /* The main prog
c7f0: 72 61 6d 2e 20 20 50 61 72 73 65 20 74 68 65 20  ram.  Parse the 
c800: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e 64  command line and
c810: 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69 6e 74   do it... */.int
c820: 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20   main(int argc, 
c830: 63 68 61 72 20 2a 2a 61 72 67 76 29 0a 7b 0a 20  char **argv).{. 
c840: 20 73 74 61 74 69 63 20 69 6e 74 20 76 65 72 73   static int vers
c850: 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  ion = 0;.  stati
c860: 63 20 69 6e 74 20 72 70 66 6c 61 67 20 3d 20 30  c int rpflag = 0
c870: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 62  ;.  static int b
c880: 61 73 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20  asisflag = 0;.  
c890: 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d 70 72  static int compr
c8a0: 65 73 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  ess = 0;.  stati
c8b0: 63 20 69 6e 74 20 71 75 69 65 74 20 3d 20 30 3b  c int quiet = 0;
c8c0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 73 74  .  static int st
c8d0: 61 74 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  atistics = 0;.  
c8e0: 73 74 61 74 69 63 20 69 6e 74 20 6d 68 66 6c 61  static int mhfla
c8f0: 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  g = 0;.  static 
c900: 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  int nolinenosfla
c910: 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  g = 0;.  static 
c920: 69 6e 74 20 6e 6f 52 65 73 6f 72 74 20 3d 20 30  int noResort = 0
c930: 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  ;.  static struc
c940: 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70 74 69  t s_options opti
c950: 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 4f  ons[] = {.    {O
c960: 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20 28 63  PT_FLAG, "b", (c
c970: 68 61 72 2a 29 26 62 61 73 69 73 66 6c 61 67 2c  har*)&basisflag,
c980: 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74 68 65   "Print only the
c990: 20 62 61 73 69 73 20 69 6e 20 72 65 70 6f 72 74   basis in report
c9a0: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  ."},.    {OPT_FL
c9b0: 41 47 2c 20 22 63 22 2c 20 28 63 68 61 72 2a 29  AG, "c", (char*)
c9c0: 26 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f 6e 27  &compress, "Don'
c9d0: 74 20 63 6f 6d 70 72 65 73 73 20 74 68 65 20 61  t compress the a
c9e0: 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c 0a  ction table."},.
c9f0: 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22      {OPT_FSTR, "
ca00: 44 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64 6c  D", (char*)handl
ca10: 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22 44 65 66  e_D_option, "Def
ca20: 69 6e 65 20 61 6e 20 25 69 66 64 65 66 20 6d 61  ine an %ifdef ma
ca30: 63 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  cro."},.    {OPT
ca40: 5f 46 53 54 52 2c 20 22 66 22 2c 20 30 2c 20 22  _FSTR, "f", 0, "
ca50: 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63 65  Ignored.  (Place
ca60: 68 6f 6c 64 65 72 20 66 6f 72 20 2d 66 20 63 6f  holder for -f co
ca70: 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29  mpiler options.)
ca80: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
ca90: 47 2c 20 22 67 22 2c 20 28 63 68 61 72 2a 29 26  G, "g", (char*)&
caa0: 72 70 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 67  rpflag, "Print g
cab0: 72 61 6d 6d 61 72 20 77 69 74 68 6f 75 74 20 61  rammar without a
cac0: 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b  ctions."},.    {
cad0: 4f 50 54 5f 46 53 54 52 2c 20 22 49 22 2c 20 30  OPT_FSTR, "I", 0
cae0: 2c 20 22 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c  , "Ignored.  (Pl
caf0: 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 27 2d  aceholder for '-
cb00: 49 27 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  I' compiler opti
cb10: 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f 50  ons.)"},.    {OP
cb20: 54 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63 68  T_FLAG, "m", (ch
cb30: 61 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f 75  ar*)&mhflag, "Ou
cb40: 74 70 75 74 20 61 20 6d 61 6b 65 68 65 61 64 65  tput a makeheade
cb50: 72 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 69  rs compatible fi
cb60: 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  le."},.    {OPT_
cb70: 46 4c 41 47 2c 20 22 6c 22 2c 20 28 63 68 61 72  FLAG, "l", (char
cb80: 2a 29 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  *)&nolinenosflag
cb90: 2c 20 22 44 6f 20 6e 6f 74 20 70 72 69 6e 74 20  , "Do not print 
cba0: 23 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e 74 73  #line statements
cbb0: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53  ."},.    {OPT_FS
cbc0: 54 52 2c 20 22 4f 22 2c 20 30 2c 20 22 49 67 6e  TR, "O", 0, "Ign
cbd0: 6f 72 65 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c  ored.  (Placehol
cbe0: 64 65 72 20 66 6f 72 20 27 2d 4f 27 20 63 6f 6d  der for '-O' com
cbf0: 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22  piler options.)"
cc00: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
cc10: 2c 20 22 70 22 2c 20 28 63 68 61 72 2a 29 26 73  , "p", (char*)&s
cc20: 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e  howPrecedenceCon
cc30: 66 6c 69 63 74 2c 0a 20 20 20 20 20 20 20 20 20  flict,.         
cc40: 20 20 20 20 20 20 20 20 20 20 20 22 53 68 6f 77             "Show
cc50: 20 63 6f 6e 66 6c 69 63 74 73 20 72 65 73 6f 6c   conflicts resol
cc60: 76 65 64 20 62 79 20 70 72 65 63 65 64 65 6e 63  ved by precedenc
cc70: 65 20 72 75 6c 65 73 22 7d 2c 0a 20 20 20 20 7b  e rules"},.    {
cc80: 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20 28  OPT_FLAG, "q", (
cc90: 63 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22 28  char*)&quiet, "(
cca0: 51 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72 69  Quiet) Don't pri
ccb0: 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20 66 69  nt the report fi
ccc0: 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  le."},.    {OPT_
ccd0: 46 4c 41 47 2c 20 22 72 22 2c 20 28 63 68 61 72  FLAG, "r", (char
cce0: 2a 29 26 6e 6f 52 65 73 6f 72 74 2c 20 22 44 6f  *)&noResort, "Do
ccf0: 20 6e 6f 74 20 73 6f 72 74 20 6f 72 20 72 65 6e   not sort or ren
cd00: 75 6d 62 65 72 20 73 74 61 74 65 73 22 7d 2c 0a  umber states"},.
cd10: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
cd20: 73 22 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74  s", (char*)&stat
cd30: 69 73 74 69 63 73 2c 0a 20 20 20 20 20 20 20 20  istics,.        
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd50: 20 20 20 20 20 20 20 20 20 20 20 22 50 72 69 6e             "Prin
cd60: 74 20 70 61 72 73 65 72 20 73 74 61 74 73 20 74  t parser stats t
cd70: 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  o standard outpu
cd80: 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  t."},.    {OPT_F
cd90: 4c 41 47 2c 20 22 78 22 2c 20 28 63 68 61 72 2a  LAG, "x", (char*
cda0: 29 26 76 65 72 73 69 6f 6e 2c 20 22 50 72 69 6e  )&version, "Prin
cdb0: 74 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  t the version nu
cdc0: 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  mber."},.    {OP
cdd0: 54 5f 46 53 54 52 2c 20 22 54 22 2c 20 28 63 68  T_FSTR, "T", (ch
cde0: 61 72 2a 29 68 61 6e 64 6c 65 5f 54 5f 6f 70 74  ar*)handle_T_opt
cdf0: 69 6f 6e 2c 20 22 53 70 65 63 69 66 79 20 61 20  ion, "Specify a 
ce00: 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 2e 22 7d  template file."}
ce10: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c  ,.    {OPT_FSTR,
ce20: 20 22 57 22 2c 20 30 2c 20 22 49 67 6e 6f 72 65   "W", 0, "Ignore
ce30: 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64 65 72  d.  (Placeholder
ce40: 20 66 6f 72 20 27 2d 57 27 20 63 6f 6d 70 69 6c   for '-W' compil
ce50: 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c 0a  er options.)"},.
ce60: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c      {OPT_FLAG,0,
ce70: 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  0,0}.  };.  int 
ce80: 69 3b 0a 20 20 69 6e 74 20 65 78 69 74 63 6f 64  i;.  int exitcod
ce90: 65 3b 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  e;.  struct lemo
cea0: 6e 20 6c 65 6d 3b 0a 20 20 73 74 72 75 63 74 20  n lem;.  struct 
ceb0: 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 4f 70 74  rule *rp;..  Opt
cec0: 49 6e 69 74 28 61 72 67 76 2c 6f 70 74 69 6f 6e  Init(argv,option
ced0: 73 2c 73 74 64 65 72 72 29 3b 0a 20 20 69 66 28  s,stderr);.  if(
cee0: 20 76 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20   version ){.    
cef0: 20 70 72 69 6e 74 66 28 22 4c 65 6d 6f 6e 20 76   printf("Lemon v
cf00: 65 72 73 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b 0a  ersion 1.0\n");.
cf10: 20 20 20 20 20 65 78 69 74 28 30 29 3b 20 0a 20       exit(0); . 
cf20: 20 7d 0a 20 20 69 66 28 20 4f 70 74 4e 41 72 67   }.  if( OptNArg
cf30: 73 28 29 21 3d 31 20 29 7b 0a 20 20 20 20 66 70  s()!=1 ){.    fp
cf40: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 78  rintf(stderr,"Ex
cf50: 61 63 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e 61  actly one filena
cf60: 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72  me argument is r
cf70: 65 71 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20 20  equired.\n");.  
cf80: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
cf90: 20 6d 65 6d 73 65 74 28 26 6c 65 6d 2c 20 30 2c   memset(&lem, 0,
cfa0: 20 73 69 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a 20   sizeof(lem));. 
cfb0: 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d 20   lem.errorcnt = 
cfc0: 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  0;..  /* Initial
cfd0: 69 7a 65 20 74 68 65 20 6d 61 63 68 69 6e 65 20  ize the machine 
cfe0: 2a 2f 0a 20 20 53 74 72 73 61 66 65 5f 69 6e 69  */.  Strsafe_ini
cff0: 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e  t();.  Symbol_in
d000: 69 74 28 29 3b 0a 20 20 53 74 61 74 65 5f 69 6e  it();.  State_in
d010: 69 74 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67 76  it();.  lem.argv
d020: 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6c  0 = argv[0];.  l
d030: 65 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f 70  em.filename = Op
d040: 74 41 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e 62  tArg(0);.  lem.b
d050: 61 73 69 73 66 6c 61 67 20 3d 20 62 61 73 69 73  asisflag = basis
d060: 66 6c 61 67 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c 69  flag;.  lem.noli
d070: 6e 65 6e 6f 73 66 6c 61 67 20 3d 20 6e 6f 6c 69  nenosflag = noli
d080: 6e 65 6e 6f 73 66 6c 61 67 3b 0a 20 20 53 79 6d  nenosflag;.  Sym
d090: 62 6f 6c 5f 6e 65 77 28 22 24 22 29 3b 0a 20 20  bol_new("$");.  
d0a0: 6c 65 6d 2e 65 72 72 73 79 6d 20 3d 20 53 79 6d  lem.errsym = Sym
d0b0: 62 6f 6c 5f 6e 65 77 28 22 65 72 72 6f 72 22 29  bol_new("error")
d0c0: 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 2d 3e  ;.  lem.errsym->
d0d0: 75 73 65 43 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f  useCnt = 0;..  /
d0e0: 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75  * Parse the inpu
d0f0: 74 20 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72 73  t file */.  Pars
d100: 65 28 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20 6c  e(&lem);.  if( l
d110: 65 6d 2e 65 72 72 6f 72 63 6e 74 20 29 20 65 78  em.errorcnt ) ex
d120: 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 29  it(lem.errorcnt)
d130: 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 72 75 6c  ;.  if( lem.nrul
d140: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  e==0 ){.    fpri
d150: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 6d 70 74  ntf(stderr,"Empt
d160: 79 20 67 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a  y grammar.\n");.
d170: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
d180: 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 61 6e 64  ..  /* Count and
d190: 20 69 6e 64 65 78 20 74 68 65 20 73 79 6d 62 6f   index the symbo
d1a0: 6c 73 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  ls of the gramma
d1b0: 72 20 2a 2f 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65  r */.  Symbol_ne
d1c0: 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a  w("{default}");.
d1d0: 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20    lem.nsymbol = 
d1e0: 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a  Symbol_count();.
d1f0: 20 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20    lem.symbols = 
d200: 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29  Symbol_arrayof()
d210: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
d220: 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  em.nsymbol; i++)
d230: 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d   lem.symbols[i]-
d240: 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 71 73  >index = i;.  qs
d250: 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c  ort(lem.symbols,
d260: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2c 73 69 7a 65  lem.nsymbol,size
d270: 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
d280: 2a 29 2c 20 53 79 6d 62 6f 6c 63 6d 70 70 29 3b  *), Symbolcmpp);
d290: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
d2a0: 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20  m.nsymbol; i++) 
d2b0: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  lem.symbols[i]->
d2c0: 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 77 68 69  index = i;.  whi
d2d0: 6c 65 28 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b  le( lem.symbols[
d2e0: 69 2d 31 5d 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54  i-1]->type==MULT
d2f0: 49 54 45 52 4d 49 4e 41 4c 20 29 7b 20 69 2d 2d  ITERMINAL ){ i--
d300: 3b 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 74  ; }.  assert( st
d310: 72 63 6d 70 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73  rcmp(lem.symbols
d320: 5b 69 2d 31 5d 2d 3e 6e 61 6d 65 2c 22 7b 64 65  [i-1]->name,"{de
d330: 66 61 75 6c 74 7d 22 29 3d 3d 30 20 29 3b 0a 20  fault}")==0 );. 
d340: 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 69   lem.nsymbol = i
d350: 20 2d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b   - 1;.  for(i=1;
d360: 20 49 53 55 50 50 45 52 28 6c 65 6d 2e 73 79 6d   ISUPPER(lem.sym
d370: 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30 5d  bols[i]->name[0]
d380: 29 3b 20 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e 6e  ); i++);.  lem.n
d390: 74 65 72 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a 20  terminal = i;.. 
d3a0: 20 2f 2a 20 41 73 73 69 67 6e 20 73 65 71 75 65   /* Assign seque
d3b0: 6e 74 69 61 6c 20 72 75 6c 65 20 6e 75 6d 62 65  ntial rule numbe
d3c0: 72 73 2e 20 20 53 74 61 72 74 20 77 69 74 68 20  rs.  Start with 
d3d0: 30 2e 20 20 50 75 74 20 72 75 6c 65 73 20 74 68  0.  Put rules th
d3e0: 61 74 20 68 61 76 65 20 6e 6f 0a 20 20 2a 2a 20  at have no.  ** 
d3f0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 43 2d  reduce action C-
d400: 63 6f 64 65 20 61 73 73 6f 63 69 61 74 65 64 20  code associated 
d410: 77 69 74 68 20 74 68 65 6d 20 6c 61 73 74 2c 20  with them last, 
d420: 73 6f 20 74 68 61 74 20 74 68 65 20 73 77 69 74  so that the swit
d430: 63 68 28 29 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch().  ** statem
d440: 65 6e 74 20 74 68 61 74 20 73 65 6c 65 63 74 73  ent that selects
d450: 20 72 65 64 75 63 74 69 6f 6e 20 61 63 74 69 6f   reduction actio
d460: 6e 73 20 77 69 6c 6c 20 68 61 76 65 20 61 20 73  ns will have a s
d470: 6d 61 6c 6c 65 72 20 6a 75 6d 70 20 74 61 62 6c  maller jump tabl
d480: 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
d490: 30 2c 20 72 70 3d 6c 65 6d 2e 72 75 6c 65 3b 20  0, rp=lem.rule; 
d4a0: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
d4b0: 7b 0a 20 20 20 20 72 70 2d 3e 69 52 75 6c 65 20  {.    rp->iRule 
d4c0: 3d 20 72 70 2d 3e 63 6f 64 65 20 3f 20 69 2b 2b  = rp->code ? i++
d4d0: 20 3a 20 2d 31 3b 0a 20 20 7d 0a 20 20 66 6f 72   : -1;.  }.  for
d4e0: 28 72 70 3d 6c 65 6d 2e 72 75 6c 65 3b 20 72 70  (rp=lem.rule; rp
d4f0: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
d500: 20 20 20 20 69 66 28 20 72 70 2d 3e 69 52 75 6c      if( rp->iRul
d510: 65 3c 30 20 29 20 72 70 2d 3e 69 52 75 6c 65 20  e<0 ) rp->iRule 
d520: 3d 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 6c 65 6d  = i++;.  }.  lem
d530: 2e 73 74 61 72 74 52 75 6c 65 20 3d 20 6c 65 6d  .startRule = lem
d540: 2e 72 75 6c 65 3b 0a 20 20 6c 65 6d 2e 72 75 6c  .rule;.  lem.rul
d550: 65 20 3d 20 52 75 6c 65 5f 73 6f 72 74 28 6c 65  e = Rule_sort(le
d560: 6d 2e 72 75 6c 65 29 3b 0a 0a 20 20 2f 2a 20 47  m.rule);..  /* G
d570: 65 6e 65 72 61 74 65 20 61 20 72 65 70 72 69 6e  enerate a reprin
d580: 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72  t of the grammar
d590: 2c 20 69 66 20 72 65 71 75 65 73 74 65 64 20 6f  , if requested o
d5a0: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
d5b0: 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c  ne */.  if( rpfl
d5c0: 61 67 20 29 7b 0a 20 20 20 20 52 65 70 72 69 6e  ag ){.    Reprin
d5d0: 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65  t(&lem);.  }else
d5e0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
d5f0: 69 7a 65 20 74 68 65 20 73 69 7a 65 20 66 6f 72  ize the size for
d600: 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20   all follow and 
d610: 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20  first sets */.  
d620: 20 20 53 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74    SetSize(lem.nt
d630: 65 72 6d 69 6e 61 6c 2b 31 29 3b 0a 0a 20 20 20  erminal+1);..   
d640: 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 70 72 65   /* Find the pre
d650: 63 65 64 65 6e 63 65 20 66 6f 72 20 65 76 65 72  cedence for ever
d660: 79 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c  y production rul
d670: 65 20 28 74 68 61 74 20 68 61 73 20 6f 6e 65 29  e (that has one)
d680: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 52 75 6c 65   */.    FindRule
d690: 50 72 65 63 65 64 65 6e 63 65 73 28 26 6c 65 6d  Precedences(&lem
d6a0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  );..    /* Compu
d6b0: 74 65 20 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f  te the lambda-no
d6c0: 6e 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74  nterminals and t
d6d0: 68 65 20 66 69 72 73 74 2d 73 65 74 73 20 66 6f  he first-sets fo
d6e0: 72 20 65 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e  r every.    ** n
d6f0: 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20  onterminal */.  
d700: 20 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28    FindFirstSets(
d710: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
d720: 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29  ompute all LR(0)
d730: 20 73 74 61 74 65 73 2e 20 20 41 6c 73 6f 20 72   states.  Also r
d740: 65 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74  ecord follow-set
d750: 20 70 72 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20   propagation.   
d760: 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61   ** links so tha
d770: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74  t the follow-set
d780: 20 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64   can be computed
d790: 20 6c 61 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65   later */.    le
d7a0: 6d 2e 6e 73 74 61 74 65 20 3d 20 30 3b 0a 20 20  m.nstate = 0;.  
d7b0: 20 20 46 69 6e 64 53 74 61 74 65 73 28 26 6c 65    FindStates(&le
d7c0: 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74  m);.    lem.sort
d7d0: 65 64 20 3d 20 53 74 61 74 65 5f 61 72 72 61 79  ed = State_array
d7e0: 6f 66 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69  of();..    /* Ti
d7f0: 65 20 75 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20  e up loose ends 
d800: 6f 6e 20 74 68 65 20 70 72 6f 70 61 67 61 74 69  on the propagati
d810: 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20  on links */.    
d820: 46 69 6e 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b  FindLinks(&lem);
d830: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
d840: 20 74 68 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20   the follow set 
d850: 6f 66 20 65 76 65 72 79 20 72 65 64 75 63 69 62  of every reducib
d860: 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  le configuration
d870: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c   */.    FindFoll
d880: 6f 77 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20  owSets(&lem);.. 
d890: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
d8a0: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20  e action tables 
d8b0: 2a 2f 0a 20 20 20 20 46 69 6e 64 41 63 74 69 6f  */.    FindActio
d8c0: 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  ns(&lem);..    /
d8d0: 2a 20 43 6f 6d 70 72 65 73 73 20 74 68 65 20 61  * Compress the a
d8e0: 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a  ction tables */.
d8f0: 20 20 20 20 69 66 28 20 63 6f 6d 70 72 65 73 73      if( compress
d900: 3d 3d 30 20 29 20 43 6f 6d 70 72 65 73 73 54 61  ==0 ) CompressTa
d910: 62 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  bles(&lem);..   
d920: 20 2f 2a 20 52 65 6f 72 64 65 72 20 61 6e 64 20   /* Reorder and 
d930: 72 65 6e 75 6d 62 65 72 20 74 68 65 20 73 74 61  renumber the sta
d940: 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61 74  tes so that stat
d950: 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63 68  es with fewer ch
d960: 6f 69 63 65 73 0a 20 20 20 20 2a 2a 20 6f 63 63  oices.    ** occ
d970: 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ur at the end.  
d980: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
d990: 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 68 65 6c  ization that hel
d9a0: 70 73 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20  ps make the.    
d9b0: 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 70 61 72  ** generated par
d9c0: 73 65 72 20 74 61 62 6c 65 73 20 73 6d 61 6c 6c  ser tables small
d9d0: 65 72 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  er. */.    if( n
d9e0: 6f 52 65 73 6f 72 74 3d 3d 30 20 29 20 52 65 73  oResort==0 ) Res
d9f0: 6f 72 74 53 74 61 74 65 73 28 26 6c 65 6d 29 3b  ortStates(&lem);
da00: 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
da10: 65 20 61 20 72 65 70 6f 72 74 20 6f 66 20 74 68  e a report of th
da20: 65 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  e parser generat
da30: 65 64 2e 20 20 28 74 68 65 20 22 79 2e 6f 75 74  ed.  (the "y.out
da40: 70 75 74 22 20 66 69 6c 65 29 20 2a 2f 0a 20 20  put" file) */.  
da50: 20 20 69 66 28 20 21 71 75 69 65 74 20 29 20 52    if( !quiet ) R
da60: 65 70 6f 72 74 4f 75 74 70 75 74 28 26 6c 65 6d  eportOutput(&lem
da70: 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  );..    /* Gener
da80: 61 74 65 20 74 68 65 20 73 6f 75 72 63 65 20 63  ate the source c
da90: 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ode for the pars
daa0: 65 72 20 2a 2f 0a 20 20 20 20 52 65 70 6f 72 74  er */.    Report
dab0: 54 61 62 6c 65 28 26 6c 65 6d 2c 20 6d 68 66 6c  Table(&lem, mhfl
dac0: 61 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  ag);..    /* Pro
dad0: 64 75 63 65 20 61 20 68 65 61 64 65 72 20 66 69  duce a header fi
dae0: 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  le for use by th
daf0: 65 20 73 63 61 6e 6e 65 72 2e 20 20 28 54 68 69  e scanner.  (Thi
db00: 73 20 73 74 65 70 20 69 73 0a 20 20 20 20 2a 2a  s step is.    **
db10: 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 20   omitted if the 
db20: 22 2d 6d 22 20 6f 70 74 69 6f 6e 20 69 73 20 75  "-m" option is u
db30: 73 65 64 20 62 65 63 61 75 73 65 20 6d 61 6b 65  sed because make
db40: 68 65 61 64 65 72 73 20 77 69 6c 6c 0a 20 20 20  headers will.   
db50: 20 2a 2a 20 67 65 6e 65 72 61 74 65 20 74 68 65   ** generate the
db60: 20 66 69 6c 65 20 66 6f 72 20 75 73 2e 29 20 2a   file for us.) *
db70: 2f 0a 20 20 20 20 69 66 28 20 21 6d 68 66 6c 61  /.    if( !mhfla
db80: 67 20 29 20 52 65 70 6f 72 74 48 65 61 64 65 72  g ) ReportHeader
db90: 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66  (&lem);.  }.  if
dba0: 28 20 73 74 61 74 69 73 74 69 63 73 20 29 7b 0a  ( statistics ){.
dbb0: 20 20 20 20 70 72 69 6e 74 66 28 22 50 61 72 73      printf("Pars
dbc0: 65 72 20 73 74 61 74 69 73 74 69 63 73 3a 5c 6e  er statistics:\n
dbd0: 22 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69  ");.    stats_li
dbe0: 6e 65 28 22 74 65 72 6d 69 6e 61 6c 20 73 79 6d  ne("terminal sym
dbf0: 62 6f 6c 73 22 2c 20 6c 65 6d 2e 6e 74 65 72 6d  bols", lem.nterm
dc00: 69 6e 61 6c 29 3b 0a 20 20 20 20 73 74 61 74 73  inal);.    stats
dc10: 5f 6c 69 6e 65 28 22 6e 6f 6e 2d 74 65 72 6d 69  _line("non-termi
dc20: 6e 61 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c 65  nal symbols", le
dc30: 6d 2e 6e 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d 2e  m.nsymbol - lem.
dc40: 6e 74 65 72 6d 69 6e 61 6c 29 3b 0a 20 20 20 20  nterminal);.    
dc50: 73 74 61 74 73 5f 6c 69 6e 65 28 22 74 6f 74 61  stats_line("tota
dc60: 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e  l symbols", lem.
dc70: 6e 73 79 6d 62 6f 6c 29 3b 0a 20 20 20 20 73 74  nsymbol);.    st
dc80: 61 74 73 5f 6c 69 6e 65 28 22 72 75 6c 65 73 22  ats_line("rules"
dc90: 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20  , lem.nrule);.  
dca0: 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 73 74    stats_line("st
dcb0: 61 74 65 73 22 2c 20 6c 65 6d 2e 6e 78 73 74 61  ates", lem.nxsta
dcc0: 74 65 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c  te);.    stats_l
dcd0: 69 6e 65 28 22 63 6f 6e 66 6c 69 63 74 73 22 2c  ine("conflicts",
dce0: 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b   lem.nconflict);
dcf0: 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28  .    stats_line(
dd00: 22 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 65 6e  "action table en
dd10: 74 72 69 65 73 22 2c 20 6c 65 6d 2e 6e 61 63 74  tries", lem.nact
dd20: 69 6f 6e 74 61 62 29 3b 0a 20 20 20 20 73 74 61  iontab);.    sta
dd30: 74 73 5f 6c 69 6e 65 28 22 74 6f 74 61 6c 20 74  ts_line("total t
dd40: 61 62 6c 65 20 73 69 7a 65 20 28 62 79 74 65 73  able size (bytes
dd50: 29 22 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a  )", lem.tablesiz
dd60: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65  e);.  }.  if( le
dd70: 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e 20 30 20  m.nconflict > 0 
dd80: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
dd90: 74 64 65 72 72 2c 22 25 64 20 70 61 72 73 69 6e  tderr,"%d parsin
dda0: 67 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c  g conflicts.\n",
ddb0: 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a  lem.nconflict);.
ddc0: 20 20 7d 0a 0a 20 20 2f 2a 20 72 65 74 75 72 6e    }..  /* return
ddd0: 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 31   0 on success, 1
dde0: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 2a 2f 0a   on failure. */.
ddf0: 20 20 65 78 69 74 63 6f 64 65 20 3d 20 28 28 6c    exitcode = ((l
de00: 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3e 20 30 29  em.errorcnt > 0)
de10: 20 7c 7c 20 28 6c 65 6d 2e 6e 63 6f 6e 66 6c 69   || (lem.nconfli
de20: 63 74 20 3e 20 30 29 29 20 3f 20 31 20 3a 20 30  ct > 0)) ? 1 : 0
de30: 3b 0a 20 20 65 78 69 74 28 65 78 69 74 63 6f 64  ;.  exit(exitcod
de40: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 65 78  e);.  return (ex
de50: 69 74 63 6f 64 65 29 3b 0a 7d 0a 2f 2a 2a 2a 2a  itcode);.}./****
de60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
de70: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
de80: 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  msort.c" *******
de90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dea0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
deb0: 41 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65 2d  A generic merge-
dec0: 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a  sort program..**
ded0: 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c 65  .** USAGE:.** Le
dee0: 74 20 22 70 74 72 22 20 62 65 20 61 20 70 6f 69  t "ptr" be a poi
def0: 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74 72  nter to some str
df00: 75 63 74 75 72 65 20 77 68 69 63 68 20 69 73 20  ucture which is 
df10: 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a 2a  at the head of.*
df20: 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61  * a null-termina
df30: 74 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e 20  ted list.  Then 
df40: 74 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73 74  to sort the list
df50: 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   call:.**.**    
df60: 20 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74 72   ptr = msort(ptr
df70: 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63 6d  ,&(ptr->next),cm
df80: 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20  pfnc);.**.** In 
df90: 74 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70 66  the above, "cmpf
dfa0: 6e 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72  nc" is a pointer
dfb0: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 77   to a function w
dfc0: 68 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a 2a  hich compares.**
dfd0: 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f   two instances o
dfe0: 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
dff0: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20 69  and returns an i
e000: 6e 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a 2a  nteger, as in.**
e010: 20 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73 65   strcmp.  The se
e020: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
e030: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
e040: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
e050: 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  .** second eleme
e060: 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64  nt of the linked
e070: 20 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64 64   list.  This add
e080: 72 65 73 73 20 69 73 20 75 73 65 64 20 74 6f 20  ress is used to 
e090: 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 6f  compute.** the o
e0a0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e 65  ffset to the "ne
e0b0: 78 74 22 20 66 69 65 6c 64 20 77 69 74 68 69 6e  xt" field within
e0c0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
e0d0: 20 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a 2a   The offset to.*
e0e0: 2a 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65  * the "next" fie
e0f0: 6c 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  ld must be const
e100: 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72 75  ant for all stru
e110: 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c 69  ctures in the li
e120: 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75  st..**.** The fu
e130: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
e140: 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68 69   new pointer whi
e150: 63 68 20 69 73 20 74 68 65 20 68 65 61 64 20 6f  ch is the head o
e160: 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61 66  f the list.** af
e170: 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a  ter sorting..**.
e180: 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a  ** ALGORITHM:.**
e190: 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a   Merge-sort..*/.
e1a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
e1b0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
e1c0: 65 78 74 20 73 74 72 75 63 74 75 72 65 20 69 6e  ext structure in
e1d0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
e1e0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45 58  ..*/.#define NEX
e1f0: 54 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29 28  T(A) (*(char**)(
e200: 28 28 63 68 61 72 2a 29 41 29 2b 6f 66 66 73 65  ((char*)A)+offse
e210: 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74  t))../*.** Input
e220: 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20 20  s:.**   a:      
e230: 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d   A sorted, null-
e240: 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65  terminated linke
e250: 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65  d list.  (May be
e260: 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a 20   null)..**   b: 
e270: 20 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c 20        A sorted, 
e280: 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20  null-terminated 
e290: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d  linked list.  (M
e2a0: 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20  ay be null)..** 
e2b0: 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70 6f 69    cmp:     A poi
e2c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6d 70  nter to the comp
e2d0: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  arison function.
e2e0: 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20 20 4f  .**   offset:  O
e2f0: 66 66 73 65 74 20 69 6e 20 74 68 65 20 73 74 72  ffset in the str
e300: 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 22 6e  ucture to the "n
e310: 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a  ext" field..**.*
e320: 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a  * Return Value:.
e330: 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74  **   A pointer t
e340: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61 20  o the head of a 
e350: 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e 74  sorted list cont
e360: 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d 65  aining the eleme
e370: 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74 68  nts.**   of both
e380: 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a 20   a and b..**.** 
e390: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a  Side effects:.**
e3a0: 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70 6f     The "next" po
e3b0: 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d 65  inters for eleme
e3c0: 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74 73  nts in the lists
e3d0: 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a 20   a and b are.** 
e3e0: 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74    changed..*/.st
e3f0: 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72 67 65  atic char *merge
e400: 28 0a 20 20 63 68 61 72 20 2a 61 2c 0a 20 20 63  (.  char *a,.  c
e410: 68 61 72 20 2a 62 2c 0a 20 20 69 6e 74 20 28 2a  har *b,.  int (*
e420: 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  cmp)(const char*
e430: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 0a 20  ,const char*),. 
e440: 20 69 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a 20   int offset.){. 
e450: 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68 65 61   char *ptr, *hea
e460: 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20 29  d;..  if( a==0 )
e470: 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62 3b 0a  {.    head = b;.
e480: 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d 30    }else if( b==0
e490: 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 61   ){.    head = a
e4a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
e4b0: 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c 3d  f( (*cmp)(a,b)<=
e4c0: 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20 3d  0 ){.      ptr =
e4d0: 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e 45   a;.      a = NE
e4e0: 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65  XT(a);.    }else
e4f0: 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b  {.      ptr = b;
e500: 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28  .      b = NEXT(
e510: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 65  b);.    }.    he
e520: 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77 68  ad = ptr;.    wh
e530: 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a 20  ile( a && b ){. 
e540: 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29 28       if( (*cmp)(
e550: 61 2c 62 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20  a,b)<=0 ){.     
e560: 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61     NEXT(ptr) = a
e570: 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d 20  ;.        ptr = 
e580: 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 4e  a;.        a = N
e590: 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d 65  EXT(a);.      }e
e5a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45 58  lse{.        NEX
e5b0: 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20 20  T(ptr) = b;.    
e5c0: 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20      ptr = b;.   
e5d0: 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29       b = NEXT(b)
e5e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e5f0: 20 20 20 20 69 66 28 20 61 20 29 20 4e 45 58 54      if( a ) NEXT
e600: 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 65  (ptr) = a;.    e
e610: 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74 72 29  lse    NEXT(ptr)
e620: 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = b;.  }.  retu
e630: 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn head;.}../*.*
e640: 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c  * Inputs:.**   l
e650: 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65  ist:      Pointe
e660: 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69  r to a singly-li
e670: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74 72  nked list of str
e680: 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65  uctures..**   ne
e690: 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72  xt:      Pointer
e6a0: 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20 74   to pointer to t
e6b0: 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  he second elemen
e6c0: 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a  t of the list..*
e6d0: 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20 41  *   cmp:       A
e6e0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
e6f0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tion..**.** Retu
e700: 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41  rn Value:.**   A
e710: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
e720: 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64  head of a sorted
e730: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
e740: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a   the elements.**
e750: 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20     orginally in 
e760: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65  list..**.** Side
e770: 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54   effects:.**   T
e780: 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65  he "next" pointe
e790: 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20  rs for elements 
e7a0: 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61 6e  in list are chan
e7b0: 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ged..*/.#define 
e7c0: 4c 49 53 54 53 49 5a 45 20 33 30 0a 73 74 61 74  LISTSIZE 30.stat
e7d0: 69 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 0a  ic char *msort(.
e7e0: 20 20 63 68 61 72 20 2a 6c 69 73 74 2c 0a 20 20    char *list,.  
e7f0: 63 68 61 72 20 2a 2a 6e 65 78 74 2c 0a 20 20 69  char **next,.  i
e800: 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20  nt (*cmp)(const 
e810: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
e820: 2a 29 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  *).){.  unsigned
e830: 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20 20   long offset;.  
e840: 63 68 61 72 20 2a 65 70 3b 0a 20 20 63 68 61 72  char *ep;.  char
e850: 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d 3b   *set[LISTSIZE];
e860: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66 73  .  int i;.  offs
e870: 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  et = (unsigned l
e880: 6f 6e 67 29 28 28 63 68 61 72 2a 29 6e 65 78 74  ong)((char*)next
e890: 20 2d 20 28 63 68 61 72 2a 29 6c 69 73 74 29 3b   - (char*)list);
e8a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49  .  for(i=0; i<LI
e8b0: 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65 74  STSIZE; i++) set
e8c0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  [i] = 0;.  while
e8d0: 28 20 6c 69 73 74 20 29 7b 0a 20 20 20 20 65 70  ( list ){.    ep
e8e0: 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69 73   = list;.    lis
e8f0: 74 20 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b 0a  t = NEXT(list);.
e900: 20 20 20 20 4e 45 58 54 28 65 70 29 20 3d 20 30      NEXT(ep) = 0
e910: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
e920: 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26 26 20 73  <LISTSIZE-1 && s
e930: 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a  et[i]!=0; i++){.
e940: 20 20 20 20 20 20 65 70 20 3d 20 6d 65 72 67 65        ep = merge
e950: 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f  (ep,set[i],cmp,o
e960: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 65  ffset);.      se
e970: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
e980: 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 65 70 3b      set[i] = ep;
e990: 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a 20  .  }.  ep = 0;. 
e9a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54   for(i=0; i<LIST
e9b0: 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20 73  SIZE; i++) if( s
e9c0: 65 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65 72  et[i] ) ep = mer
e9d0: 67 65 28 73 65 74 5b 69 5d 2c 65 70 2c 63 6d 70  ge(set[i],ep,cmp
e9e0: 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74 75  ,offset);.  retu
e9f0: 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  rn ep;.}./******
ea00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea10: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
ea20: 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a   "option.c" ****
ea30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea40: 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 63  ******/.static c
ea50: 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61 74  har **argv;.stat
ea60: 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69  ic struct s_opti
ea70: 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63 20  ons *op;.static 
ea80: 46 49 4c 45 20 2a 65 72 72 73 74 72 65 61 6d 3b  FILE *errstream;
ea90: 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f 50 54 28  ..#define ISOPT(
eaa0: 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c  X) ((X)[0]=='-'|
eab0: 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74  |(X)[0]=='+'||st
eac0: 72 63 68 72 28 28 58 29 2c 27 3d 27 29 21 3d 30  rchr((X),'=')!=0
ead0: 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  )../*.** Print t
eae0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
eaf0: 77 69 74 68 20 61 20 63 61 72 72 6f 74 20 70 6f  with a carrot po
eb00: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6b 2d  inting to the k-
eb10: 74 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  th character.** 
eb20: 6f 66 20 74 68 65 20 6e 2d 74 68 20 66 69 65 6c  of the n-th fiel
eb30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
eb40: 64 20 65 72 72 6c 69 6e 65 28 69 6e 74 20 6e 2c  d errline(int n,
eb50: 20 69 6e 74 20 6b 2c 20 46 49 4c 45 20 2a 65 72   int k, FILE *er
eb60: 72 29 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e 74  r).{.  int spcnt
eb70: 2c 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76 5b  , i;.  if( argv[
eb80: 30 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72 72  0] ) fprintf(err
eb90: 2c 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b 0a  ,"%s",argv[0]);.
eba0: 20 20 73 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e 53    spcnt = lemonS
ebb0: 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20 2b  trlen(argv[0]) +
ebc0: 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   1;.  for(i=1; i
ebd0: 3c 6e 20 26 26 20 61 72 67 76 5b 69 5d 3b 20 69  <n && argv[i]; i
ebe0: 2b 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  ++){.    fprintf
ebf0: 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b  (err," %s",argv[
ec00: 69 5d 29 3b 0a 20 20 20 20 73 70 63 6e 74 20 2b  i]);.    spcnt +
ec10: 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72  = lemonStrlen(ar
ec20: 67 76 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20  gv[i])+1;.  }.  
ec30: 73 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f  spcnt += k;.  fo
ec40: 72 28 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b  r(; argv[i]; i++
ec50: 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 20  ) fprintf(err," 
ec60: 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20  %s",argv[i]);.  
ec70: 69 66 28 20 73 70 63 6e 74 3c 32 30 20 29 7b 0a  if( spcnt<20 ){.
ec80: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
ec90: 22 5c 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e  "\n%*s^-- here\n
eca0: 22 2c 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20 7d  ",spcnt,"");.  }
ecb0: 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74  else{.    fprint
ecc0: 66 28 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72 65  f(err,"\n%*shere
ecd0: 20 2d 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c   --^\n",spcnt-7,
ece0: 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  "");.  }.}../*.*
ecf0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
ed00: 65 78 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 6e  ex of the N-th n
ed10: 6f 6e 2d 73 77 69 74 63 68 20 61 72 67 75 6d 65  on-switch argume
ed20: 6e 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a  nt.  Return -1.*
ed30: 2a 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66  * if N is out of
ed40: 20 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   range..*/.stati
ed50: 63 20 69 6e 74 20 61 72 67 69 6e 64 65 78 28 69  c int argindex(i
ed60: 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  nt n).{.  int i;
ed70: 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68 20  .  int dashdash 
ed80: 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76 21  = 0;.  if( argv!
ed90: 3d 30 20 26 26 20 2a 61 72 67 76 21 3d 30 20 29  =0 && *argv!=0 )
eda0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  {.    for(i=1; a
edb0: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
edc0: 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73 68      if( dashdash
edd0: 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b   || !ISOPT(argv[
ede0: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
edf0: 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( n==0 ) return
ee00: 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b   i;.        n--;
ee10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ee20: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69  f( strcmp(argv[i
ee30: 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73  ],"--")==0 ) das
ee40: 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d  hdash = 1;.    }
ee50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
ee60: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72  ;.}..static char
ee70: 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61   emsg[] = "Comma
ee80: 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20 65  nd line syntax e
ee90: 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20  rror: ";../*.** 
eea0: 50 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20 63  Process a flag c
eeb0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67 75  ommand line argu
eec0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
eed0: 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73 28  int handleflags(
eee0: 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72 72  int i, FILE *err
eef0: 29 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20 69  ).{.  int v;.  i
ef00: 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20  nt errcnt = 0;. 
ef10: 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d   int j;.  for(j=
ef20: 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20  0; op[j].label; 
ef30: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  j++){.    if( st
ef40: 72 6e 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b 31  rncmp(&argv[i][1
ef50: 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c 65  ],op[j].label,le
ef60: 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d 2e  monStrlen(op[j].
ef70: 6c 61 62 65 6c 29 29 3d 3d 30 20 29 20 62 72 65  label))==0 ) bre
ef80: 61 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61 72  ak;.  }.  v = ar
ef90: 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20  gv[i][0]=='-' ? 
efa0: 31 20 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70 5b  1 : 0;.  if( op[
efb0: 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20  j].label==0 ){. 
efc0: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
efd0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
efe0: 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74  "%sundefined opt
eff0: 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  ion.\n",emsg);. 
f000: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31       errline(i,1
f010: 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ,err);.    }.   
f020: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c   errcnt++;.  }el
f030: 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 61 72 67  se if( op[j].arg
f040: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 67  ==0 ){.    /* Ig
f050: 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e  nore this option
f060: 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
f070: 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f  op[j].type==OPT_
f080: 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a 28 28 69  FLAG ){.    *((i
f090: 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d  nt*)op[j].arg) =
f0a0: 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   v;.  }else if( 
f0b0: 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f  op[j].type==OPT_
f0c0: 46 46 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a 28  FFLAG ){.    (*(
f0d0: 76 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f 70  void(*)(int))(op
f0e0: 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20 20  [j].arg))(v);.  
f0f0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e  }else if( op[j].
f100: 74 79 70 65 3d 3d 4f 50 54 5f 46 53 54 52 20 29  type==OPT_FSTR )
f110: 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29  {.    (*(void(*)
f120: 28 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e  (char *))(op[j].
f130: 61 72 67 29 29 28 26 61 72 67 76 5b 69 5d 5b 32  arg))(&argv[i][2
f140: 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
f150: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
f160: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
f170: 73 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e  smissing argumen
f180: 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c 6e 22 2c  t on switch.\n",
f190: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72  emsg);.      err
f1a0: 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20  line(i,1,err);. 
f1b0: 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b     }.    errcnt+
f1c0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
f1d0: 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  errcnt;.}../*.**
f1e0: 20 50 72 6f 63 65 73 73 20 61 20 63 6f 6d 6d 61   Process a comma
f1f0: 6e 64 20 6c 69 6e 65 20 73 77 69 74 63 68 20 77  nd line switch w
f200: 68 69 63 68 20 68 61 73 20 61 6e 20 61 72 67 75  hich has an argu
f210: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
f220: 69 6e 74 20 68 61 6e 64 6c 65 73 77 69 74 63 68  int handleswitch
f230: 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72  (int i, FILE *er
f240: 72 29 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d 20  r).{.  int lv = 
f250: 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64 76 20 3d  0;.  double dv =
f260: 20 30 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73 76   0.0;.  char *sv
f270: 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63 68   = 0, *end;.  ch
f280: 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a 3b  ar *cp;.  int j;
f290: 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20  .  int errcnt = 
f2a0: 30 3b 0a 20 20 63 70 20 3d 20 73 74 72 63 68 72  0;.  cp = strchr
f2b0: 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20  (argv[i],'=');. 
f2c0: 20 61 73 73 65 72 74 28 20 63 70 21 3d 30 20 29   assert( cp!=0 )
f2d0: 3b 0a 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 66  ;.  *cp = 0;.  f
f2e0: 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61  or(j=0; op[j].la
f2f0: 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  bel; j++){.    i
f300: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69  f( strcmp(argv[i
f310: 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d  ],op[j].label)==
f320: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  0 ) break;.  }. 
f330: 20 2a 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69 66   *cp = '=';.  if
f340: 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30  ( op[j].label==0
f350: 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20   ){.    if( err 
f360: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
f370: 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e 65  (err,"%sundefine
f380: 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73  d option.\n",ems
f390: 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e  g);.      errlin
f3a0: 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20  e(i,0,err);.    
f3b0: 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a  }.    errcnt++;.
f3c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70 2b    }else{.    cp+
f3d0: 2b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  +;.    switch( o
f3e0: 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20  p[j].type ){.   
f3f0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47     case OPT_FLAG
f400: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
f410: 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20  _FFLAG:.        
f420: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
f430: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
f440: 2c 22 25 73 6f 70 74 69 6f 6e 20 72 65 71 75 69  ,"%soption requi
f450: 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e  res an argument.
f460: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
f470: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 30       errline(i,0
f480: 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ,err);.        }
f490: 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b  .        errcnt+
f4a0: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
f4b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
f4c0: 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  _DBL:.      case
f4d0: 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
f4e0: 20 20 20 64 76 20 3d 20 73 74 72 74 6f 64 28 63     dv = strtod(c
f4f0: 70 2c 26 65 6e 64 29 3b 0a 20 20 20 20 20 20 20  p,&end);.       
f500: 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20   if( *end ){.   
f510: 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29         if( err )
f520: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  {.            fp
f530: 72 69 6e 74 66 28 65 72 72 2c 0a 20 20 20 20 20  rintf(err,.     
f540: 20 20 20 20 20 20 20 20 20 20 22 25 73 69 6c 6c            "%sill
f550: 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 69  egal character i
f560: 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74  n floating-point
f570: 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d   argument.\n",em
f580: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sg);.           
f590: 20 65 72 72 6c 69 6e 65 28 69 2c 28 69 6e 74 29   errline(i,(int)
f5a0: 28 28 63 68 61 72 2a 29 65 6e 64 2d 28 63 68 61  ((char*)end-(cha
f5b0: 72 2a 29 61 72 67 76 5b 69 5d 29 2c 65 72 72 29  r*)argv[i]),err)
f5c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
f5d0: 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b          errcnt++
f5e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f5f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f600: 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
f610: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
f620: 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 76 20 3d  NT:.        lv =
f630: 20 73 74 72 74 6f 6c 28 63 70 2c 26 65 6e 64 2c   strtol(cp,&end,
f640: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
f650: 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  *end ){.        
f660: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
f670: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
f680: 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20  (err,"%sillegal 
f690: 63 68 61 72 61 63 74 65 72 20 69 6e 20 69 6e 74  character in int
f6a0: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 5c 6e  eger argument.\n
f6b0: 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  ",emsg);.       
f6c0: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 28       errline(i,(
f6d0: 69 6e 74 29 28 28 63 68 61 72 2a 29 65 6e 64 2d  int)((char*)end-
f6e0: 28 63 68 61 72 2a 29 61 72 67 76 5b 69 5d 29 2c  (char*)argv[i]),
f6f0: 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  err);.          
f700: 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 63  }.          errc
f710: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nt++;.        }.
f720: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f730: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54       case OPT_ST
f740: 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  R:.      case OP
f750: 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20  T_FSTR:.        
f760: 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 20  sv = cp;.       
f770: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f780: 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e    switch( op[j].
f790: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
f7a0: 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20  se OPT_FLAG:.   
f7b0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41     case OPT_FFLA
f7c0: 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  G:.        break
f7d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
f7e0: 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28  _DBL:.        *(
f7f0: 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61  double*)(op[j].a
f800: 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20 20 20  rg) = dv;.      
f810: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
f820: 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20  ase OPT_FDBL:.  
f830: 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29        (*(void(*)
f840: 28 64 6f 75 62 6c 65 29 29 28 6f 70 5b 6a 5d 2e  (double))(op[j].
f850: 61 72 67 29 29 28 64 76 29 3b 0a 20 20 20 20 20  arg))(dv);.     
f860: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f870: 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20  case OPT_INT:.  
f880: 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 28 6f 70        *(int*)(op
f890: 5b 6a 5d 2e 61 72 67 29 20 3d 20 6c 76 3b 0a 20  [j].arg) = lv;. 
f8a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f8b0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e      case OPT_FIN
f8c0: 54 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f  T:.        (*(vo
f8d0: 69 64 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b 6a  id(*)(int))(op[j
f8e0: 5d 2e 61 72 67 29 29 28 28 69 6e 74 29 6c 76 29  ].arg))((int)lv)
f8f0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
f900: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
f910: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 2a 28 63  STR:.        *(c
f920: 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67  har**)(op[j].arg
f930: 29 20 3d 20 73 76 3b 0a 20 20 20 20 20 20 20 20  ) = sv;.        
f940: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
f950: 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20  e OPT_FSTR:.    
f960: 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 63      (*(void(*)(c
f970: 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72  har *))(op[j].ar
f980: 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20 20 20  g))(sv);.       
f990: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f9a0: 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e  }.  return errcn
f9b0: 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69  t;.}..int OptIni
f9c0: 74 28 63 68 61 72 20 2a 2a 61 2c 20 73 74 72 75  t(char **a, stru
f9d0: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 2c  ct s_options *o,
f9e0: 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20   FILE *err).{.  
f9f0: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
fa00: 20 20 61 72 67 76 20 3d 20 61 3b 0a 20 20 6f 70    argv = a;.  op
fa10: 20 3d 20 6f 3b 0a 20 20 65 72 72 73 74 72 65 61   = o;.  errstrea
fa20: 6d 20 3d 20 65 72 72 3b 0a 20 20 69 66 28 20 61  m = err;.  if( a
fa30: 72 67 76 20 26 26 20 2a 61 72 67 76 20 26 26 20  rgv && *argv && 
fa40: 6f 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  op ){.    int i;
fa50: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72  .    for(i=1; ar
fa60: 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  gv[i]; i++){.   
fa70: 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 5b 30     if( argv[i][0
fa80: 5d 3d 3d 27 2b 27 20 7c 7c 20 61 72 67 76 5b 69  ]=='+' || argv[i
fa90: 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  ][0]=='-' ){.   
faa0: 20 20 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68       errcnt += h
fab0: 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72 72  andleflags(i,err
fac0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
fad0: 66 28 20 73 74 72 63 68 72 28 61 72 67 76 5b 69  f( strchr(argv[i
fae0: 5d 2c 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20  ],'=') ){.      
faf0: 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64    errcnt += hand
fb00: 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72 29 3b  leswitch(i,err);
fb10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fb20: 20 7d 0a 20 20 69 66 28 20 65 72 72 63 6e 74 3e   }.  if( errcnt>
fb30: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
fb40: 28 65 72 72 2c 22 56 61 6c 69 64 20 63 6f 6d 6d  (err,"Valid comm
fb50: 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73  and line options
fb60: 20 66 6f 72 20 5c 22 25 73 5c 22 20 61 72 65 3a   for \"%s\" are:
fb70: 5c 6e 22 2c 2a 61 29 3b 0a 20 20 20 20 4f 70 74  \n",*a);.    Opt
fb80: 50 72 69 6e 74 28 29 3b 0a 20 20 20 20 65 78 69  Print();.    exi
fb90: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  t(1);.  }.  retu
fba0: 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74  rn 0;.}..int Opt
fbb0: 4e 41 72 67 73 28 29 7b 0a 20 20 69 6e 74 20 63  NArgs(){.  int c
fbc0: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 64 61  nt = 0;.  int da
fbd0: 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  shdash = 0;.  in
fbe0: 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76 21  t i;.  if( argv!
fbf0: 3d 30 20 26 26 20 61 72 67 76 5b 30 5d 21 3d 30  =0 && argv[0]!=0
fc00: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
fc10: 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   argv[i]; i++){.
fc20: 20 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61        if( dashda
fc30: 73 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67  sh || !ISOPT(arg
fc40: 76 5b 69 5d 29 20 29 20 63 6e 74 2b 2b 3b 0a 20  v[i]) ) cnt++;. 
fc50: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
fc60: 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30  argv[i],"--")==0
fc70: 20 29 20 64 61 73 68 64 61 73 68 20 3d 20 31 3b   ) dashdash = 1;
fc80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
fc90: 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72  urn cnt;.}..char
fca0: 20 2a 4f 70 74 41 72 67 28 69 6e 74 20 6e 29 0a   *OptArg(int n).
fcb0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
fcc0: 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20   argindex(n);.  
fcd0: 72 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72  return i>=0 ? ar
fce0: 67 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f  gv[i] : 0;.}..vo
fcf0: 69 64 20 4f 70 74 45 72 72 28 69 6e 74 20 6e 29  id OptErr(int n)
fd00: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20  .{.  int i;.  i 
fd10: 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20  = argindex(n);. 
fd20: 20 69 66 28 20 69 3e 3d 30 20 29 20 65 72 72 6c   if( i>=0 ) errl
fd30: 69 6e 65 28 69 2c 30 2c 65 72 72 73 74 72 65 61  ine(i,0,errstrea
fd40: 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50  m);.}..void OptP
fd50: 72 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b  rint(){.  int i;
fd60: 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b  .  int max, len;
fd70: 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f  .  max = 0;.  fo
fd80: 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62  r(i=0; op[i].lab
fd90: 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65  el; i++){.    le
fda0: 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  n = lemonStrlen(
fdb0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b 20 31  op[i].label) + 1
fdc0: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  ;.    switch( op
fdd0: 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20  [i].type ){.    
fde0: 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a    case OPT_FLAG:
fdf0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
fe00: 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62  FFLAG:.        b
fe10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
fe20: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
fe30: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
fe40: 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 39 3b         len += 9;
fe50: 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68         /* length
fe60: 20 6f 66 20 22 3c 69 6e 74 65 67 65 72 3e 22 20   of "<integer>" 
fe70: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
fe80: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
fe90: 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  _DBL:.      case
fea0: 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
feb0: 20 20 20 6c 65 6e 20 2b 3d 20 36 3b 20 20 20 20     len += 6;    
fec0: 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20     /* length of 
fed0: 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20 20 20 20  "<real>" */.    
fee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
fef0: 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20   case OPT_STR:. 
ff00: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53       case OPT_FS
ff10: 54 52 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20  TR:.        len 
ff20: 2b 3d 20 38 3b 20 20 20 20 20 20 20 2f 2a 20 6c  += 8;       /* l
ff30: 65 6e 67 74 68 20 6f 66 20 22 3c 73 74 72 69 6e  ength of "<strin
ff40: 67 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  g>" */.        b
ff50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ff60: 69 66 28 20 6c 65 6e 3e 6d 61 78 20 29 20 6d 61  if( len>max ) ma
ff70: 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66  x = len;.  }.  f
ff80: 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61  or(i=0; op[i].la
ff90: 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bel; i++){.    s
ffa0: 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70  witch( op[i].typ
ffb0: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
ffc0: 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
ffd0: 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
ffe0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
fff0: 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 2d  errstream,"  -%-
10000 2a 73 20 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70  *s  %s\n",max,op
10010 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e  [i].label,op[i].
10020 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20  message);.      
10030 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
10040 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20  ase OPT_INT:.   
10050 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54     case OPT_FINT
10060 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  :.        fprint
10070 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d  f(errstream,"  -
10080 25 73 3c 69 6e 74 65 67 65 72 3e 25 2a 73 20 20  %s<integer>%*s  
10090 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65  %s\n",op[i].labe
100a0 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e  l,.          (in
100b0 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c  t)(max-lemonStrl
100c0 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d  en(op[i].label)-
100d0 39 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73  9),"",op[i].mess
100e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
100f0 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
10100 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63  OPT_DBL:.      c
10110 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20  ase OPT_FDBL:.  
10120 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
10130 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 73 3c 72  rstream,"  -%s<r
10140 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f  eal>%*s  %s\n",o
10150 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20  p[i].label,.    
10160 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d        (int)(max-
10170 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69  lemonStrlen(op[i
10180 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22 22 2c 6f  ].label)-6),"",o
10190 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20  p[i].message);. 
101a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
101b0 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
101c0 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
101d0 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 66  _FSTR:.        f
101e0 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d  printf(errstream
101f0 2c 22 20 20 2d 25 73 3c 73 74 72 69 6e 67 3e 25  ,"  -%s<string>%
10200 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e  *s  %s\n",op[i].
10210 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  label,.         
10220 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e   (int)(max-lemon
10230 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62  Strlen(op[i].lab
10240 65 6c 29 2d 38 29 2c 22 22 2c 6f 70 5b 69 5d 2e  el)-8),"",op[i].
10250 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20  message);.      
10260 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10270 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   }.}./**********
10280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
10290 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61 72  om the file "par
102a0 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  se.c" **********
102b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
102c0 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20  **/./*.** Input 
102d0 66 69 6c 65 20 70 61 72 73 65 72 20 66 6f 72 20  file parser for 
102e0 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
102f0 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
10300 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20  /* The state of 
10310 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 65 6e  the parser */.en
10320 75 6d 20 65 5f 73 74 61 74 65 20 7b 0a 20 20 49  um e_state {.  I
10330 4e 49 54 49 41 4c 49 5a 45 2c 0a 20 20 57 41 49  NITIALIZE,.  WAI
10340 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
10350 5f 52 55 4c 45 2c 0a 20 20 57 41 49 54 49 4e 47  _RULE,.  WAITING
10360 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52  _FOR_DECL_KEYWOR
10370 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  D,.  WAITING_FOR
10380 5f 44 45 43 4c 5f 41 52 47 2c 0a 20 20 57 41 49  _DECL_ARG,.  WAI
10390 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45  TING_FOR_PRECEDE
103a0 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41  NCE_SYMBOL,.  WA
103b0 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 2c  ITING_FOR_ARROW,
103c0 0a 20 20 49 4e 5f 52 48 53 2c 0a 20 20 4c 48 53  .  IN_RHS,.  LHS
103d0 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 4c 48 53 5f  _ALIAS_1,.  LHS_
103e0 41 4c 49 41 53 5f 32 2c 0a 20 20 4c 48 53 5f 41  ALIAS_2,.  LHS_A
103f0 4c 49 41 53 5f 33 2c 0a 20 20 52 48 53 5f 41 4c  LIAS_3,.  RHS_AL
10400 49 41 53 5f 31 2c 0a 20 20 52 48 53 5f 41 4c 49  IAS_1,.  RHS_ALI
10410 41 53 5f 32 2c 0a 20 20 50 52 45 43 45 44 45 4e  AS_2,.  PRECEDEN
10420 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 50 52 45  CE_MARK_1,.  PRE
10430 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c 0a  CEDENCE_MARK_2,.
10440 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52    RESYNC_AFTER_R
10450 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20 52 45 53  ULE_ERROR,.  RES
10460 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
10470 52 52 4f 52 2c 0a 20 20 57 41 49 54 49 4e 47 5f  RROR,.  WAITING_
10480 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53  FOR_DESTRUCTOR_S
10490 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47  YMBOL,.  WAITING
104a0 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59  _FOR_DATATYPE_SY
104b0 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f  MBOL,.  WAITING_
104c0 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 2c  FOR_FALLBACK_ID,
104d0 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57  .  WAITING_FOR_W
104e0 49 4c 44 43 41 52 44 5f 49 44 2c 0a 20 20 57 41  ILDCARD_ID,.  WA
104f0 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53 5f  ITING_FOR_CLASS_
10500 49 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  ID,.  WAITING_FO
10510 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 0a 7d 3b  R_CLASS_TOKEN.};
10520 0a 73 74 72 75 63 74 20 70 73 74 61 74 65 20 7b  .struct pstate {
10530 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  .  char *filenam
10540 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e;       /* Name
10550 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69   of the input fi
10560 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65  le */.  int toke
10570 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 2f 2a  nlineno;      /*
10580 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61 74 20 77   Linenumber at w
10590 68 69 63 68 20 63 75 72 72 65 6e 74 20 74 6f 6b  hich current tok
105a0 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a 20 20 69  en starts */.  i
105b0 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20  nt errorcnt;    
105c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
105d0 66 20 65 72 72 6f 72 73 20 73 6f 20 66 61 72 20  f errors so far 
105e0 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e  */.  char *token
105f0 73 74 61 72 74 3b 20 20 20 20 20 2f 2a 20 54 65  start;     /* Te
10600 78 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74 6f  xt of current to
10610 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ken */.  struct 
10620 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20 20 20 2f  lemon *gp;     /
10630 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74 65 20 76  * Global state v
10640 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d 20  ector */.  enum 
10650 65 5f 73 74 61 74 65 20 73 74 61 74 65 3b 20 20  e_state state;  
10660 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61        /* The sta
10670 74 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  te of the parser
10680 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
10690 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 20  bol *fallback;  
106a0 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61 63 6b   /* The fallback
106b0 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75   token */.  stru
106c0 63 74 20 73 79 6d 62 6f 6c 20 2a 74 6b 63 6c 61  ct symbol *tkcla
106d0 73 73 3b 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  ss;    /* Token 
106e0 63 6c 61 73 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a  class symbol */.
106f0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
10700 2a 6c 68 73 3b 20 20 20 20 20 20 20 20 2f 2a 20  *lhs;        /* 
10710 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  Left-hand side o
10720 66 20 63 75 72 72 65 6e 74 20 72 75 6c 65 20 2a  f current rule *
10730 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
10740 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 20 20 2f  lhsalias;      /
10750 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20  * Alias for the 
10760 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68  LHS */.  int nrh
10770 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
10780 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10790 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
107a0 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e 20 2a 2f   symbols seen */
107b0 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
107c0 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d 3b 20 20   *rhs[MAXRHS];  
107d0 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  /* RHS symbols *
107e0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
107f0 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d 3b 20 2f  alias[MAXRHS]; /
10800 2a 20 41 6c 69 61 73 65 73 20 66 6f 72 20 65 61  * Aliases for ea
10810 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 6f  ch RHS symbol (o
10820 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 74 72  r NULL) */.  str
10830 75 63 74 20 72 75 6c 65 20 2a 70 72 65 76 72 75  uct rule *prevru
10840 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72 65 76 69  le;     /* Previ
10850 6f 75 73 20 72 75 6c 65 20 70 61 72 73 65 64 20  ous rule parsed 
10860 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
10870 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b 20 20 20  *declkeyword;   
10880 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66 20 61 20  /* Keyword of a 
10890 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 20  declaration */. 
108a0 20 63 68 61 72 20 2a 2a 64 65 63 6c 61 72 67 73   char **declargs
108b0 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  lot;        /* W
108c0 68 65 72 65 20 74 68 65 20 64 65 63 6c 61 72 61  here the declara
108d0 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 73 68  tion argument sh
108e0 6f 75 6c 64 20 62 65 20 70 75 74 20 2a 2f 0a 20  ould be put */. 
108f0 20 69 6e 74 20 69 6e 73 65 72 74 4c 69 6e 65 4d   int insertLineM
10900 61 63 72 6f 3b 20 20 20 20 20 20 20 2f 2a 20 41  acro;       /* A
10910 64 64 20 23 6c 69 6e 65 20 62 65 66 6f 72 65 20  dd #line before 
10920 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 73 65  declaration inse
10930 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64 65 63  rt */.  int *dec
10940 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20 20 20 20  llinenoslot;    
10950 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
10960 72 69 74 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  rite declaration
10970 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
10980 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64    enum e_assoc d
10990 65 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20  eclassoc;    /* 
109a0 41 73 73 69 67 6e 20 74 68 69 73 20 61 73 73 6f  Assign this asso
109b0 63 69 61 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20  ciation to decl 
109c0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69  arguments */.  i
109d0 6e 74 20 70 72 65 63 63 6f 75 6e 74 65 72 3b 20  nt preccounter; 
109e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
109f0 69 67 6e 20 74 68 69 73 20 70 72 65 63 65 64 65  ign this precede
10a00 6e 63 65 20 74 6f 20 64 65 63 6c 20 61 72 67 75  nce to decl argu
10a10 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75 63  ments */.  struc
10a20 74 20 72 75 6c 65 20 2a 66 69 72 73 74 72 75 6c  t rule *firstrul
10a30 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  e;    /* Pointer
10a40 20 74 6f 20 66 69 72 73 74 20 72 75 6c 65 20 69   to first rule i
10a50 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f  n the grammar */
10a60 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
10a70 6c 61 73 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a  lastrule;     /*
10a80 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
10a90 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
10aa0 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a  rsed rule */.};.
10ab0 0a 2f 2a 20 50 61 72 73 65 20 61 20 73 69 6e 67  ./* Parse a sing
10ac0 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74  le token */.stat
10ad0 69 63 20 76 6f 69 64 20 70 61 72 73 65 6f 6e 65  ic void parseone
10ae0 74 6f 6b 65 6e 28 73 74 72 75 63 74 20 70 73 74  token(struct pst
10af0 61 74 65 20 2a 70 73 70 29 0a 7b 0a 20 20 63 6f  ate *psp).{.  co
10b00 6e 73 74 20 63 68 61 72 20 2a 78 3b 0a 20 20 78  nst char *x;.  x
10b10 20 3d 20 53 74 72 73 61 66 65 28 70 73 70 2d 3e   = Strsafe(psp->
10b20 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20 20 20  tokenstart);    
10b30 20 2f 2a 20 53 61 76 65 20 74 68 65 20 74 6f 6b   /* Save the tok
10b40 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a  en permanently *
10b50 2f 0a 23 69 66 20 30 0a 20 20 70 72 69 6e 74 66  /.#if 0.  printf
10b60 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b  ("%s:%d: Token=[
10b70 25 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c  %s] state=%d\n",
10b80 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
10b90 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
10ba0 20 20 20 20 78 2c 70 73 70 2d 3e 73 74 61 74 65      x,psp->state
10bb0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74  );.#endif.  swit
10bc0 63 68 28 20 70 73 70 2d 3e 73 74 61 74 65 20 29  ch( psp->state )
10bd0 7b 0a 20 20 20 20 63 61 73 65 20 49 4e 49 54 49  {.    case INITI
10be0 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70 73 70  ALIZE:.      psp
10bf0 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a  ->prevrule = 0;.
10c00 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63        psp->precc
10c10 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  ounter = 0;.    
10c20 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65    psp->firstrule
10c30 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65   = psp->lastrule
10c40 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d   = 0;.      psp-
10c50 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a  >gp->nrule = 0;.
10c60 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
10c70 72 75 20 74 6f 20 6e 65 78 74 20 63 61 73 65 20  ru to next case 
10c80 2a 2f 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  */.    case WAIT
10c90 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
10ca0 52 55 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  RULE:.      if( 
10cb0 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20  x[0]=='%' ){.   
10cc0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10cd0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
10ce0 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20  CL_KEYWORD;.    
10cf0 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 4c 4f    }else if( ISLO
10d00 57 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  WER(x[0]) ){.   
10d10 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20       psp->lhs = 
10d20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
10d30 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73         psp->nrhs
10d40 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
10d50 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b  p->lhsalias = 0;
10d60 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10d70 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
10d80 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d  R_ARROW;.      }
10d90 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
10da0 7b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  {' ){.        if
10db0 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d  ( psp->prevrule=
10dc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10dd0 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
10de0 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10df0 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20  nlineno,."There 
10e00 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65  is no prior rule
10e10 20 75 70 6f 6e 20 77 68 69 63 68 20 74 6f 20 61   upon which to a
10e20 74 74 61 63 68 20 74 68 65 20 63 6f 64 65 20 5c  ttach the code \
10e30 0a 66 72 61 67 6d 65 6e 74 20 77 68 69 63 68 20  .fragment which 
10e40 62 65 67 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c  begins on this l
10e50 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ine.");.        
10e60 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
10e70 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
10e80 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75   if( psp->prevru
10e90 6c 65 2d 3e 63 6f 64 65 21 3d 30 20 29 7b 0a 20  le->code!=0 ){. 
10ea0 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
10eb0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
10ec0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
10ed0 2c 0a 22 43 6f 64 65 20 66 72 61 67 6d 65 6e 74  ,."Code fragment
10ee0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 6e 20 74 68   beginning on th
10ef0 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
10f00 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f  he first \.to fo
10f10 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75  llow the previou
10f20 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20  s rule.");.     
10f30 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
10f40 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  nt++;.        }e
10f50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
10f60 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 6c 69  sp->prevrule->li
10f70 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ne = psp->tokenl
10f80 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  ineno;.         
10f90 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e   psp->prevrule->
10fa0 63 6f 64 65 20 3d 20 26 78 5b 31 5d 3b 0a 20 20  code = &x[1];.  
10fb0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
10fc0 76 72 75 6c 65 2d 3e 6e 6f 43 6f 64 65 20 3d 20  vrule->noCode = 
10fd0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
10fe0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30     }else if( x[0
10ff0 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  ]=='[' ){.      
11000 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50    psp->state = P
11010 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31  RECEDENCE_MARK_1
11020 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11030 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11040 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
11050 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
11060 20 20 20 20 20 20 20 20 20 20 22 54 6f 6b 65 6e            "Token
11070 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62   \"%s\" should b
11080 65 20 65 69 74 68 65 72 20 5c 22 25 25 5c 22 20  e either \"%%\" 
11090 6f 72 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  or a nonterminal
110a0 20 6e 61 6d 65 2e 22 2c 0a 20 20 20 20 20 20 20   name.",.       
110b0 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70     x);.        p
110c0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
110d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
110e0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52  eak;.    case PR
110f0 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a  ECEDENCE_MARK_1:
11100 0a 20 20 20 20 20 20 69 66 28 20 21 49 53 55 50  .      if( !ISUP
11110 50 45 52 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  PER(x[0]) ){.   
11120 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
11130 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
11140 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
11150 20 20 20 20 20 20 20 20 22 54 68 65 20 70 72 65          "The pre
11160 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6d  cedence symbol m
11170 75 73 74 20 62 65 20 61 20 74 65 72 6d 69 6e 61  ust be a termina
11180 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  l.");.        ps
11190 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
111a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
111b0 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20  sp->prevrule==0 
111c0 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
111d0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
111e0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
111f0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54  no,.          "T
11200 68 65 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72  here is no prior
11210 20 72 75 6c 65 20 74 6f 20 61 73 73 69 67 6e 20   rule to assign 
11220 70 72 65 63 65 64 65 6e 63 65 20 5c 22 5b 25 73  precedence \"[%s
11230 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  ]\".",x);.      
11240 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11250 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
11260 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65  f( psp->prevrule
11270 2d 3e 70 72 65 63 73 79 6d 21 3d 30 20 29 7b 0a  ->precsym!=0 ){.
11280 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11290 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
112a0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
112b0 0a 22 50 72 65 63 65 64 65 6e 63 65 20 6d 61 72  ."Precedence mar
112c0 6b 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69  k on this line i
112d0 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 20  s not the first 
112e0 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20  \.to follow the 
112f0 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22 29  previous rule.")
11300 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
11310 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
11320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11330 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70  psp->prevrule->p
11340 72 65 63 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f  recsym = Symbol_
11350 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a  new(x);.      }.
11360 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11370 20 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41   = PRECEDENCE_MA
11380 52 4b 5f 32 3b 0a 20 20 20 20 20 20 62 72 65 61  RK_2;.      brea
11390 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45 43  k;.    case PREC
113a0 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20  EDENCE_MARK_2:. 
113b0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 21 3d 27       if( x[0]!='
113c0 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]' ){.        Er
113d0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
113e0 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
113f0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
11400 20 22 4d 69 73 73 69 6e 67 20 5c 22 5d 5c 22 20   "Missing \"]\" 
11410 6f 6e 20 70 72 65 63 65 64 65 6e 63 65 20 6d 61  on precedence ma
11420 72 6b 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  rk.");.        p
11430 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 73        }.      ps
11450 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11460 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
11470 55 4c 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ULE;.      break
11480 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
11490 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3a 0a 20 20  NG_FOR_ARROW:.  
114a0 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a      if( x[0]==':
114b0 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26  ' && x[1]==':' &
114c0 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20  & x[2]=='=' ){. 
114d0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
114e0 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20  e = IN_RHS;.    
114f0 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
11500 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20  =='(' ){.       
11510 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48   psp->state = LH
11520 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20  S_ALIAS_1;.     
11530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11540 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
11550 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
11560 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
11570 20 20 20 22 45 78 70 65 63 74 65 64 20 74 6f 20     "Expected to 
11580 73 65 65 20 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c  see a \":\" foll
11590 6f 77 69 6e 67 20 74 68 65 20 4c 48 53 20 73 79  owing the LHS sy
115a0 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a 20  mbol \"%s\".",. 
115b0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68           psp->lh
115c0 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  s->name);.      
115d0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
115e0 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
115f0 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
11600 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
11610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11620 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c  reak;.    case L
11630 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20  HS_ALIAS_1:.    
11640 20 20 69 66 28 20 49 53 41 4c 50 48 41 28 78 5b    if( ISALPHA(x[
11650 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
11660 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 78  sp->lhsalias = x
11670 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
11680 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53  tate = LHS_ALIAS
11690 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _2;.      }else{
116a0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
116b0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
116c0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
116d0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 25  ,.          "\"%
116e0 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  s\" is not a val
116f0 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  id alias for the
11700 20 4c 48 53 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a   LHS \"%s\"\n",.
11710 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d            x,psp-
11720 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  >lhs->name);.   
11730 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11740 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
11750 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11760 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
11770 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
11780 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11790 65 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20  e LHS_ALIAS_2:. 
117a0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
117b0 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  )' ){.        ps
117c0 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41  p->state = LHS_A
117d0 4c 49 41 53 5f 33 3b 0a 20 20 20 20 20 20 7d 65  LIAS_3;.      }e
117e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
117f0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11800 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
11810 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
11820 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20 66  "Missing \")\" f
11830 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69  ollowing LHS ali
11840 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22  as name \"%s\"."
11850 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b  ,psp->lhsalias);
11860 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
11870 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
11880 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
11890 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
118a0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
118b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
118c0 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f   case LHS_ALIAS_
118d0 33 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  3:.      if( x[0
118e0 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d  ]==':' && x[1]==
118f0 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27  ':' && x[2]=='='
11900 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
11910 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b  >state = IN_RHS;
11920 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11930 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11940 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11950 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11960 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
11970 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69  g \"->\" followi
11980 6e 67 3a 20 5c 22 25 73 28 25 73 29 5c 22 2e 22  ng: \"%s(%s)\"."
11990 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 73 70  ,.           psp
119a0 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d  ->lhs->name,psp-
119b0 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20  >lhsalias);.    
119c0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
119d0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
119e0 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
119f0 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
11a00 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
11a10 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
11a20 20 49 4e 5f 52 48 53 3a 0a 20 20 20 20 20 20 69   IN_RHS:.      i
11a30 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  f( x[0]=='.' ){.
11a40 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 72          struct r
11a50 75 6c 65 20 2a 72 70 3b 0a 20 20 20 20 20 20 20  ule *rp;.       
11a60 20 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75   rp = (struct ru
11a70 6c 65 20 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a  le *)calloc( siz
11a80 65 6f 66 28 73 74 72 75 63 74 20 72 75 6c 65 29  eof(struct rule)
11a90 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   + .            
11aa0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
11ab0 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68  ymbol*)*psp->nrh
11ac0 73 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 2a  s + sizeof(char*
11ad0 29 2a 70 73 70 2d 3e 6e 72 68 73 2c 20 31 29 3b  )*psp->nrhs, 1);
11ae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70 3d  .        if( rp=
11af0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11b00 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
11b10 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
11b20 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
11b30 20 20 20 20 20 22 43 61 6e 27 74 20 61 6c 6c 6f       "Can't allo
11b40 63 61 74 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f  cate enough memo
11b50 72 79 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65  ry for this rule
11b60 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  .");.          p
11b70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11b80 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
11b90 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  revrule = 0;.   
11ba0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11bb0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
11bc0 20 20 20 20 20 20 20 72 70 2d 3e 72 75 6c 65 6c         rp->rulel
11bd0 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e  ine = psp->token
11be0 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20  lineno;.        
11bf0 20 20 72 70 2d 3e 72 68 73 20 3d 20 28 73 74 72    rp->rhs = (str
11c00 75 63 74 20 73 79 6d 62 6f 6c 2a 2a 29 26 72 70  uct symbol**)&rp
11c10 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  [1];.          r
11c20 70 2d 3e 72 68 73 61 6c 69 61 73 20 3d 20 28 63  p->rhsalias = (c
11c30 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 28 72 70  onst char**)&(rp
11c40 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  ->rhs[psp->nrhs]
11c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
11c60 28 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e 72 68  (i=0; i<psp->nrh
11c70 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
11c80 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 20       rp->rhs[i] 
11c90 3d 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20  = psp->rhs[i];. 
11ca0 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72             rp->r
11cb0 68 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70 73 70  hsalias[i] = psp
11cc0 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a 20 20 20 20  ->alias[i];.    
11cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11ce0 20 20 72 70 2d 3e 6c 68 73 20 3d 20 70 73 70 2d    rp->lhs = psp-
11cf0 3e 6c 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20  >lhs;.          
11d00 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 70  rp->lhsalias = p
11d10 73 70 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a 20 20  sp->lhsalias;.  
11d20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 72 68 73          rp->nrhs
11d30 20 3d 20 70 73 70 2d 3e 6e 72 68 73 3b 0a 20 20   = psp->nrhs;.  
11d40 20 20 20 20 20 20 20 20 72 70 2d 3e 63 6f 64 65          rp->code
11d50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
11d60 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 31 3b 0a  rp->noCode = 1;.
11d70 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72            rp->pr
11d80 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20 20  ecsym = 0;.     
11d90 20 20 20 20 20 72 70 2d 3e 69 6e 64 65 78 20 3d       rp->index =
11da0 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b   psp->gp->nrule+
11db0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  +;.          rp-
11dc0 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e 6c  >nextlhs = rp->l
11dd0 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20 20  hs->rule;.      
11de0 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c      rp->lhs->rul
11df0 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20  e = rp;.        
11e00 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a    rp->next = 0;.
11e10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 73            if( ps
11e20 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30 20  p->firstrule==0 
11e30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
11e40 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20  sp->firstrule = 
11e50 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20  psp->lastrule = 
11e60 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  rp;.          }e
11e70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
11e80 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 2d 3e   psp->lastrule->
11e90 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20 20 20 20  next = rp;.     
11ea0 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73 74         psp->last
11eb0 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20  rule = rp;.     
11ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
11ed0 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d   psp->prevrule =
11ee0 20 72 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rp;.        }. 
11ef0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11f00 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11f10 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
11f20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53      }else if( IS
11f30 41 4c 50 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20  ALPHA(x[0]) ){. 
11f40 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e         if( psp->
11f50 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20 29 7b 0a  nrhs>=MAXRHS ){.
11f60 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
11f70 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11f80 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11f90 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  o,.            "
11fa0 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62 6f 6c 73  Too many symbols
11fb0 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 20   on RHS of rule 
11fc0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 5c 22 25  beginning at \"%
11fd0 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  s\".",.         
11fe0 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20     x);.         
11ff0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
12000 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12010 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
12020 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
12030 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
12040 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12050 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d  rhs[psp->nrhs] =
12060 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
12070 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61            psp->a
12080 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20  lias[psp->nrhs] 
12090 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
120a0 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 20 20 20 20  sp->nrhs++;.    
120b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
120c0 65 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7c 27  e if( (x[0]=='|'
120d0 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20 26   || x[0]=='/') &
120e0 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b  & psp->nrhs>0 ){
120f0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
12100 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73  symbol *msp = ps
12110 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73  p->rhs[psp->nrhs
12120 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  -1];.        if(
12130 20 6d 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54   msp->type!=MULT
12140 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
12150 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
12160 6d 62 6f 6c 20 2a 6f 72 69 67 73 70 20 3d 20 6d  mbol *origsp = m
12170 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  sp;.          ms
12180 70 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  p = (struct symb
12190 6f 6c 20 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73  ol *) calloc(1,s
121a0 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20 20  izeof(*msp));.  
121b0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 6d          memset(m
121c0 73 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6d  sp, 0, sizeof(*m
121d0 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sp));.          
121e0 6d 73 70 2d 3e 74 79 70 65 20 3d 20 4d 55 4c 54  msp->type = MULT
121f0 49 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 20  ITERMINAL;.     
12200 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79       msp->nsubsy
12210 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
12220 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28   msp->subsym = (
12230 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
12240 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f  ) calloc(1,sizeo
12250 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a  f(struct symbol*
12260 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  ));.          ms
12270 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 20 3d 20 6f  p->subsym[0] = o
12280 72 69 67 73 70 3b 0a 20 20 20 20 20 20 20 20 20  rigsp;.         
12290 20 6d 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f 72 69   msp->name = ori
122a0 67 73 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 20  gsp->name;.     
122b0 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73       psp->rhs[ps
122c0 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d 73 70  p->nrhs-1] = msp
122d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
122e0 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d      msp->nsubsym
122f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d  ++;.        msp-
12300 3e 73 75 62 73 79 6d 20 3d 20 28 73 74 72 75 63  >subsym = (struc
12310 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61  t symbol **) rea
12320 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d  lloc(msp->subsym
12330 2c 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a 65  ,.          size
12340 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
12350 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29  *)*msp->nsubsym)
12360 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73  ;.        msp->s
12370 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73  ubsym[msp->nsubs
12380 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e  ym-1] = Symbol_n
12390 65 77 28 26 78 5b 31 5d 29 3b 0a 20 20 20 20 20  ew(&x[1]);.     
123a0 20 20 20 69 66 28 20 49 53 4c 4f 57 45 52 28 78     if( ISLOWER(x
123b0 5b 31 5d 29 20 7c 7c 20 49 53 4c 4f 57 45 52 28  [1]) || ISLOWER(
123c0 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e  msp->subsym[0]->
123d0 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20  name[0]) ){.    
123e0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
123f0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
12400 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
12410 20 20 20 20 20 20 20 20 20 20 20 22 43 61 6e 6e             "Cann
12420 6f 74 20 66 6f 72 6d 20 61 20 63 6f 6d 70 6f 75  ot form a compou
12430 6e 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  nd containing a 
12440 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 22 29 3b 0a  non-terminal");.
12450 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
12460 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
12470 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
12480 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 26   if( x[0]=='(' &
12490 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b  & psp->nrhs>0 ){
124a0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
124b0 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f  ate = RHS_ALIAS_
124c0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
124d0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
124e0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
124f0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
12500 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65  .          "Ille
12510 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 6f 6e  gal character on
12520 20 52 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c 22   RHS of rule: \"
12530 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  %s\".",x);.     
12540 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
12550 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
12560 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
12570 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
12580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12590 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
125a0 52 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20  RHS_ALIAS_1:.   
125b0 20 20 20 69 66 28 20 49 53 41 4c 50 48 41 28 78     if( ISALPHA(x
125c0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
125d0 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e  psp->alias[psp->
125e0 6e 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20 20  nrhs-1] = x;.   
125f0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
12600 3d 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20  = RHS_ALIAS_2;. 
12610 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12620 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
12630 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
12640 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
12650 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69         "\"%s\" i
12660 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c  s not a valid al
12670 69 61 73 20 66 6f 72 20 74 68 65 20 52 48 53 20  ias for the RHS 
12680 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22  symbol \"%s\"\n"
12690 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70 73  ,.          x,ps
126a0 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73  p->rhs[psp->nrhs
126b0 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  -1]->name);.    
126c0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
126d0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
126e0 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
126f0 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
12700 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
12710 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
12720 20 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20   RHS_ALIAS_2:.  
12730 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29      if( x[0]==')
12740 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
12750 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53  ->state = IN_RHS
12760 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12770 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
12780 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
12790 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
127a0 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69            "Missi
127b0 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69  ng \")\" followi
127c0 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d  ng LHS alias nam
127d0 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e  e \"%s\".",psp->
127e0 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20  lhsalias);.     
127f0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
12800 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
12810 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
12820 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
12830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12840 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
12850 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
12860 5f 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20  _KEYWORD:.      
12870 69 66 28 20 49 53 41 4c 50 48 41 28 78 5b 30 5d  if( ISALPHA(x[0]
12880 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ) ){.        psp
12890 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d 20  ->declkeyword = 
128a0 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  x;.        psp->
128b0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30 3b  declargslot = 0;
128c0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
128d0 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20 30  cllinenoslot = 0
128e0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69  ;.        psp->i
128f0 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
12900 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   1;.        psp-
12910 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
12920 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20  _FOR_DECL_ARG;. 
12930 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
12940 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30 20 29  p(x,"name")==0 )
12950 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
12960 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
12970 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65 29 3b  (psp->gp->name);
12980 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12990 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
129a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
129b0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
129c0 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20 29 7b  "include")==0 ){
129d0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
129e0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
129f0 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65  psp->gp->include
12a00 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
12a10 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 63   if( strcmp(x,"c
12a20 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ode")==0 ){.    
12a30 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
12a40 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
12a50 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 29 3b 0a  gp->extracode);.
12a60 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
12a70 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
12a80 6e 5f 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d  n_destructor")==
12a90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
12aa0 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
12ab0 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65  = &psp->gp->toke
12ac0 6e 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 7d  ndest;.        }
12ad0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
12ae0 78 2c 22 64 65 66 61 75 6c 74 5f 64 65 73 74 72  x,"default_destr
12af0 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20  uctor")==0 ){.  
12b00 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
12b10 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d  largslot = &psp-
12b20 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20  >gp->vardest;.  
12b30 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12b40 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f  strcmp(x,"token_
12b50 70 72 65 66 69 78 22 29 3d 3d 30 20 29 7b 0a 20  prefix")==0 ){. 
12b60 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
12b70 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70  clargslot = &psp
12b80 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  ->gp->tokenprefi
12b90 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  x;.          psp
12ba0 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
12bb0 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  o = 0;.        }
12bc0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
12bd0 78 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f 72 22  x,"syntax_error"
12be0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12bf0 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
12c00 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
12c10 65 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  error);.        
12c20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
12c30 28 78 2c 22 70 61 72 73 65 5f 61 63 63 65 70 74  (x,"parse_accept
12c40 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
12c50 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
12c60 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
12c70 3e 61 63 63 65 70 74 29 3b 0a 20 20 20 20 20 20  >accept);.      
12c80 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
12c90 6d 70 28 78 2c 22 70 61 72 73 65 5f 66 61 69 6c  mp(x,"parse_fail
12ca0 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ure")==0 ){.    
12cb0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
12cc0 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
12cd0 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 20 20  gp->failure);.  
12ce0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12cf0 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f  strcmp(x,"stack_
12d00 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20 29 7b  overflow")==0 ){
12d10 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12d20 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
12d30 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c 6f  psp->gp->overflo
12d40 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  w);.        }els
12d50 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
12d60 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74 22 29  extra_argument")
12d70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12d80 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
12d90 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61  t = &(psp->gp->a
12da0 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  rg);.          p
12db0 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
12dc0 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
12dd0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12de0 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70 65 22  p(x,"token_type"
12df0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12e00 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
12e10 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
12e20 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20 20 20  tokentype);.    
12e30 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
12e40 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a  tLineMacro = 0;.
12e50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
12e60 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61  ( strcmp(x,"defa
12e70 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b  ult_type")==0 ){
12e80 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12e90 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
12ea0 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79 70 65  psp->gp->vartype
12eb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
12ec0 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
12ed0 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  o = 0;.        }
12ee0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
12ef0 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22 29 3d  x,"stack_size")=
12f00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12f10 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
12f20 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74   = &(psp->gp->st
12f30 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  acksize);.      
12f40 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
12f50 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20  ineMacro = 0;.  
12f60 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12f70 73 74 72 63 6d 70 28 78 2c 22 73 74 61 72 74 5f  strcmp(x,"start_
12f80 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b 0a 20  symbol")==0 ){. 
12f90 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
12fa0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
12fb0 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b 0a 20  p->gp->start);. 
12fc0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
12fd0 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
12fe0 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
12ff0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6c   if( strcmp(x,"l
13000 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eft")==0 ){.    
13010 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63        psp->precc
13020 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
13030 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73      psp->declass
13040 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20 20 20  oc = LEFT;.     
13050 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
13060 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52  = WAITING_FOR_PR
13070 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b  ECEDENCE_SYMBOL;
13080 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
13090 66 28 20 73 74 72 63 6d 70 28 78 2c 22 72 69 67  f( strcmp(x,"rig
130a0 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ht")==0 ){.     
130b0 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f       psp->precco
130c0 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20  unter++;.       
130d0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f     psp->declasso
130e0 63 20 3d 20 52 49 47 48 54 3b 0a 20 20 20 20 20  c = RIGHT;.     
130f0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
13100 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52  = WAITING_FOR_PR
13110 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b  ECEDENCE_SYMBOL;
13120 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
13130 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 6f 6e  f( strcmp(x,"non
13140 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a 20 20  assoc")==0 ){.  
13150 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
13160 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
13170 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
13180 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20 20 20  ssoc = NONE;.   
13190 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
131a0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
131b0 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
131c0 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
131d0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64   if( strcmp(x,"d
131e0 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29  estructor")==0 )
131f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
13200 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
13210 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f  _FOR_DESTRUCTOR_
13220 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20  SYMBOL;.        
13230 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
13240 28 78 2c 22 74 79 70 65 22 29 3d 3d 30 20 29 7b  (x,"type")==0 ){
13250 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13260 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
13270 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d  FOR_DATATYPE_SYM
13280 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  BOL;.        }el
13290 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
132a0 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30 20 29  "fallback")==0 )
132b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
132c0 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  >fallback = 0;. 
132d0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
132e0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
132f0 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b 0a 20  R_FALLBACK_ID;. 
13300 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
13310 20 73 74 72 63 6d 70 28 78 2c 22 77 69 6c 64 63   strcmp(x,"wildc
13320 61 72 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ard")==0 ){.    
13330 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
13340 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57   = WAITING_FOR_W
13350 49 4c 44 43 41 52 44 5f 49 44 3b 0a 20 20 20 20  ILDCARD_ID;.    
13360 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
13370 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 63 6c  rcmp(x,"token_cl
13380 61 73 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ass")==0 ){.    
13390 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
133a0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43   = WAITING_FOR_C
133b0 4c 41 53 53 5f 49 44 3b 0a 20 20 20 20 20 20 20  LASS_ID;.       
133c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
133d0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
133e0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
133f0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
13400 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20         "Unknown 
13410 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77  declaration keyw
13420 6f 72 64 3a 20 5c 22 25 25 25 73 5c 22 2e 22 2c  ord: \"%%%s\".",
13430 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
13440 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
13450 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
13460 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
13470 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
13480 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13490 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
134a0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
134b0 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
134c0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
134d0 20 22 49 6c 6c 65 67 61 6c 20 64 65 63 6c 61 72   "Illegal declar
134e0 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c  ation keyword: \
134f0 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20  "%s\".",x);.    
13500 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
13510 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
13520 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
13530 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
13540 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
13550 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
13560 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53   WAITING_FOR_DES
13570 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3a 0a  TRUCTOR_SYMBOL:.
13580 20 20 20 20 20 20 69 66 28 20 21 49 53 41 4c 50        if( !ISALP
13590 48 41 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  HA(x[0]) ){.    
135a0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
135b0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
135c0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
135d0 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e         "Symbol n
135e0 61 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65  ame missing afte
135f0 72 20 25 25 64 65 73 74 72 75 63 74 6f 72 20 6b  r %%destructor k
13600 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20  eyword");.      
13610 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
13620 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
13630 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
13640 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
13650 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13660 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
13670 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c  bol *sp = Symbol
13680 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
13690 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
136a0 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 72 75 63  t = &sp->destruc
136b0 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 73 70  tor;.        psp
136c0 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74  ->decllinenoslot
136d0 20 3d 20 26 73 70 2d 3e 64 65 73 74 4c 69 6e 65   = &sp->destLine
136e0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  no;.        psp-
136f0 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
13700 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73   = 1;.        ps
13710 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
13720 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b  NG_FOR_DECL_ARG;
13730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
13740 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
13750 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54  AITING_FOR_DATAT
13760 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20  YPE_SYMBOL:.    
13770 20 20 69 66 28 20 21 49 53 41 4c 50 48 41 28 78    if( !ISALPHA(x
13780 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
13790 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
137a0 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
137b0 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
137c0 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20     "Symbol name 
137d0 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20 25 25  missing after %%
137e0 74 79 70 65 20 6b 65 79 77 6f 72 64 22 29 3b 0a  type keyword");.
137f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
13800 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
13810 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
13820 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
13830 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
13840 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  se{.        stru
13850 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
13860 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a  Symbol_find(x);.
13870 20 20 20 20 20 20 20 20 69 66 28 28 73 70 29 20          if((sp) 
13880 26 26 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65  && (sp->datatype
13890 29 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72  )){.          Er
138a0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
138b0 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
138c0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
138d0 20 20 20 22 53 79 6d 62 6f 6c 20 25 25 74 79 70     "Symbol %%typ
138e0 65 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79  e \"%s\" already
138f0 20 64 65 66 69 6e 65 64 22 2c 20 78 29 3b 0a 20   defined", x);. 
13900 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
13910 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
13920 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
13930 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
13940 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
13950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13960 20 20 20 69 66 20 28 21 73 70 29 7b 0a 20 20 20     if (!sp){.   
13970 20 20 20 20 20 20 20 20 20 73 70 20 3d 20 53 79           sp = Sy
13980 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
13990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
139a0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
139b0 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74 61 74  lot = &sp->datat
139c0 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ype;.          p
139d0 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
139e0 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
139f0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
13a00 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
13a10 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _ARG;.        }.
13a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
13a30 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
13a40 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44  ITING_FOR_PRECED
13a50 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20  ENCE_SYMBOL:.   
13a60 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
13a70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
13a80 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
13a90 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
13aa0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
13ab0 66 28 20 49 53 55 50 50 45 52 28 78 5b 30 5d 29  f( ISUPPER(x[0])
13ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
13ad0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
13ae0 20 20 20 20 20 20 20 73 70 20 3d 20 53 79 6d 62         sp = Symb
13af0 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
13b00 20 20 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e     if( sp->prec>
13b10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13b20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
13b30 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
13b40 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
13b50 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25       "Symbol \"%
13b60 73 5c 22 20 68 61 73 20 61 6c 72 65 61 64 79 20  s\" has already 
13b70 62 65 20 67 69 76 65 6e 20 61 20 70 72 65 63 65  be given a prece
13b80 64 65 6e 63 65 2e 22 2c 78 29 3b 0a 20 20 20 20  dence.",x);.    
13b90 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
13ba0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
13bb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
13bc0 73 70 2d 3e 70 72 65 63 20 3d 20 70 73 70 2d 3e  sp->prec = psp->
13bd0 70 72 65 63 63 6f 75 6e 74 65 72 3b 0a 20 20 20  preccounter;.   
13be0 20 20 20 20 20 20 20 73 70 2d 3e 61 73 73 6f 63         sp->assoc
13bf0 20 3d 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f   = psp->declasso
13c00 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
13c10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13c20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
13c30 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
13c40 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
13c50 20 20 20 20 20 22 43 61 6e 27 74 20 61 73 73 69       "Can't assi
13c60 67 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65 20  gn a precedence 
13c70 74 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a  to \"%s\".",x);.
13c80 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
13c90 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
13ca0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13cb0 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
13cc0 4f 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20 20  OR_DECL_ARG:.   
13cd0 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27     if( x[0]=='{'
13ce0 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c   || x[0]=='\"' |
13cf0 7c 20 49 53 41 4c 4e 55 4d 28 78 5b 30 5d 29 20  | ISALNUM(x[0]) 
13d00 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
13d10 20 63 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e   char *zOld, *zN
13d20 65 77 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  ew;.        char
13d30 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20 20 20   *zBuf, *z;.    
13d40 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e 2c      int nOld, n,
13d50 20 6e 4c 69 6e 65 20 3d 20 30 2c 20 6e 4e 65 77   nLine = 0, nNew
13d60 2c 20 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20 20  , nBack;.       
13d70 20 69 6e 74 20 61 64 64 4c 69 6e 65 4d 61 63 72   int addLineMacr
13d80 6f 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  o;.        char 
13d90 7a 4c 69 6e 65 5b 35 30 5d 3b 0a 20 20 20 20 20  zLine[50];.     
13da0 20 20 20 7a 4e 65 77 20 3d 20 78 3b 0a 20 20 20     zNew = x;.   
13db0 20 20 20 20 20 69 66 28 20 7a 4e 65 77 5b 30 5d       if( zNew[0]
13dc0 3d 3d 27 22 27 20 7c 7c 20 7a 4e 65 77 5b 30 5d  =='"' || zNew[0]
13dd0 3d 3d 27 7b 27 20 29 20 7a 4e 65 77 2b 2b 3b 0a  =='{' ) zNew++;.
13de0 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 6c          nNew = l
13df0 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4e 65 77 29  emonStrlen(zNew)
13e00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70  ;.        if( *p
13e10 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
13e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c  ){.          zOl
13e30 64 20 3d 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72  d = *psp->declar
13e40 67 73 6c 6f 74 3b 0a 20 20 20 20 20 20 20 20 7d  gslot;.        }
13e50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
13e60 7a 4f 6c 64 20 3d 20 22 22 3b 0a 20 20 20 20 20  zOld = "";.     
13e70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 4f 6c     }.        nOl
13e80 64 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  d = lemonStrlen(
13e90 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 6e  zOld);.        n
13ea0 20 3d 20 6e 4f 6c 64 20 2b 20 6e 4e 65 77 20 2b   = nOld + nNew +
13eb0 20 32 30 3b 0a 20 20 20 20 20 20 20 20 61 64 64   20;.        add
13ec0 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 21 70 73 70  LineMacro = !psp
13ed0 2d 3e 67 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66  ->gp->nolinenosf
13ee0 6c 61 67 20 26 26 20 70 73 70 2d 3e 69 6e 73 65  lag && psp->inse
13ef0 72 74 4c 69 6e 65 4d 61 63 72 6f 20 26 26 0a 20  rtLineMacro &&. 
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f10 20 20 20 20 20 20 20 28 70 73 70 2d 3e 64 65 63         (psp->dec
13f20 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3d 3d 30 20 7c  llinenoslot==0 |
13f30 7c 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e  | psp->decllinen
13f40 6f 73 6c 6f 74 5b 30 5d 21 3d 30 29 3b 0a 20 20  oslot[0]!=0);.  
13f50 20 20 20 20 20 20 69 66 28 20 61 64 64 4c 69 6e        if( addLin
13f60 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20 20 20  eMacro ){.      
13f70 20 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66      for(z=psp->f
13f80 69 6c 65 6e 61 6d 65 2c 20 6e 42 61 63 6b 3d 30  ilename, nBack=0
13f90 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20  ; *z; z++){.    
13fa0 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d          if( *z==
13fb0 27 5c 5c 27 20 29 20 6e 42 61 63 6b 2b 2b 3b 0a  '\\' ) nBack++;.
13fc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13fd0 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69        lemon_spri
13fe0 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 23 6c 69 6e  ntf(zLine, "#lin
13ff0 65 20 25 64 20 22 2c 20 70 73 70 2d 3e 74 6f 6b  e %d ", psp->tok
14000 65 6e 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  enlineno);.     
14010 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6c 65 6d       nLine = lem
14020 6f 6e 53 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b  onStrlen(zLine);
14030 0a 20 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20  .          n += 
14040 6e 4c 69 6e 65 20 2b 20 6c 65 6d 6f 6e 53 74 72  nLine + lemonStr
14050 6c 65 6e 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  len(psp->filenam
14060 65 29 20 2b 20 6e 42 61 63 6b 3b 0a 20 20 20 20  e) + nBack;.    
14070 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
14080 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
14090 3d 20 28 63 68 61 72 20 2a 29 20 72 65 61 6c 6c  = (char *) reall
140a0 6f 63 28 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67  oc(*psp->declarg
140b0 73 6c 6f 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20  slot, n);.      
140c0 20 20 7a 42 75 66 20 3d 20 2a 70 73 70 2d 3e 64    zBuf = *psp->d
140d0 65 63 6c 61 72 67 73 6c 6f 74 20 2b 20 6e 4f 6c  eclargslot + nOl
140e0 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  d;.        if( a
140f0 64 64 4c 69 6e 65 4d 61 63 72 6f 20 29 7b 0a 20  ddLineMacro ){. 
14100 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 6c           if( nOl
14110 64 20 26 26 20 7a 42 75 66 5b 2d 31 5d 21 3d 27  d && zBuf[-1]!='
14120 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  \n' ){.         
14130 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27     *(zBuf++) = '
14140 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  \n';.          }
14150 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
14160 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 6e  y(zBuf, zLine, n
14170 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Line);.         
14180 20 7a 42 75 66 20 2b 3d 20 6e 4c 69 6e 65 3b 0a   zBuf += nLine;.
14190 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66            *(zBuf
141a0 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20 20 20  ++) = '"';.     
141b0 20 20 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d 3e       for(z=psp->
141c0 66 69 6c 65 6e 61 6d 65 3b 20 2a 7a 3b 20 7a 2b  filename; *z; z+
141d0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
141e0 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29 7b 0a  if( *z=='\\' ){.
141f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 28                *(
14200 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 5c 27 3b 0a  zBuf++) = '\\';.
14210 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
14220 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66            *(zBuf
14230 2b 2b 29 20 3d 20 2a 7a 3b 0a 20 20 20 20 20 20  ++) = *z;.      
14240 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14250 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27 3b  *(zBuf++) = '"';
14260 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75  .          *(zBu
14270 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20  f++) = '\n';.   
14280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
14290 66 28 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65  f( psp->declline
142a0 6e 6f 73 6c 6f 74 20 26 26 20 70 73 70 2d 3e 64  noslot && psp->d
142b0 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d  ecllinenoslot[0]
142c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
142d0 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f   psp->decllineno
142e0 73 6c 6f 74 5b 30 5d 20 3d 20 70 73 70 2d 3e 74  slot[0] = psp->t
142f0 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20  okenlineno;.    
14300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
14310 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4e 65 77 2c  mcpy(zBuf, zNew,
14320 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   nNew);.        
14330 7a 42 75 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20  zBuf += nNew;.  
14340 20 20 20 20 20 20 2a 7a 42 75 66 20 3d 20 30 3b        *zBuf = 0;
14350 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
14360 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
14370 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
14380 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14390 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
143a0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
143b0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
143c0 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c          "Illegal
143d0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 25 25 25   argument to %%%
143e0 73 3a 20 25 73 22 2c 70 73 70 2d 3e 64 65 63 6c  s: %s",psp->decl
143f0 6b 65 79 77 6f 72 64 2c 78 29 3b 0a 20 20 20 20  keyword,x);.    
14400 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
14410 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
14420 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
14430 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
14440 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
14450 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
14460 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c   WAITING_FOR_FAL
14470 4c 42 41 43 4b 5f 49 44 3a 0a 20 20 20 20 20 20  LBACK_ID:.      
14480 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b  if( x[0]=='.' ){
14490 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
144a0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
144b0 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
144c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
144d0 21 49 53 55 50 50 45 52 28 78 5b 30 5d 29 20 29  !ISUPPER(x[0]) )
144e0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
144f0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
14500 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  , psp->tokenline
14510 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25  no,.          "%
14520 25 66 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65  %fallback argume
14530 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64  nt \"%s\" should
14540 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29   be a token", x)
14550 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
14560 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
14570 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14580 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
14590 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  p = Symbol_new(x
145a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
145b0 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20  sp->fallback==0 
145c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
145d0 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 73 70 3b  ->fallback = sp;
145e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
145f0 66 28 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20  f( sp->fallback 
14600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
14610 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
14620 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ame, psp->tokenl
14630 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
14640 20 20 20 22 4d 6f 72 65 20 74 68 61 6e 20 6f 6e     "More than on
14650 65 20 66 61 6c 6c 62 61 63 6b 20 61 73 73 69 67  e fallback assig
14660 6e 65 64 20 74 6f 20 74 6f 6b 65 6e 20 25 73 22  ned to token %s"
14670 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , x);.          
14680 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
14690 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
146a0 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 66 61            sp->fa
146b0 6c 6c 62 61 63 6b 20 3d 20 70 73 70 2d 3e 66 61  llback = psp->fa
146c0 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  llback;.        
146d0 20 20 70 73 70 2d 3e 67 70 2d 3e 68 61 73 5f 66    psp->gp->has_f
146e0 61 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  allback = 1;.   
146f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14700 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14710 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
14720 5f 57 49 4c 44 43 41 52 44 5f 49 44 3a 0a 20 20  _WILDCARD_ID:.  
14730 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e      if( x[0]=='.
14740 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
14750 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
14760 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
14770 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  LE;.      }else 
14780 69 66 28 20 21 49 53 55 50 50 45 52 28 78 5b 30  if( !ISUPPER(x[0
14790 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]) ){.        Er
147a0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
147b0 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e  name, psp->token
147c0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
147d0 20 20 22 25 25 77 69 6c 64 63 61 72 64 20 61 72    "%%wildcard ar
147e0 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68  gument \"%s\" sh
147f0 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22  ould be a token"
14800 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  , x);.        ps
14810 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
14820 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14830 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
14840 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e  l *sp = Symbol_n
14850 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69  ew(x);.        i
14860 66 28 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64  f( psp->gp->wild
14870 63 61 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  card==0 ){.     
14880 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 77 69       psp->gp->wi
14890 6c 64 63 61 72 64 20 3d 20 73 70 3b 0a 20 20 20  ldcard = sp;.   
148a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
148b0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
148c0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73  sp->filename, ps
148d0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
148e0 20 20 20 20 20 20 20 20 20 20 20 20 22 45 78 74              "Ext
148f0 72 61 20 77 69 6c 64 63 61 72 64 20 74 6f 20 74  ra wildcard to t
14900 6f 6b 65 6e 3a 20 25 73 22 2c 20 78 29 3b 0a 20  oken: %s", x);. 
14910 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
14920 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
14930 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14940 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
14950 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c  e WAITING_FOR_CL
14960 41 53 53 5f 49 44 3a 0a 20 20 20 20 20 20 69 66  ASS_ID:.      if
14970 28 20 21 49 53 4c 4f 57 45 52 28 78 5b 30 5d 29  ( !ISLOWER(x[0])
14980 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
14990 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
149a0 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
149b0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
149c0 22 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 6d  "%%token_class m
149d0 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20  ust be followed 
149e0 62 79 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  by an identifier
149f0 3a 20 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  : ", x);.       
14a00 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
14a10 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
14a20 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
14a30 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a  TER_DECL_ERROR;.
14a40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53       }else if( S
14a50 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 20 29 7b  ymbol_find(x) ){
14a60 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
14a70 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
14a80 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
14a90 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 79  o,.          "Sy
14aa0 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 61 6c 72 65  mbol \"%s\" alre
14ab0 61 64 79 20 75 73 65 64 22 2c 20 78 29 3b 0a 20  ady used", x);. 
14ac0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
14ad0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
14ae0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
14af0 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
14b00 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
14b10 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  e{.        psp->
14b20 74 6b 63 6c 61 73 73 20 3d 20 53 79 6d 62 6f 6c  tkclass = Symbol
14b30 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
14b40 20 70 73 70 2d 3e 74 6b 63 6c 61 73 73 2d 3e 74   psp->tkclass->t
14b50 79 70 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49  ype = MULTITERMI
14b60 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 70 73 70  NAL;.        psp
14b70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
14b80 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45  G_FOR_CLASS_TOKE
14b90 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  N;.      }.     
14ba0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
14bb0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41   WAITING_FOR_CLA
14bc0 53 53 5f 54 4f 4b 45 4e 3a 0a 20 20 20 20 20 20  SS_TOKEN:.      
14bd0 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b  if( x[0]=='.' ){
14be0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
14bf0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
14c00 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
14c10 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
14c20 49 53 55 50 50 45 52 28 78 5b 30 5d 29 20 7c 7c  ISUPPER(x[0]) ||
14c30 20 28 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20   ((x[0]=='|' || 
14c40 78 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20 49 53  x[0]=='/') && IS
14c50 55 50 50 45 52 28 78 5b 31 5d 29 29 20 29 7b 0a  UPPER(x[1])) ){.
14c60 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
14c70 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70  ymbol *msp = psp
14c80 2d 3e 74 6b 63 6c 61 73 73 3b 0a 20 20 20 20 20  ->tkclass;.     
14c90 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b     msp->nsubsym+
14ca0 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e  +;.        msp->
14cb0 73 75 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74  subsym = (struct
14cc0 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c   symbol **) real
14cd0 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c  loc(msp->subsym,
14ce0 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f  .          sizeo
14cf0 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a  f(struct symbol*
14d00 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b  )*msp->nsubsym);
14d10 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 49 53  .        if( !IS
14d20 55 50 50 45 52 28 78 5b 30 5d 29 20 29 20 78 2b  UPPER(x[0]) ) x+
14d30 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e  +;.        msp->
14d40 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62  subsym[msp->nsub
14d50 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f  sym-1] = Symbol_
14d60 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 65  new(x);.      }e
14d70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
14d80 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
14d90 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ame, psp->tokenl
14da0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
14db0 20 22 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20   "%%token_class 
14dc0 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20  argument \"%s\" 
14dd0 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65  should be a toke
14de0 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  n", x);.        
14df0 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
14e00 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
14e10 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
14e20 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
14e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
14e40 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53  ak;.    case RES
14e50 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
14e60 52 52 4f 52 3a 0a 2f 2a 20 20 20 20 20 20 69 66  RROR:./*      if
14e70 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73  ( x[0]=='.' ) ps
14e80 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
14e90 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
14ea0 55 4c 45 3b 0a 2a 2a 20 20 20 20 20 20 62 72 65  ULE;.**      bre
14eb0 61 6b 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ak; */.    case 
14ec0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
14ed0 4c 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 69  L_ERROR:.      i
14ee0 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70  f( x[0]=='.' ) p
14ef0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
14f00 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
14f10 52 55 4c 45 3b 0a 20 20 20 20 20 20 69 66 28 20  RULE;.      if( 
14f20 78 5b 30 5d 3d 3d 27 25 27 20 29 20 70 73 70 2d  x[0]=='%' ) psp-
14f30 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
14f40 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52  _FOR_DECL_KEYWOR
14f50 44 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  D;.      break;.
14f60 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 74 68    }.}../* Run th
14f70 65 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6f  e preprocessor o
14f80 76 65 72 20 74 68 65 20 69 6e 70 75 74 20 66 69  ver the input fi
14f90 6c 65 20 74 65 78 74 2e 20 20 54 68 65 20 67 6c  le text.  The gl
14fa0 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 0a 2a  obal variables.*
14fb0 2a 20 61 7a 44 65 66 69 6e 65 5b 30 5d 20 74 68  * azDefine[0] th
14fc0 72 6f 75 67 68 20 61 7a 44 65 66 69 6e 65 5b 6e  rough azDefine[n
14fd0 44 65 66 69 6e 65 2d 31 5d 20 63 6f 6e 74 61 69  Define-1] contai
14fe0 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ns the names of 
14ff0 61 6c 6c 20 64 65 66 69 6e 65 64 0a 2a 2a 20 6d  all defined.** m
15000 61 63 72 6f 73 2e 20 20 54 68 69 73 20 72 6f 75  acros.  This rou
15010 74 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20 22  tine looks for "
15020 25 69 66 64 65 66 22 20 61 6e 64 20 22 25 69 66  %ifdef" and "%if
15030 6e 64 65 66 22 20 61 6e 64 20 22 25 65 6e 64 69  ndef" and "%endi
15040 66 22 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d 65 6e  f" and.** commen
15050 74 73 20 74 68 65 6d 20 6f 75 74 2e 20 20 54 65  ts them out.  Te
15060 78 74 20 69 6e 20 62 65 74 77 65 65 6e 20 69 73  xt in between is
15070 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20   also commented 
15080 6f 75 74 20 61 73 20 61 70 70 72 6f 70 72 69 61  out as appropria
15090 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
150a0 69 64 20 70 72 65 70 72 6f 63 65 73 73 5f 69 6e  id preprocess_in
150b0 70 75 74 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  put(char *z){.  
150c0 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a  int i, j, k, n;.
150d0 20 20 69 6e 74 20 65 78 63 6c 75 64 65 20 3d 20    int exclude = 
150e0 30 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d  0;.  int start =
150f0 20 30 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f   0;.  int lineno
15100 20 3d 20 31 3b 0a 20 20 69 6e 74 20 73 74 61 72   = 1;.  int star
15110 74 5f 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20  t_lineno = 1;.  
15120 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
15130 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
15140 5d 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  ]=='\n' ) lineno
15150 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  ++;.    if( z[i]
15160 21 3d 27 25 27 20 7c 7c 20 28 69 3e 30 20 26 26  !='%' || (i>0 &&
15170 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29 20 29   z[i-1]!='\n') )
15180 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
15190 66 28 20 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d  f( strncmp(&z[i]
151a0 2c 22 25 65 6e 64 69 66 22 2c 36 29 3d 3d 30 20  ,"%endif",6)==0 
151b0 26 26 20 49 53 53 50 41 43 45 28 7a 5b 69 2b 36  && ISSPACE(z[i+6
151c0 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ]) ){.      if( 
151d0 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20  exclude ){.     
151e0 20 20 20 65 78 63 6c 75 64 65 2d 2d 3b 0a 20 20     exclude--;.  
151f0 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64        if( exclud
15200 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
15210 20 20 66 6f 72 28 6a 3d 73 74 61 72 74 3b 20 6a    for(j=start; j
15220 3c 69 3b 20 6a 2b 2b 29 20 69 66 28 20 7a 5b 6a  <i; j++) if( z[j
15230 5d 21 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d 20 3d  ]!='\n' ) z[j] =
15240 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   ' ';.        }.
15250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
15260 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a  r(j=i; z[j] && z
15270 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20  [j]!='\n'; j++) 
15280 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  z[j] = ' ';.    
15290 7d 65 6c 73 65 20 69 66 28 20 28 73 74 72 6e 63  }else if( (strnc
152a0 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 64 65 66  mp(&z[i],"%ifdef
152b0 22 2c 36 29 3d 3d 30 20 26 26 20 49 53 53 50 41  ",6)==0 && ISSPA
152c0 43 45 28 7a 5b 69 2b 36 5d 29 29 0a 20 20 20 20  CE(z[i+6])).    
152d0 20 20 20 20 20 20 7c 7c 20 28 73 74 72 6e 63 6d        || (strncm
152e0 70 28 26 7a 5b 69 5d 2c 22 25 69 66 6e 64 65 66  p(&z[i],"%ifndef
152f0 22 2c 37 29 3d 3d 30 20 26 26 20 49 53 53 50 41  ",7)==0 && ISSPA
15300 43 45 28 7a 5b 69 2b 37 5d 29 29 20 29 7b 0a 20  CE(z[i+7])) ){. 
15310 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65       if( exclude
15320 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c   ){.        excl
15330 75 64 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  ude++;.      }el
15340 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
15350 6a 3d 69 2b 37 3b 20 49 53 53 50 41 43 45 28 7a  j=i+7; ISSPACE(z
15360 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20  [j]); j++){}.   
15370 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b       for(n=0; z[
15380 6a 2b 6e 5d 20 26 26 20 21 49 53 53 50 41 43 45  j+n] && !ISSPACE
15390 28 7a 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d  (z[j+n]); n++){}
153a0 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65  .        exclude
153b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 1;.        fo
153c0 72 28 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69 6e 65  r(k=0; k<nDefine
153d0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
153e0 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a    if( strncmp(az
153f0 44 65 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c  Define[k],&z[j],
15400 6e 29 3d 3d 30 20 26 26 20 6c 65 6d 6f 6e 53 74  n)==0 && lemonSt
15410 72 6c 65 6e 28 61 7a 44 65 66 69 6e 65 5b 6b 5d  rlen(azDefine[k]
15420 29 3d 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  )==n ){.        
15430 20 20 20 20 65 78 63 6c 75 64 65 20 3d 20 30 3b      exclude = 0;
15440 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
15450 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
15460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15470 20 20 69 66 28 20 7a 5b 69 2b 33 5d 3d 3d 27 6e    if( z[i+3]=='n
15480 27 20 29 20 65 78 63 6c 75 64 65 20 3d 20 21 65  ' ) exclude = !e
15490 78 63 6c 75 64 65 3b 0a 20 20 20 20 20 20 20 20  xclude;.        
154a0 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20  if( exclude ){. 
154b0 20 20 20 20 20 20 20 20 20 73 74 61 72 74 20 3d           start =
154c0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74   i;.          st
154d0 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e  art_lineno = lin
154e0 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eno;.        }. 
154f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
15500 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b  (j=i; z[j] && z[
15510 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a  j]!='\n'; j++) z
15520 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d  [j] = ' ';.    }
15530 0a 20 20 7d 0a 20 20 69 66 28 20 65 78 63 6c 75  .  }.  if( exclu
15540 64 65 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  de ){.    fprint
15550 66 28 73 74 64 65 72 72 2c 22 75 6e 74 65 72 6d  f(stderr,"unterm
15560 69 6e 61 74 65 64 20 25 25 69 66 64 65 66 20 73  inated %%ifdef s
15570 74 61 72 74 69 6e 67 20 6f 6e 20 6c 69 6e 65 20  tarting on line 
15580 25 64 5c 6e 22 2c 20 73 74 61 72 74 5f 6c 69 6e  %d\n", start_lin
15590 65 6e 6f 29 3b 0a 20 20 20 20 65 78 69 74 28 31  eno);.    exit(1
155a0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20  );.  }.}../* In 
155b0 73 70 69 74 65 20 6f 66 20 69 74 73 20 6e 61 6d  spite of its nam
155c0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
155d0 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61   is really a sca
155e0 6e 6e 65 72 2e 20 20 49 74 20 72 65 61 64 0a 2a  nner.  It read.*
155f0 2a 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20  * in the entire 
15600 69 6e 70 75 74 20 66 69 6c 65 20 28 61 6c 6c 20  input file (all 
15610 61 74 20 6f 6e 63 65 29 20 74 68 65 6e 20 74 6f  at once) then to
15620 6b 65 6e 69 7a 65 73 20 69 74 2e 20 20 45 61 63  kenizes it.  Eac
15630 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69 73 20 70 61  h.** token is pa
15640 73 73 65 64 20 74 6f 20 74 68 65 20 66 75 6e 63  ssed to the func
15650 74 69 6f 6e 20 22 70 61 72 73 65 6f 6e 65 74 6f  tion "parseoneto
15660 6b 65 6e 22 20 77 68 69 63 68 20 62 75 69 6c 64  ken" which build
15670 73 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 61 70 70  s all.** the app
15680 72 6f 70 72 69 61 74 65 20 64 61 74 61 20 73 74  ropriate data st
15690 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
156a0 67 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63  global state vec
156b0 74 6f 72 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69  tor "gp"..*/.voi
156c0 64 20 50 61 72 73 65 28 73 74 72 75 63 74 20 6c  d Parse(struct l
156d0 65 6d 6f 6e 20 2a 67 70 29 0a 7b 0a 20 20 73 74  emon *gp).{.  st
156e0 72 75 63 74 20 70 73 74 61 74 65 20 70 73 3b 0a  ruct pstate ps;.
156f0 20 20 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63 68    FILE *fp;.  ch
15700 61 72 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20 75  ar *filebuf;.  u
15710 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 69 6c 65  nsigned int file
15720 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65  size;.  int line
15730 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63  no;.  int c;.  c
15740 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70  har *cp, *nextcp
15750 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e  ;.  int startlin
15760 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65 74  e = 0;..  memset
15770 28 26 70 73 2c 20 27 5c 30 27 2c 20 73 69 7a 65  (&ps, '\0', size
15780 6f 66 28 70 73 29 29 3b 0a 20 20 70 73 2e 67 70  of(ps));.  ps.gp
15790 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65   = gp;.  ps.file
157a0 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e  name = gp->filen
157b0 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63  ame;.  ps.errorc
157c0 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61  nt = 0;.  ps.sta
157d0 74 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b  te = INITIALIZE;
157e0 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
157f0 72 65 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75  reading the inpu
15800 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d  t file */.  fp =
15810 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61   fopen(ps.filena
15820 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20  me,"rb");.  if( 
15830 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72  fp==0 ){.    Err
15840 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
15850 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20  e,0,"Can't open 
15860 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65  this file for re
15870 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70  ading.");.    gp
15880 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
15890 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
158a0 66 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20  fseek(fp,0,2);. 
158b0 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c   filesize = ftel
158c0 6c 28 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28  l(fp);.  rewind(
158d0 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d  fp);.  filebuf =
158e0 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
158f0 20 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20   filesize+1 );. 
15900 20 69 66 28 20 66 69 6c 65 73 69 7a 65 3e 31 30   if( filesize>10
15910 30 30 30 30 30 30 30 20 7c 7c 20 66 69 6c 65 62  0000000 || fileb
15920 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72  uf==0 ){.    Err
15930 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
15940 65 2c 30 2c 22 49 6e 70 75 74 20 66 69 6c 65 20  e,0,"Input file 
15950 74 6f 6f 20 6c 61 72 67 65 2e 22 29 3b 0a 20 20  too large.");.  
15960 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b    gp->errorcnt++
15970 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29  ;.    fclose(fp)
15980 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
15990 7d 0a 20 20 69 66 28 20 66 72 65 61 64 28 66 69  }.  if( fread(fi
159a0 6c 65 62 75 66 2c 31 2c 66 69 6c 65 73 69 7a 65  lebuf,1,filesize
159b0 2c 66 70 29 21 3d 66 69 6c 65 73 69 7a 65 20 29  ,fp)!=filesize )
159c0 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70  {.    ErrorMsg(p
159d0 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61  s.filename,0,"Ca
159e0 6e 27 74 20 72 65 61 64 20 69 6e 20 61 6c 6c 20  n't read in all 
159f0 25 64 20 62 79 74 65 73 20 6f 66 20 74 68 69 73  %d bytes of this
15a00 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66   file.",.      f
15a10 69 6c 65 73 69 7a 65 29 3b 0a 20 20 20 20 66 72  ilesize);.    fr
15a20 65 65 28 66 69 6c 65 62 75 66 29 3b 0a 20 20 20  ee(filebuf);.   
15a30 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b   gp->errorcnt++;
15a40 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b  .    fclose(fp);
15a50 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
15a60 0a 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20  .  fclose(fp);. 
15a70 20 66 69 6c 65 62 75 66 5b 66 69 6c 65 73 69 7a   filebuf[filesiz
15a80 65 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61  e] = 0;..  /* Ma
15a90 6b 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 70 61  ke an initial pa
15aa0 73 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  ss through the f
15ab0 69 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 25 69  ile to handle %i
15ac0 66 64 65 66 20 61 6e 64 20 25 69 66 6e 64 65 66  fdef and %ifndef
15ad0 20 2a 2f 0a 20 20 70 72 65 70 72 6f 63 65 73 73   */.  preprocess
15ae0 5f 69 6e 70 75 74 28 66 69 6c 65 62 75 66 29 3b  _input(filebuf);
15af0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e 20  ..  /* Now scan 
15b00 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
15b10 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
15b20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f  lineno = 1;.  fo
15b30 72 28 63 70 3d 66 69 6c 65 62 75 66 3b 20 28 63  r(cp=filebuf; (c
15b40 3d 20 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20 20  = *cp)!=0; ){.  
15b50 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
15b60 6c 69 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20 20  lineno++;       
15b70 20 20 20 20 20 20 20 2f 2a 20 4b 65 65 70 20 74         /* Keep t
15b80 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65  rack of the line
15b90 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69   number */.    i
15ba0 66 28 20 49 53 53 50 41 43 45 28 63 29 20 29 7b  f( ISSPACE(c) ){
15bb0 20 63 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b   cp++; continue;
15bc0 20 7d 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c 20   }  /* Skip all 
15bd0 77 68 69 74 65 20 73 70 61 63 65 20 2a 2f 0a 20  white space */. 
15be0 20 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26     if( c=='/' &&
15bf0 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20   cp[1]=='/' ){  
15c00 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20          /* Skip 
15c10 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e  C++ style commen
15c20 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d  ts */.      cp+=
15c30 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  2;.      while( 
15c40 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63  (c= *cp)!=0 && c
15c50 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20  !='\n' ) cp++;. 
15c60 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
15c70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d     }.    if( c==
15c80 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a  '/' && cp[1]=='*
15c90 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a  ' ){          /*
15ca0 20 53 6b 69 70 20 43 20 73 74 79 6c 65 20 63 6f   Skip C style co
15cb0 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  mments */.      
15cc0 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69  cp+=2;.      whi
15cd0 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
15ce0 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63 70  && (c!='/' || cp
15cf0 5b 2d 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20 20  [-1]!='*') ){.  
15d00 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
15d10 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
15d20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
15d30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 20    }.      if( c 
15d40 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f  ) cp++;.      co
15d50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
15d60 20 20 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74 20    ps.tokenstart 
15d70 3d 20 63 70 3b 20 20 20 20 20 20 20 20 20 20 20  = cp;           
15d80 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65       /* Mark the
15d90 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
15da0 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70  e token */.    p
15db0 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20  s.tokenlineno = 
15dc0 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20  lineno;         
15dd0 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20    /* Linenumber 
15de0 6f 6e 20 77 68 69 63 68 20 74 6f 6b 65 6e 20 62  on which token b
15df0 65 67 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66 28  egins */.    if(
15e00 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 20   c=='\"' ){     
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 2f 2a 20 53 74 72 69 6e 67 20 6c 69 74 65 72 61  /* String litera
15e30 6c 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b  ls */.      cp++
15e40 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  ;.      while( (
15e50 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21  c= *cp)!=0 && c!
15e60 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\"' ){.       
15e70 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
15e80 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
15e90 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20   cp++;.      }. 
15ea0 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
15eb0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
15ec0 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73 74  g(ps.filename,st
15ed0 61 72 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e 67  artline,."String
15ee0 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69   starting on thi
15ef0 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65  s line is not te
15f00 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20  rminated before 
15f10 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
15f20 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ile.");.        
15f30 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  ps.errorcnt++;. 
15f40 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20         nextcp = 
15f50 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  cp;.      }else{
15f60 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20  .        nextcp 
15f70 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a  = cp+1;.      }.
15f80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
15f90 3d 27 7b 27 20 29 7b 20 20 20 20 20 20 20 20 20  ='{' ){         
15fa0 20 20 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b        /* A block
15fb0 20 6f 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20   of C code */.  
15fc0 20 20 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a 20      int level;. 
15fd0 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
15fe0 20 66 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28 63   for(level=1; (c
15ff0 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 6c 65  = *cp)!=0 && (le
16000 76 65 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27 29  vel>1 || c!='}')
16010 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; cp++){.       
16020 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
16030 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
16040 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27   else if( c=='{'
16050 20 29 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20   ) level++;.    
16060 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d      else if( c==
16070 27 7d 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20  '}' ) level--;. 
16080 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20         else if( 
16090 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d  c=='/' && cp[1]=
160a0 3d 27 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70  ='*' ){  /* Skip
160b0 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   comments */.   
160c0 20 20 20 20 20 20 20 69 6e 74 20 70 72 65 76 63         int prevc
160d0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 70 20 3d  ;.          cp =
160e0 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20   &cp[2];.       
160f0 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20     prevc = 0;.  
16100 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
16110 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63  c= *cp)!=0 && (c
16120 21 3d 27 2f 27 20 7c 7c 20 70 72 65 76 63 21 3d  !='/' || prevc!=
16130 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '*') ){.        
16140 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
16150 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
16160 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20          prevc = 
16170 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  c;.            c
16180 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  p++;.          }
16190 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
161a0 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b  f( c=='/' && cp[
161b0 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20 53  1]=='/' ){  /* S
161c0 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f  kip C++ style co
161d0 6d 6d 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20 20  mments too */.  
161e0 20 20 20 20 20 20 20 20 63 70 20 3d 20 26 63 70          cp = &cp
161f0 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 77  [2];.          w
16200 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
16210 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63  0 && c!='\n' ) c
16220 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  p++;.          i
16230 66 28 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  f( c ) lineno++;
16240 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
16250 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d  f( c=='\'' || c=
16260 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20 53  ='\"' ){    /* S
16270 74 72 69 6e 67 20 61 20 63 68 61 72 61 63 74 65  tring a characte
16280 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20  r literals */.  
16290 20 20 20 20 20 20 20 20 69 6e 74 20 73 74 61 72          int star
162a0 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a 20 20  tchar, prevc;.  
162b0 20 20 20 20 20 20 20 20 73 74 61 72 74 63 68 61          startcha
162c0 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  r = c;.         
162d0 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20   prevc = 0;.    
162e0 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b 20        for(cp++; 
162f0 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  (c= *cp)!=0 && (
16300 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c 7c 20  c!=startchar || 
16310 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63 70  prevc=='\\'); cp
16320 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
16330 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
16340 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
16350 20 20 20 20 20 69 66 28 20 70 72 65 76 63 3d 3d       if( prevc==
16360 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d 20 30  '\\' ) prevc = 0
16370 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ;.            el
16380 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
16390 70 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20  prevc = c;.     
163a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
163b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
163c0 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
163d0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66     ErrorMsg(ps.f
163e0 69 6c 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b 65 6e  ilename,ps.token
163f0 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64 65 20  lineno,."C code 
16400 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73  starting on this
16410 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72   line is not ter
16420 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74  minated before t
16430 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
16440 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  le.");.        p
16450 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  s.errorcnt++;.  
16460 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
16470 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  p;.      }else{.
16480 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d          nextcp =
16490 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20   cp+1;.      }. 
164a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41     }else if( ISA
164b0 4c 4e 55 4d 28 63 29 20 29 7b 20 20 20 20 20 20  LNUM(c) ){      
164c0 20 20 20 20 2f 2a 20 49 64 65 6e 74 69 66 69 65      /* Identifie
164d0 72 73 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  rs */.      whil
164e0 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  e( (c= *cp)!=0 &
164f0 26 20 28 49 53 41 4c 4e 55 4d 28 63 29 20 7c 7c  & (ISALNUM(c) ||
16500 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b   c=='_') ) cp++;
16510 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20  .      nextcp = 
16520 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  cp;.    }else if
16530 28 20 63 3d 3d 27 3a 27 20 26 26 20 63 70 5b 31  ( c==':' && cp[1
16540 5d 3d 3d 27 3a 27 20 26 26 20 63 70 5b 32 5d 3d  ]==':' && cp[2]=
16550 3d 27 3d 27 20 29 7b 20 2f 2a 20 54 68 65 20 6f  ='=' ){ /* The o
16560 70 65 72 61 74 6f 72 20 22 3a 3a 3d 22 20 2a 2f  perator "::=" */
16570 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 33 3b 0a  .      cp += 3;.
16580 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
16590 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
165a0 20 28 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27   (c=='/' || c=='
165b0 7c 27 29 20 26 26 20 49 53 41 4c 50 48 41 28 63  |') && ISALPHA(c
165c0 70 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 63  p[1]) ){.      c
165d0 70 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68  p += 2;.      wh
165e0 69 6c 65 28 20 28 63 20 3d 20 2a 63 70 29 21 3d  ile( (c = *cp)!=
165f0 30 20 26 26 20 28 49 53 41 4c 4e 55 4d 28 63 29  0 && (ISALNUM(c)
16600 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70   || c=='_') ) cp
16610 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70  ++;.      nextcp
16620 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65   = cp;.    }else
16630 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
16640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
16650 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20 63 68 61  l other (one cha
16660 72 61 63 74 65 72 29 20 6f 70 65 72 61 74 6f 72  racter) operator
16670 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b  s */.      cp++;
16680 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20  .      nextcp = 
16690 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 20  cp;.    }.    c 
166a0 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d  = *cp;.    *cp =
166b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
166c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
166d0 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
166e0 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 61   token */.    pa
166f0 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26 70 73 29  rseonetoken(&ps)
16700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16710 20 50 61 72 73 65 20 74 68 65 20 74 6f 6b 65 6e   Parse the token
16720 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d 20 28 63   */.    *cp = (c
16730 68 61 72 29 63 3b 20 20 20 20 20 20 20 20 20 20  har)c;          
16740 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 6f          /* Resto
16750 72 65 20 74 68 65 20 62 75 66 66 65 72 20 2a 2f  re the buffer */
16760 0a 20 20 20 20 63 70 20 3d 20 6e 65 78 74 63 70  .    cp = nextcp
16770 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 66 69 6c  ;.  }.  free(fil
16780 65 62 75 66 29 3b 20 20 20 20 20 20 20 20 20 20  ebuf);          
16790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c            /* Rel
167a0 65 61 73 65 20 74 68 65 20 62 75 66 66 65 72 20  ease the buffer 
167b0 61 66 74 65 72 20 70 61 72 73 69 6e 67 20 2a 2f  after parsing */
167c0 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d 20 70 73  .  gp->rule = ps
167d0 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20 20 67 70  .firstrule;.  gp
167e0 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20 70 73 2e  ->errorcnt = ps.
167f0 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a  errorcnt;.}./***
16800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16810 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
16820 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 63 22  e file "plink.c"
16830 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
16840 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
16850 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e  utines processin
16860 67 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  g configuration 
16870 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61  follow-set propa
16880 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a 20  gation links.** 
16890 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  in the LEMON par
168a0 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
168b0 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
168c0 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72 65  plink *plink_fre
168d0 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20 41  elist = 0;../* A
168e0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 6c  llocate a new pl
168f0 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c  ink */.struct pl
16900 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28 29  ink *Plink_new()
16910 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  {.  struct plink
16920 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 0a 20 20 69 66   *newlink;..  if
16930 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  ( plink_freelist
16940 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
16950 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20  ;.    int amt = 
16960 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66  100;.    plink_f
16970 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63  reelist = (struc
16980 74 20 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c 6f 63  t plink *)calloc
16990 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74  ( amt, sizeof(st
169a0 72 75 63 74 20 70 6c 69 6e 6b 29 20 29 3b 0a 20  ruct plink) );. 
169b0 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65     if( plink_fre
169c0 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
169d0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
169e0 2c 0a 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20  ,.      "Unable 
169f0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
16a00 72 79 20 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c  ry for a new fol
16a10 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74  low-set propagat
16a20 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20  ion link.\n");. 
16a30 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
16a40 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
16a50 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70   i<amt-1; i++) p
16a60 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d  link_freelist[i]
16a70 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66  .next = &plink_f
16a80 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20  reelist[i+1];.  
16a90 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74    plink_freelist
16aa0 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30  [amt-1].next = 0
16ab0 3b 0a 20 20 7d 0a 20 20 6e 65 77 6c 69 6e 6b 20  ;.  }.  newlink 
16ac0 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  = plink_freelist
16ad0 3b 0a 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  ;.  plink_freeli
16ae0 73 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  st = plink_freel
16af0 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74  ist->next;.  ret
16b00 75 72 6e 20 6e 65 77 6c 69 6e 6b 3b 0a 7d 0a 0a  urn newlink;.}..
16b10 2f 2a 20 41 64 64 20 61 20 70 6c 69 6e 6b 20 74  /* Add a plink t
16b20 6f 20 61 20 70 6c 69 6e 6b 20 6c 69 73 74 20 2a  o a plink list *
16b30 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64  /.void Plink_add
16b40 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a  (struct plink **
16b50 70 6c 70 70 2c 20 73 74 72 75 63 74 20 63 6f 6e  plpp, struct con
16b60 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73 74  fig *cfp).{.  st
16b70 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 6c  ruct plink *newl
16b80 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b 20 3d  ink;.  newlink =
16b90 20 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b 0a 20 20   Plink_new();.  
16ba0 6e 65 77 6c 69 6e 6b 2d 3e 6e 65 78 74 20 3d 20  newlink->next = 
16bb0 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70 70 20 3d  *plpp;.  *plpp =
16bc0 20 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c   newlink;.  newl
16bd0 69 6e 6b 2d 3e 63 66 70 20 3d 20 63 66 70 3b 0a  ink->cfp = cfp;.
16be0 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66 65 72 20 65  }../* Transfer e
16bf0 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68  very plink on th
16c00 65 20 6c 69 73 74 20 22 66 72 6f 6d 22 20 74 6f  e list "from" to
16c10 20 74 68 65 20 6c 69 73 74 20 22 74 6f 22 20 2a   the list "to" *
16c20 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70  /.void Plink_cop
16c30 79 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  y(struct plink *
16c40 2a 74 6f 2c 20 73 74 72 75 63 74 20 70 6c 69 6e  *to, struct plin
16c50 6b 20 2a 66 72 6f 6d 29 0a 7b 0a 20 20 73 74 72  k *from).{.  str
16c60 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70  uct plink *nextp
16c70 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66 72 6f 6d  l;.  while( from
16c80 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d   ){.    nextpl =
16c90 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a 20 20 20   from->next;.   
16ca0 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d 20 2a 74   from->next = *t
16cb0 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20 66 72 6f  o;.    *to = fro
16cc0 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d 20 6e 65  m;.    from = ne
16cd0 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  xtpl;.  }.}../* 
16ce0 44 65 6c 65 74 65 20 65 76 65 72 79 20 70 6c 69  Delete every pli
16cf0 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a  nk on the list *
16d00 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c  /.void Plink_del
16d10 65 74 65 28 73 74 72 75 63 74 20 70 6c 69 6e 6b  ete(struct plink
16d20 20 2a 70 6c 70 29 0a 7b 0a 20 20 73 74 72 75 63   *plp).{.  struc
16d30 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b  t plink *nextpl;
16d40 0a 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20 29  ..  while( plp )
16d50 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d 20 70  {.    nextpl = p
16d60 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 70 6c  lp->next;.    pl
16d70 70 2d 3e 6e 65 78 74 20 3d 20 70 6c 69 6e 6b 5f  p->next = plink_
16d80 66 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 6c  freelist;.    pl
16d90 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70  ink_freelist = p
16da0 6c 70 3b 0a 20 20 20 20 70 6c 70 20 3d 20 6e 65  lp;.    plp = ne
16db0 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a  xtpl;.  }.}./***
16dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16dd0 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
16de0 6c 65 20 22 72 65 70 6f 72 74 2e 63 22 20 2a 2a  le "report.c" **
16df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16e00 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
16e10 50 72 6f 63 65 64 75 72 65 73 20 66 6f 72 20 67  Procedures for g
16e20 65 6e 65 72 61 74 69 6e 67 20 72 65 70 6f 72 74  enerating report
16e30 73 20 61 6e 64 20 74 61 62 6c 65 73 20 69 6e 20  s and tables in 
16e40 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
16e50 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
16e60 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 66 69  /* Generate a fi
16e70 6c 65 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20  lename with the 
16e80 67 69 76 65 6e 20 73 75 66 66 69 78 2e 20 20 53  given suffix.  S
16e90 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
16ea0 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65 73 20 66  .** name comes f
16eb0 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  rom malloc() and
16ec0 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
16ed0 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
16ee0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52   function..*/.PR
16ef0 49 56 41 54 45 20 63 68 61 72 20 2a 66 69 6c 65  IVATE char *file
16f00 5f 6d 61 6b 65 6e 61 6d 65 28 73 74 72 75 63 74  _makename(struct
16f10 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 6f   lemon *lemp, co
16f20 6e 73 74 20 63 68 61 72 20 2a 73 75 66 66 69 78  nst char *suffix
16f30 29 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65  ).{.  char *name
16f40 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20  ;.  char *cp;.. 
16f50 20 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 6d   name = (char*)m
16f60 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
16f70 65 6e 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  en(lemp->filenam
16f80 65 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  e) + lemonStrlen
16f90 28 73 75 66 66 69 78 29 20 2b 20 35 20 29 3b 0a  (suffix) + 5 );.
16fa0 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b    if( name==0 ){
16fb0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
16fc0 65 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63  err,"Can't alloc
16fd0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20  ate space for a 
16fe0 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20  filename.\n");. 
16ff0 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
17000 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 6e    lemon_strcpy(n
17010 61 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  ame,lemp->filena
17020 6d 65 29 3b 0a 20 20 63 70 20 3d 20 73 74 72 72  me);.  cp = strr
17030 63 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20  chr(name,'.');. 
17040 20 69 66 28 20 63 70 20 29 20 2a 63 70 20 3d 20   if( cp ) *cp = 
17050 30 3b 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 61  0;.  lemon_strca
17060 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b 0a  t(name,suffix);.
17070 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d    return name;.}
17080 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  ../* Open a file
17090 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62 61 73   with a name bas
170a0 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f  ed on the name o
170b0 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
170c0 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20 61 20  ,.** but with a 
170d0 64 69 66 66 65 72 65 6e 74 20 28 73 70 65 63 69  different (speci
170e0 66 69 65 64 29 20 73 75 66 66 69 78 2c 20 61 6e  fied) suffix, an
170f0 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
17100 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 72  er.** to the str
17110 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20 46  eam */.PRIVATE F
17120 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28 0a  ILE *file_open(.
17130 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a    struct lemon *
17140 6c 65 6d 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  lemp,.  const ch
17150 61 72 20 2a 73 75 66 66 69 78 2c 0a 20 20 63 6f  ar *suffix,.  co
17160 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 0a 29  nst char *mode.)
17170 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20  {.  FILE *fp;.. 
17180 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61   if( lemp->outna
17190 6d 65 20 29 20 66 72 65 65 28 6c 65 6d 70 2d 3e  me ) free(lemp->
171a0 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d 70  outname);.  lemp
171b0 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c 65  ->outname = file
171c0 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20  _makename(lemp, 
171d0 73 75 66 66 69 78 29 3b 0a 20 20 66 70 20 3d 20  suffix);.  fp = 
171e0 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e  fopen(lemp->outn
171f0 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66 28  ame,mode);.  if(
17200 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65 3d   fp==0 && *mode=
17210 3d 27 77 27 20 29 7b 0a 20 20 20 20 66 70 72 69  ='w' ){.    fpri
17220 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27  ntf(stderr,"Can'
17230 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73  t open file \"%s
17240 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74  \".\n",lemp->out
17250 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d  name);.    lemp-
17260 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
17270 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
17280 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f   return fp;.}../
17290 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68 65 20  * Duplicate the 
172a0 69 6e 70 75 74 20 66 69 6c 65 20 77 69 74 68 6f  input file witho
172b0 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64 20  ut comments and 
172c0 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 20  without actions 
172d0 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a  .** on rules */.
172e0 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73 74 72  void Reprint(str
172f0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
17300 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  .{.  struct rule
17310 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73   *rp;.  struct s
17320 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74  ymbol *sp;.  int
17330 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c   i, j, maxlen, l
17340 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b  en, ncolumns, sk
17350 69 70 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f 2f  ip;.  printf("//
17360 20 52 65 70 72 69 6e 74 20 6f 66 20 69 6e 70 75   Reprint of inpu
17370 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e  t file \"%s\".\n
17380 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c  // Symbols:\n",l
17390 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a  emp->filename);.
173a0 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a 20    maxlen = 10;. 
173b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
173c0 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
173d0 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
173e0 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
173f0 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  len = lemonStrle
17400 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  n(sp->name);.   
17410 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20   if( len>maxlen 
17420 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a  ) maxlen = len;.
17430 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20 3d    }.  ncolumns =
17440 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b 0a   76/(maxlen+5);.
17450 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c 31    if( ncolumns<1
17460 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31 3b   ) ncolumns = 1;
17470 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70 2d  .  skip = (lemp-
17480 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c 75  >nsymbol + ncolu
17490 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d 6e  mns - 1)/ncolumn
174a0 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  s;.  for(i=0; i<
174b0 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  skip; i++){.    
174c0 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20 20  printf("//");.  
174d0 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65 6d    for(j=i; j<lem
174e0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d 73  p->nsymbol; j+=s
174f0 6b 69 70 29 7b 0a 20 20 20 20 20 20 73 70 20 3d  kip){.      sp =
17500 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a   lemp->symbols[j
17510 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
17520 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29 3b   sp->index==j );
17530 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20  .      printf(" 
17540 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61  %3d %-*.*s",j,ma
17550 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d 3e  xlen,maxlen,sp->
17560 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
17570 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
17580 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70   }.  for(rp=lemp
17590 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
175a0 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 70 72  p->next){.    pr
175b0 69 6e 74 66 28 22 25 73 22 2c 72 70 2d 3e 6c 68  intf("%s",rp->lh
175c0 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a  s->name);.    /*
175d0 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61      if( rp->lhsa
175e0 6c 69 61 73 20 29 20 70 72 69 6e 74 66 28 22 28  lias ) printf("(
175f0 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  %s)",rp->lhsalia
17600 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74  s); */.    print
17610 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20 66  f(" ::=");.    f
17620 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
17630 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
17640 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
17650 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74  .      if( sp->t
17660 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype==MULTITERMIN
17670 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  AL ){.        pr
17680 69 6e 74 66 28 22 20 25 73 22 2c 20 73 70 2d 3e  intf(" %s", sp->
17690 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29  subsym[0]->name)
176a0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
176b0 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d  1; j<sp->nsubsym
176c0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
176d0 20 20 70 72 69 6e 74 66 28 22 7c 25 73 22 2c 20    printf("|%s", 
176e0 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e  sp->subsym[j]->n
176f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ame);.        }.
17700 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17710 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 73       printf(" %s
17720 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ", sp->name);.  
17730 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 69      }.      /* i
17740 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  f( rp->rhsalias[
17750 69 5d 20 29 20 70 72 69 6e 74 66 28 22 28 25 73  i] ) printf("(%s
17760 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  )",rp->rhsalias[
17770 69 5d 29 3b 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  i]); */.    }.  
17780 20 20 70 72 69 6e 74 66 28 22 2e 22 29 3b 0a 20    printf(".");. 
17790 20 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73     if( rp->precs
177a0 79 6d 20 29 20 70 72 69 6e 74 66 28 22 20 5b 25  ym ) printf(" [%
177b0 73 5d 22 2c 72 70 2d 3e 70 72 65 63 73 79 6d 2d  s]",rp->precsym-
177c0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20 69  >name);.    /* i
177d0 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 20 70 72  f( rp->code ) pr
177e0 69 6e 74 66 28 22 5c 6e 20 20 20 20 25 73 22 2c  intf("\n    %s",
177f0 72 70 2d 3e 63 6f 64 65 29 3b 20 2a 2f 0a 20 20  rp->code); */.  
17800 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a    printf("\n");.
17810 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20    }.}../* Print 
17820 61 20 73 69 6e 67 6c 65 20 72 75 6c 65 2e 0a 2a  a single rule..*
17830 2f 0a 76 6f 69 64 20 52 75 6c 65 50 72 69 6e 74  /.void RulePrint
17840 28 46 49 4c 45 20 2a 66 70 2c 20 73 74 72 75 63  (FILE *fp, struc
17850 74 20 72 75 6c 65 20 2a 72 70 2c 20 69 6e 74 20  t rule *rp, int 
17860 69 43 75 72 73 6f 72 29 7b 0a 20 20 73 74 72 75  iCursor){.  stru
17870 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
17880 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 70 72   int i, j;.  fpr
17890 69 6e 74 66 28 66 70 2c 22 25 73 20 3a 3a 3d 22  intf(fp,"%s ::="
178a0 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b  ,rp->lhs->name);
178b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 72  .  for(i=0; i<=r
178c0 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
178d0 20 20 20 69 66 28 20 69 3d 3d 69 43 75 72 73 6f     if( i==iCurso
178e0 72 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c 22  r ) fprintf(fp,"
178f0 20 2a 22 29 3b 0a 20 20 20 20 69 66 28 20 69 3d   *");.    if( i=
17900 3d 72 70 2d 3e 6e 72 68 73 20 29 20 62 72 65 61  =rp->nrhs ) brea
17910 6b 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e  k;.    sp = rp->
17920 72 68 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  rhs[i];.    if( 
17930 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54  sp->type==MULTIT
17940 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
17950 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73   fprintf(fp," %s
17960 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d  ", sp->subsym[0]
17970 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66  ->name);.      f
17980 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73  or(j=1; j<sp->ns
17990 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ubsym; j++){.   
179a0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
179b0 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d  "|%s",sp->subsym
179c0 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [j]->name);.    
179d0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
179e0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
179f0 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29  " %s", sp->name)
17a00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
17a10 2a 20 50 72 69 6e 74 20 74 68 65 20 72 75 6c 65  * Print the rule
17a20 20 66 6f 72 20 61 20 63 6f 6e 66 69 67 75 72 61   for a configura
17a30 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f  tion..*/.void Co
17a40 6e 66 69 67 50 72 69 6e 74 28 46 49 4c 45 20 2a  nfigPrint(FILE *
17a50 66 70 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69  fp, struct confi
17a60 67 20 2a 63 66 70 29 7b 0a 20 20 52 75 6c 65 50  g *cfp){.  RuleP
17a70 72 69 6e 74 28 66 70 2c 20 63 66 70 2d 3e 72 70  rint(fp, cfp->rp
17a80 2c 20 63 66 70 2d 3e 64 6f 74 29 3b 0a 7d 0a 0a  , cfp->dot);.}..
17a90 2f 2a 20 23 64 65 66 69 6e 65 20 54 45 53 54 20  /* #define TEST 
17aa0 2a 2f 0a 23 69 66 20 30 0a 2f 2a 20 50 72 69 6e  */.#if 0./* Prin
17ab0 74 20 61 20 73 65 74 20 2a 2f 0a 50 52 49 56 41  t a set */.PRIVA
17ac0 54 45 20 76 6f 69 64 20 53 65 74 50 72 69 6e 74  TE void SetPrint
17ad0 28 6f 75 74 2c 73 65 74 2c 6c 65 6d 70 29 0a 46  (out,set,lemp).F
17ae0 49 4c 45 20 2a 6f 75 74 3b 0a 63 68 61 72 20 2a  ILE *out;.char *
17af0 73 65 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f  set;.struct lemo
17b00 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74  n *lemp;.{.  int
17b10 20 69 3b 0a 20 20 63 68 61 72 20 2a 73 70 61 63   i;.  char *spac
17b20 65 72 3b 0a 20 20 73 70 61 63 65 72 20 3d 20 22  er;.  spacer = "
17b30 22 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  ";.  fprintf(out
17b40 2c 22 25 31 32 73 5b 22 2c 22 22 29 3b 0a 20 20  ,"%12s[","");.  
17b50 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
17b60 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
17b70 7b 0a 20 20 20 20 69 66 28 20 53 65 74 46 69 6e  {.    if( SetFin
17b80 64 28 73 65 74 2c 69 29 20 29 7b 0a 20 20 20 20  d(set,i) ){.    
17b90 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
17ba0 73 25 73 22 2c 73 70 61 63 65 72 2c 6c 65 6d 70  s%s",spacer,lemp
17bb0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61  ->symbols[i]->na
17bc0 6d 65 29 3b 0a 20 20 20 20 20 20 73 70 61 63 65  me);.      space
17bd0 72 20 3d 20 22 20 22 3b 0a 20 20 20 20 7d 0a 20  r = " ";.    }. 
17be0 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
17bf0 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50  ,"]\n");.}../* P
17c00 72 69 6e 74 20 61 20 70 6c 69 6e 6b 20 63 68 61  rint a plink cha
17c10 69 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  in */.PRIVATE vo
17c20 69 64 20 50 6c 69 6e 6b 50 72 69 6e 74 28 6f 75  id PlinkPrint(ou
17c30 74 2c 70 6c 70 2c 74 61 67 29 0a 46 49 4c 45 20  t,plp,tag).FILE 
17c40 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 70 6c 69  *out;.struct pli
17c50 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61 72 20 2a 74  nk *plp;.char *t
17c60 61 67 3b 0a 7b 0a 20 20 77 68 69 6c 65 28 20 70  ag;.{.  while( p
17c70 6c 70 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  lp ){.    fprint
17c80 66 28 6f 75 74 2c 22 25 31 32 73 25 73 20 28 73  f(out,"%12s%s (s
17c90 74 61 74 65 20 25 32 64 29 20 22 2c 22 22 2c 74  tate %2d) ","",t
17ca0 61 67 2c 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 70  ag,plp->cfp->stp
17cb0 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20  ->statenum);.   
17cc0 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 6f 75 74   ConfigPrint(out
17cd0 2c 70 6c 70 2d 3e 63 66 70 29 3b 0a 20 20 20 20  ,plp->cfp);.    
17ce0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22  fprintf(out,"\n"
17cf0 29 3b 0a 20 20 20 20 70 6c 70 20 3d 20 70 6c 70  );.    plp = plp
17d00 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65  ->next;.  }.}.#e
17d10 6e 64 69 66 0a 0a 2f 2a 20 50 72 69 6e 74 20 61  ndif../* Print a
17d20 6e 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  n action to the 
17d30 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
17d40 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 46  iptor.  Return F
17d50 41 4c 53 45 20 69 66 0a 2a 2a 20 6e 6f 74 68 69  ALSE if.** nothi
17d60 6e 67 20 77 61 73 20 61 63 74 75 61 6c 6c 79 20  ng was actually 
17d70 70 72 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  printed..*/.int 
17d80 50 72 69 6e 74 41 63 74 69 6f 6e 28 0a 20 20 73  PrintAction(.  s
17d90 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
17da0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
17db0 65 20 61 63 74 69 6f 6e 20 74 6f 20 70 72 69 6e  e action to prin
17dc0 74 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 66 70 2c  t */.  FILE *fp,
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 20 20 20 2f 2a 20 50 72 69 6e 74 20 74 68 65 20     /* Print the 
17df0 61 63 74 69 6f 6e 20 68 65 72 65 20 2a 2f 0a 20  action here */. 
17e00 20 69 6e 74 20 69 6e 64 65 6e 74 20 20 20 20 20   int indent     
17e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17e20 49 6e 64 65 6e 74 20 62 79 20 74 68 69 73 20 61  Indent by this a
17e30 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  mount */.){.  in
17e40 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20 20  t result = 1;.  
17e50 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65  switch( ap->type
17e60 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49   ){.    case SHI
17e70 46 54 3a 20 7b 0a 20 20 20 20 20 20 73 74 72 75  FT: {.      stru
17e80 63 74 20 73 74 61 74 65 20 2a 73 74 70 20 3d 20  ct state *stp = 
17e90 61 70 2d 3e 78 2e 73 74 70 3b 0a 20 20 20 20 20  ap->x.stp;.     
17ea0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
17eb0 20 73 68 69 66 74 20 20 20 20 20 20 20 20 25 2d   shift        %-
17ec0 37 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73  7d",indent,ap->s
17ed0 70 2d 3e 6e 61 6d 65 2c 73 74 70 2d 3e 73 74 61  p->name,stp->sta
17ee0 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72  tenum);.      br
17ef0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
17f00 61 73 65 20 52 45 44 55 43 45 3a 20 7b 0a 20 20  ase REDUCE: {.  
17f10 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20      struct rule 
17f20 2a 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a  *rp = ap->x.rp;.
17f30 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
17f40 2c 22 25 2a 73 20 72 65 64 75 63 65 20 20 20 20  ,"%*s reduce    
17f50 20 20 20 25 2d 37 64 22 2c 69 6e 64 65 6e 74 2c     %-7d",indent,
17f60 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 72 70 2d  ap->sp->name,rp-
17f70 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20 52  >iRule);.      R
17f80 75 6c 65 50 72 69 6e 74 28 66 70 2c 20 72 70 2c  ulePrint(fp, rp,
17f90 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   -1);.      brea
17fa0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
17fb0 65 20 53 48 49 46 54 52 45 44 55 43 45 3a 20 7b  e SHIFTREDUCE: {
17fc0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 72 75  .      struct ru
17fd0 6c 65 20 2a 72 70 20 3d 20 61 70 2d 3e 78 2e 72  le *rp = ap->x.r
17fe0 70 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  p;.      fprintf
17ff0 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 2d 72  (fp,"%*s shift-r
18000 65 64 75 63 65 20 25 2d 37 64 22 2c 69 6e 64 65  educe %-7d",inde
18010 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
18020 72 70 2d 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20  rp->iRule);.    
18030 20 20 52 75 6c 65 50 72 69 6e 74 28 66 70 2c 20    RulePrint(fp, 
18040 72 70 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62  rp, -1);.      b
18050 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
18060 63 61 73 65 20 41 43 43 45 50 54 3a 0a 20 20 20  case ACCEPT:.   
18070 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
18080 2a 73 20 61 63 63 65 70 74 22 2c 69 6e 64 65 6e  *s accept",inden
18090 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b  t,ap->sp->name);
180a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
180b0 20 20 63 61 73 65 20 45 52 52 4f 52 3a 0a 20 20    case ERROR:.  
180c0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
180d0 25 2a 73 20 65 72 72 6f 72 22 2c 69 6e 64 65 6e  %*s error",inden
180e0 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b  t,ap->sp->name);
180f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18100 20 20 63 61 73 65 20 53 52 43 4f 4e 46 4c 49 43    case SRCONFLIC
18110 54 3a 0a 20 20 20 20 63 61 73 65 20 52 52 43 4f  T:.    case RRCO
18120 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20 66 70  NFLICT:.      fp
18130 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65  rintf(fp,"%*s re
18140 64 75 63 65 20 20 20 20 20 20 20 25 2d 37 64 20  duce       %-7d 
18150 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c  ** Parsing confl
18160 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20  ict **",.       
18170 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
18180 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69  name,ap->x.rp->i
18190 52 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Rule);.      bre
181a0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 43  ak;.    case SSC
181b0 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20 66  ONFLICT:.      f
181c0 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73  printf(fp,"%*s s
181d0 68 69 66 74 20 20 20 20 20 20 20 20 25 2d 37 64  hift        %-7d
181e0 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66   ** Parsing conf
181f0 6c 69 63 74 20 2a 2a 22 2c 20 0a 20 20 20 20 20  lict **", .     
18200 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70     indent,ap->sp
18210 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70  ->name,ap->x.stp
18220 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20  ->statenum);.   
18230 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
18240 73 65 20 53 48 5f 52 45 53 4f 4c 56 45 44 3a 0a  se SH_RESOLVED:.
18250 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 50 72        if( showPr
18260 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63 74  ecedenceConflict
18270 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
18280 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66  ntf(fp,"%*s shif
18290 74 20 20 20 20 20 20 20 20 25 2d 37 64 20 2d 2d  t        %-7d --
182a0 20 64 72 6f 70 70 65 64 20 62 79 20 70 72 65 63   dropped by prec
182b0 65 64 65 6e 63 65 22 2c 0a 20 20 20 20 20 20 20  edence",.       
182c0 20 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74 2c           indent,
182d0 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d  ap->sp->name,ap-
182e0 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d  >x.stp->statenum
182f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18300 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d          result =
18310 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
18320 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
18330 65 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20  e RD_RESOLVED:. 
18340 20 20 20 20 20 69 66 28 20 73 68 6f 77 50 72 65       if( showPre
18350 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63 74 20  cedenceConflict 
18360 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
18370 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75 63  tf(fp,"%*s reduc
18380 65 20 25 2d 37 64 20 2d 2d 20 64 72 6f 70 70 65  e %-7d -- droppe
18390 64 20 62 79 20 70 72 65 63 65 64 65 6e 63 65 22  d by precedence"
183a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
183b0 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d    indent,ap->sp-
183c0 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e  >name,ap->x.rp->
183d0 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20 7d 65  iRule);.      }e
183e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73  lse{.        res
183f0 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ult = 0;.      }
18400 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18410 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44 3a    case NOT_USED:
18420 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20  .      result = 
18430 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
18440 20 20 7d 0a 20 20 69 66 28 20 72 65 73 75 6c 74    }.  if( result
18450 20 26 26 20 61 70 2d 3e 73 70 4f 70 74 20 29 7b   && ap->spOpt ){
18460 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
18470 22 20 20 2f 2a 20 62 65 63 61 75 73 65 20 25 73  "  /* because %s
18480 3d 3d 25 73 20 2a 2f 22 2c 20 61 70 2d 3e 73 70  ==%s */", ap->sp
18490 2d 3e 6e 61 6d 65 2c 20 61 70 2d 3e 73 70 4f 70  ->name, ap->spOp
184a0 74 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  t->name);.  }.  
184b0 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d  return result;.}
184c0 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68  ../* Generate th
184d0 65 20 22 2a 2e 6f 75 74 22 20 6c 6f 67 20 66 69  e "*.out" log fi
184e0 6c 65 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72  le */.void Repor
184f0 74 4f 75 74 70 75 74 28 73 74 72 75 63 74 20 6c  tOutput(struct l
18500 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
18510 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
18520 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
18530 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
18540 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
18550 6e 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66  n *ap;.  FILE *f
18560 70 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f  p;..  fp = file_
18570 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22  open(lemp,".out"
18580 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"wb");.  if( fp
18590 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
185a0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
185b0 3e 6e 78 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  >nxstate; i++){.
185c0 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
185d0 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66  sorted[i];.    f
185e0 70 72 69 6e 74 66 28 66 70 2c 22 53 74 61 74 65  printf(fp,"State
185f0 20 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74 61   %d:\n",stp->sta
18600 74 65 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  tenum);.    if( 
18610 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20  lemp->basisflag 
18620 29 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20  ) cfp=stp->bp;. 
18630 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
18640 20 20 20 20 20 20 20 20 20 63 66 70 3d 73 74 70           cfp=stp
18650 2d 3e 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65  ->cfp;.    while
18660 28 20 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63  ( cfp ){.      c
18670 68 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20  har buf[20];.   
18680 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d     if( cfp->dot=
18690 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29  =cfp->rp->nrhs )
186a0 7b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f  {.        lemon_
186b0 73 70 72 69 6e 74 66 28 62 75 66 2c 22 28 25 64  sprintf(buf,"(%d
186c0 29 22 2c 63 66 70 2d 3e 72 70 2d 3e 69 52 75 6c  )",cfp->rp->iRul
186d0 65 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69  e);.        fpri
186e0 6e 74 66 28 66 70 2c 22 20 20 20 20 25 35 73 20  ntf(fp,"    %5s 
186f0 22 2c 62 75 66 29 3b 0a 20 20 20 20 20 20 7d 65  ",buf);.      }e
18700 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72  lse{.        fpr
18710 69 6e 74 66 28 66 70 2c 22 20 20 20 20 20 20 20  intf(fp,"       
18720 20 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20     ");.      }. 
18730 20 20 20 20 20 43 6f 6e 66 69 67 50 72 69 6e 74       ConfigPrint
18740 28 66 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20  (fp,cfp);.      
18750 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29  fprintf(fp,"\n")
18760 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 53 65  ;.#if 0.      Se
18770 74 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66  tPrint(fp,cfp->f
18780 77 73 2c 6c 65 6d 70 29 3b 0a 20 20 20 20 20 20  ws,lemp);.      
18790 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66  PlinkPrint(fp,cf
187a0 70 2d 3e 66 70 6c 70 2c 22 54 6f 20 20 22 29 3b  p->fplp,"To  ");
187b0 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e  .      PlinkPrin
187c0 74 28 66 70 2c 63 66 70 2d 3e 62 70 6c 70 2c 22  t(fp,cfp->bplp,"
187d0 46 72 6f 6d 22 29 3b 0a 23 65 6e 64 69 66 0a 20  From");.#endif. 
187e0 20 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62       if( lemp->b
187f0 61 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d 63  asisflag ) cfp=c
18800 66 70 2d 3e 62 70 3b 0a 20 20 20 20 20 20 65 6c  fp->bp;.      el
18810 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
18820 20 20 20 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78      cfp=cfp->nex
18830 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  t;.    }.    fpr
18840 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20  intf(fp,"\n");. 
18850 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
18860 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
18870 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50  xt){.      if( P
18880 72 69 6e 74 41 63 74 69 6f 6e 28 61 70 2c 66 70  rintAction(ap,fp
18890 2c 33 30 29 20 29 20 66 70 72 69 6e 74 66 28 66  ,30) ) fprintf(f
188a0 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  p,"\n");.    }. 
188b0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c     fprintf(fp,"\
188c0 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  n");.  }.  fprin
188d0 74 66 28 66 70 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d  tf(fp, "--------
188e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
188f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29  ------------\n")
18910 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20  ;.  fprintf(fp, 
18920 22 53 79 6d 62 6f 6c 73 3a 5c 6e 22 29 3b 0a 20  "Symbols:\n");. 
18930 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
18940 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
18950 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
18960 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
18970 70 3b 0a 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d  p;..    sp = lem
18980 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
18990 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
189a0 20 20 25 33 64 3a 20 25 73 22 2c 20 69 2c 20 73    %3d: %s", i, s
189b0 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  p->name);.    if
189c0 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54  ( sp->type==NONT
189d0 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
189e0 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 3a 22   fprintf(fp, ":"
189f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d  );.      if( sp-
18a00 3e 6c 61 6d 62 64 61 20 29 7b 0a 20 20 20 20 20  >lambda ){.     
18a10 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
18a20 20 3c 6c 61 6d 62 64 61 3e 22 29 3b 0a 20 20 20   <lambda>");.   
18a30 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
18a40 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =0; j<lemp->nter
18a50 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  minal; j++){.   
18a60 20 20 20 20 20 69 66 28 20 73 70 2d 3e 66 69 72       if( sp->fir
18a70 73 74 73 65 74 20 26 26 20 53 65 74 46 69 6e 64  stset && SetFind
18a80 28 73 70 2d 3e 66 69 72 73 74 73 65 74 2c 20 6a  (sp->firstset, j
18a90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ) ){.          f
18aa0 70 72 69 6e 74 66 28 66 70 2c 20 22 20 25 73 22  printf(fp, " %s"
18ab0 2c 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  , lemp->symbols[
18ac0 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  j]->name);.     
18ad0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18ae0 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66   }.    fprintf(f
18af0 70 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  p, "\n");.  }.  
18b00 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 72 65  fclose(fp);.  re
18b10 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 61 72  turn;.}../* Sear
18b20 63 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  ch for the file 
18b30 22 6e 61 6d 65 22 20 77 68 69 63 68 20 69 73 20  "name" which is 
18b40 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
18b50 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65 20  ctory as.** the 
18b60 65 78 61 63 75 74 61 62 6c 65 20 2a 2f 0a 50 52  exacutable */.PR
18b70 49 56 41 54 45 20 63 68 61 72 20 2a 70 61 74 68  IVATE char *path
18b80 73 65 61 72 63 68 28 63 68 61 72 20 2a 61 72 67  search(char *arg
18b90 76 30 2c 20 63 68 61 72 20 2a 6e 61 6d 65 2c 20  v0, char *name, 
18ba0 69 6e 74 20 6d 6f 64 65 6d 61 73 6b 29 0a 7b 0a  int modemask).{.
18bb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
18bc0 74 68 6c 69 73 74 3b 0a 20 20 63 68 61 72 20 2a  thlist;.  char *
18bd0 70 61 74 68 62 75 66 70 74 72 3b 0a 20 20 63 68  pathbufptr;.  ch
18be0 61 72 20 2a 70 61 74 68 62 75 66 3b 0a 20 20 63  ar *pathbuf;.  c
18bf0 68 61 72 20 2a 70 61 74 68 2c 2a 63 70 3b 0a 20  har *path,*cp;. 
18c00 20 63 68 61 72 20 63 3b 0a 0a 23 69 66 64 65 66   char c;..#ifdef
18c10 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20 63 70 20   __WIN32__.  cp 
18c20 3d 20 73 74 72 72 63 68 72 28 61 72 67 76 30 2c  = strrchr(argv0,
18c30 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a 20 20 63  '\\');.#else.  c
18c40 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67 76  p = strrchr(argv
18c50 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69 66 0a 20  0,'/');.#endif. 
18c60 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20 63   if( cp ){.    c
18c70 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20   = *cp;.    *cp 
18c80 3d 20 30 3b 0a 20 20 20 20 70 61 74 68 20 3d 20  = 0;.    path = 
18c90 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20  (char *)malloc( 
18ca0 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76  lemonStrlen(argv
18cb0 30 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  0) + lemonStrlen
18cc0 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a 20 20  (name) + 2 );.  
18cd0 20 20 69 66 28 20 70 61 74 68 20 29 20 6c 65 6d    if( path ) lem
18ce0 6f 6e 5f 73 70 72 69 6e 74 66 28 70 61 74 68 2c  on_sprintf(path,
18cf0 22 25 73 2f 25 73 22 2c 61 72 67 76 30 2c 6e 61  "%s/%s",argv0,na
18d00 6d 65 29 3b 0a 20 20 20 20 2a 63 70 20 3d 20 63  me);.    *cp = c
18d10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18d20 61 74 68 6c 69 73 74 20 3d 20 67 65 74 65 6e 76  athlist = getenv
18d30 28 22 50 41 54 48 22 29 3b 0a 20 20 20 20 69 66  ("PATH");.    if
18d40 28 20 70 61 74 68 6c 69 73 74 3d 3d 30 20 29 20  ( pathlist==0 ) 
18d50 70 61 74 68 6c 69 73 74 20 3d 20 22 2e 3a 2f 62  pathlist = ".:/b
18d60 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20 20  in:/usr/bin";.  
18d70 20 20 70 61 74 68 62 75 66 20 3d 20 28 63 68 61    pathbuf = (cha
18d80 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d  r *) malloc( lem
18d90 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c 69 73  onStrlen(pathlis
18da0 74 29 20 2b 20 31 20 29 3b 0a 20 20 20 20 70 61  t) + 1 );.    pa
18db0 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c  th = (char *)mal
18dc0 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  loc( lemonStrlen
18dd0 28 70 61 74 68 6c 69 73 74 29 2b 6c 65 6d 6f 6e  (pathlist)+lemon
18de0 53 74 72 6c 65 6e 28 6e 61 6d 65 29 2b 32 20 29  Strlen(name)+2 )
18df0 3b 0a 20 20 20 20 69 66 28 20 28 70 61 74 68 62  ;.    if( (pathb
18e00 75 66 20 21 3d 20 30 29 20 26 26 20 28 70 61 74  uf != 0) && (pat
18e10 68 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 70  h!=0) ){.      p
18e20 61 74 68 62 75 66 70 74 72 20 3d 20 70 61 74 68  athbufptr = path
18e30 62 75 66 3b 0a 20 20 20 20 20 20 6c 65 6d 6f 6e  buf;.      lemon
18e40 5f 73 74 72 63 70 79 28 70 61 74 68 62 75 66 2c  _strcpy(pathbuf,
18e50 20 70 61 74 68 6c 69 73 74 29 3b 0a 20 20 20 20   pathlist);.    
18e60 20 20 77 68 69 6c 65 28 20 2a 70 61 74 68 62 75    while( *pathbu
18e70 66 20 29 7b 0a 20 20 20 20 20 20 20 20 63 70 20  f ){.        cp 
18e80 3d 20 73 74 72 63 68 72 28 70 61 74 68 62 75 66  = strchr(pathbuf
18e90 2c 27 3a 27 29 3b 0a 20 20 20 20 20 20 20 20 69  ,':');.        i
18ea0 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20  f( cp==0 ) cp = 
18eb0 26 70 61 74 68 62 75 66 5b 6c 65 6d 6f 6e 53 74  &pathbuf[lemonSt
18ec0 72 6c 65 6e 28 70 61 74 68 62 75 66 29 5d 3b 0a  rlen(pathbuf)];.
18ed0 20 20 20 20 20 20 20 20 63 20 3d 20 2a 63 70 3b          c = *cp;
18ee0 0a 20 20 20 20 20 20 20 20 2a 63 70 20 3d 20 30  .        *cp = 0
18ef0 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f  ;.        lemon_
18f00 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73  sprintf(path,"%s
18f10 2f 25 73 22 2c 70 61 74 68 62 75 66 2c 6e 61 6d  /%s",pathbuf,nam
18f20 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 63 70 20  e);.        *cp 
18f30 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = c;.        if(
18f40 20 63 3d 3d 30 20 29 20 70 61 74 68 62 75 66 5b   c==0 ) pathbuf[
18f50 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  0] = 0;.        
18f60 65 6c 73 65 20 70 61 74 68 62 75 66 20 3d 20 26  else pathbuf = &
18f70 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  cp[1];.        i
18f80 66 28 20 61 63 63 65 73 73 28 70 61 74 68 2c 6d  f( access(path,m
18f90 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29 20 62 72  odemask)==0 ) br
18fa0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
18fb0 20 20 20 66 72 65 65 28 70 61 74 68 62 75 66 70     free(pathbufp
18fc0 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  tr);.    }.  }. 
18fd0 20 72 65 74 75 72 6e 20 70 61 74 68 3b 0a 7d 0a   return path;.}.
18fe0 0a 2f 2a 20 47 69 76 65 6e 20 61 6e 20 61 63 74  ./* Given an act
18ff0 69 6f 6e 2c 20 63 6f 6d 70 75 74 65 20 74 68 65  ion, compute the
19000 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
19010 6f 72 20 74 68 61 74 20 61 63 74 69 6f 6e 0a 2a  or that action.*
19020 2a 20 77 68 69 63 68 20 69 73 20 74 6f 20 62 65  * which is to be
19030 20 70 75 74 20 69 6e 20 74 68 65 20 61 63 74 69   put in the acti
19040 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  on table of the 
19050 67 65 6e 65 72 61 74 65 64 20 6d 61 63 68 69 6e  generated machin
19060 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67  e..** Return neg
19070 61 74 69 76 65 20 69 66 20 6e 6f 20 61 63 74 69  ative if no acti
19080 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 67 65 6e  on should be gen
19090 65 72 61 74 65 64 2e 0a 2a 2f 0a 50 52 49 56 41  erated..*/.PRIVA
190a0 54 45 20 69 6e 74 20 63 6f 6d 70 75 74 65 5f 61  TE int compute_a
190b0 63 74 69 6f 6e 28 73 74 72 75 63 74 20 6c 65 6d  ction(struct lem
190c0 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74  on *lemp, struct
190d0 20 61 63 74 69 6f 6e 20 2a 61 70 29 0a 7b 0a 20   action *ap).{. 
190e0 20 69 6e 74 20 61 63 74 3b 0a 20 20 73 77 69 74   int act;.  swit
190f0 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a  ch( ap->type ){.
19100 20 20 20 20 63 61 73 65 20 53 48 49 46 54 3a 20      case SHIFT: 
19110 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 73 74 70   act = ap->x.stp
19120 2d 3e 73 74 61 74 65 6e 75 6d 3b 20 20 20 20 20  ->statenum;     
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19140 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
19150 73 65 20 53 48 49 46 54 52 45 44 55 43 45 3a 20  se SHIFTREDUCE: 
19160 61 63 74 20 3d 20 61 70 2d 3e 78 2e 72 70 2d 3e  act = ap->x.rp->
19170 69 52 75 6c 65 20 2b 20 6c 65 6d 70 2d 3e 6e 73  iRule + lemp->ns
19180 74 61 74 65 3b 20 20 20 20 20 20 20 20 62 72 65  tate;        bre
19190 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44  ak;.    case RED
191a0 55 43 45 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78  UCE: act = ap->x
191b0 2e 72 70 2d 3e 69 52 75 6c 65 20 2b 20 6c 65 6d  .rp->iRule + lem
191c0 70 2d 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e  p->nstate+lemp->
191d0 6e 72 75 6c 65 3b 20 62 72 65 61 6b 3b 0a 20 20  nrule; break;.  
191e0 20 20 63 61 73 65 20 45 52 52 4f 52 3a 20 20 61    case ERROR:  a
191f0 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  ct = lemp->nstat
19200 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2a  e + lemp->nrule*
19210 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
19220 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
19230 20 41 43 43 45 50 54 3a 20 61 63 74 20 3d 20 6c   ACCEPT: act = l
19240 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65  emp->nstate + le
19250 6d 70 2d 3e 6e 72 75 6c 65 2a 32 20 2b 20 31 3b  mp->nrule*2 + 1;
19260 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
19270 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
19280 20 20 20 61 63 74 20 3d 20 2d 31 3b 20 62 72 65     act = -1; bre
19290 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
192a0 20 61 63 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65   act;.}..#define
192b0 20 4c 49 4e 45 53 49 5a 45 20 31 30 30 30 0a 2f   LINESIZE 1000./
192c0 2a 20 54 68 65 20 6e 65 78 74 20 63 6c 75 73 74  * The next clust
192d0 65 72 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  er of routines a
192e0 72 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74  re for reading t
192f0 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
19300 0a 2a 2a 20 61 6e 64 20 77 72 69 74 69 6e 67 20  .** and writing 
19310 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74  the results to t
19320 68 65 20 67 65 6e 65 72 61 74 65 64 20 70 61 72  he generated par
19330 73 65 72 20 2a 2f 0a 2f 2a 20 54 68 65 20 66 69  ser */./* The fi
19340 72 73 74 20 66 75 6e 63 74 69 6f 6e 20 74 72 61  rst function tra
19350 6e 73 66 65 72 73 20 64 61 74 61 20 66 72 6f 6d  nsfers data from
19360 20 22 69 6e 22 20 74 6f 20 22 6f 75 74 22 20 75   "in" to "out" u
19370 6e 74 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20 69  ntil.** a line i
19380 73 20 73 65 65 6e 20 77 68 69 63 68 20 62 65 67  s seen which beg
19390 69 6e 73 20 77 69 74 68 20 22 25 25 22 2e 20 20  ins with "%%".  
193a0 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  The line number 
193b0 69 73 0a 2a 2a 20 74 72 61 63 6b 65 64 2e 0a 2a  is.** tracked..*
193c0 2a 0a 2a 2a 20 69 66 20 6e 61 6d 65 21 3d 30 2c  *.** if name!=0,
193d0 20 74 68 65 6e 20 61 6e 79 20 77 6f 72 64 20 74   then any word t
193e0 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 22  hat begin with "
193f0 50 61 72 73 65 22 20 69 73 20 63 68 61 6e 67 65  Parse" is change
19400 64 20 74 6f 0a 2a 2a 20 62 65 67 69 6e 20 77 69  d to.** begin wi
19410 74 68 20 2a 6e 61 6d 65 20 69 6e 73 74 65 61 64  th *name instead
19420 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  ..*/.PRIVATE voi
19430 64 20 74 70 6c 74 5f 78 66 65 72 28 63 68 61 72  d tplt_xfer(char
19440 20 2a 6e 61 6d 65 2c 20 46 49 4c 45 20 2a 69 6e   *name, FILE *in
19450 2c 20 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74  , FILE *out, int
19460 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20 69 6e   *lineno).{.  in
19470 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 63  t i, iStart;.  c
19480 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a  har line[LINESIZ
19490 45 5d 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65  E];.  while( fge
194a0 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45  ts(line,LINESIZE
194b0 2c 69 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d  ,in) && (line[0]
194c0 21 3d 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d  !='%' || line[1]
194d0 21 3d 27 25 27 29 20 29 7b 0a 20 20 20 20 28 2a  !='%') ){.    (*
194e0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69  lineno)++;.    i
194f0 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 69  Start = 0;.    i
19500 66 28 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  f( name ){.     
19510 20 66 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69   for(i=0; line[i
19520 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
19530 20 69 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50   if( line[i]=='P
19540 27 20 26 26 20 73 74 72 6e 63 6d 70 28 26 6c 69  ' && strncmp(&li
19550 6e 65 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35 29  ne[i],"Parse",5)
19560 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  ==0.          &&
19570 20 28 69 3d 3d 30 20 7c 7c 20 21 49 53 41 4c 50   (i==0 || !ISALP
19580 48 41 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20  HA(line[i-1])). 
19590 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
195a0 20 20 20 20 69 66 28 20 69 3e 69 53 74 61 72 74      if( i>iStart
195b0 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
195c0 25 2e 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c 26  %.*s",i-iStart,&
195d0 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20  line[iStart]);. 
195e0 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
195f0 28 6f 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b  (out,"%s",name);
19600 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
19610 34 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53 74  4;.          iSt
19620 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20  art = i+1;.     
19630 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
19640 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f   }.    fprintf(o
19650 75 74 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53  ut,"%s",&line[iS
19660 74 61 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tart]);.  }.}../
19670 2a 20 54 68 65 20 6e 65 78 74 20 66 75 6e 63 74  * The next funct
19680 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 74 65  ion finds the te
19690 6d 70 6c 61 74 65 20 66 69 6c 65 20 61 6e 64 20  mplate file and 
196a0 6f 70 65 6e 73 20 69 74 2c 20 72 65 74 75 72 6e  opens it, return
196b0 69 6e 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  ing.** a pointer
196c0 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66   to the opened f
196d0 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20  ile. */.PRIVATE 
196e0 46 49 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28  FILE *tplt_open(
196f0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
19700 6d 70 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 63  mp).{.  static c
19710 68 61 72 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65  har templatename
19720 5b 5d 20 3d 20 22 6c 65 6d 70 61 72 2e 63 22 3b  [] = "lempar.c";
19730 0a 20 20 63 68 61 72 20 62 75 66 5b 31 30 30 30  .  char buf[1000
19740 5d 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20  ];.  FILE *in;. 
19750 20 63 68 61 72 20 2a 74 70 6c 74 6e 61 6d 65 3b   char *tpltname;
19760 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20  .  char *cp;..  
19770 2f 2a 20 66 69 72 73 74 2c 20 73 65 65 20 69 66  /* first, see if
19780 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20   user specified 
19790 61 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 6e  a template filen
197a0 61 6d 65 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  ame on the comma
197b0 6e 64 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 69 66  nd line. */.  if
197c0 20 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e   (user_templaten
197d0 61 6d 65 20 21 3d 20 30 29 20 7b 0a 20 20 20 20  ame != 0) {.    
197e0 69 66 28 20 61 63 63 65 73 73 28 75 73 65 72 5f  if( access(user_
197f0 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34  templatename,004
19800 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  )==-1 ){.      f
19810 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
19820 61 6e 27 74 20 66 69 6e 64 20 74 68 65 20 70 61  an't find the pa
19830 72 73 65 72 20 64 72 69 76 65 72 20 74 65 6d 70  rser driver temp
19840 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22  late file \"%s\"
19850 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 75 73  .\n",.        us
19860 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29  er_templatename)
19870 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72  ;.      lemp->er
19880 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
19890 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
198a0 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 75      in = fopen(u
198b0 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ser_templatename
198c0 2c 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20  ,"rb");.    if( 
198d0 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  in==0 ){.      f
198e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
198f0 61 6e 27 74 20 6f 70 65 6e 20 74 68 65 20 74 65  an't open the te
19900 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73  mplate file \"%s
19910 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  \".\n",.        
19920 20 20 20 20 20 20 75 73 65 72 5f 74 65 6d 70 6c        user_templ
19930 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  atename);.      
19940 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
19950 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
19960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
19970 72 6e 20 69 6e 3b 0a 20 20 7d 0a 0a 20 20 63 70  rn in;.  }..  cp
19980 20 3d 20 73 74 72 72 63 68 72 28 6c 65 6d 70 2d   = strrchr(lemp-
19990 3e 66 69 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b 0a  >filename,'.');.
199a0 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20    if( cp ){.    
199b0 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 62 75  lemon_sprintf(bu
199c0 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e 74  f,"%.*s.lt",(int
199d0 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65 6e  )(cp-lemp->filen
199e0 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  ame),lemp->filen
199f0 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
19a00 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66     lemon_sprintf
19a10 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65 6d  (buf,"%s.lt",lem
19a20 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
19a30 7d 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 62  }.  if( access(b
19a40 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20  uf,004)==0 ){.  
19a50 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75 66    tpltname = buf
19a60 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 63  ;.  }else if( ac
19a70 63 65 73 73 28 74 65 6d 70 6c 61 74 65 6e 61 6d  cess(templatenam
19a80 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20  e,004)==0 ){.   
19a90 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74 65 6d 70   tpltname = temp
19aa0 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c 73  latename;.  }els
19ab0 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20  e{.    tpltname 
19ac0 3d 20 70 61 74 68 73 65 61 72 63 68 28 6c 65 6d  = pathsearch(lem
19ad0 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70 6c 61 74  p->argv0,templat
19ae0 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20 20  ename,0);.  }.  
19af0 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d 3d 30 20  if( tpltname==0 
19b00 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
19b10 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69 6e  tderr,"Can't fin
19b20 64 20 74 68 65 20 70 61 72 73 65 72 20 64 72 69  d the parser dri
19b30 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  ver template fil
19b40 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20  e \"%s\".\n",.  
19b50 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b    templatename);
19b60 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
19b70 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
19b80 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20  n 0;.  }.  in = 
19b90 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d 65 2c 22  fopen(tpltname,"
19ba0 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  rb");.  if( in==
19bb0 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
19bc0 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f  (stderr,"Can't o
19bd0 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65  pen the template
19be0 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22   file \"%s\".\n"
19bf0 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a  ,templatename);.
19c00 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
19c10 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
19c20 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
19c30 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74   in;.}../* Print
19c40 20 61 20 23 6c 69 6e 65 20 64 69 72 65 63 74 69   a #line directi
19c50 76 65 20 6c 69 6e 65 20 74 6f 20 74 68 65 20 6f  ve line to the o
19c60 75 74 70 75 74 20 66 69 6c 65 2e 20 2a 2f 0a 50  utput file. */.P
19c70 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74  RIVATE void tplt
19c80 5f 6c 69 6e 65 64 69 72 28 46 49 4c 45 20 2a 6f  _linedir(FILE *o
19c90 75 74 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20  ut, int lineno, 
19ca0 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 29 0a  char *filename).
19cb0 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  {.  fprintf(out,
19cc0 22 23 6c 69 6e 65 20 25 64 20 5c 22 22 2c 6c 69  "#line %d \"",li
19cd0 6e 65 6e 6f 29 3b 0a 20 20 77 68 69 6c 65 28 20  neno);.  while( 
19ce0 2a 66 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20  *filename ){.   
19cf0 20 69 66 28 20 2a 66 69 6c 65 6e 61 6d 65 20 3d   if( *filename =
19d00 3d 20 27 5c 5c 27 20 29 20 70 75 74 63 28 27 5c  = '\\' ) putc('\
19d10 5c 27 2c 6f 75 74 29 3b 0a 20 20 20 20 70 75 74  \',out);.    put
19d20 63 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f 75 74 29  c(*filename,out)
19d30 3b 0a 20 20 20 20 66 69 6c 65 6e 61 6d 65 2b 2b  ;.    filename++
19d40 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ;.  }.  fprintf(
19d50 6f 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a  out,"\"\n");.}..
19d60 2f 2a 20 50 72 69 6e 74 20 61 20 73 74 72 69 6e  /* Print a strin
19d70 67 20 74 6f 20 74 68 65 20 66 69 6c 65 20 61 6e  g to the file an
19d80 64 20 6b 65 65 70 20 74 68 65 20 6c 69 6e 65 6e  d keep the linen
19d90 75 6d 62 65 72 20 75 70 20 74 6f 20 64 61 74 65  umber up to date
19da0 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64   */.PRIVATE void
19db0 20 74 70 6c 74 5f 70 72 69 6e 74 28 46 49 4c 45   tplt_print(FILE
19dc0 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 6c 65   *out, struct le
19dd0 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 68 61 72 20  mon *lemp, char 
19de0 2a 73 74 72 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e  *str, int *linen
19df0 6f 29 0a 7b 0a 20 20 69 66 28 20 73 74 72 3d 3d  o).{.  if( str==
19e00 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
19e10 69 6c 65 28 20 2a 73 74 72 20 29 7b 0a 20 20 20  ile( *str ){.   
19e20 20 70 75 74 63 28 2a 73 74 72 2c 6f 75 74 29 3b   putc(*str,out);
19e30 0a 20 20 20 20 69 66 28 20 2a 73 74 72 3d 3d 27  .    if( *str=='
19e40 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n' ) (*lineno)+
19e50 2b 3b 0a 20 20 20 20 73 74 72 2b 2b 3b 0a 20 20  +;.    str++;.  
19e60 7d 0a 20 20 69 66 28 20 73 74 72 5b 2d 31 5d 21  }.  if( str[-1]!
19e70 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 70 75 74  ='\n' ){.    put
19e80 63 28 27 5c 6e 27 2c 6f 75 74 29 3b 0a 20 20 20  c('\n',out);.   
19e90 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
19ea0 7d 0a 20 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e  }.  if (!lemp->n
19eb0 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 0a  olinenosflag) {.
19ec0 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b      (*lineno)++;
19ed0 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75   tplt_linedir(ou
19ee0 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e  t,*lineno,lemp->
19ef0 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 20 7d 0a 20  outname); .  }. 
19f00 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
19f10 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
19f20 72 6f 75 74 69 6e 65 20 65 6d 69 74 73 20 63 6f  routine emits co
19f30 64 65 20 66 6f 72 20 74 68 65 20 64 65 73 74 72  de for the destr
19f40 75 63 74 6f 72 20 66 6f 72 20 74 68 65 0a 2a 2a  uctor for the.**
19f50 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76 6f   symbol sp.*/.vo
19f60 69 64 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74  id emit_destruct
19f70 6f 72 5f 63 6f 64 65 28 0a 20 20 46 49 4c 45 20  or_code(.  FILE 
19f80 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63 74 20 73  *out,.  struct s
19f90 79 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20 73 74 72  ymbol *sp,.  str
19fa0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
19fb0 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a 29  .  int *lineno.)
19fc0 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d 20 30 3b  {. char *cp = 0;
19fd0 0a 0a 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d  .. if( sp->type=
19fe0 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  =TERMINAL ){.   
19ff0 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  cp = lemp->token
1a000 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70 3d  dest;.   if( cp=
1a010 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
1a020 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e  fprintf(out,"{\n
1a030 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
1a040 0a 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e  . }else if( sp->
1a050 64 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  destructor ){.  
1a060 20 63 70 20 3d 20 73 70 2d 3e 64 65 73 74 72 75   cp = sp->destru
1a070 63 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e 74 66  ctor;.   fprintf
1a080 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c  (out,"{\n"); (*l
1a090 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 28  ineno)++;.   if(
1a0a0 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f   !lemp->nolineno
1a0b0 73 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 28 2a  sflag ){.     (*
1a0c0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  lineno)++;.     
1a0d0 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74  tplt_linedir(out
1a0e0 2c 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 2c  ,sp->destLineno,
1a0f0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
1a100 0a 20 20 20 7d 0a 20 7d 65 6c 73 65 20 69 66 28  .   }. }else if(
1a110 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29   lemp->vardest )
1a120 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e  {.   cp = lemp->
1a130 76 61 72 64 65 73 74 3b 0a 20 20 20 69 66 28 20  vardest;.   if( 
1a140 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  cp==0 ) return;.
1a150 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1a160 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29  {\n"); (*lineno)
1a170 2b 2b 3b 0a 20 7d 65 6c 73 65 7b 0a 20 20 20 61  ++;. }else{.   a
1a180 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20  ssert( 0 );  /* 
1a190 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f  Cannot happen */
1a1a0 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a 63 70 3b 20  . }. for(; *cp; 
1a1b0 63 70 2b 2b 29 7b 0a 20 20 20 69 66 28 20 2a 63  cp++){.   if( *c
1a1c0 70 3d 3d 27 24 27 20 26 26 20 63 70 5b 31 5d 3d  p=='$' && cp[1]=
1a1d0 3d 27 24 27 20 29 7b 0a 20 20 20 20 20 66 70 72  ='$' ){.     fpr
1a1e0 69 6e 74 66 28 6f 75 74 2c 22 28 79 79 70 6d 69  intf(out,"(yypmi
1a1f0 6e 6f 72 2d 3e 79 79 25 64 29 22 2c 73 70 2d 3e  nor->yy%d)",sp->
1a200 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 63 70 2b  dtnum);.     cp+
1a210 2b 3b 0a 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  +;.     continue
1a220 3b 0a 20 20 20 7d 0a 20 20 20 69 66 28 20 2a 63  ;.   }.   if( *c
1a230 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65  p=='\n' ) (*line
1a240 6e 6f 29 2b 2b 3b 0a 20 20 20 66 70 75 74 63 28  no)++;.   fputc(
1a250 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20 66 70  *cp,out);. }. fp
1a260 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b  rintf(out,"\n");
1a270 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 69   (*lineno)++;. i
1a280 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65  f (!lemp->noline
1a290 6e 6f 73 66 6c 61 67 29 20 7b 20 0a 20 20 20 28  nosflag) { .   (
1a2a0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74  *lineno)++; tplt
1a2b0 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69  _linedir(out,*li
1a2c0 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  neno,lemp->outna
1a2d0 6d 65 29 3b 20 0a 20 7d 0a 20 66 70 72 69 6e 74  me); . }. fprint
1a2e0 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a  f(out,"}\n"); (*
1a2f0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 72 65 74 75  lineno)++;. retu
1a300 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rn;.}../*.** Ret
1a310 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65  urn TRUE (non-ze
1a320 72 6f 29 20 69 66 20 74 68 65 20 67 69 76 65 6e  ro) if the given
1a330 20 73 79 6d 62 6f 6c 20 68 61 73 20 61 20 64 65   symbol has a de
1a340 73 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74  structor..*/.int
1a350 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28   has_destructor(
1a360 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
1a370 70 2c 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p, struct lemon 
1a380 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 72  *lemp).{.  int r
1a390 65 74 3b 0a 20 20 69 66 28 20 73 70 2d 3e 74 79  et;.  if( sp->ty
1a3a0 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
1a3b0 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e      ret = lemp->
1a3c0 74 6f 6b 65 6e 64 65 73 74 21 3d 30 3b 0a 20 20  tokendest!=0;.  
1a3d0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 20 3d  }else{.    ret =
1a3e0 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 21 3d   lemp->vardest!=
1a3f0 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63  0 || sp->destruc
1a400 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65  tor!=0;.  }.  re
1a410 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
1a420 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20 74  ** Append text t
1a430 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  o a dynamically 
1a440 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69 6e 67  allocated string
1a450 2e 20 20 49 66 20 7a 54 65 78 74 20 69 73 20 30  .  If zText is 0
1a460 20 74 68 65 6e 0a 2a 2a 20 72 65 73 65 74 20 74   then.** reset t
1a470 68 65 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20  he string to be 
1a480 65 6d 70 74 79 20 61 67 61 69 6e 2e 20 20 41 6c  empty again.  Al
1a490 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
1a4a0 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 0a 2a 2a  complete text.**
1a4b0 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 28   of the string (
1a4c0 77 68 69 63 68 20 69 73 20 6f 76 65 72 77 72 69  which is overwri
1a4d0 74 74 65 6e 20 77 69 74 68 20 65 61 63 68 20 63  tten with each c
1a4e0 61 6c 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79  all)..**.** n by
1a4f0 74 65 73 20 6f 66 20 7a 54 65 78 74 20 61 72 65  tes of zText are
1a500 20 73 74 6f 72 65 64 2e 20 20 49 66 20 6e 3d 3d   stored.  If n==
1a510 30 20 74 68 65 6e 20 61 6c 6c 20 6f 66 20 7a 54  0 then all of zT
1a520 65 78 74 20 75 70 20 74 6f 20 74 68 65 20 66 69  ext up to the fi
1a530 72 73 74 0a 2a 2a 20 5c 30 30 30 20 74 65 72 6d  rst.** \000 term
1a540 69 6e 61 74 6f 72 20 69 73 20 73 74 6f 72 65 64  inator is stored
1a550 2e 20 20 7a 54 65 78 74 20 63 61 6e 20 63 6f 6e  .  zText can con
1a560 74 61 69 6e 20 75 70 20 74 6f 20 74 77 6f 20 69  tain up to two i
1a570 6e 73 74 61 6e 63 65 73 20 6f 66 0a 2a 2a 20 25  nstances of.** %
1a580 64 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20 6f  d.  The values o
1a590 66 20 70 31 20 61 6e 64 20 70 32 20 61 72 65 20  f p1 and p2 are 
1a5a0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1a5b0 20 66 69 72 73 74 20 61 6e 64 20 73 65 63 6f 6e   first and secon
1a5c0 64 0a 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49  d.** %d..**.** I
1a5d0 66 20 6e 3d 3d 2d 31 2c 20 74 68 65 6e 20 74 68  f n==-1, then th
1a5e0 65 20 70 72 65 76 69 6f 75 73 20 63 68 61 72 61  e previous chara
1a5f0 63 74 65 72 20 69 73 20 6f 76 65 72 77 72 69 74  cter is overwrit
1a600 74 65 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ten..*/.PRIVATE 
1a610 63 68 61 72 20 2a 61 70 70 65 6e 64 5f 73 74 72  char *append_str
1a620 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
1a630 78 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 70  xt, int n, int p
1a640 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 73 74  1, int p2){.  st
1a650 61 74 69 63 20 63 68 61 72 20 65 6d 70 74 79 5b  atic char empty[
1a660 31 5d 20 3d 20 7b 20 30 20 7d 3b 0a 20 20 73 74  1] = { 0 };.  st
1a670 61 74 69 63 20 63 68 61 72 20 2a 7a 20 3d 20 30  atic char *z = 0
1a680 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  ;.  static int a
1a690 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 73 74  lloced = 0;.  st
1a6a0 61 74 69 63 20 69 6e 74 20 75 73 65 64 20 3d 20  atic int used = 
1a6b0 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68  0;.  int c;.  ch
1a6c0 61 72 20 7a 49 6e 74 5b 34 30 5d 3b 0a 20 20 69  ar zInt[40];.  i
1a6d0 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20  f( zText==0 ){. 
1a6e0 20 20 20 69 66 28 20 75 73 65 64 3d 3d 30 20 26     if( used==0 &
1a6f0 26 20 7a 21 3d 30 20 29 20 7a 5b 30 5d 20 3d 20  & z!=0 ) z[0] = 
1a700 30 3b 0a 20 20 20 20 75 73 65 64 20 3d 20 30 3b  0;.    used = 0;
1a710 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 3b 0a 20  .    return z;. 
1a720 20 7d 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b   }.  if( n<=0 ){
1a730 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a  .    if( n<0 ){.
1a740 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6e 3b        used += n;
1a750 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75  .      assert( u
1a760 73 65 64 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  sed>=0 );.    }.
1a770 20 20 20 20 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72      n = lemonStr
1a780 6c 65 6e 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a  len(zText);.  }.
1a790 20 20 69 66 28 20 28 69 6e 74 29 20 28 6e 2b 73    if( (int) (n+s
1a7a0 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 2b 75 73  izeof(zInt)*2+us
1a7b0 65 64 29 20 3e 3d 20 61 6c 6c 6f 63 65 64 20 29  ed) >= alloced )
1a7c0 7b 0a 20 20 20 20 61 6c 6c 6f 63 65 64 20 3d 20  {.    alloced = 
1a7d0 6e 20 2b 20 73 69 7a 65 6f 66 28 7a 49 6e 74 29  n + sizeof(zInt)
1a7e0 2a 32 20 2b 20 75 73 65 64 20 2b 20 32 30 30 3b  *2 + used + 200;
1a7f0 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a  .    z = (char *
1a800 29 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20 61 6c  ) realloc(z,  al
1a810 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20 69 66  loced);.  }.  if
1a820 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( z==0 ) return 
1a830 65 6d 70 74 79 3b 0a 20 20 77 68 69 6c 65 28 20  empty;.  while( 
1a840 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 63  n-- > 0 ){.    c
1a850 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b 0a 20   = *(zText++);. 
1a860 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26     if( c=='%' &&
1a870 20 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b 30 5d   n>0 && zText[0]
1a880 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20 20 6c  =='d' ){.      l
1a890 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a 49 6e  emon_sprintf(zIn
1a8a0 74 2c 20 22 25 64 22 2c 20 70 31 29 3b 0a 20 20  t, "%d", p1);.  
1a8b0 20 20 20 20 70 31 20 3d 20 70 32 3b 0a 20 20 20      p1 = p2;.   
1a8c0 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28     lemon_strcpy(
1a8d0 26 7a 5b 75 73 65 64 5d 2c 20 7a 49 6e 74 29 3b  &z[used], zInt);
1a8e0 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6c  .      used += l
1a8f0 65 6d 6f 6e 53 74 72 6c 65 6e 28 26 7a 5b 75 73  emonStrlen(&z[us
1a900 65 64 5d 29 3b 0a 20 20 20 20 20 20 7a 54 65 78  ed]);.      zTex
1a910 74 2b 2b 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  t++;.      n--;.
1a920 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a930 20 7a 5b 75 73 65 64 2b 2b 5d 20 3d 20 28 63 68   z[used++] = (ch
1a940 61 72 29 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ar)c;.    }.  }.
1a950 20 20 7a 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20    z[used] = 0;. 
1a960 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
1a970 0a 2a 2a 20 57 72 69 74 65 20 61 6e 64 20 74 72  .** Write and tr
1a980 61 6e 73 66 6f 72 6d 20 74 68 65 20 72 70 2d 3e  ansform the rp->
1a990 63 6f 64 65 20 73 74 72 69 6e 67 20 73 6f 20 74  code string so t
1a9a0 68 61 74 20 73 79 6d 62 6f 6c 73 20 61 72 65 20  hat symbols are 
1a9b0 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 50 6f 70  expanded..** Pop
1a9c0 75 6c 61 74 65 20 74 68 65 20 72 70 2d 3e 63 6f  ulate the rp->co
1a9d0 64 65 50 72 65 66 69 78 20 61 6e 64 20 72 70 2d  dePrefix and rp-
1a9e0 3e 63 6f 64 65 53 75 66 66 69 78 20 73 74 72 69  >codeSuffix stri
1a9f0 6e 67 73 2c 20 61 73 20 61 70 70 72 6f 70 72 69  ngs, as appropri
1aa00 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
1aa10 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 61 6e  n 1 if the expan
1aa20 64 65 64 20 63 6f 64 65 20 72 65 71 75 69 72 65  ded code require
1aa30 73 20 74 68 61 74 20 22 79 79 6c 68 73 6d 69 6e  s that "yylhsmin
1aa40 6f 72 22 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  or" local variab
1aa50 6c 65 0a 2a 2a 20 74 6f 20 62 65 20 64 65 66 69  le.** to be defi
1aa60 6e 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ned..*/.PRIVATE 
1aa70 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f  int translate_co
1aa80 64 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  de(struct lemon 
1aa90 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 72 75  *lemp, struct ru
1aaa0 6c 65 20 2a 72 70 29 7b 0a 20 20 63 68 61 72 20  le *rp){.  char 
1aab0 2a 63 70 2c 20 2a 78 70 3b 0a 20 20 69 6e 74 20  *cp, *xp;.  int 
1aac0 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  i;.  int rc = 0;
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1aae0 72 75 65 20 69 66 20 79 79 6c 68 73 6d 69 6e 6f  rue if yylhsmino
1aaf0 72 20 69 73 20 75 73 65 64 20 2a 2f 0a 20 20 69  r is used */.  i
1ab00 6e 74 20 64 6f 6e 74 55 73 65 52 68 73 30 20 3d  nt dontUseRhs0 =
1ab10 20 30 3b 20 20 20 2f 2a 20 49 66 20 74 72 75 65   0;   /* If true
1ab20 2c 20 75 73 65 20 6f 66 20 6c 65 66 74 2d 6d 6f  , use of left-mo
1ab30 73 74 20 52 48 53 20 6c 61 62 65 6c 20 69 73 20  st RHS label is 
1ab40 69 6c 6c 65 67 61 6c 20 2a 2f 0a 20 20 63 6f 6e  illegal */.  con
1ab50 73 74 20 63 68 61 72 20 2a 7a 53 6b 69 70 20 3d  st char *zSkip =
1ab60 20 30 3b 20 2f 2a 20 54 68 65 20 7a 4f 76 77 72   0; /* The zOvwr
1ab70 74 20 63 6f 6d 6d 65 6e 74 20 77 69 74 68 69 6e  t comment within
1ab80 20 72 70 2d 3e 63 6f 64 65 2c 20 6f 72 20 4e 55   rp->code, or NU
1ab90 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 6c 68 73  LL */.  char lhs
1aba0 75 73 65 64 20 3d 20 30 3b 20 20 20 20 20 20 2f  used = 0;      /
1abb0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 4c 48  * True if the LH
1abc0 53 20 65 6c 65 6d 65 6e 74 20 68 61 73 20 62 65  S element has be
1abd0 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61  en used */.  cha
1abe0 72 20 6c 68 73 64 69 72 65 63 74 3b 20 20 20 20  r lhsdirect;    
1abf0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 4c      /* True if L
1ac00 48 53 20 77 72 69 74 65 73 20 64 69 72 65 63 74  HS writes direct
1ac10 6c 79 20 69 6e 74 6f 20 73 74 61 63 6b 20 2a 2f  ly into stack */
1ac20 0a 20 20 63 68 61 72 20 75 73 65 64 5b 4d 41 58  .  char used[MAX
1ac30 52 48 53 5d 3b 20 20 20 20 20 2f 2a 20 54 72 75  RHS];     /* Tru
1ac40 65 20 66 6f 72 20 65 61 63 68 20 52 48 53 20 65  e for each RHS e
1ac50 6c 65 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  lement which is 
1ac60 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 7a  used */.  char z
1ac70 4c 68 73 5b 35 30 5d 3b 20 20 20 20 20 20 20 20  Lhs[50];        
1ac80 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
1ac90 4c 48 53 20 73 79 6d 62 6f 6c 20 69 6e 74 6f 20  LHS symbol into 
1aca0 74 68 69 73 20 73 74 72 69 6e 67 20 2a 2f 0a 20  this string */. 
1acb0 20 63 68 61 72 20 7a 4f 76 77 72 74 5b 39 30 30   char zOvwrt[900
1acc0 5d 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65  ];      /* Comme
1acd0 6e 74 20 74 68 61 74 20 74 6f 20 61 6c 6c 6f 77  nt that to allow
1ace0 20 4c 48 53 20 74 6f 20 6f 76 65 72 77 72 69 74   LHS to overwrit
1acf0 65 20 52 48 53 20 2a 2f 0a 0a 20 20 66 6f 72 28  e RHS */..  for(
1ad00 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
1ad10 20 69 2b 2b 29 20 75 73 65 64 5b 69 5d 20 3d 20   i++) used[i] = 
1ad20 30 3b 0a 20 20 6c 68 73 75 73 65 64 20 3d 20 30  0;.  lhsused = 0
1ad30 3b 0a 0a 20 20 69 66 28 20 72 70 2d 3e 63 6f 64  ;..  if( rp->cod
1ad40 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  e==0 ){.    stat
1ad50 69 63 20 63 68 61 72 20 6e 65 77 6c 69 6e 65 73  ic char newlines
1ad60 74 72 5b 32 5d 20 3d 20 7b 20 27 5c 6e 27 2c 20  tr[2] = { '\n', 
1ad70 27 5c 30 27 20 7d 3b 0a 20 20 20 20 72 70 2d 3e  '\0' };.    rp->
1ad80 63 6f 64 65 20 3d 20 6e 65 77 6c 69 6e 65 73 74  code = newlinest
1ad90 72 3b 0a 20 20 20 20 72 70 2d 3e 6c 69 6e 65 20  r;.    rp->line 
1ada0 3d 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 3b 0a  = rp->ruleline;.
1adb0 20 20 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d      rp->noCode =
1adc0 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
1add0 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d 20 30 3b   rp->noCode = 0;
1ade0 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 70 2d  .  }...  if( rp-
1adf0 3e 6e 72 68 73 3d 3d 30 20 29 7b 0a 20 20 20 20  >nrhs==0 ){.    
1ae00 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1ae10 6e 6f 20 52 48 53 20 73 79 6d 62 6f 6c 73 2c 20  no RHS symbols, 
1ae20 74 68 65 6e 20 77 72 69 74 69 6e 67 20 64 69 72  then writing dir
1ae30 65 63 74 6c 79 20 74 6f 20 74 68 65 20 4c 48 53  ectly to the LHS
1ae40 20 69 73 20 6f 6b 20 2a 2f 0a 20 20 20 20 6c 68   is ok */.    lh
1ae50 73 64 69 72 65 63 74 20 3d 20 31 3b 0a 20 20 7d  sdirect = 1;.  }
1ae60 65 6c 73 65 20 69 66 28 20 72 70 2d 3e 72 68 73  else if( rp->rhs
1ae70 61 6c 69 61 73 5b 30 5d 3d 3d 30 20 29 7b 0a 20  alias[0]==0 ){. 
1ae80 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 2d 6d     /* The left-m
1ae90 6f 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 68  ost RHS symbol h
1aea0 61 73 20 6e 6f 20 76 61 6c 75 65 2e 20 20 4c 48  as no value.  LH
1aeb0 53 20 64 69 72 65 63 74 20 69 73 20 6f 6b 2e 20  S direct is ok. 
1aec0 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 65 20 68   But.    ** we h
1aed0 61 76 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 20  ave to call the 
1aee0 64 69 73 74 72 75 63 74 6f 72 20 6f 6e 20 74 68  distructor on th
1aef0 65 20 52 48 53 20 73 79 6d 62 6f 6c 20 66 69 72  e RHS symbol fir
1af00 73 74 2e 20 2a 2f 0a 20 20 20 20 6c 68 73 64 69  st. */.    lhsdi
1af10 72 65 63 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  rect = 1;.    if
1af20 28 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72  ( has_destructor
1af30 28 72 70 2d 3e 72 68 73 5b 30 5d 2c 6c 65 6d 70  (rp->rhs[0],lemp
1af40 29 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e  ) ){.      appen
1af50 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a  d_str(0,0,0,0);.
1af60 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
1af70 28 22 20 20 79 79 5f 64 65 73 74 72 75 63 74 6f  ("  yy_destructo
1af80 72 28 79 79 70 50 61 72 73 65 72 2c 25 64 2c 26  r(yypParser,%d,&
1af90 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29  yymsp[%d].minor)
1afa0 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20 20  ;\n", 0,.       
1afb0 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
1afc0 73 5b 30 5d 2d 3e 69 6e 64 65 78 2c 31 2d 72 70  s[0]->index,1-rp
1afd0 2d 3e 6e 72 68 73 29 3b 0a 20 20 20 20 20 20 72  ->nrhs);.      r
1afe0 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 20 3d 20  p->codePrefix = 
1aff0 53 74 72 73 61 66 65 28 61 70 70 65 6e 64 5f 73  Strsafe(append_s
1b000 74 72 28 30 2c 30 2c 30 2c 30 29 29 3b 0a 20 20  tr(0,0,0,0));.  
1b010 20 20 20 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 3d      rp->noCode =
1b020 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
1b030 65 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69  e if( rp->lhsali
1b040 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  as==0 ){.    /* 
1b050 54 68 65 72 65 20 69 73 20 6e 6f 20 4c 48 53 20  There is no LHS 
1b060 76 61 6c 75 65 20 73 79 6d 62 6f 6c 2e 20 2a 2f  value symbol. */
1b070 0a 20 20 20 20 6c 68 73 64 69 72 65 63 74 20 3d  .    lhsdirect =
1b080 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
1b090 73 74 72 63 6d 70 28 72 70 2d 3e 6c 68 73 61 6c  strcmp(rp->lhsal
1b0a0 69 61 73 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  ias,rp->rhsalias
1b0b0 5b 30 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  [0])==0 ){.    /
1b0c0 2a 20 54 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c  * The LHS symbol
1b0d0 20 61 6e 64 20 74 68 65 20 6c 65 66 74 2d 6d 6f   and the left-mo
1b0e0 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 61 72  st RHS symbol ar
1b0f0 65 20 74 68 65 20 73 61 6d 65 2c 20 73 6f 20 0a  e the same, so .
1b100 20 20 20 20 2a 2a 20 64 69 72 65 63 74 20 77 72      ** direct wr
1b110 69 74 69 6e 67 20 69 73 20 61 6c 6c 6f 77 65 64  iting is allowed
1b120 20 2a 2f 0a 20 20 20 20 6c 68 73 64 69 72 65 63   */.    lhsdirec
1b130 74 20 3d 20 31 3b 0a 20 20 20 20 6c 68 73 75 73  t = 1;.    lhsus
1b140 65 64 20 3d 20 31 3b 0a 20 20 20 20 75 73 65 64  ed = 1;.    used
1b150 5b 30 5d 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  [0] = 1;.    if(
1b160 20 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 21   rp->lhs->dtnum!
1b170 3d 72 70 2d 3e 72 68 73 5b 30 5d 2d 3e 64 74 6e  =rp->rhs[0]->dtn
1b180 75 6d 20 29 7b 0a 20 20 20 20 20 20 45 72 72 6f  um ){.      Erro
1b190 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
1b1a0 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65  ame,rp->ruleline
1b1b0 2c 0a 20 20 20 20 20 20 20 20 22 25 73 28 25 73  ,.        "%s(%s
1b1c0 29 20 61 6e 64 20 25 73 28 25 73 29 20 73 68 61  ) and %s(%s) sha
1b1d0 72 65 20 74 68 65 20 73 61 6d 65 20 6c 61 62 65  re the same labe
1b1e0 6c 20 62 75 74 20 68 61 76 65 20 22 0a 20 20 20  l but have ".   
1b1f0 20 20 20 20 20 22 64 69 66 66 65 72 65 6e 74 20       "different 
1b200 64 61 74 61 74 79 70 65 73 2e 22 2c 0a 20 20 20  datatypes.",.   
1b210 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61       rp->lhs->na
1b220 6d 65 2c 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  me, rp->lhsalias
1b230 2c 20 72 70 2d 3e 72 68 73 5b 30 5d 2d 3e 6e 61  , rp->rhs[0]->na
1b240 6d 65 2c 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  me, rp->rhsalias
1b250 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70  [0]);.      lemp
1b260 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
1b270 20 20 7d 20 20 20 20 0a 20 20 7d 65 6c 73 65 7b    }    .  }else{
1b280 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e  .    lemon_sprin
1b290 74 66 28 7a 4f 76 77 72 74 2c 20 22 2f 2a 25 73  tf(zOvwrt, "/*%s
1b2a0 2d 6f 76 65 72 77 72 69 74 65 73 2d 25 73 2a 2f  -overwrites-%s*/
1b2b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1b2c0 20 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61       rp->lhsalia
1b2d0 73 2c 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  s, rp->rhsalias[
1b2e0 30 5d 29 3b 0a 20 20 20 20 7a 53 6b 69 70 20 3d  0]);.    zSkip =
1b2f0 20 73 74 72 73 74 72 28 72 70 2d 3e 63 6f 64 65   strstr(rp->code
1b300 2c 20 7a 4f 76 77 72 74 29 3b 0a 20 20 20 20 69  , zOvwrt);.    i
1b310 66 28 20 7a 53 6b 69 70 21 3d 30 20 29 7b 0a 20  f( zSkip!=0 ){. 
1b320 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65       /* The code
1b330 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 70 65 63   contains a spec
1b340 69 61 6c 20 63 6f 6d 6d 65 6e 74 20 74 68 61 74  ial comment that
1b350 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1b360 69 74 20 69 73 20 73 61 66 65 0a 20 20 20 20 20  it is safe.     
1b370 20 2a 2a 20 66 6f 72 20 74 68 65 20 4c 48 53 20   ** for the LHS 
1b380 6c 61 62 65 6c 20 74 6f 20 6f 76 65 72 77 72 69  label to overwri
1b390 74 65 20 6c 65 66 74 2d 6d 6f 73 74 20 52 48 53  te left-most RHS
1b3a0 20 6c 61 62 65 6c 2e 20 2a 2f 0a 20 20 20 20 20   label. */.     
1b3b0 20 6c 68 73 64 69 72 65 63 74 20 3d 20 31 3b 0a   lhsdirect = 1;.
1b3c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b3d0 20 6c 68 73 64 69 72 65 63 74 20 3d 20 30 3b 0a   lhsdirect = 0;.
1b3e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1b3f0 6c 68 73 64 69 72 65 63 74 20 29 7b 0a 20 20 20  lhsdirect ){.   
1b400 20 73 70 72 69 6e 74 66 28 7a 4c 68 73 2c 20 22   sprintf(zLhs, "
1b410 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e  yymsp[%d].minor.
1b420 79 79 25 64 22 2c 31 2d 72 70 2d 3e 6e 72 68 73  yy%d",1-rp->nrhs
1b430 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 29  ,rp->lhs->dtnum)
1b440 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1b450 63 20 3d 20 31 3b 0a 20 20 20 20 73 70 72 69 6e  c = 1;.    sprin
1b460 74 66 28 7a 4c 68 73 2c 20 22 79 79 6c 68 73 6d  tf(zLhs, "yylhsm
1b470 69 6e 6f 72 2e 79 79 25 64 22 2c 72 70 2d 3e 6c  inor.yy%d",rp->l
1b480 68 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 7d 0a  hs->dtnum);.  }.
1b490 0a 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c  .  append_str(0,
1b4a0 30 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a 20 54 68  0,0,0);..  /* Th
1b4b0 69 73 20 63 6f 6e 73 74 20 63 61 73 74 20 69 73  is const cast is
1b4c0 20 77 72 6f 6e 67 20 62 75 74 20 68 61 72 6d 6c   wrong but harml
1b4d0 65 73 73 2c 20 69 66 20 77 65 27 72 65 20 63 61  ess, if we're ca
1b4e0 72 65 66 75 6c 2e 20 2a 2f 0a 20 20 66 6f 72 28  reful. */.  for(
1b4f0 63 70 3d 28 63 68 61 72 20 2a 29 72 70 2d 3e 63  cp=(char *)rp->c
1b500 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b  ode; *cp; cp++){
1b510 0a 20 20 20 20 69 66 28 20 63 70 3d 3d 7a 53 6b  .    if( cp==zSk
1b520 69 70 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65  ip ){.      appe
1b530 6e 64 5f 73 74 72 28 7a 4f 76 77 72 74 2c 30 2c  nd_str(zOvwrt,0,
1b540 30 2c 30 29 3b 0a 20 20 20 20 20 20 63 70 20 2b  0,0);.      cp +
1b550 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f  = lemonStrlen(zO
1b560 76 77 72 74 29 2d 31 3b 0a 20 20 20 20 20 20 64  vwrt)-1;.      d
1b570 6f 6e 74 55 73 65 52 68 73 30 20 3d 20 31 3b 0a  ontUseRhs0 = 1;.
1b580 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1b590 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
1b5a0 41 4c 50 48 41 28 2a 63 70 29 20 26 26 20 28 63  ALPHA(*cp) && (c
1b5b0 70 3d 3d 72 70 2d 3e 63 6f 64 65 20 7c 7c 20 28  p==rp->code || (
1b5c0 21 49 53 41 4c 4e 55 4d 28 63 70 5b 2d 31 5d 29  !ISALNUM(cp[-1])
1b5d0 20 26 26 20 63 70 5b 2d 31 5d 21 3d 27 5f 27 29   && cp[-1]!='_')
1b5e0 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ) ){.      char 
1b5f0 73 61 76 65 64 3b 0a 20 20 20 20 20 20 66 6f 72  saved;.      for
1b600 28 78 70 3d 20 26 63 70 5b 31 5d 3b 20 49 53 41  (xp= &cp[1]; ISA
1b610 4c 4e 55 4d 28 2a 78 70 29 20 7c 7c 20 2a 78 70  LNUM(*xp) || *xp
1b620 3d 3d 27 5f 27 3b 20 78 70 2b 2b 29 3b 0a 20 20  =='_'; xp++);.  
1b630 20 20 20 20 73 61 76 65 64 20 3d 20 2a 78 70 3b      saved = *xp;
1b640 0a 20 20 20 20 20 20 2a 78 70 20 3d 20 30 3b 0a  .      *xp = 0;.
1b650 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68        if( rp->lh
1b660 73 61 6c 69 61 73 20 26 26 20 73 74 72 63 6d 70  salias && strcmp
1b670 28 63 70 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73  (cp,rp->lhsalias
1b680 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1b690 61 70 70 65 6e 64 5f 73 74 72 28 7a 4c 68 73 2c  append_str(zLhs,
1b6a0 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  0,0,0);.        
1b6b0 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20 20  cp = xp;.       
1b6c0 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a 20 20   lhsused = 1;.  
1b6d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b6e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
1b6f0 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
1b700 20 20 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e          if( rp->
1b710 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26 20 73  rhsalias[i] && s
1b720 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 72 68 73  trcmp(cp,rp->rhs
1b730 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a  alias[i])==0 ){.
1b740 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b750 69 3d 3d 30 20 26 26 20 64 6f 6e 74 55 73 65 52  i==0 && dontUseR
1b760 68 73 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  hs0 ){.         
1b770 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
1b780 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
1b790 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20  >ruleline,.     
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 22 4c 61 62              "Lab
1b7b0 65 6c 20 25 73 20 75 73 65 64 20 61 66 74 65 72  el %s used after
1b7c0 20 27 25 73 27 2e 22 2c 0a 20 20 20 20 20 20 20   '%s'.",.       
1b7d0 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
1b7e0 73 61 6c 69 61 73 5b 30 5d 2c 20 7a 4f 76 77 72  salias[0], zOvwr
1b7f0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
1b800 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
1b810 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1b820 7d 65 6c 73 65 20 69 66 28 20 63 70 21 3d 72 70  }else if( cp!=rp
1b830 2d 3e 63 6f 64 65 20 26 26 20 63 70 5b 2d 31 5d  ->code && cp[-1]
1b840 3d 3d 27 40 27 20 29 7b 0a 20 20 20 20 20 20 20  =='@' ){.       
1b850 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
1b860 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20   argument is of 
1b870 74 68 65 20 66 6f 72 6d 20 40 58 20 74 68 65 6e  the form @X then
1b880 20 73 75 62 73 74 69 74 75 74 65 64 0a 20 20 20   substituted.   
1b890 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1b8a0 65 20 74 6f 6b 65 6e 20 6e 75 6d 62 65 72 20 6f  e token number o
1b8b0 66 20 58 2c 20 6e 6f 74 20 74 68 65 20 76 61 6c  f X, not the val
1b8c0 75 65 20 6f 66 20 58 20 2a 2f 0a 20 20 20 20 20  ue of X */.     
1b8d0 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f           append_
1b8e0 73 74 72 28 22 79 79 6d 73 70 5b 25 64 5d 2e 6d  str("yymsp[%d].m
1b8f0 61 6a 6f 72 22 2c 2d 31 2c 69 2d 72 70 2d 3e 6e  ajor",-1,i-rp->n
1b900 72 68 73 2b 31 2c 30 29 3b 0a 20 20 20 20 20 20  rhs+1,0);.      
1b910 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b920 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
1b930 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72  t symbol *sp = r
1b940 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
1b950 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 74 6e           int dtn
1b960 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  um;.            
1b970 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
1b980 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
1b990 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b9a0 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e 73 75 62   dtnum = sp->sub
1b9b0 73 79 6d 5b 30 5d 2d 3e 64 74 6e 75 6d 3b 0a 20  sym[0]->dtnum;. 
1b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
1b9d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1b9e0 20 20 20 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e      dtnum = sp->
1b9f0 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  dtnum;.         
1ba00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1ba10 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28       append_str(
1ba20 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72  "yymsp[%d].minor
1ba30 2e 79 79 25 64 22 2c 30 2c 69 2d 72 70 2d 3e 6e  .yy%d",0,i-rp->n
1ba40 72 68 73 2b 31 2c 20 64 74 6e 75 6d 29 3b 0a 20  rhs+1, dtnum);. 
1ba50 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1ba60 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 78 70           cp = xp
1ba70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ;.            us
1ba80 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 20  ed[i] = 1;.     
1ba90 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1baa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bab0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1bac0 20 20 2a 78 70 20 3d 20 73 61 76 65 64 3b 0a 20    *xp = saved;. 
1bad0 20 20 20 7d 0a 20 20 20 20 61 70 70 65 6e 64 5f     }.    append_
1bae0 73 74 72 28 63 70 2c 20 31 2c 20 30 2c 20 30 29  str(cp, 1, 0, 0)
1baf0 3b 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f  ;.  } /* End loo
1bb00 70 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 69 6e 20  p */..  /* Main 
1bb10 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
1bb20 63 6f 6d 70 6c 65 74 65 64 20 2a 2f 0a 20 20 63  completed */.  c
1bb30 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72 28 30  p = append_str(0
1bb40 2c 30 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 63  ,0,0,0);.  if( c
1bb50 70 20 26 26 20 63 70 5b 30 5d 20 29 20 72 70 2d  p && cp[0] ) rp-
1bb60 3e 63 6f 64 65 20 3d 20 53 74 72 73 61 66 65 28  >code = Strsafe(
1bb70 63 70 29 3b 0a 20 20 61 70 70 65 6e 64 5f 73 74  cp);.  append_st
1bb80 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 0a 20 20 2f  r(0,0,0,0);..  /
1bb90 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
1bba0 73 75 72 65 20 74 68 65 20 4c 48 53 20 68 61 73  sure the LHS has
1bbb0 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20   been used */.  
1bbc0 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
1bbd0 20 26 26 20 21 6c 68 73 75 73 65 64 20 29 7b 0a   && !lhsused ){.
1bbe0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
1bbf0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
1bc00 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20  ruleline,.      
1bc10 22 4c 61 62 65 6c 20 5c 22 25 73 5c 22 20 66 6f  "Label \"%s\" fo
1bc20 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20  r \"%s(%s)\" is 
1bc30 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20  never used.",.  
1bc40 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69        rp->lhsali
1bc50 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65  as,rp->lhs->name
1bc60 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a  ,rp->lhsalias);.
1bc70 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
1bc80 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nt++;.  }..  /* 
1bc90 47 65 6e 65 72 61 74 65 20 64 65 73 74 72 75 63  Generate destruc
1bca0 74 6f 72 20 63 6f 64 65 20 66 6f 72 20 52 48 53  tor code for RHS
1bcb0 20 6d 69 6e 6f 72 20 76 61 6c 75 65 73 20 77 68   minor values wh
1bcc0 69 63 68 20 61 72 65 20 6e 6f 74 20 72 65 66 65  ich are not refe
1bcd0 72 65 6e 63 65 64 2e 0a 20 20 2a 2a 20 47 65 6e  renced..  ** Gen
1bce0 65 72 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  erate error mess
1bcf0 61 67 65 73 20 66 6f 72 20 75 6e 75 73 65 64 20  ages for unused 
1bd00 6c 61 62 65 6c 73 20 61 6e 64 20 64 75 70 6c 69  labels and dupli
1bd10 63 61 74 65 20 6c 61 62 65 6c 73 2e 0a 20 20 2a  cate labels..  *
1bd20 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72  /.  for(i=0; i<r
1bd30 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
1bd40 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c     if( rp->rhsal
1bd50 69 61 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  ias[i] ){.      
1bd60 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
1bd70 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
1bd80 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69    if( rp->lhsali
1bd90 61 73 20 26 26 20 73 74 72 63 6d 70 28 72 70 2d  as && strcmp(rp-
1bda0 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 72 68  >lhsalias,rp->rh
1bdb0 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20 29 7b  salias[i])==0 ){
1bdc0 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
1bdd0 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
1bde0 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c  me,rp->ruleline,
1bdf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73  .            "%s
1be00 28 25 73 29 20 68 61 73 20 74 68 65 20 73 61 6d  (%s) has the sam
1be10 65 20 6c 61 62 65 6c 20 61 73 20 74 68 65 20 4c  e label as the L
1be20 48 53 20 62 75 74 20 69 73 20 6e 6f 74 20 74 68  HS but is not th
1be30 65 20 6c 65 66 74 2d 6d 6f 73 74 20 22 0a 20 20  e left-most ".  
1be40 20 20 20 20 20 20 20 20 20 20 22 73 79 6d 62 6f            "symbo
1be50 6c 20 6f 6e 20 74 68 65 20 52 48 53 2e 22 2c 0a  l on the RHS.",.
1be60 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e              rp->
1be70 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 20 72 70  rhs[i]->name, rp
1be80 2d 3e 72 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->rhsalias);.   
1be90 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72         lemp->err
1bea0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
1beb0 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a   }.        for(j
1bec0 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
1bed0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 70 2d           if( rp-
1bee0 3e 72 68 73 61 6c 69 61 73 5b 6a 5d 20 26 26 20  >rhsalias[j] && 
1bef0 73 74 72 63 6d 70 28 72 70 2d 3e 72 68 73 61 6c  strcmp(rp->rhsal
1bf00 69 61 73 5b 6a 5d 2c 72 70 2d 3e 72 68 73 61 6c  ias[j],rp->rhsal
1bf10 69 61 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20  ias[i])==0 ){.  
1bf20 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
1bf30 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  sg(lemp->filenam
1bf40 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a  e,rp->ruleline,.
1bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c                "L
1bf60 61 62 65 6c 20 25 73 20 75 73 65 64 20 66 6f 72  abel %s used for
1bf70 20 6d 75 6c 74 69 70 6c 65 20 73 79 6d 62 6f 6c   multiple symbol
1bf80 73 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20  s on the RHS of 
1bf90 61 20 72 75 6c 65 2e 22 2c 0a 20 20 20 20 20 20  a rule.",.      
1bfa0 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61          rp->rhsa
1bfb0 6c 69 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20  lias[i]);.      
1bfc0 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
1bfd0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
1bfe0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1bff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1c000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c010 66 28 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20  f( !used[i] ){. 
1c020 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
1c030 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72  lemp->filename,r
1c040 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20  p->ruleline,.   
1c050 20 20 20 20 20 20 20 22 4c 61 62 65 6c 20 25 73         "Label %s
1c060 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22 20   for \"%s(%s)\" 
1c070 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22 2c  is never used.",
1c080 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72  .          rp->r
1c090 68 73 61 6c 69 61 73 5b 69 5d 2c 72 70 2d 3e 72  hsalias[i],rp->r
1c0a0 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 72 70 2d 3e  hs[i]->name,rp->
1c0b0 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 0a 20 20  rhsalias[i]);.  
1c0c0 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
1c0d0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
1c0e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 3e      }else if( i>
1c0f0 30 20 26 26 20 68 61 73 5f 64 65 73 74 72 75 63  0 && has_destruc
1c100 74 6f 72 28 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c  tor(rp->rhs[i],l
1c110 65 6d 70 29 20 29 7b 0a 20 20 20 20 20 20 61 70  emp) ){.      ap
1c120 70 65 6e 64 5f 73 74 72 28 22 20 20 79 79 5f 64  pend_str("  yy_d
1c130 65 73 74 72 75 63 74 6f 72 28 79 79 70 50 61 72  estructor(yypPar
1c140 73 65 72 2c 25 64 2c 26 79 79 6d 73 70 5b 25 64  ser,%d,&yymsp[%d
1c150 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e 22 2c 20 30 2c  ].minor);\n", 0,
1c160 0a 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68  .         rp->rh
1c170 73 5b 69 5d 2d 3e 69 6e 64 65 78 2c 69 2d 72 70  s[i]->index,i-rp
1c180 2d 3e 6e 72 68 73 2b 31 29 3b 0a 20 20 20 20 7d  ->nrhs+1);.    }
1c190 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 75 6e  .  }..  /* If un
1c1a0 61 62 6c 65 20 74 6f 20 77 72 69 74 65 20 4c 48  able to write LH
1c1b0 53 20 76 61 6c 75 65 73 20 64 69 72 65 63 74 6c  S values directl
1c1c0 79 20 69 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  y into the stack
1c1d0 2c 20 77 72 69 74 65 20 74 68 65 0a 20 20 2a 2a  , write the.  **
1c1e0 20 73 61 76 65 64 20 4c 48 53 20 76 61 6c 75 65   saved LHS value
1c1f0 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 6c   now. */.  if( l
1c200 68 73 64 69 72 65 63 74 3d 3d 30 20 29 7b 0a 20  hsdirect==0 ){. 
1c210 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 20     append_str(" 
1c220 20 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72   yymsp[%d].minor
1c230 2e 79 79 25 64 20 3d 20 22 2c 20 30 2c 20 31 2d  .yy%d = ", 0, 1-
1c240 72 70 2d 3e 6e 72 68 73 2c 20 72 70 2d 3e 6c 68  rp->nrhs, rp->lh
1c250 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 61  s->dtnum);.    a
1c260 70 70 65 6e 64 5f 73 74 72 28 7a 4c 68 73 2c 20  ppend_str(zLhs, 
1c270 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 61 70  0, 0, 0);.    ap
1c280 70 65 6e 64 5f 73 74 72 28 22 3b 5c 6e 22 2c 20  pend_str(";\n", 
1c290 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  0, 0, 0);.  }.. 
1c2a0 20 2f 2a 20 53 75 66 66 69 78 20 63 6f 64 65 20   /* Suffix code 
1c2b0 67 65 6e 65 72 61 74 69 6f 6e 20 63 6f 6d 70 6c  generation compl
1c2c0 65 74 65 20 2a 2f 0a 20 20 63 70 20 3d 20 61 70  ete */.  cp = ap
1c2d0 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30  pend_str(0,0,0,0
1c2e0 29 3b 0a 20 20 69 66 28 20 63 70 20 26 26 20 63  );.  if( cp && c
1c2f0 70 5b 30 5d 20 29 7b 0a 20 20 20 20 72 70 2d 3e  p[0] ){.    rp->
1c300 63 6f 64 65 53 75 66 66 69 78 20 3d 20 53 74 72  codeSuffix = Str
1c310 73 61 66 65 28 63 70 29 3b 0a 20 20 20 20 72 70  safe(cp);.    rp
1c320 2d 3e 6e 6f 43 6f 64 65 20 3d 20 30 3b 0a 20 20  ->noCode = 0;.  
1c330 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1c340 7d 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61  }../* .** Genera
1c350 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
1c360 65 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20  ecutes when the 
1c370 72 75 6c 65 20 22 72 70 22 20 69 73 20 72 65 64  rule "rp" is red
1c380 75 63 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20  uced.  Write.** 
1c390 74 68 65 20 63 6f 64 65 20 74 6f 20 22 6f 75 74  the code to "out
1c3a0 22 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6c 69  ".  Make sure li
1c3b0 6e 65 6e 6f 20 73 74 61 79 73 20 75 70 2d 74 6f  neno stays up-to
1c3c0 2d 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54  -date..*/.PRIVAT
1c3d0 45 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65  E void emit_code
1c3e0 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20  (.  FILE *out,. 
1c3f0 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
1c400 2c 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ,.  struct lemon
1c410 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c   *lemp,.  int *l
1c420 69 6e 65 6e 6f 0a 29 7b 0a 20 63 6f 6e 73 74 20  ineno.){. const 
1c430 63 68 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a 20 53  char *cp;.. /* S
1c440 65 74 75 70 20 63 6f 64 65 20 70 72 69 6f 72 20  etup code prior 
1c450 74 6f 20 74 68 65 20 23 6c 69 6e 65 20 64 69 72  to the #line dir
1c460 65 63 74 69 76 65 20 2a 2f 0a 20 69 66 28 20 72  ective */. if( r
1c470 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 20 26 26  p->codePrefix &&
1c480 20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 5b   rp->codePrefix[
1c490 30 5d 20 29 7b 0a 20 20 20 66 70 72 69 6e 74 66  0] ){.   fprintf
1c4a0 28 6f 75 74 2c 20 22 7b 25 73 22 2c 20 72 70 2d  (out, "{%s", rp-
1c4b0 3e 63 6f 64 65 50 72 65 66 69 78 29 3b 0a 20 20  >codePrefix);.  
1c4c0 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65   for(cp=rp->code
1c4d0 50 72 65 66 69 78 3b 20 2a 63 70 3b 20 63 70 2b  Prefix; *cp; cp+
1c4e0 2b 29 7b 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e  +){ if( *cp=='\n
1c4f0 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ' ) (*lineno)++;
1c500 20 7d 0a 20 7d 0a 0a 20 2f 2a 20 47 65 6e 65 72   }. }.. /* Gener
1c510 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  ate code to do t
1c520 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e  he reduce action
1c530 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64   */. if( rp->cod
1c540 65 20 29 7b 0a 20 20 20 69 66 28 20 21 6c 65 6d  e ){.   if( !lem
1c550 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
1c560 20 29 7b 0a 20 20 20 20 20 28 2a 6c 69 6e 65 6e   ){.     (*linen
1c570 6f 29 2b 2b 3b 0a 20 20 20 20 20 74 70 6c 74 5f  o)++;.     tplt_
1c580 6c 69 6e 65 64 69 72 28 6f 75 74 2c 72 70 2d 3e  linedir(out,rp->
1c590 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  line,lemp->filen
1c5a0 61 6d 65 29 3b 0a 20 20 20 7d 0a 20 20 20 66 70  ame);.   }.   fp
1c5b0 72 69 6e 74 66 28 6f 75 74 2c 22 7b 25 73 22 2c  rintf(out,"{%s",
1c5c0 72 70 2d 3e 63 6f 64 65 29 3b 0a 20 20 20 66 6f  rp->code);.   fo
1c5d0 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a  r(cp=rp->code; *
1c5e0 63 70 3b 20 63 70 2b 2b 29 7b 20 69 66 28 20 2a  cp; cp++){ if( *
1c5f0 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e  cp=='\n' ) (*lin
1c600 65 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 66 70 72  eno)++; }.   fpr
1c610 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b  intf(out,"}\n");
1c620 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
1c630 20 69 66 28 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69   if( !lemp->noli
1c640 6e 65 6e 6f 73 66 6c 61 67 20 29 7b 0a 20 20 20  nenosflag ){.   
1c650 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20    (*lineno)++;. 
1c660 20 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72      tplt_linedir
1c670 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d  (out,*lineno,lem
1c680 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 20  p->outname);.   
1c690 7d 0a 20 7d 0a 0a 20 2f 2a 20 47 65 6e 65 72 61  }. }.. /* Genera
1c6a0 74 65 20 62 72 65 61 6b 64 6f 77 6e 20 63 6f 64  te breakdown cod
1c6b0 65 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 66  e that occurs af
1c6c0 74 65 72 20 74 68 65 20 23 6c 69 6e 65 20 64 69  ter the #line di
1c6d0 72 65 63 74 69 76 65 20 2a 2f 0a 20 69 66 28 20  rective */. if( 
1c6e0 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78 20 26  rp->codeSuffix &
1c6f0 26 20 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78  & rp->codeSuffix
1c700 5b 30 5d 20 29 7b 0a 20 20 20 66 70 72 69 6e 74  [0] ){.   fprint
1c710 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 72 70 2d  f(out, "%s", rp-
1c720 3e 63 6f 64 65 53 75 66 66 69 78 29 3b 0a 20 20  >codeSuffix);.  
1c730 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65   for(cp=rp->code
1c740 53 75 66 66 69 78 3b 20 2a 63 70 3b 20 63 70 2b  Suffix; *cp; cp+
1c750 2b 29 7b 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e  +){ if( *cp=='\n
1c760 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ' ) (*lineno)++;
1c770 20 7d 0a 20 7d 0a 0a 20 69 66 28 20 72 70 2d 3e   }. }.. if( rp->
1c780 63 6f 64 65 50 72 65 66 69 78 20 29 7b 0a 20 20  codePrefix ){.  
1c790 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d   fprintf(out, "}
1c7a0 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n"); (*lineno)+
1c7b0 2b 3b 0a 20 7d 0a 0a 20 72 65 74 75 72 6e 3b 0a  +;. }.. return;.
1c7c0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  }../*.** Print t
1c7d0 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
1c7e0 20 74 68 65 20 75 6e 69 6f 6e 20 75 73 65 64 20   the union used 
1c7f0 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 27 73  for the parser's
1c800 20 64 61 74 61 20 73 74 61 63 6b 2e 0a 2a 2a 20   data stack..** 
1c810 54 68 69 73 20 75 6e 69 6f 6e 20 63 6f 6e 74 61  This union conta
1c820 69 6e 73 20 66 69 65 6c 64 73 20 66 6f 72 20 65  ins fields for e
1c830 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20 64 61  very possible da
1c840 74 61 20 74 79 70 65 20 66 6f 72 20 74 6f 6b 65  ta type for toke
1c850 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f 6e 74 65 72  ns.** and nonter
1c860 6d 69 6e 61 6c 73 2e 20 20 49 6e 20 74 68 65 20  minals.  In the 
1c870 70 72 6f 63 65 73 73 20 6f 66 20 63 6f 6d 70 75  process of compu
1c880 74 69 6e 67 20 61 6e 64 20 70 72 69 6e 74 69 6e  ting and printin
1c890 67 20 74 68 69 73 0a 2a 2a 20 75 6e 69 6f 6e 2c  g this.** union,
1c8a0 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20 22 2e   also set the ".
1c8b0 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66 20  dtnum" field of 
1c8c0 65 76 65 72 79 20 74 65 72 6d 69 6e 61 6c 20 61  every terminal a
1c8d0 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 0a 2a  nd nonterminal.*
1c8e0 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f 0a 76 6f 69  * symbol..*/.voi
1c8f0 64 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e  d print_stack_un
1c900 69 6f 6e 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74  ion(.  FILE *out
1c910 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c920 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
1c930 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 73 74 72   stream */.  str
1c940 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
1c950 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c960 6d 61 69 6e 20 69 6e 66 6f 20 73 74 72 75 63 74  main info struct
1c970 75 72 65 20 66 6f 72 20 74 68 69 73 20 70 61 72  ure for this par
1c980 73 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6c  ser */.  int *pl
1c990 69 6e 65 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  ineno,          
1c9a0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1c9b0 74 6f 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62  to the line numb
1c9c0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 68 66 6c  er */.  int mhfl
1c9d0 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
1c9e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 67      /* True if g
1c9f0 65 6e 65 72 61 74 69 6e 67 20 6d 61 6b 65 68 65  enerating makehe
1ca00 61 64 65 72 73 20 6f 75 74 70 75 74 20 2a 2f 0a  aders output */.
1ca10 29 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20  ){.  int lineno 
1ca20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20 2f  = *plineno;    /
1ca30 2a 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65  * The line numbe
1ca40 72 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  r of the output 
1ca50 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 74 79 70 65  */.  char **type
1ca60 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
1ca70 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65 20 6f  * A hash table o
1ca80 66 20 64 61 74 61 74 79 70 65 73 20 2a 2f 0a 20  f datatypes */. 
1ca90 20 69 6e 74 20 61 72 72 61 79 73 69 7a 65 3b 20   int arraysize; 
1caa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1cab0 7a 65 20 6f 66 20 74 68 65 20 22 74 79 70 65 73  ze of the "types
1cac0 22 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  " array */.  int
1cad0 20 6d 61 78 64 74 6c 65 6e 67 74 68 3b 20 20 20   maxdtlength;   
1cae0 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
1caf0 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e 79 20  m length of any 
1cb00 22 2e 64 61 74 61 74 79 70 65 22 20 66 69 65 6c  ".datatype" fiel
1cb10 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74  d. */.  char *st
1cb20 64 64 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddt;            
1cb30 20 20 2f 2a 20 53 74 61 6e 64 61 72 64 69 7a 65    /* Standardize
1cb40 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 64 61 74  d name for a dat
1cb50 61 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74 20 69  atype */.  int i
1cb60 2c 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ,j;             
1cb70 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1cb80 6e 74 65 72 73 20 2a 2f 0a 20 20 75 6e 73 69 67  nters */.  unsig
1cb90 6e 65 64 20 68 61 73 68 3b 20 20 20 20 20 20 20  ned hash;       
1cba0 20 20 20 20 20 2f 2a 20 46 6f 72 20 68 61 73 68       /* For hash
1cbb0 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
1cbc0 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 6f 6e 73  a type */.  cons
1cbd0 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20  t char *name;   
1cbe0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1cbf0 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 0a   the parser */..
1cc00 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
1cc10 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 79 70  d initialize typ
1cc20 65 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f 63 61 74  es[] and allocat
1cc30 65 20 73 74 64 64 74 5b 5d 20 2a 2f 0a 20 20 61  e stddt[] */.  a
1cc40 72 72 61 79 73 69 7a 65 20 3d 20 6c 65 6d 70 2d  rraysize = lemp-
1cc50 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b 0a 20 20  >nsymbol * 2;.  
1cc60 74 79 70 65 73 20 3d 20 28 63 68 61 72 2a 2a 29  types = (char**)
1cc70 63 61 6c 6c 6f 63 28 20 61 72 72 61 79 73 69 7a  calloc( arraysiz
1cc80 65 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  e, sizeof(char*)
1cc90 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65 73 3d   );.  if( types=
1cca0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
1ccb0 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66  f(stderr,"Out of
1ccc0 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20   memory.\n");.  
1ccd0 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
1cce0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61   for(i=0; i<arra
1ccf0 79 73 69 7a 65 3b 20 69 2b 2b 29 20 74 79 70 65  ysize; i++) type
1cd00 73 5b 69 5d 20 3d 20 30 3b 0a 20 20 6d 61 78 64  s[i] = 0;.  maxd
1cd10 74 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 69  tlength = 0;.  i
1cd20 66 28 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65  f( lemp->vartype
1cd30 20 29 7b 0a 20 20 20 20 6d 61 78 64 74 6c 65 6e   ){.    maxdtlen
1cd40 67 74 68 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  gth = lemonStrle
1cd50 6e 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 29  n(lemp->vartype)
1cd60 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1cd70 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1cd80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1cd90 6c 65 6e 3b 0a 20 20 20 20 73 74 72 75 63 74 20  len;.    struct 
1cda0 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
1cdb0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
1cdc0 20 20 20 69 66 28 20 73 70 2d 3e 64 61 74 61 74     if( sp->datat
1cdd0 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ype==0 ) continu
1cde0 65 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d  e;.    len = lem
1cdf0 6f 6e 53 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74  onStrlen(sp->dat
1ce00 61 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20  atype);.    if( 
1ce10 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20  len>maxdtlength 
1ce20 29 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20  ) maxdtlength = 
1ce30 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74  len;.  }.  stddt
1ce40 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63   = (char*)malloc
1ce50 28 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32 20  ( maxdtlength*2 
1ce60 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 73 74 64  + 1 );.  if( std
1ce70 64 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  dt==0 ){.    fpr
1ce80 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74  intf(stderr,"Out
1ce90 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b   of memory.\n");
1cea0 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
1ceb0 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20 61 20  }..  /* Build a 
1cec0 68 61 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61  hash table of da
1ced0 74 61 74 79 70 65 73 2e 20 54 68 65 20 22 2e 64  tatypes. The ".d
1cee0 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66 20 65  tnum" field of e
1cef0 61 63 68 20 73 79 6d 62 6f 6c 0a 20 20 2a 2a 20  ach symbol.  ** 
1cf00 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  is filled in wit
1cf10 68 20 74 68 65 20 68 61 73 68 20 69 6e 64 65 78  h the hash index
1cf20 20 70 6c 75 73 20 31 2e 20 20 41 20 22 2e 64 74   plus 1.  A ".dt
1cf30 6e 75 6d 22 20 76 61 6c 75 65 20 6f 66 20 30 20  num" value of 0 
1cf40 69 73 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  is.  ** used for
1cf50 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c   terminal symbol
1cf60 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  s.  If there is 
1cf70 6e 6f 20 25 64 65 66 61 75 6c 74 5f 74 79 70 65  no %default_type
1cf80 20 64 65 66 69 6e 65 64 20 74 68 65 6e 0a 20 20   defined then.  
1cf90 2a 2a 20 30 20 69 73 20 61 6c 73 6f 20 75 73 65  ** 0 is also use
1cfa0 64 20 61 73 20 74 68 65 20 2e 64 74 6e 75 6d 20  d as the .dtnum 
1cfb0 76 61 6c 75 65 20 66 6f 72 20 6e 6f 6e 74 65 72  value for nonter
1cfc0 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 64 6f 20  minals which do 
1cfd0 6e 6f 74 20 73 70 65 63 69 66 79 0a 20 20 2a 2a  not specify.  **
1cfe0 20 61 20 64 61 74 61 74 79 70 65 20 75 73 69 6e   a datatype usin
1cff0 67 20 74 68 65 20 25 74 79 70 65 20 64 69 72 65  g the %type dire
1d000 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ctive..  */.  fo
1d010 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1d020 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
1d030 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1d040 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62  *sp = lemp->symb
1d050 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 63 68 61 72  ols[i];.    char
1d060 20 2a 63 70 3b 0a 20 20 20 20 69 66 28 20 73 70   *cp;.    if( sp
1d070 3d 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29  ==lemp->errsym )
1d080 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75  {.      sp->dtnu
1d090 6d 20 3d 20 61 72 72 61 79 73 69 7a 65 2b 31 3b  m = arraysize+1;
1d0a0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
1d0b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
1d0c0 70 2d 3e 74 79 70 65 21 3d 4e 4f 4e 54 45 52 4d  p->type!=NONTERM
1d0d0 49 4e 41 4c 20 7c 7c 20 28 73 70 2d 3e 64 61 74  INAL || (sp->dat
1d0e0 61 74 79 70 65 3d 3d 30 20 26 26 20 6c 65 6d 70  atype==0 && lemp
1d0f0 2d 3e 76 61 72 74 79 70 65 3d 3d 30 29 20 29 7b  ->vartype==0) ){
1d100 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d  .      sp->dtnum
1d110 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 0;.      cont
1d120 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
1d130 63 70 20 3d 20 73 70 2d 3e 64 61 74 61 74 79 70  cp = sp->datatyp
1d140 65 3b 0a 20 20 20 20 69 66 28 20 63 70 3d 3d 30  e;.    if( cp==0
1d150 20 29 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61   ) cp = lemp->va
1d160 72 74 79 70 65 3b 0a 20 20 20 20 6a 20 3d 20 30  rtype;.    j = 0
1d170 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 53 53  ;.    while( ISS
1d180 50 41 43 45 28 2a 63 70 29 20 29 20 63 70 2b 2b  PACE(*cp) ) cp++
1d190 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 63 70  ;.    while( *cp
1d1a0 20 29 20 73 74 64 64 74 5b 6a 2b 2b 5d 20 3d 20   ) stddt[j++] = 
1d1b0 2a 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  *cp++;.    while
1d1c0 28 20 6a 3e 30 20 26 26 20 49 53 53 50 41 43 45  ( j>0 && ISSPACE
1d1d0 28 73 74 64 64 74 5b 6a 2d 31 5d 29 20 29 20 6a  (stddt[j-1]) ) j
1d1e0 2d 2d 3b 0a 20 20 20 20 73 74 64 64 74 5b 6a 5d  --;.    stddt[j]
1d1f0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 65   = 0;.    if( le
1d200 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 20 26 26  mp->tokentype &&
1d210 20 73 74 72 63 6d 70 28 73 74 64 64 74 2c 20 6c   strcmp(stddt, l
1d220 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3d  emp->tokentype)=
1d230 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e  =0 ){.      sp->
1d240 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20  dtnum = 0;.     
1d250 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
1d260 0a 20 20 20 20 68 61 73 68 20 3d 20 30 3b 0a 20  .    hash = 0;. 
1d270 20 20 20 66 6f 72 28 6a 3d 30 3b 20 73 74 64 64     for(j=0; stdd
1d280 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
1d290 20 20 68 61 73 68 20 3d 20 68 61 73 68 2a 35 33    hash = hash*53
1d2a0 20 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a 20 20 20   + stddt[j];.   
1d2b0 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68   }.    hash = (h
1d2c0 61 73 68 20 26 20 30 78 37 66 66 66 66 66 66 66  ash & 0x7fffffff
1d2d0 29 25 61 72 72 61 79 73 69 7a 65 3b 0a 20 20 20  )%arraysize;.   
1d2e0 20 77 68 69 6c 65 28 20 74 79 70 65 73 5b 68 61   while( types[ha
1d2f0 73 68 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28  sh] ){.      if(
1d300 20 73 74 72 63 6d 70 28 74 79 70 65 73 5b 68 61   strcmp(types[ha
1d310 73 68 5d 2c 73 74 64 64 74 29 3d 3d 30 20 29 7b  sh],stddt)==0 ){
1d320 0a 20 20 20 20 20 20 20 20 73 70 2d 3e 64 74 6e  .        sp->dtn
1d330 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20  um = hash + 1;. 
1d340 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1d350 20 20 20 20 7d 0a 20 20 20 20 20 20 68 61 73 68      }.      hash
1d360 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61  ++;.      if( ha
1d370 73 68 3e 3d 28 75 6e 73 69 67 6e 65 64 29 61 72  sh>=(unsigned)ar
1d380 72 61 79 73 69 7a 65 20 29 20 68 61 73 68 20 3d  raysize ) hash =
1d390 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1d3a0 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30  ( types[hash]==0
1d3b0 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74   ){.      sp->dt
1d3c0 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a  num = hash + 1;.
1d3d0 20 20 20 20 20 20 74 79 70 65 73 5b 68 61 73 68        types[hash
1d3e0 5d 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f  ] = (char*)mallo
1d3f0 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73  c( lemonStrlen(s
1d400 74 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20  tddt)+1 );.     
1d410 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d   if( types[hash]
1d420 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
1d430 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
1d440 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22  ut of memory.\n"
1d450 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28  );.        exit(
1d460 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
1d470 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 74    lemon_strcpy(t
1d480 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74  ypes[hash],stddt
1d490 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1d4a0 2f 2a 20 50 72 69 6e 74 20 6f 75 74 20 74 68 65  /* Print out the
1d4b0 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 59   definition of Y
1d4c0 59 54 4f 4b 45 4e 54 59 50 45 20 61 6e 64 20 59  YTOKENTYPE and Y
1d4d0 59 4d 49 4e 4f 52 54 59 50 45 20 2a 2f 0a 20 20  YMINORTYPE */.  
1d4e0 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d  name = lemp->nam
1d4f0 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a  e ? lemp->name :
1d500 20 22 50 61 72 73 65 22 3b 0a 20 20 6c 69 6e 65   "Parse";.  line
1d510 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 0a 20  no = *plineno;. 
1d520 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66   if( mhflag ){ f
1d530 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20  printf(out,"#if 
1d540 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c  INTERFACE\n"); l
1d550 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72  ineno++; }.  fpr
1d560 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1d570 65 20 25 73 54 4f 4b 45 4e 54 59 50 45 20 25 73  e %sTOKENTYPE %s
1d580 5c 6e 22 2c 6e 61 6d 65 2c 0a 20 20 20 20 6c 65  \n",name,.    le
1d590 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3f 6c 65  mp->tokentype?le
1d5a0 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3a 22 76  mp->tokentype:"v
1d5b0 6f 69 64 2a 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b  oid*");  lineno+
1d5c0 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  +;.  if( mhflag 
1d5d0 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ){ fprintf(out,"
1d5e0 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65  #endif\n"); line
1d5f0 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74  no++; }.  fprint
1d600 66 28 6f 75 74 2c 22 74 79 70 65 64 65 66 20 75  f(out,"typedef u
1d610 6e 69 6f 6e 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65  nion {\n"); line
1d620 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1d630 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 69 6e 69  out,"  int yyini
1d640 74 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  t;\n"); lineno++
1d650 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1d660 22 20 20 25 73 54 4f 4b 45 4e 54 59 50 45 20 79  "  %sTOKENTYPE y
1d670 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69  y0;\n",name); li
1d680 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  neno++;.  for(i=
1d690 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20  0; i<arraysize; 
1d6a0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 79  i++){.    if( ty
1d6b0 70 65 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  pes[i]==0 ) cont
1d6c0 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74  inue;.    fprint
1d6d0 66 28 6f 75 74 2c 22 20 20 25 73 20 79 79 25 64  f(out,"  %s yy%d
1d6e0 3b 5c 6e 22 2c 74 79 70 65 73 5b 69 5d 2c 69 2b  ;\n",types[i],i+
1d6f0 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  1); lineno++;.  
1d700 20 20 66 72 65 65 28 74 79 70 65 73 5b 69 5d 29    free(types[i])
1d710 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70  ;.  }.  if( lemp
1d720 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74  ->errsym->useCnt
1d730 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1d740 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 25 64 3b  out,"  int yy%d;
1d750 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  \n",lemp->errsym
1d760 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f  ->dtnum); lineno
1d770 2b 2b 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 73  ++;.  }.  free(s
1d780 74 64 64 74 29 3b 0a 20 20 66 72 65 65 28 74 79  tddt);.  free(ty
1d790 70 65 73 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  pes);.  fprintf(
1d7a0 6f 75 74 2c 22 7d 20 59 59 4d 49 4e 4f 52 54 59  out,"} YYMINORTY
1d7b0 50 45 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  PE;\n"); lineno+
1d7c0 2b 3b 0a 20 20 2a 70 6c 69 6e 65 6e 6f 20 3d 20  +;.  *plineno = 
1d7d0 6c 69 6e 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lineno;.}../*.**
1d7e0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
1d7f0 20 6f 66 20 61 20 43 20 64 61 74 61 74 79 70 65   of a C datatype
1d800 20 61 62 6c 65 20 74 6f 20 72 65 70 72 65 73 65   able to represe
1d810 6e 74 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  nt values betwee
1d820 6e 0a 2a 2a 20 6c 77 72 20 61 6e 64 20 75 70 72  n.** lwr and upr
1d830 2c 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 49 66  , inclusive.  If
1d840 20 70 6e 42 79 74 65 21 3d 4e 55 4c 4c 20 74 68   pnByte!=NULL th
1d850 65 6e 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68  en also write th
1d860 65 20 73 69 7a 65 6f 66 0a 2a 2a 20 66 6f 72 20  e sizeof.** for 
1d870 74 68 61 74 20 74 79 70 65 20 28 31 2c 20 32 2c  that type (1, 2,
1d880 20 6f 72 20 34 29 20 69 6e 74 6f 20 2a 70 6e 42   or 4) into *pnB
1d890 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  yte..*/.static c
1d8a0 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d  onst char *minim
1d8b0 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74  um_size_type(int
1d8c0 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 2c 20 69   lwr, int upr, i
1d8d0 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20 63  nt *pnByte){.  c
1d8e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
1d8f0 20 3d 20 22 69 6e 74 22 3b 0a 20 20 69 6e 74 20   = "int";.  int 
1d900 6e 42 79 74 65 20 3d 20 34 3b 0a 20 20 69 66 28  nByte = 4;.  if(
1d910 20 6c 77 72 3e 3d 30 20 29 7b 0a 20 20 20 20 69   lwr>=0 ){.    i
1d920 66 28 20 75 70 72 3c 3d 32 35 35 20 29 7b 0a 20  f( upr<=255 ){. 
1d930 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 75 6e       zType = "un
1d940 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20  signed char";.  
1d950 20 20 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a 20      nByte = 1;. 
1d960 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75 70 72     }else if( upr
1d970 3c 36 35 35 33 35 20 29 7b 0a 20 20 20 20 20 20  <65535 ){.      
1d980 7a 54 79 70 65 20 3d 20 22 75 6e 73 69 67 6e 65  zType = "unsigne
1d990 64 20 73 68 6f 72 74 20 69 6e 74 22 3b 0a 20 20  d short int";.  
1d9a0 20 20 20 20 6e 42 79 74 65 20 3d 20 32 3b 0a 20      nByte = 2;. 
1d9b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d9c0 7a 54 79 70 65 20 3d 20 22 75 6e 73 69 67 6e 65  zType = "unsigne
1d9d0 64 20 69 6e 74 22 3b 0a 20 20 20 20 20 20 6e 42  d int";.      nB
1d9e0 79 74 65 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20  yte = 4;.    }. 
1d9f0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
1da00 2d 31 32 37 20 26 26 20 75 70 72 3c 3d 31 32 37  -127 && upr<=127
1da10 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
1da20 22 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20  "signed char";. 
1da30 20 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a 20 20     nByte = 1;.  
1da40 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d  }else if( lwr>=-
1da50 33 32 37 36 37 20 26 26 20 75 70 72 3c 33 32 37  32767 && upr<327
1da60 36 37 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  67 ){.    zType 
1da70 3d 20 22 73 68 6f 72 74 22 3b 0a 20 20 20 20 6e  = "short";.    n
1da80 42 79 74 65 20 3d 20 32 3b 0a 20 20 7d 0a 20 20  Byte = 2;.  }.  
1da90 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a 70 6e  if( pnByte ) *pn
1daa0 42 79 74 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Byte = nByte;.  
1dab0 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
1dac0 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 73 74 61 74  ./*.** Each stat
1dad0 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 65 74  e contains a set
1dae0 20 6f 66 20 74 6f 6b 65 6e 20 74 72 61 6e 73 61   of token transa
1daf0 63 74 69 6f 6e 20 61 6e 64 20 61 20 73 65 74 20  ction and a set 
1db00 6f 66 0a 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61  of.** nontermina
1db10 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  l transactions. 
1db20 20 45 61 63 68 20 6f 66 20 74 68 65 73 65 20 73   Each of these s
1db30 65 74 73 20 6d 61 6b 65 73 20 61 6e 20 69 6e 73  ets makes an ins
1db40 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20  tance.** of the 
1db50 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1db60 75 72 65 2e 20 20 41 6e 20 61 72 72 61 79 20 6f  ure.  An array o
1db70 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72  f these structur
1db80 65 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f  es is used.** to
1db90 20 6f 72 64 65 72 20 74 68 65 20 63 72 65 61 74   order the creat
1dba0 69 6f 6e 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ion of entries i
1dbb0 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b  n the yy_action[
1dbc0 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  ] table..*/.stru
1dbd0 63 74 20 61 78 73 65 74 20 7b 0a 20 20 73 74 72  ct axset {.  str
1dbe0 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
1dbf0 20 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74    /* A pointer t
1dc00 6f 20 61 20 73 74 61 74 65 20 2a 2f 0a 20 20 69  o a state */.  i
1dc10 6e 74 20 69 73 54 6b 6e 3b 20 20 20 20 20 20 20  nt isTkn;       
1dc20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75      /* True to u
1dc30 73 65 20 74 6f 6b 65 6e 73 2e 20 20 46 61 6c 73  se tokens.  Fals
1dc40 65 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e  e for non-termin
1dc50 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63  als */.  int nAc
1dc60 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  tion;         /*
1dc70 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 6f   Number of actio
1dc80 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 72 64  ns */.  int iOrd
1dc90 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er;          /* 
1dca0 4f 72 69 67 69 6e 61 6c 20 6f 72 64 65 72 20 6f  Original order o
1dcb0 66 20 61 63 74 69 6f 6e 20 73 65 74 73 20 2a 2f  f action sets */
1dcc0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  .};../*.** Compa
1dcd0 72 65 20 74 6f 20 61 78 73 65 74 20 73 74 72 75  re to axset stru
1dce0 63 74 75 72 65 73 20 66 6f 72 20 73 6f 72 74 69  ctures for sorti
1dcf0 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
1dd00 74 61 74 69 63 20 69 6e 74 20 61 78 73 65 74 5f  tatic int axset_
1dd10 63 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f  compare(const vo
1dd20 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69  id *a, const voi
1dd30 64 20 2a 62 29 7b 0a 20 20 73 74 72 75 63 74 20  d *b){.  struct 
1dd40 61 78 73 65 74 20 2a 70 31 20 3d 20 28 73 74 72  axset *p1 = (str
1dd50 75 63 74 20 61 78 73 65 74 2a 29 61 3b 0a 20 20  uct axset*)a;.  
1dd60 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 70 32  struct axset *p2
1dd70 20 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74   = (struct axset
1dd80 2a 29 62 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  *)b;.  int c;.  
1dd90 63 20 3d 20 70 32 2d 3e 6e 41 63 74 69 6f 6e 20  c = p2->nAction 
1dda0 2d 20 70 31 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 20  - p1->nAction;. 
1ddb0 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
1ddc0 20 63 20 3d 20 70 31 2d 3e 69 4f 72 64 65 72 20   c = p1->iOrder 
1ddd0 2d 20 70 32 2d 3e 69 4f 72 64 65 72 3b 0a 20 20  - p2->iOrder;.  
1dde0 7d 0a 20 20 61 73 73 65 72 74 28 20 63 21 3d 30  }.  assert( c!=0
1ddf0 20 7c 7c 20 70 31 3d 3d 70 32 20 29 3b 0a 20 20   || p1==p2 );.  
1de00 72 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a  return c;.}../*.
1de10 2a 2a 20 57 72 69 74 65 20 74 65 78 74 20 6f 6e  ** Write text on
1de20 20 22 6f 75 74 22 20 74 68 61 74 20 64 65 73 63   "out" that desc
1de30 72 69 62 65 73 20 74 68 65 20 72 75 6c 65 20 22  ribes the rule "
1de40 72 70 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rp"..*/.static v
1de50 6f 69 64 20 77 72 69 74 65 52 75 6c 65 54 65 78  oid writeRuleTex
1de60 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72  t(FILE *out, str
1de70 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20  uct rule *rp){. 
1de80 20 69 6e 74 20 6a 3b 0a 20 20 66 70 72 69 6e 74   int j;.  fprint
1de90 66 28 6f 75 74 2c 22 25 73 20 3a 3a 3d 22 2c 20  f(out,"%s ::=", 
1dea0 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a  rp->lhs->name);.
1deb0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d    for(j=0; j<rp-
1dec0 3e 6e 72 68 73 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nrhs; j++){.   
1ded0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1dee0 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 6a 5d 3b  sp = rp->rhs[j];
1def0 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
1df00 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e!=MULTITERMINAL
1df10 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1df20 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73 70 2d  f(out," %s", sp-
1df30 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  >name);.    }els
1df40 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  e{.      int k;.
1df50 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1df60 74 2c 22 20 25 73 22 2c 20 73 70 2d 3e 73 75 62  t," %s", sp->sub
1df70 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  sym[0]->name);. 
1df80 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
1df90 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b  sp->nsubsym; k++
1dfa0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1dfb0 74 66 28 6f 75 74 2c 22 7c 25 73 22 2c 73 70 2d  tf(out,"|%s",sp-
1dfc0 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65  >subsym[k]->name
1dfd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1dfe0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65  .  }.}.../* Gene
1dff0 72 61 74 65 20 43 20 73 6f 75 72 63 65 20 63 6f  rate C source co
1e000 64 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  de for the parse
1e010 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74  r */.void Report
1e020 54 61 62 6c 65 28 0a 20 20 73 74 72 75 63 74 20  Table(.  struct 
1e030 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69  lemon *lemp,.  i
1e040 6e 74 20 6d 68 66 6c 61 67 20 20 20 20 20 2f 2a  nt mhflag     /*
1e050 20 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b 65 68   Output in makeh
1e060 65 61 64 65 72 73 20 66 6f 72 6d 61 74 20 69 66  eaders format if
1e070 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 46 49   true */.){.  FI
1e080 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20  LE *out, *in;.  
1e090 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49  char line[LINESI
1e0a0 5a 45 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65  ZE];.  int  line
1e0b0 6e 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  no;.  struct sta
1e0c0 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63  te *stp;.  struc
1e0d0 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20  t action *ap;.  
1e0e0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
1e0f0 0a 20 20 73 74 72 75 63 74 20 61 63 74 74 61 62  .  struct acttab
1e100 20 2a 70 41 63 74 74 61 62 3b 0a 20 20 69 6e 74   *pActtab;.  int
1e110 20 69 2c 20 6a 2c 20 6e 2c 20 73 7a 3b 0a 20 20   i, j, n, sz;.  
1e120 69 6e 74 20 73 7a 41 63 74 69 6f 6e 54 79 70 65  int szActionType
1e130 3b 20 20 20 20 20 2f 2a 20 73 69 7a 65 6f 66 28  ;     /* sizeof(
1e140 59 59 41 43 54 49 4f 4e 54 59 50 45 29 20 2a 2f  YYACTIONTYPE) */
1e150 0a 20 20 69 6e 74 20 73 7a 43 6f 64 65 54 79 70  .  int szCodeTyp
1e160 65 3b 20 20 20 20 20 20 20 2f 2a 20 73 69 7a 65  e;       /* size
1e170 6f 66 28 59 59 43 4f 44 45 54 59 50 45 29 20 20  of(YYCODETYPE)  
1e180 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1e190 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e   *name;.  int mn
1e1a0 54 6b 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e 4f 66  TknOfst, mxTknOf
1e1b0 73 74 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74 4f 66  st;.  int mnNtOf
1e1c0 73 74 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a 20 20  st, mxNtOfst;.  
1e1d0 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 61 78  struct axset *ax
1e1e0 3b 0a 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f 6f  ;..  in = tplt_o
1e1f0 70 65 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66 28  pen(lemp);.  if(
1e200 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   in==0 ) return;
1e210 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70  .  out = file_op
1e220 65 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77 62  en(lemp,".c","wb
1e230 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30  ");.  if( out==0
1e240 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69   ){.    fclose(i
1e250 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  n);.    return;.
1e260 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31    }.  lineno = 1
1e270 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
1e280 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1e290 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1e2a0 47 65 6e 65 72 61 74 65 20 74 68 65 20 69 6e 63  Generate the inc
1e2b0 6c 75 64 65 20 63 6f 64 65 2c 20 69 66 20 61 6e  lude code, if an
1e2c0 79 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  y */.  tplt_prin
1e2d0 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
1e2e0 3e 69 6e 63 6c 75 64 65 2c 26 6c 69 6e 65 6e 6f  >include,&lineno
1e2f0 29 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  );.  if( mhflag 
1e300 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 69 6e 63  ){.    char *inc
1e310 4e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65  Name = file_make
1e320 6e 61 6d 65 28 6c 65 6d 70 2c 20 22 2e 68 22 29  name(lemp, ".h")
1e330 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1e340 74 2c 22 23 69 6e 63 6c 75 64 65 20 5c 22 25 73  t,"#include \"%s
1e350 5c 22 5c 6e 22 2c 20 69 6e 63 4e 61 6d 65 29 3b  \"\n", incName);
1e360 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1e370 72 65 65 28 69 6e 63 4e 61 6d 65 29 3b 0a 20 20  ree(incName);.  
1e380 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
1e390 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1e3a0 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1e3b0 47 65 6e 65 72 61 74 65 20 23 64 65 66 69 6e 65  Generate #define
1e3c0 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e 73  s for all tokens
1e3d0 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c 61 67   */.  if( mhflag
1e3e0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
1e3f0 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20 20  ar *prefix;.    
1e400 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66  fprintf(out,"#if
1e410 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20   INTERFACE\n"); 
1e420 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66  lineno++;.    if
1e430 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65  ( lemp->tokenpre
1e440 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c  fix ) prefix = l
1e450 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78  emp->tokenprefix
1e460 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20 20  ;.    else      
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
1e480 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 66  efix = "";.    f
1e490 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=1; i<lemp->
1e4a0 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b  nterminal; i++){
1e4b0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1e4c0 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d  ut,"#define %s%-
1e4d0 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69  30s %2d\n",prefi
1e4e0 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  x,lemp->symbols[
1e4f0 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20  i]->name,i);.   
1e500 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20     lineno++;.   
1e510 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f   }.    fprintf(o
1e520 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  ut,"#endif\n"); 
1e530 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1e540 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1e550 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1e560 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1e570 72 61 74 65 20 74 68 65 20 64 65 66 69 6e 65 73  rate the defines
1e580 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1e590 74 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f 44  t,"#define YYCOD
1e5a0 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20  ETYPE %s\n",.   
1e5b0 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79   minimum_size_ty
1e5c0 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d  pe(0, lemp->nsym
1e5d0 62 6f 6c 2b 31 2c 20 26 73 7a 43 6f 64 65 54 79  bol+1, &szCodeTy
1e5e0 70 65 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  pe)); lineno++;.
1e5f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1e600 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20  define YYNOCODE 
1e610 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d  %d\n",lemp->nsym
1e620 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b  bol+1);  lineno+
1e630 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1e640 2c 22 23 64 65 66 69 6e 65 20 59 59 41 43 54 49  ,"#define YYACTI
1e650 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20  ONTYPE %s\n",.  
1e660 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74    minimum_size_t
1e670 79 70 65 28 30 2c 6c 65 6d 70 2d 3e 6e 73 74 61  ype(0,lemp->nsta
1e680 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2a 32  te+lemp->nrule*2
1e690 2b 35 2c 26 73 7a 41 63 74 69 6f 6e 54 79 70 65  +5,&szActionType
1e6a0 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  )); lineno++;.  
1e6b0 69 66 28 20 6c 65 6d 70 2d 3e 77 69 6c 64 63 61  if( lemp->wildca
1e6c0 72 64 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  rd ){.    fprint
1e6d0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1e6e0 59 57 49 4c 44 43 41 52 44 20 25 64 5c 6e 22 2c  YWILDCARD %d\n",
1e6f0 0a 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 77 69  .       lemp->wi
1e700 6c 64 63 61 72 64 2d 3e 69 6e 64 65 78 29 3b 20  ldcard->index); 
1e710 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1e720 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f  print_stack_unio
1e730 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e 65  n(out,lemp,&line
1e740 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20 66 70  no,mhflag);.  fp
1e750 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 69 66 6e  rintf(out, "#ifn
1e760 64 65 66 20 59 59 53 54 41 43 4b 44 45 50 54 48  def YYSTACKDEPTH
1e770 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1e780 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 63    if( lemp->stac
1e790 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20 66 70 72  ksize ){.    fpr
1e7a0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1e7b0 65 20 59 59 53 54 41 43 4b 44 45 50 54 48 20 25  e YYSTACKDEPTH %
1e7c0 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61 63 6b  s\n",lemp->stack
1e7d0 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  size);  lineno++
1e7e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
1e7f0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1e800 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48  ine YYSTACKDEPTH
1e810 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e   100\n");  linen
1e820 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  o++;.  }.  fprin
1e830 74 66 28 6f 75 74 2c 20 22 23 65 6e 64 69 66 5c  tf(out, "#endif\
1e840 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1e850 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
1e860 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1e870 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22  #if INTERFACE\n"
1e880 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1e890 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e  .  name = lemp->
1e8a0 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d  name ? lemp->nam
1e8b0 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 69  e : "Parse";.  i
1e8c0 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26 26 20  f( lemp->arg && 
1e8d0 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29 7b 0a  lemp->arg[0] ){.
1e8e0 20 20 20 20 69 20 3d 20 6c 65 6d 6f 6e 53 74 72      i = lemonStr
1e8f0 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29 3b 0a  len(lemp->arg);.
1e900 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20      while( i>=1 
1e910 26 26 20 49 53 53 50 41 43 45 28 6c 65 6d 70 2d  && ISSPACE(lemp-
1e920 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20 69 2d 2d  >arg[i-1]) ) i--
1e930 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d  ;.    while( i>=
1e940 31 20 26 26 20 28 49 53 41 4c 4e 55 4d 28 6c 65  1 && (ISALNUM(le
1e950 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 7c 7c  mp->arg[i-1]) ||
1e960 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 3d   lemp->arg[i-1]=
1e970 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20 20  ='_') ) i--;.   
1e980 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1e990 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45 43  efine %sARG_SDEC
1e9a0 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65  L %s;\n",name,le
1e9b0 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e  mp->arg);  linen
1e9c0 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1e9d0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1e9e0 41 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c 6e 22  ARG_PDECL ,%s\n"
1e9f0 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29  ,name,lemp->arg)
1ea00 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1ea10 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1ea20 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43  efine %sARG_FETC
1ea30 48 20 25 73 20 3d 20 79 79 70 50 61 72 73 65 72  H %s = yypParser
1ea40 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ->%s\n",.       
1ea50 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 6c            name,l
1ea60 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e  emp->arg,&lemp->
1ea70 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f  arg[i]);  lineno
1ea80 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1ea90 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1eaa0 52 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72 73  RG_STORE yypPars
1eab0 65 72 2d 3e 25 73 20 3d 20 25 73 5c 6e 22 2c 0a  er->%s = %s\n",.
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ead0 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67   name,&lemp->arg
1eae0 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69  [i],&lemp->arg[i
1eaf0 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ]);  lineno++;. 
1eb00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
1eb10 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1eb20 20 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22 2c   %sARG_SDECL\n",
1eb30 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  name);  lineno++
1eb40 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1eb50 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
1eb60 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b  _PDECL\n",name);
1eb70 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
1eb80 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1eb90 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48  fine %sARG_FETCH
1eba0 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  \n",name); linen
1ebb0 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1ebc0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1ebd0 41 52 47 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d  ARG_STORE\n",nam
1ebe0 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1ebf0 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29  }.  if( mhflag )
1ec00 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1ec10 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c  t,"#endif\n"); l
1ec20 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69  ineno++;.  }.  i
1ec30 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  f( lemp->errsym-
1ec40 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20 66  >useCnt ){.    f
1ec50 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1ec60 69 6e 65 20 59 59 45 52 52 4f 52 53 59 4d 42 4f  ine YYERRORSYMBO
1ec70 4c 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72  L %d\n",lemp->er
1ec80 72 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 6c 69  rsym->index); li
1ec90 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1eca0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1ecb0 20 59 59 45 52 52 53 59 4d 44 54 20 79 79 25 64   YYERRSYMDT yy%d
1ecc0 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  \n",lemp->errsym
1ecd0 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f  ->dtnum); lineno
1ece0 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65  ++;.  }.  if( le
1ecf0 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b  mp->has_fallback
1ed00 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1ed10 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 46  out,"#define YYF
1ed20 41 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20 20  ALLBACK 1\n");  
1ed30 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 0a 20  lineno++;.  }.. 
1ed40 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
1ed50 61 63 74 69 6f 6e 20 74 61 62 6c 65 2c 20 62 75  action table, bu
1ed60 74 20 64 6f 20 6e 6f 74 20 6f 75 74 70 75 74 20  t do not output 
1ed70 69 74 20 79 65 74 2e 20 20 54 68 65 20 61 63 74  it yet.  The act
1ed80 69 6f 6e 0a 20 20 2a 2a 20 74 61 62 6c 65 20 6d  ion.  ** table m
1ed90 75 73 74 20 62 65 20 63 6f 6d 70 75 74 65 64 20  ust be computed 
1eda0 62 65 66 6f 72 65 20 67 65 6e 65 72 61 74 69 6e  before generatin
1edb0 67 20 74 68 65 20 59 59 4e 53 54 41 54 45 20 6d  g the YYNSTATE m
1edc0 61 63 72 6f 20 62 65 63 61 75 73 65 0a 20 20 2a  acro because.  *
1edd0 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  * we need to kno
1ede0 77 20 68 6f 77 20 6d 61 6e 79 20 73 74 61 74 65  w how many state
1edf0 73 20 63 61 6e 20 62 65 20 65 6c 69 6d 69 6e 61  s can be elimina
1ee00 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 78 20 3d  ted..  */.  ax =
1ee10 20 28 73 74 72 75 63 74 20 61 78 73 65 74 20 2a   (struct axset *
1ee20 29 20 63 61 6c 6c 6f 63 28 6c 65 6d 70 2d 3e 6e  ) calloc(lemp->n
1ee30 78 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66  xstate*2, sizeof
1ee40 28 61 78 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20  (ax[0]));.  if( 
1ee50 61 78 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  ax==0 ){.    fpr
1ee60 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c  intf(stderr,"mal
1ee70 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a  loc failed\n");.
1ee80 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
1ee90 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
1eea0 6d 70 2d 3e 6e 78 73 74 61 74 65 3b 20 69 2b 2b  mp->nxstate; i++
1eeb0 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
1eec0 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
1eed0 20 20 61 78 5b 69 2a 32 5d 2e 73 74 70 20 3d 20    ax[i*2].stp = 
1eee0 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d  stp;.    ax[i*2]
1eef0 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a 20 20 20 20  .isTkn = 1;.    
1ef00 61 78 5b 69 2a 32 5d 2e 6e 41 63 74 69 6f 6e 20  ax[i*2].nAction 
1ef10 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 3b 0a  = stp->nTknAct;.
1ef20 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 73 74      ax[i*2+1].st
1ef30 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78 5b  p = stp;.    ax[
1ef40 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e 20 3d 20 30  i*2+1].isTkn = 0
1ef50 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e  ;.    ax[i*2+1].
1ef60 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e  nAction = stp->n
1ef70 4e 74 41 63 74 3b 0a 20 20 7d 0a 20 20 6d 78 54  NtAct;.  }.  mxT
1ef80 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66  knOfst = mnTknOf
1ef90 73 74 20 3d 20 30 3b 0a 20 20 6d 78 4e 74 4f 66  st = 0;.  mxNtOf
1efa0 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 3d 20  st = mnNtOfst = 
1efb0 30 3b 0a 20 20 2f 2a 20 49 6e 20 61 6e 20 65 66  0;.  /* In an ef
1efc0 66 6f 72 74 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  fort to minimize
1efd0 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
1efe0 65 20 73 69 7a 65 2c 20 75 73 65 20 74 68 65 20  e size, use the 
1eff0 68 65 75 72 69 73 74 69 63 0a 20 20 2a 2a 20 6f  heuristic.  ** o
1f000 66 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6c 61  f placing the la
1f010 72 67 65 73 74 20 61 63 74 69 6f 6e 20 73 65 74  rgest action set
1f020 73 20 66 69 72 73 74 20 2a 2f 0a 20 20 66 6f 72  s first */.  for
1f030 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78  (i=0; i<lemp->nx
1f040 73 74 61 74 65 2a 32 3b 20 69 2b 2b 29 20 61 78  state*2; i++) ax
1f050 5b 69 5d 2e 69 4f 72 64 65 72 20 3d 20 69 3b 0a  [i].iOrder = i;.
1f060 20 20 71 73 6f 72 74 28 61 78 2c 20 6c 65 6d 70    qsort(ax, lemp
1f070 2d 3e 6e 78 73 74 61 74 65 2a 32 2c 20 73 69 7a  ->nxstate*2, siz
1f080 65 6f 66 28 61 78 5b 30 5d 29 2c 20 61 78 73 65  eof(ax[0]), axse
1f090 74 5f 63 6f 6d 70 61 72 65 29 3b 0a 20 20 70 41  t_compare);.  pA
1f0a0 63 74 74 61 62 20 3d 20 61 63 74 74 61 62 5f 61  cttab = acttab_a
1f0b0 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d  lloc();.  for(i=
1f0c0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61  0; i<lemp->nxsta
1f0d0 74 65 2a 32 20 26 26 20 61 78 5b 69 5d 2e 6e 41  te*2 && ax[i].nA
1f0e0 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20  ction>0; i++){. 
1f0f0 20 20 20 73 74 70 20 3d 20 61 78 5b 69 5d 2e 73     stp = ax[i].s
1f100 74 70 3b 0a 20 20 20 20 69 66 28 20 61 78 5b 69  tp;.    if( ax[i
1f110 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20 20 20 20 20  ].isTkn ){.     
1f120 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
1f130 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
1f140 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
1f150 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  ction;.        i
1f160 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
1f170 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  >=lemp->ntermina
1f180 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
1f190 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20 63        action = c
1f1a0 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
1f1b0 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20  mp, ap);.       
1f1c0 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20   if( action<0 ) 
1f1d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1f1e0 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28    acttab_action(
1f1f0 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d  pActtab, ap->sp-
1f200 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b  >index, action);
1f210 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1f220 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 61  tp->iTknOfst = a
1f230 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41 63  cttab_insert(pAc
1f240 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ttab);.      if(
1f250 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d   stp->iTknOfst<m
1f260 6e 54 6b 6e 4f 66 73 74 20 29 20 6d 6e 54 6b 6e  nTknOfst ) mnTkn
1f270 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e  Ofst = stp->iTkn
1f280 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Ofst;.      if( 
1f290 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78  stp->iTknOfst>mx
1f2a0 54 6b 6e 4f 66 73 74 20 29 20 6d 78 54 6b 6e 4f  TknOfst ) mxTknO
1f2b0 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f  fst = stp->iTknO
1f2c0 66 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fst;.    }else{.
1f2d0 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70        for(ap=stp
1f2e0 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
1f2f0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
1f300 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20  int action;.    
1f310 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e      if( ap->sp->
1f320 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72  index<lemp->nter
1f330 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65  minal ) continue
1f340 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  ;.        if( ap
1f350 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d  ->sp->index==lem
1f360 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 20 63 6f 6e  p->nsymbol ) con
1f370 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
1f380 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f  ction = compute_
1f390 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29  action(lemp, ap)
1f3a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63  ;.        if( ac
1f3b0 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75  tion<0 ) continu
1f3c0 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74 61  e;.        actta
1f3d0 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62  b_action(pActtab
1f3e0 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c  , ap->sp->index,
1f3f0 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20   action);.      
1f400 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 4e 74  }.      stp->iNt
1f410 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69 6e  Ofst = acttab_in
1f420 73 65 72 74 28 70 41 63 74 74 61 62 29 3b 0a 20  sert(pActtab);. 
1f430 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e       if( stp->iN
1f440 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66 73 74 20 29  tOfst<mnNtOfst )
1f450 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d   mnNtOfst = stp-
1f460 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 20 20  >iNtOfst;.      
1f470 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  if( stp->iNtOfst
1f480 3e 6d 78 4e 74 4f 66 73 74 20 29 20 6d 78 4e 74  >mxNtOfst ) mxNt
1f490 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f  Ofst = stp->iNtO
1f4a0 66 73 74 3b 0a 20 20 20 20 7d 0a 23 69 66 20 30  fst;.    }.#if 0
1f4b0 20 20 2f 2a 20 55 6e 63 6f 6d 6d 65 6e 74 20 66    /* Uncomment f
1f4c0 6f 72 20 61 20 74 72 61 63 65 20 6f 66 20 68 6f  or a trace of ho
1f4d0 77 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b  w the yy_action[
1f4e0 5d 20 74 61 62 6c 65 20 66 69 6c 6c 73 20 6f 75  ] table fills ou
1f4f0 74 20 2a 2f 0a 20 20 20 20 7b 20 69 6e 74 20 6a  t */.    { int j
1f500 6a 2c 20 6e 6e 3b 0a 20 20 20 20 20 20 66 6f 72  j, nn;.      for
1f510 28 6a 6a 3d 6e 6e 3d 30 3b 20 6a 6a 3c 70 41 63  (jj=nn=0; jj<pAc
1f520 74 74 61 62 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a  ttab->nAction; j
1f530 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
1f540 28 20 70 41 63 74 74 61 62 2d 3e 61 41 63 74 69  ( pActtab->aActi
1f550 6f 6e 5b 6a 6a 5d 2e 61 63 74 69 6f 6e 3c 30 20  on[jj].action<0 
1f560 29 20 6e 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ) nn++;.      }.
1f570 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 34        printf("%4
1f580 64 3a 20 53 74 61 74 65 20 25 33 64 20 25 73 20  d: State %3d %s 
1f590 6e 3a 20 25 32 64 20 73 69 7a 65 3a 20 25 35 64  n: %2d size: %5d
1f5a0 20 66 72 65 65 73 70 61 63 65 3a 20 25 64 5c 6e   freespace: %d\n
1f5b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1f5c0 69 2c 20 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d  i, stp->statenum
1f5d0 2c 20 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 3f 20  , ax[i].isTkn ? 
1f5e0 22 54 6f 6b 65 6e 22 20 3a 20 22 56 61 72 20 20  "Token" : "Var  
1f5f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1f600 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 2c 20 70  ax[i].nAction, p
1f610 41 63 74 74 61 62 2d 3e 6e 41 63 74 69 6f 6e 2c  Acttab->nAction,
1f620 20 6e 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   nn);.    }.#end
1f630 69 66 0a 20 20 7d 0a 20 20 66 72 65 65 28 61 78  if.  }.  free(ax
1f640 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 72 75  );..  /* Mark ru
1f650 6c 65 73 20 74 68 61 74 20 61 72 65 20 61 63 74  les that are act
1f660 75 61 6c 6c 79 20 75 73 65 64 20 66 6f 72 20 72  ually used for r
1f670 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20 61 66  educe actions af
1f680 74 65 72 20 61 6c 6c 0a 20 20 2a 2a 20 6f 70 74  ter all.  ** opt
1f690 69 6d 69 7a 61 74 69 6f 6e 73 20 68 61 76 65 20  imizations have 
1f6a0 62 65 65 6e 20 61 70 70 6c 69 65 64 0a 20 20 2a  been applied.  *
1f6b0 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  /.  for(rp=lemp-
1f6c0 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1f6d0 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 64 6f 65 73  ->next) rp->does
1f6e0 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f 46  Reduce = LEMON_F
1f6f0 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ALSE;.  for(i=0;
1f700 20 69 3c 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65   i<lemp->nxstate
1f710 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
1f720 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20  ct action *ap;. 
1f730 20 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e     for(ap=lemp->
1f740 73 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20 61  sorted[i]->ap; a
1f750 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
1f760 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
1f770 79 70 65 3d 3d 52 45 44 55 43 45 20 7c 7c 20 61  ype==REDUCE || a
1f780 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 52 45  p->type==SHIFTRE
1f790 44 55 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DUCE ){.        
1f7a0 61 70 2d 3e 78 2e 72 70 2d 3e 64 6f 65 73 52 65  ap->x.rp->doesRe
1f7b0 64 75 63 65 20 3d 20 69 3b 0a 20 20 20 20 20 20  duce = i;.      
1f7c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1f7d0 2a 20 46 69 6e 69 73 68 20 72 65 6e 64 65 72 69  * Finish renderi
1f7e0 6e 67 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 73  ng the constants
1f7f0 20 6e 6f 77 20 74 68 61 74 20 74 68 65 20 61 63   now that the ac
1f800 74 69 6f 6e 20 74 61 62 6c 65 20 68 61 73 0a 20  tion table has. 
1f810 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 75 74 65   ** been compute
1f820 64 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  d */.  fprintf(o
1f830 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 53  ut,"#define YYNS
1f840 54 41 54 45 20 20 20 20 20 20 20 20 20 20 20 20  TATE            
1f850 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 78 73   %d\n",lemp->nxs
1f860 74 61 74 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  tate);  lineno++
1f870 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1f880 22 23 64 65 66 69 6e 65 20 59 59 4e 52 55 4c 45  "#define YYNRULE
1f890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
1f8a0 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29  \n",lemp->nrule)
1f8b0 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ;  lineno++;.  f
1f8c0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1f8d0 69 6e 65 20 59 59 5f 4d 41 58 5f 53 48 49 46 54  ine YY_MAX_SHIFT
1f8e0 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 6c           %d\n",l
1f8f0 65 6d 70 2d 3e 6e 78 73 74 61 74 65 2d 31 29 3b  emp->nxstate-1);
1f900 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1f910 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1f920 65 20 59 59 5f 4d 49 4e 5f 53 48 49 46 54 52 45  e YY_MIN_SHIFTRE
1f930 44 55 43 45 20 20 20 25 64 5c 6e 22 2c 6c 65 6d  DUCE   %d\n",lem
1f940 70 2d 3e 6e 73 74 61 74 65 29 3b 20 6c 69 6e 65  p->nstate); line
1f950 6e 6f 2b 2b 3b 0a 20 20 69 20 3d 20 6c 65 6d 70  no++;.  i = lemp
1f960 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d  ->nstate + lemp-
1f970 3e 6e 72 75 6c 65 3b 0a 20 20 66 70 72 69 6e 74  >nrule;.  fprint
1f980 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1f990 59 5f 4d 41 58 5f 53 48 49 46 54 52 45 44 55 43  Y_MAX_SHIFTREDUC
1f9a0 45 20 20 20 25 64 5c 6e 22 2c 20 69 2d 31 29 3b  E   %d\n", i-1);
1f9b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1f9c0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1f9d0 65 20 59 59 5f 4d 49 4e 5f 52 45 44 55 43 45 20  e YY_MIN_REDUCE 
1f9e0 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 29         %d\n", i)
1f9f0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 20  ; lineno++;.  i 
1fa00 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b  = lemp->nstate +
1fa10 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2a 32 3b 0a   lemp->nrule*2;.
1fa20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1fa30 64 65 66 69 6e 65 20 59 59 5f 4d 41 58 5f 52 45  define YY_MAX_RE
1fa40 44 55 43 45 20 20 20 20 20 20 20 20 25 64 5c 6e  DUCE        %d\n
1fa50 22 2c 20 69 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b  ", i-1); lineno+
1fa60 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1fa70 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 45 52 52  ,"#define YY_ERR
1fa80 4f 52 5f 41 43 54 49 4f 4e 20 20 20 20 20 20 25  OR_ACTION      %
1fa90 64 5c 6e 22 2c 20 69 29 3b 20 6c 69 6e 65 6e 6f  d\n", i); lineno
1faa0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1fab0 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 41 43  t,"#define YY_AC
1fac0 43 45 50 54 5f 41 43 54 49 4f 4e 20 20 20 20 20  CEPT_ACTION     
1fad0 25 64 5c 6e 22 2c 20 69 2b 31 29 3b 20 6c 69 6e  %d\n", i+1); lin
1fae0 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1faf0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1fb00 5f 4e 4f 5f 41 43 54 49 4f 4e 20 20 20 20 20 20  _NO_ACTION      
1fb10 20 20 20 25 64 5c 6e 22 2c 20 69 2b 32 29 3b 20     %d\n", i+2); 
1fb20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74  lineno++;.  tplt
1fb30 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1fb40 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1fb50 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6f 75 74 70  ;..  /* Now outp
1fb60 75 74 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  ut the action ta
1fb70 62 6c 65 20 61 6e 64 20 69 74 73 20 61 73 73 6f  ble and its asso
1fb80 63 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ciates:.  **.  *
1fb90 2a 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20  *  yy_action[]  
1fba0 20 20 20 20 20 20 41 20 73 69 6e 67 6c 65 20 74        A single t
1fbb0 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
1fbc0 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a  all actions..  *
1fbd0 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b  *  yy_lookahead[
1fbe0 5d 20 20 20 20 20 41 20 74 61 62 6c 65 20 63 6f  ]     A table co
1fbf0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 6f  ntaining the loo
1fc00 6b 61 68 65 61 64 20 66 6f 72 20 65 61 63 68 20  kahead for each 
1fc10 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20 20  entry in.  **   
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc30 20 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73    yy_action.  Us
1fc40 65 64 20 74 6f 20 64 65 74 65 63 74 20 68 61 73  ed to detect has
1fc50 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20  h collisions..  
1fc60 2a 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f 66 73  **  yy_shift_ofs
1fc70 74 5b 5d 20 20 20 20 46 6f 72 20 65 61 63 68 20  t[]    For each 
1fc80 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65  state, the offse
1fc90 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e  t into yy_action
1fca0 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20   for.  **       
1fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68                sh
1fcc0 69 66 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c 73  ifting terminals
1fcd0 2e 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64 75 63  ..  **  yy_reduc
1fce0 65 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20 65  e_ofst[]   For e
1fcf0 61 63 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f  ach state, the o
1fd00 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63  ffset into yy_ac
1fd10 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20  tion for.  **   
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd30 20 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d 74    shifting non-t
1fd40 65 72 6d 69 6e 61 6c 73 20 61 66 74 65 72 20 61  erminals after a
1fd50 20 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20 79   reduce..  **  y
1fd60 79 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20 20 20  y_default[]     
1fd70 20 20 44 65 66 61 75 6c 74 20 61 63 74 69 6f 6e    Default action
1fd80 20 66 6f 72 20 65 61 63 68 20 73 74 61 74 65 2e   for each state.
1fd90 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70  .  */..  /* Outp
1fda0 75 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  ut the yy_action
1fdb0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6c 65 6d 70   table */.  lemp
1fdc0 2d 3e 6e 61 63 74 69 6f 6e 74 61 62 20 3d 20 6e  ->nactiontab = n
1fdd0 20 3d 20 61 63 74 74 61 62 5f 73 69 7a 65 28 70   = acttab_size(p
1fde0 41 63 74 74 61 62 29 3b 0a 20 20 6c 65 6d 70 2d  Acttab);.  lemp-
1fdf0 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a  >tablesize += n*
1fe00 73 7a 41 63 74 69 6f 6e 54 79 70 65 3b 0a 20 20  szActionType;.  
1fe10 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1fe20 66 69 6e 65 20 59 59 5f 41 43 54 54 41 42 5f 43  fine YY_ACTTAB_C
1fe30 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e 29  OUNT (%d)\n", n)
1fe40 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1fe50 72 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69  rintf(out,"stati
1fe60 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e  c const YYACTION
1fe70 54 59 50 45 20 79 79 5f 61 63 74 69 6f 6e 5b 5d  TYPE yy_action[]
1fe80 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   = {\n"); lineno
1fe90 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ++;.  for(i=j=0;
1fea0 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
1feb0 69 6e 74 20 61 63 74 69 6f 6e 20 3d 20 61 63 74  int action = act
1fec0 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 70 41 63  tab_yyaction(pAc
1fed0 74 74 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66  ttab, i);.    if
1fee0 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 61 63 74  ( action<0 ) act
1fef0 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  ion = lemp->nsta
1ff00 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
1ff10 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 6a 3d   + 2;.    if( j=
1ff20 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
1ff30 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
1ff40 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
1ff50 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 61 63  out, " %4d,", ac
1ff60 74 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 6a  tion);.    if( j
1ff70 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b  ==9 || i==n-1 ){
1ff80 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1ff90 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ut, "\n"); linen
1ffa0 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  o++;.      j = 0
1ffb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ffc0 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
1ffd0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1ffe0 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   "};\n"); lineno
1fff0 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  ++;..  /* Output
20000 20 74 68 65 20 79 79 5f 6c 6f 6f 6b 61 68 65 61   the yy_lookahea
20010 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6c 65 6d  d table */.  lem
20020 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20  p->tablesize += 
20030 6e 2a 73 7a 43 6f 64 65 54 79 70 65 3b 0a 20 20  n*szCodeType;.  
20040 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 73 74 61  fprintf(out,"sta
20050 74 69 63 20 63 6f 6e 73 74 20 59 59 43 4f 44 45  tic const YYCODE
20060 54 59 50 45 20 79 79 5f 6c 6f 6f 6b 61 68 65 61  TYPE yy_lookahea
20070 64 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e  d[] = {\n"); lin
20080 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a  eno++;.  for(i=j
20090 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
200a0 20 20 20 69 6e 74 20 6c 61 20 3d 20 61 63 74 74     int la = actt
200b0 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 70  ab_yylookahead(p
200c0 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20 20  Acttab, i);.    
200d0 69 66 28 20 6c 61 3c 30 20 29 20 6c 61 20 3d 20  if( la<0 ) la = 
200e0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a 20  lemp->nsymbol;. 
200f0 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70     if( j==0 ) fp
20100 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
20110 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20  5d */ ", i);.   
20120 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
20130 25 34 64 2c 22 2c 20 6c 61 29 3b 0a 20 20 20 20  %4d,", la);.    
20140 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
20150 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
20160 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
20170 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
20180 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
20190 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
201a0 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
201b0 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
201c0 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f  ineno++;..  /* O
201d0 75 74 70 75 74 20 74 68 65 20 79 79 5f 73 68 69  utput the yy_shi
201e0 66 74 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20  ft_ofst[] table 
201f0 2a 2f 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e  */.  n = lemp->n
20200 78 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28  xstate;.  while(
20210 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f   n>0 && lemp->so
20220 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e 4f  rted[n-1]->iTknO
20230 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
20240 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28   n--;.  fprintf(
20250 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
20260 5f 53 48 49 46 54 5f 55 53 45 5f 44 46 4c 54 20  _SHIFT_USE_DFLT 
20270 28 25 64 29 5c 6e 22 2c 20 6c 65 6d 70 2d 3e 6e  (%d)\n", lemp->n
20280 61 63 74 69 6f 6e 74 61 62 29 3b 20 6c 69 6e 65  actiontab); line
20290 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
202a0 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
202b0 5f 53 48 49 46 54 5f 43 4f 55 4e 54 20 20 20 20  _SHIFT_COUNT    
202c0 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c  (%d)\n", n-1); l
202d0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
202e0 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65  tf(out, "#define
202f0 20 59 59 5f 53 48 49 46 54 5f 4d 49 4e 20 20 20   YY_SHIFT_MIN   
20300 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b     (%d)\n", mnTk
20310 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  nOfst); lineno++
20320 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
20330 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49   "#define YY_SHI
20340 46 54 5f 4d 41 58 20 20 20 20 20 20 28 25 64 29  FT_MAX      (%d)
20350 5c 6e 22 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 3b  \n", mxTknOfst);
20360 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
20370 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69  intf(out, "stati
20380 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f 73 68  c const %s yy_sh
20390 69 66 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e  ift_ofst[] = {\n
203a0 22 2c 20 0a 20 20 20 20 20 20 20 6d 69 6e 69 6d  ", .       minim
203b0 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 54  um_size_type(mnT
203c0 6b 6e 4f 66 73 74 2c 20 6c 65 6d 70 2d 3e 6e 74  knOfst, lemp->nt
203d0 65 72 6d 69 6e 61 6c 2b 6c 65 6d 70 2d 3e 6e 61  erminal+lemp->na
203e0 63 74 69 6f 6e 74 61 62 2c 20 26 73 7a 29 29 3b  ctiontab, &sz));
203f0 0a 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b  .       lineno++
20400 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73  ;.  lemp->tables
20410 69 7a 65 20 2b 3d 20 6e 2a 73 7a 3b 0a 20 20 66  ize += n*sz;.  f
20420 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
20430 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73  ++){.    int ofs
20440 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  t;.    stp = lem
20450 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
20460 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54    ofst = stp->iT
20470 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20  knOfst;.    if( 
20480 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  ofst==NO_OFFSET 
20490 29 20 6f 66 73 74 20 3d 20 6c 65 6d 70 2d 3e 6e  ) ofst = lemp->n
204a0 61 63 74 69 6f 6e 74 61 62 3b 0a 20 20 20 20 69  actiontab;.    i
204b0 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74  f( j==0 ) fprint
204c0 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a  f(out," /* %5d *
204d0 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72  / ", i);.    fpr
204e0 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c  intf(out, " %4d,
204f0 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66  ", ofst);.    if
20500 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31  ( j==9 || i==n-1
20510 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
20520 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69  f(out, "\n"); li
20530 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20  neno++;.      j 
20540 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
20550 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
20560 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
20570 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e  ut, "};\n"); lin
20580 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74  eno++;..  /* Out
20590 70 75 74 20 74 68 65 20 79 79 5f 72 65 64 75 63  put the yy_reduc
205a0 65 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a  e_ofst[] table *
205b0 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
205c0 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44   "#define YY_RED
205d0 55 43 45 5f 55 53 45 5f 44 46 4c 54 20 28 25 64  UCE_USE_DFLT (%d
205e0 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74 2d 31  )\n", mnNtOfst-1
205f0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e  ); lineno++;.  n
20600 20 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65   = lemp->nxstate
20610 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  ;.  while( n>0 &
20620 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e  & lemp->sorted[n
20630 2d 31 5d 2d 3e 69 4e 74 4f 66 73 74 3d 3d 4e 4f  -1]->iNtOfst==NO
20640 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20  _OFFSET ) n--;. 
20650 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
20660 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45  define YY_REDUCE
20670 5f 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20  _COUNT (%d)\n", 
20680 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  n-1); lineno++;.
20690 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
206a0 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43  #define YY_REDUC
206b0 45 5f 4d 49 4e 20 20 20 28 25 64 29 5c 6e 22 2c  E_MIN   (%d)\n",
206c0 20 6d 6e 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65   mnNtOfst); line
206d0 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
206e0 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
206f0 5f 52 45 44 55 43 45 5f 4d 41 58 20 20 20 28 25  _REDUCE_MAX   (%
20700 64 29 5c 6e 22 2c 20 6d 78 4e 74 4f 66 73 74 29  d)\n", mxNtOfst)
20710 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
20720 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74  rintf(out, "stat
20730 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f 72  ic const %s yy_r
20740 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 3d 20 7b  educe_ofst[] = {
20750 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
20760 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
20770 65 28 6d 6e 4e 74 4f 66 73 74 2d 31 2c 20 6d 78  e(mnNtOfst-1, mx
20780 4e 74 4f 66 73 74 2c 20 26 73 7a 29 29 3b 20 6c  NtOfst, &sz)); l
20790 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6c 65 6d 70 2d  ineno++;.  lemp-
207a0 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a  >tablesize += n*
207b0 73 7a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  sz;.  for(i=j=0;
207c0 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
207d0 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73 74  int ofst;.    st
207e0 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
207f0 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20  [i];.    ofst = 
20800 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20  stp->iNtOfst;.  
20810 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f    if( ofst==NO_O
20820 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6d  FFSET ) ofst = m
20830 6e 4e 74 4f 66 73 74 20 2d 20 31 3b 0a 20 20 20  nNtOfst - 1;.   
20840 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69   if( j==0 ) fpri
20850 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64  ntf(out," /* %5d
20860 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66   */ ", i);.    f
20870 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
20880 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20  d,", ofst);.    
20890 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
208a0 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
208b0 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
208c0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
208d0 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
208e0 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
208f0 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
20900 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
20910 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f  ineno++;..  /* O
20920 75 74 70 75 74 20 74 68 65 20 64 65 66 61 75 6c  utput the defaul
20930 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a  t action table *
20940 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
20950 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59   "static const Y
20960 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 64  YACTIONTYPE yy_d
20970 65 66 61 75 6c 74 5b 5d 20 3d 20 7b 5c 6e 22 29  efault[] = {\n")
20980 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20  ; lineno++;.  n 
20990 3d 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74 65 3b  = lemp->nxstate;
209a0 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69  .  lemp->tablesi
209b0 7a 65 20 2b 3d 20 6e 2a 73 7a 41 63 74 69 6f 6e  ze += n*szAction
209c0 54 79 70 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  Type;.  for(i=j=
209d0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
209e0 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
209f0 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 69 66 28  rted[i];.    if(
20a00 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28   j==0 ) fprintf(
20a10 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20  out," /* %5d */ 
20a20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e  ", i);.    fprin
20a30 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c  tf(out, " %4d,",
20a40 20 73 74 70 2d 3e 69 44 66 6c 74 52 65 64 75 63   stp->iDfltReduc
20a50 65 2b 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 6c  e+lemp->nstate+l
20a60 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 0a 20 20 20  emp->nrule);.   
20a70 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
20a80 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
20a90 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
20aa0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
20ab0 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
20ac0 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
20ad0 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
20ae0 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
20af0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74  lineno++;.  tplt
20b00 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
20b10 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
20b20 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
20b30 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 66 61   the table of fa
20b40 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20  llback tokens.. 
20b50 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
20b60 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a  has_fallback ){.
20b70 20 20 20 20 69 6e 74 20 6d 78 20 3d 20 6c 65 6d      int mx = lem
20b80 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 2d 20 31  p->nterminal - 1
20b90 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6d 78 3e  ;.    while( mx>
20ba0 30 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  0 && lemp->symbo
20bb0 6c 73 5b 6d 78 5d 2d 3e 66 61 6c 6c 62 61 63 6b  ls[mx]->fallback
20bc0 3d 3d 30 20 29 7b 20 6d 78 2d 2d 3b 20 7d 0a 20  ==0 ){ mx--; }. 
20bd0 20 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69     lemp->tablesi
20be0 7a 65 20 2b 3d 20 28 6d 78 2b 31 29 2a 73 7a 43  ze += (mx+1)*szC
20bf0 6f 64 65 54 79 70 65 3b 0a 20 20 20 20 66 6f 72  odeType;.    for
20c00 28 69 3d 30 3b 20 69 3c 3d 6d 78 3b 20 69 2b 2b  (i=0; i<=mx; i++
20c10 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
20c20 73 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70  symbol *p = lemp
20c30 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
20c40 20 20 20 20 69 66 28 20 70 2d 3e 66 61 6c 6c 62      if( p->fallb
20c50 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ack==0 ){.      
20c60 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
20c70 20 20 20 20 30 2c 20 20 2f 2a 20 25 31 30 73 20      0,  /* %10s 
20c80 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22  => nothing */\n"
20c90 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  , p->name);.    
20ca0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20cb0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
20cc0 20 25 33 64 2c 20 20 2f 2a 20 25 31 30 73 20 3d   %3d,  /* %10s =
20cd0 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66  > %s */\n", p->f
20ce0 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a  allback->index,.
20cf0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 61 6d            p->nam
20d00 65 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e  e, p->fallback->
20d10 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  name);.      }. 
20d20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20       lineno++;. 
20d30 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74 5f     }.  }.  tplt_
20d40 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
20d50 20 69 6e 2c 20 6f 75 74 2c 20 26 6c 69 6e 65 6e   in, out, &linen
20d60 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
20d70 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  te a table conta
20d80 69 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c  ining the symbol
20d90 69 63 20 6e 61 6d 65 20 6f 66 20 65 76 65 72 79  ic name of every
20da0 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66   symbol.  */.  f
20db0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
20dc0 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
20dd0 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66     lemon_sprintf
20de0 28 6c 69 6e 65 2c 22 5c 22 25 73 5c 22 2c 22 2c  (line,"\"%s\",",
20df0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
20e00 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 70 72  ->name);.    fpr
20e10 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 2d 31 35  intf(out,"  %-15
20e20 73 22 2c 6c 69 6e 65 29 3b 0a 20 20 20 20 69 66  s",line);.    if
20e30 28 20 28 69 26 33 29 3d 3d 33 20 29 7b 20 66 70  ( (i&3)==3 ){ fp
20e40 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b  rintf(out,"\n");
20e50 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 7d   lineno++; }.  }
20e60 0a 20 20 69 66 28 20 28 69 26 33 29 21 3d 30 20  .  if( (i&3)!=0 
20e70 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ){ fprintf(out,"
20e80 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n"); lineno++; 
20e90 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
20ea0 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
20eb0 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
20ec0 47 65 6e 65 72 61 74 65 20 61 20 74 61 62 6c 65  Generate a table
20ed0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74 65   containing a te
20ee0 78 74 20 73 74 72 69 6e 67 20 74 68 61 74 20 64  xt string that d
20ef0 65 73 63 72 69 62 65 73 20 65 76 65 72 79 0a 20  escribes every. 
20f00 20 2a 2a 20 72 75 6c 65 20 69 6e 20 74 68 65 20   ** rule in the 
20f10 72 75 6c 65 20 73 65 74 20 6f 66 20 74 68 65 20  rule set of the 
20f20 67 72 61 6d 6d 61 72 2e 20 20 54 68 69 73 20 69  grammar.  This i
20f30 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
20f40 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 72 61  ed.  ** when tra
20f50 63 69 6e 67 20 52 45 44 55 43 45 20 61 63 74 69  cing REDUCE acti
20f60 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ons..  */.  for(
20f70 69 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d 3e 72 75  i=0, rp=lemp->ru
20f80 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
20f90 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 61  ext, i++){.    a
20fa0 73 73 65 72 74 28 20 72 70 2d 3e 69 52 75 6c 65  ssert( rp->iRule
20fb0 3d 3d 69 20 29 3b 0a 20 20 20 20 66 70 72 69 6e  ==i );.    fprin
20fc0 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 33 64 20  tf(out," /* %3d 
20fd0 2a 2f 20 5c 22 22 2c 20 69 29 3b 0a 20 20 20 20  */ \"", i);.    
20fe0 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75  writeRuleText(ou
20ff0 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69  t, rp);.    fpri
21000 6e 74 66 28 6f 75 74 2c 22 5c 22 2c 5c 6e 22 29  ntf(out,"\",\n")
21010 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
21020 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
21030 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
21040 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
21050 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
21060 68 20 65 78 65 63 75 74 65 73 20 65 76 65 72 79  h executes every
21070 20 74 69 6d 65 20 61 20 73 79 6d 62 6f 6c 20 69   time a symbol i
21080 73 20 70 6f 70 70 65 64 20 66 72 6f 6d 0a 20 20  s popped from.  
21090 2a 2a 20 74 68 65 20 73 74 61 63 6b 20 77 68 69  ** the stack whi
210a0 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 65 72  le processing er
210b0 72 6f 72 73 20 6f 72 20 77 68 69 6c 65 20 64 65  rors or while de
210c0 73 74 72 6f 79 69 6e 67 20 74 68 65 20 70 61 72  stroying the par
210d0 73 65 72 2e 20 0a 20 20 2a 2a 20 28 49 6e 20 6f  ser. .  ** (In o
210e0 74 68 65 72 20 77 6f 72 64 73 2c 20 67 65 6e 65  ther words, gene
210f0 72 61 74 65 20 74 68 65 20 25 64 65 73 74 72 75  rate the %destru
21100 63 74 6f 72 20 61 63 74 69 6f 6e 73 29 0a 20 20  ctor actions).  
21110 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74  */.  if( lemp->t
21120 6f 6b 65 6e 64 65 73 74 20 29 7b 0a 20 20 20 20  okendest ){.    
21130 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20  int once = 1;.  
21140 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
21150 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
21160 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
21170 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
21180 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
21190 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c      if( sp==0 ||
211a0 20 73 70 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49   sp->type!=TERMI
211b0 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  NAL ) continue;.
211c0 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29        if( once )
211d0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
211e0 66 28 6f 75 74 2c 20 22 20 20 20 20 20 20 2f 2a  f(out, "      /*
211f0 20 54 45 52 4d 49 4e 41 4c 20 44 65 73 74 72 75   TERMINAL Destru
21200 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e  ctor */\n"); lin
21210 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6f  eno++;.        o
21220 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nce = 0;.      }
21230 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
21240 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a  ut,"    case %d:
21250 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70   /* %s */\n", sp
21260 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d  ->index, sp->nam
21270 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
21280 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
21290 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
212a0 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c   && lemp->symbol
212b0 73 5b 69 5d 2d 3e 74 79 70 65 21 3d 54 45 52 4d  s[i]->type!=TERM
212c0 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20 20 20  INAL; i++);.    
212d0 69 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  if( i<lemp->nsym
212e0 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 65 6d 69  bol ){.      emi
212f0 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64  t_destructor_cod
21300 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62  e(out,lemp->symb
21310 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e  ols[i],lemp,&lin
21320 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70 72 69  eno);.      fpri
21330 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62  ntf(out,"      b
21340 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
21350 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  o++;.    }.  }. 
21360 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65   if( lemp->varde
21370 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
21380 20 73 79 6d 62 6f 6c 20 2a 64 66 6c 74 5f 73 70   symbol *dflt_sp
21390 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6f 6e   = 0;.    int on
213a0 63 65 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28  ce = 1;.    for(
213b0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
213c0 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
213d0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
213e0 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62  *sp = lemp->symb
213f0 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ols[i];.      if
21400 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74  ( sp==0 || sp->t
21410 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c  ype==TERMINAL ||
21420 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 69  .          sp->i
21430 6e 64 65 78 3c 3d 30 20 7c 7c 20 73 70 2d 3e 64  ndex<=0 || sp->d
21440 65 73 74 72 75 63 74 6f 72 21 3d 30 20 29 20 63  estructor!=0 ) c
21450 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
21460 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20  f( once ){.     
21470 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
21480 22 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c  "      /* Defaul
21490 74 20 4e 4f 4e 2d 54 45 52 4d 49 4e 41 4c 20 44  t NON-TERMINAL D
214a0 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29  estructor */\n")
214b0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
214c0 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
214d0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
214e0 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
214f0 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e  e %d: /* %s */\n
21500 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70  ", sp->index, sp
21510 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ->name); lineno+
21520 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f 73 70  +;.      dflt_sp
21530 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20 20 20   = sp;.    }.   
21540 20 69 66 28 20 64 66 6c 74 5f 73 70 21 3d 30 20   if( dflt_sp!=0 
21550 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65  ){.      emit_de
21560 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75  structor_code(ou
21570 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70 2c 26  t,dflt_sp,lemp,&
21580 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  lineno);.    }. 
21590 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
215a0 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29        break;\n")
215b0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
215c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
215d0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
215e0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  {.    struct sym
215f0 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e  bol *sp = lemp->
21600 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
21610 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d  if( sp==0 || sp-
21620 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20  >type==TERMINAL 
21630 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  || sp->destructo
21640 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  r==0 ) continue;
21650 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 64 65 73  .    if( sp->des
21660 74 4c 69 6e 65 6e 6f 3c 30 20 29 20 63 6f 6e 74  tLineno<0 ) cont
21670 69 6e 75 65 3b 20 20 2f 2a 20 41 6c 72 65 61 64  inue;  /* Alread
21680 79 20 65 6d 69 74 74 65 64 20 2a 2f 0a 20 20 20  y emitted */.   
21690 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
216a0 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73    case %d: /* %s
216b0 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65   */\n", sp->inde
216c0 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69  x, sp->name); li
216d0 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  neno++;..    /* 
216e0 43 6f 6d 62 69 6e 65 20 64 75 70 6c 69 63 61 74  Combine duplicat
216f0 65 20 64 65 73 74 72 75 63 74 6f 72 73 20 69 6e  e destructors in
21700 74 6f 20 61 20 73 69 6e 67 6c 65 20 63 61 73 65  to a single case
21710 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   */.    for(j=i+
21720 31 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  1; j<lemp->nsymb
21730 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
21740 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
21750 70 32 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  p2 = lemp->symbo
21760 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  ls[j];.      if(
21770 20 73 70 32 20 26 26 20 73 70 32 2d 3e 74 79 70   sp2 && sp2->typ
21780 65 21 3d 54 45 52 4d 49 4e 41 4c 20 26 26 20 73  e!=TERMINAL && s
21790 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 0a 20  p2->destructor. 
217a0 20 20 20 20 20 20 20 20 20 26 26 20 73 70 32 2d           && sp2-
217b0 3e 64 74 6e 75 6d 3d 3d 73 70 2d 3e 64 74 6e 75  >dtnum==sp->dtnu
217c0 6d 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  m.          && s
217d0 74 72 63 6d 70 28 73 70 2d 3e 64 65 73 74 72 75  trcmp(sp->destru
217e0 63 74 6f 72 2c 73 70 32 2d 3e 64 65 73 74 72 75  ctor,sp2->destru
217f0 63 74 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ctor)==0 ){.    
21800 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
21810 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f  ,"    case %d: /
21820 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20  * %s */\n",.    
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 73 70 32               sp2
21840 2d 3e 69 6e 64 65 78 2c 20 73 70 32 2d 3e 6e 61  ->index, sp2->na
21850 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
21860 20 20 20 20 20 20 20 20 73 70 32 2d 3e 64 65 73          sp2->des
21870 74 4c 69 6e 65 6e 6f 20 3d 20 2d 31 3b 20 20 2f  tLineno = -1;  /
21880 2a 20 41 76 6f 69 64 20 65 6d 69 74 74 69 6e 67  * Avoid emitting
21890 20 74 68 69 73 20 64 65 73 74 72 75 63 74 6f 72   this destructor
218a0 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20   again */.      
218b0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6d 69  }.    }..    emi
218c0 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64  t_destructor_cod
218d0 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62  e(out,lemp->symb
218e0 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e  ols[i],lemp,&lin
218f0 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  eno);.    fprint
21900 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65  f(out,"      bre
21910 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ak;\n"); lineno+
21920 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
21930 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
21940 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
21950 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
21960 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
21970 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 70  s whenever the p
21980 61 72 73 65 72 20 73 74 61 63 6b 20 6f 76 65 72  arser stack over
21990 66 6c 6f 77 73 20 2a 2f 0a 20 20 74 70 6c 74 5f  flows */.  tplt_
219a0 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
219b0 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 2c 26 6c  emp->overflow,&l
219c0 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78  ineno);.  tplt_x
219d0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
219e0 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
219f0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
21a00 68 65 20 74 61 62 6c 65 20 6f 66 20 72 75 6c 65  he table of rule
21a10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 20 20   information .  
21a20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  **.  ** Note: Th
21a30 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20  is code depends 
21a40 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74  on the fact that
21a50 20 72 75 6c 65 73 20 61 72 65 20 6e 75 6d 62 65   rules are numbe
21a60 72 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74 75 61  r.  ** sequentua
21a70 6c 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  lly beginning wi
21a80 74 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  th 0..  */.  for
21a90 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
21aa0 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
21ab0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
21ac0 74 2c 22 20 20 7b 20 25 64 2c 20 25 64 20 7d 2c  t,"  { %d, %d },
21ad0 5c 6e 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64  \n",rp->lhs->ind
21ae0 65 78 2c 72 70 2d 3e 6e 72 68 73 29 3b 20 6c 69  ex,rp->nrhs); li
21af0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70  neno++;.  }.  tp
21b00 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
21b10 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
21b20 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
21b30 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
21b40 65 63 75 74 69 6f 6e 20 64 75 72 69 6e 67 20 65  ecution during e
21b50 61 63 68 20 52 45 44 55 43 45 20 61 63 74 69 6f  ach REDUCE actio
21b60 6e 20 2a 2f 0a 20 20 69 20 3d 20 30 3b 0a 20 20  n */.  i = 0;.  
21b70 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
21b80 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
21b90 78 74 29 7b 0a 20 20 20 20 69 20 2b 3d 20 74 72  xt){.    i += tr
21ba0 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28 6c 65 6d  anslate_code(lem
21bb0 70 2c 20 72 70 29 3b 0a 20 20 7d 0a 20 20 69 66  p, rp);.  }.  if
21bc0 28 20 69 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ( i ){.    fprin
21bd0 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20  tf(out,"        
21be0 59 59 4d 49 4e 4f 52 54 59 50 45 20 79 79 6c 68  YYMINORTYPE yylh
21bf0 73 6d 69 6e 6f 72 3b 5c 6e 22 29 3b 20 6c 69 6e  sminor;\n"); lin
21c00 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 2f 2a 20  eno++;.  }.  /* 
21c10 46 69 72 73 74 20 6f 75 74 70 75 74 20 72 75 6c  First output rul
21c20 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  es other than th
21c30 65 20 64 65 66 61 75 6c 74 3a 20 72 75 6c 65 20  e default: rule 
21c40 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
21c50 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
21c60 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 73 74  p->next){.    st
21c70 72 75 63 74 20 72 75 6c 65 20 2a 72 70 32 3b 20  ruct rule *rp2; 
21c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21c90 20 4f 74 68 65 72 20 72 75 6c 65 73 20 77 69 74   Other rules wit
21ca0 68 20 74 68 65 20 73 61 6d 65 20 61 63 74 69 6f  h the same actio
21cb0 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 70 2d  n */.    if( rp-
21cc0 3e 63 6f 64 65 45 6d 69 74 74 65 64 20 29 20 63  >codeEmitted ) c
21cd0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
21ce0 20 72 70 2d 3e 6e 6f 43 6f 64 65 20 29 7b 0a 20   rp->noCode ){. 
21cf0 20 20 20 20 20 2f 2a 20 4e 6f 20 43 20 63 6f 64       /* No C cod
21d00 65 20 61 63 74 69 6f 6e 73 2c 20 73 6f 20 74 68  e actions, so th
21d10 69 73 20 77 69 6c 6c 20 62 65 20 70 61 72 74 20  is will be part 
21d20 6f 66 20 74 68 65 20 22 64 65 66 61 75 6c 74 3a  of the "default:
21d30 22 20 72 75 6c 65 20 2a 2f 0a 20 20 20 20 20 20  " rule */.      
21d40 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
21d50 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
21d60 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a 20  "      case %d: 
21d70 2f 2a 20 22 2c 20 72 70 2d 3e 69 52 75 6c 65 29  /* ", rp->iRule)
21d80 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54  ;.    writeRuleT
21d90 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20  ext(out, rp);.  
21da0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
21db0 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b   */\n"); lineno+
21dc0 2b 3b 0a 20 20 20 20 66 6f 72 28 72 70 32 3d 72  +;.    for(rp2=r
21dd0 70 2d 3e 6e 65 78 74 3b 20 72 70 32 3b 20 72 70  p->next; rp2; rp
21de0 32 3d 72 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20  2=rp2->next){.  
21df0 20 20 20 20 69 66 28 20 72 70 32 2d 3e 63 6f 64      if( rp2->cod
21e00 65 3d 3d 72 70 2d 3e 63 6f 64 65 20 26 26 20 72  e==rp->code && r
21e10 70 32 2d 3e 63 6f 64 65 50 72 65 66 69 78 3d 3d  p2->codePrefix==
21e20 72 70 2d 3e 63 6f 64 65 50 72 65 66 69 78 0a 20  rp->codePrefix. 
21e30 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 72              && r
21e40 70 32 2d 3e 63 6f 64 65 53 75 66 66 69 78 3d 3d  p2->codeSuffix==
21e50 72 70 2d 3e 63 6f 64 65 53 75 66 66 69 78 20 29  rp->codeSuffix )
21e60 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
21e70 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73  f(out,"      cas
21e80 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70 32 2d  e %d: /* ", rp2-
21e90 3e 69 52 75 6c 65 29 3b 0a 20 20 20 20 20 20 20  >iRule);.       
21ea0 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f   writeRuleText(o
21eb0 75 74 2c 20 72 70 32 29 3b 0a 20 20 20 20 20 20  ut, rp2);.      
21ec0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
21ed0 2a 2f 20 79 79 74 65 73 74 63 61 73 65 28 79 79  */ yytestcase(yy
21ee0 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c  ruleno==%d);\n",
21ef0 20 72 70 32 2d 3e 69 52 75 6c 65 29 3b 20 6c 69   rp2->iRule); li
21f00 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
21f10 72 70 32 2d 3e 63 6f 64 65 45 6d 69 74 74 65 64  rp2->codeEmitted
21f20 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
21f30 20 20 7d 0a 20 20 20 20 65 6d 69 74 5f 63 6f 64    }.    emit_cod
21f40 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c  e(out,rp,lemp,&l
21f50 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69  ineno);.    fpri
21f60 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20  ntf(out,"       
21f70 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
21f80 65 6e 6f 2b 2b 3b 0a 20 20 20 20 72 70 2d 3e 63  eno++;.    rp->c
21f90 6f 64 65 45 6d 69 74 74 65 64 20 3d 20 31 3b 0a  odeEmitted = 1;.
21fa0 20 20 7d 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79    }.  /* Finally
21fb0 2c 20 6f 75 74 70 75 74 20 74 68 65 20 64 65 66  , output the def
21fc0 61 75 6c 74 3a 20 72 75 6c 65 2e 20 20 57 65 20  ault: rule.  We 
21fd0 63 68 6f 6f 73 65 20 61 73 20 74 68 65 20 64 65  choose as the de
21fe0 66 61 75 6c 74 3a 20 61 6c 6c 0a 20 20 2a 2a 20  fault: all.  ** 
21ff0 65 6d 70 74 79 20 61 63 74 69 6f 6e 73 2e 20 2a  empty actions. *
22000 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
22010 22 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 5c  "      default:\
22020 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
22030 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
22040 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
22050 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70  ext){.    if( rp
22060 2d 3e 63 6f 64 65 45 6d 69 74 74 65 64 20 29 20  ->codeEmitted ) 
22070 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
22080 73 65 72 74 28 20 72 70 2d 3e 6e 6f 43 6f 64 65  sert( rp->noCode
22090 20 29 3b 0a 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 2f 2a 20 28 25  out,"      /* (%
220b0 64 29 20 22 2c 20 72 70 2d 3e 69 52 75 6c 65 29  d) ", rp->iRule)
220c0 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54  ;.    writeRuleT
220d0 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20  ext(out, rp);.  
220e0 20 20 69 66 28 20 72 70 2d 3e 64 6f 65 73 52 65    if( rp->doesRe
220f0 64 75 63 65 20 29 7b 0a 20 20 20 20 20 20 66 70  duce ){.      fp
22100 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f 20  rintf(out, " */ 
22110 79 79 74 65 73 74 63 61 73 65 28 79 79 72 75 6c  yytestcase(yyrul
22120 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72 70  eno==%d);\n", rp
22130 2d 3e 69 52 75 6c 65 29 3b 20 6c 69 6e 65 6e 6f  ->iRule); lineno
22140 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
22150 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
22160 2c 20 22 20 28 4f 50 54 49 4d 49 5a 45 44 20 4f  , " (OPTIMIZED O
22170 55 54 29 20 2a 2f 20 61 73 73 65 72 74 28 79 79  UT) */ assert(yy
22180 72 75 6c 65 6e 6f 21 3d 25 64 29 3b 5c 6e 22 2c  ruleno!=%d);\n",
22190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
221a0 70 2d 3e 69 52 75 6c 65 29 3b 20 6c 69 6e 65 6e  p->iRule); linen
221b0 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  o++;.    }.  }. 
221c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
221d0 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29        break;\n")
221e0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70  ; lineno++;.  tp
221f0 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
22200 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
22210 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
22220 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
22230 65 63 75 74 65 73 20 69 66 20 61 20 70 61 72 73  ecutes if a pars
22240 65 20 66 61 69 6c 73 20 2a 2f 0a 20 20 74 70 6c  e fails */.  tpl
22250 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
22260 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65 2c 26  ,lemp->failure,&
22270 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f  lineno);.  tplt_
22280 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
22290 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
222a0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
222b0 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
222c0 74 65 73 20 77 68 65 6e 20 61 20 73 79 6e 74 61  tes when a synta
222d0 78 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a  x error occurs *
222e0 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  /.  tplt_print(o
222f0 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 72  ut,lemp,lemp->er
22300 72 6f 72 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  ror,&lineno);.  
22310 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
22320 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
22330 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
22340 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
22350 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 74 68  executes when th
22360 65 20 70 61 72 73 65 72 20 61 63 63 65 70 74 73  e parser accepts
22370 20 69 74 73 20 69 6e 70 75 74 20 2a 2f 0a 20 20   its input */.  
22380 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
22390 65 6d 70 2c 6c 65 6d 70 2d 3e 61 63 63 65 70 74  emp,lemp->accept
223a0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c  ,&lineno);.  tpl
223b0 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
223c0 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
223d0 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20  );..  /* Append 
223e0 61 6e 79 20 61 64 64 69 74 69 6f 6e 20 63 6f 64  any addition cod
223f0 65 20 74 68 65 20 75 73 65 72 20 64 65 73 69 72  e the user desir
22400 65 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  es */.  tplt_pri
22410 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
22420 2d 3e 65 78 74 72 61 63 6f 64 65 2c 26 6c 69 6e  ->extracode,&lin
22430 65 6e 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73 65 28  eno);..  fclose(
22440 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75  in);.  fclose(ou
22450 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
22460 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  ./* Generate a h
22470 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20 74  eader file for t
22480 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69  he parser */.voi
22490 64 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 73  d ReportHeader(s
224a0 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
224b0 70 29 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74  p).{.  FILE *out
224c0 2c 20 2a 69 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  , *in;.  const c
224d0 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 63  har *prefix;.  c
224e0 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a  har line[LINESIZ
224f0 45 5d 3b 0a 20 20 63 68 61 72 20 70 61 74 74 65  E];.  char patte
22500 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20  rn[LINESIZE];.  
22510 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6c 65  int i;..  if( le
22520 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20  mp->tokenprefix 
22530 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d  ) prefix = lemp-
22540 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20  >tokenprefix;.  
22550 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
22560 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d          prefix =
22570 20 22 22 3b 0a 20 20 69 6e 20 3d 20 66 69 6c 65   "";.  in = file
22580 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c  _open(lemp,".h",
22590 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 20  "rb");.  if( in 
225a0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 43  ){.    int nextC
225b0 68 61 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  har;.    for(i=1
225c0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; i<lemp->ntermi
225d0 6e 61 6c 20 26 26 20 66 67 65 74 73 28 6c 69 6e  nal && fgets(lin
225e0 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 3b 20  e,LINESIZE,in); 
225f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6c 65 6d 6f  i++){.      lemo
22600 6e 5f 73 70 72 69 6e 74 66 28 70 61 74 74 65 72  n_sprintf(patter
22610 6e 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33  n,"#define %s%-3
22620 30 73 20 25 33 64 5c 6e 22 2c 0a 20 20 20 20 20  0s %3d\n",.     
22630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22640 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62  refix,lemp->symb
22650 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b  ols[i]->name,i);
22660 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
22670 70 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e 29 20  p(line,pattern) 
22680 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
22690 20 20 20 6e 65 78 74 43 68 61 72 20 3d 20 66 67     nextChar = fg
226a0 65 74 63 28 69 6e 29 3b 0a 20 20 20 20 66 63 6c  etc(in);.    fcl
226b0 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 69 66 28  ose(in);.    if(
226c0 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69   i==lemp->ntermi
226d0 6e 61 6c 20 26 26 20 6e 65 78 74 43 68 61 72 3d  nal && nextChar=
226e0 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 2f 2a  =EOF ){.      /*
226f0 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20 74 68   No change in th
22700 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74 20 72  e file.  Don't r
22710 65 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a 20 20  ewrite it. */.  
22720 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
22730 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20 66 69  }.  }.  out = fi
22740 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68  le_open(lemp,".h
22750 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f  ","wb");.  if( o
22760 75 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ut ){.    for(i=
22770 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  1; i<lemp->nterm
22780 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  inal; i++){.    
22790 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
227a0 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25  define %s%-30s %
227b0 33 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d  3d\n",prefix,lem
227c0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
227d0 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a 20 20  ame,i);.    }.  
227e0 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 20 20    fclose(out);  
227f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
22800 0a 0a 2f 2a 20 52 65 64 75 63 65 20 74 68 65 20  ../* Reduce the 
22810 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63 74 69  size of the acti
22820 6f 6e 20 74 61 62 6c 65 73 2c 20 69 66 20 70 6f  on tables, if po
22830 73 73 69 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e  ssible, by makin
22840 67 20 75 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61  g use.** of defa
22850 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ults..**.** In t
22860 68 69 73 20 76 65 72 73 69 6f 6e 2c 20 77 65 20  his version, we 
22870 74 61 6b 65 20 74 68 65 20 6d 6f 73 74 20 66 72  take the most fr
22880 65 71 75 65 6e 74 20 52 45 44 55 43 45 20 61 63  equent REDUCE ac
22890 74 69 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a  tion and make.**
228a0 20 69 74 20 74 68 65 20 64 65 66 61 75 6c 74 2e   it the default.
228b0 20 20 45 78 63 65 70 74 2c 20 74 68 65 72 65 20    Except, there 
228c0 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 69 66  is no default if
228d0 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f   the wildcard to
228e0 6b 65 6e 0a 2a 2a 20 69 73 20 61 20 70 6f 73 73  ken.** is a poss
228f0 69 62 6c 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 2e  ible look-ahead.
22900 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73  .*/.void Compres
22910 73 54 61 62 6c 65 73 28 73 74 72 75 63 74 20 6c  sTables(struct l
22920 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
22930 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
22940 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p;.  struct acti
22950 6f 6e 20 2a 61 70 2c 20 2a 61 70 32 2c 20 2a 6e  on *ap, *ap2, *n
22960 65 78 74 61 70 3b 0a 20 20 73 74 72 75 63 74 20  extap;.  struct 
22970 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c 20  rule *rp, *rp2, 
22980 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e 62  *rbest;.  int nb
22990 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 3b  est, n;.  int i;
229a0 0a 20 20 69 6e 74 20 75 73 65 73 57 69 6c 64 63  .  int usesWildc
229b0 61 72 64 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ard;..  for(i=0;
229c0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
229d0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
229e0 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
229f0 3b 0a 20 20 20 20 6e 62 65 73 74 20 3d 20 30 3b  ;.    nbest = 0;
22a00 0a 20 20 20 20 72 62 65 73 74 20 3d 20 30 3b 0a  .    rbest = 0;.
22a10 20 20 20 20 75 73 65 73 57 69 6c 64 63 61 72 64      usesWildcard
22a20 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28 61   = 0;..    for(a
22a30 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
22a40 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
22a50 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
22a60 3d 53 48 49 46 54 20 26 26 20 61 70 2d 3e 73 70  =SHIFT && ap->sp
22a70 3d 3d 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64  ==lemp->wildcard
22a80 20 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65 73   ){.        uses
22a90 57 69 6c 64 63 61 72 64 20 3d 20 31 3b 0a 20 20  Wildcard = 1;.  
22aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22ab0 61 70 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45  ap->type!=REDUCE
22ac0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
22ad0 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70     rp = ap->x.rp
22ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e  ;.      if( rp->
22af0 6c 68 73 53 74 61 72 74 20 29 20 63 6f 6e 74 69  lhsStart ) conti
22b00 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nue;.      if( r
22b10 70 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69  p==rbest ) conti
22b20 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 31  nue;.      n = 1
22b30 3b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 32 3d  ;.      for(ap2=
22b40 61 70 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20 61  ap->next; ap2; a
22b50 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a 20  p2=ap2->next){. 
22b60 20 20 20 20 20 20 20 69 66 28 20 61 70 32 2d 3e         if( ap2->
22b70 74 79 70 65 21 3d 52 45 44 55 43 45 20 29 20 63  type!=REDUCE ) c
22b80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
22b90 20 72 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72 70   rp2 = ap2->x.rp
22ba0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70  ;.        if( rp
22bb0 32 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69  2==rbest ) conti
22bc0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
22bd0 20 72 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a   rp2==rp ) n++;.
22be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22bf0 28 20 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20 20  ( n>nbest ){.   
22c00 20 20 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b 0a       nbest = n;.
22c10 20 20 20 20 20 20 20 20 72 62 65 73 74 20 3d 20          rbest = 
22c20 72 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rp;.      }.    
22c30 7d 0a 20 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  }. .    /* Do no
22c40 74 20 6d 61 6b 65 20 61 20 64 65 66 61 75 6c 74  t make a default
22c50 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   if the number o
22c60 66 20 72 75 6c 65 73 20 74 6f 20 64 65 66 61 75  f rules to defau
22c70 6c 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  lt.    ** is not
22c80 20 61 74 20 6c 65 61 73 74 20 31 20 6f 72 20 69   at least 1 or i
22c90 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74  f the wildcard t
22ca0 6f 6b 65 6e 20 69 73 20 61 20 70 6f 73 73 69 62  oken is a possib
22cb0 6c 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 6b 61 68  le.    ** lookah
22cc0 65 61 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ead..    */.    
22cd0 69 66 28 20 6e 62 65 73 74 3c 31 20 7c 7c 20 75  if( nbest<1 || u
22ce0 73 65 73 57 69 6c 64 63 61 72 64 20 29 20 63 6f  sesWildcard ) co
22cf0 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a  ntinue;...    /*
22d00 20 43 6f 6d 62 69 6e 65 20 6d 61 74 63 68 69 6e   Combine matchin
22d10 67 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73  g REDUCE actions
22d20 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 64   into a single d
22d30 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f  efault */.    fo
22d40 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
22d50 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
22d60 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
22d70 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70  pe==REDUCE && ap
22d80 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20  ->x.rp==rbest ) 
22d90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
22da0 20 61 73 73 65 72 74 28 20 61 70 20 29 3b 0a 20   assert( ap );. 
22db0 20 20 20 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62     ap->sp = Symb
22dc0 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74  ol_new("{default
22dd0 7d 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  }");.    for(ap=
22de0 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70  ap->next; ap; ap
22df0 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
22e00 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
22e10 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e  REDUCE && ap->x.
22e20 72 70 3d 3d 72 62 65 73 74 20 29 20 61 70 2d 3e  rp==rbest ) ap->
22e30 74 79 70 65 20 3d 20 4e 4f 54 5f 55 53 45 44 3b  type = NOT_USED;
22e40 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 70 2d 3e  .    }.    stp->
22e50 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74  ap = Action_sort
22e60 28 73 74 70 2d 3e 61 70 29 3b 0a 0a 20 20 20 20  (stp->ap);..    
22e70 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
22e80 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
22e90 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  {.      if( ap->
22ea0 74 79 70 65 3d 3d 53 48 49 46 54 20 29 20 62 72  type==SHIFT ) br
22eb0 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 61  eak;.      if( a
22ec0 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  p->type==REDUCE 
22ed0 26 26 20 61 70 2d 3e 78 2e 72 70 21 3d 72 62 65  && ap->x.rp!=rbe
22ee0 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  st ) break;.    
22ef0 7d 0a 20 20 20 20 69 66 28 20 61 70 3d 3d 30 20  }.    if( ap==0 
22f00 29 7b 0a 20 20 20 20 20 20 73 74 70 2d 3e 61 75  ){.      stp->au
22f10 74 6f 52 65 64 75 63 65 20 3d 20 31 3b 0a 20 20  toReduce = 1;.  
22f20 20 20 20 20 73 74 70 2d 3e 70 44 66 6c 74 52 65      stp->pDfltRe
22f30 64 75 63 65 20 3d 20 72 62 65 73 74 3b 0a 20 20  duce = rbest;.  
22f40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
22f50 6b 65 20 61 20 73 65 63 6f 6e 64 20 70 61 73 73  ke a second pass
22f60 20 6f 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73   over all states
22f70 20 61 6e 64 20 61 63 74 69 6f 6e 73 2e 20 20 43   and actions.  C
22f80 6f 6e 76 65 72 74 0a 20 20 2a 2a 20 65 76 65 72  onvert.  ** ever
22f90 79 20 61 63 74 69 6f 6e 20 74 68 61 74 20 69 73  y action that is
22fa0 20 61 20 53 48 49 46 54 20 74 6f 20 61 6e 20 61   a SHIFT to an a
22fb0 75 74 6f 52 65 64 75 63 65 20 73 74 61 74 65 20  utoReduce state 
22fc0 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 53 48 49 46  into.  ** a SHIF
22fd0 54 52 45 44 55 43 45 20 61 63 74 69 6f 6e 2e 0a  TREDUCE action..
22fe0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
22ff0 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
23000 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
23010 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
23020 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
23030 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
23040 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 73 74 72  next){.      str
23050 75 63 74 20 73 74 61 74 65 20 2a 70 4e 65 78 74  uct state *pNext
23060 53 74 61 74 65 3b 0a 20 20 20 20 20 20 69 66 28  State;.      if(
23070 20 61 70 2d 3e 74 79 70 65 21 3d 53 48 49 46 54   ap->type!=SHIFT
23080 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23090 20 20 20 70 4e 65 78 74 53 74 61 74 65 20 3d 20     pNextState = 
230a0 61 70 2d 3e 78 2e 73 74 70 3b 0a 20 20 20 20 20  ap->x.stp;.     
230b0 20 69 66 28 20 70 4e 65 78 74 53 74 61 74 65 2d   if( pNextState-
230c0 3e 61 75 74 6f 52 65 64 75 63 65 20 26 26 20 70  >autoReduce && p
230d0 4e 65 78 74 53 74 61 74 65 2d 3e 70 44 66 6c 74  NextState->pDflt
230e0 52 65 64 75 63 65 21 3d 30 20 29 7b 0a 20 20 20  Reduce!=0 ){.   
230f0 20 20 20 20 20 61 70 2d 3e 74 79 70 65 20 3d 20       ap->type = 
23100 53 48 49 46 54 52 45 44 55 43 45 3b 0a 20 20 20  SHIFTREDUCE;.   
23110 20 20 20 20 20 61 70 2d 3e 78 2e 72 70 20 3d 20       ap->x.rp = 
23120 70 4e 65 78 74 53 74 61 74 65 2d 3e 70 44 66 6c  pNextState->pDfl
23130 74 52 65 64 75 63 65 3b 0a 20 20 20 20 20 20 7d  tReduce;.      }
23140 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
23150 20 49 66 20 61 20 53 48 49 46 54 52 45 44 55 43   If a SHIFTREDUC
23160 45 20 61 63 74 69 6f 6e 20 73 70 65 63 69 66 69  E action specifi
23170 65 73 20 61 20 72 75 6c 65 20 74 68 61 74 20 68  es a rule that h
23180 61 73 20 61 20 73 69 6e 67 6c 65 20 52 48 53 20  as a single RHS 
23190 74 65 72 6d 0a 20 20 2a 2a 20 28 6d 65 61 6e 69  term.  ** (meani
231a0 6e 67 20 74 68 61 74 20 74 68 65 20 53 48 49 46  ng that the SHIF
231b0 54 52 45 44 55 43 45 20 77 69 6c 6c 20 6c 61 6e  TREDUCE will lan
231c0 64 20 62 61 63 6b 20 69 6e 20 74 68 65 20 73 74  d back in the st
231d0 61 74 65 20 77 68 65 72 65 20 69 74 0a 20 20 2a  ate where it.  *
231e0 2a 20 73 74 61 72 74 65 64 29 20 61 6e 64 20 69  * started) and i
231f0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 43 2d  f there is no C-
23200 63 6f 64 65 20 61 73 73 6f 63 69 61 74 65 64 20  code associated 
23210 77 69 74 68 20 74 68 65 20 72 65 64 75 63 65 20  with the reduce 
23220 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65  action,.  ** the
23230 6e 20 77 65 20 63 61 6e 20 67 6f 20 61 68 65 61  n we can go ahea
23240 64 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68  d and convert th
23250 65 20 61 63 74 69 6f 6e 20 74 6f 20 62 65 20 74  e action to be t
23260 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 20  he same as the. 
23270 20 2a 2a 20 61 63 74 69 6f 6e 20 66 6f 72 20 74   ** action for t
23280 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 72 75  he RHS of the ru
23290 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  le..  */.  for(i
232a0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
232b0 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
232c0 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
232d0 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  [i];.    for(ap=
232e0 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
232f0 6e 65 78 74 61 70 29 7b 0a 20 20 20 20 20 20 6e  nextap){.      n
23300 65 78 74 61 70 20 3d 20 61 70 2d 3e 6e 65 78 74  extap = ap->next
23310 3b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  ;.      if( ap->
23320 74 79 70 65 21 3d 53 48 49 46 54 52 45 44 55 43  type!=SHIFTREDUC
23330 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  E ) continue;.  
23340 20 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72      rp = ap->x.r
23350 70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d  p;.      if( rp-
23360 3e 6e 6f 43 6f 64 65 3d 3d 30 20 29 20 63 6f 6e  >noCode==0 ) con
23370 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
23380 20 72 70 2d 3e 6e 72 68 73 21 3d 31 20 29 20 63   rp->nrhs!=1 ) c
23390 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 20 31 0a 20  ontinue;.#if 1. 
233a0 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 61 70 70       /* Only app
233b0 6c 79 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  ly this optimiza
233c0 74 69 6f 6e 20 74 6f 20 6e 6f 6e 2d 74 65 72 6d  tion to non-term
233d0 69 6e 61 6c 73 2e 20 20 49 74 20 77 6f 75 6c 64  inals.  It would
233e0 20 62 65 20 4f 4b 20 74 6f 0a 20 20 20 20 20 20   be OK to.      
233f0 2a 2a 20 61 70 70 6c 79 20 69 74 20 74 6f 20 74  ** apply it to t
23400 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20  erminal symbols 
23410 74 6f 6f 2c 20 62 75 74 20 74 68 61 74 20 6d 61  too, but that ma
23420 6b 65 73 20 74 68 65 20 70 61 72 73 65 72 20 74  kes the parser t
23430 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 6c  ables.      ** l
23440 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  arger. */.      
23450 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
23460 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  x<lemp->ntermina
23470 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65  l ) continue;.#e
23480 6e 64 69 66 0a 20 20 20 20 20 20 2f 2a 20 49 66  ndif.      /* If
23490 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
234a0 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
234b0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
234c0 63 61 6e 20 62 65 20 61 70 70 6c 69 65 64 20 2a  can be applied *
234d0 2f 0a 20 20 20 20 20 20 6e 65 78 74 61 70 20 3d  /.      nextap =
234e0 20 61 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 61   ap;.      for(a
234f0 70 32 3d 73 74 70 2d 3e 61 70 3b 20 61 70 32 20  p2=stp->ap; ap2 
23500 26 26 20 28 61 70 32 3d 3d 61 70 20 7c 7c 20 61  && (ap2==ap || a
23510 70 32 2d 3e 73 70 21 3d 72 70 2d 3e 6c 68 73 29  p2->sp!=rp->lhs)
23520 3b 20 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29  ; ap2=ap2->next)
23530 7b 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  {}.      assert(
23540 20 61 70 32 21 3d 30 20 29 3b 0a 20 20 20 20 20   ap2!=0 );.     
23550 20 61 70 2d 3e 73 70 4f 70 74 20 3d 20 61 70 32   ap->spOpt = ap2
23560 2d 3e 73 70 3b 0a 20 20 20 20 20 20 61 70 2d 3e  ->sp;.      ap->
23570 74 79 70 65 20 3d 20 61 70 32 2d 3e 74 79 70 65  type = ap2->type
23580 3b 0a 20 20 20 20 20 20 61 70 2d 3e 78 20 3d 20  ;.      ap->x = 
23590 61 70 32 2d 3e 78 3b 0a 20 20 20 20 7d 0a 20 20  ap2->x;.    }.  
235a0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  }.}.../*.** Comp
235b0 61 72 65 20 74 77 6f 20 73 74 61 74 65 73 20 66  are two states f
235c0 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f  or sorting purpo
235d0 73 65 73 2e 20 20 54 68 65 20 73 6d 61 6c 6c 65  ses.  The smalle
235e0 72 20 73 74 61 74 65 20 69 73 20 74 68 65 0a 2a  r state is the.*
235f0 2a 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d  * one with the m
23600 6f 73 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  ost non-terminal
23610 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68   actions.  If th
23620 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
23630 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f   number.** of no
23640 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f  n-terminal actio
23650 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 73 6d 61  ns, then the sma
23660 6c 6c 65 72 20 69 73 20 74 68 65 20 6f 6e 65 20  ller is the one 
23670 77 69 74 68 20 74 68 65 20 6d 6f 73 74 0a 2a 2a  with the most.**
23680 20 74 6f 6b 65 6e 20 61 63 74 69 6f 6e 73 2e 0a   token actions..
23690 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74  */.static int st
236a0 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65  ateResortCompare
236b0 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20  (const void *a, 
236c0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a  const void *b){.
236d0 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
236e0 74 61 74 65 20 2a 70 41 20 3d 20 2a 28 63 6f 6e  tate *pA = *(con
236f0 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65 2a  st struct state*
23700 2a 29 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72  *)a;.  const str
23710 75 63 74 20 73 74 61 74 65 20 2a 70 42 20 3d 20  uct state *pB = 
23720 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73  *(const struct s
23730 74 61 74 65 2a 2a 29 62 3b 0a 20 20 69 6e 74 20  tate**)b;.  int 
23740 6e 3b 0a 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e  n;..  n = pB->nN
23750 74 41 63 74 20 2d 20 70 41 2d 3e 6e 4e 74 41 63  tAct - pA->nNtAc
23760 74 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  t;.  if( n==0 ){
23770 0a 20 20 20 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b  .    n = pB->nTk
23780 6e 41 63 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41  nAct - pA->nTknA
23790 63 74 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30  ct;.    if( n==0
237a0 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 42   ){.      n = pB
237b0 2d 3e 73 74 61 74 65 6e 75 6d 20 2d 20 70 41 2d  ->statenum - pA-
237c0 3e 73 74 61 74 65 6e 75 6d 3b 0a 20 20 20 20 7d  >statenum;.    }
237d0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
237e0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
237f0 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e  n;.}.../*.** Ren
23800 75 6d 62 65 72 20 61 6e 64 20 72 65 73 6f 72 74  umber and resort
23810 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20   states so that 
23820 73 74 61 74 65 73 20 77 69 74 68 20 66 65 77 65  states with fewe
23830 72 20 63 68 6f 69 63 65 73 0a 2a 2a 20 6f 63 63  r choices.** occ
23840 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ur at the end.  
23850 45 78 63 65 70 74 2c 20 6b 65 65 70 20 73 74 61  Except, keep sta
23860 74 65 20 30 20 61 73 20 74 68 65 20 66 69 72 73  te 0 as the firs
23870 74 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64  t state..*/.void
23880 20 52 65 73 6f 72 74 53 74 61 74 65 73 28 73 74   ResortStates(st
23890 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
238a0 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  ).{.  int i;.  s
238b0 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
238c0 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
238d0 6e 20 2a 61 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  n *ap;..  for(i=
238e0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
238f0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
23900 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
23910 69 5d 3b 0a 20 20 20 20 73 74 70 2d 3e 6e 54 6b  i];.    stp->nTk
23920 6e 41 63 74 20 3d 20 73 74 70 2d 3e 6e 4e 74 41  nAct = stp->nNtA
23930 63 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 70 2d  ct = 0;.    stp-
23940 3e 69 44 66 6c 74 52 65 64 75 63 65 20 3d 20 6c  >iDfltReduce = l
23950 65 6d 70 2d 3e 6e 72 75 6c 65 3b 20 20 2f 2a 20  emp->nrule;  /* 
23960 49 6e 69 74 20 64 66 6c 74 20 61 63 74 69 6f 6e  Init dflt action
23970 20 74 6f 20 22 73 79 6e 74 61 78 20 65 72 72 6f   to "syntax erro
23980 72 22 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 69  r" */.    stp->i
23990 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46  TknOfst = NO_OFF
239a0 53 45 54 3b 0a 20 20 20 20 73 74 70 2d 3e 69 4e  SET;.    stp->iN
239b0 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45  tOfst = NO_OFFSE
239c0 54 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  T;.    for(ap=st
239d0 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
239e0 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
239f0 6e 74 20 69 41 63 74 69 6f 6e 20 3d 20 63 6f 6d  nt iAction = com
23a00 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70  pute_action(lemp
23a10 2c 61 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ,ap);.      if( 
23a20 69 41 63 74 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20  iAction>=0 ){.  
23a30 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70        if( ap->sp
23a40 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74  ->index<lemp->nt
23a50 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20  erminal ){.     
23a60 20 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63       stp->nTknAc
23a70 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t++;.        }el
23a80 73 65 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69  se if( ap->sp->i
23a90 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  ndex<lemp->nsymb
23aa0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
23ab0 73 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b 3b 0a 20  stp->nNtAct++;. 
23ac0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
23ad0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
23ae0 73 74 70 2d 3e 61 75 74 6f 52 65 64 75 63 65 3d  stp->autoReduce=
23af0 3d 30 20 7c 7c 20 73 74 70 2d 3e 70 44 66 6c 74  =0 || stp->pDflt
23b00 52 65 64 75 63 65 3d 3d 61 70 2d 3e 78 2e 72 70  Reduce==ap->x.rp
23b10 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74   );.          st
23b20 70 2d 3e 69 44 66 6c 74 52 65 64 75 63 65 20 3d  p->iDfltReduce =
23b30 20 69 41 63 74 69 6f 6e 20 2d 20 6c 65 6d 70 2d   iAction - lemp-
23b40 3e 6e 73 74 61 74 65 20 2d 20 6c 65 6d 70 2d 3e  >nstate - lemp->
23b50 6e 72 75 6c 65 3b 0a 20 20 20 20 20 20 20 20 7d  nrule;.        }
23b60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23b70 20 7d 0a 20 20 71 73 6f 72 74 28 26 6c 65 6d 70   }.  qsort(&lemp
23b80 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c 20 6c 65 6d  ->sorted[1], lem
23b90 70 2d 3e 6e 73 74 61 74 65 2d 31 2c 20 73 69 7a  p->nstate-1, siz
23ba0 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  eof(lemp->sorted
23bb0 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20 73 74  [0]),.        st
23bc0 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65  ateResortCompare
23bd0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
23be0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
23bf0 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 6f  +){.    lemp->so
23c00 72 74 65 64 5b 69 5d 2d 3e 73 74 61 74 65 6e 75  rted[i]->statenu
23c10 6d 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 6c 65 6d  m = i;.  }.  lem
23c20 70 2d 3e 6e 78 73 74 61 74 65 20 3d 20 6c 65 6d  p->nxstate = lem
23c30 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68 69  p->nstate;.  whi
23c40 6c 65 28 20 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  le( lemp->nxstat
23c50 65 3e 31 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72  e>1 && lemp->sor
23c60 74 65 64 5b 6c 65 6d 70 2d 3e 6e 78 73 74 61 74  ted[lemp->nxstat
23c70 65 2d 31 5d 2d 3e 61 75 74 6f 52 65 64 75 63 65  e-1]->autoReduce
23c80 20 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 6e 78   ){.    lemp->nx
23c90 73 74 61 74 65 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a  state--;.  }.}..
23ca0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
23cb0 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
23cc0 65 20 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  e "set.c" ******
23cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
23cf0 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75  /*.** Set manipu
23d00 6c 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  lation routines 
23d10 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
23d20 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
23d30 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  */..static int s
23d40 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74  ize = 0;../* Set
23d50 20 74 68 65 20 73 65 74 20 73 69 7a 65 20 2a 2f   the set size */
23d60 0a 76 6f 69 64 20 53 65 74 53 69 7a 65 28 69 6e  .void SetSize(in
23d70 74 20 6e 29 0a 7b 0a 20 20 73 69 7a 65 20 3d 20  t n).{.  size = 
23d80 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63  n+1;.}../* Alloc
23d90 61 74 65 20 61 20 6e 65 77 20 73 65 74 20 2a 2f  ate a new set */
23da0 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 29 7b  .char *SetNew(){
23db0 0a 20 20 63 68 61 72 20 2a 73 3b 0a 20 20 73 20  .  char *s;.  s 
23dc0 3d 20 28 63 68 61 72 2a 29 63 61 6c 6c 6f 63 28  = (char*)calloc(
23dd0 20 73 69 7a 65 2c 20 31 29 3b 0a 20 20 69 66 28   size, 1);.  if(
23de0 20 73 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 74   s==0 ){.    ext
23df0 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f  ern void memory_
23e00 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 6d 65 6d  error();.    mem
23e10 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d  ory_error();.  }
23e20 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a  .  return s;.}..
23e30 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  /* Deallocate a 
23e40 73 65 74 20 2a 2f 0a 76 6f 69 64 20 53 65 74 46  set */.void SetF
23e50 72 65 65 28 63 68 61 72 20 2a 73 29 0a 7b 0a 20  ree(char *s).{. 
23e60 20 66 72 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20   free(s);.}../* 
23e70 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
23e80 74 20 74 6f 20 74 68 65 20 73 65 74 2e 20 20 52  t to the set.  R
23e90 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
23ea0 65 20 65 6c 65 6d 65 6e 74 20 77 61 73 20 61 64  e element was ad
23eb0 64 65 64 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45  ded.** and FALSE
23ec0 20 69 66 20 69 74 20 77 61 73 20 61 6c 72 65 61   if it was alrea
23ed0 64 79 20 74 68 65 72 65 2e 20 2a 2f 0a 69 6e 74  dy there. */.int
23ee0 20 53 65 74 41 64 64 28 63 68 61 72 20 2a 73 2c   SetAdd(char *s,
23ef0 20 69 6e 74 20 65 29 0a 7b 0a 20 20 69 6e 74 20   int e).{.  int 
23f00 72 76 3b 0a 20 20 61 73 73 65 72 74 28 20 65 3e  rv;.  assert( e>
23f10 3d 30 20 26 26 20 65 3c 73 69 7a 65 20 29 3b 0a  =0 && e<size );.
23f20 20 20 72 76 20 3d 20 73 5b 65 5d 3b 0a 20 20 73    rv = s[e];.  s
23f30 5b 65 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  [e] = 1;.  retur
23f40 6e 20 21 72 76 3b 0a 7d 0a 0a 2f 2a 20 41 64 64  n !rv;.}../* Add
23f50 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
23f60 66 20 73 32 20 74 6f 20 73 31 2e 20 20 52 65 74  f s2 to s1.  Ret
23f70 75 72 6e 20 54 52 55 45 20 69 66 20 73 31 20 63  urn TRUE if s1 c
23f80 68 61 6e 67 65 73 2e 20 2a 2f 0a 69 6e 74 20 53  hanges. */.int S
23f90 65 74 55 6e 69 6f 6e 28 63 68 61 72 20 2a 73 31  etUnion(char *s1
23fa0 2c 20 63 68 61 72 20 2a 73 32 29 0a 7b 0a 20 20  , char *s2).{.  
23fb0 69 6e 74 20 69 2c 20 70 72 6f 67 72 65 73 73 3b  int i, progress;
23fc0 0a 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b  .  progress = 0;
23fd0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
23fe0 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ze; i++){.    if
23ff0 28 20 73 32 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  ( s2[i]==0 ) con
24000 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
24010 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  1[i]==0 ){.     
24020 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20   progress = 1;. 
24030 20 20 20 20 20 73 31 5b 69 5d 20 3d 20 31 3b 0a       s1[i] = 1;.
24040 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24050 72 6e 20 70 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f  rn progress;.}./
24060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24070 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
24080 66 69 6c 65 20 22 74 61 62 6c 65 2e 63 22 20 2a  file "table.c" *
24090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
240a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
240b0 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74  ** All code in t
240c0 68 69 73 20 66 69 6c 65 20 68 61 73 20 62 65 65  his file has bee
240d0 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  n automatically 
240e0 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f  generated.** fro
240f0 6d 20 61 20 73 70 65 63 69 66 69 63 61 74 69 6f  m a specificatio
24100 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  n in the file.**
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
24120 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68  able.q".** by th
24130 65 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  e associative ar
24140 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e  ray code buildin
24150 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e  g program "aagen
24160 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69  "..** Do not edi
24170 74 20 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e  t this file!  In
24180 73 74 65 61 64 2c 20 65 64 69 74 20 74 68 65 20  stead, edit the 
24190 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a  specification.**
241a0 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75   file, then reru
241b0 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a  n aagen..*/./*.*
241c0 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65  * Code for proce
241d0 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20  ssing tables in 
241e0 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
241f0 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
24200 50 52 49 56 41 54 45 20 75 6e 73 69 67 6e 65 64  PRIVATE unsigned
24210 20 73 74 72 68 61 73 68 28 63 6f 6e 73 74 20 63   strhash(const c
24220 68 61 72 20 2a 78 29 0a 7b 0a 20 20 75 6e 73 69  har *x).{.  unsi
24230 67 6e 65 64 20 68 20 3d 20 30 3b 0a 20 20 77 68  gned h = 0;.  wh
24240 69 6c 65 28 20 2a 78 20 29 20 68 20 3d 20 68 2a  ile( *x ) h = h*
24250 31 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20 72  13 + *(x++);.  r
24260 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 57  eturn h;.}../* W
24270 6f 72 6b 73 20 6c 69 6b 65 20 73 74 72 64 75 70  orks like strdup
24280 2c 20 73 6f 72 74 20 6f 66 2e 20 20 53 61 76 65  , sort of.  Save
24290 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d 61 6c   a string in mal
242a0 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 2c 20 62 75  loced memory, bu
242b0 74 0a 2a 2a 20 6b 65 65 70 20 73 74 72 69 6e 67  t.** keep string
242c0 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73 6f 20  s in a table so 
242d0 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 73 74  that the same st
242e0 72 69 6e 67 20 69 73 20 6e 6f 74 20 69 6e 20 6d  ring is not in m
242f0 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65 20  ore.** than one 
24300 70 6c 61 63 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  place..*/.const 
24310 63 68 61 72 20 2a 53 74 72 73 61 66 65 28 63 6f  char *Strsafe(co
24320 6e 73 74 20 63 68 61 72 20 2a 79 29 0a 7b 0a 20  nst char *y).{. 
24330 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
24340 20 20 63 68 61 72 20 2a 63 70 79 3b 0a 0a 20 20    char *cpy;..  
24350 69 66 28 20 79 3d 3d 30 20 29 20 72 65 74 75 72  if( y==0 ) retur
24360 6e 20 30 3b 0a 20 20 7a 20 3d 20 53 74 72 73 61  n 0;.  z = Strsa
24370 66 65 5f 66 69 6e 64 28 79 29 3b 0a 20 20 69 66  fe_find(y);.  if
24380 28 20 7a 3d 3d 30 20 26 26 20 28 63 70 79 3d 28  ( z==0 && (cpy=(
24390 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c  char *)malloc( l
243a0 65 6d 6f 6e 53 74 72 6c 65 6e 28 79 29 2b 31 20  emonStrlen(y)+1 
243b0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 6c 65 6d  ))!=0 ){.    lem
243c0 6f 6e 5f 73 74 72 63 70 79 28 63 70 79 2c 79 29  on_strcpy(cpy,y)
243d0 3b 0a 20 20 20 20 7a 20 3d 20 63 70 79 3b 0a 20  ;.    z = cpy;. 
243e0 20 20 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72     Strsafe_inser
243f0 74 28 7a 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d 6f  t(z);.  }.  Memo
24400 72 79 43 68 65 63 6b 28 7a 29 3b 0a 20 20 72 65  ryCheck(z);.  re
24410 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn z;.}../* Th
24420 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
24430 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
24440 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
24450 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
24460 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
24470 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 73 74  type "x1"..*/.st
24480 72 75 63 74 20 73 5f 78 31 20 7b 0a 20 20 69 6e  ruct s_x1 {.  in
24490 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
244a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
244b0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
244c0 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
244d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244e0 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
244f0 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
24500 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
24510 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
24520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
24530 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
24540 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
24550 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24560 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
24570 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
24580 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64    struct s_x1nod
24590 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
245a0 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
245b0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
245c0 31 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  1node **ht;  /* 
245d0 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
245e0 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
245f0 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
24600 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
24610 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
24620 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
24630 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
24640 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
24650 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x1"..*/.type
24660 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 31 6e  def struct s_x1n
24670 6f 64 65 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  ode {.  const ch
24680 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ar *data;       
24690 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
246a0 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64    struct s_x1nod
246b0 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65  e *next;   /* Ne
246c0 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  xt entry with th
246d0 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20  e same hash */. 
246e0 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
246f0 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65   **from;  /* Pre
24700 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20  vious link */.} 
24710 78 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72  x1node;../* Ther
24720 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e  e is only one in
24730 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72  stance of the ar
24740 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68  ray, which is th
24750 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
24760 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78  tatic struct s_x
24770 31 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f  1 *x1a;../* Allo
24780 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63  cate a new assoc
24790 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a  iative array */.
247a0 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e 69  void Strsafe_ini
247b0 74 28 29 7b 0a 20 20 69 66 28 20 78 31 61 20 29  t(){.  if( x1a )
247c0 20 72 65 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d   return;.  x1a =
247d0 20 28 73 74 72 75 63 74 20 73 5f 78 31 2a 29 6d   (struct s_x1*)m
247e0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
247f0 72 75 63 74 20 73 5f 78 31 29 20 29 3b 0a 20 20  ruct s_x1) );.  
24800 69 66 28 20 78 31 61 20 29 7b 0a 20 20 20 20 78  if( x1a ){.    x
24810 31 61 2d 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b  1a->size = 1024;
24820 0a 20 20 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20  .    x1a->count 
24830 3d 20 30 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62  = 0;.    x1a->tb
24840 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 63 61 6c  l = (x1node*)cal
24850 6c 6f 63 28 31 30 32 34 2c 20 73 69 7a 65 6f 66  loc(1024, sizeof
24860 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x1node) + sizeo
24870 66 28 78 31 6e 6f 64 65 2a 29 29 3b 0a 20 20 20  f(x1node*));.   
24880 20 69 66 28 20 78 31 61 2d 3e 74 62 6c 3d 3d 30   if( x1a->tbl==0
24890 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78   ){.      free(x
248a0 31 61 29 3b 0a 20 20 20 20 20 20 78 31 61 20 3d  1a);.      x1a =
248b0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
248c0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
248d0 20 20 78 31 61 2d 3e 68 74 20 3d 20 28 78 31 6e    x1a->ht = (x1n
248e0 6f 64 65 2a 2a 29 26 28 78 31 61 2d 3e 74 62 6c  ode**)&(x1a->tbl
248f0 5b 31 30 32 34 5d 29 3b 0a 20 20 20 20 20 20 66  [1024]);.      f
24900 6f 72 28 69 3d 30 3b 20 69 3c 31 30 32 34 3b 20  or(i=0; i<1024; 
24910 69 2b 2b 29 20 78 31 61 2d 3e 68 74 5b 69 5d 20  i++) x1a->ht[i] 
24920 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
24930 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  ./* Insert a new
24940 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
24950 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
24960 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66  TRUE if successf
24970 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74  ul..** Prior dat
24980 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  a with the same 
24990 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77  key is NOT overw
249a0 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74  ritten */.int St
249b0 72 73 61 66 65 5f 69 6e 73 65 72 74 28 63 6f 6e  rsafe_insert(con
249c0 73 74 20 63 68 61 72 20 2a 64 61 74 61 29 0a 7b  st char *data).{
249d0 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20  .  x1node *np;. 
249e0 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75   unsigned h;.  u
249f0 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69  nsigned ph;..  i
24a00 66 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75  f( x1a==0 ) retu
24a10 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72  rn 0;.  ph = str
24a20 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20  hash(data);.  h 
24a30 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a  = ph & (x1a->siz
24a40 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61  e-1);.  np = x1a
24a50 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
24a60 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
24a70 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c  strcmp(np->data,
24a80 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20  data)==0 ){.    
24a90 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
24aa0 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
24ab0 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e  same key is foun
24ac0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46  d. */.      /* F
24ad0 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72  ail because over
24ae0 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c  write is not all
24af0 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ows. */.      re
24b00 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
24b10 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
24b20 0a 20 20 7d 0a 20 20 69 66 28 20 78 31 61 2d 3e  .  }.  if( x1a->
24b30 63 6f 75 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a 65  count>=x1a->size
24b40 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20   ){.    /* Need 
24b50 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68  to make the hash
24b60 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f   table bigger */
24b70 0a 20 20 20 20 69 6e 74 20 69 2c 61 72 72 53 69  .    int i,arrSi
24b80 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  ze;.    struct s
24b90 5f 78 31 20 61 72 72 61 79 3b 0a 20 20 20 20 61  _x1 array;.    a
24ba0 72 72 61 79 2e 73 69 7a 65 20 3d 20 61 72 72 53  rray.size = arrS
24bb0 69 7a 65 20 3d 20 78 31 61 2d 3e 73 69 7a 65 2a  ize = x1a->size*
24bc0 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75  2;.    array.cou
24bd0 6e 74 20 3d 20 78 31 61 2d 3e 63 6f 75 6e 74 3b  nt = x1a->count;
24be0 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d  .    array.tbl =
24bf0 20 28 78 31 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63   (x1node*)calloc
24c00 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66  (arrSize, sizeof
24c10 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x1node) + sizeo
24c20 66 28 78 31 6e 6f 64 65 2a 29 29 3b 0a 20 20 20  f(x1node*));.   
24c30 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d   if( array.tbl==
24c40 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
24c50 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61  * Fail due to ma
24c60 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a  lloc failure */.
24c70 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28      array.ht = (
24c80 78 31 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79  x1node**)&(array
24c90 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a  .tbl[arrSize]);.
24ca0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
24cb0 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  rrSize; i++) arr
24cc0 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  ay.ht[i] = 0;.  
24cd0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61    for(i=0; i<x1a
24ce0 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20  ->count; i++){. 
24cf0 20 20 20 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64       x1node *old
24d00 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20  np, *newnp;.    
24d10 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d    oldnp = &(x1a-
24d20 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >tbl[i]);.      
24d30 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e  h = strhash(oldn
24d40 70 2d 3e 64 61 74 61 29 20 26 20 28 61 72 72 53  p->data) & (arrS
24d50 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65  ize-1);.      ne
24d60 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62  wnp = &(array.tb
24d70 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  l[i]);.      if(
24d80 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61   array.ht[h] ) a
24d90 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  rray.ht[h]->from
24da0 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74   = &(newnp->next
24db0 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  );.      newnp->
24dc0 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b  next = array.ht[
24dd0 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  h];.      newnp-
24de0 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64  >data = oldnp->d
24df0 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  ata;.      newnp
24e00 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79  ->from = &(array
24e10 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61  .ht[h]);.      a
24e20 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77  rray.ht[h] = new
24e30 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  np;.    }.    fr
24e40 65 65 28 78 31 61 2d 3e 74 62 6c 29 3b 0a 20 20  ee(x1a->tbl);.  
24e50 20 20 2a 78 31 61 20 3d 20 61 72 72 61 79 3b 0a    *x1a = array;.
24e60 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20    }.  /* Insert 
24e70 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a  the new data */.
24e80 20 20 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d    h = ph & (x1a-
24e90 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
24ea0 20 26 28 78 31 61 2d 3e 74 62 6c 5b 78 31 61 2d   &(x1a->tbl[x1a-
24eb0 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70  >count++]);.  np
24ec0 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20  ->data = data;. 
24ed0 20 69 66 28 20 78 31 61 2d 3e 68 74 5b 68 5d 20   if( x1a->ht[h] 
24ee0 29 20 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72  ) x1a->ht[h]->fr
24ef0 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29  om = &(np->next)
24f00 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78  ;.  np->next = x
24f10 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 31 61  1a->ht[h];.  x1a
24f20 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20  ->ht[h] = np;.  
24f30 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 31 61  np->from = &(x1a
24f40 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75  ->ht[h]);.  retu
24f50 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  rn 1;.}../* Retu
24f60 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
24f70 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f  data assigned to
24f80 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20   the given key. 
24f90 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20   Return NULL.** 
24fa0 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20  if no such key. 
24fb0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53  */.const char *S
24fc0 74 72 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73  trsafe_find(cons
24fd0 74 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20  t char *key).{. 
24fe0 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 78   unsigned h;.  x
24ff0 31 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  1node *np;..  if
25000 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x1a==0 ) retur
25010 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61  n 0;.  h = strha
25020 73 68 28 6b 65 79 29 20 26 20 28 78 31 61 2d 3e  sh(key) & (x1a->
25030 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
25040 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x1a->ht[h];.  wh
25050 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
25060 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61  f( strcmp(np->da
25070 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65  ta,key)==0 ) bre
25080 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d  ak;.    np = np-
25090 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  >next;.  }.  ret
250a0 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74  urn np ? np->dat
250b0 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  a : 0;.}../* Ret
250c0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
250d0 20 74 68 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f   the (terminal o
250e0 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73  r nonterminal) s
250f0 79 6d 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72  ymbol "x"..** Cr
25100 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f  eate a new symbo
25110 6c 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  l if this is the
25120 20 66 69 72 73 74 20 74 69 6d 65 20 22 78 22 20   first time "x" 
25130 68 61 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a  has been seen..*
25140 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
25150 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73  *Symbol_new(cons
25160 74 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20 73  t char *x).{.  s
25170 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
25180 3b 0a 0a 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c  ;..  sp = Symbol
25190 5f 66 69 6e 64 28 78 29 3b 0a 20 20 69 66 28 20  _find(x);.  if( 
251a0 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 70 20  sp==0 ){.    sp 
251b0 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  = (struct symbol
251c0 20 2a 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a   *)calloc(1, siz
251d0 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
251e0 6c 29 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79  l) );.    Memory
251f0 43 68 65 63 6b 28 73 70 29 3b 0a 20 20 20 20 73  Check(sp);.    s
25200 70 2d 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61 66  p->name = Strsaf
25210 65 28 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79  e(x);.    sp->ty
25220 70 65 20 3d 20 49 53 55 50 50 45 52 28 2a 78 29  pe = ISUPPER(*x)
25230 20 3f 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f   ? TERMINAL : NO
25240 4e 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73  NTERMINAL;.    s
25250 70 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  p->rule = 0;.   
25260 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20   sp->fallback = 
25270 30 3b 0a 20 20 20 20 73 70 2d 3e 70 72 65 63 20  0;.    sp->prec 
25280 3d 20 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73  = -1;.    sp->as
25290 73 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73  soc = UNK;.    s
252a0 70 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 30 3b  p->firstset = 0;
252b0 0a 20 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20  .    sp->lambda 
252c0 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20  = LEMON_FALSE;. 
252d0 20 20 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f     sp->destructo
252e0 72 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64  r = 0;.    sp->d
252f0 65 73 74 4c 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20  estLineno = 0;. 
25300 20 20 20 73 70 2d 3e 64 61 74 61 74 79 70 65 20     sp->datatype 
25310 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 75 73 65  = 0;.    sp->use
25320 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 53 79 6d  Cnt = 0;.    Sym
25330 62 6f 6c 5f 69 6e 73 65 72 74 28 73 70 2c 73 70  bol_insert(sp,sp
25340 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  ->name);.  }.  s
25350 70 2d 3e 75 73 65 43 6e 74 2b 2b 3b 0a 20 20 72  p->useCnt++;.  r
25360 65 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20  eturn sp;.}../* 
25370 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 79 6d 62  Compare two symb
25380 6f 6c 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20  ols for sorting 
25390 70 75 72 70 6f 73 65 73 2e 20 20 52 65 74 75 72  purposes.  Retur
253a0 6e 20 6e 65 67 61 74 69 76 65 2c 0a 2a 2a 20 7a  n negative,.** z
253b0 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
253c0 20 69 66 20 61 20 69 73 20 6c 65 73 73 20 74 68   if a is less th
253d0 65 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  en, equal to, or
253e0 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e   greater.** than
253f0 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c   b..**.** Symbol
25400 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
25410 68 20 75 70 70 65 72 20 63 61 73 65 20 6c 65 74  h upper case let
25420 74 65 72 73 20 28 74 65 72 6d 69 6e 61 6c 73 20  ters (terminals 
25430 6f 72 20 74 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75  or tokens).** mu
25440 73 74 20 73 6f 72 74 20 62 65 66 6f 72 65 20 73  st sort before s
25450 79 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69  ymbols that begi
25460 6e 20 77 69 74 68 20 6c 6f 77 65 72 20 63 61 73  n with lower cas
25470 65 20 6c 65 74 74 65 72 73 0a 2a 2a 20 28 6e 6f  e letters.** (no
25480 6e 2d 74 65 72 6d 69 6e 61 6c 73 29 2e 20 20 41  n-terminals).  A
25490 6e 64 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  nd MULTITERMINAL
254a0 20 73 79 6d 62 6f 6c 73 20 28 63 72 65 61 74 65   symbols (create
254b0 64 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 25  d using the.** %
254c0 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 64 69 72 65  token_class dire
254d0 63 74 69 76 65 29 20 6d 75 73 74 20 73 6f 72 74  ctive) must sort
254e0 20 61 74 20 74 68 65 20 76 65 72 79 20 65 6e 64   at the very end
254f0 2e 20 4f 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20  . Other than.** 
25500 74 68 61 74 2c 20 74 68 65 20 6f 72 64 65 72 20  that, the order 
25510 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e  does not matter.
25520 0a 2a 2a 0a 2a 2a 20 57 65 20 66 69 6e 64 20 65  .**.** We find e
25530 78 70 65 72 69 6d 65 6e 74 61 6c 6c 79 20 74 68  xperimentally th
25540 61 74 20 6c 65 61 76 69 6e 67 20 74 68 65 20 73  at leaving the s
25550 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 69 72 20  ymbols in their 
25560 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65  original.** orde
25570 72 20 28 74 68 65 20 6f 72 64 65 72 20 74 68 65  r (the order the
25580 79 20 61 70 70 65 61 72 65 64 20 69 6e 20 74 68  y appeared in th
25590 65 20 67 72 61 6d 6d 61 72 20 66 69 6c 65 29 20  e grammar file) 
255a0 67 69 76 65 73 20 74 68 65 0a 2a 2a 20 73 6d 61  gives the.** sma
255b0 6c 6c 65 73 74 20 70 61 72 73 65 72 20 74 61 62  llest parser tab
255c0 6c 65 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a  les in SQLite..*
255d0 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70  /.int Symbolcmpp
255e0 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 61 2c  (const void *_a,
255f0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 62 29   const void *_b)
25600 0a 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  .{.  const struc
25610 74 20 73 79 6d 62 6f 6c 20 2a 61 20 3d 20 2a 28  t symbol *a = *(
25620 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d  const struct sym
25630 62 6f 6c 20 2a 2a 29 20 5f 61 3b 0a 20 20 63 6f  bol **) _a;.  co
25640 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f  nst struct symbo
25650 6c 20 2a 62 20 3d 20 2a 28 63 6f 6e 73 74 20 73  l *b = *(const s
25660 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29  truct symbol **)
25670 20 5f 62 3b 0a 20 20 69 6e 74 20 69 31 20 3d 20   _b;.  int i1 = 
25680 61 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  a->type==MULTITE
25690 52 4d 49 4e 41 4c 20 3f 20 33 20 3a 20 61 2d 3e  RMINAL ? 3 : a->
256a0 6e 61 6d 65 5b 30 5d 3e 27 5a 27 20 3f 20 32 20  name[0]>'Z' ? 2 
256b0 3a 20 31 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20  : 1;.  int i2 = 
256c0 62 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  b->type==MULTITE
256d0 52 4d 49 4e 41 4c 20 3f 20 33 20 3a 20 62 2d 3e  RMINAL ? 3 : b->
256e0 6e 61 6d 65 5b 30 5d 3e 27 5a 27 20 3f 20 32 20  name[0]>'Z' ? 2 
256f0 3a 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 69 31  : 1;.  return i1
25700 3d 3d 69 32 20 3f 20 61 2d 3e 69 6e 64 65 78 20  ==i2 ? a->index 
25710 2d 20 62 2d 3e 69 6e 64 65 78 20 3a 20 69 31 20  - b->index : i1 
25720 2d 20 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72  - i2;.}../* Ther
25730 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
25740 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
25750 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  ng structure for
25760 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61   each.** associa
25770 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
25780 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75  pe "x2"..*/.stru
25790 63 74 20 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20  ct s_x2 {.  int 
257a0 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
257b0 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
257c0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73  r of available s
257d0 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lots. */.       
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257f0 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20     /*   Must be 
25800 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65  a power of 2 gre
25810 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a  ater than or */.
25820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65            /*   e
25840 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69  qual to 1 */.  i
25850 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20  nt count;       
25860 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
25870 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c   of currently sl
25880 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ots filled */.  
25890 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20  struct s_x2node 
258a0 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61  *tbl;  /* The da
258b0 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a  ta stored here *
258c0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
258d0 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61  ode **ht;  /* Ha
258e0 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f  sh table for loo
258f0 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  kups */.};../* T
25900 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
25910 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
25920 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79  ucture for every
25930 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a   data element.**
25940 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69   in an associati
25950 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
25960 20 22 78 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65   "x2"..*/.typede
25970 66 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64  f struct s_x2nod
25980 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  e {.  struct sym
25990 62 6f 6c 20 2a 64 61 74 61 3b 20 20 20 20 20 2f  bol *data;     /
259a0 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
259b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 3b  const char *key;
259c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
259d0 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  key */.  struct 
259e0 73 5f 78 32 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x2node *next; 
259f0 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
25a00 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
25a10 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
25a20 5f 78 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x2node **from; 
25a30 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
25a40 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a  k */.} x2node;..
25a50 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
25a60 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
25a70 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
25a80 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
25a90 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
25aa0 75 63 74 20 73 5f 78 32 20 2a 78 32 61 3b 0a 0a  uct s_x2 *x2a;..
25ab0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
25ac0 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
25ad0 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 79 6d 62  ray */.void Symb
25ae0 6f 6c 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28  ol_init(){.  if(
25af0 20 78 32 61 20 29 20 72 65 74 75 72 6e 3b 0a 20   x2a ) return;. 
25b00 20 78 32 61 20 3d 20 28 73 74 72 75 63 74 20 73   x2a = (struct s
25b10 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  _x2*)malloc( siz
25b20 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 32 29  eof(struct s_x2)
25b30 20 29 3b 0a 20 20 69 66 28 20 78 32 61 20 29 7b   );.  if( x2a ){
25b40 0a 20 20 20 20 78 32 61 2d 3e 73 69 7a 65 20 3d  .    x2a->size =
25b50 20 31 32 38 3b 0a 20 20 20 20 78 32 61 2d 3e 63   128;.    x2a->c
25b60 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 32  ount = 0;.    x2
25b70 61 2d 3e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65  a->tbl = (x2node
25b80 2a 29 63 61 6c 6c 6f 63 28 31 32 38 2c 20 73 69  *)calloc(128, si
25b90 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73  zeof(x2node) + s
25ba0 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 3b  izeof(x2node*));
25bb0 0a 20 20 20 20 69 66 28 20 78 32 61 2d 3e 74 62  .    if( x2a->tb
25bc0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  l==0 ){.      fr
25bd0 65 65 28 78 32 61 29 3b 0a 20 20 20 20 20 20 78  ee(x2a);.      x
25be0 32 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  2a = 0;.    }els
25bf0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
25c00 20 20 20 20 20 20 78 32 61 2d 3e 68 74 20 3d 20        x2a->ht = 
25c10 28 78 32 6e 6f 64 65 2a 2a 29 26 28 78 32 61 2d  (x2node**)&(x2a-
25c20 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20  >tbl[128]);.    
25c30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38    for(i=0; i<128
25c40 3b 20 69 2b 2b 29 20 78 32 61 2d 3e 68 74 5b 69  ; i++) x2a->ht[i
25c50 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
25c60 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e  .}./* Insert a n
25c70 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
25c80 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  he array.  Retur
25c90 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73  n TRUE if succes
25ca0 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64  sful..** Prior d
25cb0 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d  ata with the sam
25cc0 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65  e key is NOT ove
25cd0 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20  rwritten */.int 
25ce0 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74  Symbol_insert(st
25cf0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74  ruct symbol *dat
25d00 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b  a, const char *k
25d10 65 79 29 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a  ey).{.  x2node *
25d20 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68  np;.  unsigned h
25d30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b  ;.  unsigned ph;
25d40 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29  ..  if( x2a==0 )
25d50 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20   return 0;.  ph 
25d60 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 3b 0a  = strhash(key);.
25d70 20 20 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d    h = ph & (x2a-
25d80 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
25d90 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77   x2a->ht[h];.  w
25da0 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20  hile( np ){.    
25db0 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b  if( strcmp(np->k
25dc0 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20  ey,key)==0 ){.  
25dd0 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
25de0 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  ng entry with th
25df0 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f  e same key is fo
25e00 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  und. */.      /*
25e10 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76   Fail because ov
25e20 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61  erwrite is not a
25e30 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  llows. */.      
25e40 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
25e50 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
25e60 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 32 61  t;.  }.  if( x2a
25e70 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73 69  ->count>=x2a->si
25e80 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  ze ){.    /* Nee
25e90 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61  d to make the ha
25ea0 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20  sh table bigger 
25eb0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61 72 72  */.    int i,arr
25ec0 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  Size;.    struct
25ed0 20 73 5f 78 32 20 61 72 72 61 79 3b 0a 20 20 20   s_x2 array;.   
25ee0 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 61 72   array.size = ar
25ef0 72 53 69 7a 65 20 3d 20 78 32 61 2d 3e 73 69 7a  rSize = x2a->siz
25f00 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63  e*2;.    array.c
25f10 6f 75 6e 74 20 3d 20 78 32 61 2d 3e 63 6f 75 6e  ount = x2a->coun
25f20 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c  t;.    array.tbl
25f30 20 3d 20 28 78 32 6e 6f 64 65 2a 29 63 61 6c 6c   = (x2node*)call
25f40 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65  oc(arrSize, size
25f50 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x2node) + siz
25f60 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 3b 0a 20  eof(x2node*));. 
25f70 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c     if( array.tbl
25f80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
25f90 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20   /* Fail due to 
25fa0 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a  malloc failure *
25fb0 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d  /.    array.ht =
25fc0 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61 72 72   (x2node**)&(arr
25fd0 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65 5d 29  ay.tbl[arrSize])
25fe0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
25ff0 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61  <arrSize; i++) a
26000 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a  rray.ht[i] = 0;.
26010 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78      for(i=0; i<x
26020 32 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b  2a->count; i++){
26030 0a 20 20 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f  .      x2node *o
26040 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20  ldnp, *newnp;.  
26050 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32      oldnp = &(x2
26060 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  a->tbl[i]);.    
26070 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c    h = strhash(ol
26080 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 61 72 72  dnp->key) & (arr
26090 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e  Size-1);.      n
260a0 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74  ewnp = &(array.t
260b0 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  bl[i]);.      if
260c0 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20  ( array.ht[h] ) 
260d0 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f  array.ht[h]->fro
260e0 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78  m = &(newnp->nex
260f0 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  t);.      newnp-
26100 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74  >next = array.ht
26110 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  [h];.      newnp
26120 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b  ->key = oldnp->k
26130 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  ey;.      newnp-
26140 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64  >data = oldnp->d
26150 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  ata;.      newnp
26160 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79  ->from = &(array
26170 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61  .ht[h]);.      a
26180 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77  rray.ht[h] = new
26190 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  np;.    }.    fr
261a0 65 65 28 78 32 61 2d 3e 74 62 6c 29 3b 0a 20 20  ee(x2a->tbl);.  
261b0 20 20 2a 78 32 61 20 3d 20 61 72 72 61 79 3b 0a    *x2a = array;.
261c0 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20    }.  /* Insert 
261d0 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a  the new data */.
261e0 20 20 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d    h = ph & (x2a-
261f0 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
26200 20 26 28 78 32 61 2d 3e 74 62 6c 5b 78 32 61 2d   &(x2a->tbl[x2a-
26210 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70  >count++]);.  np
26220 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e  ->key = key;.  n
26230 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a  p->data = data;.
26240 20 20 69 66 28 20 78 32 61 2d 3e 68 74 5b 68 5d    if( x2a->ht[h]
26250 20 29 20 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66   ) x2a->ht[h]->f
26260 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74  rom = &(np->next
26270 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20  );.  np->next = 
26280 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 32  x2a->ht[h];.  x2
26290 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20  a->ht[h] = np;. 
262a0 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 32   np->from = &(x2
262b0 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74  a->ht[h]);.  ret
262c0 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  urn 1;.}../* Ret
262d0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
262e0 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74   data assigned t
262f0 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e  o the given key.
26300 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a    Return NULL.**
26310 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e   if no such key.
26320 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f   */.struct symbo
26330 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 63  l *Symbol_find(c
26340 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29 0a  onst char *key).
26350 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a  {.  unsigned h;.
26360 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20    x2node *np;.. 
26370 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65   if( x2a==0 ) re
26380 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74  turn 0;.  h = st
26390 72 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 32  rhash(key) & (x2
263a0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
263b0 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x2a->ht[h];. 
263c0 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
263d0 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d    if( strcmp(np-
263e0 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62  >key,key)==0 ) b
263f0 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e  reak;.    np = n
26400 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  p->next;.  }.  r
26410 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64  eturn np ? np->d
26420 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52  ata : 0;.}../* R
26430 65 74 75 72 6e 20 74 68 65 20 6e 2d 74 68 20 64  eturn the n-th d
26440 61 74 61 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ata.  Return NUL
26450 4c 20 69 66 20 6e 20 69 73 20 6f 75 74 20 6f 66  L if n is out of
26460 20 72 61 6e 67 65 2e 20 2a 2f 0a 73 74 72 75 63   range. */.struc
26470 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c  t symbol *Symbol
26480 5f 4e 74 68 28 69 6e 74 20 6e 29 0a 7b 0a 20 20  _Nth(int n).{.  
26490 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
264a0 61 74 61 3b 0a 20 20 69 66 28 20 78 32 61 20 26  ata;.  if( x2a &
264b0 26 20 6e 3e 30 20 26 26 20 6e 3c 3d 78 32 61 2d  & n>0 && n<=x2a-
264c0 3e 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20 64 61  >count ){.    da
264d0 74 61 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d  ta = x2a->tbl[n-
264e0 31 5d 2e 64 61 74 61 3b 0a 20 20 7d 65 6c 73 65  1].data;.  }else
264f0 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 30 3b 0a  {.    data = 0;.
26500 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 61 74    }.  return dat
26510 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  a;.}../* Return 
26520 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
26530 61 72 72 61 79 20 2a 2f 0a 69 6e 74 20 53 79 6d  array */.int Sym
26540 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b 0a 20 20  bol_count().{.  
26550 72 65 74 75 72 6e 20 78 32 61 20 3f 20 78 32 61  return x2a ? x2a
26560 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a  ->count : 0;.}..
26570 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72  /* Return an arr
26580 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  ay of pointers t
26590 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68  o all data in th
265a0 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20  e table..** The 
265b0 61 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65  array is obtaine
265c0 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20  d from malloc.  
265d0 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d  Return NULL if m
265e0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
265f0 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72  .** problems, or
26600 20 69 66 20 74 68 65 20 61 72 72 61 79 20 69 73   if the array is
26610 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63   empty. */.struc
26620 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f  t symbol **Symbo
26630 6c 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20  l_arrayof().{.  
26640 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
26650 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 61  array;.  int i,a
26660 72 72 53 69 7a 65 3b 0a 20 20 69 66 28 20 78 32  rrSize;.  if( x2
26670 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
26680 0a 20 20 61 72 72 53 69 7a 65 20 3d 20 78 32 61  .  arrSize = x2a
26690 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79  ->count;.  array
266a0 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f   = (struct symbo
266b0 6c 20 2a 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53  l **)calloc(arrS
266c0 69 7a 65 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  ize, sizeof(stru
266d0 63 74 20 73 79 6d 62 6f 6c 20 2a 29 29 3b 0a 20  ct symbol *));. 
266e0 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20   if( array ){.  
266f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72    for(i=0; i<arr
26700 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  Size; i++) array
26710 5b 69 5d 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 69  [i] = x2a->tbl[i
26720 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65  ].data;.  }.  re
26730 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f  turn array;.}../
26740 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 63 6f  * Compare two co
26750 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a  nfigurations */.
26760 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 63 6f  int Configcmp(co
26770 6e 73 74 20 63 68 61 72 20 2a 5f 61 2c 63 6f 6e  nst char *_a,con
26780 73 74 20 63 68 61 72 20 2a 5f 62 29 0a 7b 0a 20  st char *_b).{. 
26790 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f   const struct co
267a0 6e 66 69 67 20 2a 61 20 3d 20 28 73 74 72 75 63  nfig *a = (struc
267b0 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f 61 3b 0a  t config *) _a;.
267c0 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63    const struct c
267d0 6f 6e 66 69 67 20 2a 62 20 3d 20 28 73 74 72 75  onfig *b = (stru
267e0 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f 62 3b  ct config *) _b;
267f0 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78 20 3d 20  .  int x;.  x = 
26800 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62  a->rp->index - b
26810 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69  ->rp->index;.  i
26820 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 61 2d  f( x==0 ) x = a-
26830 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20  >dot - b->dot;. 
26840 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a   return x;.}../*
26850 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61   Compare two sta
26860 74 65 73 20 2a 2f 0a 50 52 49 56 41 54 45 20 69  tes */.PRIVATE i
26870 6e 74 20 73 74 61 74 65 63 6d 70 28 73 74 72 75  nt statecmp(stru
26880 63 74 20 63 6f 6e 66 69 67 20 2a 61 2c 20 73 74  ct config *a, st
26890 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 29 0a  ruct config *b).
268a0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 66 6f  {.  int rc;.  fo
268b0 72 28 72 63 3d 30 3b 20 72 63 3d 3d 30 20 26 26  r(rc=0; rc==0 &&
268c0 20 61 20 26 26 20 62 3b 20 20 61 3d 61 2d 3e 62   a && b;  a=a->b
268d0 70 2c 20 62 3d 62 2d 3e 62 70 29 7b 0a 20 20 20  p, b=b->bp){.   
268e0 20 72 63 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64   rc = a->rp->ind
268f0 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65  ex - b->rp->inde
26900 78 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30  x;.    if( rc==0
26910 20 29 20 72 63 20 3d 20 61 2d 3e 64 6f 74 20 2d   ) rc = a->dot -
26920 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20 69   b->dot;.  }.  i
26930 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
26940 69 66 28 20 61 20 29 20 72 63 20 3d 20 31 3b 0a  if( a ) rc = 1;.
26950 20 20 20 20 69 66 28 20 62 20 29 20 72 63 20 3d      if( b ) rc =
26960 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -1;.  }.  retur
26970 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68  n rc;.}../* Hash
26980 20 61 20 73 74 61 74 65 20 2a 2f 0a 50 52 49 56   a state */.PRIV
26990 41 54 45 20 75 6e 73 69 67 6e 65 64 20 73 74 61  ATE unsigned sta
269a0 74 65 68 61 73 68 28 73 74 72 75 63 74 20 63 6f  tehash(struct co
269b0 6e 66 69 67 20 2a 61 29 0a 7b 0a 20 20 75 6e 73  nfig *a).{.  uns
269c0 69 67 6e 65 64 20 68 3d 30 3b 0a 20 20 77 68 69  igned h=0;.  whi
269d0 6c 65 28 20 61 20 29 7b 0a 20 20 20 20 68 20 3d  le( a ){.    h =
269e0 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e   h*571 + a->rp->
269f0 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f  index*37 + a->do
26a00 74 3b 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62 70  t;.    a = a->bp
26a10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
26a20 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;.}../* Allocate
26a30 20 61 20 6e 65 77 20 73 74 61 74 65 20 73 74 72   a new state str
26a40 75 63 74 75 72 65 20 2a 2f 0a 73 74 72 75 63 74  ucture */.struct
26a50 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65   state *State_ne
26a60 77 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  w().{.  struct s
26a70 74 61 74 65 20 2a 6e 65 77 73 74 61 74 65 3b 0a  tate *newstate;.
26a80 20 20 6e 65 77 73 74 61 74 65 20 3d 20 28 73 74    newstate = (st
26a90 72 75 63 74 20 73 74 61 74 65 20 2a 29 63 61 6c  ruct state *)cal
26aa0 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73 74  loc(1, sizeof(st
26ab0 72 75 63 74 20 73 74 61 74 65 29 20 29 3b 0a 20  ruct state) );. 
26ac0 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 6e 65 77   MemoryCheck(new
26ad0 73 74 61 74 65 29 3b 0a 20 20 72 65 74 75 72 6e  state);.  return
26ae0 20 6e 65 77 73 74 61 74 65 3b 0a 7d 0a 0a 2f 2a   newstate;.}../*
26af0 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
26b00 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
26b10 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
26b20 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73  e for each.** as
26b30 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
26b40 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f  of type "x3"..*/
26b50 0a 73 74 72 75 63 74 20 73 5f 78 33 20 7b 0a 20  .struct s_x3 {. 
26b60 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
26b70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26b80 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
26b90 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20  ble slots. */.  
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bb0 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73          /*   Mus
26bc0 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
26bd0 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  2 greater than o
26be0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  r */.           
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26c00 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a  *   equal to 1 *
26c10 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20  /.  int count;  
26c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26c30 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74  umber of current
26c40 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20  ly slots filled 
26c50 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33  */.  struct s_x3
26c60 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54  node *tbl;  /* T
26c70 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68  he data stored h
26c80 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ere */.  struct 
26c90 73 5f 78 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20  s_x3node **ht;  
26ca0 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f  /* Hash table fo
26cb0 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a  r lookups */.};.
26cc0 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
26cd0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
26ce0 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  s structure for 
26cf0 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65  every data eleme
26d00 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f  nt.** in an asso
26d10 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
26d20 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74   type "x3"..*/.t
26d30 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f  ypedef struct s_
26d40 78 33 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63  x3node {.  struc
26d50 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b 20 20  t state *data;  
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d70 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
26d80 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
26d90 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  key;            
26da0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65         /* The ke
26db0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  y */.  struct s_
26dc0 78 33 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x3node *next;   
26dd0 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
26de0 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
26df0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
26e00 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  3node **from;  /
26e10 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
26e20 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x3node;../*
26e30 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
26e40 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
26e50 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
26e60 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
26e70 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
26e80 74 20 73 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a  t s_x3 *x3a;../*
26e90 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
26ea0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
26eb0 79 20 2a 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f  y */.void State_
26ec0 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 33  init(){.  if( x3
26ed0 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 33  a ) return;.  x3
26ee0 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 33  a = (struct s_x3
26ef0 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
26f00 28 73 74 72 75 63 74 20 73 5f 78 33 29 20 29 3b  (struct s_x3) );
26f10 0a 20 20 69 66 28 20 78 33 61 20 29 7b 0a 20 20  .  if( x3a ){.  
26f20 20 20 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32    x3a->size = 12
26f30 38 3b 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e  8;.    x3a->coun
26f40 74 20 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e  t = 0;.    x3a->
26f50 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 63  tbl = (x3node*)c
26f60 61 6c 6c 6f 63 28 31 32 38 2c 20 73 69 7a 65 6f  alloc(128, sizeo
26f70 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x3node) + size
26f80 6f 66 28 78 33 6e 6f 64 65 2a 29 29 3b 0a 20 20  of(x3node*));.  
26f90 20 20 69 66 28 20 78 33 61 2d 3e 74 62 6c 3d 3d    if( x3a->tbl==
26fa0 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
26fb0 78 33 61 29 3b 0a 20 20 20 20 20 20 78 33 61 20  x3a);.      x3a 
26fc0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
26fd0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
26fe0 20 20 20 78 33 61 2d 3e 68 74 20 3d 20 28 78 33     x3a->ht = (x3
26ff0 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d 3e 74 62  node**)&(x3a->tb
27000 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66  l[128]);.      f
27010 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69  or(i=0; i<128; i
27020 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x3a->ht[i] =
27030 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
27040 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
27050 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
27060 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
27070 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
27080 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
27090 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
270a0 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
270b0 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 61  itten */.int Sta
270c0 74 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74  te_insert(struct
270d0 20 73 74 61 74 65 20 2a 64 61 74 61 2c 20 73 74   state *data, st
270e0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
270f0 29 0a 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70  ).{.  x3node *np
27100 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a  ;.  unsigned h;.
27110 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a    unsigned ph;..
27120 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72    if( x3a==0 ) r
27130 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20  eturn 0;.  ph = 
27140 73 74 61 74 65 68 61 73 68 28 6b 65 79 29 3b 0a  statehash(key);.
27150 20 20 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d    h = ph & (x3a-
27160 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
27170 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77   x3a->ht[h];.  w
27180 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20  hile( np ){.    
27190 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70 2d  if( statecmp(np-
271a0 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a  >key,key)==0 ){.
271b0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
271c0 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20  ting entry with 
271d0 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
271e0 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20  found. */.      
271f0 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20  /* Fail because 
27200 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74  overwrite is not
27210 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20   allows. */.    
27220 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
27230 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  }.    np = np->n
27240 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78  ext;.  }.  if( x
27250 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d 3e  3a->count>=x3a->
27260 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  size ){.    /* N
27270 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  eed to make the 
27280 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65  hash table bigge
27290 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61  r */.    int i,a
272a0 72 72 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75  rrSize;.    stru
272b0 63 74 20 73 5f 78 33 20 61 72 72 61 79 3b 0a 20  ct s_x3 array;. 
272c0 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20     array.size = 
272d0 61 72 72 53 69 7a 65 20 3d 20 78 33 61 2d 3e 73  arrSize = x3a->s
272e0 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79  ize*2;.    array
272f0 2e 63 6f 75 6e 74 20 3d 20 78 33 61 2d 3e 63 6f  .count = x3a->co
27300 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74  unt;.    array.t
27310 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 63 61  bl = (x3node*)ca
27320 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69  lloc(arrSize, si
27330 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73  zeof(x3node) + s
27340 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 3b  izeof(x3node*));
27350 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74  .    if( array.t
27360 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  bl==0 ) return 0
27370 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74  ;  /* Fail due t
27380 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  o malloc failure
27390 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74   */.    array.ht
273a0 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 61   = (x3node**)&(a
273b0 72 72 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65  rray.tbl[arrSize
273c0 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
273d0 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29   i<arrSize; i++)
273e0 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30   array.ht[i] = 0
273f0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
27400 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b  <x3a->count; i++
27410 29 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64 65 20  ){.      x3node 
27420 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a  *oldnp, *newnp;.
27430 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28        oldnp = &(
27440 78 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20  x3a->tbl[i]);.  
27450 20 20 20 20 68 20 3d 20 73 74 61 74 65 68 61 73      h = statehas
27460 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20  h(oldnp->key) & 
27470 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20  (arrSize-1);.   
27480 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72     newnp = &(arr
27490 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  ay.tbl[i]);.    
274a0 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68    if( array.ht[h
274b0 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d  ] ) array.ht[h]-
274c0 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d  >from = &(newnp-
274d0 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65  >next);.      ne
274e0 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61  wnp->next = arra
274f0 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e  y.ht[h];.      n
27500 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e  ewnp->key = oldn
27510 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65  p->key;.      ne
27520 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e  wnp->data = oldn
27530 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e  p->data;.      n
27540 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61  ewnp->from = &(a
27550 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20  rray.ht[h]);.   
27560 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d     array.ht[h] =
27570 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20   newnp;.    }.  
27580 20 20 66 72 65 65 28 78 33 61 2d 3e 74 62 6c 29    free(x3a->tbl)
27590 3b 0a 20 20 20 20 2a 78 33 61 20 3d 20 61 72 72  ;.    *x3a = arr
275a0 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73  ay;.  }.  /* Ins
275b0 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61  ert the new data
275c0 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28   */.  h = ph & (
275d0 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x3a->size-1);.  
275e0 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b  np = &(x3a->tbl[
275f0 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a  x3a->count++]);.
27600 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b    np->key = key;
27610 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61  .  np->data = da
27620 74 61 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e 68  ta;.  if( x3a->h
27630 74 5b 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b 68  t[h] ) x3a->ht[h
27640 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e  ]->from = &(np->
27650 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78  next);.  np->nex
27660 74 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a  t = x3a->ht[h];.
27670 20 20 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e    x3a->ht[h] = n
27680 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20  p;.  np->from = 
27690 26 28 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20  &(x3a->ht[h]);. 
276a0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
276b0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
276c0 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e  r to data assign
276d0 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  ed to the given 
276e0 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  key.  Return NUL
276f0 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20  L.** if no such 
27700 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  key. */.struct s
27710 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64  tate *State_find
27720 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
27730 6b 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  key).{.  unsigne
27740 64 20 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e  d h;.  x3node *n
27750 70 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30  p;..  if( x3a==0
27760 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68   ) return 0;.  h
27770 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79   = statehash(key
27780 29 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31  ) & (x3a->size-1
27790 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68  );.  np = x3a->h
277a0 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
277b0 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61  p ){.    if( sta
277c0 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65  tecmp(np->key,ke
277d0 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  y)==0 ) break;. 
277e0 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
277f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
27800 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30  p ? np->data : 0
27810 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
27820 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
27830 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20  ers to all data 
27840 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
27850 20 54 68 65 20 61 72 72 61 79 20 69 73 20 6f 62   The array is ob
27860 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
27870 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  oc.  Return NULL
27880 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   if memory alloc
27890 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d  ation.** problem
278a0 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72 72  s, or if the arr
278b0 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  ay is empty. */.
278c0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53  struct state **S
278d0 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29 0a 7b  tate_arrayof().{
278e0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
278f0 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69  **array;.  int i
27900 2c 61 72 72 53 69 7a 65 3b 0a 20 20 69 66 28 20  ,arrSize;.  if( 
27910 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x3a==0 ) return 
27920 30 3b 0a 20 20 61 72 72 53 69 7a 65 20 3d 20 78  0;.  arrSize = x
27930 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72  3a->count;.  arr
27940 61 79 20 3d 20 28 73 74 72 75 63 74 20 73 74 61  ay = (struct sta
27950 74 65 20 2a 2a 29 63 61 6c 6c 6f 63 28 61 72 72  te **)calloc(arr
27960 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 73 74 72  Size, sizeof(str
27970 75 63 74 20 73 74 61 74 65 20 2a 29 29 3b 0a 20  uct state *));. 
27980 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20   if( array ){.  
27990 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72    for(i=0; i<arr
279a0 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  Size; i++) array
279b0 5b 69 5d 20 3d 20 78 33 61 2d 3e 74 62 6c 5b 69  [i] = x3a->tbl[i
279c0 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65  ].data;.  }.  re
279d0 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f  turn array;.}../
279e0 2a 20 48 61 73 68 20 61 20 63 6f 6e 66 69 67 75  * Hash a configu
279f0 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54  ration */.PRIVAT
27a00 45 20 75 6e 73 69 67 6e 65 64 20 63 6f 6e 66 69  E unsigned confi
27a10 67 68 61 73 68 28 73 74 72 75 63 74 20 63 6f 6e  ghash(struct con
27a20 66 69 67 20 2a 61 29 0a 7b 0a 20 20 75 6e 73 69  fig *a).{.  unsi
27a30 67 6e 65 64 20 68 3d 30 3b 0a 20 20 68 20 3d 20  gned h=0;.  h = 
27a40 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69  h*571 + a->rp->i
27a50 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74  ndex*37 + a->dot
27a60 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a  ;.  return h;.}.
27a70 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
27a80 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
27a90 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
27aa0 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a  ture for each.**
27ab0 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
27ac0 61 79 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e  ay of type "x4".
27ad0 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 34 20  .*/.struct s_x4 
27ae0 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  {.  int size;   
27af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27b00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
27b10 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f  ilable slots. */
27b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
27b40 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  Must be a power 
27b50 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61  of 2 greater tha
27b60 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  n or */.        
27b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b80 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20    /*   equal to 
27b90 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74  1 */.  int count
27ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
27bb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72  * Number of curr
27bc0 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c  ently slots fill
27bd0 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ed */.  struct s
27be0 5f 78 34 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f  _x4node *tbl;  /
27bf0 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65  * The data store
27c00 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75  d here */.  stru
27c10 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 68 74  ct s_x4node **ht
27c20 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65  ;  /* Hash table
27c30 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a   for lookups */.
27c40 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  };../* There is 
27c50 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
27c60 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66  this structure f
27c70 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c  or every data el
27c80 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61  ement.** in an a
27c90 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
27ca0 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a   of type "x4"..*
27cb0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
27cc0 20 73 5f 78 34 6e 6f 64 65 20 7b 0a 20 20 73 74   s_x4node {.  st
27cd0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74  ruct config *dat
27ce0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
27cf0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
27d00 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34  */.  struct s_x4
27d10 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a  node *next;   /*
27d20 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68   Next entry with
27d30 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
27d40 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e  /.  struct s_x4n
27d50 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20  ode **from;  /* 
27d60 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f  Previous link */
27d70 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54  .} x4node;../* T
27d80 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65  here is only one
27d90 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
27da0 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73   array, which is
27db0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
27dc0 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
27dd0 73 5f 78 34 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41  s_x4 *x4a;../* A
27de0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73  llocate a new as
27df0 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
27e00 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  */.void Configta
27e10 62 6c 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66  ble_init(){.  if
27e20 28 20 78 34 61 20 29 20 72 65 74 75 72 6e 3b 0a  ( x4a ) return;.
27e30 20 20 78 34 61 20 3d 20 28 73 74 72 75 63 74 20    x4a = (struct 
27e40 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  s_x4*)malloc( si
27e50 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 34  zeof(struct s_x4
27e60 29 20 29 3b 0a 20 20 69 66 28 20 78 34 61 20 29  ) );.  if( x4a )
27e70 7b 0a 20 20 20 20 78 34 61 2d 3e 73 69 7a 65 20  {.    x4a->size 
27e80 3d 20 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63  = 64;.    x4a->c
27e90 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 34  ount = 0;.    x4
27ea0 61 2d 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65  a->tbl = (x4node
27eb0 2a 29 63 61 6c 6c 6f 63 28 36 34 2c 20 73 69 7a  *)calloc(64, siz
27ec0 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69  eof(x4node) + si
27ed0 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 3b 0a  zeof(x4node*));.
27ee0 20 20 20 20 69 66 28 20 78 34 61 2d 3e 74 62 6c      if( x4a->tbl
27ef0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65  ==0 ){.      fre
27f00 65 28 78 34 61 29 3b 0a 20 20 20 20 20 20 78 34  e(x4a);.      x4
27f10 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
27f20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
27f30 20 20 20 20 20 78 34 61 2d 3e 68 74 20 3d 20 28       x4a->ht = (
27f40 78 34 6e 6f 64 65 2a 2a 29 26 28 78 34 61 2d 3e  x4node**)&(x4a->
27f50 74 62 6c 5b 36 34 5d 29 3b 0a 20 20 20 20 20 20  tbl[64]);.      
27f60 66 6f 72 28 69 3d 30 3b 20 69 3c 36 34 3b 20 69  for(i=0; i<64; i
27f70 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x4a->ht[i] =
27f80 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
27f90 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
27fa0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
27fb0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
27fc0 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
27fd0 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
27fe0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
27ff0 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
28000 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f 6e  itten */.int Con
28010 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
28020 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64  struct config *d
28030 61 74 61 29 0a 7b 0a 20 20 78 34 6e 6f 64 65 20  ata).{.  x4node 
28040 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  *np;.  unsigned 
28050 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68  h;.  unsigned ph
28060 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20  ;..  if( x4a==0 
28070 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68  ) return 0;.  ph
28080 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 64 61   = confighash(da
28090 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ta);.  h = ph & 
280a0 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x4a->size-1);. 
280b0 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d   np = x4a->ht[h]
280c0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
280d0 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63  .    if( Configc
280e0 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  mp((const char *
280f0 29 20 6e 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73  ) np->data,(cons
28100 74 20 63 68 61 72 20 2a 29 20 64 61 74 61 29 3d  t char *) data)=
28110 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
28120 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
28130 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
28140 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a  ey is found. */.
28150 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65        /* Fail be
28160 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20  cause overwrite 
28170 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a  is not allows. *
28180 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
28190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d  ;.    }.    np =
281a0 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
281b0 20 69 66 28 20 78 34 61 2d 3e 63 6f 75 6e 74 3e   if( x4a->count>
281c0 3d 78 34 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20  =x4a->size ){.  
281d0 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
281e0 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
281f0 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69   bigger */.    i
28200 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20  nt i,arrSize;.  
28210 20 20 73 74 72 75 63 74 20 73 5f 78 34 20 61 72    struct s_x4 ar
28220 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73  ray;.    array.s
28230 69 7a 65 20 3d 20 61 72 72 53 69 7a 65 20 3d 20  ize = arrSize = 
28240 78 34 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20  x4a->size*2;.   
28250 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78   array.count = x
28260 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61  4a->count;.    a
28270 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f  rray.tbl = (x4no
28280 64 65 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69  de*)calloc(arrSi
28290 7a 65 2c 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64  ze, sizeof(x4nod
282a0 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f  e) + sizeof(x4no
282b0 64 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61  de*));.    if( a
282c0 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65  rray.tbl==0 ) re
282d0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c  turn 0;  /* Fail
282e0 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66   due to malloc f
282f0 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72  ailure */.    ar
28300 72 61 79 2e 68 74 20 3d 20 28 78 34 6e 6f 64 65  ray.ht = (x4node
28310 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 61  **)&(array.tbl[a
28320 72 72 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f  rrSize]);.    fo
28330 72 28 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65  r(i=0; i<arrSize
28340 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b  ; i++) array.ht[
28350 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  i] = 0;.    for(
28360 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e  i=0; i<x4a->coun
28370 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78  t; i++){.      x
28380 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e  4node *oldnp, *n
28390 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e  ewnp;.      oldn
283a0 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69  p = &(x4a->tbl[i
283b0 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 63 6f  ]);.      h = co
283c0 6e 66 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e  nfighash(oldnp->
283d0 64 61 74 61 29 20 26 20 28 61 72 72 53 69 7a 65  data) & (arrSize
283e0 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  -1);.      newnp
283f0 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69   = &(array.tbl[i
28400 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72  ]);.      if( ar
28410 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61  ray.ht[h] ) arra
28420 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  y.ht[h]->from = 
28430 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a  &(newnp->next);.
28440 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78        newnp->nex
28450 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b  t = array.ht[h];
28460 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
28470 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
28480 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
28490 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
284a0 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
284b0 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
284c0 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
284d0 78 34 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x4a->tbl);.    *
284e0 78 34 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x4a = array;.  }
284f0 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
28500 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
28510 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69   = ph & (x4a->si
28520 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
28530 78 34 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f  x4a->tbl[x4a->co
28540 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64  unt++]);.  np->d
28550 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66  ata = data;.  if
28560 28 20 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78  ( x4a->ht[h] ) x
28570 34 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  4a->ht[h]->from 
28580 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  = &(np->next);. 
28590 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d   np->next = x4a-
285a0 3e 68 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68  >ht[h];.  x4a->h
285b0 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d  t[h] = np;.  np-
285c0 3e 66 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68  >from = &(x4a->h
285d0 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  t[h]);.  return 
285e0 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  1;.}../* Return 
285f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
28600 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  a assigned to th
28610 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65  e given key.  Re
28620 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
28630 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a  no such key. */.
28640 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
28650 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28  onfigtable_find(
28660 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b  struct config *k
28670 65 79 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20  ey).{.  int h;. 
28680 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20   x4node *np;..  
28690 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74  if( x4a==0 ) ret
286a0 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e  urn 0;.  h = con
286b0 66 69 67 68 61 73 68 28 6b 65 79 29 20 26 20 28  fighash(key) & (
286c0 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x4a->size-1);.  
286d0 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b  np = x4a->ht[h];
286e0 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
286f0 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d      if( Configcm
28700 70 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  p((const char *)
28710 20 6e 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74   np->data,(const
28720 20 63 68 61 72 20 2a 29 20 6b 65 79 29 3d 3d 30   char *) key)==0
28730 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
28740 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
28750 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
28760 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
28770 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61  /* Remove all da
28780 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  ta from the tabl
28790 65 2e 20 20 50 61 73 73 20 65 61 63 68 20 64 61  e.  Pass each da
287a0 74 61 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ta to the functi
287b0 6f 6e 20 22 66 22 0a 2a 2a 20 61 73 20 69 74 20  on "f".** as it 
287c0 69 73 20 72 65 6d 6f 76 65 64 2e 20 20 28 22 66  is removed.  ("f
287d0 22 20 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f  " may be null to
287e0 20 61 76 6f 69 64 20 74 68 69 73 20 73 74 65 70   avoid this step
287f0 2e 29 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  .) */.void Confi
28800 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74  gtable_clear(int
28810 28 2a 66 29 28 73 74 72 75 63 74 20 63 6f 6e 66  (*f)(struct conf
28820 69 67 20 2a 29 29 0a 7b 0a 20 20 69 6e 74 20 69  ig *)).{.  int i
28830 3b 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 7c  ;.  if( x4a==0 |
28840 7c 20 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20  | x4a->count==0 
28850 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
28860 66 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78  f ) for(i=0; i<x
28870 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20  4a->count; i++) 
28880 28 2a 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d  (*f)(x4a->tbl[i]
28890 2e 64 61 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d  .data);.  for(i=
288a0 30 3b 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20  0; i<x4a->size; 
288b0 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20  i++) x4a->ht[i] 
288c0 3d 20 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e  = 0;.  x4a->coun
288d0 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  t = 0;.  return;
288e0 0a 7d 0a                                         .}.