/ Hex Artifact Content
Login

Artifact 20f3132a1a150d50b022aa0b1fa26bd46aebf7b5:


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 69 66 6e 64 65 66 20 5f 5f 57 49 4e 33 32  .#ifndef __WIN32
01b0: 5f 5f 0a 23 20 20 20 69 66 20 64 65 66 69 6e 65  __.#   if define
01c0: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
01d0: 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 20 20 20  ined(WIN32).#   
01e0: 20 20 20 20 64 65 66 69 6e 65 20 5f 5f 57 49 4e      define __WIN
01f0: 33 32 5f 5f 0a 23 20 20 20 65 6e 64 69 66 0a 23  32__.#   endif.#
0200: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f 5f  endif..#ifdef __
0210: 57 49 4e 33 32 5f 5f 0a 23 69 66 64 65 66 20 5f  WIN32__.#ifdef _
0220: 5f 63 70 6c 75 73 70 6c 75 73 0a 65 78 74 65 72  _cplusplus.exter
0230: 6e 20 22 43 22 20 7b 0a 23 65 6e 64 69 66 0a 65  n "C" {.#endif.e
0240: 78 74 65 72 6e 20 69 6e 74 20 61 63 63 65 73 73  xtern int access
0250: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74  (const char *pat
0260: 68 2c 20 69 6e 74 20 6d 6f 64 65 29 3b 0a 23 69  h, int mode);.#i
0270: 66 64 65 66 20 5f 5f 63 70 6c 75 73 70 6c 75 73  fdef __cplusplus
0280: 0a 7d 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a  .}.#endif.#else.
0290: 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64  #include <unistd
02a0: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 23  .h>.#endif../* #
02b0: 64 65 66 69 6e 65 20 50 52 49 56 41 54 45 20 73  define PRIVATE s
02c0: 74 61 74 69 63 20 2a 2f 0a 23 64 65 66 69 6e 65  tatic */.#define
02d0: 20 50 52 49 56 41 54 45 0a 0a 23 69 66 64 65 66   PRIVATE..#ifdef
02e0: 20 54 45 53 54 0a 23 64 65 66 69 6e 65 20 4d 41   TEST.#define MA
02f0: 58 52 48 53 20 35 20 20 20 20 20 20 20 2f 2a 20  XRHS 5       /* 
0300: 53 65 74 20 6c 6f 77 20 74 6f 20 65 78 65 72 63  Set low to exerc
0310: 69 73 65 20 65 78 63 65 70 74 69 6f 6e 20 63 6f  ise exception co
0320: 64 65 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66  de */.#else.#def
0330: 69 6e 65 20 4d 41 58 52 48 53 20 31 30 30 30 0a  ine MAXRHS 1000.
0340: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69  #endif..static i
0350: 6e 74 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63  nt showPrecedenc
0360: 65 43 6f 6e 66 6c 69 63 74 20 3d 20 30 3b 0a 73  eConflict = 0;.s
0370: 74 61 74 69 63 20 63 68 61 72 20 2a 6d 73 6f 72  tatic char *msor
0380: 74 28 63 68 61 72 2a 2c 63 68 61 72 2a 2a 2c 69  t(char*,char**,i
0390: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
03a0: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b  *,const char*));
03b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 72  ../*.** Compiler
03c0: 73 20 61 72 65 20 67 65 74 74 69 6e 67 20 69 6e  s are getting in
03d0: 63 72 65 61 73 69 6e 67 6c 79 20 70 65 64 61 6e  creasingly pedan
03e0: 74 69 63 20 61 62 6f 75 74 20 74 79 70 65 20 63  tic about type c
03f0: 6f 6e 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 61 73  onversions.** as
0400: 20 43 20 65 76 6f 6c 76 65 73 20 65 76 65 72 20   C evolves ever 
0410: 63 6c 6f 73 65 72 20 74 6f 20 41 64 61 2e 2e 2e  closer to Ada...
0420: 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
0430: 64 20 74 68 65 20 6c 61 74 65 73 74 20 70 72 6f  d the latest pro
0440: 62 6c 65 6d 73 0a 2a 2a 20 77 65 20 68 61 76 65  blems.** we have
0450: 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 66   to define the f
0460: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 6e 74  ollowing variant
0470: 20 6f 66 20 73 74 72 6c 65 6e 28 29 2e 0a 2a 2f   of strlen()..*/
0480: 0a 23 64 65 66 69 6e 65 20 6c 65 6d 6f 6e 53 74  .#define lemonSt
0490: 72 6c 65 6e 28 58 29 20 20 20 28 28 69 6e 74 29  rlen(X)   ((int)
04a0: 73 74 72 6c 65 6e 28 58 29 29 0a 0a 2f 2a 0a 2a  strlen(X))../*.*
04b0: 2a 20 43 6f 6d 70 69 6c 65 72 73 20 61 72 65 20  * Compilers are 
04c0: 73 74 61 72 74 69 6e 67 20 74 6f 20 63 6f 6d 70  starting to comp
04d0: 6c 61 69 6e 20 61 62 6f 75 74 20 74 68 65 20 75  lain about the u
04e0: 73 65 20 6f 66 20 73 70 72 69 6e 74 66 28 29 20  se of sprintf() 
04f0: 61 6e 64 20 73 74 72 63 70 79 28 29 2c 0a 2a 2a  and strcpy(),.**
0500: 20 73 61 79 69 6e 67 20 74 68 65 79 20 61 72 65   saying they are
0510: 20 75 6e 73 61 66 65 2e 20 20 53 6f 20 77 65 20   unsafe.  So we 
0520: 64 65 66 69 6e 65 20 6f 75 72 20 6f 77 6e 20 76  define our own v
0530: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 6f 73 65  ersions of those
0540: 20 72 6f 75 74 69 6e 65 73 20 74 6f 6f 2e 0a 2a   routines too..*
0550: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74  *.** There are t
0560: 68 72 65 65 20 72 6f 75 74 69 6e 65 73 20 68 65  hree routines he
0570: 72 65 3a 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e  re:  lemon_sprin
0580: 74 66 28 29 2c 20 6c 65 6d 6f 6e 5f 76 73 70 72  tf(), lemon_vspr
0590: 69 6e 74 66 28 29 2c 20 61 6e 64 0a 2a 2a 20 6c  intf(), and.** l
05a0: 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 29 2e 20  emon_addtext(). 
05b0: 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 61   The first two a
05c0: 72 65 20 72 65 70 6c 61 63 65 6d 65 6e 74 73 20  re replacements 
05d0: 66 6f 72 20 73 70 72 69 6e 74 66 28 29 20 61 6e  for sprintf() an
05e0: 64 20 76 73 70 72 69 6e 74 66 28 29 2e 0a 2a 2a  d vsprintf()..**
05f0: 20 54 68 65 20 74 68 69 72 64 20 69 73 20 61 20   The third is a 
0600: 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 66  helper routine f
0610: 6f 72 20 76 73 6e 70 72 69 6e 74 66 28 29 20 74  or vsnprintf() t
0620: 68 61 74 20 61 64 64 73 20 74 65 78 74 73 20 74  hat adds texts t
0630: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 0a 2a  o the end of a.*
0640: 2a 20 62 75 66 66 65 72 2c 20 6d 61 6b 69 6e 67  * buffer, making
0650: 20 73 75 72 65 20 74 68 65 20 62 75 66 66 65 72   sure the buffer
0660: 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 2d   is always zero-
0670: 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2a 0a 2a  terminated..**.*
0680: 2a 20 54 68 65 20 73 74 72 69 6e 67 20 66 6f 72  * The string for
0690: 6d 61 74 74 65 72 20 69 73 20 61 20 6d 69 6e 69  matter is a mini
06a0: 6d 61 6c 20 73 75 62 73 65 74 20 6f 66 20 73 74  mal subset of st
06b0: 64 6c 69 62 20 73 70 72 69 6e 74 66 28 29 20 73  dlib sprintf() s
06c0: 75 70 70 6f 72 74 69 6e 67 20 6f 6e 6c 79 0a 2a  upporting only.*
06d0: 2a 20 61 20 66 65 77 20 73 69 6d 70 6c 79 20 63  * a few simply c
06e0: 6f 6e 76 65 72 73 69 6f 6e 73 3a 0a 2a 2a 0a 2a  onversions:.**.*
06f0: 2a 20 20 20 25 64 0a 2a 2a 20 20 20 25 73 0a 2a  *   %d.**   %s.*
0700: 2a 20 20 20 25 2e 2a 73 0a 2a 2a 0a 2a 2f 0a 73  *   %.*s.**.*/.s
0710: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 6d 6f 6e  tatic void lemon
0720: 5f 61 64 64 74 65 78 74 28 0a 20 20 63 68 61 72  _addtext(.  char
0730: 20 2a 7a 42 75 66 2c 20 20 20 20 20 20 20 20 20   *zBuf,         
0740: 20 20 2f 2a 20 54 68 65 20 62 75 66 66 65 72 20    /* The buffer 
0750: 74 6f 20 77 68 69 63 68 20 74 65 78 74 20 69 73  to which text is
0760: 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   added */.  int 
0770: 2a 70 6e 55 73 65 64 2c 20 20 20 20 20 20 20 20  *pnUsed,        
0780: 20 20 2f 2a 20 53 6c 6f 74 73 20 6f 66 20 74 68    /* Slots of th
0790: 65 20 62 75 66 66 65 72 20 75 73 65 64 20 73 6f  e buffer used so
07a0: 20 66 61 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   far */.  const 
07b0: 63 68 61 72 20 2a 7a 49 6e 2c 20 20 20 20 20 20  char *zIn,      
07c0: 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 2a  /* Text to add *
07d0: 2f 0a 20 20 69 6e 74 20 6e 49 6e 2c 20 20 20 20  /.  int nIn,    
07e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
07f0: 65 73 20 6f 66 20 74 65 78 74 20 74 6f 20 61 64  es of text to ad
0800: 64 2e 20 20 2d 31 20 74 6f 20 75 73 65 20 73 74  d.  -1 to use st
0810: 72 6c 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  rlen() */.  int 
0820: 69 57 69 64 74 68 20 20 20 20 20 20 20 20 20 20  iWidth          
0830: 20 20 2f 2a 20 46 69 65 6c 64 20 77 69 64 74 68    /* Field width
0840: 2e 20 20 4e 65 67 61 74 69 76 65 20 74 6f 20 6c  .  Negative to l
0850: 65 66 74 20 6a 75 73 74 69 66 79 20 2a 2f 0a 29  eft justify */.)
0860: 7b 0a 20 20 69 66 28 20 6e 49 6e 3c 30 20 29 20  {.  if( nIn<0 ) 
0870: 66 6f 72 28 6e 49 6e 3d 30 3b 20 7a 49 6e 5b 6e  for(nIn=0; zIn[n
0880: 49 6e 5d 3b 20 6e 49 6e 2b 2b 29 7b 7d 0a 20 20  In]; nIn++){}.  
0890: 77 68 69 6c 65 28 20 69 57 69 64 74 68 3e 6e 49  while( iWidth>nI
08a0: 6e 20 29 7b 20 7a 42 75 66 5b 28 2a 70 6e 55 73  n ){ zBuf[(*pnUs
08b0: 65 64 29 2b 2b 5d 20 3d 20 27 20 27 3b 20 69 57  ed)++] = ' '; iW
08c0: 69 64 74 68 2d 2d 3b 20 7d 0a 20 20 69 66 28 20  idth--; }.  if( 
08d0: 6e 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  nIn==0 ) return;
08e0: 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b  .  memcpy(&zBuf[
08f0: 2a 70 6e 55 73 65 64 5d 2c 20 7a 49 6e 2c 20 6e  *pnUsed], zIn, n
0900: 49 6e 29 3b 0a 20 20 2a 70 6e 55 73 65 64 20 2b  In);.  *pnUsed +
0910: 3d 20 6e 49 6e 3b 0a 20 20 77 68 69 6c 65 28 20  = nIn;.  while( 
0920: 28 2d 69 57 69 64 74 68 29 3e 6e 49 6e 20 29 7b  (-iWidth)>nIn ){
0930: 20 7a 42 75 66 5b 28 2a 70 6e 55 73 65 64 29 2b   zBuf[(*pnUsed)+
0940: 2b 5d 20 3d 20 27 20 27 3b 20 69 57 69 64 74 68  +] = ' '; iWidth
0950: 2b 2b 3b 20 7d 0a 20 20 7a 42 75 66 5b 2a 70 6e  ++; }.  zBuf[*pn
0960: 55 73 65 64 5d 20 3d 20 30 3b 0a 7d 0a 73 74 61  Used] = 0;.}.sta
0970: 74 69 63 20 69 6e 74 20 6c 65 6d 6f 6e 5f 76 73  tic int lemon_vs
0980: 70 72 69 6e 74 66 28 63 68 61 72 20 2a 73 74 72  printf(char *str
0990: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
09a0: 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61  ormat, va_list a
09b0: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  p){.  int i, j, 
09c0: 6b 2c 20 63 3b 0a 20 20 69 6e 74 20 6e 55 73 65  k, c;.  int nUse
09d0: 64 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63  d = 0;.  const c
09e0: 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 7a  har *z;.  char z
09f0: 54 65 6d 70 5b 35 30 5d 3b 0a 20 20 73 74 72 5b  Temp[50];.  str[
0a00: 30 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  0] = 0;.  for(i=
0a10: 6a 3d 30 3b 20 28 63 20 3d 20 7a 46 6f 72 6d 61  j=0; (c = zForma
0a20: 74 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  t[i])!=0; i++){.
0a30: 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 29      if( c=='%' )
0a40: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 57 69 64  {.      int iWid
0a50: 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c 65  th = 0;.      le
0a60: 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c  mon_addtext(str,
0a70: 20 26 6e 55 73 65 64 2c 20 26 7a 46 6f 72 6d 61   &nUsed, &zForma
0a80: 74 5b 6a 5d 2c 20 69 2d 6a 2c 20 30 29 3b 0a 20  t[j], i-j, 0);. 
0a90: 20 20 20 20 20 63 20 3d 20 7a 46 6f 72 6d 61 74       c = zFormat
0aa0: 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  [++i];.      if(
0ab0: 20 69 73 64 69 67 69 74 28 63 29 20 7c 7c 20 28   isdigit(c) || (
0ac0: 63 3d 3d 27 2d 27 20 26 26 20 69 73 64 69 67 69  c=='-' && isdigi
0ad0: 74 28 7a 46 6f 72 6d 61 74 5b 69 2b 31 5d 29 29  t(zFormat[i+1]))
0ae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
0af0: 63 3d 3d 27 2d 27 20 29 20 69 2b 2b 3b 0a 20 20  c=='-' ) i++;.  
0b00: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64        while( isd
0b10: 69 67 69 74 28 7a 46 6f 72 6d 61 74 5b 69 5d 29  igit(zFormat[i])
0b20: 20 29 20 69 57 69 64 74 68 20 3d 20 69 57 69 64   ) iWidth = iWid
0b30: 74 68 2a 31 30 20 2b 20 7a 46 6f 72 6d 61 74 5b  th*10 + zFormat[
0b40: 69 2b 2b 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20  i++] - '0';.    
0b50: 20 20 20 20 69 66 28 20 63 3d 3d 27 2d 27 20 29      if( c=='-' )
0b60: 20 69 57 69 64 74 68 20 3d 20 2d 69 57 69 64 74   iWidth = -iWidt
0b70: 68 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  h;.        c = z
0b80: 46 6f 72 6d 61 74 5b 69 5d 3b 0a 20 20 20 20 20  Format[i];.     
0b90: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
0ba0: 27 64 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  'd' ){.        i
0bb0: 6e 74 20 76 20 3d 20 76 61 5f 61 72 67 28 61 70  nt v = va_arg(ap
0bc0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  , int);.        
0bd0: 69 66 28 20 76 3c 30 20 29 7b 0a 20 20 20 20 20  if( v<0 ){.     
0be0: 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65       lemon_addte
0bf0: 78 74 28 73 74 72 2c 20 26 6e 55 73 65 64 2c 20  xt(str, &nUsed, 
0c00: 22 2d 22 2c 20 31 2c 20 69 57 69 64 74 68 29 3b  "-", 1, iWidth);
0c10: 0a 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 2d  .          v = -
0c20: 76 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  v;.        }else
0c30: 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20   if( v==0 ){.   
0c40: 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64 64         lemon_add
0c50: 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65 64  text(str, &nUsed
0c60: 2c 20 22 30 22 2c 20 31 2c 20 69 57 69 64 74 68  , "0", 1, iWidth
0c70: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
0c80: 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20       k = 0;.    
0c90: 20 20 20 20 77 68 69 6c 65 28 20 76 3e 30 20 29      while( v>0 )
0ca0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 2b 2b 3b  {.          k++;
0cb0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70  .          zTemp
0cc0: 5b 73 69 7a 65 6f 66 28 7a 54 65 6d 70 29 2d 6b  [sizeof(zTemp)-k
0cd0: 5d 20 3d 20 28 76 25 31 30 29 20 2b 20 27 30 27  ] = (v%10) + '0'
0ce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 76 20 2f 3d  ;.          v /=
0cf0: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   10;.        }. 
0d00: 20 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64 64         lemon_add
0d10: 74 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65 64  text(str, &nUsed
0d20: 2c 20 26 7a 54 65 6d 70 5b 73 69 7a 65 6f 66 28  , &zTemp[sizeof(
0d30: 7a 54 65 6d 70 29 2d 6b 5d 2c 20 6b 2c 20 69 57  zTemp)-k], k, iW
0d40: 69 64 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c  idth);.      }el
0d50: 73 65 20 69 66 28 20 63 3d 3d 27 73 27 20 29 7b  se if( c=='s' ){
0d60: 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 76 61 5f  .        z = va_
0d70: 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68  arg(ap, const ch
0d80: 61 72 2a 29 3b 0a 20 20 20 20 20 20 20 20 6c 65  ar*);.        le
0d90: 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c  mon_addtext(str,
0da0: 20 26 6e 55 73 65 64 2c 20 7a 2c 20 2d 31 2c 20   &nUsed, z, -1, 
0db0: 69 57 69 64 74 68 29 3b 0a 20 20 20 20 20 20 7d  iWidth);.      }
0dc0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2e 27 20  else if( c=='.' 
0dd0: 26 26 20 6d 65 6d 63 6d 70 28 26 7a 46 6f 72 6d  && memcmp(&zForm
0de0: 61 74 5b 69 5d 2c 20 22 2e 2a 73 22 2c 20 33 29  at[i], ".*s", 3)
0df0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
0e00: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 6b   += 2;.        k
0e10: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
0e20: 74 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20  t);.        z = 
0e30: 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74  va_arg(ap, const
0e40: 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 20   char*);.       
0e50: 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73   lemon_addtext(s
0e60: 74 72 2c 20 26 6e 55 73 65 64 2c 20 7a 2c 20 6b  tr, &nUsed, z, k
0e70: 2c 20 69 57 69 64 74 68 29 3b 0a 20 20 20 20 20  , iWidth);.     
0e80: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 25   }else if( c=='%
0e90: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6d  ' ){.        lem
0ea0: 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20  on_addtext(str, 
0eb0: 26 6e 55 73 65 64 2c 20 22 25 22 2c 20 31 2c 20  &nUsed, "%", 1, 
0ec0: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
0ed0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
0ee0: 28 73 74 64 65 72 72 2c 20 22 69 6c 6c 65 67 61  (stderr, "illega
0ef0: 6c 20 66 6f 72 6d 61 74 5c 6e 22 29 3b 0a 20 20  l format\n");.  
0f00: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
0f10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d       }.      j =
0f20: 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   i+1;.    }.  }.
0f30: 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28    lemon_addtext(
0f40: 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 26 7a 46  str, &nUsed, &zF
0f50: 6f 72 6d 61 74 5b 6a 5d 2c 20 69 2d 6a 2c 20 30  ormat[j], i-j, 0
0f60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 55 73 65  );.  return nUse
0f70: 64 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  d;.}.static int 
0f80: 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 63 68  lemon_sprintf(ch
0f90: 61 72 20 2a 73 74 72 2c 20 63 6f 6e 73 74 20 63  ar *str, const c
0fa0: 68 61 72 20 2a 66 6f 72 6d 61 74 2c 20 2e 2e 2e  har *format, ...
0fb0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
0fc0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f  .  int rc;.  va_
0fd0: 73 74 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74  start(ap, format
0fe0: 29 3b 0a 20 20 72 63 20 3d 20 6c 65 6d 6f 6e 5f  );.  rc = lemon_
0ff0: 76 73 70 72 69 6e 74 66 28 73 74 72 2c 20 66 6f  vsprintf(str, fo
1000: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
1010: 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72  end(ap);.  retur
1020: 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  n rc;.}.static v
1030: 6f 69 64 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79  oid lemon_strcpy
1040: 28 63 68 61 72 20 2a 64 65 73 74 2c 20 63 6f 6e  (char *dest, con
1050: 73 74 20 63 68 61 72 20 2a 73 72 63 29 7b 0a 20  st char *src){. 
1060: 20 77 68 69 6c 65 28 20 28 2a 28 64 65 73 74 2b   while( (*(dest+
1070: 2b 29 20 3d 20 2a 28 73 72 63 2b 2b 29 29 21 3d  +) = *(src++))!=
1080: 30 20 29 7b 7d 0a 7d 0a 73 74 61 74 69 63 20 76  0 ){}.}.static v
1090: 6f 69 64 20 6c 65 6d 6f 6e 5f 73 74 72 63 61 74  oid lemon_strcat
10a0: 28 63 68 61 72 20 2a 64 65 73 74 2c 20 63 6f 6e  (char *dest, con
10b0: 73 74 20 63 68 61 72 20 2a 73 72 63 29 7b 0a 20  st char *src){. 
10c0: 20 77 68 69 6c 65 28 20 2a 64 65 73 74 20 29 20   while( *dest ) 
10d0: 64 65 73 74 2b 2b 3b 0a 20 20 6c 65 6d 6f 6e 5f  dest++;.  lemon_
10e0: 73 74 72 63 70 79 28 64 65 73 74 2c 20 73 72 63  strcpy(dest, src
10f0: 29 3b 0a 7d 0a 0a 0a 2f 2a 20 61 20 66 65 77 20  );.}.../* a few 
1100: 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  forward declarat
1110: 69 6f 6e 73 2e 2e 2e 20 2a 2f 0a 73 74 72 75 63  ions... */.struc
1120: 74 20 72 75 6c 65 3b 0a 73 74 72 75 63 74 20 6c  t rule;.struct l
1130: 65 6d 6f 6e 3b 0a 73 74 72 75 63 74 20 61 63 74  emon;.struct act
1140: 69 6f 6e 3b 0a 0a 73 74 61 74 69 63 20 73 74 72  ion;..static str
1150: 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74 69  uct action *Acti
1160: 6f 6e 5f 6e 65 77 28 76 6f 69 64 29 3b 0a 73 74  on_new(void);.st
1170: 61 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69  atic struct acti
1180: 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28  on *Action_sort(
1190: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29  struct action *)
11a0: 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ;../********** F
11b0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 62 75  rom the file "bu
11c0: 69 6c 64 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ild.h" *********
11d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69  ***********/.voi
11f0: 64 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64  d FindRulePreced
1200: 65 6e 63 65 73 28 29 3b 0a 76 6f 69 64 20 46 69  ences();.void Fi
1210: 6e 64 46 69 72 73 74 53 65 74 73 28 29 3b 0a 76  ndFirstSets();.v
1220: 6f 69 64 20 46 69 6e 64 53 74 61 74 65 73 28 29  oid FindStates()
1230: 3b 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73  ;.void FindLinks
1240: 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c  ();.void FindFol
1250: 6c 6f 77 53 65 74 73 28 29 3b 0a 76 6f 69 64 20  lowSets();.void 
1260: 46 69 6e 64 41 63 74 69 6f 6e 73 28 29 3b 0a 0a  FindActions();..
1270: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  /********* From 
1280: 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69 67  the file "config
1290: 6c 69 73 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  list.h" ********
12a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20  *********/.void 
12c0: 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28  Configlist_init(
12d0: 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20 63 6f  void);.struct co
12e0: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
12f0: 5f 61 64 64 28 73 74 72 75 63 74 20 72 75 6c 65  _add(struct rule
1300: 20 2a 2c 20 69 6e 74 29 3b 0a 73 74 72 75 63 74   *, int);.struct
1310: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
1320: 69 73 74 5f 61 64 64 62 61 73 69 73 28 73 74 72  ist_addbasis(str
1330: 75 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74 29  uct rule *, int)
1340: 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  ;.void Configlis
1350: 74 5f 63 6c 6f 73 75 72 65 28 73 74 72 75 63 74  t_closure(struct
1360: 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20   lemon *);.void 
1370: 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28  Configlist_sort(
1380: 76 6f 69 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66  void);.void Conf
1390: 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73  iglist_sortbasis
13a0: 28 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20 63  (void);.struct c
13b0: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73  onfig *Configlis
13c0: 74 5f 72 65 74 75 72 6e 28 76 6f 69 64 29 3b 0a  t_return(void);.
13d0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
13e0: 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28  onfiglist_basis(
13f0: 76 6f 69 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66  void);.void Conf
1400: 69 67 6c 69 73 74 5f 65 61 74 28 73 74 72 75 63  iglist_eat(struc
1410: 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69  t config *);.voi
1420: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73  d Configlist_res
1430: 65 74 28 76 6f 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a  et(void);../****
1440: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
1450: 69 6c 65 20 22 65 72 72 6f 72 2e 68 22 20 2a 2a  ile "error.h" **
1460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1480: 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 45 72 72 6f  *****/.void Erro
1490: 72 4d 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20  rMsg(const char 
14a0: 2a 2c 20 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  *, int,const cha
14b0: 72 20 2a 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a  r *, ...);../***
14c0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
14d0: 65 20 22 6f 70 74 69 6f 6e 2e 68 22 20 2a 2a 2a  e "option.h" ***
14e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1500: 2a 2a 2a 2a 2a 2a 2a 2f 0a 65 6e 75 6d 20 6f 70  *******/.enum op
1510: 74 69 6f 6e 5f 74 79 70 65 20 7b 20 4f 50 54 5f  tion_type { OPT_
1520: 46 4c 41 47 3d 31 2c 20 20 4f 50 54 5f 49 4e 54  FLAG=1,  OPT_INT
1530: 2c 20 20 4f 50 54 5f 44 42 4c 2c 20 20 4f 50 54  ,  OPT_DBL,  OPT
1540: 5f 53 54 52 2c 0a 20 20 20 20 20 20 20 20 20 4f  _STR,.         O
1550: 50 54 5f 46 46 4c 41 47 2c 20 4f 50 54 5f 46 49  PT_FFLAG, OPT_FI
1560: 4e 54 2c 20 4f 50 54 5f 46 44 42 4c 2c 20 4f 50  NT, OPT_FDBL, OP
1570: 54 5f 46 53 54 52 7d 3b 0a 73 74 72 75 63 74 20  T_FSTR};.struct 
1580: 73 5f 6f 70 74 69 6f 6e 73 20 7b 0a 20 20 65 6e  s_options {.  en
1590: 75 6d 20 6f 70 74 69 6f 6e 5f 74 79 70 65 20 74  um option_type t
15a0: 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ype;.  const cha
15b0: 72 20 2a 6c 61 62 65 6c 3b 0a 20 20 63 68 61 72  r *label;.  char
15c0: 20 2a 61 72 67 3b 0a 20 20 63 6f 6e 73 74 20 63   *arg;.  const c
15d0: 68 61 72 20 2a 6d 65 73 73 61 67 65 3b 0a 7d 3b  har *message;.};
15e0: 0a 69 6e 74 20 20 20 20 4f 70 74 49 6e 69 74 28  .int    OptInit(
15f0: 63 68 61 72 2a 2a 2c 73 74 72 75 63 74 20 73 5f  char**,struct s_
1600: 6f 70 74 69 6f 6e 73 2a 2c 46 49 4c 45 2a 29 3b  options*,FILE*);
1610: 0a 69 6e 74 20 20 20 20 4f 70 74 4e 41 72 67 73  .int    OptNArgs
1620: 28 76 6f 69 64 29 3b 0a 63 68 61 72 20 20 2a 4f  (void);.char  *O
1630: 70 74 41 72 67 28 69 6e 74 29 3b 0a 76 6f 69 64  ptArg(int);.void
1640: 20 20 20 4f 70 74 45 72 72 28 69 6e 74 29 3b 0a     OptErr(int);.
1650: 76 6f 69 64 20 20 20 4f 70 74 50 72 69 6e 74 28  void   OptPrint(
1660: 76 6f 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  void);../*******
1670: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
1680: 22 70 61 72 73 65 2e 68 22 20 2a 2a 2a 2a 2a 2a  "parse.h" ******
1690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16b0: 2a 2a 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65 28  ***/.void Parse(
16c0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
16d0: 6d 70 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  mp);../*********
16e0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
16f0: 70 6c 69 6e 6b 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  plink.h" *******
1700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1720: 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  /.struct plink *
1730: 50 6c 69 6e 6b 5f 6e 65 77 28 76 6f 69 64 29 3b  Plink_new(void);
1740: 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28  .void Plink_add(
1750: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c  struct plink **,
1760: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
1770: 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f  );.void Plink_co
1780: 70 79 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  py(struct plink 
1790: 2a 2a 2c 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  **, struct plink
17a0: 20 2a 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f   *);.void Plink_
17b0: 64 65 6c 65 74 65 28 73 74 72 75 63 74 20 70 6c  delete(struct pl
17c0: 69 6e 6b 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  ink *);../******
17d0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
17e0: 6c 65 20 22 72 65 70 6f 72 74 2e 68 22 20 2a 2a  le "report.h" **
17f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1810: 2a 2a 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e  ***/.void Reprin
1820: 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  t(struct lemon *
1830: 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75  );.void ReportOu
1840: 74 70 75 74 28 73 74 72 75 63 74 20 6c 65 6d 6f  tput(struct lemo
1850: 6e 20 2a 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72  n *);.void Repor
1860: 74 54 61 62 6c 65 28 73 74 72 75 63 74 20 6c 65  tTable(struct le
1870: 6d 6f 6e 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69  mon *, int);.voi
1880: 64 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 73  d ReportHeader(s
1890: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a  truct lemon *);.
18a0: 76 6f 69 64 20 43 6f 6d 70 72 65 73 73 54 61 62  void CompressTab
18b0: 6c 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  les(struct lemon
18c0: 20 2a 29 3b 0a 76 6f 69 64 20 52 65 73 6f 72 74   *);.void Resort
18d0: 53 74 61 74 65 73 28 73 74 72 75 63 74 20 6c 65  States(struct le
18e0: 6d 6f 6e 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  mon *);../******
18f0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
1900: 6c 65 20 22 73 65 74 2e 68 22 20 2a 2a 2a 2a 2a  le "set.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 2a 2a  ****************
1930: 2a 2a 2a 2f 0a 76 6f 69 64 20 20 53 65 74 53 69  ***/.void  SetSi
1940: 7a 65 28 69 6e 74 29 3b 20 20 20 20 20 20 20 20  ze(int);        
1950: 20 20 20 20 20 2f 2a 20 41 6c 6c 20 73 65 74 73       /* All sets
1960: 20 77 69 6c 6c 20 62 65 20 6f 66 20 73 69 7a 65   will be of size
1970: 20 4e 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e   N */.char *SetN
1980: 65 77 28 76 6f 69 64 29 3b 20 20 20 20 20 20 20  ew(void);       
1990: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77          /* A new
19a0: 20 73 65 74 20 66 6f 72 20 65 6c 65 6d 65 6e 74   set for element
19b0: 20 30 2e 2e 4e 20 2a 2f 0a 76 6f 69 64 20 20 53   0..N */.void  S
19c0: 65 74 46 72 65 65 28 63 68 61 72 2a 29 3b 20 20  etFree(char*);  
19d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
19e0: 61 6c 6c 6f 63 61 74 65 20 61 20 73 65 74 20 2a  allocate a set *
19f0: 2f 0a 69 6e 74 20 53 65 74 41 64 64 28 63 68 61  /.int SetAdd(cha
1a00: 72 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20 20  r*,int);        
1a10: 20 20 20 20 2f 2a 20 41 64 64 20 65 6c 65 6d 65      /* Add eleme
1a20: 6e 74 20 74 6f 20 61 20 73 65 74 20 2a 2f 0a 69  nt to a set */.i
1a30: 6e 74 20 53 65 74 55 6e 69 6f 6e 28 63 68 61 72  nt SetUnion(char
1a40: 20 2a 2c 63 68 61 72 20 2a 29 3b 20 20 20 20 2f   *,char *);    /
1a50: 2a 20 41 20 3c 2d 20 41 20 55 20 42 2c 20 74 68  * A <- A U B, th
1a60: 72 75 20 65 6c 65 6d 65 6e 74 20 4e 20 2a 2f 0a  ru element N */.
1a70: 23 64 65 66 69 6e 65 20 53 65 74 46 69 6e 64 28  #define SetFind(
1a80: 58 2c 59 29 20 28 58 5b 59 5d 29 20 20 20 20 20  X,Y) (X[Y])     
1a90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 59 20 69    /* True if Y i
1aa0: 73 20 69 6e 20 73 65 74 20 58 20 2a 2f 0a 0a 2f  s in set X */../
1ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
1ac0: 74 68 65 20 66 69 6c 65 20 22 73 74 72 75 63 74  the file "struct
1ad0: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
1ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
1b00: 20 50 72 69 6e 63 69 70 61 6c 20 64 61 74 61 20   Principal data 
1b10: 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74  structures for t
1b20: 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
1b30: 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 74  generator..*/..t
1b40: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 4c 45 4d  ypedef enum {LEM
1b50: 4f 4e 5f 46 41 4c 53 45 3d 30 2c 20 4c 45 4d 4f  ON_FALSE=0, LEMO
1b60: 4e 5f 54 52 55 45 7d 20 42 6f 6f 6c 65 61 6e 3b  N_TRUE} Boolean;
1b70: 0a 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20 28 74 65  ../* Symbols (te
1b80: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74  rminals and nont
1b90: 65 72 6d 69 6e 61 6c 73 29 20 6f 66 20 74 68 65  erminals) of the
1ba0: 20 67 72 61 6d 6d 61 72 20 61 72 65 20 73 74 6f   grammar are sto
1bb0: 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f  red.** in the fo
1bc0: 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 65 6e 75 6d  llowing: */.enum
1bd0: 20 73 79 6d 62 6f 6c 5f 74 79 70 65 20 7b 0a 20   symbol_type {. 
1be0: 20 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 4e 4f 4e   TERMINAL,.  NON
1bf0: 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 4d 55 4c 54  TERMINAL,.  MULT
1c00: 49 54 45 52 4d 49 4e 41 4c 0a 7d 3b 0a 65 6e 75  ITERMINAL.};.enu
1c10: 6d 20 65 5f 61 73 73 6f 63 20 7b 0a 20 20 20 20  m e_assoc {.    
1c20: 4c 45 46 54 2c 0a 20 20 20 20 52 49 47 48 54 2c  LEFT,.    RIGHT,
1c30: 0a 20 20 20 20 4e 4f 4e 45 2c 0a 20 20 20 20 55  .    NONE,.    U
1c40: 4e 4b 0a 7d 3b 0a 73 74 72 75 63 74 20 73 79 6d  NK.};.struct sym
1c50: 62 6f 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  bol {.  const ch
1c60: 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20  ar *name;       
1c70: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1c80: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 6e 74 20  symbol */.  int 
1c90: 69 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  index;          
1ca0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75       /* Index nu
1cb0: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 73 79  mber for this sy
1cc0: 6d 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 73  mbol */.  enum s
1cd0: 79 6d 62 6f 6c 5f 74 79 70 65 20 74 79 70 65 3b  ymbol_type type;
1ce0: 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 73 20 61 72     /* Symbols ar
1cf0: 65 20 61 6c 6c 20 65 69 74 68 65 72 20 54 45 52  e all either TER
1d00: 4d 49 4e 41 4c 53 20 6f 72 20 4e 54 73 20 2a 2f  MINALS or NTs */
1d10: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
1d20: 72 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 4c  rule;       /* L
1d30: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 72 75  inked list of ru
1d40: 6c 65 73 20 6f 66 20 74 68 69 73 20 28 69 66 20  les of this (if 
1d50: 61 6e 20 4e 54 29 20 2a 2f 0a 20 20 73 74 72 75  an NT) */.  stru
1d60: 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62  ct symbol *fallb
1d70: 61 63 6b 3b 20 2f 2a 20 66 61 6c 6c 62 61 63 6b  ack; /* fallback
1d80: 20 74 6f 6b 65 6e 20 69 6e 20 63 61 73 65 20 74   token in case t
1d90: 68 69 73 20 74 6f 6b 65 6e 20 64 6f 65 73 6e 27  his token doesn'
1da0: 74 20 70 61 72 73 65 20 2a 2f 0a 20 20 69 6e 74  t parse */.  int
1db0: 20 70 72 65 63 3b 20 20 20 20 20 20 20 20 20 20   prec;          
1dc0: 20 20 20 20 20 20 2f 2a 20 50 72 65 63 65 64 65        /* Precede
1dd0: 6e 63 65 20 69 66 20 64 65 66 69 6e 65 64 20 28  nce if defined (
1de0: 2d 31 20 6f 74 68 65 72 77 69 73 65 29 20 2a 2f  -1 otherwise) */
1df0: 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20  .  enum e_assoc 
1e00: 61 73 73 6f 63 3b 20 20 20 20 20 20 2f 2a 20 41  assoc;      /* A
1e10: 73 73 6f 63 69 61 74 69 76 69 74 79 20 69 66 20  ssociativity if 
1e20: 70 72 65 63 65 64 65 6e 63 65 20 69 73 20 64 65  precedence is de
1e30: 66 69 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  fined */.  char 
1e40: 2a 66 69 72 73 74 73 65 74 3b 20 20 20 20 20 20  *firstset;      
1e50: 20 20 20 20 2f 2a 20 46 69 72 73 74 2d 73 65 74      /* First-set
1e60: 20 66 6f 72 20 61 6c 6c 20 72 75 6c 65 73 20 6f   for all rules o
1e70: 66 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f  f this symbol */
1e80: 0a 20 20 42 6f 6f 6c 65 61 6e 20 6c 61 6d 62 64  .  Boolean lambd
1e90: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  a;          /* T
1ea0: 72 75 65 20 69 66 20 4e 54 20 61 6e 64 20 63 61  rue if NT and ca
1eb0: 6e 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 6d  n generate an em
1ec0: 70 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  pty string */.  
1ed0: 69 6e 74 20 75 73 65 43 6e 74 3b 20 20 20 20 20  int useCnt;     
1ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ef0: 65 72 20 6f 66 20 74 69 6d 65 73 20 75 73 65 64  er of times used
1f00: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 73 74   */.  char *dest
1f10: 72 75 63 74 6f 72 3b 20 20 20 20 20 20 20 20 2f  ructor;        /
1f20: 2a 20 43 6f 64 65 20 77 68 69 63 68 20 65 78 65  * Code which exe
1f30: 63 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74  cutes whenever t
1f40: 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 0a 20 20  his symbol is.  
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 70 70           ** popp
1f70: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  ed from the stac
1f80: 6b 20 64 75 72 69 6e 67 20 65 72 72 6f 72 20 70  k during error p
1f90: 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69  rocessing */.  i
1fa0: 6e 74 20 64 65 73 74 4c 69 6e 65 6e 6f 3b 20 20  nt destLineno;  
1fb0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
1fc0: 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72 74  number for start
1fd0: 20 6f 66 20 64 65 73 74 72 75 63 74 6f 72 20 2a   of destructor *
1fe0: 2f 0a 20 20 63 68 61 72 20 2a 64 61 74 61 74 79  /.  char *dataty
1ff0: 70 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pe;          /* 
2000: 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6f 66  The data type of
2010: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c   information hel
2020: 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 20 20  d by this.      
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20       ** object. 
2050: 4f 6e 6c 79 20 75 73 65 64 20 69 66 20 74 79 70  Only used if typ
2060: 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a  e==NONTERMINAL *
2070: 2f 0a 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20  /.  int dtnum;  
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2090: 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6e 75  The data type nu
20a0: 6d 62 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61  mber.  In the pa
20b0: 72 73 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a  rser, the value.
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74             ** st
20e0: 61 63 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20  ack is a union. 
20f0: 20 54 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65   The .yy%d eleme
2100: 6e 74 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20  nt of this.     
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69        ** union i
2130: 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 64 61  s the correct da
2140: 74 61 20 74 79 70 65 20 66 6f 72 20 74 68 69 73  ta type for this
2150: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a 20   object */.  /* 
2160: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
2170: 65 6c 64 73 20 61 72 65 20 75 73 65 64 20 62 79  elds are used by
2180: 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73 20   MULTITERMINALs 
2190: 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 73  only */.  int ns
21a0: 75 62 73 79 6d 3b 20 20 20 20 20 20 20 20 20 20  ubsym;          
21b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21c0: 63 6f 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62  constituent symb
21d0: 6f 6c 73 20 69 6e 20 74 68 65 20 4d 55 4c 54 49  ols in the MULTI
21e0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
21f0: 62 6f 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20 2f  bol **subsym;  /
2200: 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6e 73 74  * Array of const
2210: 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 2a  ituent symbols *
2220: 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70 72  /.};../* Each pr
2230: 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 69 6e  oduction rule in
2240: 20 74 68 65 20 67 72 61 6d 6d 61 72 20 69 73 20   the grammar is 
2250: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 66 6f  stored in the fo
2260: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
2270: 74 75 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63 74  ture.  */.struct
2280: 20 72 75 6c 65 20 7b 0a 20 20 73 74 72 75 63 74   rule {.  struct
2290: 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20   symbol *lhs;   
22a0: 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20     /* Left-hand 
22b0: 73 69 64 65 20 6f 66 20 74 68 65 20 72 75 6c 65  side of the rule
22c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
22d0: 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 2f   *lhsalias;    /
22e0: 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20  * Alias for the 
22f0: 4c 48 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e  LHS (NULL if non
2300: 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73 53  e) */.  int lhsS
2310: 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20  tart;           
2320: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 65 66 74   /* True if left
2330: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 74 68  -hand side is th
2340: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a  e start symbol *
2350: 2f 0a 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e 65  /.  int ruleline
2360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2370: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Line number for 
2380: 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e  the rule */.  in
2390: 74 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20  t nrhs;         
23a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23b0: 20 6f 66 20 52 48 53 20 73 79 6d 62 6f 6c 73 20   of RHS symbols 
23c0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
23d0: 6f 6c 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f 2a  ol **rhs;     /*
23e0: 20 54 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 73   The RHS symbols
23f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2400: 20 2a 2a 72 68 73 61 6c 69 61 73 3b 20 20 20 2f   **rhsalias;   /
2410: 2a 20 41 6e 20 61 6c 69 61 73 20 66 6f 72 20 65  * An alias for e
2420: 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28  ach RHS symbol (
2430: 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f  NULL if none) */
2440: 0a 20 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20 20  .  int line;    
2450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2460: 69 6e 65 20 6e 75 6d 62 65 72 20 61 74 20 77 68  ine number at wh
2470: 69 63 68 20 63 6f 64 65 20 62 65 67 69 6e 73 20  ich code begins 
2480: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2490: 2a 63 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a  *code;        /*
24a0: 20 54 68 65 20 63 6f 64 65 20 65 78 65 63 75 74   The code execut
24b0: 65 64 20 77 68 65 6e 20 74 68 69 73 20 72 75 6c  ed when this rul
24c0: 65 20 69 73 20 72 65 64 75 63 65 64 20 2a 2f 0a  e is reduced */.
24d0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
24e0: 2a 70 72 65 63 73 79 6d 3b 20 20 2f 2a 20 50 72  *precsym;  /* Pr
24f0: 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20  ecedence symbol 
2500: 66 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f  for this rule */
2510: 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20 20 20  .  int index;   
2520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2530: 6e 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 66  n index number f
2540: 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a  or this rule */.
2550: 20 20 42 6f 6f 6c 65 61 6e 20 63 61 6e 52 65 64    Boolean canRed
2560: 75 63 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  uce;       /* Tr
2570: 75 65 20 69 66 20 74 68 69 73 20 72 75 6c 65 20  ue if this rule 
2580: 69 73 20 65 76 65 72 20 72 65 64 75 63 65 64 20  is ever reduced 
2590: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
25a0: 20 2a 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a   *nextlhs;    /*
25b0: 20 4e 65 78 74 20 72 75 6c 65 20 77 69 74 68 20   Next rule with 
25c0: 74 68 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a  the same LHS */.
25d0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e    struct rule *n
25e0: 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  ext;       /* Ne
25f0: 78 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67  xt rule in the g
2600: 6c 6f 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b  lobal list */.};
2610: 0a 0a 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72 61  ../* A configura
2620: 74 69 6f 6e 20 69 73 20 61 20 70 72 6f 64 75 63  tion is a produc
2630: 74 69 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68 65  tion rule of the
2640: 20 67 72 61 6d 6d 61 72 20 74 6f 67 65 74 68 65   grammar togethe
2650: 72 20 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b  r with.** a mark
2660: 20 28 64 6f 74 29 20 73 68 6f 77 69 6e 67 20 68   (dot) showing h
2670: 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 61 74 20  ow much of that 
2680: 72 75 6c 65 20 68 61 73 20 62 65 65 6e 20 70 72  rule has been pr
2690: 6f 63 65 73 73 65 64 20 73 6f 20 66 61 72 2e 0a  ocessed so far..
26a0: 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ** Configuration
26b0: 73 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61  s also contain a
26c0: 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63   follow-set whic
26d0: 68 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  h is a list of t
26e0: 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f  erminal.** symbo
26f0: 6c 73 20 77 68 69 63 68 20 61 72 65 20 61 6c 6c  ls which are all
2700: 6f 77 65 64 20 74 6f 20 69 6d 6d 65 64 69 61 74  owed to immediat
2710: 65 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65  ely follow the e
2720: 6e 64 20 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a  nd of the rule..
2730: 2a 2a 20 45 76 65 72 79 20 63 6f 6e 66 69 67 75  ** Every configu
2740: 72 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64  ration is record
2750: 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63  ed as an instanc
2760: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2770: 6e 67 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67 73  ng: */.enum cfgs
2780: 74 61 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c 45  tatus {.  COMPLE
2790: 54 45 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54 45  TE,.  INCOMPLETE
27a0: 0a 7d 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  .};.struct confi
27b0: 67 20 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  g {.  struct rul
27c0: 65 20 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f  e *rp;         /
27d0: 2a 20 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20  * The rule upon 
27e0: 77 68 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67  which the config
27f0: 75 72 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64  uration is based
2800: 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20   */.  int dot;  
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2820: 2a 20 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e  * The parse poin
2830: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73  t */.  char *fws
2840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2850: 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f  /* Follow-set fo
2860: 72 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61  r this configura
2870: 74 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73  tion only */.  s
2880: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c  truct plink *fpl
2890: 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f  p;      /* Follo
28a0: 77 2d 73 65 74 20 66 6f 72 77 61 72 64 20 70 72  w-set forward pr
28b0: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20  opagation links 
28c0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  */.  struct plin
28d0: 6b 20 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a  k *bplp;      /*
28e0: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b   Follow-set back
28f0: 77 61 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f  wards propagatio
2900: 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72  n links */.  str
2910: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
2920: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2930: 20 74 6f 20 73 74 61 74 65 20 77 68 69 63 68 20   to state which 
2940: 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f  contains this */
2950: 0a 20 20 65 6e 75 6d 20 63 66 67 73 74 61 74 75  .  enum cfgstatu
2960: 73 20 73 74 61 74 75 73 3b 20 20 20 2f 2a 20 75  s status;   /* u
2970: 73 65 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f  sed during follo
2980: 77 73 65 74 20 61 6e 64 20 73 68 69 66 74 20 63  wset and shift c
2990: 6f 6d 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20  omputations */. 
29a0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
29b0: 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78  next;     /* Nex
29c0: 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  t configuration 
29d0: 69 6e 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a  in the state */.
29e0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
29f0: 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *bp;       /* Th
2a00: 65 20 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e  e next basis con
2a10: 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b  figuration */.};
2a20: 0a 0a 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20  ..enum e_action 
2a30: 7b 0a 20 20 53 48 49 46 54 2c 0a 20 20 41 43 43  {.  SHIFT,.  ACC
2a40: 45 50 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a 20  EPT,.  REDUCE,. 
2a50: 20 45 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e 46   ERROR,.  SSCONF
2a60: 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20  LICT,           
2a70: 20 20 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68     /* A shift/sh
2a80: 69 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ift conflict */.
2a90: 20 20 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20    SRCONFLICT,   
2aa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
2ab0: 73 20 61 20 72 65 64 75 63 65 2c 20 62 75 74 20  s a reduce, but 
2ac0: 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69  part of a confli
2ad0: 63 74 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c 49  ct */.  RRCONFLI
2ae0: 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CT,             
2af0: 20 2f 2a 20 57 61 73 20 61 20 72 65 64 75 63 65   /* Was a reduce
2b00: 2c 20 62 75 74 20 70 61 72 74 20 6f 66 20 61 20  , but part of a 
2b10: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 48  conflict */.  SH
2b20: 5f 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20  _RESOLVED,      
2b30: 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20         /* Was a 
2b40: 73 68 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e  shift.  Preceden
2b50: 63 65 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66  ce resolved conf
2b60: 6c 69 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45 53  lict */.  RD_RES
2b70: 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20 20  OLVED,          
2b80: 20 20 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65     /* Was reduce
2b90: 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20 72 65  .  Precedence re
2ba0: 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20  solved conflict 
2bb0: 2a 2f 0a 20 20 4e 4f 54 5f 55 53 45 44 20 20 20  */.  NOT_USED   
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bd0: 20 44 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70   Deleted by comp
2be0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 2f  ression */.};../
2bf0: 2a 20 45 76 65 72 79 20 73 68 69 66 74 20 6f 72  * Every shift or
2c00: 20 72 65 64 75 63 65 20 6f 70 65 72 61 74 69 6f   reduce operatio
2c10: 6e 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 6f  n is stored as o
2c20: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
2c30: 69 6e 67 20 2a 2f 0a 73 74 72 75 63 74 20 61 63  ing */.struct ac
2c40: 74 69 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20  tion {.  struct 
2c50: 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 20 20  symbol *sp;     
2c60: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 2d 61 68    /* The look-ah
2c70: 65 61 64 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  ead symbol */.  
2c80: 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79  enum e_action ty
2c90: 70 65 3b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  pe;.  union {.  
2ca0: 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
2cb0: 73 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  stp;     /* The 
2cc0: 6e 65 77 20 73 74 61 74 65 2c 20 69 66 20 61 20  new state, if a 
2cd0: 73 68 69 66 74 20 2a 2f 0a 20 20 20 20 73 74 72  shift */.    str
2ce0: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 20 20 20  uct rule *rp;   
2cf0: 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 2c      /* The rule,
2d00: 20 69 66 20 61 20 72 65 64 75 63 65 20 2a 2f 0a   if a reduce */.
2d10: 20 20 7d 20 78 3b 0a 20 20 73 74 72 75 63 74 20    } x;.  struct 
2d20: 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20 20  action *next;   
2d30: 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e    /* Next action
2d40: 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20   for this state 
2d50: 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  */.  struct acti
2d60: 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f 2a  on *collide;  /*
2d70: 20 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69 74   Next action wit
2d80: 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20  h the same hash 
2d90: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 73  */.};../* Each s
2da0: 74 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e 65  tate of the gene
2db0: 72 61 74 65 64 20 70 61 72 73 65 72 27 73 20 66  rated parser's f
2dc0: 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68  inite state mach
2dd0: 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64 65  ine.** is encode
2de0: 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  d as an instance
2df0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2e00: 67 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  g structure. */.
2e10: 73 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a 20  struct state {. 
2e20: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
2e30: 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  bp;       /* The
2e40: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
2e50: 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73  tions for this s
2e60: 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  tate */.  struct
2e70: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 20   config *cfp;   
2e80: 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69 67     /* All config
2e90: 75 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69 73  urations in this
2ea0: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73 74   set */.  int st
2eb0: 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  atenum;         
2ec0: 20 20 20 2f 2a 20 53 65 71 75 65 6e 74 69 61 6c     /* Sequential
2ed0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
2ee0: 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75   state */.  stru
2ef0: 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20 20  ct action *ap;  
2f00: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
2f10: 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69   actions for thi
2f20: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  s state */.  int
2f30: 20 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63 74   nTknAct, nNtAct
2f40: 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
2f50: 6f 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74 65  of actions on te
2f60: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74  rminals and nont
2f70: 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e  erminals */.  in
2f80: 74 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74 4f  t iTknOfst, iNtO
2f90: 66 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63 74  fst;   /* yy_act
2fa0: 69 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f 72  ion[] offset for
2fb0: 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e   terminals and n
2fc0: 6f 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  onterms */.  int
2fd0: 20 69 44 66 6c 74 3b 20 20 20 20 20 20 20 20 20   iDflt;         
2fe0: 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74        /* Default
2ff0: 20 61 63 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 64   action */.};.#d
3000: 65 66 69 6e 65 20 4e 4f 5f 4f 46 46 53 45 54 20  efine NO_OFFSET 
3010: 28 2d 32 31 34 37 34 38 33 36 34 37 29 0a 0a 2f  (-2147483647)../
3020: 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 70 72  * A followset pr
3030: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 20 69  opagation link i
3040: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
3050: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6f 6e  e contents of on
3060: 65 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74 69  e.** configurati
3070: 6f 6e 20 66 6f 6c 6c 6f 77 73 65 74 20 73 68 6f  on followset sho
3080: 75 6c 64 20 62 65 20 70 72 6f 70 61 67 61 74 65  uld be propagate
3090: 64 20 74 6f 20 61 6e 6f 74 68 65 72 20 77 68 65  d to another whe
30a0: 6e 65 76 65 72 0a 2a 2a 20 74 68 65 20 66 69 72  never.** the fir
30b0: 73 74 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 73  st changes. */.s
30c0: 74 72 75 63 74 20 70 6c 69 6e 6b 20 7b 0a 20 20  truct plink {.  
30d0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
30e0: 66 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  fp;      /* The 
30f0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f  configuration to
3100: 20 77 68 69 63 68 20 6c 69 6e 6b 65 64 20 2a 2f   which linked */
3110: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
3120: 2a 6e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 54  *next;      /* T
3130: 68 65 20 6e 65 78 74 20 70 72 6f 70 61 67 61 74  he next propagat
3140: 65 20 6c 69 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  e link */.};../*
3150: 20 54 68 65 20 73 74 61 74 65 20 76 65 63 74 6f   The state vecto
3160: 72 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  r for the entire
3170: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
3180: 72 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 73  r is recorded as
3190: 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 2e 20 20 28 4c  .** follows.  (L
31a0: 45 4d 4f 4e 20 75 73 65 73 20 6e 6f 20 67 6c 6f  EMON uses no glo
31b0: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 6e  bal variables an
31c0: 64 20 6d 61 6b 65 73 20 6c 69 74 74 6c 65 20 75  d makes little u
31d0: 73 65 20 6f 66 0a 2a 2a 20 73 74 61 74 69 63 20  se of.** static 
31e0: 76 61 72 69 61 62 6c 65 73 2e 20 20 46 69 65 6c  variables.  Fiel
31f0: 64 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ds in the follow
3200: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61  ing structure ca
3210: 6e 20 62 65 20 74 68 6f 75 67 68 74 0a 2a 2a 20  n be thought.** 
3220: 6f 66 20 61 73 20 62 65 67 69 6e 20 67 6c 6f 62  of as begin glob
3230: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  al variables in 
3240: 74 68 65 20 70 72 6f 67 72 61 6d 2e 29 20 2a 2f  the program.) */
3250: 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 7b 0a  .struct lemon {.
3260: 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
3270: 2a 73 6f 72 74 65 64 3b 20 20 20 2f 2a 20 54 61  *sorted;   /* Ta
3280: 62 6c 65 20 6f 66 20 73 74 61 74 65 73 20 73 6f  ble of states so
3290: 72 74 65 64 20 62 79 20 73 74 61 74 65 20 6e 75  rted by state nu
32a0: 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74  mber */.  struct
32b0: 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20 20 20   rule *rule;    
32c0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
32d0: 6c 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74  l rules */.  int
32e0: 20 6e 73 74 61 74 65 3b 20 20 20 20 20 20 20 20   nstate;        
32f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3300: 6f 66 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 69  of states */.  i
3310: 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20 20 20 20  nt nrule;       
3320: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3330: 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a 20 20  r of rules */.  
3340: 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20 20 20  int nsymbol;    
3350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3360: 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 61  er of terminal a
3370: 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 73  nd nonterminal s
3380: 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  ymbols */.  int 
3390: 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20  nterminal;      
33a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
33b0: 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  f terminal symbo
33c0: 6c 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ls */.  struct s
33d0: 79 6d 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c 73 3b  ymbol **symbols;
33e0: 20 2f 2a 20 53 6f 72 74 65 64 20 61 72 72 61 79   /* Sorted array
33f0: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
3400: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74  symbols */.  int
3410: 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20 20   errorcnt;      
3420: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3430: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73  of errors */.  s
3440: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72  truct symbol *er
3450: 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20 65  rsym;   /* The e
3460: 72 72 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20  rror symbol */. 
3470: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
3480: 77 69 6c 64 63 61 72 64 3b 20 2f 2a 20 54 6f 6b  wildcard; /* Tok
3490: 65 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  en that matches 
34a0: 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 63 68  anything */.  ch
34b0: 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20  ar *name;       
34c0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
34d0: 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
34e0: 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72  parser */.  char
34f0: 20 2a 61 72 67 3b 20 20 20 20 20 20 20 20 20 20   *arg;          
3500: 20 20 20 20 20 2f 2a 20 44 65 63 6c 61 72 61 74       /* Declarat
3510: 69 6f 6e 20 6f 66 20 74 68 65 20 33 74 68 20 61  ion of the 3th a
3520: 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73 65  rgument to parse
3530: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  r */.  char *tok
3540: 65 6e 74 79 70 65 3b 20 20 20 20 20 20 20 20 20  entype;         
3550: 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 72 6d 69  /* Type of termi
3560: 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74  nal symbols in t
3570: 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20  he parser stack 
3580: 2a 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 74 79  */.  char *varty
3590: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pe;           /*
35a0: 20 54 68 65 20 64 65 66 61 75 6c 74 20 74 79 70   The default typ
35b0: 65 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  e of non-termina
35c0: 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63  l symbols */.  c
35d0: 68 61 72 20 2a 73 74 61 72 74 3b 20 20 20 20 20  har *start;     
35e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
35f0: 6f 66 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  of the start sym
3600: 62 6f 6c 20 66 6f 72 20 74 68 65 20 67 72 61 6d  bol for the gram
3610: 6d 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73  mar */.  char *s
3620: 74 61 63 6b 73 69 7a 65 3b 20 20 20 20 20 20 20  tacksize;       
3630: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
3640: 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a 2f   parser stack */
3650: 0a 20 20 63 68 61 72 20 2a 69 6e 63 6c 75 64 65  .  char *include
3660: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
3670: 6f 64 65 20 74 6f 20 70 75 74 20 61 74 20 74 68  ode to put at th
3680: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 43  e start of the C
3690: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
36a0: 2a 65 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  *error;         
36b0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65      /* Code to e
36c0: 78 65 63 75 74 65 20 77 68 65 6e 20 61 6e 20 65  xecute when an e
36d0: 72 72 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a  rror is seen */.
36e0: 20 20 63 68 61 72 20 2a 6f 76 65 72 66 6c 6f 77    char *overflow
36f0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;          /* Co
3700: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e  de to execute on
3710: 20 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f   a stack overflo
3720: 77 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 61 69  w */.  char *fai
3730: 6c 75 72 65 3b 20 20 20 20 20 20 20 20 20 20 20  lure;           
3740: 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75  /* Code to execu
3750: 74 65 20 6f 6e 20 70 61 72 73 65 72 20 66 61 69  te on parser fai
3760: 6c 75 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lure */.  char *
3770: 61 63 63 65 70 74 3b 20 20 20 20 20 20 20 20 20  accept;         
3780: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
3790: 65 63 75 74 65 20 77 68 65 6e 20 74 68 65 20 70  ecute when the p
37a0: 61 72 73 65 72 20 65 78 63 65 70 74 73 20 2a 2f  arser excepts */
37b0: 0a 20 20 63 68 61 72 20 2a 65 78 74 72 61 63 6f  .  char *extraco
37c0: 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  de;         /* C
37d0: 6f 64 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ode appended to 
37e0: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 66 69  the generated fi
37f0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  le */.  char *to
3800: 6b 65 6e 64 65 73 74 3b 20 20 20 20 20 20 20 20  kendest;        
3810: 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63   /* Code to exec
3820: 75 74 65 20 74 6f 20 64 65 73 74 72 6f 79 20 74  ute to destroy t
3830: 6f 6b 65 6e 20 64 61 74 61 20 2a 2f 0a 20 20 63  oken data */.  c
3840: 68 61 72 20 2a 76 61 72 64 65 73 74 3b 20 20 20  har *vardest;   
3850: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
3860: 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20  for the default 
3870: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64 65 73  non-terminal des
3880: 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63 68 61  tructor */.  cha
3890: 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20  r *filename;    
38a0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
38b0: 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
38c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e 61  */.  char *outna
38d0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
38e0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72   Name of the cur
38f0: 72 65 6e 74 20 6f 75 74 70 75 74 20 66 69 6c 65  rent output file
3900: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65   */.  char *toke
3910: 6e 70 72 65 66 69 78 3b 20 20 20 20 20 20 20 2f  nprefix;       /
3920: 2a 20 41 20 70 72 65 66 69 78 20 61 64 64 65 64  * A prefix added
3930: 20 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73 20   to token names 
3940: 69 6e 20 74 68 65 20 2e 68 20 66 69 6c 65 20 2a  in the .h file *
3950: 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69 63  /.  int nconflic
3960: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
3970: 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 73 69 6e  Number of parsin
3980: 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20  g conflicts */. 
3990: 20 69 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b 20   int tablesize; 
39a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
39b0: 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 20 74  e of the parse t
39c0: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62  ables */.  int b
39d0: 61 73 69 73 66 6c 61 67 3b 20 20 20 20 20 20 20  asisflag;       
39e0: 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e 6c      /* Print onl
39f0: 79 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  y basis configur
3a00: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ations */.  int 
3a10: 68 61 73 5f 66 61 6c 6c 62 61 63 6b 3b 20 20 20  has_fallback;   
3a20: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3a30: 61 6e 79 20 25 66 61 6c 6c 62 61 63 6b 20 69 73  any %fallback is
3a40: 20 73 65 65 6e 20 69 6e 20 74 68 65 20 67 72 61   seen in the gra
3a50: 6d 6d 61 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  mmar */.  int no
3a60: 6c 69 6e 65 6e 6f 73 66 6c 61 67 3b 20 20 20 20  linenosflag;    
3a70: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 23 6c     /* True if #l
3a80: 69 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 20 73  ine statements s
3a90: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 72 69  hould not be pri
3aa0: 6e 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  nted */.  char *
3ab0: 61 72 67 76 30 3b 20 20 20 20 20 20 20 20 20 20  argv0;          
3ac0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3ad0: 65 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b 0a  e program */.};.
3ae0: 0a 23 64 65 66 69 6e 65 20 4d 65 6d 6f 72 79 43  .#define MemoryC
3af0: 68 65 63 6b 28 58 29 20 69 66 28 28 58 29 3d 3d  heck(X) if((X)==
3b00: 30 29 7b 20 5c 0a 20 20 65 78 74 65 72 6e 20 76  0){ \.  extern v
3b10: 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72  oid memory_error
3b20: 28 29 3b 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f 65  (); \.  memory_e
3b30: 72 72 6f 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a  rror(); \.}../**
3b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
3b50: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74 61  rom the file "ta
3b60: 62 6c 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ble.h" *********
3b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b80: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
3b90: 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73  All code in this
3ba0: 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61   file has been a
3bb0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
3bc0: 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61  erated.** from a
3bd0: 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69   specification i
3be0: 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  n the file.**   
3bf0: 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c             "tabl
3c00: 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61  e.q".** by the a
3c10: 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
3c20: 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70   code building p
3c30: 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a  rogram "aagen"..
3c40: 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74  ** Do not edit t
3c50: 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65  his file!  Inste
3c60: 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70 65  ad, edit the spe
3c70: 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69  cification.** fi
3c80: 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61  le, then rerun a
3c90: 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43  agen..*/./*.** C
3ca0: 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ode for processi
3cb0: 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ng tables in the
3cc0: 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
3cd0: 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 2f 2a 20 52  nerator..*/./* R
3ce0: 6f 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64  outines for hand
3cf0: 6c 69 6e 67 20 61 20 73 74 72 69 6e 67 73 20 2a  ling a strings *
3d00: 2f 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53  /..const char *S
3d10: 74 72 73 61 66 65 28 63 6f 6e 73 74 20 63 68 61  trsafe(const cha
3d20: 72 20 2a 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73  r *);..void Strs
3d30: 61 66 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a  afe_init(void);.
3d40: 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65  int Strsafe_inse
3d50: 72 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  rt(const char *)
3d60: 3b 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74  ;.const char *St
3d70: 72 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74  rsafe_find(const
3d80: 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 20 52 6f   char *);../* Ro
3d90: 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c  utines for handl
3da0: 69 6e 67 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74  ing symbols of t
3db0: 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73  he grammar */..s
3dc0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
3dd0: 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74 20 63  mbol_new(const c
3de0: 68 61 72 20 2a 29 3b 0a 69 6e 74 20 53 79 6d 62  har *);.int Symb
3df0: 6f 6c 63 6d 70 70 28 63 6f 6e 73 74 20 76 6f 69  olcmpp(const voi
3e00: 64 20 2a 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  d *, const void 
3e10: 2a 29 3b 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f  *);.void Symbol_
3e20: 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20  init(void);.int 
3e30: 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74  Symbol_insert(st
3e40: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2c 20 63  ruct symbol *, c
3e50: 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73 74  onst char *);.st
3e60: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
3e70: 62 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63  bol_find(const c
3e80: 68 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20 73  har *);.struct s
3e90: 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74  ymbol *Symbol_Nt
3ea0: 68 28 69 6e 74 29 3b 0a 69 6e 74 20 53 79 6d 62  h(int);.int Symb
3eb0: 6f 6c 5f 63 6f 75 6e 74 28 76 6f 69 64 29 3b 0a  ol_count(void);.
3ec0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
3ed0: 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 76  Symbol_arrayof(v
3ee0: 6f 69 64 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e  oid);../* Routin
3ef0: 65 73 20 74 6f 20 6d 61 6e 61 67 65 20 74 68 65  es to manage the
3f00: 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a   state table */.
3f10: 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 63  .int Configcmp(c
3f20: 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 63 6f 6e  onst char *, con
3f30: 73 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72 75  st char *);.stru
3f40: 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f  ct state *State_
3f50: 6e 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20  new(void);.void 
3f60: 53 74 61 74 65 5f 69 6e 69 74 28 76 6f 69 64 29  State_init(void)
3f70: 3b 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65  ;.int State_inse
3f80: 72 74 28 73 74 72 75 63 74 20 73 74 61 74 65 20  rt(struct state 
3f90: 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  *, struct config
3fa0: 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74   *);.struct stat
3fb0: 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 73 74  e *State_find(st
3fc0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a  ruct config *);.
3fd0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53  struct state **S
3fe0: 74 61 74 65 5f 61 72 72 61 79 6f 66 28 2f 2a 20  tate_arrayof(/* 
3ff0: 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e   */);../* Routin
4000: 65 73 20 75 73 65 64 20 66 6f 72 20 65 66 66 69  es used for effi
4010: 63 69 65 6e 63 79 20 69 6e 20 43 6f 6e 66 69 67  ciency in Config
4020: 6c 69 73 74 5f 61 64 64 20 2a 2f 0a 0a 76 6f 69  list_add */..voi
4030: 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e  d Configtable_in
4040: 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 43 6f  it(void);.int Co
4050: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74  nfigtable_insert
4060: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
4070: 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  );.struct config
4080: 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69   *Configtable_fi
4090: 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  nd(struct config
40a0: 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67   *);.void Config
40b0: 74 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74 28  table_clear(int(
40c0: 2a 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  *)(struct config
40d0: 20 2a 29 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   *));../********
40e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
40f0: 74 68 65 20 66 69 6c 65 20 22 61 63 74 69 6f 6e  the file "action
4100: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
4110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4120: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ***/./*.** Routi
4130: 6e 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20 70  nes processing p
4140: 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20 69 6e  arser actions in
4150: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
4160: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
4170: 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
4180: 65 77 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e  ew parser action
4190: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
41a0: 74 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e  t action *Action
41b0: 5f 6e 65 77 28 76 6f 69 64 29 7b 0a 20 20 73 74  _new(void){.  st
41c0: 61 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69  atic struct acti
41d0: 6f 6e 20 2a 66 72 65 65 6c 69 73 74 20 3d 20 30  on *freelist = 0
41e0: 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
41f0: 6e 20 2a 6e 65 77 61 63 74 69 6f 6e 3b 0a 0a 20  n *newaction;.. 
4200: 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30   if( freelist==0
4210: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4220: 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30 30     int amt = 100
4230: 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d  ;.    freelist =
4240: 20 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20   (struct action 
4250: 2a 29 63 61 6c 6c 6f 63 28 61 6d 74 2c 20 73 69  *)calloc(amt, si
4260: 7a 65 6f 66 28 73 74 72 75 63 74 20 61 63 74 69  zeof(struct acti
4270: 6f 6e 29 29 3b 0a 20 20 20 20 69 66 28 20 66 72  on));.    if( fr
4280: 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
4290: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
42a0: 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  r,"Unable to all
42b0: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
42c0: 20 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63   a new parser ac
42d0: 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65  tion.");.      e
42e0: 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
42f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74    for(i=0; i<amt
4300: 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69 73  -1; i++) freelis
4310: 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65  t[i].next = &fre
4320: 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20  elist[i+1];.    
4330: 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e  freelist[amt-1].
4340: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  next = 0;.  }.  
4350: 6e 65 77 61 63 74 69 6f 6e 20 3d 20 66 72 65 65  newaction = free
4360: 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74  list;.  freelist
4370: 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78   = freelist->nex
4380: 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 61  t;.  return newa
4390: 63 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  ction;.}../* Com
43a0: 70 61 72 65 20 74 77 6f 20 61 63 74 69 6f 6e 73  pare two actions
43b0: 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72   for sorting pur
43c0: 70 6f 73 65 73 2e 20 20 52 65 74 75 72 6e 20 6e  poses.  Return n
43d0: 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
43e0: 72 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 69 66  r.** positive if
43f0: 20 74 68 65 20 66 69 72 73 74 20 61 63 74 69 6f   the first actio
4400: 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  n is less than, 
4410: 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
4420: 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  ater than.** the
4430: 20 66 69 72 73 74 0a 2a 2f 0a 73 74 61 74 69 63   first.*/.static
4440: 20 69 6e 74 20 61 63 74 69 6f 6e 63 6d 70 28 0a   int actioncmp(.
4450: 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
4460: 2a 61 70 31 2c 0a 20 20 73 74 72 75 63 74 20 61  *ap1,.  struct a
4470: 63 74 69 6f 6e 20 2a 61 70 32 0a 29 7b 0a 20 20  ction *ap2.){.  
4480: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 61  int rc;.  rc = a
4490: 70 31 2d 3e 73 70 2d 3e 69 6e 64 65 78 20 2d 20  p1->sp->index - 
44a0: 61 70 32 2d 3e 73 70 2d 3e 69 6e 64 65 78 3b 0a  ap2->sp->index;.
44b0: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
44c0: 20 20 20 72 63 20 3d 20 28 69 6e 74 29 61 70 31     rc = (int)ap1
44d0: 2d 3e 74 79 70 65 20 2d 20 28 69 6e 74 29 61 70  ->type - (int)ap
44e0: 32 2d 3e 74 79 70 65 3b 0a 20 20 7d 0a 20 20 69  2->type;.  }.  i
44f0: 66 28 20 72 63 3d 3d 30 20 26 26 20 61 70 31 2d  f( rc==0 && ap1-
4500: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b  >type==REDUCE ){
4510: 0a 20 20 20 20 72 63 20 3d 20 61 70 31 2d 3e 78  .    rc = ap1->x
4520: 2e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32  .rp->index - ap2
4530: 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20  ->x.rp->index;. 
4540: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29   }.  if( rc==0 )
4550: 7b 0a 20 20 20 20 72 63 20 3d 20 28 69 6e 74 29  {.    rc = (int)
4560: 20 28 61 70 32 20 2d 20 61 70 31 29 3b 0a 20 20   (ap2 - ap1);.  
4570: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4580: 0a 0a 2f 2a 20 53 6f 72 74 20 70 61 72 73 65 72  ../* Sort parser
4590: 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74   actions */.stat
45a0: 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  ic struct action
45b0: 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 0a 20   *Action_sort(. 
45c0: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
45d0: 61 70 0a 29 7b 0a 20 20 61 70 20 3d 20 28 73 74  ap.){.  ap = (st
45e0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 6d 73  ruct action *)ms
45f0: 6f 72 74 28 28 63 68 61 72 20 2a 29 61 70 2c 28  ort((char *)ap,(
4600: 63 68 61 72 20 2a 2a 29 26 61 70 2d 3e 6e 65 78  char **)&ap->nex
4610: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63   (int(*)(const c
4640: 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  har*,const char*
4650: 29 29 61 63 74 69 6f 6e 63 6d 70 29 3b 0a 20 20  ))actioncmp);.  
4660: 72 65 74 75 72 6e 20 61 70 3b 0a 7d 0a 0a 76 6f  return ap;.}..vo
4670: 69 64 20 41 63 74 69 6f 6e 5f 61 64 64 28 0a 20  id Action_add(. 
4680: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
4690: 2a 61 70 70 2c 0a 20 20 65 6e 75 6d 20 65 5f 61  *app,.  enum e_a
46a0: 63 74 69 6f 6e 20 74 79 70 65 2c 0a 20 20 73 74  ction type,.  st
46b0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c  ruct symbol *sp,
46c0: 0a 20 20 63 68 61 72 20 2a 61 72 67 0a 29 7b 0a  .  char *arg.){.
46d0: 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
46e0: 2a 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e 65  *newaction;.  ne
46f0: 77 61 63 74 69 6f 6e 20 3d 20 41 63 74 69 6f 6e  waction = Action
4700: 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 61 63 74  _new();.  newact
4710: 69 6f 6e 2d 3e 6e 65 78 74 20 3d 20 2a 61 70 70  ion->next = *app
4720: 3b 0a 20 20 2a 61 70 70 20 3d 20 6e 65 77 61 63  ;.  *app = newac
4730: 74 69 6f 6e 3b 0a 20 20 6e 65 77 61 63 74 69 6f  tion;.  newactio
4740: 6e 2d 3e 74 79 70 65 20 3d 20 74 79 70 65 3b 0a  n->type = type;.
4750: 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 73 70 20    newaction->sp 
4760: 3d 20 73 70 3b 0a 20 20 69 66 28 20 74 79 70 65  = sp;.  if( type
4770: 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 6e  ==SHIFT ){.    n
4780: 65 77 61 63 74 69 6f 6e 2d 3e 78 2e 73 74 70 20  ewaction->x.stp 
4790: 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20  = (struct state 
47a0: 2a 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a  *)arg;.  }else{.
47b0: 20 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78      newaction->x
47c0: 2e 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75  .rp = (struct ru
47d0: 6c 65 20 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d 0a  le *)arg;.  }.}.
47e0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
47f0: 2a 2a 2a 2a 2a 2a 2a 20 4e 65 77 20 63 6f 64 65  ******* New code
4800: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
4810: 65 20 22 61 63 74 74 61 62 22 20 6d 6f 64 75 6c  e "acttab" modul
4820: 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  e ***********/./
4830: 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65  *.** This module
4840: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 6f 75 74   implements rout
4850: 69 6e 65 73 20 75 73 65 20 74 6f 20 63 6f 6e 73  ines use to cons
4860: 74 72 75 63 74 20 74 68 65 20 79 79 5f 61 63 74  truct the yy_act
4870: 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a  ion[] table..*/.
4880: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65  ./*.** The state
4890: 20 6f 66 20 74 68 65 20 79 79 5f 61 63 74 69 6f   of the yy_actio
48a0: 6e 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  n table under co
48b0: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6e  nstruction is an
48c0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20   instance of.** 
48d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
48e0: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54  ructure..**.** T
48f0: 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62  he yy_action tab
4900: 6c 65 20 6d 61 70 73 20 74 68 65 20 70 61 69 72  le maps the pair
4910: 20 28 73 74 61 74 65 5f 6e 75 6d 62 65 72 2c 20   (state_number, 
4920: 6c 6f 6f 6b 61 68 65 61 64 29 20 69 6e 74 6f 20  lookahead) into 
4930: 61 6e 0a 2a 2a 20 61 63 74 69 6f 6e 5f 6e 75 6d  an.** action_num
4940: 62 65 72 2e 20 20 54 68 65 20 74 61 62 6c 65 20  ber.  The table 
4950: 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69  is an array of i
4960: 6e 74 65 67 65 72 73 20 70 61 69 72 73 2e 20 20  ntegers pairs.  
4970: 54 68 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72  The state_number
4980: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 61  .** determines a
4990: 6e 20 69 6e 69 74 69 61 6c 20 6f 66 66 73 65 74  n initial offset
49a0: 20 69 6e 74 6f 20 74 68 65 20 79 79 5f 61 63 74   into the yy_act
49b0: 69 6f 6e 20 61 72 72 61 79 2e 20 20 54 68 65 20  ion array.  The 
49c0: 6c 6f 6f 6b 61 68 65 61 64 0a 2a 2a 20 76 61 6c  lookahead.** val
49d0: 75 65 20 69 73 20 74 68 65 6e 20 61 64 64 65 64  ue is then added
49e0: 20 74 6f 20 74 68 69 73 20 69 6e 69 74 69 61 6c   to this initial
49f0: 20 6f 66 66 73 65 74 20 74 6f 20 67 65 74 20 61   offset to get a
4a00: 6e 20 69 6e 64 65 78 20 58 20 69 6e 74 6f 20 74  n index X into t
4a10: 68 65 0a 2a 2a 20 79 79 5f 61 63 74 69 6f 6e 20  he.** yy_action 
4a20: 61 72 72 61 79 2e 20 49 66 20 74 68 65 20 61 41  array. If the aA
4a30: 63 74 69 6f 6e 5b 58 5d 2e 6c 6f 6f 6b 61 68 65  ction[X].lookahe
4a40: 61 64 20 65 71 75 61 6c 73 20 74 68 65 20 76 61  ad equals the va
4a50: 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 66  lue of the.** of
4a60: 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69   the lookahead i
4a70: 6e 70 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76  nput, then the v
4a80: 61 6c 75 65 20 6f 66 20 74 68 65 20 61 63 74 69  alue of the acti
4a90: 6f 6e 5f 6e 75 6d 62 65 72 20 6f 75 74 70 75 74  on_number output
4aa0: 20 69 73 0a 2a 2a 20 61 41 63 74 69 6f 6e 5b 58   is.** aAction[X
4ab0: 5d 2e 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  ].action.  If th
4ac0: 65 20 6c 6f 6f 6b 61 68 65 61 64 73 20 64 6f 20  e lookaheads do 
4ad0: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 6e 20 74  not match then t
4ae0: 68 65 0a 2a 2a 20 64 65 66 61 75 6c 74 20 61 63  he.** default ac
4af0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 73 74 61  tion for the sta
4b00: 74 65 5f 6e 75 6d 62 65 72 20 69 73 20 72 65 74  te_number is ret
4b10: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  urned..**.** All
4b20: 20 61 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61   actions associa
4b30: 74 65 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c  ted with a singl
4b40: 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 61  e state_number a
4b50: 72 65 20 66 69 72 73 74 20 65 6e 74 65 72 65 64  re first entered
4b60: 0a 2a 2a 20 69 6e 74 6f 20 61 4c 6f 6f 6b 61 68  .** into aLookah
4b70: 65 61 64 5b 5d 20 75 73 69 6e 67 20 6d 75 6c 74  ead[] using mult
4b80: 69 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20 61 63  iple calls to ac
4b90: 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 2e 20 20  ttab_action().  
4ba0: 54 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 63 74  Then the .** act
4bb0: 69 6f 6e 73 20 66 6f 72 20 74 68 61 74 20 73 69  ions for that si
4bc0: 6e 67 6c 65 20 73 74 61 74 65 5f 6e 75 6d 62 65  ngle state_numbe
4bd0: 72 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 74  r are placed int
4be0: 6f 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20  o the aAction[] 
4bf0: 0a 2a 2a 20 61 72 72 61 79 20 77 69 74 68 20 61  .** array with a
4c00: 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20   single call to 
4c10: 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 29 2e  acttab_insert().
4c20: 20 20 54 68 65 20 61 63 74 74 61 62 5f 69 6e 73    The acttab_ins
4c30: 65 72 74 28 29 20 63 61 6c 6c 0a 2a 2a 20 61 6c  ert() call.** al
4c40: 73 6f 20 72 65 73 65 74 73 20 74 68 65 20 61 4c  so resets the aL
4c50: 6f 6f 6b 61 68 65 61 64 5b 5d 20 61 72 72 61 79  ookahead[] array
4c60: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20   in preparation 
4c70: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20  for the next.** 
4c80: 73 74 61 74 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f  state number..*/
4c90: 0a 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61  .struct lookahea
4ca0: 64 5f 61 63 74 69 6f 6e 20 7b 0a 20 20 69 6e 74  d_action {.  int
4cb0: 20 6c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20   lookahead;     
4cc0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
4cd0: 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   of the lookahea
4ce0: 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74  d token */.  int
4cf0: 20 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20   action;        
4d00: 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f          /* Actio
4d10: 6e 20 74 6f 20 74 61 6b 65 20 6f 6e 20 74 68 65  n to take on the
4d20: 20 67 69 76 65 6e 20 6c 6f 6f 6b 61 68 65 61 64   given lookahead
4d30: 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73   */.};.typedef s
4d40: 74 72 75 63 74 20 61 63 74 74 61 62 20 61 63 74  truct acttab act
4d50: 74 61 62 3b 0a 73 74 72 75 63 74 20 61 63 74 74  tab;.struct actt
4d60: 61 62 20 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69  ab {.  int nActi
4d70: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
4d80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4d90: 20 75 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61   used slots in a
4da0: 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e  Action[] */.  in
4db0: 74 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20  t nActionAlloc; 
4dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c             /* Sl
4dd0: 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ots allocated fo
4de0: 72 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20  r aAction[] */. 
4df0: 20 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61   struct lookahea
4e00: 64 5f 61 63 74 69 6f 6e 0a 20 20 20 20 2a 61 41  d_action.    *aA
4e10: 63 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  ction,          
4e20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 79          /* The y
4e30: 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65  y_action[] table
4e40: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
4e50: 69 6f 6e 20 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f  ion */.    *aLoo
4e60: 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20  kahead;         
4e70: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
4e80: 65 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  e new transactio
4e90: 6e 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6d  n set */.  int m
4ea0: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20  nLookahead;     
4eb0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d          /* Minim
4ec0: 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e  um aLookahead[].
4ed0: 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69  lookahead */.  i
4ee0: 6e 74 20 6d 6e 41 63 74 69 6f 6e 3b 20 20 20 20  nt mnAction;    
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4f00: 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ction associated
4f10: 20 77 69 74 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61   with mnLookahea
4f20: 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f  d */.  int mxLoo
4f30: 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20  kahead;         
4f40: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
4f50: 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b  Lookahead[].look
4f60: 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ahead */.  int n
4f70: 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  Lookahead;      
4f80: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
4f90: 73 6c 6f 74 73 20 69 6e 20 61 4c 6f 6f 6b 61 68  slots in aLookah
4fa0: 65 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ead[] */.  int n
4fb0: 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 3b 20  LookaheadAlloc; 
4fc0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73          /* Slots
4fd0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c   allocated in aL
4fe0: 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 7d 3b  ookahead[] */.};
4ff0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ../* Return the 
5000: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
5010: 73 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69  s in the yy_acti
5020: 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66  on table */.#def
5030: 69 6e 65 20 61 63 74 74 61 62 5f 73 69 7a 65 28  ine acttab_size(
5040: 58 29 20 28 28 58 29 2d 3e 6e 41 63 74 69 6f 6e  X) ((X)->nAction
5050: 29 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75 65 20  )../* The value 
5060: 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 65 6e 74  for the N-th ent
5070: 72 79 20 69 6e 20 79 79 5f 61 63 74 69 6f 6e 20  ry in yy_action 
5080: 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61  */.#define actta
5090: 62 5f 79 79 61 63 74 69 6f 6e 28 58 2c 4e 29 20  b_yyaction(X,N) 
50a0: 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e   ((X)->aAction[N
50b0: 5d 2e 61 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68  ].action)../* Th
50c0: 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  e value for the 
50d0: 4e 2d 74 68 20 65 6e 74 72 79 20 69 6e 20 79 79  N-th entry in yy
50e0: 5f 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 23 64  _lookahead */.#d
50f0: 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79 79 6c  efine acttab_yyl
5100: 6f 6f 6b 61 68 65 61 64 28 58 2c 4e 29 20 20 28  ookahead(X,N)  (
5110: 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e  (X)->aAction[N].
5120: 6c 6f 6f 6b 61 68 65 61 64 29 0a 0a 2f 2a 20 46  lookahead)../* F
5130: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
5140: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
5150: 68 65 20 67 69 76 65 6e 20 61 63 74 74 61 62 20  he given acttab 
5160: 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 66  */.void acttab_f
5170: 72 65 65 28 61 63 74 74 61 62 20 2a 70 29 7b 0a  ree(acttab *p){.
5180: 20 20 66 72 65 65 28 20 70 2d 3e 61 41 63 74 69    free( p->aActi
5190: 6f 6e 20 29 3b 0a 20 20 66 72 65 65 28 20 70 2d  on );.  free( p-
51a0: 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 29 3b 0a 20  >aLookahead );. 
51b0: 20 66 72 65 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f   free( p );.}../
51c0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
51d0: 20 61 63 74 74 61 62 20 73 74 72 75 63 74 75 72   acttab structur
51e0: 65 20 2a 2f 0a 61 63 74 74 61 62 20 2a 61 63 74  e */.acttab *act
51f0: 74 61 62 5f 61 6c 6c 6f 63 28 76 6f 69 64 29 7b  tab_alloc(void){
5200: 0a 20 20 61 63 74 74 61 62 20 2a 70 20 3d 20 28  .  acttab *p = (
5210: 61 63 74 74 61 62 20 2a 29 20 63 61 6c 6c 6f 63  acttab *) calloc
5220: 28 20 31 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20  ( 1, sizeof(*p) 
5230: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
5240: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
5250: 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61  err,"Unable to a
5260: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
5270: 6f 72 20 61 20 6e 65 77 20 61 63 74 74 61 62 2e  or a new acttab.
5280: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
5290: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c  .  }.  memset(p,
52a0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
52b0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
52c0: 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 61 63 74  /* Add a new act
52d0: 69 6f 6e 20 74 6f 20 74 68 65 20 63 75 72 72 65  ion to the curre
52e0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
52f0: 65 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  et.  .**.** This
5300: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5310: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
5320: 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 61   lookahead for a
5330: 20 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a 20 73   particular.** s
5340: 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 61 63  tate..*/.void ac
5350: 74 74 61 62 5f 61 63 74 69 6f 6e 28 61 63 74 74  ttab_action(actt
5360: 61 62 20 2a 70 2c 20 69 6e 74 20 6c 6f 6f 6b 61  ab *p, int looka
5370: 68 65 61 64 2c 20 69 6e 74 20 61 63 74 69 6f 6e  head, int action
5380: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f  ){.  if( p->nLoo
5390: 6b 61 68 65 61 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b  kahead>=p->nLook
53a0: 61 68 65 61 64 41 6c 6c 6f 63 20 29 7b 0a 20 20  aheadAlloc ){.  
53b0: 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41    p->nLookaheadA
53c0: 6c 6c 6f 63 20 2b 3d 20 32 35 3b 0a 20 20 20 20  lloc += 25;.    
53d0: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 3d 20  p->aLookahead = 
53e0: 28 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61  (struct lookahea
53f0: 64 5f 61 63 74 69 6f 6e 20 2a 29 20 72 65 61 6c  d_action *) real
5400: 6c 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65  loc( p->aLookahe
5410: 61 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ad,.            
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5430: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b   sizeof(p->aLook
5440: 61 68 65 61 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f  ahead[0])*p->nLo
5450: 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29 3b 0a  okaheadAlloc );.
5460: 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b      if( p->aLook
5470: 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ahead==0 ){.    
5480: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
5490: 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c  ,"malloc failed\
54a0: 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  n");.      exit(
54b0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
54c0: 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  if( p->nLookahea
54d0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6d  d==0 ){.    p->m
54e0: 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f  xLookahead = loo
54f0: 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d  kahead;.    p->m
5500: 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f  nLookahead = loo
5510: 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d  kahead;.    p->m
5520: 6e 41 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e  nAction = action
5530: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
5540: 66 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61  f( p->mxLookahea
5550: 64 3c 6c 6f 6f 6b 61 68 65 61 64 20 29 20 70 2d  d<lookahead ) p-
5560: 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  >mxLookahead = l
5570: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 69 66  ookahead;.    if
5580: 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  ( p->mnLookahead
5590: 3e 6c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20  >lookahead ){.  
55a0: 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65      p->mnLookahe
55b0: 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a  ad = lookahead;.
55c0: 20 20 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f        p->mnActio
55d0: 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20  n = action;.    
55e0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b  }.  }.  p->aLook
55f0: 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68  ahead[p->nLookah
5600: 65 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d  ead].lookahead =
5610: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 70 2d   lookahead;.  p-
5620: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e  >aLookahead[p->n
5630: 4c 6f 6f 6b 61 68 65 61 64 5d 2e 61 63 74 69 6f  Lookahead].actio
5640: 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 70 2d  n = action;.  p-
5650: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d  >nLookahead++;.}
5660: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20  ../*.** Add the 
5670: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20  transaction set 
5680: 62 75 69 6c 74 20 75 70 20 77 69 74 68 20 70 72  built up with pr
5690: 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 61 63 74  ior calls to act
56a0: 74 61 62 5f 61 63 74 69 6f 6e 28 29 0a 2a 2a 20  tab_action().** 
56b0: 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
56c0: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20   action table.  
56d0: 54 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 74  Then reset the t
56e0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62  ransaction set b
56f0: 61 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20 65 6d 70  ack.** to an emp
5700: 74 79 20 73 65 74 20 69 6e 20 70 72 65 70 61 72  ty set in prepar
5710: 61 74 69 6f 6e 20 66 6f 72 20 61 20 6e 65 77 20  ation for a new 
5720: 72 6f 75 6e 64 20 6f 66 20 61 63 74 74 61 62 5f  round of acttab_
5730: 61 63 74 69 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a  action() calls..
5740: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
5750: 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65   offset into the
5760: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66   action table of
5770: 20 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61 63   the new transac
5780: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74  tion..*/.int act
5790: 74 61 62 5f 69 6e 73 65 72 74 28 61 63 74 74 61  tab_insert(actta
57a0: 62 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  b *p){.  int i, 
57b0: 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73 73 65 72  j, k, n;.  asser
57c0: 74 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  t( p->nLookahead
57d0: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  >0 );..  /* Make
57e0: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 65 6e   sure we have en
57f0: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 68 6f  ough space to ho
5800: 6c 64 20 74 68 65 20 65 78 70 61 6e 64 65 64 20  ld the expanded 
5810: 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a  action table.  *
5820: 2a 20 69 6e 20 74 68 65 20 77 6f 72 73 74 20 63  * in the worst c
5830: 61 73 65 2e 20 20 54 68 65 20 77 6f 72 73 74 20  ase.  The worst 
5840: 63 61 73 65 20 6f 63 63 75 72 73 20 69 66 20 74  case occurs if t
5850: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
5860: 65 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  et.  ** must be 
5870: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
5880: 63 75 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74  current action t
5890: 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20  able.  */.  n = 
58a0: 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 2b  p->mxLookahead +
58b0: 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41 63   1;.  if( p->nAc
58c0: 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d 3e 6e  tion + n >= p->n
58d0: 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ActionAlloc ){. 
58e0: 20 20 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f 63 20     int oldAlloc 
58f0: 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  = p->nActionAllo
5900: 63 3b 0a 20 20 20 20 70 2d 3e 6e 41 63 74 69 6f  c;.    p->nActio
5910: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74  nAlloc = p->nAct
5920: 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63  ion + n + p->nAc
5930: 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a  tionAlloc + 20;.
5940: 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 20 3d      p->aAction =
5950: 20 28 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65   (struct lookahe
5960: 61 64 5f 61 63 74 69 6f 6e 20 2a 29 20 72 65 61  ad_action *) rea
5970: 6c 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69 6f 6e  lloc( p->aAction
5980: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5990: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
59a0: 6f 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d  of(p->aAction[0]
59b0: 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  )*p->nActionAllo
59c0: 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  c);.    if( p->a
59d0: 41 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  Action==0 ){.   
59e0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
59f0: 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  r,"malloc failed
5a00: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74  \n");.      exit
5a10: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  (1);.    }.    f
5a20: 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b 20 69  or(i=oldAlloc; i
5a30: 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63  <p->nActionAlloc
5a40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; i++){.      p-
5a50: 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b  >aAction[i].look
5a60: 61 68 65 61 64 20 3d 20 2d 31 3b 0a 20 20 20 20  ahead = -1;.    
5a70: 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e    p->aAction[i].
5a80: 61 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a 20 20 20  action = -1;.   
5a90: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61   }.  }..  /* Sca
5aa0: 6e 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 61  n the existing a
5ab0: 63 74 69 6f 6e 20 74 61 62 6c 65 20 6c 6f 6f 6b  ction table look
5ac0: 69 6e 67 20 66 6f 72 20 61 6e 20 6f 66 66 73 65  ing for an offse
5ad0: 74 20 74 68 61 74 20 69 73 20 61 20 0a 20 20 2a  t that is a .  *
5ae0: 2a 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74  * duplicate of t
5af0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
5b00: 61 63 74 69 6f 6e 20 73 65 74 2e 20 20 46 61 6c  action set.  Fal
5b10: 6c 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  l out of the loo
5b20: 70 0a 20 20 2a 2a 20 69 66 20 61 6e 64 20 77 68  p.  ** if and wh
5b30: 65 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65  en the duplicate
5b40: 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a   is found..  **.
5b50: 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
5b60: 64 65 78 20 69 6e 20 70 2d 3e 61 41 63 74 69 6f  dex in p->aActio
5b70: 6e 5b 5d 20 77 68 65 72 65 20 70 2d 3e 6d 6e 4c  n[] where p->mnL
5b80: 6f 6f 6b 61 68 65 61 64 20 69 73 20 69 6e 73 65  ookahead is inse
5b90: 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  rted..  */.  for
5ba0: 28 69 3d 70 2d 3e 6e 41 63 74 69 6f 6e 2d 31 3b  (i=p->nAction-1;
5bb0: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
5bc0: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
5bd0: 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d  i].lookahead==p-
5be0: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a  >mnLookahead ){.
5bf0: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6c 6f 6f        /* All loo
5c00: 6b 61 68 65 61 64 73 20 61 6e 64 20 61 63 74 69  kaheads and acti
5c10: 6f 6e 73 20 69 6e 20 74 68 65 20 61 4c 6f 6f 6b  ons in the aLook
5c20: 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74  ahead[] transact
5c30: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73  ion.      ** mus
5c40: 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20  t match against 
5c50: 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 61 41  the candidate aA
5c60: 63 74 69 6f 6e 5b 69 5d 20 65 6e 74 72 79 2e 20  ction[i] entry. 
5c70: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  */.      if( p->
5c80: 61 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f  aAction[i].actio
5c90: 6e 21 3d 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 29  n!=p->mnAction )
5ca0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
5cb0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
5cc0: 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29 7b  Lookahead; j++){
5cd0: 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e  .        k = p->
5ce0: 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f  aLookahead[j].lo
5cf0: 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c  okahead - p->mnL
5d00: 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20  ookahead + i;.  
5d10: 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20 7c 7c        if( k<0 ||
5d20: 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29   k>=p->nAction )
5d30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5d40: 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  if( p->aLookahea
5d50: 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 21 3d  d[j].lookahead!=
5d60: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f  p->aAction[k].lo
5d70: 6f 6b 61 68 65 61 64 20 29 20 62 72 65 61 6b 3b  okahead ) break;
5d80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
5d90: 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 61 63  aLookahead[j].ac
5da0: 74 69 6f 6e 21 3d 70 2d 3e 61 41 63 74 69 6f 6e  tion!=p->aAction
5db0: 5b 6b 5d 2e 61 63 74 69 6f 6e 20 29 20 62 72 65  [k].action ) bre
5dc0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5dd0: 20 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b    if( j<p->nLook
5de0: 61 68 65 61 64 20 29 20 63 6f 6e 74 69 6e 75 65  ahead ) continue
5df0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 70  ;..      /* No p
5e00: 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 61 68 65 61  ossible lookahea
5e10: 64 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 20  d value that is 
5e20: 6e 6f 74 20 69 6e 20 74 68 65 20 61 4c 6f 6f 6b  not in the aLook
5e30: 61 68 65 61 64 5b 5d 0a 20 20 20 20 20 20 2a 2a  ahead[].      **
5e40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5e50: 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68  allowed to match
5e60: 20 61 41 63 74 69 6f 6e 5b 69 5d 20 2a 2f 0a 20   aAction[i] */. 
5e70: 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20       n = 0;.    
5e80: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
5e90: 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20  nAction; j++){. 
5ea0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41         if( p->aA
5eb0: 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65  ction[j].lookahe
5ec0: 61 64 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ad<0 ) continue;
5ed0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
5ee0: 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61  aAction[j].looka
5ef0: 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f  head==j+p->mnLoo
5f00: 6b 61 68 65 61 64 2d 69 20 29 20 6e 2b 2b 3b 0a  kahead-i ) n++;.
5f10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
5f20: 28 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  ( n==p->nLookahe
5f30: 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ad ){.        br
5f40: 65 61 6b 3b 20 20 2f 2a 20 41 6e 20 65 78 61 63  eak;  /* An exac
5f50: 74 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  t match is found
5f60: 20 61 74 20 6f 66 66 73 65 74 20 69 20 2a 2f 0a   at offset i */.
5f70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5f80: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 78  }..  /* If no ex
5f90: 69 73 74 69 6e 67 20 6f 66 66 73 65 74 73 20 65  isting offsets e
5fa0: 78 61 63 74 6c 79 20 6d 61 74 63 68 20 74 68 65  xactly match the
5fb0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
5fc0: 74 69 6f 6e 2c 20 66 69 6e 64 20 61 6e 0a 20 20  tion, find an.  
5fd0: 2a 2a 20 61 6e 20 65 6d 70 74 79 20 6f 66 66 73  ** an empty offs
5fe0: 65 74 20 69 6e 20 74 68 65 20 61 41 63 74 69 6f  et in the aActio
5ff0: 6e 5b 5d 20 74 61 62 6c 65 20 69 6e 20 77 68 69  n[] table in whi
6000: 63 68 20 77 65 20 63 61 6e 20 61 64 64 20 74 68  ch we can add th
6010: 65 0a 20 20 2a 2a 20 61 4c 6f 6f 6b 61 68 65 61  e.  ** aLookahea
6020: 64 5b 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  d[] transaction.
6030: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 3c 30 20  .  */.  if( i<0 
6040: 29 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66  ){.    /* Look f
6050: 6f 72 20 68 6f 6c 65 73 20 69 6e 20 74 68 65 20  or holes in the 
6060: 61 41 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20  aAction[] table 
6070: 74 68 61 74 20 66 69 74 20 74 68 65 20 63 75 72  that fit the cur
6080: 72 65 6e 74 0a 20 20 20 20 2a 2a 20 61 4c 6f 6f  rent.    ** aLoo
6090: 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63  kahead[] transac
60a0: 74 69 6f 6e 2e 20 20 4c 65 61 76 65 20 69 20 73  tion.  Leave i s
60b0: 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  et to the offset
60c0: 20 6f 66 20 74 68 65 20 68 6f 6c 65 2e 0a 20 20   of the hole..  
60d0: 20 20 2a 2a 20 49 66 20 6e 6f 20 68 6f 6c 65 73    ** If no holes
60e0: 20 61 72 65 20 66 6f 75 6e 64 2c 20 69 20 69 73   are found, i is
60f0: 20 6c 65 66 74 20 61 74 20 70 2d 3e 6e 41 63 74   left at p->nAct
6100: 69 6f 6e 2c 20 77 68 69 63 68 20 6d 65 61 6e 73  ion, which means
6110: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
6120: 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
6130: 61 70 70 65 6e 64 65 64 2e 20 2a 2f 0a 20 20 20  appended. */.   
6140: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
6150: 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2d 20 70 2d  ActionAlloc - p-
6160: 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 69 2b  >mxLookahead; i+
6170: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
6180: 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b  >aAction[i].look
6190: 61 68 65 61 64 3c 30 20 29 7b 0a 20 20 20 20 20  ahead<0 ){.     
61a0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
61b0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b  >nLookahead; j++
61c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d  ){.          k =
61d0: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a   p->aLookahead[j
61e0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d  ].lookahead - p-
61f0: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69  >mnLookahead + i
6200: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
6210: 6b 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  k<0 ) break;.   
6220: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41         if( p->aA
6230: 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65  ction[k].lookahe
6240: 61 64 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ad>=0 ) break;. 
6250: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6260: 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61   if( j<p->nLooka
6270: 68 65 61 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  head ) continue;
6280: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
6290: 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20  ; j<p->nAction; 
62a0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
62b0: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a  if( p->aAction[j
62c0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70  ].lookahead==j+p
62d0: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69 20  ->mnLookahead-i 
62e0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
62f0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
6300: 3d 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 7b 0a  ==p->nAction ){.
6310: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6320: 20 20 2f 2a 20 46 69 74 73 20 69 6e 20 65 6d 70    /* Fits in emp
6330: 74 79 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 20 20  ty slots */.    
6340: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6350: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73    }.  }.  /* Ins
6360: 65 72 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ert transaction 
6370: 73 65 74 20 61 74 20 69 6e 64 65 78 20 69 2e 20  set at index i. 
6380: 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  */.  for(j=0; j<
6390: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a  p->nLookahead; j
63a0: 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d 20 70 2d 3e  ++){.    k = p->
63b0: 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f  aLookahead[j].lo
63c0: 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c  okahead - p->mnL
63d0: 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20  ookahead + i;.  
63e0: 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 20    p->aAction[k] 
63f0: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
6400: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70  j];.    if( k>=p
6410: 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 70 2d 3e 6e  ->nAction ) p->n
6420: 41 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a 20 20  Action = k+1;.  
6430: 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  }.  p->nLookahea
6440: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74  d = 0;..  /* Ret
6450: 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 74  urn the offset t
6460: 68 61 74 20 69 73 20 61 64 64 65 64 20 74 6f 20  hat is added to 
6470: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e  the lookahead in
6480: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
6490: 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74  e.  ** index int
64a0: 6f 20 79 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74  o yy_action of t
64b0: 68 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72  he action */.  r
64c0: 65 74 75 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c  eturn i - p->mnL
64d0: 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 2a  ookahead;.}../**
64e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64f0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
6500: 6c 65 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a 2a  le "build.c" ***
6510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
6530: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 63 6f  * Routines to co
6540: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66  nstruction the f
6550: 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68  inite state mach
6560: 69 6e 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f  ine for the LEMO
6570: 4e 0a 2a 2a 20 70 61 72 73 65 72 20 67 65 6e 65  N.** parser gene
6580: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69  rator..*/../* Fi
6590: 6e 64 20 61 20 70 72 65 63 65 64 65 6e 63 65 20  nd a precedence 
65a0: 73 79 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79 20  symbol of every 
65b0: 72 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d  rule in the gram
65c0: 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f 73  mar..** .** Thos
65d0: 65 20 72 75 6c 65 73 20 77 68 69 63 68 20 68 61  e rules which ha
65e0: 76 65 20 61 20 70 72 65 63 65 64 65 6e 63 65 20  ve a precedence 
65f0: 73 79 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e 20  symbol coded in 
6600: 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72 61  the input.** gra
6610: 6d 6d 61 72 20 75 73 69 6e 67 20 74 68 65 20 22  mmar using the "
6620: 5b 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74 72  [symbol]" constr
6630: 75 63 74 20 77 69 6c 6c 20 61 6c 72 65 61 64 79  uct will already
6640: 20 68 61 76 65 20 74 68 65 0a 2a 2a 20 72 70 2d   have the.** rp-
6650: 3e 70 72 65 63 73 79 6d 20 66 69 65 6c 64 20 66  >precsym field f
6660: 69 6c 6c 65 64 2e 20 20 4f 74 68 65 72 20 72 75  illed.  Other ru
6670: 6c 65 73 20 74 61 6b 65 20 61 73 20 74 68 65 69  les take as thei
6680: 72 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20  r precedence.** 
6690: 73 79 6d 62 6f 6c 20 74 68 65 20 66 69 72 73 74  symbol the first
66a0: 20 52 48 53 20 73 79 6d 62 6f 6c 20 77 69 74 68   RHS symbol with
66b0: 20 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65   a defined prece
66c0: 64 65 6e 63 65 2e 20 20 49 66 20 74 68 65 72 65  dence.  If there
66d0: 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 52 48 53 20  .** are not RHS 
66e0: 73 79 6d 62 6f 6c 73 20 77 69 74 68 20 61 20 64  symbols with a d
66f0: 65 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63  efined precedenc
6700: 65 2c 20 74 68 65 20 70 72 65 63 65 64 65 6e 63  e, the precedenc
6710: 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65 6c  e.** symbol fiel
6720: 64 20 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b 2e  d is left blank.
6730: 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c  .*/.void FindRul
6740: 65 50 72 65 63 65 64 65 6e 63 65 73 28 73 74 72  ePrecedences(str
6750: 75 63 74 20 6c 65 6d 6f 6e 20 2a 78 70 29 0a 7b  uct lemon *xp).{
6760: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
6770: 72 70 3b 0a 20 20 66 6f 72 28 72 70 3d 78 70 2d  rp;.  for(rp=xp-
6780: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
6790: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  ->next){.    if(
67a0: 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30 20   rp->precsym==0 
67b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20  ){.      int i, 
67c0: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  j;.      for(i=0
67d0: 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 20 26 26 20  ; i<rp->nrhs && 
67e0: 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30 3b 20  rp->precsym==0; 
67f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74  i++){.        st
6800: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
6810: 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20  = rp->rhs[i];.  
6820: 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79        if( sp->ty
6830: 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
6840: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  L ){.          f
6850: 6f 72 28 6a 3d 30 3b 20 6a 3c 73 70 2d 3e 6e 73  or(j=0; j<sp->ns
6860: 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ubsym; j++){.   
6870: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d           if( sp-
6880: 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 70 72 65 63  >subsym[j]->prec
6890: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
68a0: 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d       rp->precsym
68b0: 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d   = sp->subsym[j]
68c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
68d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
68e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
68f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
6900: 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29  f( sp->prec>=0 )
6910: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  {.          rp->
6920: 70 72 65 63 73 79 6d 20 3d 20 72 70 2d 3e 72 68  precsym = rp->rh
6930: 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  s[i];.        }.
6940: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6950: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
6960: 2a 20 46 69 6e 64 20 61 6c 6c 20 6e 6f 6e 74 65  * Find all nonte
6970: 72 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 77 69  rminals which wi
6980: 6c 6c 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  ll generate the 
6990: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a  empty string..**
69a0: 20 54 68 65 6e 20 67 6f 20 62 61 63 6b 20 61 6e   Then go back an
69b0: 64 20 63 6f 6d 70 75 74 65 20 74 68 65 20 66 69  d compute the fi
69c0: 72 73 74 20 73 65 74 73 20 6f 66 20 65 76 65 72  rst sets of ever
69d0: 79 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a  y nonterminal..*
69e0: 2a 20 54 68 65 20 66 69 72 73 74 20 73 65 74 20  * The first set 
69f0: 69 73 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c  is the set of al
6a00: 6c 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  l terminal symbo
6a10: 6c 73 20 77 68 69 63 68 20 63 61 6e 20 62 65 67  ls which can beg
6a20: 69 6e 0a 2a 2a 20 61 20 73 74 72 69 6e 67 20 67  in.** a string g
6a30: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 61 74  enerated by that
6a40: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2f   nonterminal..*/
6a50: 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53  .void FindFirstS
6a60: 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ets(struct lemon
6a70: 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20   *lemp).{.  int 
6a80: 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74 20 72  i, j;.  struct r
6a90: 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74 20 70  ule *rp;.  int p
6aa0: 72 6f 67 72 65 73 73 3b 0a 0a 20 20 66 6f 72 28  rogress;..  for(
6ab0: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
6ac0: 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
6ad0: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
6ae0: 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e  ->lambda = LEMON
6af0: 5f 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 66 6f  _FALSE;.  }.  fo
6b00: 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  r(i=lemp->ntermi
6b10: 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  nal; i<lemp->nsy
6b20: 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
6b30: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
6b40: 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 53 65 74  ->firstset = Set
6b50: 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  New();.  }..  /*
6b60: 20 46 69 72 73 74 20 63 6f 6d 70 75 74 65 20 61   First compute a
6b70: 6c 6c 20 6c 61 6d 62 64 61 73 20 2a 2f 0a 20 20  ll lambdas */.  
6b80: 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73  do{.    progress
6b90: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70   = 0;.    for(rp
6ba0: 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
6bb0: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
6bc0: 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73       if( rp->lhs
6bd0: 2d 3e 6c 61 6d 62 64 61 20 29 20 63 6f 6e 74 69  ->lambda ) conti
6be0: 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  nue;.      for(i
6bf0: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
6c00: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74  i++){.        st
6c10: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
6c20: 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20  = rp->rhs[i];.  
6c30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 70        assert( sp
6c40: 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49  ->type==NONTERMI
6c50: 4e 41 4c 20 7c 7c 20 73 70 2d 3e 6c 61 6d 62 64  NAL || sp->lambd
6c60: 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29  a==LEMON_FALSE )
6c70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 70  ;.        if( sp
6c80: 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f  ->lambda==LEMON_
6c90: 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 20  FALSE ) break;. 
6ca0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6cb0: 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 7b 0a   i==rp->nrhs ){.
6cc0: 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d          rp->lhs-
6cd0: 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f  >lambda = LEMON_
6ce0: 54 52 55 45 3b 0a 20 20 20 20 20 20 20 20 70 72  TRUE;.        pr
6cf0: 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20  ogress = 1;.    
6d00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69    }.    }.  }whi
6d10: 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a  le( progress );.
6d20: 0a 20 20 2f 2a 20 4e 6f 77 20 63 6f 6d 70 75 74  .  /* Now comput
6d30: 65 20 61 6c 6c 20 66 69 72 73 74 20 73 65 74 73  e all first sets
6d40: 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 73 74   */.  do{.    st
6d50: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 31 2c  ruct symbol *s1,
6d60: 20 2a 73 32 3b 0a 20 20 20 20 70 72 6f 67 72 65   *s2;.    progre
6d70: 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ss = 0;.    for(
6d80: 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
6d90: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
6da0: 0a 20 20 20 20 20 20 73 31 20 3d 20 72 70 2d 3e  .      s1 = rp->
6db0: 6c 68 73 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  lhs;.      for(i
6dc0: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
6dd0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 32  i++){.        s2
6de0: 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
6df0: 20 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e 74         if( s2->t
6e00: 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b  ype==TERMINAL ){
6e10: 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72  .          progr
6e20: 65 73 73 20 2b 3d 20 53 65 74 41 64 64 28 73 31  ess += SetAdd(s1
6e30: 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 69  ->firstset,s2->i
6e40: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  ndex);.         
6e50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6e60: 7d 65 6c 73 65 20 69 66 28 20 73 32 2d 3e 74 79  }else if( s2->ty
6e70: 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
6e80: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  L ){.          f
6e90: 6f 72 28 6a 3d 30 3b 20 6a 3c 73 32 2d 3e 6e 73  or(j=0; j<s2->ns
6ea0: 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ubsym; j++){.   
6eb0: 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73           progres
6ec0: 73 20 2b 3d 20 53 65 74 41 64 64 28 73 31 2d 3e  s += SetAdd(s1->
6ed0: 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 73 75 62  firstset,s2->sub
6ee0: 73 79 6d 5b 6a 5d 2d 3e 69 6e 64 65 78 29 3b 0a  sym[j]->index);.
6ef0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6f00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6f10: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
6f20: 31 3d 3d 73 32 20 29 7b 0a 20 20 20 20 20 20 20  1==s2 ){.       
6f30: 20 20 20 69 66 28 20 73 31 2d 3e 6c 61 6d 62 64     if( s1->lambd
6f40: 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29  a==LEMON_FALSE )
6f50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6f60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6f70: 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74   progress += Set
6f80: 55 6e 69 6f 6e 28 73 31 2d 3e 66 69 72 73 74 73  Union(s1->firsts
6f90: 65 74 2c 73 32 2d 3e 66 69 72 73 74 73 65 74 29  et,s2->firstset)
6fa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
6fb0: 73 32 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f  s2->lambda==LEMO
6fc0: 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b  N_FALSE ) break;
6fd0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6fe0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
6ff0: 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 20  e( progress );. 
7000: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43   return;.}../* C
7010: 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29  ompute all LR(0)
7020: 20 73 74 61 74 65 73 20 66 6f 72 20 74 68 65 20   states for the 
7030: 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e 6b 73 0a  grammar.  Links.
7040: 2a 2a 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ** are added to 
7050: 62 65 74 77 65 65 6e 20 73 6f 6d 65 20 73 74 61  between some sta
7060: 74 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  tes so that the 
7070: 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20 73 65 74  LR(1) follow set
7080: 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 6f 6d 70  s.** can be comp
7090: 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a 2f 0a 50  uted later..*/.P
70a0: 52 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74  RIVATE struct st
70b0: 61 74 65 20 2a 67 65 74 73 74 61 74 65 28 73 74  ate *getstate(st
70c0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 20 20  ruct lemon *);  
70d0: 2f 2a 20 66 6f 72 77 61 72 64 20 72 65 66 65 72  /* forward refer
70e0: 65 6e 63 65 20 2a 2f 0a 76 6f 69 64 20 46 69 6e  ence */.void Fin
70f0: 64 53 74 61 74 65 73 28 73 74 72 75 63 74 20 6c  dStates(struct l
7100: 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
7110: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
7120: 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  p;.  struct rule
7130: 20 2a 72 70 3b 0a 0a 20 20 43 6f 6e 66 69 67 6c   *rp;..  Configl
7140: 69 73 74 5f 69 6e 69 74 28 29 3b 0a 0a 20 20 2f  ist_init();..  /
7150: 2a 20 46 69 6e 64 20 74 68 65 20 73 74 61 72 74  * Find the start
7160: 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 66 28   symbol */.  if(
7170: 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a   lemp->start ){.
7180: 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f      sp = Symbol_
7190: 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74  find(lemp->start
71a0: 29 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30  );.    if( sp==0
71b0: 20 29 7b 0a 20 20 20 20 20 20 45 72 72 6f 72 4d   ){.      ErrorM
71c0: 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  sg(lemp->filenam
71d0: 65 2c 30 2c 0a 22 54 68 65 20 73 70 65 63 69 66  e,0,."The specif
71e0: 69 65 64 20 73 74 61 72 74 20 73 79 6d 62 6f 6c  ied start symbol
71f0: 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 5c   \"%s\" is not \
7200: 0a 69 6e 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61  .in a nontermina
7210: 6c 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72  l of the grammar
7220: 2e 20 20 5c 22 25 73 5c 22 20 77 69 6c 6c 20 62  .  \"%s\" will b
7230: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 73 74  e used as the st
7240: 61 72 74 20 5c 0a 73 79 6d 62 6f 6c 20 69 6e 73  art \.symbol ins
7250: 74 65 61 64 2e 22 2c 6c 65 6d 70 2d 3e 73 74 61  tead.",lemp->sta
7260: 72 74 2c 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c  rt,lemp->rule->l
7270: 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  hs->name);.     
7280: 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
7290: 2b 3b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c 65  +;.      sp = le
72a0: 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20  mp->rule->lhs;. 
72b0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
72c0: 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c    sp = lemp->rul
72d0: 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 0a 20 20 2f  e->lhs;.  }..  /
72e0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
72f0: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 64 6f 65  start symbol doe
7300: 73 6e 27 74 20 6f 63 63 75 72 20 6f 6e 20 74 68  sn't occur on th
7310: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
7320: 65 20 6f 66 0a 20 20 2a 2a 20 61 6e 79 20 72 75  e of.  ** any ru
7330: 6c 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  le.  Report an e
7340: 72 72 6f 72 20 69 66 20 69 74 20 64 6f 65 73 2e  rror if it does.
7350: 20 20 28 59 41 43 43 20 77 6f 75 6c 64 20 67 65    (YACC would ge
7360: 6e 65 72 61 74 65 20 61 20 6e 65 77 0a 20 20 2a  nerate a new.  *
7370: 2a 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 69  * start symbol i
7380: 6e 20 74 68 69 73 20 63 61 73 65 2e 29 20 2a 2f  n this case.) */
7390: 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
73a0: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
73b0: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  >next){.    int 
73c0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
73d0: 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
73e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e  {.      if( rp->
73f0: 72 68 73 5b 69 5d 3d 3d 73 70 20 29 7b 20 20 20  rhs[i]==sp ){   
7400: 2f 2a 20 46 49 58 20 4d 45 3a 20 20 44 65 61 6c  /* FIX ME:  Deal
7410: 20 77 69 74 68 20 6d 75 6c 74 69 74 65 72 6d 69   with multitermi
7420: 6e 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  nals */.        
7430: 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
7440: 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20  ilename,0,."The 
7450: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25  start symbol \"%
7460: 73 5c 22 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  s\" occurs on th
7470: 65 20 5c 0a 72 69 67 68 74 2d 68 61 6e 64 20 73  e \.right-hand s
7480: 69 64 65 20 6f 66 20 61 20 72 75 6c 65 2e 20 54  ide of a rule. T
7490: 68 69 73 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  his will result 
74a0: 69 6e 20 61 20 70 61 72 73 65 72 20 77 68 69 63  in a parser whic
74b0: 68 20 5c 0a 64 6f 65 73 20 6e 6f 74 20 77 6f 72  h \.does not wor
74c0: 6b 20 70 72 6f 70 65 72 6c 79 2e 22 2c 73 70 2d  k properly.",sp-
74d0: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
74e0: 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
74f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7500: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62 61    }..  /* The ba
7510: 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  sis configuratio
7520: 6e 20 73 65 74 20 66 6f 72 20 74 68 65 20 66 69  n set for the fi
7530: 72 73 74 20 73 74 61 74 65 0a 20 20 2a 2a 20 69  rst state.  ** i
7540: 73 20 61 6c 6c 20 72 75 6c 65 73 20 77 68 69 63  s all rules whic
7550: 68 20 68 61 76 65 20 74 68 65 20 73 74 61 72 74  h have the start
7560: 20 73 79 6d 62 6f 6c 20 61 73 20 74 68 65 69 72   symbol as their
7570: 0a 20 20 2a 2a 20 6c 65 66 74 2d 68 61 6e 64 20  .  ** left-hand 
7580: 73 69 64 65 20 2a 2f 0a 20 20 66 6f 72 28 72 70  side */.  for(rp
7590: 3d 73 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  =sp->rule; rp; r
75a0: 70 3d 72 70 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a  p=rp->nextlhs){.
75b0: 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69      struct confi
75c0: 67 20 2a 6e 65 77 63 66 70 3b 0a 20 20 20 20 72  g *newcfp;.    r
75d0: 70 2d 3e 6c 68 73 53 74 61 72 74 20 3d 20 31 3b  p->lhsStart = 1;
75e0: 0a 20 20 20 20 6e 65 77 63 66 70 20 3d 20 43 6f  .    newcfp = Co
75f0: 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69  nfiglist_addbasi
7600: 73 28 72 70 2c 30 29 3b 0a 20 20 20 20 53 65 74  s(rp,0);.    Set
7610: 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c  Add(newcfp->fws,
7620: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  0);.  }..  /* Co
7630: 6d 70 75 74 65 20 74 68 65 20 66 69 72 73 74 20  mpute the first 
7640: 73 74 61 74 65 2e 20 20 41 6c 6c 20 6f 74 68 65  state.  All othe
7650: 72 20 73 74 61 74 65 73 20 77 69 6c 6c 20 62 65  r states will be
7660: 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 61  .  ** computed a
7670: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 75 72  utomatically dur
7680: 69 6e 67 20 74 68 65 20 63 6f 6d 70 75 74 61 74  ing the computat
7690: 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74  ion of the first
76a0: 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54 68 65 20 72   one..  ** The r
76b0: 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20  eturned pointer 
76c0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 73 74 61  to the first sta
76d0: 74 65 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20  te is not used. 
76e0: 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 73 74  */.  (void)getst
76f0: 61 74 65 28 6c 65 6d 70 29 3b 0a 20 20 72 65 74  ate(lemp);.  ret
7700: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  urn;.}../* Retur
7710: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
7720: 20 73 74 61 74 65 20 77 68 69 63 68 20 69 73 20   state which is 
7730: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 68 65  described by the
7740: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 2a   configuration.*
7750: 2a 20 6c 69 73 74 20 77 68 69 63 68 20 68 61 73  * list which has
7760: 20 62 65 65 6e 20 62 75 69 6c 74 20 66 72 6f 6d   been built from
7770: 20 63 61 6c 6c 73 20 74 6f 20 43 6f 6e 66 69 67   calls to Config
7780: 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f 0a 50 52 49  list_add..*/.PRI
7790: 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73  VATE void builds
77a0: 68 69 66 74 73 28 73 74 72 75 63 74 20 6c 65 6d  hifts(struct lem
77b0: 6f 6e 20 2a 2c 20 73 74 72 75 63 74 20 73 74 61  on *, struct sta
77c0: 74 65 20 2a 29 3b 20 2f 2a 20 46 6f 72 77 64 20  te *); /* Forwd 
77d0: 72 65 66 20 2a 2f 0a 50 52 49 56 41 54 45 20 73  ref */.PRIVATE s
77e0: 74 72 75 63 74 20 73 74 61 74 65 20 2a 67 65 74  truct state *get
77f0: 73 74 61 74 65 28 73 74 72 75 63 74 20 6c 65 6d  state(struct lem
7800: 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74  on *lemp).{.  st
7810: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
7820: 2c 20 2a 62 70 3b 0a 20 20 73 74 72 75 63 74 20  , *bp;.  struct 
7830: 73 74 61 74 65 20 2a 73 74 70 3b 0a 0a 20 20 2f  state *stp;..  /
7840: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 73 6f  * Extract the so
7850: 72 74 65 64 20 62 61 73 69 73 20 6f 66 20 74 68  rted basis of th
7860: 65 20 6e 65 77 20 73 74 61 74 65 2e 20 20 54 68  e new state.  Th
7870: 65 20 62 61 73 69 73 20 77 61 73 20 63 6f 6e 73  e basis was cons
7880: 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 62 79 20  tructed.  ** by 
7890: 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 22  prior calls to "
78a0: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61  Configlist_addba
78b0: 73 69 73 28 29 22 2e 20 2a 2f 0a 20 20 43 6f 6e  sis()". */.  Con
78c0: 66 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69  figlist_sortbasi
78d0: 73 28 29 3b 0a 20 20 62 70 20 3d 20 43 6f 6e 66  s();.  bp = Conf
78e0: 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29 3b 0a  iglist_basis();.
78f0: 0a 20 20 2f 2a 20 47 65 74 20 61 20 73 74 61 74  .  /* Get a stat
7900: 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
7910: 62 61 73 69 73 20 2a 2f 0a 20 20 73 74 70 20 3d  basis */.  stp =
7920: 20 53 74 61 74 65 5f 66 69 6e 64 28 62 70 29 3b   State_find(bp);
7930: 0a 20 20 69 66 28 20 73 74 70 20 29 7b 0a 20 20  .  if( stp ){.  
7940: 20 20 2f 2a 20 41 20 73 74 61 74 65 20 77 69 74    /* A state wit
7950: 68 20 74 68 65 20 73 61 6d 65 20 62 61 73 69 73  h the same basis
7960: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 21   already exists!
7970: 20 20 43 6f 70 79 20 61 6c 6c 20 74 68 65 20 66    Copy all the f
7980: 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20 20 20 2a 2a  ollow-set.    **
7990: 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
79a0: 6b 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74  ks from the stat
79b0: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
79c0: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 0a 20 20  tion into the.  
79d0: 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67    ** preexisting
79e0: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 72 65 74   state, then ret
79f0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
7a00: 20 74 68 65 20 70 72 65 65 78 69 73 74 69 6e 67   the preexisting
7a10: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74   state */.    st
7a20: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 78 2c 20  ruct config *x, 
7a30: 2a 79 3b 0a 20 20 20 20 66 6f 72 28 78 3d 62 70  *y;.    for(x=bp
7a40: 2c 20 79 3d 73 74 70 2d 3e 62 70 3b 20 78 20 26  , y=stp->bp; x &
7a50: 26 20 79 3b 20 78 3d 78 2d 3e 62 70 2c 20 79 3d  & y; x=x->bp, y=
7a60: 79 2d 3e 62 70 29 7b 0a 20 20 20 20 20 20 50 6c  y->bp){.      Pl
7a70: 69 6e 6b 5f 63 6f 70 79 28 26 79 2d 3e 62 70 6c  ink_copy(&y->bpl
7a80: 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a 20 20 20 20  p,x->bplp);.    
7a90: 20 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 78    Plink_delete(x
7aa0: 2d 3e 66 70 6c 70 29 3b 0a 20 20 20 20 20 20 78  ->fplp);.      x
7ab0: 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e 62 70 6c 70  ->fplp = x->bplp
7ac0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
7ad0: 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74  cfp = Configlist
7ae0: 5f 72 65 74 75 72 6e 28 29 3b 0a 20 20 20 20 43  _return();.    C
7af0: 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 63 66  onfiglist_eat(cf
7b00: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
7b10: 20 2f 2a 20 54 68 69 73 20 72 65 61 6c 6c 79 20   /* This really 
7b20: 69 73 20 61 20 6e 65 77 20 73 74 61 74 65 2e 20  is a new state. 
7b30: 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20 74   Construct all t
7b40: 68 65 20 64 65 74 61 69 6c 73 20 2a 2f 0a 20 20  he details */.  
7b50: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f    Configlist_clo
7b60: 73 75 72 65 28 6c 65 6d 70 29 3b 20 20 20 20 2f  sure(lemp);    /
7b70: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
7b80: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73  nfiguration clos
7b90: 75 72 65 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69  ure */.    Confi
7ba0: 67 6c 69 73 74 5f 73 6f 72 74 28 29 3b 20 20 20  glist_sort();   
7bb0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 20          /* Sort 
7bc0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
7bd0: 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20  n closure */.   
7be0: 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73   cfp = Configlis
7bf0: 74 5f 72 65 74 75 72 6e 28 29 3b 20 20 20 2f 2a  t_return();   /*
7c00: 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74   Get a pointer t
7c10: 6f 20 74 68 65 20 63 6f 6e 66 69 67 20 6c 69 73  o the config lis
7c20: 74 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 53  t */.    stp = S
7c30: 74 61 74 65 5f 6e 65 77 28 29 3b 20 20 20 20 20  tate_new();     
7c40: 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73        /* A new s
7c50: 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20 2a  tate structure *
7c60: 2f 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63  /.    MemoryChec
7c70: 6b 28 73 74 70 29 3b 0a 20 20 20 20 73 74 70 2d  k(stp);.    stp-
7c80: 3e 62 70 20 3d 20 62 70 3b 20 20 20 20 20 20 20  >bp = bp;       
7c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65           /* Reme
7ca0: 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75  mber the configu
7cb0: 72 61 74 69 6f 6e 20 62 61 73 69 73 20 2a 2f 0a  ration basis */.
7cc0: 20 20 20 20 73 74 70 2d 3e 63 66 70 20 3d 20 63      stp->cfp = c
7cd0: 66 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fp;             
7ce0: 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65   /* Remember the
7cf0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
7d00: 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 73 74  losure */.    st
7d10: 70 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20 6c 65  p->statenum = le
7d20: 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b 20 2f 2a  mp->nstate++; /*
7d30: 20 45 76 65 72 79 20 73 74 61 74 65 20 67 65 74   Every state get
7d40: 73 20 61 20 73 65 71 75 65 6e 63 65 20 6e 75 6d  s a sequence num
7d50: 62 65 72 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e  ber */.    stp->
7d60: 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ap = 0;         
7d70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61 63          /* No ac
7d80: 74 69 6f 6e 73 2c 20 79 65 74 2e 20 2a 2f 0a 20  tions, yet. */. 
7d90: 20 20 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28     State_insert(
7da0: 73 74 70 2c 73 74 70 2d 3e 62 70 29 3b 20 20 20  stp,stp->bp);   
7db0: 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20 73 74  /* Add to the st
7dc0: 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ate table */.   
7dd0: 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c 65 6d   buildshifts(lem
7de0: 70 2c 73 74 70 29 3b 20 20 20 20 20 20 20 2f 2a  p,stp);       /*
7df0: 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 6f 6d   Recursively com
7e00: 70 75 74 65 20 73 75 63 63 65 73 73 6f 72 20 73  pute successor s
7e10: 74 61 74 65 73 20 2a 2f 0a 20 20 7d 0a 20 20 72  tates */.  }.  r
7e20: 65 74 75 72 6e 20 73 74 70 3b 0a 7d 0a 0a 2f 2a  eturn stp;.}../*
7e30: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
7e40: 69 66 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 61  if two symbols a
7e50: 72 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a  re the same..*/.
7e60: 69 6e 74 20 73 61 6d 65 5f 73 79 6d 62 6f 6c 28  int same_symbol(
7e70: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 61  struct symbol *a
7e80: 2c 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  , struct symbol 
7e90: 2a 62 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *b).{.  int i;. 
7ea0: 20 69 66 28 20 61 3d 3d 62 20 29 20 72 65 74 75   if( a==b ) retu
7eb0: 72 6e 20 31 3b 0a 20 20 69 66 28 20 61 2d 3e 74  rn 1;.  if( a->t
7ec0: 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype!=MULTITERMIN
7ed0: 41 4c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  AL ) return 0;. 
7ee0: 20 69 66 28 20 62 2d 3e 74 79 70 65 21 3d 4d 55   if( b->type!=MU
7ef0: 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 20 72 65  LTITERMINAL ) re
7f00: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 61 2d  turn 0;.  if( a-
7f10: 3e 6e 73 75 62 73 79 6d 21 3d 62 2d 3e 6e 73 75  >nsubsym!=b->nsu
7f20: 62 73 79 6d 20 29 20 72 65 74 75 72 6e 20 30 3b  bsym ) return 0;
7f30: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 2d  .  for(i=0; i<a-
7f40: 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a  >nsubsym; i++){.
7f50: 20 20 20 20 69 66 28 20 61 2d 3e 73 75 62 73 79      if( a->subsy
7f60: 6d 5b 69 5d 21 3d 62 2d 3e 73 75 62 73 79 6d 5b  m[i]!=b->subsym[
7f70: 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  i] ) return 0;. 
7f80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
7f90: 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  ../* Construct a
7fa0: 6c 6c 20 73 75 63 63 65 73 73 6f 72 20 73 74 61  ll successor sta
7fb0: 74 65 73 20 74 6f 20 74 68 65 20 67 69 76 65 6e  tes to the given
7fc0: 20 73 74 61 74 65 2e 20 20 41 20 22 73 75 63 63   state.  A "succ
7fd0: 65 73 73 6f 72 22 0a 2a 2a 20 73 74 61 74 65 20  essor".** state 
7fe0: 69 73 20 61 6e 79 20 73 74 61 74 65 20 77 68 69  is any state whi
7ff0: 63 68 20 63 61 6e 20 62 65 20 72 65 61 63 68 65  ch can be reache
8000: 64 20 62 79 20 61 20 73 68 69 66 74 20 61 63 74  d by a shift act
8010: 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ion..*/.PRIVATE 
8020: 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74 73  void buildshifts
8030: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
8040: 65 6d 70 2c 20 73 74 72 75 63 74 20 73 74 61 74  emp, struct stat
8050: 65 20 2a 73 74 70 29 0a 7b 0a 20 20 73 74 72 75  e *stp).{.  stru
8060: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20  ct config *cfp; 
8070: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
8080: 74 68 72 75 20 74 68 65 20 63 6f 6e 66 69 67 20  thru the config 
8090: 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22  closure of "stp"
80a0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
80b0: 66 69 67 20 2a 62 63 66 70 3b 20 2f 2a 20 46 6f  fig *bcfp; /* Fo
80c0: 72 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  r the inner loop
80d0: 20 6f 6e 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75   on config closu
80e0: 72 65 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20  re of "stp" */. 
80f0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
8100: 6e 65 77 63 66 67 3b 20 20 2f 2a 20 2a 2f 0a 20  newcfg;  /* */. 
8110: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
8120: 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20  sp;   /* Symbol 
8130: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f  following the do
8140: 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69  t in configurati
8150: 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20 20 73 74  on "cfp" */.  st
8160: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 73 70  ruct symbol *bsp
8170: 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c  ;  /* Symbol fol
8180: 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74 20 69  lowing the dot i
8190: 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  n configuration 
81a0: 22 62 63 66 70 22 20 2a 2f 0a 20 20 73 74 72 75  "bcfp" */.  stru
81b0: 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73 74 70  ct state *newstp
81c0: 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  ; /* A pointer t
81d0: 6f 20 61 20 73 75 63 63 65 73 73 6f 72 20 73 74  o a successor st
81e0: 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 61 63  ate */..  /* Eac
81f0: 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  h configuration 
8200: 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c 65 74 65  becomes complete
8210: 20 61 66 74 65 72 20 69 74 20 63 6f 6e 74 69 62   after it contib
8220: 75 74 65 73 20 74 6f 20 61 20 73 75 63 63 65 73  utes to a succes
8230: 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20  sor.  ** state. 
8240: 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61 6c 6c 20   Initially, all 
8250: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61  configurations a
8260: 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65 20 2a 2f  re incomplete */
8270: 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e  .  for(cfp=stp->
8280: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
8290: 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d 3e 73 74  p->next) cfp->st
82a0: 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54  atus = INCOMPLET
82b0: 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  E;..  /* Loop th
82c0: 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e 66 69 67  rough all config
82d0: 75 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  urations of the 
82e0: 73 74 61 74 65 20 22 73 74 70 22 20 2a 2f 0a 20  state "stp" */. 
82f0: 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66   for(cfp=stp->cf
8300: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
8310: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
8320: 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d  cfp->status==COM
8330: 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65  PLETE ) continue
8340: 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20  ;    /* Already 
8350: 75 73 65 64 20 62 79 20 69 6e 6e 65 72 20 6c 6f  used by inner lo
8360: 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 66  op */.    if( cf
8370: 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72 70 2d  p->dot>=cfp->rp-
8380: 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65  >nrhs ) continue
8390: 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73 68 69 66  ;  /* Can't shif
83a0: 74 20 74 68 69 73 20 63 6f 6e 66 69 67 20 2a 2f  t this config */
83b0: 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  .    Configlist_
83c0: 72 65 73 65 74 28 29 3b 20 20 20 20 20 20 20 20  reset();        
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
83e0: 20 52 65 73 65 74 20 74 68 65 20 6e 65 77 20 63   Reset the new c
83f0: 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a 20 20 20  onfig set */.   
8400: 20 73 70 20 3d 20 63 66 70 2d 3e 72 70 2d 3e 72   sp = cfp->rp->r
8410: 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20 20 20  hs[cfp->dot];   
8420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d            /* Sym
8430: 62 6f 6c 20 61 66 74 65 72 20 74 68 65 20 64 6f  bol after the do
8440: 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 6f 72  t */..    /* For
8450: 20 65 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61   every configura
8460: 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 61 74  tion in the stat
8470: 65 20 22 73 74 70 22 20 77 68 69 63 68 20 68 61  e "stp" which ha
8480: 73 20 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70  s the symbol "sp
8490: 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  ".    ** followi
84a0: 6e 67 20 69 74 73 20 64 6f 74 2c 20 61 64 64 20  ng its dot, add 
84b0: 74 68 65 20 73 61 6d 65 20 63 6f 6e 66 69 67 75  the same configu
84c0: 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 62 61  ration to the ba
84d0: 73 69 73 20 73 65 74 20 75 6e 64 65 72 0a 20 20  sis set under.  
84e0: 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f    ** constructio
84f0: 6e 20 62 75 74 20 77 69 74 68 20 74 68 65 20 64  n but with the d
8500: 6f 74 20 73 68 69 66 74 65 64 20 6f 6e 65 20 73  ot shifted one s
8510: 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20 72 69 67  ymbol to the rig
8520: 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 62  ht. */.    for(b
8530: 63 66 70 3d 63 66 70 3b 20 62 63 66 70 3b 20 62  cfp=cfp; bcfp; b
8540: 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78 74 29 7b  cfp=bcfp->next){
8550: 0a 20 20 20 20 20 20 69 66 28 20 62 63 66 70 2d  .      if( bcfp-
8560: 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54  >status==COMPLET
8570: 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20  E ) continue;   
8580: 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64   /* Already used
8590: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 63   */.      if( bc
85a0: 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d 3e 72  fp->dot>=bcfp->r
85b0: 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e  p->nrhs ) contin
85c0: 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20 73 68 69  ue; /* Can't shi
85d0: 66 74 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  ft this one */. 
85e0: 20 20 20 20 20 62 73 70 20 3d 20 62 63 66 70 2d       bsp = bcfp-
85f0: 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70 2d 3e 64  >rp->rhs[bcfp->d
8600: 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ot];           /
8610: 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20 61 66 74  * Get symbol aft
8620: 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20 20 20 20  er dot */.      
8630: 69 66 28 20 21 73 61 6d 65 5f 73 79 6d 62 6f 6c  if( !same_symbol
8640: 28 62 73 70 2c 73 70 29 20 29 20 63 6f 6e 74 69  (bsp,sp) ) conti
8650: 6e 75 65 3b 20 20 20 20 20 20 2f 2a 20 4d 75 73  nue;      /* Mus
8660: 74 20 62 65 20 73 61 6d 65 20 61 73 20 66 6f 72  t be same as for
8670: 20 22 63 66 70 22 20 2a 2f 0a 20 20 20 20 20 20   "cfp" */.      
8680: 62 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43  bcfp->status = C
8690: 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20 20 20 20  OMPLETE;        
86a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72            /* Mar
86b0: 6b 20 74 68 69 73 20 63 6f 6e 66 69 67 20 61 73  k this config as
86c0: 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 6e   used */.      n
86d0: 65 77 63 66 67 20 3d 20 43 6f 6e 66 69 67 6c 69  ewcfg = Configli
86e0: 73 74 5f 61 64 64 62 61 73 69 73 28 62 63 66 70  st_addbasis(bcfp
86f0: 2d 3e 72 70 2c 62 63 66 70 2d 3e 64 6f 74 2b 31  ->rp,bcfp->dot+1
8700: 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61  );.      Plink_a
8710: 64 64 28 26 6e 65 77 63 66 67 2d 3e 62 70 6c 70  dd(&newcfg->bplp
8720: 2c 62 63 66 70 29 3b 0a 20 20 20 20 7d 0a 0a 20  ,bcfp);.    }.. 
8730: 20 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e     /* Get a poin
8740: 74 65 72 20 74 6f 20 74 68 65 20 73 74 61 74 65  ter to the state
8750: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74 68   described by th
8760: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
8770: 61 74 69 6f 6e 20 73 65 74 0a 20 20 20 20 2a 2a  ation set.    **
8780: 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
8790: 74 68 65 20 70 72 65 63 65 64 69 6e 67 20 6c 6f  the preceding lo
87a0: 6f 70 20 2a 2f 0a 20 20 20 20 6e 65 77 73 74 70  op */.    newstp
87b0: 20 3d 20 67 65 74 73 74 61 74 65 28 6c 65 6d 70   = getstate(lemp
87c0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73  );..    /* The s
87d0: 74 61 74 65 20 22 6e 65 77 73 74 70 22 20 69 73  tate "newstp" is
87e0: 20 72 65 61 63 68 65 64 20 66 72 6f 6d 20 74 68   reached from th
87f0: 65 20 73 74 61 74 65 20 22 73 74 70 22 20 62 79  e state "stp" by
8800: 20 61 20 73 68 69 66 74 20 61 63 74 69 6f 6e 0a   a shift action.
8810: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 79      ** on the sy
8820: 6d 62 6f 6c 20 22 73 70 22 20 2a 2f 0a 20 20 20  mbol "sp" */.   
8830: 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d   if( sp->type==M
8840: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
8850: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
8860: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 70     for(i=0; i<sp
8870: 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b 29 7b  ->nsubsym; i++){
8880: 0a 20 20 20 20 20 20 20 20 41 63 74 69 6f 6e 5f  .        Action_
8890: 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 53 48 49  add(&stp->ap,SHI
88a0: 46 54 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 69 5d  FT,sp->subsym[i]
88b0: 2c 28 63 68 61 72 2a 29 6e 65 77 73 74 70 29 3b  ,(char*)newstp);
88c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
88d0: 73 65 7b 0a 20 20 20 20 20 20 41 63 74 69 6f 6e  se{.      Action
88e0: 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 53 48  _add(&stp->ap,SH
88f0: 49 46 54 2c 73 70 2c 28 63 68 61 72 20 2a 29 6e  IFT,sp,(char *)n
8900: 65 77 73 74 70 29 3b 0a 20 20 20 20 7d 0a 20 20  ewstp);.    }.  
8910: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
8920: 72 75 63 74 20 74 68 65 20 70 72 6f 70 61 67 61  ruct the propaga
8930: 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a 76 6f  tion links.*/.vo
8940: 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 73 74 72  id FindLinks(str
8950: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
8960: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  .{.  int i;.  st
8970: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
8980: 2c 20 2a 6f 74 68 65 72 3b 0a 20 20 73 74 72 75  , *other;.  stru
8990: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
89a0: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70   struct plink *p
89b0: 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f 75 73 65 6b  lp;..  /* Housek
89c0: 65 65 70 69 6e 67 20 64 65 74 61 69 6c 3a 0a 20  eeping detail:. 
89d0: 20 2a 2a 20 41 64 64 20 74 6f 20 65 76 65 72 79   ** Add to every
89e0: 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e 6b 20   propagate link 
89f0: 61 20 70 6f 69 6e 74 65 72 20 62 61 63 6b 20 74  a pointer back t
8a00: 6f 20 74 68 65 20 73 74 61 74 65 20 74 6f 0a 20  o the state to. 
8a10: 20 2a 2a 20 77 68 69 63 68 20 74 68 65 20 6c 69   ** which the li
8a20: 6e 6b 20 69 73 20 61 74 74 61 63 68 65 64 2e 20  nk is attached. 
8a30: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
8a40: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
8a50: 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  +){.    stp = le
8a60: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
8a70: 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e     for(cfp=stp->
8a80: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
8a90: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
8aa0: 63 66 70 2d 3e 73 74 70 20 3d 20 73 74 70 3b 0a  cfp->stp = stp;.
8ab0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
8ac0: 43 6f 6e 76 65 72 74 20 61 6c 6c 20 62 61 63 6b  Convert all back
8ad0: 6c 69 6e 6b 73 20 69 6e 74 6f 20 66 6f 72 77 61  links into forwa
8ae0: 72 64 20 6c 69 6e 6b 73 2e 20 20 4f 6e 6c 79 20  rd links.  Only 
8af0: 74 68 65 20 66 6f 72 77 61 72 64 0a 20 20 2a 2a  the forward.  **
8b00: 20 6c 69 6e 6b 73 20 61 72 65 20 75 73 65 64 20   links are used 
8b10: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65  in the follow-se
8b20: 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 20 2a  t computation. *
8b30: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
8b40: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
8b50: 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
8b60: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
8b70: 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63    for(cfp=stp->c
8b80: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
8b90: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66  ->next){.      f
8ba0: 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 62 70 6c 70  or(plp=cfp->bplp
8bb0: 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e  ; plp; plp=plp->
8bc0: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 6f  next){.        o
8bd0: 74 68 65 72 20 3d 20 70 6c 70 2d 3e 63 66 70 3b  ther = plp->cfp;
8be0: 0a 20 20 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61  .        Plink_a
8bf0: 64 64 28 26 6f 74 68 65 72 2d 3e 66 70 6c 70 2c  dd(&other->fplp,
8c00: 63 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cfp);.      }.  
8c10: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f    }.  }.}../* Co
8c20: 6d 70 75 74 65 20 61 6c 6c 20 66 6f 6c 6c 6f 77  mpute all follow
8c30: 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 66 6f  sets..**.** A fo
8c40: 6c 6c 6f 77 73 65 74 20 69 73 20 74 68 65 20 73  llowset is the s
8c50: 65 74 20 6f 66 20 61 6c 6c 20 73 79 6d 62 6f 6c  et of all symbol
8c60: 73 20 77 68 69 63 68 20 63 61 6e 20 63 6f 6d 65  s which can come
8c70: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
8c80: 61 66 74 65 72 20 61 20 63 6f 6e 66 69 67 75 72  after a configur
8c90: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 46  ation..*/.void F
8ca0: 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 73 74  indFollowSets(st
8cb0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
8cc0: 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  ).{.  int i;.  s
8cd0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
8ce0: 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  p;.  struct plin
8cf0: 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e 74 20 70 72  k *plp;.  int pr
8d00: 6f 67 72 65 73 73 3b 0a 20 20 69 6e 74 20 63 68  ogress;.  int ch
8d10: 61 6e 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  ange;..  for(i=0
8d20: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
8d30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28  ; i++){.    for(
8d40: 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  cfp=lemp->sorted
8d50: 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  [i]->cfp; cfp; c
8d60: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
8d70: 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74 75 73       cfp->status
8d80: 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20   = INCOMPLETE;. 
8d90: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 64 6f     }.  }.  .  do
8da0: 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d  {.    progress =
8db0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
8dc0: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
8dd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72   i++){.      for
8de0: 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65  (cfp=lemp->sorte
8df0: 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20  d[i]->cfp; cfp; 
8e00: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
8e10: 20 20 20 20 20 20 20 20 69 66 28 20 63 66 70 2d          if( cfp-
8e20: 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54  >status==COMPLET
8e30: 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  E ) continue;.  
8e40: 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63 66        for(plp=cf
8e50: 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b 20 70 6c  p->fplp; plp; pl
8e60: 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=plp->next){.  
8e70: 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 20 3d          change =
8e80: 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70 2d 3e 63   SetUnion(plp->c
8e90: 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e 66 77 73  fp->fws,cfp->fws
8ea0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
8eb0: 20 63 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 20   change ){.     
8ec0: 20 20 20 20 20 20 20 70 6c 70 2d 3e 63 66 70 2d         plp->cfp-
8ed0: 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50  >status = INCOMP
8ee0: 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20 20 20  LETE;.          
8ef0: 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a    progress = 1;.
8f00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8f10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 66      }.        cf
8f20: 70 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d 50  p->status = COMP
8f30: 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LETE;.      }.  
8f40: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72    }.  }while( pr
8f50: 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a 73 74 61  ogress );.}..sta
8f60: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f  tic int resolve_
8f70: 63 6f 6e 66 6c 69 63 74 28 73 74 72 75 63 74 20  conflict(struct 
8f80: 61 63 74 69 6f 6e 20 2a 2c 73 74 72 75 63 74 20  action *,struct 
8f90: 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f 2a 20 43  action *);../* C
8fa0: 6f 6d 70 75 74 65 20 74 68 65 20 72 65 64 75 63  ompute the reduc
8fb0: 65 20 61 63 74 69 6f 6e 73 2c 20 61 6e 64 20 72  e actions, and r
8fc0: 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73  esolve conflicts
8fd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 41 63  ..*/.void FindAc
8fe0: 74 69 6f 6e 73 28 73 74 72 75 63 74 20 6c 65 6d  tions(struct lem
8ff0: 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e  on *lemp).{.  in
9000: 74 20 69 2c 6a 3b 0a 20 20 73 74 72 75 63 74 20  t i,j;.  struct 
9010: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73  config *cfp;.  s
9020: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
9030: 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  ;.  struct symbo
9040: 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20  l *sp;.  struct 
9050: 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f 2a 20  rule *rp;..  /* 
9060: 41 64 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  Add all of the r
9070: 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20 0a 20  educe actions . 
9080: 20 2a 2a 20 41 20 72 65 64 75 63 65 20 61 63 74   ** A reduce act
9090: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 66 6f 72  ion is added for
90a0: 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66   each element of
90b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 73 65 74 20 6f   the followset o
90c0: 66 0a 20 20 2a 2a 20 61 20 63 6f 6e 66 69 67 75  f.  ** a configu
90d0: 72 61 74 69 6f 6e 20 77 68 69 63 68 20 68 61 73  ration which has
90e0: 20 69 74 73 20 64 6f 74 20 61 74 20 74 68 65 20   its dot at the 
90f0: 65 78 74 72 65 6d 65 20 72 69 67 68 74 2e 0a 20  extreme right.. 
9100: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
9110: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
9120: 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f  ++){   /* Loop o
9130: 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73 20 2a  ver all states *
9140: 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  /.    stp = lemp
9150: 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
9160: 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66   for(cfp=stp->cf
9170: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
9180: 3e 6e 65 78 74 29 7b 20 20 2f 2a 20 4c 6f 6f 70  >next){  /* Loop
9190: 20 6f 76 65 72 20 61 6c 6c 20 63 6f 6e 66 69 67   over all config
91a0: 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20  urations */.    
91b0: 20 20 69 66 28 20 63 66 70 2d 3e 72 70 2d 3e 6e    if( cfp->rp->n
91c0: 72 68 73 3d 3d 63 66 70 2d 3e 64 6f 74 20 29 7b  rhs==cfp->dot ){
91d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20 64 6f          /* Is do
91e0: 74 20 61 74 20 65 78 74 72 65 6d 65 20 72 69 67  t at extreme rig
91f0: 68 74 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ht? */.        f
9200: 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e  or(j=0; j<lemp->
9210: 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b  nterminal; j++){
9220: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53  .          if( S
9230: 65 74 46 69 6e 64 28 63 66 70 2d 3e 66 77 73 2c  etFind(cfp->fws,
9240: 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j) ){.          
9250: 20 20 2f 2a 20 41 64 64 20 61 20 72 65 64 75 63    /* Add a reduc
9260: 65 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  e action to the 
9270: 73 74 61 74 65 20 22 73 74 70 22 20 77 68 69 63  state "stp" whic
9280: 68 20 77 69 6c 6c 20 72 65 64 75 63 65 20 62 79  h will reduce by
9290: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
92a0: 20 2a 2a 20 72 75 6c 65 20 22 63 66 70 2d 3e 72   ** rule "cfp->r
92b0: 70 22 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68  p" if the lookah
92c0: 65 61 64 20 73 79 6d 62 6f 6c 20 69 73 20 22 6c  ead symbol is "l
92d0: 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 22  emp->symbols[j]"
92e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
92f0: 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d  Action_add(&stp-
9300: 3e 61 70 2c 52 45 44 55 43 45 2c 6c 65 6d 70 2d  >ap,REDUCE,lemp-
9310: 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 28 63 68 61  >symbols[j],(cha
9320: 72 20 2a 29 63 66 70 2d 3e 72 70 29 3b 0a 20 20  r *)cfp->rp);.  
9330: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9340: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9350: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  }.  }..  /* Add 
9360: 74 68 65 20 61 63 63 65 70 74 69 6e 67 20 74 6f  the accepting to
9370: 6b 65 6e 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d  ken */.  if( lem
9380: 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20  p->start ){.    
9390: 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64  sp = Symbol_find
93a0: 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20  (lemp->start);. 
93b0: 20 20 20 69 66 28 20 73 70 3d 3d 30 20 29 20 73     if( sp==0 ) s
93c0: 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e  p = lemp->rule->
93d0: 6c 68 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lhs;.  }else{.  
93e0: 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c    sp = lemp->rul
93f0: 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 20 20 2f 2a  e->lhs;.  }.  /*
9400: 20 41 64 64 20 74 6f 20 74 68 65 20 66 69 72 73   Add to the firs
9410: 74 20 73 74 61 74 65 20 28 77 68 69 63 68 20 69  t state (which i
9420: 73 20 61 6c 77 61 79 73 20 74 68 65 20 73 74 61  s always the sta
9430: 72 74 69 6e 67 20 73 74 61 74 65 20 6f 66 20 74  rting state of t
9440: 68 65 0a 20 20 2a 2a 20 66 69 6e 69 74 65 20 73  he.  ** finite s
9450: 74 61 74 65 20 6d 61 63 68 69 6e 65 29 20 61 6e  tate machine) an
9460: 20 61 63 74 69 6f 6e 20 74 6f 20 41 43 43 45 50   action to ACCEP
9470: 54 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65  T if the lookahe
9480: 61 64 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 73  ad is the.  ** s
9490: 74 61 72 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  tart nonterminal
94a0: 2e 20 20 2a 2f 0a 20 20 41 63 74 69 6f 6e 5f 61  .  */.  Action_a
94b0: 64 64 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  dd(&lemp->sorted
94c0: 5b 30 5d 2d 3e 61 70 2c 41 43 43 45 50 54 2c 73  [0]->ap,ACCEPT,s
94d0: 70 2c 30 29 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f  p,0);..  /* Reso
94e0: 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f  lve conflicts */
94f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
9500: 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
9510: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 61 63 74  {.    struct act
9520: 69 6f 6e 20 2a 61 70 2c 20 2a 6e 61 70 3b 0a 20  ion *ap, *nap;. 
9530: 20 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20     struct state 
9540: 2a 73 74 70 3b 0a 20 20 20 20 73 74 70 20 3d 20  *stp;.    stp = 
9550: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
9560: 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20  .    /* assert( 
9570: 73 74 70 2d 3e 61 70 20 29 3b 20 2a 2f 0a 20 20  stp->ap ); */.  
9580: 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63 74 69    stp->ap = Acti
9590: 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70 29  on_sort(stp->ap)
95a0: 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  ;.    for(ap=stp
95b0: 2d 3e 61 70 3b 20 61 70 20 26 26 20 61 70 2d 3e  ->ap; ap && ap->
95c0: 6e 65 78 74 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  next; ap=ap->nex
95d0: 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6e 61  t){.      for(na
95e0: 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 6e 61 70 20  p=ap->next; nap 
95f0: 26 26 20 6e 61 70 2d 3e 73 70 3d 3d 61 70 2d 3e  && nap->sp==ap->
9600: 73 70 3b 20 6e 61 70 3d 6e 61 70 2d 3e 6e 65 78  sp; nap=nap->nex
9610: 74 29 7b 0a 20 20 20 20 20 20 20 20 20 2f 2a 20  t){.         /* 
9620: 54 68 65 20 74 77 6f 20 61 63 74 69 6f 6e 73 20  The two actions 
9630: 22 61 70 22 20 61 6e 64 20 22 6e 61 70 22 20 68  "ap" and "nap" h
9640: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 6f  ave the same loo
9650: 6b 61 68 65 61 64 2e 0a 20 20 20 20 20 20 20 20  kahead..        
9660: 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   ** Figure out w
9670: 68 69 63 68 20 6f 6e 65 20 73 68 6f 75 6c 64 20  hich one should 
9680: 62 65 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20  be used */.     
9690: 20 20 20 20 6c 65 6d 70 2d 3e 6e 63 6f 6e 66 6c      lemp->nconfl
96a0: 69 63 74 20 2b 3d 20 72 65 73 6f 6c 76 65 5f 63  ict += resolve_c
96b0: 6f 6e 66 6c 69 63 74 28 61 70 2c 6e 61 70 29 3b  onflict(ap,nap);
96c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
96d0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20   }..  /* Report 
96e0: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 65 61 63  an error for eac
96f0: 68 20 72 75 6c 65 20 74 68 61 74 20 63 61 6e 20  h rule that can 
9700: 6e 65 76 65 72 20 62 65 20 72 65 64 75 63 65 64  never be reduced
9710: 2e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65  . */.  for(rp=le
9720: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
9730: 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 63  =rp->next) rp->c
9740: 61 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e  anReduce = LEMON
9750: 5f 46 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d  _FALSE;.  for(i=
9760: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
9770: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  e; i++){.    str
9780: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
9790: 20 20 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d      for(ap=lemp-
97a0: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20  >sorted[i]->ap; 
97b0: 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
97c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  {.      if( ap->
97d0: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61  type==REDUCE ) a
97e0: 70 2d 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75  p->x.rp->canRedu
97f0: 63 65 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b  ce = LEMON_TRUE;
9800: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
9810: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
9820: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
9830: 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 61  {.    if( rp->ca
9840: 6e 52 65 64 75 63 65 20 29 20 63 6f 6e 74 69 6e  nReduce ) contin
9850: 75 65 3b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67  ue;.    ErrorMsg
9860: 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
9870: 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 22 54 68  rp->ruleline,"Th
9880: 69 73 20 72 75 6c 65 20 63 61 6e 20 6e 6f 74 20  is rule can not 
9890: 62 65 20 72 65 64 75 63 65 64 2e 5c 6e 22 29 3b  be reduced.\n");
98a0: 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
98b0: 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  cnt++;.  }.}../*
98c0: 20 52 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c   Resolve a confl
98d0: 69 63 74 20 62 65 74 77 65 65 6e 20 74 68 65 20  ict between the 
98e0: 74 77 6f 20 67 69 76 65 6e 20 61 63 74 69 6f 6e  two given action
98f0: 73 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f  s.  If the.** co
9900: 6e 66 6c 69 63 74 20 63 61 6e 27 74 20 62 65 20  nflict can't be 
9910: 72 65 73 6f 6c 76 65 64 2c 20 72 65 74 75 72 6e  resolved, return
9920: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
9930: 20 4e 4f 20 4c 4f 4e 47 45 52 20 54 52 55 45 3a   NO LONGER TRUE:
9940: 0a 2a 2a 20 20 20 54 6f 20 72 65 73 6f 6c 76 65  .**   To resolve
9950: 20 61 20 63 6f 6e 66 6c 69 63 74 2c 20 66 69 72   a conflict, fir
9960: 73 74 20 6c 6f 6f 6b 20 74 6f 20 73 65 65 20 69  st look to see i
9970: 66 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 0a  f either action.
9980: 2a 2a 20 20 20 69 73 20 6f 6e 20 61 6e 20 65 72  **   is on an er
9990: 72 6f 72 20 72 75 6c 65 2e 20 20 49 6e 20 74 68  ror rule.  In th
99a0: 61 74 20 63 61 73 65 2c 20 74 61 6b 65 20 74 68  at case, take th
99b0: 65 20 61 63 74 69 6f 6e 20 77 68 69 63 68 0a 2a  e action which.*
99c0: 2a 20 20 20 69 73 20 6e 6f 74 20 61 73 73 6f 63  *   is not assoc
99d0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 65  iated with the e
99e0: 72 72 6f 72 20 72 75 6c 65 2e 20 20 49 66 20 6e  rror rule.  If n
99f0: 65 69 74 68 65 72 20 6f 72 20 62 6f 74 68 0a 2a  either or both.*
9a00: 2a 20 20 20 61 63 74 69 6f 6e 73 20 61 72 65 20  *   actions are 
9a10: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
9a20: 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2c 20 74  an error rule, t
9a30: 68 65 6e 20 74 72 79 20 74 6f 0a 2a 2a 20 20 20  hen try to.**   
9a40: 75 73 65 20 70 72 65 63 65 64 65 6e 63 65 20 74  use precedence t
9a50: 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 63 6f  o resolve the co
9a60: 6e 66 6c 69 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  nflict..**.** If
9a70: 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 20 69   either action i
9a80: 73 20 61 20 53 48 49 46 54 2c 20 74 68 65 6e 20  s a SHIFT, then 
9a90: 69 74 20 6d 75 73 74 20 62 65 20 61 70 78 2e 20  it must be apx. 
9aa0: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
9ab0: 6e 20 77 6f 6e 27 74 20 77 6f 72 6b 20 69 66 20  n won't work if 
9ac0: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43  apx->type==REDUC
9ad0: 45 20 61 6e 64 20 61 70 79 2d 3e 74 79 70 65 3d  E and apy->type=
9ae0: 3d 53 48 49 46 54 2e 0a 2a 2f 0a 73 74 61 74 69  =SHIFT..*/.stati
9af0: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f  c int resolve_co
9b00: 6e 66 6c 69 63 74 28 0a 20 20 73 74 72 75 63 74  nflict(.  struct
9b10: 20 61 63 74 69 6f 6e 20 2a 61 70 78 2c 0a 20 20   action *apx,.  
9b20: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
9b30: 70 79 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 73  py.){.  struct s
9b40: 79 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70 79  ymbol *spx, *spy
9b50: 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  ;.  int errcnt =
9b60: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70   0;.  assert( ap
9b70: 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20 29  x->sp==apy->sp )
9b80: 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  ;  /* Otherwise 
9b90: 74 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 6e  there would be n
9ba0: 6f 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  o conflict */.  
9bb0: 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53  if( apx->type==S
9bc0: 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70  HIFT && apy->typ
9bd0: 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20  e==SHIFT ){.    
9be0: 61 70 79 2d 3e 74 79 70 65 20 3d 20 53 53 43 4f  apy->type = SSCO
9bf0: 4e 46 4c 49 43 54 3b 0a 20 20 20 20 65 72 72 63  NFLICT;.    errc
9c00: 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nt++;.  }.  if( 
9c10: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54  apx->type==SHIFT
9c20: 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52   && apy->type==R
9c30: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78  EDUCE ){.    spx
9c40: 20 3d 20 61 70 78 2d 3e 73 70 3b 0a 20 20 20 20   = apx->sp;.    
9c50: 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d  spy = apy->x.rp-
9c60: 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66  >precsym;.    if
9c70: 28 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d  ( spy==0 || spx-
9c80: 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70 79 2d 3e  >prec<0 || spy->
9c90: 70 72 65 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  prec<0 ){.      
9ca0: 2f 2a 20 4e 6f 74 20 65 6e 6f 75 67 68 20 70 72  /* Not enough pr
9cb0: 65 63 65 64 65 6e 63 65 20 69 6e 66 6f 72 6d 61  ecedence informa
9cc0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  tion. */.      a
9cd0: 70 79 2d 3e 74 79 70 65 20 3d 20 53 52 43 4f 4e  py->type = SRCON
9ce0: 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72  FLICT;.      err
9cf0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  cnt++;.    }else
9d00: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73   if( spx->prec>s
9d10: 70 79 2d 3e 70 72 65 63 20 29 7b 20 20 20 20 2f  py->prec ){    /
9d20: 2a 20 68 69 67 68 65 72 20 70 72 65 63 65 64 65  * higher precede
9d30: 6e 63 65 20 77 69 6e 73 20 2a 2f 0a 20 20 20 20  nce wins */.    
9d40: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44    apy->type = RD
9d50: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
9d60: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
9d70: 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a  ec<spy->prec ){.
9d80: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20        apx->type 
9d90: 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = SH_RESOLVED;. 
9da0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78     }else if( spx
9db0: 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65  ->prec==spy->pre
9dc0: 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d  c && spx->assoc=
9dd0: 3d 52 49 47 48 54 20 29 7b 20 2f 2a 20 55 73 65  =RIGHT ){ /* Use
9de0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
9df0: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52     apy->type = R
9e00: 44 5f 52 45 53 4f 4c 56 45 44 3b 20 20 20 20 20  D_RESOLVED;     
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e20: 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 6f 63          /* assoc
9e30: 69 61 74 69 76 69 74 79 20 2a 2f 0a 20 20 20 20  iativity */.    
9e40: 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70  }else if( spx->p
9e50: 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26  rec==spy->prec &
9e60: 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4c 45  & spx->assoc==LE
9e70: 46 54 20 29 7b 20 20 2f 2a 20 74 6f 20 62 72 65  FT ){  /* to bre
9e80: 61 6b 20 74 69 65 20 2a 2f 0a 20 20 20 20 20 20  ak tie */.      
9e90: 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52  apx->type = SH_R
9ea0: 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c  ESOLVED;.    }el
9eb0: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
9ec0: 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  ( spx->prec==spy
9ed0: 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61  ->prec && spx->a
9ee0: 73 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a 20 20  ssoc==NONE );.  
9ef0: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20      apx->type = 
9f00: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
9f10: 65 6c 73 65 20 69 66 28 20 61 70 78 2d 3e 74 79  else if( apx->ty
9f20: 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70  pe==REDUCE && ap
9f30: 79 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  y->type==REDUCE 
9f40: 29 7b 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78  ){.    spx = apx
9f50: 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b  ->x.rp->precsym;
9f60: 0a 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e  .    spy = apy->
9f70: 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20  x.rp->precsym;. 
9f80: 20 20 20 69 66 28 20 73 70 78 3d 3d 30 20 7c 7c     if( spx==0 ||
9f90: 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e   spy==0 || spx->
9fa0: 70 72 65 63 3c 30 20 7c 7c 0a 20 20 20 20 73 70  prec<0 ||.    sp
9fb0: 79 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70 78  y->prec<0 || spx
9fc0: 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65  ->prec==spy->pre
9fd0: 63 20 29 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e  c ){.      apy->
9fe0: 74 79 70 65 20 3d 20 52 52 43 4f 4e 46 4c 49 43  type = RRCONFLIC
9ff0: 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74 2b  T;.      errcnt+
a000: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  +;.    }else if(
a010: 20 73 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e   spx->prec>spy->
a020: 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70  prec ){.      ap
a030: 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53  y->type = RD_RES
a040: 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  OLVED;.    }else
a050: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3c 73   if( spx->prec<s
a060: 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20  py->prec ){.    
a070: 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 52 44    apx->type = RD
a080: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
a090: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
a0a0: 73 65 72 74 28 20 0a 20 20 20 20 20 20 61 70 78  sert( .      apx
a0b0: 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c  ->type==SH_RESOL
a0c0: 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 78  VED ||.      apx
a0d0: 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c  ->type==RD_RESOL
a0e0: 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 78  VED ||.      apx
a0f0: 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49  ->type==SSCONFLI
a100: 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d  CT ||.      apx-
a110: 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43  >type==SRCONFLIC
a120: 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e  T ||.      apx->
a130: 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54  type==RRCONFLICT
a140: 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   ||.      apy->t
a150: 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44  ype==SH_RESOLVED
a160: 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   ||.      apy->t
a170: 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44  ype==RD_RESOLVED
a180: 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   ||.      apy->t
a190: 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49 43 54 20  ype==SSCONFLICT 
a1a0: 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  ||.      apy->ty
a1b0: 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43 54 20 7c  pe==SRCONFLICT |
a1c0: 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  |.      apy->typ
a1d0: 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54 0a 20 20  e==RRCONFLICT.  
a1e0: 20 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20    );.    /* The 
a1f0: 52 45 44 55 43 45 2f 53 48 49 46 54 20 63 61 73  REDUCE/SHIFT cas
a200: 65 20 63 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20  e cannot happen 
a210: 62 65 63 61 75 73 65 20 53 48 49 46 54 73 20 63  because SHIFTs c
a220: 6f 6d 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ome before.    *
a230: 2a 20 52 45 44 55 43 45 73 20 6f 6e 20 74 68 65  * REDUCEs on the
a240: 20 6c 69 73 74 2e 20 20 49 66 20 77 65 20 72 65   list.  If we re
a250: 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69  ach this point i
a260: 74 20 6d 75 73 74 20 62 65 20 62 65 63 61 75 73  t must be becaus
a270: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 72  e.    ** the par
a280: 73 65 72 20 63 6f 6e 66 6c 69 63 74 20 68 61 64  ser conflict had
a290: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65   already been re
a2a0: 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 7d 0a 20  solved. */.  }. 
a2b0: 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a   return errcnt;.
a2c0: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
a2d0: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
a2e0: 65 20 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69  e file "configli
a2f0: 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  st.c" **********
a300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
a310: 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20  ./*.** Routines 
a320: 74 6f 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  to processing a 
a330: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
a340: 73 74 20 61 6e 64 20 62 75 69 6c 64 69 6e 67 20  st and building 
a350: 61 20 73 74 61 74 65 0a 2a 2a 20 69 6e 20 74 68  a state.** in th
a360: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
a370: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74  enerator..*/..st
a380: 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66  atic struct conf
a390: 69 67 20 2a 66 72 65 65 6c 69 73 74 20 3d 20 30  ig *freelist = 0
a3a0: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
a3b0: 66 20 66 72 65 65 20 63 6f 6e 66 69 67 75 72 61  f free configura
a3c0: 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
a3d0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
a3e0: 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  urrent = 0;     
a3f0: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74    /* Top of list
a400: 20 6f 66 20 63 6f 6e 66 69 67 75 72 61 74 69 6f   of configuratio
a410: 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ns */.static str
a420: 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a 63 75 72  uct config **cur
a430: 72 65 6e 74 65 6e 64 20 3d 20 30 3b 20 20 20 2f  rentend = 0;   /
a440: 2a 20 4c 61 73 74 20 6f 6e 20 6c 69 73 74 20 6f  * Last on list o
a450: 66 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61  f configs */.sta
a460: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
a470: 67 20 2a 62 61 73 69 73 20 3d 20 30 3b 20 20 20  g *basis = 0;   
a480: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
a490: 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f  list of basis co
a4a0: 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74 69 63 20  nfigs */.static 
a4b0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a  struct config **
a4c0: 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 20 20 20  basisend = 0;   
a4d0: 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c 69 73 74    /* End of list
a4e0: 20 6f 66 20 62 61 73 69 73 20 63 6f 6e 66 69 67   of basis config
a4f0: 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  s */../* Return 
a500: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
a510: 65 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ew configuration
a520: 20 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75   */.PRIVATE stru
a530: 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 6f  ct config *newco
a540: 6e 66 69 67 28 29 7b 0a 20 20 73 74 72 75 63 74  nfig(){.  struct
a550: 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 67 3b   config *newcfg;
a560: 0a 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d  .  if( freelist=
a570: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
a580: 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 33  .    int amt = 3
a590: 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d  ;.    freelist =
a5a0: 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20   (struct config 
a5b0: 2a 29 63 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73  *)calloc( amt, s
a5c0: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 63 6f 6e  izeof(struct con
a5d0: 66 69 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20  fig) );.    if( 
a5e0: 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
a5f0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
a600: 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61  err,"Unable to a
a610: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
a620: 6f 72 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75  or a new configu
a630: 72 61 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20  ration.");.     
a640: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
a650: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
a660: 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c  mt-1; i++) freel
a670: 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66  ist[i].next = &f
a680: 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20  reelist[i+1];.  
a690: 20 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31    freelist[amt-1
a6a0: 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a  ].next = 0;.  }.
a6b0: 20 20 6e 65 77 63 66 67 20 3d 20 66 72 65 65 6c    newcfg = freel
a6c0: 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20  ist;.  freelist 
a6d0: 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74  = freelist->next
a6e0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 63 66  ;.  return newcf
a6f0: 67 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e  g;.}../* The con
a700: 66 69 67 75 72 61 74 69 6f 6e 20 22 6f 6c 64 22  figuration "old"
a710: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73   is no longer us
a720: 65 64 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  ed */.PRIVATE vo
a730: 69 64 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28  id deleteconfig(
a740: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f  struct config *o
a750: 6c 64 29 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78  ld).{.  old->nex
a760: 74 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20  t = freelist;.  
a770: 66 72 65 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a  freelist = old;.
a780: 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  }../* Initialize
a790: 64 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  d the configurat
a7a0: 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72  ion list builder
a7b0: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
a7c0: 69 73 74 5f 69 6e 69 74 28 29 7b 0a 20 20 63 75  ist_init(){.  cu
a7d0: 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72  rrent = 0;.  cur
a7e0: 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65  rentend = &curre
a7f0: 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b  nt;.  basis = 0;
a800: 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62  .  basisend = &b
a810: 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61  asis;.  Configta
a820: 62 6c 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72 65  ble_init();.  re
a830: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74  turn;.}../* Init
a840: 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66  ialized the conf
a850: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62  iguration list b
a860: 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43  uilder */.void C
a870: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28  onfiglist_reset(
a880: 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30  ){.  current = 0
a890: 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d  ;.  currentend =
a8a0: 20 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73   &current;.  bas
a8b0: 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65  is = 0;.  basise
a8c0: 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43  nd = &basis;.  C
a8d0: 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72  onfigtable_clear
a8e0: 28 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  (0);.  return;.}
a8f0: 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f 74 68 65 72  ../* Add another
a900: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74   configuration t
a910: 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  o the configurat
a920: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75  ion list */.stru
a930: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
a940: 67 6c 69 73 74 5f 61 64 64 28 0a 20 20 73 74 72  glist_add(.  str
a950: 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 20 20  uct rule *rp,   
a960: 20 2f 2a 20 54 68 65 20 72 75 6c 65 20 2a 2f 0a   /* The rule */.
a970: 20 20 69 6e 74 20 64 6f 74 20 20 20 20 20 20 20    int dot       
a980: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
a990: 6e 74 6f 20 74 68 65 20 52 48 53 20 6f 66 20 74  nto the RHS of t
a9a0: 68 65 20 72 75 6c 65 20 77 68 65 72 65 20 74 68  he rule where th
a9b0: 65 20 64 6f 74 20 67 6f 65 73 20 2a 2f 0a 29 7b  e dot goes */.){
a9c0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
a9d0: 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20   *cfp, model;.. 
a9e0: 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e 74   assert( current
a9f0: 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65  end!=0 );.  mode
aa00: 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64  l.rp = rp;.  mod
aa10: 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20  el.dot = dot;.  
aa20: 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c  cfp = Configtabl
aa30: 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a  e_find(&model);.
aa40: 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a    if( cfp==0 ){.
aa50: 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e      cfp = newcon
aa60: 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e  fig();.    cfp->
aa70: 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70  rp = rp;.    cfp
aa80: 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20  ->dot = dot;.   
aa90: 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e   cfp->fws = SetN
aaa0: 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73  ew();.    cfp->s
aab0: 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d  tp = 0;.    cfp-
aac0: 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c  >fplp = cfp->bpl
aad0: 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  p = 0;.    cfp->
aae0: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66  next = 0;.    cf
aaf0: 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a  p->bp = 0;.    *
ab00: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70  currentend = cfp
ab10: 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64  ;.    currentend
ab20: 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20   = &cfp->next;. 
ab30: 20 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69     Configtable_i
ab40: 6e 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a  nsert(cfp);.  }.
ab50: 20 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a    return cfp;.}.
ab60: 0a 2f 2a 20 41 64 64 20 61 20 62 61 73 69 73 20  ./* Add a basis 
ab70: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f  configuration to
ab80: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
ab90: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63  on list */.struc
aba0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
abb0: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 73 74  list_addbasis(st
abc0: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 69  ruct rule *rp, i
abd0: 6e 74 20 64 6f 74 29 0a 7b 0a 20 20 73 74 72 75  nt dot).{.  stru
abe0: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20  ct config *cfp, 
abf0: 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74  model;..  assert
ac00: 28 20 62 61 73 69 73 65 6e 64 21 3d 30 20 29 3b  ( basisend!=0 );
ac10: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65  .  assert( curre
ac20: 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f  ntend!=0 );.  mo
ac30: 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d  del.rp = rp;.  m
ac40: 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a  odel.dot = dot;.
ac50: 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61    cfp = Configta
ac60: 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29  ble_find(&model)
ac70: 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29  ;.  if( cfp==0 )
ac80: 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63  {.    cfp = newc
ac90: 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70  onfig();.    cfp
aca0: 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63  ->rp = rp;.    c
acb0: 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20  fp->dot = dot;. 
acc0: 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65     cfp->fws = Se
acd0: 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d  tNew();.    cfp-
ace0: 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66  >stp = 0;.    cf
acf0: 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62  p->fplp = cfp->b
ad00: 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  plp = 0;.    cfp
ad10: 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ->next = 0;.    
ad20: 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20  cfp->bp = 0;.   
ad30: 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63   *currentend = c
ad40: 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65  fp;.    currente
ad50: 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b  nd = &cfp->next;
ad60: 0a 20 20 20 20 2a 62 61 73 69 73 65 6e 64 20 3d  .    *basisend =
ad70: 20 63 66 70 3b 0a 20 20 20 20 62 61 73 69 73 65   cfp;.    basise
ad80: 6e 64 20 3d 20 26 63 66 70 2d 3e 62 70 3b 0a 20  nd = &cfp->bp;. 
ad90: 20 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69     Configtable_i
ada0: 6e 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a  nsert(cfp);.  }.
adb0: 20 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a    return cfp;.}.
adc0: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  ./* Compute the 
add0: 63 6c 6f 73 75 72 65 20 6f 66 20 74 68 65 20 63  closure of the c
ade0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
adf0: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
ae00: 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 73 74 72  list_closure(str
ae10: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
ae20: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
ae30: 69 67 20 2a 63 66 70 2c 20 2a 6e 65 77 63 66 70  ig *cfp, *newcfp
ae40: 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
ae50: 2a 72 70 2c 20 2a 6e 65 77 72 70 3b 0a 20 20 73  *rp, *newrp;.  s
ae60: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
ae70: 2c 20 2a 78 73 70 3b 0a 20 20 69 6e 74 20 69 2c  , *xsp;.  int i,
ae80: 20 64 6f 74 3b 0a 0a 20 20 61 73 73 65 72 74 28   dot;..  assert(
ae90: 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29   currentend!=0 )
aea0: 3b 0a 20 20 66 6f 72 28 63 66 70 3d 63 75 72 72  ;.  for(cfp=curr
aeb0: 65 6e 74 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  ent; cfp; cfp=cf
aec0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72 70  p->next){.    rp
aed0: 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 20 20   = cfp->rp;.    
aee0: 64 6f 74 20 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a  dot = cfp->dot;.
aef0: 20 20 20 20 69 66 28 20 64 6f 74 3e 3d 72 70 2d      if( dot>=rp-
af00: 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65  >nrhs ) continue
af10: 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72  ;.    sp = rp->r
af20: 68 73 5b 64 6f 74 5d 3b 0a 20 20 20 20 69 66 28  hs[dot];.    if(
af30: 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45   sp->type==NONTE
af40: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
af50: 69 66 28 20 73 70 2d 3e 72 75 6c 65 3d 3d 30 20  if( sp->rule==0 
af60: 26 26 20 73 70 21 3d 6c 65 6d 70 2d 3e 65 72 72  && sp!=lemp->err
af70: 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 45  sym ){.        E
af80: 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
af90: 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c  lename,rp->line,
afa0: 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c 22 25  "Nonterminal \"%
afb0: 73 5c 22 20 68 61 73 20 6e 6f 20 72 75 6c 65 73  s\" has no rules
afc0: 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73 70  .",.          sp
afd0: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
afe0: 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
aff0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
b000: 20 66 6f 72 28 6e 65 77 72 70 3d 73 70 2d 3e 72   for(newrp=sp->r
b010: 75 6c 65 3b 20 6e 65 77 72 70 3b 20 6e 65 77 72  ule; newrp; newr
b020: 70 3d 6e 65 77 72 70 2d 3e 6e 65 78 74 6c 68 73  p=newrp->nextlhs
b030: 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 63 66  ){.        newcf
b040: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61  p = Configlist_a
b050: 64 64 28 6e 65 77 72 70 2c 30 29 3b 0a 20 20 20  dd(newrp,0);.   
b060: 20 20 20 20 20 66 6f 72 28 69 3d 64 6f 74 2b 31       for(i=dot+1
b070: 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
b080: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 73  +){.          xs
b090: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  p = rp->rhs[i];.
b0a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73            if( xs
b0b0: 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
b0c0: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
b0d0: 20 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e   SetAdd(newcfp->
b0e0: 66 77 73 2c 78 73 70 2d 3e 69 6e 64 65 78 29 3b  fws,xsp->index);
b0f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
b100: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ak;.          }e
b110: 6c 73 65 20 69 66 28 20 78 73 70 2d 3e 74 79 70  lse if( xsp->typ
b120: 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
b130: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b140: 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
b150: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 78 73     for(k=0; k<xs
b160: 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29  p->nsubsym; k++)
b170: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b180: 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66  SetAdd(newcfp->f
b190: 77 73 2c 20 78 73 70 2d 3e 73 75 62 73 79 6d 5b  ws, xsp->subsym[
b1a0: 6b 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  k]->index);.    
b1b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b1c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b1d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
b1e0: 20 20 20 20 20 20 20 20 20 20 53 65 74 55 6e 69            SetUni
b1f0: 6f 6e 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78  on(newcfp->fws,x
b200: 73 70 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20  sp->firstset);. 
b210: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78             if( x
b220: 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f  sp->lambda==LEMO
b230: 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b  N_FALSE ) break;
b240: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b250: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
b260: 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29  f( i==rp->nrhs )
b270: 20 50 6c 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d   Plink_add(&cfp-
b280: 3e 66 70 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20  >fplp,newcfp);. 
b290: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b2a0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
b2b0: 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67   Sort the config
b2c0: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
b2d0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
b2e0: 73 6f 72 74 28 29 7b 0a 20 20 63 75 72 72 65 6e  sort(){.  curren
b2f0: 74 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  t = (struct conf
b300: 69 67 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72  ig *)msort((char
b310: 20 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72   *)current,(char
b320: 20 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 6e   **)&(current->n
b330: 65 78 74 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b  ext),Configcmp);
b340: 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20  .  currentend = 
b350: 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  0;.  return;.}..
b360: 2f 2a 20 53 6f 72 74 20 74 68 65 20 62 61 73 69  /* Sort the basi
b370: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
b380: 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  list */.void Con
b390: 66 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69  figlist_sortbasi
b3a0: 73 28 29 7b 0a 20 20 62 61 73 69 73 20 3d 20 28  s(){.  basis = (
b3b0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
b3c0: 6d 73 6f 72 74 28 28 63 68 61 72 20 2a 29 63 75  msort((char *)cu
b3d0: 72 72 65 6e 74 2c 28 63 68 61 72 20 2a 2a 29 26  rrent,(char **)&
b3e0: 28 63 75 72 72 65 6e 74 2d 3e 62 70 29 2c 43 6f  (current->bp),Co
b3f0: 6e 66 69 67 63 6d 70 29 3b 0a 20 20 62 61 73 69  nfigcmp);.  basi
b400: 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  send = 0;.  retu
b410: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  rn;.}../* Return
b420: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
b430: 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f  e head of the co
b440: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
b450: 20 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68   and.** reset th
b460: 65 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74  e list */.struct
b470: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
b480: 69 73 74 5f 72 65 74 75 72 6e 28 29 7b 0a 20 20  ist_return(){.  
b490: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f  struct config *o
b4a0: 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72  ld;.  old = curr
b4b0: 65 6e 74 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d  ent;.  current =
b4c0: 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64   0;.  currentend
b4d0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f   = 0;.  return o
b4e0: 6c 64 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  ld;.}../* Return
b4f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
b500: 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f  e head of the co
b510: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
b520: 20 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68   and.** reset th
b530: 65 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74  e list */.struct
b540: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
b550: 69 73 74 5f 62 61 73 69 73 28 29 7b 0a 20 20 73  ist_basis(){.  s
b560: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c  truct config *ol
b570: 64 3b 0a 20 20 6f 6c 64 20 3d 20 62 61 73 69 73  d;.  old = basis
b580: 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20  ;.  basis = 0;. 
b590: 20 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20   basisend = 0;. 
b5a0: 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a   return old;.}..
b5b0: 2f 2a 20 46 72 65 65 20 61 6c 6c 20 65 6c 65 6d  /* Free all elem
b5c0: 65 6e 74 73 20 6f 66 20 74 68 65 20 67 69 76 65  ents of the give
b5d0: 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  n configuration 
b5e0: 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  list */.void Con
b5f0: 66 69 67 6c 69 73 74 5f 65 61 74 28 73 74 72 75  figlist_eat(stru
b600: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a  ct config *cfp).
b610: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
b620: 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f  g *nextcfp;.  fo
b630: 72 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65 78  r(; cfp; cfp=nex
b640: 74 63 66 70 29 7b 0a 20 20 20 20 6e 65 78 74 63  tcfp){.    nextc
b650: 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a  fp = cfp->next;.
b660: 20 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d      assert( cfp-
b670: 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20  >fplp==0 );.    
b680: 61 73 73 65 72 74 28 20 63 66 70 2d 3e 62 70 6c  assert( cfp->bpl
b690: 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  p==0 );.    if( 
b6a0: 63 66 70 2d 3e 66 77 73 20 29 20 53 65 74 46 72  cfp->fws ) SetFr
b6b0: 65 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20  ee(cfp->fws);.  
b6c0: 20 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 63    deleteconfig(c
b6d0: 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fp);.  }.  retur
b6e0: 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n;.}./**********
b6f0: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
b700: 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 63 22 20   file "error.c" 
b710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b730: 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f  */./*.** Code fo
b740: 72 20 70 72 69 6e 74 69 6e 67 20 65 72 72 6f 72  r printing error
b750: 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 76 6f   message..*/..vo
b760: 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73  id ErrorMsg(cons
b770: 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65  t char *filename
b780: 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f  , int lineno, co
b790: 6e 73 74 20 63 68 61 72 20 2a 66 6f 72 6d 61 74  nst char *format
b7a0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
b7b0: 74 20 61 70 3b 0a 20 20 66 70 72 69 6e 74 66 28  t ap;.  fprintf(
b7c0: 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20  stderr, "%s:%d: 
b7d0: 22 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 6c 69 6e  ", filename, lin
b7e0: 65 6e 6f 29 3b 0a 20 20 76 61 5f 73 74 61 72 74  eno);.  va_start
b7f0: 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20  (ap, format);.  
b800: 76 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  vfprintf(stderr,
b810: 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76 61  format,ap);.  va
b820: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 70 72 69  _end(ap);.  fpri
b830: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22  ntf(stderr, "\n"
b840: 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}./**********
b850: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
b860: 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a 2a  file "main.c" **
b870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b890: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20 70  **/./*.** Main p
b8a0: 72 6f 67 72 61 6d 20 66 69 6c 65 20 66 6f 72 20  rogram file for 
b8b0: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
b8c0: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
b8d0: 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75 74  /* Report an out
b8e0: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69  -of-memory condi
b8f0: 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e 20  tion and abort. 
b900: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
b910: 2a 20 69 73 20 75 73 65 64 20 6d 6f 73 74 6c 79  * is used mostly
b920: 20 62 79 20 74 68 65 20 22 4d 65 6d 6f 72 79 43   by the "MemoryC
b930: 68 65 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20 73  heck" macro in s
b940: 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64 20  truct.h.*/.void 
b950: 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 7b 0a  memory_error(){.
b960: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
b970: 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  ,"Out of memory.
b980: 20 20 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e 22    Aborting...\n"
b990: 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a  );.  exit(1);.}.
b9a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 44 65 66  .static int nDef
b9b0: 69 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ine = 0;      /*
b9c0: 20 4e 75 6d 62 65 72 20 6f 66 20 2d 44 20 6f 70   Number of -D op
b9d0: 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 63 6f 6d  tions on the com
b9e0: 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 73 74 61  mand line */.sta
b9f0: 74 69 63 20 63 68 61 72 20 2a 2a 61 7a 44 65 66  tic char **azDef
ba00: 69 6e 65 20 3d 20 30 3b 20 20 2f 2a 20 4e 61 6d  ine = 0;  /* Nam
ba10: 65 20 6f 66 20 74 68 65 20 2d 44 20 6d 61 63 72  e of the -D macr
ba20: 6f 73 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20 72  os */../* This r
ba30: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
ba40: 20 77 69 74 68 20 74 68 65 20 61 72 67 75 6d 65   with the argume
ba50: 6e 74 20 74 6f 20 65 61 63 68 20 2d 44 20 63 6f  nt to each -D co
ba60: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
ba70: 6e 2e 0a 2a 2a 20 41 64 64 20 74 68 65 20 6d 61  n..** Add the ma
ba80: 63 72 6f 20 64 65 66 69 6e 65 64 20 74 6f 20 74  cro defined to t
ba90: 68 65 20 61 7a 44 65 66 69 6e 65 20 61 72 72 61  he azDefine arra
baa0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
bab0: 64 20 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f  d handle_D_optio
bac0: 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68  n(char *z){.  ch
bad0: 61 72 20 2a 2a 70 61 7a 3b 0a 20 20 6e 44 65 66  ar **paz;.  nDef
bae0: 69 6e 65 2b 2b 3b 0a 20 20 61 7a 44 65 66 69 6e  ine++;.  azDefin
baf0: 65 20 3d 20 28 63 68 61 72 20 2a 2a 29 20 72 65  e = (char **) re
bb00: 61 6c 6c 6f 63 28 61 7a 44 65 66 69 6e 65 2c 20  alloc(azDefine, 
bb10: 73 69 7a 65 6f 66 28 61 7a 44 65 66 69 6e 65 5b  sizeof(azDefine[
bb20: 30 5d 29 2a 6e 44 65 66 69 6e 65 29 3b 0a 20 20  0])*nDefine);.  
bb30: 69 66 28 20 61 7a 44 65 66 69 6e 65 3d 3d 30 20  if( azDefine==0 
bb40: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
bb50: 74 64 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65  tderr,"out of me
bb60: 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78  mory\n");.    ex
bb70: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 70 61 7a  it(1);.  }.  paz
bb80: 20 3d 20 26 61 7a 44 65 66 69 6e 65 5b 6e 44 65   = &azDefine[nDe
bb90: 66 69 6e 65 2d 31 5d 3b 0a 20 20 2a 70 61 7a 20  fine-1];.  *paz 
bba0: 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f  = (char *) mallo
bbb0: 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a  c( lemonStrlen(z
bbc0: 29 2b 31 20 29 3b 0a 20 20 69 66 28 20 2a 70 61  )+1 );.  if( *pa
bbd0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  z==0 ){.    fpri
bbe0: 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20  ntf(stderr,"out 
bbf0: 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  of memory\n");. 
bc00: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
bc10: 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 2a    lemon_strcpy(*
bc20: 70 61 7a 2c 20 7a 29 3b 0a 20 20 66 6f 72 28 7a  paz, z);.  for(z
bc30: 3d 2a 70 61 7a 3b 20 2a 7a 20 26 26 20 2a 7a 21  =*paz; *z && *z!
bc40: 3d 27 3d 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 2a  ='='; z++){}.  *
bc50: 7a 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  z = 0;.}..static
bc60: 20 63 68 61 72 20 2a 75 73 65 72 5f 74 65 6d 70   char *user_temp
bc70: 6c 61 74 65 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b  latename = NULL;
bc80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 6e  .static void han
bc90: 64 6c 65 5f 54 5f 6f 70 74 69 6f 6e 28 63 68 61  dle_T_option(cha
bca0: 72 20 2a 7a 29 7b 0a 20 20 75 73 65 72 5f 74 65  r *z){.  user_te
bcb0: 6d 70 6c 61 74 65 6e 61 6d 65 20 3d 20 28 63 68  mplatename = (ch
bcc0: 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65  ar *) malloc( le
bcd0: 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b 31 20 29  monStrlen(z)+1 )
bce0: 3b 0a 20 20 69 66 28 20 75 73 65 72 5f 74 65 6d  ;.  if( user_tem
bcf0: 70 6c 61 74 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  platename==0 ){.
bd00: 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72      memory_error
bd10: 28 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f  ();.  }.  lemon_
bd20: 73 74 72 63 70 79 28 75 73 65 72 5f 74 65 6d 70  strcpy(user_temp
bd30: 6c 61 74 65 6e 61 6d 65 2c 20 7a 29 3b 0a 7d 0a  latename, z);.}.
bd40: 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70 72 6f  ./* The main pro
bd50: 67 72 61 6d 2e 20 20 50 61 72 73 65 20 74 68 65  gram.  Parse the
bd60: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e   command line an
bd70: 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69 6e  d do it... */.in
bd80: 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c  t main(int argc,
bd90: 20 63 68 61 72 20 2a 2a 61 72 67 76 29 0a 7b 0a   char **argv).{.
bda0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 76 65 72    static int ver
bdb0: 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74  sion = 0;.  stat
bdc0: 69 63 20 69 6e 74 20 72 70 66 6c 61 67 20 3d 20  ic int rpflag = 
bdd0: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
bde0: 62 61 73 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20  basisflag = 0;. 
bdf0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d 70   static int comp
be00: 72 65 73 73 20 3d 20 30 3b 0a 20 20 73 74 61 74  ress = 0;.  stat
be10: 69 63 20 69 6e 74 20 71 75 69 65 74 20 3d 20 30  ic int quiet = 0
be20: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 73  ;.  static int s
be30: 74 61 74 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  tatistics = 0;. 
be40: 20 73 74 61 74 69 63 20 69 6e 74 20 6d 68 66 6c   static int mhfl
be50: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
be60: 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c   int nolinenosfl
be70: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
be80: 20 69 6e 74 20 6e 6f 52 65 73 6f 72 74 20 3d 20   int noResort = 
be90: 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  0;.  static stru
bea0: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70 74  ct s_options opt
beb0: 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  ions[] = {.    {
bec0: 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20 28  OPT_FLAG, "b", (
bed0: 63 68 61 72 2a 29 26 62 61 73 69 73 66 6c 61 67  char*)&basisflag
bee0: 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74 68  , "Print only th
bef0: 65 20 62 61 73 69 73 20 69 6e 20 72 65 70 6f 72  e basis in repor
bf00: 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  t."},.    {OPT_F
bf10: 4c 41 47 2c 20 22 63 22 2c 20 28 63 68 61 72 2a  LAG, "c", (char*
bf20: 29 26 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f 6e  )&compress, "Don
bf30: 27 74 20 63 6f 6d 70 72 65 73 73 20 74 68 65 20  't compress the 
bf40: 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c  action table."},
bf50: 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20  .    {OPT_FSTR, 
bf60: 22 44 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64  "D", (char*)hand
bf70: 6c 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22 44 65  le_D_option, "De
bf80: 66 69 6e 65 20 61 6e 20 25 69 66 64 65 66 20 6d  fine an %ifdef m
bf90: 61 63 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  acro."},.    {OP
bfa0: 54 5f 46 53 54 52 2c 20 22 66 22 2c 20 30 2c 20  T_FSTR, "f", 0, 
bfb0: 22 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63  "Ignored.  (Plac
bfc0: 65 68 6f 6c 64 65 72 20 66 6f 72 20 2d 66 20 63  eholder for -f c
bfd0: 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e  ompiler options.
bfe0: 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  )"},.    {OPT_FL
bff0: 41 47 2c 20 22 67 22 2c 20 28 63 68 61 72 2a 29  AG, "g", (char*)
c000: 26 72 70 66 6c 61 67 2c 20 22 50 72 69 6e 74 20  &rpflag, "Print 
c010: 67 72 61 6d 6d 61 72 20 77 69 74 68 6f 75 74 20  grammar without 
c020: 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20  actions."},.    
c030: 7b 4f 50 54 5f 46 53 54 52 2c 20 22 49 22 2c 20  {OPT_FSTR, "I", 
c040: 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20 20 28 50  0, "Ignored.  (P
c050: 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 27  laceholder for '
c060: 2d 49 27 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  -I' compiler opt
c070: 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f  ions.)"},.    {O
c080: 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63  PT_FLAG, "m", (c
c090: 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f  har*)&mhflag, "O
c0a0: 75 74 70 75 74 20 61 20 6d 61 6b 65 68 65 61 64  utput a makehead
c0b0: 65 72 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 66  ers compatible f
c0c0: 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ile."},.    {OPT
c0d0: 5f 46 4c 41 47 2c 20 22 6c 22 2c 20 28 63 68 61  _FLAG, "l", (cha
c0e0: 72 2a 29 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  r*)&nolinenosfla
c0f0: 67 2c 20 22 44 6f 20 6e 6f 74 20 70 72 69 6e 74  g, "Do not print
c100: 20 23 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e 74   #line statement
c110: 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  s."},.    {OPT_F
c120: 53 54 52 2c 20 22 4f 22 2c 20 30 2c 20 22 49 67  STR, "O", 0, "Ig
c130: 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63 65 68 6f  nored.  (Placeho
c140: 6c 64 65 72 20 66 6f 72 20 27 2d 4f 27 20 63 6f  lder for '-O' co
c150: 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29  mpiler options.)
c160: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
c170: 47 2c 20 22 70 22 2c 20 28 63 68 61 72 2a 29 26  G, "p", (char*)&
c180: 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f  showPrecedenceCo
c190: 6e 66 6c 69 63 74 2c 0a 20 20 20 20 20 20 20 20  nflict,.        
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 68 6f              "Sho
c1b0: 77 20 63 6f 6e 66 6c 69 63 74 73 20 72 65 73 6f  w conflicts reso
c1c0: 6c 76 65 64 20 62 79 20 70 72 65 63 65 64 65 6e  lved by preceden
c1d0: 63 65 20 72 75 6c 65 73 22 7d 2c 0a 20 20 20 20  ce rules"},.    
c1e0: 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20  {OPT_FLAG, "q", 
c1f0: 28 63 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22  (char*)&quiet, "
c200: 28 51 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72  (Quiet) Don't pr
c210: 69 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20 66  int the report f
c220: 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ile."},.    {OPT
c230: 5f 46 4c 41 47 2c 20 22 72 22 2c 20 28 63 68 61  _FLAG, "r", (cha
c240: 72 2a 29 26 6e 6f 52 65 73 6f 72 74 2c 20 22 44  r*)&noResort, "D
c250: 6f 20 6e 6f 74 20 73 6f 72 74 20 6f 72 20 72 65  o not sort or re
c260: 6e 75 6d 62 65 72 20 73 74 61 74 65 73 22 7d 2c  number states"},
c270: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
c280: 22 73 22 2c 20 28 63 68 61 72 2a 29 26 73 74 61  "s", (char*)&sta
c290: 74 69 73 74 69 63 73 2c 0a 20 20 20 20 20 20 20  tistics,.       
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 50 72 69              "Pri
c2c0: 6e 74 20 70 61 72 73 65 72 20 73 74 61 74 73 20  nt parser stats 
c2d0: 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70  to standard outp
c2e0: 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ut."},.    {OPT_
c2f0: 46 4c 41 47 2c 20 22 78 22 2c 20 28 63 68 61 72  FLAG, "x", (char
c300: 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22 50 72 69  *)&version, "Pri
c310: 6e 74 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  nt the version n
c320: 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f  umber."},.    {O
c330: 50 54 5f 46 53 54 52 2c 20 22 54 22 2c 20 28 63  PT_FSTR, "T", (c
c340: 68 61 72 2a 29 68 61 6e 64 6c 65 5f 54 5f 6f 70  har*)handle_T_op
c350: 74 69 6f 6e 2c 20 22 53 70 65 63 69 66 79 20 61  tion, "Specify a
c360: 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 2e 22   template file."
c370: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52  },.    {OPT_FSTR
c380: 2c 20 22 57 22 2c 20 30 2c 20 22 49 67 6e 6f 72  , "W", 0, "Ignor
c390: 65 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c 64 65  ed.  (Placeholde
c3a0: 72 20 66 6f 72 20 27 2d 57 27 20 63 6f 6d 70 69  r for '-W' compi
c3b0: 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22 7d 2c  ler options.)"},
c3c0: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 30  .    {OPT_FLAG,0
c3d0: 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  ,0,0}.  };.  int
c3e0: 20 69 3b 0a 20 20 69 6e 74 20 65 78 69 74 63 6f   i;.  int exitco
c3f0: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 6c 65 6d  de;.  struct lem
c400: 6f 6e 20 6c 65 6d 3b 0a 0a 20 20 4f 70 74 49 6e  on lem;..  OptIn
c410: 69 74 28 61 72 67 76 2c 6f 70 74 69 6f 6e 73 2c  it(argv,options,
c420: 73 74 64 65 72 72 29 3b 0a 20 20 69 66 28 20 76  stderr);.  if( v
c430: 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 70  ersion ){.     p
c440: 72 69 6e 74 66 28 22 4c 65 6d 6f 6e 20 76 65 72  rintf("Lemon ver
c450: 73 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b 0a 20 20  sion 1.0\n");.  
c460: 20 20 20 65 78 69 74 28 30 29 3b 20 0a 20 20 7d     exit(0); .  }
c470: 0a 20 20 69 66 28 20 4f 70 74 4e 41 72 67 73 28  .  if( OptNArgs(
c480: 29 21 3d 31 20 29 7b 0a 20 20 20 20 66 70 72 69  )!=1 ){.    fpri
c490: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 78 61 63  ntf(stderr,"Exac
c4a0: 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e 61 6d 65  tly one filename
c4b0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72 65 71   argument is req
c4c0: 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20  uired.\n");.    
c4d0: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d  exit(1);.  }.  m
c4e0: 65 6d 73 65 74 28 26 6c 65 6d 2c 20 30 2c 20 73  emset(&lem, 0, s
c4f0: 69 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a 20 20 6c  izeof(lem));.  l
c500: 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b  em.errorcnt = 0;
c510: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
c520: 65 20 74 68 65 20 6d 61 63 68 69 6e 65 20 2a 2f  e the machine */
c530: 0a 20 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28  .  Strsafe_init(
c540: 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e 69 74  );.  Symbol_init
c550: 28 29 3b 0a 20 20 53 74 61 74 65 5f 69 6e 69 74  ();.  State_init
c560: 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67 76 30 20  ();.  lem.argv0 
c570: 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6c 65 6d  = argv[0];.  lem
c580: 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f 70 74 41  .filename = OptA
c590: 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e 62 61 73  rg(0);.  lem.bas
c5a0: 69 73 66 6c 61 67 20 3d 20 62 61 73 69 73 66 6c  isflag = basisfl
c5b0: 61 67 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c 69 6e 65  ag;.  lem.noline
c5c0: 6e 6f 73 66 6c 61 67 20 3d 20 6e 6f 6c 69 6e 65  nosflag = noline
c5d0: 6e 6f 73 66 6c 61 67 3b 0a 20 20 53 79 6d 62 6f  nosflag;.  Symbo
c5e0: 6c 5f 6e 65 77 28 22 24 22 29 3b 0a 20 20 6c 65  l_new("$");.  le
c5f0: 6d 2e 65 72 72 73 79 6d 20 3d 20 53 79 6d 62 6f  m.errsym = Symbo
c600: 6c 5f 6e 65 77 28 22 65 72 72 6f 72 22 29 3b 0a  l_new("error");.
c610: 20 20 6c 65 6d 2e 65 72 72 73 79 6d 2d 3e 75 73    lem.errsym->us
c620: 65 43 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  eCnt = 0;..  /* 
c630: 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20  Parse the input 
c640: 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72 73 65 28  file */.  Parse(
c650: 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20 6c 65 6d  &lem);.  if( lem
c660: 2e 65 72 72 6f 72 63 6e 74 20 29 20 65 78 69 74  .errorcnt ) exit
c670: 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 29 3b 0a  (lem.errorcnt);.
c680: 20 20 69 66 28 20 6c 65 6d 2e 6e 72 75 6c 65 3d    if( lem.nrule=
c690: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
c6a0: 66 28 73 74 64 65 72 72 2c 22 45 6d 70 74 79 20  f(stderr,"Empty 
c6b0: 67 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20  grammar.\n");.  
c6c0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a    exit(1);.  }..
c6d0: 20 20 2f 2a 20 43 6f 75 6e 74 20 61 6e 64 20 69    /* Count and i
c6e0: 6e 64 65 78 20 74 68 65 20 73 79 6d 62 6f 6c 73  ndex the symbols
c6f0: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20   of the grammar 
c700: 2a 2f 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  */.  Symbol_new(
c710: 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20  "{default}");.  
c720: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53 79  lem.nsymbol = Sy
c730: 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20 20  mbol_count();.  
c740: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20 53 79  lem.symbols = Sy
c750: 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 3b 0a  mbol_arrayof();.
c760: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
c770: 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c  .nsymbol; i++) l
c780: 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69  em.symbols[i]->i
c790: 6e 64 65 78 20 3d 20 69 3b 0a 20 20 71 73 6f 72  ndex = i;.  qsor
c7a0: 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65  t(lem.symbols,le
c7b0: 6d 2e 6e 73 79 6d 62 6f 6c 2c 73 69 7a 65 6f 66  m.nsymbol,sizeof
c7c0: 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29  (struct symbol*)
c7d0: 2c 20 53 79 6d 62 6f 6c 63 6d 70 70 29 3b 0a 20  , Symbolcmpp);. 
c7e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 2e   for(i=0; i<lem.
c7f0: 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65  nsymbol; i++) le
c800: 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e  m.symbols[i]->in
c810: 64 65 78 20 3d 20 69 3b 0a 20 20 77 68 69 6c 65  dex = i;.  while
c820: 28 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 2d  ( lem.symbols[i-
c830: 31 5d 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54  1]->type==MULTIT
c840: 45 52 4d 49 4e 41 4c 20 29 7b 20 69 2d 2d 3b 20  ERMINAL ){ i--; 
c850: 7d 0a 20 20 61 73 73 65 72 74 28 20 73 74 72 63  }.  assert( strc
c860: 6d 70 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69  mp(lem.symbols[i
c870: 2d 31 5d 2d 3e 6e 61 6d 65 2c 22 7b 64 65 66 61  -1]->name,"{defa
c880: 75 6c 74 7d 22 29 3d 3d 30 20 29 3b 0a 20 20 6c  ult}")==0 );.  l
c890: 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 69 20 2d  em.nsymbol = i -
c8a0: 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   1;.  for(i=1; i
c8b0: 73 75 70 70 65 72 28 6c 65 6d 2e 73 79 6d 62 6f  supper(lem.symbo
c8c0: 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b  ls[i]->name[0]);
c8d0: 20 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65   i++);.  lem.nte
c8e0: 72 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f  rminal = i;..  /
c8f0: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 72 65 70  * Generate a rep
c900: 72 69 6e 74 20 6f 66 20 74 68 65 20 67 72 61 6d  rint of the gram
c910: 6d 61 72 2c 20 69 66 20 72 65 71 75 65 73 74 65  mar, if requeste
c920: 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  d on the command
c930: 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72   line */.  if( r
c940: 70 66 6c 61 67 20 29 7b 0a 20 20 20 20 52 65 70  pflag ){.    Rep
c950: 72 69 6e 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65  rint(&lem);.  }e
c960: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  lse{.    /* Init
c970: 69 61 6c 69 7a 65 20 74 68 65 20 73 69 7a 65 20  ialize the size 
c980: 66 6f 72 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61  for all follow a
c990: 6e 64 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f  nd first sets */
c9a0: 0a 20 20 20 20 53 65 74 53 69 7a 65 28 6c 65 6d  .    SetSize(lem
c9b0: 2e 6e 74 65 72 6d 69 6e 61 6c 2b 31 29 3b 0a 0a  .nterminal+1);..
c9c0: 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
c9d0: 70 72 65 63 65 64 65 6e 63 65 20 66 6f 72 20 65  precedence for e
c9e0: 76 65 72 79 20 70 72 6f 64 75 63 74 69 6f 6e 20  very production 
c9f0: 72 75 6c 65 20 28 74 68 61 74 20 68 61 73 20 6f  rule (that has o
ca00: 6e 65 29 20 2a 2f 0a 20 20 20 20 46 69 6e 64 52  ne) */.    FindR
ca10: 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28 26  ulePrecedences(&
ca20: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
ca30: 6d 70 75 74 65 20 74 68 65 20 6c 61 6d 62 64 61  mpute the lambda
ca40: 2d 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 61 6e  -nonterminals an
ca50: 64 20 74 68 65 20 66 69 72 73 74 2d 73 65 74 73  d the first-sets
ca60: 20 66 6f 72 20 65 76 65 72 79 0a 20 20 20 20 2a   for every.    *
ca70: 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f  * nonterminal */
ca80: 0a 20 20 20 20 46 69 6e 64 46 69 72 73 74 53 65  .    FindFirstSe
ca90: 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  ts(&lem);..    /
caa0: 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52  * Compute all LR
cab0: 28 30 29 20 73 74 61 74 65 73 2e 20 20 41 6c 73  (0) states.  Als
cac0: 6f 20 72 65 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d  o record follow-
cad0: 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 0a  set propagation.
cae0: 20 20 20 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20      ** links so 
caf0: 74 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 2d  that the follow-
cb00: 73 65 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 75  set can be compu
cb10: 74 65 64 20 6c 61 74 65 72 20 2a 2f 0a 20 20 20  ted later */.   
cb20: 20 6c 65 6d 2e 6e 73 74 61 74 65 20 3d 20 30 3b   lem.nstate = 0;
cb30: 0a 20 20 20 20 46 69 6e 64 53 74 61 74 65 73 28  .    FindStates(
cb40: 26 6c 65 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e 73  &lem);.    lem.s
cb50: 6f 72 74 65 64 20 3d 20 53 74 61 74 65 5f 61 72  orted = State_ar
cb60: 72 61 79 6f 66 28 29 3b 0a 0a 20 20 20 20 2f 2a  rayof();..    /*
cb70: 20 54 69 65 20 75 70 20 6c 6f 6f 73 65 20 65 6e   Tie up loose en
cb80: 64 73 20 6f 6e 20 74 68 65 20 70 72 6f 70 61 67  ds on the propag
cb90: 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20  ation links */. 
cba0: 20 20 20 46 69 6e 64 4c 69 6e 6b 73 28 26 6c 65     FindLinks(&le
cbb0: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
cbc0: 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 20 73  ute the follow s
cbd0: 65 74 20 6f 66 20 65 76 65 72 79 20 72 65 64 75  et of every redu
cbe0: 63 69 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74  cible configurat
cbf0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46  ion */.    FindF
cc00: 6f 6c 6c 6f 77 53 65 74 73 28 26 6c 65 6d 29 3b  ollowSets(&lem);
cc10: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
cc20: 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
cc30: 65 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64 41 63  es */.    FindAc
cc40: 74 69 6f 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  tions(&lem);..  
cc50: 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 20 74 68    /* Compress th
cc60: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20  e action tables 
cc70: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 6d 70 72  */.    if( compr
cc80: 65 73 73 3d 3d 30 20 29 20 43 6f 6d 70 72 65 73  ess==0 ) Compres
cc90: 73 54 61 62 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a  sTables(&lem);..
cca0: 20 20 20 20 2f 2a 20 52 65 6f 72 64 65 72 20 61      /* Reorder a
ccb0: 6e 64 20 72 65 6e 75 6d 62 65 72 20 74 68 65 20  nd renumber the 
ccc0: 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 73  states so that s
ccd0: 74 61 74 65 73 20 77 69 74 68 20 66 65 77 65 72  tates with fewer
cce0: 20 63 68 6f 69 63 65 73 0a 20 20 20 20 2a 2a 20   choices.    ** 
ccf0: 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64  occur at the end
cd00: 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  .  This is an op
cd10: 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74 20  timization that 
cd20: 68 65 6c 70 73 20 6d 61 6b 65 20 74 68 65 0a 20  helps make the. 
cd30: 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20     ** generated 
cd40: 70 61 72 73 65 72 20 74 61 62 6c 65 73 20 73 6d  parser tables sm
cd50: 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 69 66  aller. */.    if
cd60: 28 20 6e 6f 52 65 73 6f 72 74 3d 3d 30 20 29 20  ( noResort==0 ) 
cd70: 52 65 73 6f 72 74 53 74 61 74 65 73 28 26 6c 65  ResortStates(&le
cd80: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  m);..    /* Gene
cd90: 72 61 74 65 20 61 20 72 65 70 6f 72 74 20 6f 66  rate a report of
cda0: 20 74 68 65 20 70 61 72 73 65 72 20 67 65 6e 65   the parser gene
cdb0: 72 61 74 65 64 2e 20 20 28 74 68 65 20 22 79 2e  rated.  (the "y.
cdc0: 6f 75 74 70 75 74 22 20 66 69 6c 65 29 20 2a 2f  output" file) */
cdd0: 0a 20 20 20 20 69 66 28 20 21 71 75 69 65 74 20  .    if( !quiet 
cde0: 29 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 26  ) ReportOutput(&
cdf0: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  lem);..    /* Ge
ce00: 6e 65 72 61 74 65 20 74 68 65 20 73 6f 75 72 63  nerate the sourc
ce10: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70  e code for the p
ce20: 61 72 73 65 72 20 2a 2f 0a 20 20 20 20 52 65 70  arser */.    Rep
ce30: 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d 2c 20 6d  ortTable(&lem, m
ce40: 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  hflag);..    /* 
ce50: 50 72 6f 64 75 63 65 20 61 20 68 65 61 64 65 72  Produce a header
ce60: 20 66 69 6c 65 20 66 6f 72 20 75 73 65 20 62 79   file for use by
ce70: 20 74 68 65 20 73 63 61 6e 6e 65 72 2e 20 20 28   the scanner.  (
ce80: 54 68 69 73 20 73 74 65 70 20 69 73 0a 20 20 20  This step is.   
ce90: 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74   ** omitted if t
cea0: 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20 69  he "-m" option i
ceb0: 73 20 75 73 65 64 20 62 65 63 61 75 73 65 20 6d  s used because m
cec0: 61 6b 65 68 65 61 64 65 72 73 20 77 69 6c 6c 0a  akeheaders will.
ced0: 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 20      ** generate 
cee0: 74 68 65 20 66 69 6c 65 20 66 6f 72 20 75 73 2e  the file for us.
cef0: 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 6d 68  ) */.    if( !mh
cf00: 66 6c 61 67 20 29 20 52 65 70 6f 72 74 48 65 61  flag ) ReportHea
cf10: 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20  der(&lem);.  }. 
cf20: 20 69 66 28 20 73 74 61 74 69 73 74 69 63 73 20   if( statistics 
cf30: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50  ){.    printf("P
cf40: 61 72 73 65 72 20 73 74 61 74 69 73 74 69 63 73  arser statistics
cf50: 3a 20 25 64 20 74 65 72 6d 69 6e 61 6c 73 2c 20  : %d terminals, 
cf60: 25 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2c  %d nonterminals,
cf70: 20 25 64 20 72 75 6c 65 73 5c 6e 22 2c 0a 20 20   %d rules\n",.  
cf80: 20 20 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61      lem.ntermina
cf90: 6c 2c 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d  l, lem.nsymbol -
cfa0: 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c 20   lem.nterminal, 
cfb0: 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20 20 20  lem.nrule);.    
cfc0: 70 72 69 6e 74 66 28 22 20 20 20 20 20 20 20 20  printf("        
cfd0: 20 20 20 20 20 20 20 20 20 20 20 25 64 20 73 74             %d st
cfe0: 61 74 65 73 2c 20 25 64 20 70 61 72 73 65 72 20  ates, %d parser 
cff0: 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2c 20 25  table entries, %
d000: 64 20 63 6f 6e 66 6c 69 63 74 73 5c 6e 22 2c 0a  d conflicts\n",.
d010: 20 20 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65        lem.nstate
d020: 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a 65 2c  , lem.tablesize,
d030: 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b   lem.nconflict);
d040: 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 2e 6e  .  }.  if( lem.n
d050: 63 6f 6e 66 6c 69 63 74 20 3e 20 30 20 29 7b 0a  conflict > 0 ){.
d060: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
d070: 72 72 2c 22 25 64 20 70 61 72 73 69 6e 67 20 63  rr,"%d parsing c
d080: 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c 65 6d  onflicts.\n",lem
d090: 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d  .nconflict);.  }
d0a0: 0a 0a 20 20 2f 2a 20 72 65 74 75 72 6e 20 30 20  ..  /* return 0 
d0b0: 6f 6e 20 73 75 63 63 65 73 73 2c 20 31 20 6f 6e  on success, 1 on
d0c0: 20 66 61 69 6c 75 72 65 2e 20 2a 2f 0a 20 20 65   failure. */.  e
d0d0: 78 69 74 63 6f 64 65 20 3d 20 28 28 6c 65 6d 2e  xitcode = ((lem.
d0e0: 65 72 72 6f 72 63 6e 74 20 3e 20 30 29 20 7c 7c  errorcnt > 0) ||
d0f0: 20 28 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20   (lem.nconflict 
d100: 3e 20 30 29 29 20 3f 20 31 20 3a 20 30 3b 0a 20  > 0)) ? 1 : 0;. 
d110: 20 65 78 69 74 28 65 78 69 74 63 6f 64 65 29 3b   exit(exitcode);
d120: 0a 20 20 72 65 74 75 72 6e 20 28 65 78 69 74 63  .  return (exitc
d130: 6f 64 65 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ode);.}./*******
d140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
d150: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6d 73 6f  om the file "mso
d160: 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rt.c" **********
d170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d180: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 67  *****/./*.** A g
d190: 65 6e 65 72 69 63 20 6d 65 72 67 65 2d 73 6f 72  eneric merge-sor
d1a0: 74 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  t program..**.**
d1b0: 20 55 53 41 47 45 3a 0a 2a 2a 20 4c 65 74 20 22   USAGE:.** Let "
d1c0: 70 74 72 22 20 62 65 20 61 20 70 6f 69 6e 74 65  ptr" be a pointe
d1d0: 72 20 74 6f 20 73 6f 6d 65 20 73 74 72 75 63 74  r to some struct
d1e0: 75 72 65 20 77 68 69 63 68 20 69 73 20 61 74 20  ure which is at 
d1f0: 74 68 65 20 68 65 61 64 20 6f 66 0a 2a 2a 20 61  the head of.** a
d200: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
d210: 20 6c 69 73 74 2e 20 20 54 68 65 6e 20 74 6f 20   list.  Then to 
d220: 73 6f 72 74 20 74 68 65 20 6c 69 73 74 20 63 61  sort the list ca
d230: 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 74  ll:.**.**     pt
d240: 72 20 3d 20 6d 73 6f 72 74 28 70 74 72 2c 26 28  r = msort(ptr,&(
d250: 70 74 72 2d 3e 6e 65 78 74 29 2c 63 6d 70 66 6e  ptr->next),cmpfn
d260: 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  c);.**.** In the
d270: 20 61 62 6f 76 65 2c 20 22 63 6d 70 66 6e 63 22   above, "cmpfnc"
d280: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
d290: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 63   a function whic
d2a0: 68 20 63 6f 6d 70 61 72 65 73 0a 2a 2a 20 74 77  h compares.** tw
d2b0: 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  o instances of t
d2c0: 68 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  he structure and
d2d0: 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65   returns an inte
d2e0: 67 65 72 2c 20 61 73 20 69 6e 0a 2a 2a 20 73 74  ger, as in.** st
d2f0: 72 63 6d 70 2e 20 20 54 68 65 20 73 65 63 6f 6e  rcmp.  The secon
d300: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  d argument is a 
d310: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
d320: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a  ointer to the.**
d330: 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20   second element 
d340: 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  of the linked li
d350: 73 74 2e 20 20 54 68 69 73 20 61 64 64 72 65 73  st.  This addres
d360: 73 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  s is used to com
d370: 70 75 74 65 0a 2a 2a 20 74 68 65 20 6f 66 66 73  pute.** the offs
d380: 65 74 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22  et to the "next"
d390: 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68   field within th
d3a0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
d3b0: 65 20 6f 66 66 73 65 74 20 74 6f 0a 2a 2a 20 74  e offset to.** t
d3c0: 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64 20  he "next" field 
d3d0: 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74  must be constant
d3e0: 20 66 6f 72 20 61 6c 6c 20 73 74 72 75 63 74 75   for all structu
d3f0: 72 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  res in the list.
d400: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74  .**.** The funct
d410: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 6e 65  ion returns a ne
d420: 77 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20  w pointer which 
d430: 69 73 20 74 68 65 20 68 65 61 64 20 6f 66 20 74  is the head of t
d440: 68 65 20 6c 69 73 74 0a 2a 2a 20 61 66 74 65 72  he list.** after
d450: 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   sorting..**.** 
d460: 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a 20 4d 65  ALGORITHM:.** Me
d470: 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f 2a  rge-sort..*/../*
d480: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
d490: 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74  nter to the next
d4a0: 20 73 74 72 75 63 74 75 72 65 20 69 6e 20 74 68   structure in th
d4b0: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a  e linked list..*
d4c0: 2f 0a 23 64 65 66 69 6e 65 20 4e 45 58 54 28 41  /.#define NEXT(A
d4d0: 29 20 28 2a 28 63 68 61 72 2a 2a 29 28 28 28 63  ) (*(char**)(((c
d4e0: 68 61 72 2a 29 41 29 2b 6f 66 66 73 65 74 29 29  har*)A)+offset))
d4f0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a  ../*.** Inputs:.
d500: 2a 2a 20 20 20 61 3a 20 20 20 20 20 20 20 41 20  **   a:       A 
d510: 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72  sorted, null-ter
d520: 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c  minated linked l
d530: 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75  ist.  (May be nu
d540: 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a 20 20 20 20  ll)..**   b:    
d550: 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c     A sorted, nul
d560: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e  l-terminated lin
d570: 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20  ked list.  (May 
d580: 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63  be null)..**   c
d590: 6d 70 3a 20 20 20 20 20 41 20 70 6f 69 6e 74 65  mp:     A pointe
d5a0: 72 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  r to the compari
d5b0: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  son function..**
d5c0: 20 20 20 6f 66 66 73 65 74 3a 20 20 4f 66 66 73     offset:  Offs
d5d0: 65 74 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  et in the struct
d5e0: 75 72 65 20 74 6f 20 74 68 65 20 22 6e 65 78 74  ure to the "next
d5f0: 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52  " field..**.** R
d600: 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20  eturn Value:.** 
d610: 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74    A pointer to t
d620: 68 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72  he head of a sor
d630: 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ted list contain
d640: 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73  ing the elements
d650: 0a 2a 2a 20 20 20 6f 66 20 62 6f 74 68 20 61 20  .**   of both a 
d660: 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64  and b..**.** Sid
d670: 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20  e effects:.**   
d680: 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74  The "next" point
d690: 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73  ers for elements
d6a0: 20 69 6e 20 74 68 65 20 6c 69 73 74 73 20 61 20   in the lists a 
d6b0: 61 6e 64 20 62 20 61 72 65 0a 2a 2a 20 20 20 63  and b are.**   c
d6c0: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  hanged..*/.stati
d6d0: 63 20 63 68 61 72 20 2a 6d 65 72 67 65 28 0a 20  c char *merge(. 
d6e0: 20 63 68 61 72 20 2a 61 2c 0a 20 20 63 68 61 72   char *a,.  char
d6f0: 20 2a 62 2c 0a 20 20 69 6e 74 20 28 2a 63 6d 70   *b,.  int (*cmp
d700: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
d710: 6e 73 74 20 63 68 61 72 2a 29 2c 0a 20 20 69 6e  nst char*),.  in
d720: 74 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 63 68  t offset.){.  ch
d730: 61 72 20 2a 70 74 72 2c 20 2a 68 65 61 64 3b 0a  ar *ptr, *head;.
d740: 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20  .  if( a==0 ){. 
d750: 20 20 20 68 65 61 64 20 3d 20 62 3b 0a 20 20 7d     head = b;.  }
d760: 65 6c 73 65 20 69 66 28 20 62 3d 3d 30 20 29 7b  else if( b==0 ){
d770: 0a 20 20 20 20 68 65 61 64 20 3d 20 61 3b 0a 20  .    head = a;. 
d780: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
d790: 28 2a 63 6d 70 29 28 61 2c 62 29 3c 3d 30 20 29  (*cmp)(a,b)<=0 )
d7a0: 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b  {.      ptr = a;
d7b0: 0a 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28  .      a = NEXT(
d7c0: 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  a);.    }else{. 
d7d0: 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20       ptr = b;.  
d7e0: 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b      b = NEXT(b);
d7f0: 0a 20 20 20 20 7d 0a 20 20 20 20 68 65 61 64 20  .    }.    head 
d800: 3d 20 70 74 72 3b 0a 20 20 20 20 77 68 69 6c 65  = ptr;.    while
d810: 28 20 61 20 26 26 20 62 20 29 7b 0a 20 20 20 20  ( a && b ){.    
d820: 20 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62    if( (*cmp)(a,b
d830: 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )<=0 ){.        
d840: 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20  NEXT(ptr) = a;. 
d850: 20 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a         ptr = a;.
d860: 20 20 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54          a = NEXT
d870: 28 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  (a);.      }else
d880: 7b 0a 20 20 20 20 20 20 20 20 4e 45 58 54 28 70  {.        NEXT(p
d890: 74 72 29 20 3d 20 62 3b 0a 20 20 20 20 20 20 20  tr) = b;.       
d8a0: 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20 20 20   ptr = b;.      
d8b0: 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20    b = NEXT(b);. 
d8c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
d8d0: 20 69 66 28 20 61 20 29 20 4e 45 58 54 28 70 74   if( a ) NEXT(pt
d8e0: 72 29 20 3d 20 61 3b 0a 20 20 20 20 65 6c 73 65  r) = a;.    else
d8f0: 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20      NEXT(ptr) = 
d900: 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  b;.  }.  return 
d910: 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  head;.}../*.** I
d920: 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c 69 73 74  nputs:.**   list
d930: 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74  :      Pointer t
d940: 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69 6e 6b 65  o a singly-linke
d950: 64 20 6c 69 73 74 20 6f 66 20 73 74 72 75 63 74  d list of struct
d960: 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65 78 74 3a  ures..**   next:
d970: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
d980: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
d990: 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f  second element o
d9a0: 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 20 20  f the list..**  
d9b0: 20 63 6d 70 3a 20 20 20 20 20 20 20 41 20 63 6f   cmp:       A co
d9c0: 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
d9d0: 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  n..**.** Return 
d9e0: 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f  Value:.**   A po
d9f0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
da00: 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20 6c 69  d of a sorted li
da10: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  st containing th
da20: 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  e elements.**   
da30: 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20 6c 69 73  orginally in lis
da40: 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66  t..**.** Side ef
da50: 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20  fects:.**   The 
da60: 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20  "next" pointers 
da70: 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  for elements in 
da80: 6c 69 73 74 20 61 72 65 20 63 68 61 6e 67 65 64  list are changed
da90: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 49 53  ..*/.#define LIS
daa0: 54 53 49 5a 45 20 33 30 0a 73 74 61 74 69 63 20  TSIZE 30.static 
dab0: 63 68 61 72 20 2a 6d 73 6f 72 74 28 0a 20 20 63  char *msort(.  c
dac0: 68 61 72 20 2a 6c 69 73 74 2c 0a 20 20 63 68 61  har *list,.  cha
dad0: 72 20 2a 2a 6e 65 78 74 2c 0a 20 20 69 6e 74 20  r **next,.  int 
dae0: 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61  (*cmp)(const cha
daf0: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a  r*,const char*).
db00: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ){.  unsigned lo
db10: 6e 67 20 6f 66 66 73 65 74 3b 0a 20 20 63 68 61  ng offset;.  cha
db20: 72 20 2a 65 70 3b 0a 20 20 63 68 61 72 20 2a 73  r *ep;.  char *s
db30: 65 74 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a 20 20  et[LISTSIZE];.  
db40: 69 6e 74 20 69 3b 0a 20 20 6f 66 66 73 65 74 20  int i;.  offset 
db50: 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  = (unsigned long
db60: 29 6e 65 78 74 20 2d 20 28 75 6e 73 69 67 6e 65  )next - (unsigne
db70: 64 20 6c 6f 6e 67 29 6c 69 73 74 3b 0a 20 20 66  d long)list;.  f
db80: 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49  or(i=0; i<LISTSI
db90: 5a 45 3b 20 69 2b 2b 29 20 73 65 74 5b 69 5d 20  ZE; i++) set[i] 
dba0: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 6c 69  = 0;.  while( li
dbb0: 73 74 20 29 7b 0a 20 20 20 20 65 70 20 3d 20 6c  st ){.    ep = l
dbc0: 69 73 74 3b 0a 20 20 20 20 6c 69 73 74 20 3d 20  ist;.    list = 
dbd0: 4e 45 58 54 28 6c 69 73 74 29 3b 0a 20 20 20 20  NEXT(list);.    
dbe0: 4e 45 58 54 28 65 70 29 20 3d 20 30 3b 0a 20 20  NEXT(ep) = 0;.  
dbf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53    for(i=0; i<LIS
dc00: 54 53 49 5a 45 2d 31 20 26 26 20 73 65 74 5b 69  TSIZE-1 && set[i
dc10: 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ]!=0; i++){.    
dc20: 20 20 65 70 20 3d 20 6d 65 72 67 65 28 65 70 2c    ep = merge(ep,
dc30: 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65  set[i],cmp,offse
dc40: 74 29 3b 0a 20 20 20 20 20 20 73 65 74 5b 69 5d  t);.      set[i]
dc50: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
dc60: 73 65 74 5b 69 5d 20 3d 20 65 70 3b 0a 20 20 7d  set[i] = ep;.  }
dc70: 0a 20 20 65 70 20 3d 20 30 3b 0a 20 20 66 6f 72  .  ep = 0;.  for
dc80: 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45  (i=0; i<LISTSIZE
dc90: 3b 20 69 2b 2b 29 20 69 66 28 20 73 65 74 5b 69  ; i++) if( set[i
dca0: 5d 20 29 20 65 70 20 3d 20 6d 65 72 67 65 28 73  ] ) ep = merge(s
dcb0: 65 74 5b 69 5d 2c 65 70 2c 63 6d 70 2c 6f 66 66  et[i],ep,cmp,off
dcc0: 73 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 65  set);.  return e
dcd0: 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  p;.}./**********
dce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
dcf0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70  rom the file "op
dd00: 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  tion.c" ********
dd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dd20: 2a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  **/.static char 
dd30: 2a 2a 61 72 67 76 3b 0a 73 74 61 74 69 63 20 73  **argv;.static s
dd40: 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20  truct s_options 
dd50: 2a 6f 70 3b 0a 73 74 61 74 69 63 20 46 49 4c 45  *op;.static FILE
dd60: 20 2a 65 72 72 73 74 72 65 61 6d 3b 0a 0a 23 64   *errstream;..#d
dd70: 65 66 69 6e 65 20 49 53 4f 50 54 28 58 29 20 28  efine ISOPT(X) (
dd80: 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58 29  (X)[0]=='-'||(X)
dd90: 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63 68 72  [0]=='+'||strchr
dda0: 28 28 58 29 2c 27 3d 27 29 21 3d 30 29 0a 0a 2f  ((X),'=')!=0)../
ddb0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63  *.** Print the c
ddc0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 69 74 68  ommand line with
ddd0: 20 61 20 63 61 72 72 6f 74 20 70 6f 69 6e 74 69   a carrot pointi
dde0: 6e 67 20 74 6f 20 74 68 65 20 6b 2d 74 68 20 63  ng to the k-th c
ddf0: 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 74  haracter.** of t
de00: 68 65 20 6e 2d 74 68 20 66 69 65 6c 64 2e 0a 2a  he n-th field..*
de10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 72  /.static void er
de20: 72 6c 69 6e 65 28 69 6e 74 20 6e 2c 20 69 6e 74  rline(int n, int
de30: 20 6b 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b   k, FILE *err).{
de40: 0a 20 20 69 6e 74 20 73 70 63 6e 74 2c 20 69 3b  .  int spcnt, i;
de50: 0a 20 20 69 66 28 20 61 72 67 76 5b 30 5d 20 29  .  if( argv[0] )
de60: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
de70: 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 70  ",argv[0]);.  sp
de80: 63 6e 74 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  cnt = lemonStrle
de90: 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a  n(argv[0]) + 1;.
dea0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26    for(i=1; i<n &
deb0: 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b  & argv[i]; i++){
dec0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
ded0: 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b  ," %s",argv[i]);
dee0: 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d 20 6c 65  .    spcnt += le
def0: 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76 5b 69  monStrlen(argv[i
df00: 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20 73 70 63 6e  ])+1;.  }.  spcn
df10: 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b 20  t += k;.  for(; 
df20: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 20 66 70  argv[i]; i++) fp
df30: 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22 2c  rintf(err," %s",
df40: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 69 66 28 20  argv[i]);.  if( 
df50: 73 70 63 6e 74 3c 32 30 20 29 7b 0a 20 20 20 20  spcnt<20 ){.    
df60: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25  fprintf(err,"\n%
df70: 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c 73 70  *s^-- here\n",sp
df80: 63 6e 74 2c 22 22 29 3b 0a 20 20 7d 65 6c 73 65  cnt,"");.  }else
df90: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72  {.    fprintf(er
dfa0: 72 2c 22 5c 6e 25 2a 73 68 65 72 65 20 2d 2d 5e  r,"\n%*shere --^
dfb0: 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c 22 22 29 3b  \n",spcnt-7,"");
dfc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
dfd0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
dfe0: 66 20 74 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d 73  f the N-th non-s
dff0: 77 69 74 63 68 20 61 72 67 75 6d 65 6e 74 2e 20  witch argument. 
e000: 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
e010: 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   N is out of ran
e020: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
e030: 74 20 61 72 67 69 6e 64 65 78 28 69 6e 74 20 6e  t argindex(int n
e040: 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ).{.  int i;.  i
e050: 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b  nt dashdash = 0;
e060: 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26  .  if( argv!=0 &
e070: 26 20 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20 20  & *argv!=0 ){.  
e080: 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b    for(i=1; argv[
e090: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
e0a0: 69 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20  if( dashdash || 
e0b0: 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20  !ISOPT(argv[i]) 
e0c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
e0d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
e0e0: 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20          n--;.   
e0f0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
e100: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d  trcmp(argv[i],"-
e110: 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73  -")==0 ) dashdas
e120: 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  h = 1;.    }.  }
e130: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
e140: 0a 73 74 61 74 69 63 20 63 68 61 72 20 65 6d 73  .static char ems
e150: 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c  g[] = "Command l
e160: 69 6e 65 20 73 79 6e 74 61 78 20 65 72 72 6f 72  ine syntax error
e170: 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  : ";../*.** Proc
e180: 65 73 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d 61  ess a flag comma
e190: 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd line argument
e1a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e1b0: 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 6e 74 20  handleflags(int 
e1c0: 69 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a  i, FILE *err).{.
e1d0: 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e 74 20 65    int v;.  int e
e1e0: 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  rrcnt = 0;.  int
e1f0: 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f   j;.  for(j=0; o
e200: 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29  p[j].label; j++)
e210: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  {.    if( strncm
e220: 70 28 26 61 72 67 76 5b 69 5d 5b 31 5d 2c 6f 70  p(&argv[i][1],op
e230: 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c 65 6d 6f 6e 53  [j].label,lemonS
e240: 74 72 6c 65 6e 28 6f 70 5b 6a 5d 2e 6c 61 62 65  trlen(op[j].labe
e250: 6c 29 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  l))==0 ) break;.
e260: 20 20 7d 0a 20 20 76 20 3d 20 61 72 67 76 5b 69    }.  v = argv[i
e270: 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a 20  ][0]=='-' ? 1 : 
e280: 30 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c  0;.  if( op[j].l
e290: 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  abel==0 ){.    i
e2a0: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
e2b0: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75  fprintf(err,"%su
e2c0: 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e  ndefined option.
e2d0: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
e2e0: 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72   errline(i,1,err
e2f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72  );.    }.    err
e300: 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69  cnt++;.  }else i
e310: 66 28 20 6f 70 5b 6a 5d 2e 61 72 67 3d 3d 30 20  f( op[j].arg==0 
e320: 29 7b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65  ){.    /* Ignore
e330: 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 2a 2f 0a   this option */.
e340: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a    }else if( op[j
e350: 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c 41 47  ].type==OPT_FLAG
e360: 20 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74 2a 29   ){.    *((int*)
e370: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76 3b 0a  op[j].arg) = v;.
e380: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a    }else if( op[j
e390: 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46 4c 41  ].type==OPT_FFLA
e3a0: 47 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64  G ){.    (*(void
e3b0: 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e  (*)(int))(op[j].
e3c0: 61 72 67 29 29 28 76 29 3b 0a 20 20 7d 65 6c 73  arg))(v);.  }els
e3d0: 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65  e if( op[j].type
e3e0: 3d 3d 4f 50 54 5f 46 53 54 52 20 29 7b 0a 20 20  ==OPT_FSTR ){.  
e3f0: 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 63 68 61    (*(void(*)(cha
e400: 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  r *))(op[j].arg)
e410: 29 28 26 61 72 67 76 5b 69 5d 5b 32 5d 29 3b 0a  )(&argv[i][2]);.
e420: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
e430: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70   err ){.      fp
e440: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6d 69 73  rintf(err,"%smis
e450: 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e  sing argument on
e460: 20 73 77 69 74 63 68 2e 5c 6e 22 2c 65 6d 73 67   switch.\n",emsg
e470: 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65  );.      errline
e480: 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d  (i,1,err);.    }
e490: 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20  .    errcnt++;. 
e4a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
e4b0: 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  nt;.}../*.** Pro
e4c0: 63 65 73 73 20 61 20 63 6f 6d 6d 61 6e 64 20 6c  cess a command l
e4d0: 69 6e 65 20 73 77 69 74 63 68 20 77 68 69 63 68  ine switch which
e4e0: 20 68 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74   has an argument
e4f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e500: 68 61 6e 64 6c 65 73 77 69 74 63 68 28 69 6e 74  handleswitch(int
e510: 20 69 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b   i, FILE *err).{
e520: 0a 20 20 69 6e 74 20 6c 76 20 3d 20 30 3b 0a 20  .  int lv = 0;. 
e530: 20 64 6f 75 62 6c 65 20 64 76 20 3d 20 30 2e 30   double dv = 0.0
e540: 3b 0a 20 20 63 68 61 72 20 2a 73 76 20 3d 20 30  ;.  char *sv = 0
e550: 2c 20 2a 65 6e 64 3b 0a 20 20 63 68 61 72 20 2a  , *end;.  char *
e560: 63 70 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69  cp;.  int j;.  i
e570: 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20  nt errcnt = 0;. 
e580: 20 63 70 20 3d 20 73 74 72 63 68 72 28 61 72 67   cp = strchr(arg
e590: 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20 20 61 73 73  v[i],'=');.  ass
e5a0: 65 72 74 28 20 63 70 21 3d 30 20 29 3b 0a 20 20  ert( cp!=0 );.  
e5b0: 2a 63 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a  *cp = 0;.  for(j
e5c0: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
e5d0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
e5e0: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 6f 70  trcmp(argv[i],op
e5f0: 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20 29 20  [j].label)==0 ) 
e600: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70  break;.  }.  *cp
e610: 20 3d 20 27 3d 27 3b 0a 20 20 69 66 28 20 6f 70   = '=';.  if( op
e620: 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a  [j].label==0 ){.
e630: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
e640: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
e650: 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70  ,"%sundefined op
e660: 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  tion.\n",emsg);.
e670: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
e680: 30 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  0,err);.    }.  
e690: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65    errcnt++;.  }e
e6a0: 6c 73 65 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a 20  lse{.    cp++;. 
e6b0: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d     switch( op[j]
e6c0: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
e6d0: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
e6e0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
e6f0: 41 47 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20  AG:.        if( 
e700: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  err ){.         
e710: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
e720: 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
e730: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c  an argument.\n",
e740: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  emsg);.         
e750: 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72   errline(i,0,err
e760: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e770: 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20       errcnt++;. 
e780: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e790: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
e7a0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
e7b0: 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 64  _FDBL:.        d
e7c0: 76 20 3d 20 73 74 72 74 6f 64 28 63 70 2c 26 65  v = strtod(cp,&e
e7d0: 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nd);.        if(
e7e0: 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20   *end ){.       
e7f0: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
e800: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
e810: 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c  f(err,"%sillegal
e820: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 66 6c   character in fl
e830: 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 61 72 67  oating-point arg
e840: 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b  ument.\n",emsg);
e850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72  .            err
e860: 6c 69 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65  line(i,((unsigne
e870: 64 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73  d long)end)-(uns
e880: 69 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b  igned long)argv[
e890: 69 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20  i],err);.       
e8a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65     }.          e
e8b0: 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  rrcnt++;.       
e8c0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
e8d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
e8e0: 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65  _INT:.      case
e8f0: 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20   OPT_FINT:.     
e900: 20 20 20 6c 76 20 3d 20 73 74 72 74 6f 6c 28 63     lv = strtol(c
e910: 70 2c 26 65 6e 64 2c 30 29 3b 0a 20 20 20 20 20  p,&end,0);.     
e920: 20 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20     if( *end ){. 
e930: 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72           if( err
e940: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e950: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 69  fprintf(err,"%si
e960: 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72  llegal character
e970: 20 69 6e 20 69 6e 74 65 67 65 72 20 61 72 67 75   in integer argu
e980: 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  ment.\n",emsg);.
e990: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6c              errl
e9a0: 69 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65 64  ine(i,((unsigned
e9b0: 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69   long)end)-(unsi
e9c0: 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69  gned long)argv[i
e9d0: 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  ],err);.        
e9e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72    }.          er
e9f0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
ea00: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
ea10: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
ea20: 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20  STR:.      case 
ea30: 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20  OPT_FSTR:.      
ea40: 20 20 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20    sv = cp;.     
ea50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ea60: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a      switch( op[j
ea70: 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ].type ){.      
ea80: 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20  case OPT_FLAG:. 
ea90: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46       case OPT_FF
eaa0: 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65  LAG:.        bre
eab0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
eac0: 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20  PT_DBL:.        
ead0: 2a 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d  *(double*)(op[j]
eae0: 2e 61 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20  .arg) = dv;.    
eaf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
eb00: 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a   case OPT_FDBL:.
eb10: 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28          (*(void(
eb20: 2a 29 28 64 6f 75 62 6c 65 29 29 28 6f 70 5b 6a  *)(double))(op[j
eb30: 5d 2e 61 72 67 29 29 28 64 76 29 3b 0a 20 20 20  ].arg))(dv);.   
eb40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
eb50: 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a    case OPT_INT:.
eb60: 20 20 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 28          *(int*)(
eb70: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 6c 76 3b  op[j].arg) = lv;
eb80: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
eb90: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
eba0: 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 28 2a 28  INT:.        (*(
ebb0: 76 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f 70  void(*)(int))(op
ebc0: 5b 6a 5d 2e 61 72 67 29 29 28 28 69 6e 74 29 6c  [j].arg))((int)l
ebd0: 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  v);.        brea
ebe0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
ebf0: 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 20 20 2a  T_STR:.        *
ec00: 28 63 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d 2e 61  (char**)(op[j].a
ec10: 72 67 29 20 3d 20 73 76 3b 0a 20 20 20 20 20 20  rg) = sv;.      
ec20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ec30: 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20  ase OPT_FSTR:.  
ec40: 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29        (*(void(*)
ec50: 28 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e  (char *))(op[j].
ec60: 61 72 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20  arg))(sv);.     
ec70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ec80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72    }.  return err
ec90: 63 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49  cnt;.}..int OptI
eca0: 6e 69 74 28 63 68 61 72 20 2a 2a 61 2c 20 73 74  nit(char **a, st
ecb0: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a  ruct s_options *
ecc0: 6f 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a  o, FILE *err).{.
ecd0: 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30    int errcnt = 0
ece0: 3b 0a 20 20 61 72 67 76 20 3d 20 61 3b 0a 20 20  ;.  argv = a;.  
ecf0: 6f 70 20 3d 20 6f 3b 0a 20 20 65 72 72 73 74 72  op = o;.  errstr
ed00: 65 61 6d 20 3d 20 65 72 72 3b 0a 20 20 69 66 28  eam = err;.  if(
ed10: 20 61 72 67 76 20 26 26 20 2a 61 72 67 76 20 26   argv && *argv &
ed20: 26 20 6f 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  & op ){.    int 
ed30: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  i;.    for(i=1; 
ed40: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
ed50: 20 20 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d       if( argv[i]
ed60: 5b 30 5d 3d 3d 27 2b 27 20 7c 7c 20 61 72 67 76  [0]=='+' || argv
ed70: 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  [i][0]=='-' ){. 
ed80: 20 20 20 20 20 20 20 65 72 72 63 6e 74 20 2b 3d         errcnt +=
ed90: 20 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65   handleflags(i,e
eda0: 72 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rr);.      }else
edb0: 20 69 66 28 20 73 74 72 63 68 72 28 61 72 67 76   if( strchr(argv
edc0: 5b 69 5d 2c 27 3d 27 29 20 29 7b 0a 20 20 20 20  [i],'=') ){.    
edd0: 20 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61      errcnt += ha
ede0: 6e 64 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72  ndleswitch(i,err
edf0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ee00: 0a 20 20 7d 0a 20 20 69 66 28 20 65 72 72 63 6e  .  }.  if( errcn
ee10: 74 3e 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  t>0 ){.    fprin
ee20: 74 66 28 65 72 72 2c 22 56 61 6c 69 64 20 63 6f  tf(err,"Valid co
ee30: 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f  mmand line optio
ee40: 6e 73 20 66 6f 72 20 5c 22 25 73 5c 22 20 61 72  ns for \"%s\" ar
ee50: 65 3a 5c 6e 22 2c 2a 61 29 3b 0a 20 20 20 20 4f  e:\n",*a);.    O
ee60: 70 74 50 72 69 6e 74 28 29 3b 0a 20 20 20 20 65  ptPrint();.    e
ee70: 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65  xit(1);.  }.  re
ee80: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f  turn 0;.}..int O
ee90: 70 74 4e 41 72 67 73 28 29 7b 0a 20 20 69 6e 74  ptNArgs(){.  int
eea0: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
eeb0: 64 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20  dashdash = 0;.  
eec0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67  int i;.  if( arg
eed0: 76 21 3d 30 20 26 26 20 61 72 67 76 5b 30 5d 21  v!=0 && argv[0]!
eee0: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
eef0: 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29  1; argv[i]; i++)
ef00: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 61 73 68  {.      if( dash
ef10: 64 61 73 68 20 7c 7c 20 21 49 53 4f 50 54 28 61  dash || !ISOPT(a
ef20: 72 67 76 5b 69 5d 29 20 29 20 63 6e 74 2b 2b 3b  rgv[i]) ) cnt++;
ef30: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
ef40: 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d  p(argv[i],"--")=
ef50: 3d 30 20 29 20 64 61 73 68 64 61 73 68 20 3d 20  =0 ) dashdash = 
ef60: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
ef70: 65 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 63 68  eturn cnt;.}..ch
ef80: 61 72 20 2a 4f 70 74 41 72 67 28 69 6e 74 20 6e  ar *OptArg(int n
ef90: 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ).{.  int i;.  i
efa0: 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a   = argindex(n);.
efb0: 20 20 72 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20    return i>=0 ? 
efc0: 61 72 67 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a  argv[i] : 0;.}..
efd0: 76 6f 69 64 20 4f 70 74 45 72 72 28 69 6e 74 20  void OptErr(int 
efe0: 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  n).{.  int i;.  
eff0: 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b  i = argindex(n);
f000: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 65 72  .  if( i>=0 ) er
f010: 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 73 74 72  rline(i,0,errstr
f020: 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70  eam);.}..void Op
f030: 74 50 72 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20  tPrint(){.  int 
f040: 69 3b 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65  i;.  int max, le
f050: 6e 3b 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20  n;.  max = 0;.  
f060: 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c  for(i=0; op[i].l
f070: 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  abel; i++){.    
f080: 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  len = lemonStrle
f090: 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b  n(op[i].label) +
f0a0: 20 31 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   1;.    switch( 
f0b0: 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[i].type ){.  
f0c0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
f0d0: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
f0e0: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
f0f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
f100: 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20  se OPT_INT:.    
f110: 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a    case OPT_FINT:
f120: 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20  .        len += 
f130: 39 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67  9;       /* leng
f140: 74 68 20 6f 66 20 22 3c 69 6e 74 65 67 65 72 3e  th of "<integer>
f150: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  " */.        bre
f160: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
f170: 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61  PT_DBL:.      ca
f180: 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20  se OPT_FDBL:.   
f190: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 36 3b 20 20       len += 6;  
f1a0: 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
f1b0: 66 20 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20 20  f "<real>" */.  
f1c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f1d0: 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a     case OPT_STR:
f1e0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
f1f0: 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 6c 65  FSTR:.        le
f200: 6e 20 2b 3d 20 38 3b 20 20 20 20 20 20 20 2f 2a  n += 8;       /*
f210: 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 73 74 72   length of "<str
f220: 69 6e 67 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20  ing>" */.       
f230: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f240: 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 20 29 20    if( len>max ) 
f250: 6d 61 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20  max = len;.  }. 
f260: 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e   for(i=0; op[i].
f270: 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  label; i++){.   
f280: 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74   switch( op[i].t
f290: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
f2a0: 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20  e OPT_FLAG:.    
f2b0: 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47    case OPT_FFLAG
f2c0: 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  :.        fprint
f2d0: 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d  f(errstream,"  -
f2e0: 25 2d 2a 73 20 20 25 73 5c 6e 22 2c 6d 61 78 2c  %-*s  %s\n",max,
f2f0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69  op[i].label,op[i
f300: 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  ].message);.    
f310: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f320: 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
f330: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
f340: 4e 54 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69  NT:.        fpri
f350: 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20  ntf(errstream," 
f360: 20 2d 25 73 3c 69 6e 74 65 67 65 72 3e 25 2a 73   -%s<integer>%*s
f370: 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61    %s\n",op[i].la
f380: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  bel,.          (
f390: 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74  int)(max-lemonSt
f3a0: 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c  rlen(op[i].label
f3b0: 29 2d 39 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65  )-9),"",op[i].me
f3c0: 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
f3d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
f3e0: 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20  e OPT_DBL:.     
f3f0: 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a   case OPT_FDBL:.
f400: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
f410: 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 73  errstream,"  -%s
f420: 3c 72 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e 22  <real>%*s  %s\n"
f430: 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20  ,op[i].label,.  
f440: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61          (int)(ma
f450: 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70  x-lemonStrlen(op
f460: 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22 22  [i].label)-6),""
f470: 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b  ,op[i].message);
f480: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
f490: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53        case OPT_S
f4a0: 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  TR:.      case O
f4b0: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
f4c0: 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65   fprintf(errstre
f4d0: 61 6d 2c 22 20 20 2d 25 73 3c 73 74 72 69 6e 67  am,"  -%s<string
f4e0: 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69  >%*s  %s\n",op[i
f4f0: 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  ].label,.       
f500: 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d     (int)(max-lem
f510: 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c  onStrlen(op[i].l
f520: 61 62 65 6c 29 2d 38 29 2c 22 22 2c 6f 70 5b 69  abel)-8),"",op[i
f530: 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  ].message);.    
f540: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f550: 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  .  }.}./********
f560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
f570: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70  From the file "p
f580: 61 72 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  arse.c" ********
f590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f5a0: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75  ****/./*.** Inpu
f5b0: 74 20 66 69 6c 65 20 70 61 72 73 65 72 20 66 6f  t file parser fo
f5c0: 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
f5d0: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
f5e0: 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f  ../* The state o
f5f0: 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a  f the parser */.
f600: 65 6e 75 6d 20 65 5f 73 74 61 74 65 20 7b 0a 20  enum e_state {. 
f610: 20 49 4e 49 54 49 41 4c 49 5a 45 2c 0a 20 20 57   INITIALIZE,.  W
f620: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
f630: 4f 52 5f 52 55 4c 45 2c 0a 20 20 57 41 49 54 49  OR_RULE,.  WAITI
f640: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57  NG_FOR_DECL_KEYW
f650: 4f 52 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  ORD,.  WAITING_F
f660: 4f 52 5f 44 45 43 4c 5f 41 52 47 2c 0a 20 20 57  OR_DECL_ARG,.  W
f670: 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45  AITING_FOR_PRECE
f680: 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20  DENCE_SYMBOL,.  
f690: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f  WAITING_FOR_ARRO
f6a0: 57 2c 0a 20 20 49 4e 5f 52 48 53 2c 0a 20 20 4c  W,.  IN_RHS,.  L
f6b0: 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 4c 48  HS_ALIAS_1,.  LH
f6c0: 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 4c 48 53  S_ALIAS_2,.  LHS
f6d0: 5f 41 4c 49 41 53 5f 33 2c 0a 20 20 52 48 53 5f  _ALIAS_3,.  RHS_
f6e0: 41 4c 49 41 53 5f 31 2c 0a 20 20 52 48 53 5f 41  ALIAS_1,.  RHS_A
f6f0: 4c 49 41 53 5f 32 2c 0a 20 20 50 52 45 43 45 44  LIAS_2,.  PRECED
f700: 45 4e 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 50  ENCE_MARK_1,.  P
f710: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32  RECEDENCE_MARK_2
f720: 2c 0a 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52  ,.  RESYNC_AFTER
f730: 5f 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20 52  _RULE_ERROR,.  R
f740: 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
f750: 5f 45 52 52 4f 52 2c 0a 20 20 57 41 49 54 49 4e  _ERROR,.  WAITIN
f760: 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52  G_FOR_DESTRUCTOR
f770: 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49  _SYMBOL,.  WAITI
f780: 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f  NG_FOR_DATATYPE_
f790: 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e  SYMBOL,.  WAITIN
f7a0: 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49  G_FOR_FALLBACK_I
f7b0: 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  D,.  WAITING_FOR
f7c0: 5f 57 49 4c 44 43 41 52 44 5f 49 44 2c 0a 20 20  _WILDCARD_ID,.  
f7d0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53  WAITING_FOR_CLAS
f7e0: 53 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f  S_ID,.  WAITING_
f7f0: 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 0a  FOR_CLASS_TOKEN.
f800: 7d 3b 0a 73 74 72 75 63 74 20 70 73 74 61 74 65  };.struct pstate
f810: 20 7b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 6e   {.  char *filen
f820: 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  ame;       /* Na
f830: 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  me of the input 
f840: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  file */.  int to
f850: 6b 65 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20  kenlineno;      
f860: 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61 74  /* Linenumber at
f870: 20 77 68 69 63 68 20 63 75 72 72 65 6e 74 20 74   which current t
f880: 6f 6b 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a 20  oken starts */. 
f890: 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20   int errorcnt;  
f8a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f8b0: 20 6f 66 20 65 72 72 6f 72 73 20 73 6f 20 66 61   of errors so fa
f8c0: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  r */.  char *tok
f8d0: 65 6e 73 74 61 72 74 3b 20 20 20 20 20 2f 2a 20  enstart;     /* 
f8e0: 54 65 78 74 20 6f 66 20 63 75 72 72 65 6e 74 20  Text of current 
f8f0: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63  token */.  struc
f900: 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20 20  t lemon *gp;    
f910: 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74 65   /* Global state
f920: 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e 75   vector */.  enu
f930: 6d 20 65 5f 73 74 61 74 65 20 73 74 61 74 65 3b  m e_state state;
f940: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
f950: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72 73  tate of the pars
f960: 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  er */.  struct s
f970: 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b  ymbol *fallback;
f980: 20 20 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61     /* The fallba
f990: 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74  ck token */.  st
f9a0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 74 6b 63  ruct symbol *tkc
f9b0: 6c 61 73 73 3b 20 20 20 20 2f 2a 20 54 6f 6b 65  lass;    /* Toke
f9c0: 6e 20 63 6c 61 73 73 20 73 79 6d 62 6f 6c 20 2a  n class symbol *
f9d0: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
f9e0: 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 20 20 2f  l *lhs;        /
f9f0: 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  * Left-hand side
fa00: 20 6f 66 20 63 75 72 72 65 6e 74 20 72 75 6c 65   of current rule
fa10: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
fa20: 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 20   *lhsalias;     
fa30: 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68   /* Alias for th
fa40: 65 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 6e  e LHS */.  int n
fa50: 72 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  rhs;            
fa60: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
fa70: 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  of right-hand si
fa80: 64 65 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e 20  de symbols seen 
fa90: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
faa0: 6f 6c 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d 3b  ol *rhs[MAXRHS];
fab0: 20 20 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c 73    /* RHS symbols
fac0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
fad0: 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d 3b   *alias[MAXRHS];
fae0: 20 2f 2a 20 41 6c 69 61 73 65 73 20 66 6f 72 20   /* Aliases for 
faf0: 65 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20  each RHS symbol 
fb00: 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73  (or NULL) */.  s
fb10: 74 72 75 63 74 20 72 75 6c 65 20 2a 70 72 65 76  truct rule *prev
fb20: 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72 65  rule;     /* Pre
fb30: 76 69 6f 75 73 20 72 75 6c 65 20 70 61 72 73 65  vious rule parse
fb40: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
fb50: 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b 20  r *declkeyword; 
fb60: 20 20 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66 20    /* Keyword of 
fb70: 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  a declaration */
fb80: 0a 20 20 63 68 61 72 20 2a 2a 64 65 63 6c 61 72  .  char **declar
fb90: 67 73 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f 2a  gslot;        /*
fba0: 20 57 68 65 72 65 20 74 68 65 20 64 65 63 6c 61   Where the decla
fbb0: 72 61 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20  ration argument 
fbc0: 73 68 6f 75 6c 64 20 62 65 20 70 75 74 20 2a 2f  should be put */
fbd0: 0a 20 20 69 6e 74 20 69 6e 73 65 72 74 4c 69 6e  .  int insertLin
fbe0: 65 4d 61 63 72 6f 3b 20 20 20 20 20 20 20 2f 2a  eMacro;       /*
fbf0: 20 41 64 64 20 23 6c 69 6e 65 20 62 65 66 6f 72   Add #line befor
fc00: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e  e declaration in
fc10: 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64  sert */.  int *d
fc20: 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20 20  ecllinenoslot;  
fc30: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
fc40: 20 77 72 69 74 65 20 64 65 63 6c 61 72 61 74 69   write declarati
fc50: 6f 6e 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a  on line number *
fc60: 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63  /.  enum e_assoc
fc70: 20 64 65 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f   declassoc;    /
fc80: 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20 61 73  * Assign this as
fc90: 73 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64 65 63  sociation to dec
fca0: 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  l arguments */. 
fcb0: 20 69 6e 74 20 70 72 65 63 63 6f 75 6e 74 65 72   int preccounter
fcc0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
fcd0: 73 73 69 67 6e 20 74 68 69 73 20 70 72 65 63 65  ssign this prece
fce0: 64 65 6e 63 65 20 74 6f 20 64 65 63 6c 20 61 72  dence to decl ar
fcf0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72  guments */.  str
fd00: 75 63 74 20 72 75 6c 65 20 2a 66 69 72 73 74 72  uct rule *firstr
fd10: 75 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ule;    /* Point
fd20: 65 72 20 74 6f 20 66 69 72 73 74 20 72 75 6c 65  er to first rule
fd30: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
fd40: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
fd50: 20 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20 20 20   *lastrule;     
fd60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
fd70: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
fd80: 70 61 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d  parsed rule */.}
fd90: 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20 73 69  ;../* Parse a si
fda0: 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74  ngle token */.st
fdb0: 61 74 69 63 20 76 6f 69 64 20 70 61 72 73 65 6f  atic void parseo
fdc0: 6e 65 74 6f 6b 65 6e 28 73 74 72 75 63 74 20 70  netoken(struct p
fdd0: 73 74 61 74 65 20 2a 70 73 70 29 0a 7b 0a 20 20  state *psp).{.  
fde0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 3b 0a 20  const char *x;. 
fdf0: 20 78 20 3d 20 53 74 72 73 61 66 65 28 70 73 70   x = Strsafe(psp
fe00: 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20  ->tokenstart);  
fe10: 20 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 74     /* Save the t
fe20: 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79  oken permanently
fe30: 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72 69 6e   */.#if 0.  prin
fe40: 74 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e  tf("%s:%d: Token
fe50: 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e  =[%s] state=%d\n
fe60: 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  ",psp->filename,
fe70: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
fe80: 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73 74 61  ,.    x,psp->sta
fe90: 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77  te);.#endif.  sw
fea0: 69 74 63 68 28 20 70 73 70 2d 3e 73 74 61 74 65  itch( psp->state
feb0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 49 4e 49   ){.    case INI
fec0: 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70  TIALIZE:.      p
fed0: 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30  sp->prevrule = 0
fee0: 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65  ;.      psp->pre
fef0: 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20  ccounter = 0;.  
ff00: 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75      psp->firstru
ff10: 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75  le = psp->lastru
ff20: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73  le = 0;.      ps
ff30: 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30  p->gp->nrule = 0
ff40: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
ff50: 74 68 72 75 20 74 6f 20 6e 65 78 74 20 63 61 73  thru to next cas
ff60: 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 57 41  e */.    case WA
ff70: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
ff80: 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20 69 66  R_RULE:.      if
ff90: 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20  ( x[0]=='%' ){. 
ffa0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
ffb0: 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
ffc0: 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20  DECL_KEYWORD;.  
ffd0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
ffe0: 6c 6f 77 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20  lower(x[0]) ){. 
fff0: 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 20         psp->lhs 
10000 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
10010 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72  .        psp->nr
10020 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  hs = 0;.        
10030 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20  psp->lhsalias = 
10040 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
10050 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
10060 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20  FOR_ARROW;.     
10070 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d   }else if( x[0]=
10080 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='{' ){.        
10090 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c  if( psp->prevrul
100a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
100b0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
100c0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
100d0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72  kenlineno,."Ther
100e0 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75  e is no prior ru
100f0 6c 65 20 75 70 6f 6e 20 77 68 69 63 68 20 74 6f  le upon which to
10100 20 61 74 74 61 63 68 20 74 68 65 20 63 6f 64 65   attach the code
10110 20 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68 69 63   \.fragment whic
10120 68 20 62 65 67 69 6e 73 20 6f 6e 20 74 68 69 73  h begins on this
10130 20 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20   line.");.      
10140 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
10150 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t++;.        }el
10160 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76  se if( psp->prev
10170 72 75 6c 65 2d 3e 63 6f 64 65 21 3d 30 20 29 7b  rule->code!=0 ){
10180 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
10190 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
101a0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
101b0 6e 6f 2c 0a 22 43 6f 64 65 20 66 72 61 67 6d 65  no,."Code fragme
101c0 6e 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f 6e 20  nt beginning on 
101d0 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74  this line is not
101e0 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20   the first \.to 
101f0 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69  follow the previ
10200 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20  ous rule.");.   
10210 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
10220 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
10230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10240 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e   psp->prevrule->
10250 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65  line = psp->toke
10260 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20  nlineno;.       
10270 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
10280 2d 3e 63 6f 64 65 20 3d 20 26 78 5b 31 5d 3b 0a  ->code = &x[1];.
10290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
102a0 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d  }else if( x[0]==
102b0 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '[' ){.        p
102c0 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43  sp->state = PREC
102d0 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20  EDENCE_MARK_1;. 
102e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
102f0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
10300 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
10310 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
10320 20 20 20 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22         "Token \"
10330 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 65  %s\" should be e
10340 69 74 68 65 72 20 5c 22 25 25 5c 22 20 6f 72 20  ither \"%%\" or 
10350 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61  a nonterminal na
10360 6d 65 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  me.",.          
10370 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
10380 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
10390 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
103a0 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45 43 45  ;.    case PRECE
103b0 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20  DENCE_MARK_1:.  
103c0 20 20 20 20 69 66 28 20 21 69 73 75 70 70 65 72      if( !isupper
103d0 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
103e0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
103f0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
10400 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
10410 20 20 20 20 20 22 54 68 65 20 70 72 65 63 65 64       "The preced
10420 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74  ence symbol must
10430 20 62 65 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22   be a terminal."
10440 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
10450 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
10460 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d    }else if( psp-
10470 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a  >prevrule==0 ){.
10480 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
10490 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
104a0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
104b0 0a 20 20 20 20 20 20 20 20 20 20 22 54 68 65 72  .          "Ther
104c0 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75  e is no prior ru
104d0 6c 65 20 74 6f 20 61 73 73 69 67 6e 20 70 72 65  le to assign pre
104e0 63 65 64 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22  cedence \"[%s]\"
104f0 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  .",x);.        p
10500 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
10510 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10520 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70  psp->prevrule->p
10530 72 65 63 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20  recsym!=0 ){.   
10540 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
10550 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
10560 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50  >tokenlineno,."P
10570 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f  recedence mark o
10580 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
10590 6f 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74  ot the first \.t
105a0 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65  o follow the pre
105b0 76 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20  vious rule.");. 
105c0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
105d0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  rcnt++;.      }e
105e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70  lse{.        psp
105f0 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63  ->prevrule->prec
10600 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  sym = Symbol_new
10610 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (x);.      }.   
10620 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
10630 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
10640 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  2;.      break;.
10650 20 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45      case PRECEDE
10660 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20  NCE_MARK_2:.    
10670 20 20 69 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20    if( x[0]!=']' 
10680 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
10690 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
106a0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
106b0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d  no,.          "M
106c0 69 73 73 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20  issing \"]\" on 
106d0 70 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e  precedence mark.
106e0 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ");.        psp-
106f0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
10700 20 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e     }.      psp->
10710 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
10720 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
10730 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10740 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
10750 46 4f 52 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20  FOR_ARROW:.     
10760 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26   if( x[0]==':' &
10770 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78  & x[1]==':' && x
10780 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20  [2]=='=' ){.    
10790 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
107a0 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d   IN_RHS;.      }
107b0 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
107c0 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  (' ){.        ps
107d0 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41  p->state = LHS_A
107e0 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65  LIAS_1;.      }e
107f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
10800 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
10810 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
10820 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
10830 22 45 78 70 65 63 74 65 64 20 74 6f 20 73 65 65  "Expected to see
10840 20 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69   a \":\" followi
10850 6e 67 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f  ng the LHS symbo
10860 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20  l \"%s\".",.    
10870 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e        psp->lhs->
10880 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  name);.        p
10890 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
108a0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
108b0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
108c0 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20  R_RULE_ERROR;.  
108d0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
108e0 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f  k;.    case LHS_
108f0 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69  ALIAS_1:.      i
10900 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  f( isalpha(x[0])
10910 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
10920 3e 6c 68 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20  >lhsalias = x;. 
10930 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
10940 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b  e = LHS_ALIAS_2;
10950 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10960 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
10970 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
10980 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
10990 20 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22           "\"%s\"
109a0 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
109b0 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48  alias for the LH
109c0 53 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20  S \"%s\"\n",.   
109d0 20 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68         x,psp->lh
109e0 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  s->name);.      
109f0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
10a00 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
10a10 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
10a20 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
10a30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10a40 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c  reak;.    case L
10a50 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20  HS_ALIAS_2:.    
10a60 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20    if( x[0]==')' 
10a70 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
10a80 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41  state = LHS_ALIA
10a90 53 5f 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_3;.      }else
10aa0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
10ab0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
10ac0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
10ad0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69  o,.          "Mi
10ae0 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c  ssing \")\" foll
10af0 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20  owing LHS alias 
10b00 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73  name \"%s\".",ps
10b10 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20  p->lhsalias);.  
10b20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
10b30 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
10b40 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
10b50 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
10b60 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
10b70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
10b80 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a  se LHS_ALIAS_3:.
10b90 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
10ba0 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27  ':' && x[1]==':'
10bb0 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b   && x[2]=='=' ){
10bc0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10bd0 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20  ate = IN_RHS;.  
10be0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10bf0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
10c00 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
10c10 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
10c20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c        "Missing \
10c30 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a  "->\" following:
10c40 20 5c 22 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20   \"%s(%s)\".",. 
10c50 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c            psp->l
10c60 68 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68  hs->name,psp->lh
10c70 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
10c80 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
10c90 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
10ca0 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
10cb0 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
10cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
10cd0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 49 4e  eak;.    case IN
10ce0 5f 52 48 53 3a 0a 20 20 20 20 20 20 69 66 28 20  _RHS:.      if( 
10cf0 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  x[0]=='.' ){.   
10d00 20 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65       struct rule
10d10 20 2a 72 70 3b 0a 20 20 20 20 20 20 20 20 72 70   *rp;.        rp
10d20 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65 20   = (struct rule 
10d30 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)calloc( sizeof
10d40 28 73 74 72 75 63 74 20 72 75 6c 65 29 20 2b 20  (struct rule) + 
10d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69  .             si
10d60 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
10d70 6f 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 2b  ol*)*psp->nrhs +
10d80 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70   sizeof(char*)*p
10d90 73 70 2d 3e 6e 72 68 73 2c 20 31 29 3b 0a 20 20  sp->nrhs, 1);.  
10da0 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d 30 20        if( rp==0 
10db0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
10dc0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
10dd0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
10de0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
10df0 20 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74    "Can't allocat
10e00 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20  e enough memory 
10e10 66 6f 72 20 74 68 69 73 20 72 75 6c 65 2e 22 29  for this rule.")
10e20 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10e30 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
10e40 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76         psp->prev
10e50 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rule = 0;.      
10e60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10e70 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
10e80 20 20 20 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65      rp->ruleline
10e90 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e   = psp->tokenlin
10ea0 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  eno;.          r
10eb0 70 2d 3e 72 68 73 20 3d 20 28 73 74 72 75 63 74  p->rhs = (struct
10ec0 20 73 79 6d 62 6f 6c 2a 2a 29 26 72 70 5b 31 5d   symbol**)&rp[1]
10ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
10ee0 72 68 73 61 6c 69 61 73 20 3d 20 28 63 6f 6e 73  rhsalias = (cons
10ef0 74 20 63 68 61 72 2a 2a 29 26 28 72 70 2d 3e 72  t char**)&(rp->r
10f00 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 29 3b 0a  hs[psp->nrhs]);.
10f10 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
10f20 30 3b 20 69 3c 70 73 70 2d 3e 6e 72 68 73 3b 20  0; i<psp->nrhs; 
10f30 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
10f40 20 20 72 70 2d 3e 72 68 73 5b 69 5d 20 3d 20 70    rp->rhs[i] = p
10f50 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  sp->rhs[i];.    
10f60 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61          rp->rhsa
10f70 6c 69 61 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 61  lias[i] = psp->a
10f80 6c 69 61 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lias[i];.       
10f90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
10fa0 70 2d 3e 6c 68 73 20 3d 20 70 73 70 2d 3e 6c 68  p->lhs = psp->lh
10fb0 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  s;.          rp-
10fc0 3e 6c 68 73 61 6c 69 61 73 20 3d 20 70 73 70 2d  >lhsalias = psp-
10fd0 3e 6c 68 73 61 6c 69 61 73 3b 0a 20 20 20 20 20  >lhsalias;.     
10fe0 20 20 20 20 20 72 70 2d 3e 6e 72 68 73 20 3d 20       rp->nrhs = 
10ff0 70 73 70 2d 3e 6e 72 68 73 3b 0a 20 20 20 20 20  psp->nrhs;.     
11000 20 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20       rp->code = 
11010 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  0;.          rp-
11020 3e 70 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20  >precsym = 0;.  
11030 20 20 20 20 20 20 20 20 72 70 2d 3e 69 6e 64 65          rp->inde
11040 78 20 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75  x = psp->gp->nru
11050 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  le++;.          
11060 72 70 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70  rp->nextlhs = rp
11070 2d 3e 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20  ->lhs->rule;.   
11080 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e         rp->lhs->
11090 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20  rule = rp;.     
110a0 20 20 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20       rp->next = 
110b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
110c0 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d   psp->firstrule=
110d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
110e0 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65    psp->firstrule
110f0 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65   = psp->lastrule
11100 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20   = rp;.         
11110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11120 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c      psp->lastrul
11130 65 2d 3e 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20  e->next = rp;.  
11140 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c            psp->l
11150 61 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20  astrule = rp;.  
11160 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11170 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c      psp->prevrul
11180 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20  e = rp;.        
11190 7d 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  }.        psp->s
111a0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
111b0 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
111c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
111d0 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29   isalpha(x[0]) )
111e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  {.        if( ps
111f0 70 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20  p->nrhs>=MAXRHS 
11200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
11210 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11220 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
11230 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
11240 20 20 22 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62    "Too many symb
11250 6f 6c 73 20 6f 6e 20 52 48 53 20 6f 66 20 72 75  ols on RHS of ru
11260 6c 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  le beginning at 
11270 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20  \"%s\".",.      
11280 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20        x);.      
11290 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
112a0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t++;.          p
112b0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
112c0 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
112d0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ROR;.        }el
112e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73  se{.          ps
112f0 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73  p->rhs[psp->nrhs
11300 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  ] = Symbol_new(x
11310 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
11320 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68  ->alias[psp->nrh
11330 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  s] = 0;.        
11340 20 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 20    psp->nrhs++;. 
11350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11360 65 6c 73 65 20 69 66 28 20 28 78 5b 30 5d 3d 3d  else if( (x[0]==
11370 27 7c 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27  '|' || x[0]=='/'
11380 29 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30  ) && psp->nrhs>0
11390 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
113a0 63 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d  ct symbol *msp =
113b0 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e   psp->rhs[psp->n
113c0 72 68 73 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  rhs-1];.        
113d0 69 66 28 20 6d 73 70 2d 3e 74 79 70 65 21 3d 4d  if( msp->type!=M
113e0 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
113f0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
11400 20 73 79 6d 62 6f 6c 20 2a 6f 72 69 67 73 70 20   symbol *origsp 
11410 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 20  = msp;.         
11420 20 6d 73 70 20 3d 20 28 73 74 72 75 63 74 20 73   msp = (struct s
11430 79 6d 62 6f 6c 20 2a 29 20 63 61 6c 6c 6f 63 28  ymbol *) calloc(
11440 31 2c 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b  1,sizeof(*msp));
11450 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
11460 74 28 6d 73 70 2c 20 30 2c 20 73 69 7a 65 6f 66  t(msp, 0, sizeof
11470 28 2a 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20  (*msp));.       
11480 20 20 20 6d 73 70 2d 3e 74 79 70 65 20 3d 20 4d     msp->type = M
11490 55 4c 54 49 54 45 52 4d 49 4e 41 4c 3b 0a 20 20  ULTITERMINAL;.  
114a0 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75          msp->nsu
114b0 62 73 79 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  bsym = 1;.      
114c0 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20      msp->subsym 
114d0 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  = (struct symbol
114e0 20 2a 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69   **) calloc(1,si
114f0 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
11500 6f 6c 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ol*));.         
11510 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 20   msp->subsym[0] 
11520 3d 20 6f 72 69 67 73 70 3b 0a 20 20 20 20 20 20  = origsp;.      
11530 20 20 20 20 6d 73 70 2d 3e 6e 61 6d 65 20 3d 20      msp->name = 
11540 6f 72 69 67 73 70 2d 3e 6e 61 6d 65 3b 0a 20 20  origsp->name;.  
11550 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68 73          psp->rhs
11560 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20  [psp->nrhs-1] = 
11570 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  msp;.        }. 
11580 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62         msp->nsub
11590 73 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d  sym++;.        m
115a0 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74  sp->subsym = (st
115b0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20  ruct symbol **) 
115c0 72 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62  realloc(msp->sub
115d0 73 79 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 73  sym,.          s
115e0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
115f0 62 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73  bol*)*msp->nsubs
11600 79 6d 29 3b 0a 20 20 20 20 20 20 20 20 6d 73 70  ym);.        msp
11610 2d 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73  ->subsym[msp->ns
11620 75 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f  ubsym-1] = Symbo
11630 6c 5f 6e 65 77 28 26 78 5b 31 5d 29 3b 0a 20 20  l_new(&x[1]);.  
11640 20 20 20 20 20 20 69 66 28 20 69 73 6c 6f 77 65        if( islowe
11650 72 28 78 5b 31 5d 29 20 7c 7c 20 69 73 6c 6f 77  r(x[1]) || islow
11660 65 72 28 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30  er(msp->subsym[0
11670 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20  ]->name[0]) ){. 
11680 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
11690 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
116a0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
116b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  ,.            "C
116c0 61 6e 6e 6f 74 20 66 6f 72 6d 20 61 20 63 6f 6d  annot form a com
116d0 70 6f 75 6e 64 20 63 6f 6e 74 61 69 6e 69 6e 67  pound containing
116e0 20 61 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 22   a non-terminal"
116f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
11700 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
11710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
11720 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28  lse if( x[0]=='(
11730 27 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30  ' && psp->nrhs>0
11740 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
11750 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49  >state = RHS_ALI
11760 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  AS_1;.      }els
11770 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
11780 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
11790 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
117a0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49  no,.          "I
117b0 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72  llegal character
117c0 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 3a   on RHS of rule:
117d0 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20   \"%s\".",x);.  
117e0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
117f0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
11800 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
11810 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
11820 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
11830 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
11840 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 31 3a 0a  se RHS_ALIAS_1:.
11850 20 20 20 20 20 20 69 66 28 20 69 73 61 6c 70 68        if( isalph
11860 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  a(x[0]) ){.     
11870 20 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73     psp->alias[ps
11880 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 78 3b 0a  p->nrhs-1] = x;.
11890 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
118a0 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 32  te = RHS_ALIAS_2
118b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
118c0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
118d0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
118e0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
118f0 20 20 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c            "\"%s\
11900 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  " is not a valid
11910 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52   alias for the R
11920 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22  HS symbol \"%s\"
11930 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78  \n",.          x
11940 2c 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e  ,psp->rhs[psp->n
11950 72 68 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  rhs-1]->name);. 
11960 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
11970 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
11980 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
11990 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
119a0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
119b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
119c0 61 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 32 3a  ase RHS_ALIAS_2:
119d0 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
119e0 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =')' ){.        
119f0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f  psp->state = IN_
11a00 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  RHS;.      }else
11a10 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
11a20 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11a30 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11a40 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69  o,.          "Mi
11a50 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c  ssing \")\" foll
11a60 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20  owing LHS alias 
11a70 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73  name \"%s\".",ps
11a80 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20  p->lhsalias);.  
11a90 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
11aa0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
11ab0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
11ac0 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
11ad0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
11ae0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
11af0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44  se WAITING_FOR_D
11b00 45 43 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20 20 20  ECL_KEYWORD:.   
11b10 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 78     if( isalpha(x
11b20 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
11b30 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64  psp->declkeyword
11b40 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73   = x;.        ps
11b50 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
11b60 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
11b70 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20  >decllinenoslot 
11b80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 0;.        psp
11b90 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
11ba0 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  o = 1;.        p
11bb0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
11bc0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47  ING_FOR_DECL_ARG
11bd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  ;.        if( st
11be0 72 63 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d  rcmp(x,"name")==
11bf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
11c00 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
11c10 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d  = &(psp->gp->nam
11c20 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  e);.          ps
11c30 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
11c40 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
11c50 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
11c60 28 78 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30  (x,"include")==0
11c70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
11c80 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
11c90 20 26 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c   &(psp->gp->incl
11ca0 75 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ude);.        }e
11cb0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11cc0 2c 22 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20  ,"code")==0 ){. 
11cd0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
11ce0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
11cf0 70 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65  p->gp->extracode
11d00 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
11d10 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74   if( strcmp(x,"t
11d20 6f 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72 22  oken_destructor"
11d30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11d40 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
11d50 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74  ot = &psp->gp->t
11d60 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20 20 20 20  okendest;.      
11d70 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
11d80 6d 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 64 65  mp(x,"default_de
11d90 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b  structor")==0 ){
11da0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11db0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70  declargslot = &p
11dc0 73 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b  sp->gp->vardest;
11dd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11de0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b  f( strcmp(x,"tok
11df0 65 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30 20 29  en_prefix")==0 )
11e00 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
11e10 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
11e20 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72  psp->gp->tokenpr
11e30 65 66 69 78 3b 0a 20 20 20 20 20 20 20 20 20 20  efix;.          
11e40 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
11e50 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  acro = 0;.      
11e60 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
11e70 6d 70 28 78 2c 22 73 79 6e 74 61 78 5f 65 72 72  mp(x,"syntax_err
11e80 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or")==0 ){.     
11e90 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
11ea0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
11eb0 70 2d 3e 65 72 72 6f 72 29 3b 0a 20 20 20 20 20  p->error);.     
11ec0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
11ed0 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 61 63 63  cmp(x,"parse_acc
11ee0 65 70 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ept")==0 ){.    
11ef0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
11f00 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
11f10 67 70 2d 3e 61 63 63 65 70 74 29 3b 0a 20 20 20  gp->accept);.   
11f20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
11f30 74 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 66  trcmp(x,"parse_f
11f40 61 69 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20  ailure")==0 ){. 
11f50 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
11f60 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
11f70 70 2d 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b  p->gp->failure);
11f80 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11f90 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61  f( strcmp(x,"sta
11fa0 63 6b 5f 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30  ck_overflow")==0
11fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
11fc0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
11fd0 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72   &(psp->gp->over
11fe0 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d  flow);.        }
11ff0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
12000 78 2c 22 65 78 74 72 61 5f 61 72 67 75 6d 65 6e  x,"extra_argumen
12010 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
12020 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
12030 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
12040 2d 3e 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20  ->arg);.        
12050 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e    psp->insertLin
12060 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20  eMacro = 0;.    
12070 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
12080 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79  rcmp(x,"token_ty
12090 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pe")==0 ){.     
120a0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
120b0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
120c0 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20  p->tokentype);. 
120d0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
120e0 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
120f0 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
12100 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64   if( strcmp(x,"d
12110 65 66 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30  efault_type")==0
12120 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
12130 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
12140 20 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74   &(psp->gp->vart
12150 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ype);.          
12160 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
12170 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  acro = 0;.      
12180 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
12190 6d 70 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65  mp(x,"stack_size
121a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
121b0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
121c0 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
121d0 3e 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20  >stacksize);.   
121e0 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
121f0 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
12200 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
12210 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61  f( strcmp(x,"sta
12220 72 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29  rt_symbol")==0 )
12230 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
12240 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
12250 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29  (psp->gp->start)
12260 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12270 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
12280 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
12290 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
122a0 2c 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20  ,"left")==0 ){. 
122b0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
122c0 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  eccounter++;.   
122d0 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
122e0 61 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20  assoc = LEFT;.  
122f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
12300 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
12310 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42  _PRECEDENCE_SYMB
12320 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OL;.        }els
12330 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
12340 72 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20  right")==0 ){.  
12350 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
12360 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
12370 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
12380 73 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20 20  ssoc = RIGHT;.  
12390 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
123a0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
123b0 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42  _PRECEDENCE_SYMB
123c0 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OL;.        }els
123d0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
123e0 6e 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b  nonassoc")==0 ){
123f0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12400 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  preccounter++;. 
12410 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
12420 63 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a  classoc = NONE;.
12430 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
12440 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
12450 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59  OR_PRECEDENCE_SY
12460 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65  MBOL;.        }e
12470 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
12480 2c 22 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d  ,"destructor")==
12490 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
124a0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
124b0 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54  ING_FOR_DESTRUCT
124c0 4f 52 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20  OR_SYMBOL;.     
124d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
124e0 63 6d 70 28 78 2c 22 74 79 70 65 22 29 3d 3d 30  cmp(x,"type")==0
124f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
12500 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
12510 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f  NG_FOR_DATATYPE_
12520 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20  SYMBOL;.        
12530 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
12540 28 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d  (x,"fallback")==
12550 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
12560 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30  sp->fallback = 0
12570 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12580 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
12590 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44  _FOR_FALLBACK_ID
125a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
125b0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 77 69  if( strcmp(x,"wi
125c0 6c 64 63 61 72 64 22 29 3d 3d 30 20 29 7b 0a 20  ldcard")==0 ){. 
125d0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
125e0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
125f0 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 3b 0a 20  R_WILDCARD_ID;. 
12600 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12610 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e   strcmp(x,"token
12620 5f 63 6c 61 73 73 22 29 3d 3d 30 20 29 7b 0a 20  _class")==0 ){. 
12630 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
12640 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
12650 52 5f 43 4c 41 53 53 5f 49 44 3b 0a 20 20 20 20  R_CLASS_ID;.    
12660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12670 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
12680 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
12690 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
126a0 20 20 20 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f            "Unkno
126b0 77 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b  wn declaration k
126c0 65 79 77 6f 72 64 3a 20 5c 22 25 25 25 73 5c 22  eyword: \"%%%s\"
126d0 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20  .",x);.         
126e0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
126f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12700 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
12710 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
12720 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12740 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
12750 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
12760 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
12770 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 64 65 63      "Illegal dec
12780 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64  laration keyword
12790 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  : \"%s\".",x);. 
127a0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
127b0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
127c0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
127d0 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
127e0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
127f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
12800 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
12810 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f  DESTRUCTOR_SYMBO
12820 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  L:.      if( !is
12830 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
12840 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
12850 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
12860 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
12870 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f            "Symbo
12880 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61  l name missing a
12890 66 74 65 72 20 25 25 64 65 73 74 72 75 63 74 6f  fter %%destructo
128a0 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20  r keyword");.   
128b0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
128c0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
128d0 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
128e0 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
128f0 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
12900 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
12910 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d  symbol *sp = Sym
12920 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
12930 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
12940 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74  slot = &sp->dest
12950 72 75 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20  ructor;.        
12960 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73  psp->decllinenos
12970 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 4c  lot = &sp->destL
12980 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70  ineno;.        p
12990 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
129a0 63 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  cro = 1;.       
129b0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
129c0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
129d0 52 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RG;.      }.    
129e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
129f0 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41  e WAITING_FOR_DA
12a00 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20  TATYPE_SYMBOL:. 
12a10 20 20 20 20 20 69 66 28 20 21 69 73 61 6c 70 68       if( !isalph
12a20 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  a(x[0]) ){.     
12a30 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
12a40 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
12a50 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
12a60 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61        "Symbol na
12a70 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72  me missing after
12a80 20 25 25 74 79 70 65 20 6b 65 79 77 6f 72 64 22   %%type keyword"
12a90 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
12aa0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
12ab0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
12ac0 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
12ad0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
12ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
12af0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
12b00 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78   = Symbol_find(x
12b10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 28 73  );.        if((s
12b20 70 29 20 26 26 20 28 73 70 2d 3e 64 61 74 61 74  p) && (sp->datat
12b30 79 70 65 29 29 7b 0a 20 20 20 20 20 20 20 20 20  ype)){.         
12b40 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
12b50 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
12b60 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
12b70 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 25 25        "Symbol %%
12b80 74 79 70 65 20 5c 22 25 73 5c 22 20 61 6c 72 65  type \"%s\" alre
12b90 61 64 79 20 64 65 66 69 6e 65 64 22 2c 20 78 29  ady defined", x)
12ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
12bb0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
12bc0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12bd0 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
12be0 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
12bf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12c00 20 20 20 20 20 20 69 66 20 28 21 73 70 29 7b 0a        if (!sp){.
12c10 20 20 20 20 20 20 20 20 20 20 20 20 73 70 20 3d              sp =
12c20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
12c30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12c40 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
12c50 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61  rgslot = &sp->da
12c60 74 61 74 79 70 65 3b 0a 20 20 20 20 20 20 20 20  tatype;.        
12c70 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e    psp->insertLin
12c80 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20  eMacro = 0;.    
12c90 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
12ca0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
12cb0 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20  ECL_ARG;.       
12cc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
12cd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
12ce0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45   WAITING_FOR_PRE
12cf0 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a  CEDENCE_SYMBOL:.
12d00 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
12d10 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '.' ){.        p
12d20 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
12d30 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
12d40 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RULE;.      }els
12d50 65 20 69 66 28 20 69 73 75 70 70 65 72 28 78 5b  e if( isupper(x[
12d60 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  0]) ){.        s
12d70 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
12d80 3b 0a 20 20 20 20 20 20 20 20 73 70 20 3d 20 53  ;.        sp = S
12d90 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
12da0 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 70 72        if( sp->pr
12db0 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ec>=0 ){.       
12dc0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
12dd0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
12de0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
12df0 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20          "Symbol 
12e00 5c 22 25 73 5c 22 20 68 61 73 20 61 6c 72 65 61  \"%s\" has alrea
12e10 64 79 20 62 65 20 67 69 76 65 6e 20 61 20 70 72  dy be given a pr
12e20 65 63 65 64 65 6e 63 65 2e 22 2c 78 29 3b 0a 20  ecedence.",x);. 
12e30 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
12e40 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
12e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12e60 20 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 70 73     sp->prec = ps
12e70 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 3b 0a  p->preccounter;.
12e80 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 61 73            sp->as
12e90 73 6f 63 20 3d 20 70 73 70 2d 3e 64 65 63 6c 61  soc = psp->decla
12ea0 73 73 6f 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ssoc;.        }.
12eb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12ec0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
12ed0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
12ee0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
12ef0 20 20 20 20 20 20 20 20 22 43 61 6e 27 74 20 61          "Can't a
12f00 73 73 69 67 6e 20 61 20 70 72 65 63 65 64 65 6e  ssign a preceden
12f10 63 65 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c 78  ce to \"%s\".",x
12f20 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
12f30 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
12f40 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
12f50 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
12f60 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a 0a  G_FOR_DECL_ARG:.
12f70 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
12f80 27 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22  '{' || x[0]=='\"
12f90 27 20 7c 7c 20 69 73 61 6c 6e 75 6d 28 78 5b 30  ' || isalnum(x[0
12fa0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ]) ){.        co
12fb0 6e 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64 2c 20  nst char *zOld, 
12fc0 2a 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 63  *zNew;.        c
12fd0 68 61 72 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20  har *zBuf, *z;. 
12fe0 20 20 20 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c         int nOld,
12ff0 20 6e 2c 20 6e 4c 69 6e 65 2c 20 6e 4e 65 77 2c   n, nLine, nNew,
13000 20 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20   nBack;.        
13010 69 6e 74 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f  int addLineMacro
13020 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a  ;.        char z
13030 4c 69 6e 65 5b 35 30 5d 3b 0a 20 20 20 20 20 20  Line[50];.      
13040 20 20 7a 4e 65 77 20 3d 20 78 3b 0a 20 20 20 20    zNew = x;.    
13050 20 20 20 20 69 66 28 20 7a 4e 65 77 5b 30 5d 3d      if( zNew[0]=
13060 3d 27 22 27 20 7c 7c 20 7a 4e 65 77 5b 30 5d 3d  ='"' || zNew[0]=
13070 3d 27 7b 27 20 29 20 7a 4e 65 77 2b 2b 3b 0a 20  ='{' ) zNew++;. 
13080 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20 6c 65         nNew = le
13090 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4e 65 77 29 3b  monStrlen(zNew);
130a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 73  .        if( *ps
130b0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 29  p->declargslot )
130c0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64  {.          zOld
130d0 20 3d 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67   = *psp->declarg
130e0 73 6c 6f 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  slot;.        }e
130f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
13100 4f 6c 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  Old = "";.      
13110 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 4f 6c 64    }.        nOld
13120 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a   = lemonStrlen(z
13130 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 20  Old);.        n 
13140 3d 20 6e 4f 6c 64 20 2b 20 6e 4e 65 77 20 2b 20  = nOld + nNew + 
13150 32 30 3b 0a 20 20 20 20 20 20 20 20 61 64 64 4c  20;.        addL
13160 69 6e 65 4d 61 63 72 6f 20 3d 20 21 70 73 70 2d  ineMacro = !psp-
13170 3e 67 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c  >gp->nolinenosfl
13180 61 67 20 26 26 20 70 73 70 2d 3e 69 6e 73 65 72  ag && psp->inser
13190 74 4c 69 6e 65 4d 61 63 72 6f 20 26 26 0a 20 20  tLineMacro &&.  
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131b0 20 20 20 20 20 20 28 70 73 70 2d 3e 64 65 63 6c        (psp->decl
131c0 6c 69 6e 65 6e 6f 73 6c 6f 74 3d 3d 30 20 7c 7c  linenoslot==0 ||
131d0 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f   psp->decllineno
131e0 73 6c 6f 74 5b 30 5d 21 3d 30 29 3b 0a 20 20 20  slot[0]!=0);.   
131f0 20 20 20 20 20 69 66 28 20 61 64 64 4c 69 6e 65       if( addLine
13200 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20 20 20 20  Macro ){.       
13210 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69     for(z=psp->fi
13220 6c 65 6e 61 6d 65 2c 20 6e 42 61 63 6b 3d 30 3b  lename, nBack=0;
13230 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20   *z; z++){.     
13240 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27         if( *z=='
13250 5c 5c 27 20 29 20 6e 42 61 63 6b 2b 2b 3b 0a 20  \\' ) nBack++;. 
13260 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13270 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e       lemon_sprin
13280 74 66 28 7a 4c 69 6e 65 2c 20 22 23 6c 69 6e 65  tf(zLine, "#line
13290 20 25 64 20 22 2c 20 70 73 70 2d 3e 74 6f 6b 65   %d ", psp->toke
132a0 6e 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20  nlineno);.      
132b0 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6c 65 6d 6f      nLine = lemo
132c0 6e 53 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a  nStrlen(zLine);.
132d0 20 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 6e            n += n
132e0 4c 69 6e 65 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c  Line + lemonStrl
132f0 65 6e 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  en(psp->filename
13300 29 20 2b 20 6e 42 61 63 6b 3b 0a 20 20 20 20 20  ) + nBack;.     
13310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 73     }.        *ps
13320 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
13330 20 28 63 68 61 72 20 2a 29 20 72 65 61 6c 6c 6f   (char *) reallo
13340 63 28 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73  c(*psp->declargs
13350 6c 6f 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  lot, n);.       
13360 20 7a 42 75 66 20 3d 20 2a 70 73 70 2d 3e 64 65   zBuf = *psp->de
13370 63 6c 61 72 67 73 6c 6f 74 20 2b 20 6e 4f 6c 64  clargslot + nOld
13380 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
13390 64 4c 69 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20  dLineMacro ){.  
133a0 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 6c 64          if( nOld
133b0 20 26 26 20 7a 42 75 66 5b 2d 31 5d 21 3d 27 5c   && zBuf[-1]!='\
133c0 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n' ){.          
133d0 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c    *(zBuf++) = '\
133e0 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  n';.          }.
133f0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
13400 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 6e 4c  (zBuf, zLine, nL
13410 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ine);.          
13420 7a 42 75 66 20 2b 3d 20 6e 4c 69 6e 65 3b 0a 20  zBuf += nLine;. 
13430 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b           *(zBuf+
13440 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20  +) = '"';.      
13450 20 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66      for(z=psp->f
13460 69 6c 65 6e 61 6d 65 3b 20 2a 7a 3b 20 7a 2b 2b  ilename; *z; z++
13470 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
13480 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29 7b 0a 20  f( *z=='\\' ){. 
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 7a               *(z
134a0 42 75 66 2b 2b 29 20 3d 20 27 5c 5c 27 3b 0a 20  Buf++) = '\\';. 
134b0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
134c0 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b           *(zBuf+
134d0 2b 29 20 3d 20 2a 7a 3b 0a 20 20 20 20 20 20 20  +) = *z;.       
134e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2a     }.          *
134f0 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a  (zBuf++) = '"';.
13500 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66            *(zBuf
13510 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20  ++) = '\n';.    
13520 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
13530 28 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e  ( psp->decllinen
13540 6f 73 6c 6f 74 20 26 26 20 70 73 70 2d 3e 64 65  oslot && psp->de
13550 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 3d  cllinenoslot[0]=
13560 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13570 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73  psp->decllinenos
13580 6c 6f 74 5b 30 5d 20 3d 20 70 73 70 2d 3e 74 6f  lot[0] = psp->to
13590 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20  kenlineno;.     
135a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
135b0 63 70 79 28 7a 42 75 66 2c 20 7a 4e 65 77 2c 20  cpy(zBuf, zNew, 
135c0 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7a  nNew);.        z
135d0 42 75 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20  Buf += nNew;.   
135e0 20 20 20 20 20 2a 7a 42 75 66 20 3d 20 30 3b 0a       *zBuf = 0;.
135f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
13600 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
13610 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
13620 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13630 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
13640 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
13650 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
13660 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20         "Illegal 
13670 61 72 67 75 6d 65 6e 74 20 74 6f 20 25 25 25 73  argument to %%%s
13680 3a 20 25 73 22 2c 70 73 70 2d 3e 64 65 63 6c 6b  : %s",psp->declk
13690 65 79 77 6f 72 64 2c 78 29 3b 0a 20 20 20 20 20  eyword,x);.     
136a0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
136b0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
136c0 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
136d0 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
136e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
136f0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
13700 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c  WAITING_FOR_FALL
13710 42 41 43 4b 5f 49 44 3a 0a 20 20 20 20 20 20 69  BACK_ID:.      i
13720 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  f( x[0]=='.' ){.
13730 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
13740 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
13750 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
13760 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
13770 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b  isupper(x[0]) ){
13780 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
13790 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
137a0 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
137b0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 25  o,.          "%%
137c0 66 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e  fallback argumen
137d0 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20  t \"%s\" should 
137e0 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b  be a token", x);
137f0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
13800 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
13810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
13820 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
13830 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
13840 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  ;.        if( ps
13850 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29  p->fallback==0 )
13860 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
13870 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 73 70 3b 0a  >fallback = sp;.
13880 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
13890 28 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 29  ( sp->fallback )
138a0 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
138b0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
138c0 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
138d0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
138e0 20 20 22 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65    "More than one
138f0 20 66 61 6c 6c 62 61 63 6b 20 61 73 73 69 67 6e   fallback assign
13900 65 64 20 74 6f 20 74 6f 6b 65 6e 20 25 73 22 2c  ed to token %s",
13910 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   x);.          p
13920 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
13930 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
13940 20 20 20 20 20 20 20 20 20 73 70 2d 3e 66 61 6c           sp->fal
13950 6c 62 61 63 6b 20 3d 20 70 73 70 2d 3e 66 61 6c  lback = psp->fal
13960 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 20  lback;.         
13970 20 70 73 70 2d 3e 67 70 2d 3e 68 61 73 5f 66 61   psp->gp->has_fa
13980 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  llback = 1;.    
13990 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
139a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
139b0 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
139c0 57 49 4c 44 43 41 52 44 5f 49 44 3a 0a 20 20 20  WILDCARD_ID:.   
139d0 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
139e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
139f0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
13a00 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
13a10 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
13a20 66 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d  f( !isupper(x[0]
13a30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ) ){.        Err
13a40 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
13a50 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ame, psp->tokenl
13a60 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
13a70 20 22 25 25 77 69 6c 64 63 61 72 64 20 61 72 67   "%%wildcard arg
13a80 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f  ument \"%s\" sho
13a90 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c  uld be a token",
13aa0 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70   x);.        psp
13ab0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
13ac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13ad0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
13ae0 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65   *sp = Symbol_ne
13af0 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  w(x);.        if
13b00 28 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63  ( psp->gp->wildc
13b10 61 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ard==0 ){.      
13b20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c      psp->gp->wil
13b30 64 63 61 72 64 20 3d 20 73 70 3b 0a 20 20 20 20  dcard = sp;.    
13b40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13b50 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
13b60 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70  p->filename, psp
13b70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
13b80 20 20 20 20 20 20 20 20 20 20 20 22 45 78 74 72             "Extr
13b90 61 20 77 69 6c 64 63 61 72 64 20 74 6f 20 74 6f  a wildcard to to
13ba0 6b 65 6e 3a 20 25 73 22 2c 20 78 29 3b 0a 20 20  ken: %s", x);.  
13bb0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
13bc0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
13bd0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
13be0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
13bf0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41   WAITING_FOR_CLA
13c00 53 53 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28  SS_ID:.      if(
13c10 20 21 69 73 6c 6f 77 65 72 28 78 5b 30 5d 29 20   !islower(x[0]) 
13c20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
13c30 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
13c40 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
13c50 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
13c60 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 6d 75  %%token_class mu
13c70 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 62  st be followed b
13c80 79 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 3a  y an identifier:
13c90 20 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20   ", x);.        
13ca0 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
13cb0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
13cc0 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
13cd0 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
13ce0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 79      }else if( Sy
13cf0 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 20 29 7b 0a  mbol_find(x) ){.
13d00 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
13d10 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
13d20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
13d30 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d  ,.          "Sym
13d40 62 6f 6c 20 5c 22 25 73 5c 22 20 61 6c 72 65 61  bol \"%s\" alrea
13d50 64 79 20 75 73 65 64 22 2c 20 78 29 3b 0a 20 20  dy used", x);.  
13d60 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
13d70 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
13d80 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
13d90 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
13da0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
13db0 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 74  {.        psp->t
13dc0 6b 63 6c 61 73 73 20 3d 20 53 79 6d 62 6f 6c 5f  kclass = Symbol_
13dd0 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
13de0 70 73 70 2d 3e 74 6b 63 6c 61 73 73 2d 3e 74 79  psp->tkclass->ty
13df0 70 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e  pe = MULTITERMIN
13e00 41 4c 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  AL;.        psp-
13e10 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
13e20 5f 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e  _FOR_CLASS_TOKEN
13e30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13e40 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
13e50 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53  WAITING_FOR_CLAS
13e60 53 5f 54 4f 4b 45 4e 3a 0a 20 20 20 20 20 20 69  S_TOKEN:.      i
13e70 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  f( x[0]=='.' ){.
13e80 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
13e90 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
13ea0 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
13eb0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
13ec0 73 75 70 70 65 72 28 78 5b 30 5d 29 20 7c 7c 20  supper(x[0]) || 
13ed0 28 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78  ((x[0]=='|' || x
13ee0 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20 69 73 75  [0]=='/') && isu
13ef0 70 70 65 72 28 78 5b 31 5d 29 29 20 29 7b 0a 20  pper(x[1])) ){. 
13f00 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
13f10 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d  mbol *msp = psp-
13f20 3e 74 6b 63 6c 61 73 73 3b 0a 20 20 20 20 20 20  >tkclass;.      
13f30 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b    msp->nsubsym++
13f40 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73  ;.        msp->s
13f50 75 62 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20  ubsym = (struct 
13f60 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c 6c  symbol **) reall
13f70 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c 0a  oc(msp->subsym,.
13f80 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
13f90 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29  (struct symbol*)
13fa0 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a  *msp->nsubsym);.
13fb0 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73 75          if( !isu
13fc0 70 70 65 72 28 78 5b 30 5d 29 20 29 20 78 2b 2b  pper(x[0]) ) x++
13fd0 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73  ;.        msp->s
13fe0 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73  ubsym[msp->nsubs
13ff0 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e  ym-1] = Symbol_n
14000 65 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ew(x);.      }el
14010 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
14020 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
14030 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
14040 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
14050 22 25 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 61  "%%token_class a
14060 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73  rgument \"%s\" s
14070 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e  hould be a token
14080 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ", x);.        p
14090 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
140a0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
140b0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
140c0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
140d0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
140e0 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 59  k;.    case RESY
140f0 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
14100 52 4f 52 3a 0a 2f 2a 20 20 20 20 20 20 69 66 28  ROR:./*      if(
14110 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70   x[0]=='.' ) psp
14120 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
14130 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
14140 4c 45 3b 0a 2a 2a 20 20 20 20 20 20 62 72 65 61  LE;.**      brea
14150 6b 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 52  k; */.    case R
14160 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
14170 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 69 66  _ERROR:.      if
14180 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73  ( x[0]=='.' ) ps
14190 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
141a0 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
141b0 55 4c 45 3b 0a 20 20 20 20 20 20 69 66 28 20 78  ULE;.      if( x
141c0 5b 30 5d 3d 3d 27 25 27 20 29 20 70 73 70 2d 3e  [0]=='%' ) psp->
141d0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
141e0 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44  FOR_DECL_KEYWORD
141f0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14200 20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 74 68 65   }.}../* Run the
14210 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6f 76   preprocessor ov
14220 65 72 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  er the input fil
14230 65 20 74 65 78 74 2e 20 20 54 68 65 20 67 6c 6f  e text.  The glo
14240 62 61 6c 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a  bal variables.**
14250 20 61 7a 44 65 66 69 6e 65 5b 30 5d 20 74 68 72   azDefine[0] thr
14260 6f 75 67 68 20 61 7a 44 65 66 69 6e 65 5b 6e 44  ough azDefine[nD
14270 65 66 69 6e 65 2d 31 5d 20 63 6f 6e 74 61 69 6e  efine-1] contain
14280 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  s the names of a
14290 6c 6c 20 64 65 66 69 6e 65 64 0a 2a 2a 20 6d 61  ll defined.** ma
142a0 63 72 6f 73 2e 20 20 54 68 69 73 20 72 6f 75 74  cros.  This rout
142b0 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20 22 25  ine looks for "%
142c0 69 66 64 65 66 22 20 61 6e 64 20 22 25 69 66 6e  ifdef" and "%ifn
142d0 64 65 66 22 20 61 6e 64 20 22 25 65 6e 64 69 66  def" and "%endif
142e0 22 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d 65 6e 74  " and.** comment
142f0 73 20 74 68 65 6d 20 6f 75 74 2e 20 20 54 65 78  s them out.  Tex
14300 74 20 69 6e 20 62 65 74 77 65 65 6e 20 69 73 20  t in between is 
14310 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f  also commented o
14320 75 74 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ut as appropriat
14330 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
14340 64 20 70 72 65 70 72 6f 63 65 73 73 5f 69 6e 70  d preprocess_inp
14350 75 74 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  ut(char *z){.  i
14360 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20  nt i, j, k, n;. 
14370 20 69 6e 74 20 65 78 63 6c 75 64 65 20 3d 20 30   int exclude = 0
14380 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20  ;.  int start = 
14390 30 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20  0;.  int lineno 
143a0 3d 20 31 3b 0a 20 20 69 6e 74 20 73 74 61 72 74  = 1;.  int start
143b0 5f 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66  _lineno = 1;.  f
143c0 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(i=0; z[i]; i+
143d0 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  +){.    if( z[i]
143e0 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
143f0 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 21  +;.    if( z[i]!
14400 3d 27 25 27 20 7c 7c 20 28 69 3e 30 20 26 26 20  ='%' || (i>0 && 
14410 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29 20 29 20  z[i-1]!='\n') ) 
14420 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
14430 28 20 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c  ( strncmp(&z[i],
14440 22 25 65 6e 64 69 66 22 2c 36 29 3d 3d 30 20 26  "%endif",6)==0 &
14450 26 20 69 73 73 70 61 63 65 28 7a 5b 69 2b 36 5d  & isspace(z[i+6]
14460 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  ) ){.      if( e
14470 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20  xclude ){.      
14480 20 20 65 78 63 6c 75 64 65 2d 2d 3b 0a 20 20 20    exclude--;.   
14490 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65       if( exclude
144a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
144b0 20 66 6f 72 28 6a 3d 73 74 61 72 74 3b 20 6a 3c   for(j=start; j<
144c0 69 3b 20 6a 2b 2b 29 20 69 66 28 20 7a 5b 6a 5d  i; j++) if( z[j]
144d0 21 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d 20 3d 20  !='\n' ) z[j] = 
144e0 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ' ';.        }. 
144f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
14500 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b  (j=i; z[j] && z[
14510 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a  j]!='\n'; j++) z
14520 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d  [j] = ' ';.    }
14530 65 6c 73 65 20 69 66 28 20 28 73 74 72 6e 63 6d  else if( (strncm
14540 70 28 26 7a 5b 69 5d 2c 22 25 69 66 64 65 66 22  p(&z[i],"%ifdef"
14550 2c 36 29 3d 3d 30 20 26 26 20 69 73 73 70 61 63  ,6)==0 && isspac
14560 65 28 7a 5b 69 2b 36 5d 29 29 0a 20 20 20 20 20  e(z[i+6])).     
14570 20 20 20 20 20 7c 7c 20 28 73 74 72 6e 63 6d 70       || (strncmp
14580 28 26 7a 5b 69 5d 2c 22 25 69 66 6e 64 65 66 22  (&z[i],"%ifndef"
14590 2c 37 29 3d 3d 30 20 26 26 20 69 73 73 70 61 63  ,7)==0 && isspac
145a0 65 28 7a 5b 69 2b 37 5d 29 29 20 29 7b 0a 20 20  e(z[i+7])) ){.  
145b0 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20      if( exclude 
145c0 29 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75  ){.        exclu
145d0 64 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  de++;.      }els
145e0 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  e{.        for(j
145f0 3d 69 2b 37 3b 20 69 73 73 70 61 63 65 28 7a 5b  =i+7; isspace(z[
14600 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20  j]); j++){}.    
14610 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6a      for(n=0; z[j
14620 2b 6e 5d 20 26 26 20 21 69 73 73 70 61 63 65 28  +n] && !isspace(
14630 7a 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a  z[j+n]); n++){}.
14640 20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 20          exclude 
14650 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 1;.        for
14660 28 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69 6e 65 3b  (k=0; k<nDefine;
14670 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   k++){.         
14680 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 44   if( strncmp(azD
14690 65 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e  efine[k],&z[j],n
146a0 29 3d 3d 30 20 26 26 20 6c 65 6d 6f 6e 53 74 72  )==0 && lemonStr
146b0 6c 65 6e 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 29  len(azDefine[k])
146c0 3d 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==n ){.         
146d0 20 20 20 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a     exclude = 0;.
146e0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
146f0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
14700 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14710 20 69 66 28 20 7a 5b 69 2b 33 5d 3d 3d 27 6e 27   if( z[i+3]=='n'
14720 20 29 20 65 78 63 6c 75 64 65 20 3d 20 21 65 78   ) exclude = !ex
14730 63 6c 75 64 65 3b 0a 20 20 20 20 20 20 20 20 69  clude;.        i
14740 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20  f( exclude ){.  
14750 20 20 20 20 20 20 20 20 73 74 61 72 74 20 3d 20          start = 
14760 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  i;.          sta
14770 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65  rt_lineno = line
14780 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  no;.        }.  
14790 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
147a0 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a  j=i; z[j] && z[j
147b0 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b  ]!='\n'; j++) z[
147c0 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a  j] = ' ';.    }.
147d0 20 20 7d 0a 20 20 69 66 28 20 65 78 63 6c 75 64    }.  if( exclud
147e0 65 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  e ){.    fprintf
147f0 28 73 74 64 65 72 72 2c 22 75 6e 74 65 72 6d 69  (stderr,"untermi
14800 6e 61 74 65 64 20 25 25 69 66 64 65 66 20 73 74  nated %%ifdef st
14810 61 72 74 69 6e 67 20 6f 6e 20 6c 69 6e 65 20 25  arting on line %
14820 64 5c 6e 22 2c 20 73 74 61 72 74 5f 6c 69 6e 65  d\n", start_line
14830 6e 6f 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  no);.    exit(1)
14840 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73  ;.  }.}../* In s
14850 70 69 74 65 20 6f 66 20 69 74 73 20 6e 61 6d 65  pite of its name
14860 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
14870 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6e  is really a scan
14880 6e 65 72 2e 20 20 49 74 20 72 65 61 64 0a 2a 2a  ner.  It read.**
14890 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 69   in the entire i
148a0 6e 70 75 74 20 66 69 6c 65 20 28 61 6c 6c 20 61  nput file (all a
148b0 74 20 6f 6e 63 65 29 20 74 68 65 6e 20 74 6f 6b  t once) then tok
148c0 65 6e 69 7a 65 73 20 69 74 2e 20 20 45 61 63 68  enizes it.  Each
148d0 0a 2a 2a 20 74 6f 6b 65 6e 20 69 73 20 70 61 73  .** token is pas
148e0 73 65 64 20 74 6f 20 74 68 65 20 66 75 6e 63 74  sed to the funct
148f0 69 6f 6e 20 22 70 61 72 73 65 6f 6e 65 74 6f 6b  ion "parseonetok
14900 65 6e 22 20 77 68 69 63 68 20 62 75 69 6c 64 73  en" which builds
14910 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 61 70 70 72   all.** the appr
14920 6f 70 72 69 61 74 65 20 64 61 74 61 20 73 74 72  opriate data str
14930 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 67  uctures in the g
14940 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63 74  lobal state vect
14950 6f 72 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64  or "gp"..*/.void
14960 20 50 61 72 73 65 28 73 74 72 75 63 74 20 6c 65   Parse(struct le
14970 6d 6f 6e 20 2a 67 70 29 0a 7b 0a 20 20 73 74 72  mon *gp).{.  str
14980 75 63 74 20 70 73 74 61 74 65 20 70 73 3b 0a 20  uct pstate ps;. 
14990 20 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63 68 61   FILE *fp;.  cha
149a0 72 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20 69 6e  r *filebuf;.  in
149b0 74 20 66 69 6c 65 73 69 7a 65 3b 0a 20 20 69 6e  t filesize;.  in
149c0 74 20 6c 69 6e 65 6e 6f 3b 0a 20 20 69 6e 74 20  t lineno;.  int 
149d0 63 3b 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a  c;.  char *cp, *
149e0 6e 65 78 74 63 70 3b 0a 20 20 69 6e 74 20 73 74  nextcp;.  int st
149f0 61 72 74 6c 69 6e 65 20 3d 20 30 3b 0a 0a 20 20  artline = 0;..  
14a00 6d 65 6d 73 65 74 28 26 70 73 2c 20 27 5c 30 27  memset(&ps, '\0'
14a10 2c 20 73 69 7a 65 6f 66 28 70 73 29 29 3b 0a 20  , sizeof(ps));. 
14a20 20 70 73 2e 67 70 20 3d 20 67 70 3b 0a 20 20 70   ps.gp = gp;.  p
14a30 73 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 67 70 2d  s.filename = gp-
14a40 3e 66 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 73 2e  >filename;.  ps.
14a50 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 20 20  errorcnt = 0;.  
14a60 70 73 2e 73 74 61 74 65 20 3d 20 49 4e 49 54 49  ps.state = INITI
14a70 41 4c 49 5a 45 3b 0a 0a 20 20 2f 2a 20 42 65 67  ALIZE;..  /* Beg
14a80 69 6e 20 62 79 20 72 65 61 64 69 6e 67 20 74 68  in by reading th
14a90 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
14aa0 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 70 73 2e    fp = fopen(ps.
14ab0 66 69 6c 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a  filename,"rb");.
14ac0 20 20 69 66 28 20 66 70 3d 3d 30 20 29 7b 0a 20    if( fp==0 ){. 
14ad0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66     ErrorMsg(ps.f
14ae0 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74  ilename,0,"Can't
14af0 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65 20   open this file 
14b00 66 6f 72 20 72 65 61 64 69 6e 67 2e 22 29 3b 0a  for reading.");.
14b10 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74      gp->errorcnt
14b20 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
14b30 20 20 7d 0a 20 20 66 73 65 65 6b 28 66 70 2c 30    }.  fseek(fp,0
14b40 2c 32 29 3b 0a 20 20 66 69 6c 65 73 69 7a 65 20  ,2);.  filesize 
14b50 3d 20 66 74 65 6c 6c 28 66 70 29 3b 0a 20 20 72  = ftell(fp);.  r
14b60 65 77 69 6e 64 28 66 70 29 3b 0a 20 20 66 69 6c  ewind(fp);.  fil
14b70 65 62 75 66 20 3d 20 28 63 68 61 72 20 2a 29 6d  ebuf = (char *)m
14b80 61 6c 6c 6f 63 28 20 66 69 6c 65 73 69 7a 65 2b  alloc( filesize+
14b90 31 20 29 3b 0a 20 20 69 66 28 20 66 69 6c 65 73  1 );.  if( files
14ba0 69 7a 65 3e 31 30 30 30 30 30 30 30 30 20 7c 7c  ize>100000000 ||
14bb0 20 66 69 6c 65 62 75 66 3d 3d 30 20 29 7b 0a 20   filebuf==0 ){. 
14bc0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66     ErrorMsg(ps.f
14bd0 69 6c 65 6e 61 6d 65 2c 30 2c 22 49 6e 70 75 74  ilename,0,"Input
14be0 20 66 69 6c 65 20 74 6f 6f 20 6c 61 72 67 65 2e   file too large.
14bf0 22 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f  ");.    gp->erro
14c00 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 66 63 6c 6f  rcnt++;.    fclo
14c10 73 65 28 66 70 29 3b 0a 20 20 20 20 72 65 74 75  se(fp);.    retu
14c20 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72  rn;.  }.  if( fr
14c30 65 61 64 28 66 69 6c 65 62 75 66 2c 31 2c 66 69  ead(filebuf,1,fi
14c40 6c 65 73 69 7a 65 2c 66 70 29 21 3d 66 69 6c 65  lesize,fp)!=file
14c50 73 69 7a 65 20 29 7b 0a 20 20 20 20 45 72 72 6f  size ){.    Erro
14c60 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65  rMsg(ps.filename
14c70 2c 30 2c 22 43 61 6e 27 74 20 72 65 61 64 20 69  ,0,"Can't read i
14c80 6e 20 61 6c 6c 20 25 64 20 62 79 74 65 73 20 6f  n all %d bytes o
14c90 66 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20  f this file.",. 
14ca0 20 20 20 20 20 66 69 6c 65 73 69 7a 65 29 3b 0a       filesize);.
14cb0 20 20 20 20 66 72 65 65 28 66 69 6c 65 62 75 66      free(filebuf
14cc0 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72  );.    gp->error
14cd0 63 6e 74 2b 2b 3b 0a 20 20 20 20 66 63 6c 6f 73  cnt++;.    fclos
14ce0 65 28 66 70 29 3b 0a 20 20 20 20 72 65 74 75 72  e(fp);.    retur
14cf0 6e 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  n;.  }.  fclose(
14d00 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 5b 66  fp);.  filebuf[f
14d10 69 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20  ilesize] = 0;.. 
14d20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 69 6e 69 74   /* Make an init
14d30 69 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67 68  ial pass through
14d40 20 74 68 65 20 66 69 6c 65 20 74 6f 20 68 61 6e   the file to han
14d50 64 6c 65 20 25 69 66 64 65 66 20 61 6e 64 20 25  dle %ifdef and %
14d60 69 66 6e 64 65 66 20 2a 2f 0a 20 20 70 72 65 70  ifndef */.  prep
14d70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 66 69 6c  rocess_input(fil
14d80 65 62 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77  ebuf);..  /* Now
14d90 20 73 63 61 6e 20 74 68 65 20 74 65 78 74 20 6f   scan the text o
14da0 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
14db0 20 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31   */.  lineno = 1
14dc0 3b 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c 65 62  ;.  for(cp=fileb
14dd0 75 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 3b  uf; (c= *cp)!=0;
14de0 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   ){.    if( c=='
14df0 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n' ) lineno++; 
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e10 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
14e20 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f  e line number */
14e30 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65  .    if( isspace
14e40 28 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63 6f 6e  (c) ){ cp++; con
14e50 74 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53 6b 69  tinue; }  /* Ski
14e60 70 20 61 6c 6c 20 77 68 69 74 65 20 73 70 61 63  p all white spac
14e70 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d  e */.    if( c==
14e80 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f  '/' && cp[1]=='/
14e90 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a  ' ){          /*
14ea0 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20   Skip C++ style 
14eb0 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  comments */.    
14ec0 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77    cp+=2;.      w
14ed0 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
14ee0 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63  0 && c!='\n' ) c
14ef0 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  p++;.      conti
14f00 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
14f10 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b  f( c=='/' && cp[
14f20 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20 20 20  1]=='*' ){      
14f30 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 20 73 74      /* Skip C st
14f40 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a  yle comments */.
14f50 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20        cp+=2;.   
14f60 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63     while( (c= *c
14f70 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f 27  p)!=0 && (c!='/'
14f80 20 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a 27 29   || cp[-1]!='*')
14f90 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
14fa0 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  c=='\n' ) lineno
14fb0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b 2b  ++;.        cp++
14fc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14fd0 69 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a 20 20  if( c ) cp++;.  
14fe0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
14ff0 20 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e    }.    ps.token
15000 73 74 61 72 74 20 3d 20 63 70 3b 20 20 20 20 20  start = cp;     
15010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
15020 72 6b 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  rk the beginning
15030 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f   of the token */
15040 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c 69 6e  .    ps.tokenlin
15050 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20 20  eno = lineno;   
15060 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e          /* Linen
15070 75 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 20 74  umber on which t
15080 6f 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f 0a 20  oken begins */. 
15090 20 20 20 69 66 28 20 63 3d 3d 27 5c 22 27 20 29     if( c=='\"' )
150a0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
150b0 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20        /* String 
150c0 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20  literals */.    
150d0 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68    cp++;.      wh
150e0 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
150f0 20 26 26 20 63 21 3d 27 5c 22 27 20 29 7b 0a 20   && c!='\"' ){. 
15100 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
15110 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n' ) lineno++;. 
15120 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20         cp++;.   
15130 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
15140 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
15150 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e  rrorMsg(ps.filen
15160 61 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c 0a 22  ame,startline,."
15170 53 74 72 69 6e 67 20 73 74 61 72 74 69 6e 67 20  String starting 
15180 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20  on this line is 
15190 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62  not terminated b
151a0 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66  efore the end of
151b0 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20   the file.");.  
151c0 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e        ps.errorcn
151d0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78  t++;.        nex
151e0 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20  tcp = cp;.      
151f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
15200 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20  extcp = cp+1;.  
15210 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
15220 69 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20 20 20  if( c=='{' ){   
15230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
15240 20 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f 64 65   block of C code
15250 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 65   */.      int le
15260 76 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b 2b 3b  vel;.      cp++;
15270 0a 20 20 20 20 20 20 66 6f 72 28 6c 65 76 65 6c  .      for(level
15280 3d 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  =1; (c= *cp)!=0 
15290 26 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c 20 63  && (level>1 || c
152a0 21 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a 20  !='}'); cp++){. 
152b0 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
152c0 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n' ) lineno++;. 
152d0 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20         else if( 
152e0 63 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c 2b 2b  c=='{' ) level++
152f0 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69  ;.        else i
15300 66 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65 76 65  f( c=='}' ) leve
15310 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65 6c 73  l--;.        els
15320 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20  e if( c=='/' && 
15330 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 2f  cp[1]=='*' ){  /
15340 2a 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74 73 20  * Skip comments 
15350 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  */.          int
15360 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20   prevc;.        
15370 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20    cp = &cp[2];. 
15380 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d           prevc =
15390 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68   0;.          wh
153a0 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
153b0 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 70   && (c!='/' || p
153c0 72 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a 20 20  revc!='*') ){.  
153d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
153e0 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
153f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ;.            pr
15400 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  evc = c;.       
15410 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
15420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
15430 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20  else if( c=='/' 
15440 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b  && cp[1]=='/' ){
15450 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74    /* Skip C++ st
15460 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 6f  yle comments too
15470 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 70   */.          cp
15480 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20   = &cp[2];.     
15490 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20       while( (c= 
154a0 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  *cp)!=0 && c!='\
154b0 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20  n' ) cp++;.     
154c0 20 20 20 20 20 69 66 28 20 63 20 29 20 6c 69 6e       if( c ) lin
154d0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  eno++;.        }
154e0 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27  else if( c=='\''
154f0 20 7c 7c 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20   || c=='\"' ){  
15500 20 20 2f 2a 20 53 74 72 69 6e 67 20 61 20 63 68    /* String a ch
15510 61 72 61 63 74 65 72 20 6c 69 74 65 72 61 6c 73  aracter literals
15520 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
15530 74 20 73 74 61 72 74 63 68 61 72 2c 20 70 72 65  t startchar, pre
15540 76 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74  vc;.          st
15550 61 72 74 63 68 61 72 20 3d 20 63 3b 0a 20 20 20  artchar = c;.   
15560 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 30         prevc = 0
15570 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
15580 63 70 2b 2b 3b 20 28 63 3d 20 2a 63 70 29 21 3d  cp++; (c= *cp)!=
15590 30 20 26 26 20 28 63 21 3d 73 74 61 72 74 63 68  0 && (c!=startch
155a0 61 72 20 7c 7c 20 70 72 65 76 63 3d 3d 27 5c 5c  ar || prevc=='\\
155b0 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20  '); cp++){.     
155c0 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
155d0 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n' ) lineno++;. 
155e0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
155f0 72 65 76 63 3d 3d 27 5c 5c 27 20 29 20 70 72 65  revc=='\\' ) pre
15600 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  vc = 0;.        
15610 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20      else        
15620 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b        prevc = c;
15630 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15650 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
15660 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
15670 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 70 73  g(ps.filename,ps
15680 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43  .tokenlineno,."C
15690 20 63 6f 64 65 20 73 74 61 72 74 69 6e 67 20 6f   code starting o
156a0 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
156b0 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65  ot terminated be
156c0 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20  fore the end of 
156d0 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20  the file.");.   
156e0 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74       ps.errorcnt
156f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  ++;.        next
15700 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d  cp = cp;.      }
15710 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65  else{.        ne
15720 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20  xtcp = cp+1;.   
15730 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
15740 66 28 20 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b  f( isalnum(c) ){
15750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 65            /* Ide
15760 6e 74 69 66 69 65 72 73 20 2a 2f 0a 20 20 20 20  ntifiers */.    
15770 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
15780 29 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d  )!=0 && (isalnum
15790 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29  (c) || c=='_') )
157a0 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78   cp++;.      nex
157b0 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65  tcp = cp;.    }e
157c0 6c 73 65 20 69 66 28 20 63 3d 3d 27 3a 27 20 26  lse if( c==':' &
157d0 26 20 63 70 5b 31 5d 3d 3d 27 3a 27 20 26 26 20  & cp[1]==':' && 
157e0 63 70 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a  cp[2]=='=' ){ /*
157f0 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 22 3a   The operator ":
15800 3a 3d 22 20 2a 2f 0a 20 20 20 20 20 20 63 70 20  :=" */.      cp 
15810 2b 3d 20 33 3b 0a 20 20 20 20 20 20 6e 65 78 74  += 3;.      next
15820 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c  cp = cp;.    }el
15830 73 65 20 69 66 28 20 28 63 3d 3d 27 2f 27 20 7c  se if( (c=='/' |
15840 7c 20 63 3d 3d 27 7c 27 29 20 26 26 20 69 73 61  | c=='|') && isa
15850 6c 70 68 61 28 63 70 5b 31 5d 29 20 29 7b 0a 20  lpha(cp[1]) ){. 
15860 20 20 20 20 20 63 70 20 2b 3d 20 32 3b 0a 20 20       cp += 2;.  
15870 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
15880 2a 63 70 29 21 3d 30 20 26 26 20 28 69 73 61 6c  *cp)!=0 && (isal
15890 6e 75 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27  num(c) || c=='_'
158a0 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20  ) ) cp++;.      
158b0 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20  nextcp = cp;.   
158c0 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158e0 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f   /* All other (o
158f0 6e 65 20 63 68 61 72 61 63 74 65 72 29 20 6f 70  ne character) op
15900 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20  erators */.     
15910 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78   cp++;.      nex
15920 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a  tcp = cp;.    }.
15930 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20      c = *cp;.   
15940 20 2a 63 70 20 3d 20 30 3b 20 20 20 20 20 20 20   *cp = 0;       
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15960 20 2f 2a 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61   /* Null termina
15970 74 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a  te the token */.
15980 20 20 20 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65      parseonetoke
15990 6e 28 26 70 73 29 3b 20 20 20 20 20 20 20 20 20  n(&ps);         
159a0 20 20 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65      /* Parse the
159b0 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63   token */.    *c
159c0 70 20 3d 20 63 3b 20 20 20 20 20 20 20 20 20 20  p = c;          
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
159e0 20 52 65 73 74 6f 72 65 20 74 68 65 20 62 75 66   Restore the buf
159f0 66 65 72 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20  fer */.    cp = 
15a00 6e 65 78 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72  nextcp;.  }.  fr
15a10 65 65 28 66 69 6c 65 62 75 66 29 3b 20 20 20 20  ee(filebuf);    
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a30 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 62  /* Release the b
15a40 75 66 66 65 72 20 61 66 74 65 72 20 70 61 72 73  uffer after pars
15a50 69 6e 67 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c  ing */.  gp->rul
15a60 65 20 3d 20 70 73 2e 66 69 72 73 74 72 75 6c 65  e = ps.firstrule
15a70 3b 0a 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74  ;.  gp->errorcnt
15a80 20 3d 20 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a   = ps.errorcnt;.
15a90 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
15aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
15ab0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c  rom the file "pl
15ac0 69 6e 6b 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ink.c" *********
15ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
15ae0 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f  .** Routines pro
15af0 63 65 73 73 69 6e 67 20 63 6f 6e 66 69 67 75 72  cessing configur
15b00 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74  ation follow-set
15b10 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
15b20 6b 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d  ks.** in the LEM
15b30 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
15b40 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  tor..*/.static s
15b50 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69  truct plink *pli
15b60 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 30 3b  nk_freelist = 0;
15b70 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
15b80 6e 65 77 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72  new plink */.str
15b90 75 63 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b  uct plink *Plink
15ba0 5f 6e 65 77 28 29 7b 0a 20 20 73 74 72 75 63 74  _new(){.  struct
15bb0 20 70 6c 69 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b   plink *newlink;
15bc0 0a 0a 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72  ..  if( plink_fr
15bd0 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
15be0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
15bf0 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 70  amt = 100;.    p
15c00 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20  link_freelist = 
15c10 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29  (struct plink *)
15c20 63 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a  calloc( amt, siz
15c30 65 6f 66 28 73 74 72 75 63 74 20 70 6c 69 6e 6b  eof(struct plink
15c40 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 6c 69  ) );.    if( pli
15c50 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20 29  nk_freelist==0 )
15c60 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
15c70 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20 22 55  stderr,.      "U
15c80 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
15c90 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e  e memory for a n
15ca0 65 77 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72  ew follow-set pr
15cb0 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c  opagation link.\
15cc0 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  n");.      exit(
15cd0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
15ce0 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20  r(i=0; i<amt-1; 
15cf0 69 2b 2b 29 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  i++) plink_freel
15d00 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 70  ist[i].next = &p
15d10 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 2b  link_freelist[i+
15d20 31 5d 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72  1];.    plink_fr
15d30 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65  eelist[amt-1].ne
15d40 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65  xt = 0;.  }.  ne
15d50 77 6c 69 6e 6b 20 3d 20 70 6c 69 6e 6b 5f 66 72  wlink = plink_fr
15d60 65 65 6c 69 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f  eelist;.  plink_
15d70 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 69 6e 6b  freelist = plink
15d80 5f 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b  _freelist->next;
15d90 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 6c 69 6e  .  return newlin
15da0 6b 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70  k;.}../* Add a p
15db0 6c 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20  link to a plink 
15dc0 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69  list */.void Pli
15dd0 6e 6b 5f 61 64 64 28 73 74 72 75 63 74 20 70 6c  nk_add(struct pl
15de0 69 6e 6b 20 2a 2a 70 6c 70 70 2c 20 73 74 72 75  ink **plpp, stru
15df0 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a  ct config *cfp).
15e00 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  {.  struct plink
15e10 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77   *newlink;.  new
15e20 6c 69 6e 6b 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77  link = Plink_new
15e30 28 29 3b 0a 20 20 6e 65 77 6c 69 6e 6b 2d 3e 6e  ();.  newlink->n
15e40 65 78 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a  ext = *plpp;.  *
15e50 70 6c 70 70 20 3d 20 6e 65 77 6c 69 6e 6b 3b 0a  plpp = newlink;.
15e60 20 20 6e 65 77 6c 69 6e 6b 2d 3e 63 66 70 20 3d    newlink->cfp =
15e70 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e   cfp;.}../* Tran
15e80 73 66 65 72 20 65 76 65 72 79 20 70 6c 69 6e 6b  sfer every plink
15e90 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 22 66 72   on the list "fr
15ea0 6f 6d 22 20 74 6f 20 74 68 65 20 6c 69 73 74 20  om" to the list 
15eb0 22 74 6f 22 20 2a 2f 0a 76 6f 69 64 20 50 6c 69  "to" */.void Pli
15ec0 6e 6b 5f 63 6f 70 79 28 73 74 72 75 63 74 20 70  nk_copy(struct p
15ed0 6c 69 6e 6b 20 2a 2a 74 6f 2c 20 73 74 72 75 63  link **to, struc
15ee0 74 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 29 0a 7b  t plink *from).{
15ef0 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
15f00 2a 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65  *nextpl;.  while
15f10 28 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65  ( from ){.    ne
15f20 78 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78  xtpl = from->nex
15f30 74 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78  t;.    from->nex
15f40 74 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f  t = *to;.    *to
15f50 20 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f   = from;.    fro
15f60 6d 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a  m = nextpl;.  }.
15f70 7d 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76 65  }../* Delete eve
15f80 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20  ry plink on the 
15f90 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69  list */.void Pli
15fa0 6e 6b 5f 64 65 6c 65 74 65 28 73 74 72 75 63 74  nk_delete(struct
15fb0 20 70 6c 69 6e 6b 20 2a 70 6c 70 29 0a 7b 0a 20   plink *plp).{. 
15fc0 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e   struct plink *n
15fd0 65 78 74 70 6c 3b 0a 0a 20 20 77 68 69 6c 65 28  extpl;..  while(
15fe0 20 70 6c 70 20 29 7b 0a 20 20 20 20 6e 65 78 74   plp ){.    next
15ff0 70 6c 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a  pl = plp->next;.
16000 20 20 20 20 70 6c 70 2d 3e 6e 65 78 74 20 3d 20      plp->next = 
16010 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a  plink_freelist;.
16020 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69      plink_freeli
16030 73 74 20 3d 20 70 6c 70 3b 0a 20 20 20 20 70 6c  st = plp;.    pl
16040 70 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a  p = nextpl;.  }.
16050 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
16060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
16070 74 68 65 20 66 69 6c 65 20 22 72 65 70 6f 72 74  the file "report
16080 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
16090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
160a0 2f 2a 0a 2a 2a 20 50 72 6f 63 65 64 75 72 65 73  /*.** Procedures
160b0 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20   for generating 
160c0 72 65 70 6f 72 74 73 20 61 6e 64 20 74 61 62 6c  reports and tabl
160d0 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20  es in the LEMON 
160e0 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
160f0 2e 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  ..*/../* Generat
16100 65 20 61 20 66 69 6c 65 6e 61 6d 65 20 77 69 74  e a filename wit
16110 68 20 74 68 65 20 67 69 76 65 6e 20 73 75 66 66  h the given suff
16120 69 78 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  ix.  Space to ho
16130 6c 64 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 63  ld the.** name c
16140 6f 6d 65 73 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  omes from malloc
16150 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
16160 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
16170 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
16180 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72  .*/.PRIVATE char
16190 20 2a 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28   *file_makename(
161a0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
161b0 6d 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  mp, const char *
161c0 73 75 66 66 69 78 29 0a 7b 0a 20 20 63 68 61 72  suffix).{.  char
161d0 20 2a 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a   *name;.  char *
161e0 63 70 3b 0a 0a 20 20 6e 61 6d 65 20 3d 20 28 63  cp;..  name = (c
161f0 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d  har*)malloc( lem
16200 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66  onStrlen(lemp->f
16210 69 6c 65 6e 61 6d 65 29 20 2b 20 6c 65 6d 6f 6e  ilename) + lemon
16220 53 74 72 6c 65 6e 28 73 75 66 66 69 78 29 20 2b  Strlen(suffix) +
16230 20 35 20 29 3b 0a 20 20 69 66 28 20 6e 61 6d 65   5 );.  if( name
16240 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
16250 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74  tf(stderr,"Can't
16260 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
16270 66 6f 72 20 61 20 66 69 6c 65 6e 61 6d 65 2e 5c  for a filename.\
16280 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
16290 3b 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74  ;.  }.  lemon_st
162a0 72 63 70 79 28 6e 61 6d 65 2c 6c 65 6d 70 2d 3e  rcpy(name,lemp->
162b0 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 63 70 20  filename);.  cp 
162c0 3d 20 73 74 72 72 63 68 72 28 6e 61 6d 65 2c 27  = strrchr(name,'
162d0 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29 20  .');.  if( cp ) 
162e0 2a 63 70 20 3d 20 30 3b 0a 20 20 6c 65 6d 6f 6e  *cp = 0;.  lemon
162f0 5f 73 74 72 63 61 74 28 6e 61 6d 65 2c 73 75 66  _strcat(name,suf
16300 66 69 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  fix);.  return n
16310 61 6d 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20  ame;.}../* Open 
16320 61 20 66 69 6c 65 20 77 69 74 68 20 61 20 6e 61  a file with a na
16330 6d 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  me based on the 
16340 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75  name of the inpu
16350 74 20 66 69 6c 65 2c 0a 2a 2a 20 62 75 74 20 77  t file,.** but w
16360 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
16370 28 73 70 65 63 69 66 69 65 64 29 20 73 75 66 66  (specified) suff
16380 69 78 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ix, and return a
16390 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
163a0 68 65 20 73 74 72 65 61 6d 20 2a 2f 0a 50 52 49  he stream */.PRI
163b0 56 41 54 45 20 46 49 4c 45 20 2a 66 69 6c 65 5f  VATE FILE *file_
163c0 6f 70 65 6e 28 0a 20 20 73 74 72 75 63 74 20 6c  open(.  struct l
163d0 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 63 6f  emon *lemp,.  co
163e0 6e 73 74 20 63 68 61 72 20 2a 73 75 66 66 69 78  nst char *suffix
163f0 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
16400 6d 6f 64 65 0a 29 7b 0a 20 20 46 49 4c 45 20 2a  mode.){.  FILE *
16410 66 70 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d  fp;..  if( lemp-
16420 3e 6f 75 74 6e 61 6d 65 20 29 20 66 72 65 65 28  >outname ) free(
16430 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a  lemp->outname);.
16440 20 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20    lemp->outname 
16450 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28  = file_makename(
16460 6c 65 6d 70 2c 20 73 75 66 66 69 78 29 3b 0a 20  lemp, suffix);. 
16470 20 66 70 20 3d 20 66 6f 70 65 6e 28 6c 65 6d 70   fp = fopen(lemp
16480 2d 3e 6f 75 74 6e 61 6d 65 2c 6d 6f 64 65 29 3b  ->outname,mode);
16490 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 26 26 20  .  if( fp==0 && 
164a0 2a 6d 6f 64 65 3d 3d 27 77 27 20 29 7b 0a 20 20  *mode=='w' ){.  
164b0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
164c0 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 66 69 6c  ,"Can't open fil
164d0 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 6c 65 6d  e \"%s\".\n",lem
164e0 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 20  p->outname);.   
164f0 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
16500 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  +;.    return 0;
16510 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 70  .  }.  return fp
16520 3b 0a 7d 0a 0a 2f 2a 20 44 75 70 6c 69 63 61 74  ;.}../* Duplicat
16530 65 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  e the input file
16540 20 77 69 74 68 6f 75 74 20 63 6f 6d 6d 65 6e 74   without comment
16550 73 20 61 6e 64 20 77 69 74 68 6f 75 74 20 61 63  s and without ac
16560 74 69 6f 6e 73 20 0a 2a 2a 20 6f 6e 20 72 75 6c  tions .** on rul
16570 65 73 20 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69  es */.void Repri
16580 6e 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  nt(struct lemon 
16590 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63  *lemp).{.  struc
165a0 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74  t rule *rp;.  st
165b0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
165c0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6d 61 78  .  int i, j, max
165d0 6c 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f 6c 75 6d  len, len, ncolum
165e0 6e 73 2c 20 73 6b 69 70 3b 0a 20 20 70 72 69 6e  ns, skip;.  prin
165f0 74 66 28 22 2f 2f 20 52 65 70 72 69 6e 74 20 6f  tf("// Reprint o
16600 66 20 69 6e 70 75 74 20 66 69 6c 65 20 5c 22 25  f input file \"%
16610 73 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62 6f 6c 73  s\".\n// Symbols
16620 3a 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  :\n",lemp->filen
16630 61 6d 65 29 3b 0a 20 20 6d 61 78 6c 65 6e 20 3d  ame);.  maxlen =
16640 20 31 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   10;.  for(i=0; 
16650 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
16660 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 20 3d 20   i++){.    sp = 
16670 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
16680 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f  ;.    len = lemo
16690 6e 53 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65  nStrlen(sp->name
166a0 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d  );.    if( len>m
166b0 61 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d  axlen ) maxlen =
166c0 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c   len;.  }.  ncol
166d0 75 6d 6e 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65  umns = 76/(maxle
166e0 6e 2b 35 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c  n+5);.  if( ncol
166f0 75 6d 6e 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e  umns<1 ) ncolumn
16700 73 20 3d 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20  s = 1;.  skip = 
16710 28 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b  (lemp->nsymbol +
16720 20 6e 63 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e   ncolumns - 1)/n
16730 63 6f 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69  columns;.  for(i
16740 3d 30 3b 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29  =0; i<skip; i++)
16750 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2f 2f  {.    printf("//
16760 22 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b  ");.    for(j=i;
16770 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   j<lemp->nsymbol
16780 3b 20 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20  ; j+=skip){.    
16790 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d    sp = lemp->sym
167a0 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61  bols[j];.      a
167b0 73 73 65 72 74 28 20 73 70 2d 3e 69 6e 64 65 78  ssert( sp->index
167c0 3d 3d 6a 20 29 3b 0a 20 20 20 20 20 20 70 72 69  ==j );.      pri
167d0 6e 74 66 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73  ntf(" %3d %-*.*s
167e0 22 2c 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65  ",j,maxlen,maxle
167f0 6e 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  n,sp->name);.   
16800 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c   }.    printf("\
16810 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72  n");.  }.  for(r
16820 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
16830 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
16840 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c      printf("%s",
16850 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a  rp->lhs->name);.
16860 20 20 20 20 2f 2a 20 20 20 20 69 66 28 20 72 70      /*    if( rp
16870 2d 3e 6c 68 73 61 6c 69 61 73 20 29 20 70 72 69  ->lhsalias ) pri
16880 6e 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e 6c  ntf("(%s)",rp->l
16890 68 73 61 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 20  hsalias); */.   
168a0 20 70 72 69 6e 74 66 28 22 20 3a 3a 3d 22 29 3b   printf(" ::=");
168b0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
168c0 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
168d0 20 20 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72        sp = rp->r
168e0 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  hs[i];.      if(
168f0 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
16900 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
16910 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 22      printf(" %s"
16920 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d  , sp->subsym[0]-
16930 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
16940 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e  for(j=1; j<sp->n
16950 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20  subsym; j++){.  
16960 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
16970 7c 25 73 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d  |%s", sp->subsym
16980 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [j]->name);.    
16990 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
169a0 65 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  e{.        print
169b0 66 28 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d  f(" %s", sp->nam
169c0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
169d0 20 20 2f 2a 20 69 66 28 20 72 70 2d 3e 72 68 73    /* if( rp->rhs
169e0 61 6c 69 61 73 5b 69 5d 20 29 20 70 72 69 6e 74  alias[i] ) print
169f0 66 28 22 28 25 73 29 22 2c 72 70 2d 3e 72 68 73  f("(%s)",rp->rhs
16a00 61 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20  alias[i]); */.  
16a10 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22    }.    printf("
16a20 2e 22 29 3b 0a 20 20 20 20 69 66 28 20 72 70 2d  .");.    if( rp-
16a30 3e 70 72 65 63 73 79 6d 20 29 20 70 72 69 6e 74  >precsym ) print
16a40 66 28 22 20 5b 25 73 5d 22 2c 72 70 2d 3e 70 72  f(" [%s]",rp->pr
16a50 65 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ecsym->name);.  
16a60 20 20 2f 2a 20 69 66 28 20 72 70 2d 3e 63 6f 64    /* if( rp->cod
16a70 65 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 20 20  e ) printf("\n  
16a80 20 20 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b    %s",rp->code);
16a90 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28 22   */.    printf("
16aa0 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69  \n");.  }.}..voi
16ab0 64 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 46 49  d ConfigPrint(FI
16ac0 4c 45 20 2a 66 70 2c 20 73 74 72 75 63 74 20 63  LE *fp, struct c
16ad0 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20  onfig *cfp).{.  
16ae0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
16af0 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
16b00 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   *sp;.  int i, j
16b10 3b 0a 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70  ;.  rp = cfp->rp
16b20 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22  ;.  fprintf(fp,"
16b30 25 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d  %s ::=",rp->lhs-
16b40 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d  >name);.  for(i=
16b50 30 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68 73 3b 20  0; i<=rp->nrhs; 
16b60 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d  i++){.    if( i=
16b70 3d 63 66 70 2d 3e 64 6f 74 20 29 20 66 70 72 69  =cfp->dot ) fpri
16b80 6e 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a 20 20  ntf(fp," *");.  
16b90 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68    if( i==rp->nrh
16ba0 73 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73  s ) break;.    s
16bb0 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  p = rp->rhs[i];.
16bc0 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
16bd0 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
16be0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
16bf0 28 66 70 2c 22 20 25 73 22 2c 20 73 70 2d 3e 73  (fp," %s", sp->s
16c00 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29 3b  ubsym[0]->name);
16c10 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  .      for(j=1; 
16c20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a  j<sp->nsubsym; j
16c30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
16c40 69 6e 74 66 28 66 70 2c 22 7c 25 73 22 2c 73 70  intf(fp,"|%s",sp
16c50 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d  ->subsym[j]->nam
16c60 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
16c70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72  }else{.      fpr
16c80 69 6e 74 66 28 66 70 2c 22 20 25 73 22 2c 20 73  intf(fp," %s", s
16c90 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  p->name);.    }.
16ca0 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64 65 66 69 6e    }.}../* #defin
16cb0 65 20 54 45 53 54 20 2a 2f 0a 23 69 66 20 30 0a  e TEST */.#if 0.
16cc0 2f 2a 20 50 72 69 6e 74 20 61 20 73 65 74 20 2a  /* Print a set *
16cd0 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 53  /.PRIVATE void S
16ce0 65 74 50 72 69 6e 74 28 6f 75 74 2c 73 65 74 2c  etPrint(out,set,
16cf0 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75 74 3b  lemp).FILE *out;
16d00 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73 74 72 75  .char *set;.stru
16d10 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
16d20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
16d30 72 20 2a 73 70 61 63 65 72 3b 0a 20 20 73 70 61  r *spacer;.  spa
16d40 63 65 72 20 3d 20 22 22 3b 0a 20 20 66 70 72 69  cer = "";.  fpri
16d50 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 5b 22 2c  ntf(out,"%12s[",
16d60 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  "");.  for(i=0; 
16d70 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i<lemp->ntermina
16d80 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
16d90 20 53 65 74 46 69 6e 64 28 73 65 74 2c 69 29 20   SetFind(set,i) 
16da0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
16db0 28 6f 75 74 2c 22 25 73 25 73 22 2c 73 70 61 63  (out,"%s%s",spac
16dc0 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  er,lemp->symbols
16dd0 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [i]->name);.    
16de0 20 20 73 70 61 63 65 72 20 3d 20 22 20 22 3b 0a    spacer = " ";.
16df0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69      }.  }.  fpri
16e00 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b 0a  ntf(out,"]\n");.
16e10 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 70 6c  }../* Print a pl
16e20 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50 52 49  ink chain */.PRI
16e30 56 41 54 45 20 76 6f 69 64 20 50 6c 69 6e 6b 50  VATE void PlinkP
16e40 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74 61 67  rint(out,plp,tag
16e50 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72  ).FILE *out;.str
16e60 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a  uct plink *plp;.
16e70 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20 20 77  char *tag;.{.  w
16e80 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20  hile( plp ){.   
16e90 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31   fprintf(out,"%1
16ea0 32 73 25 73 20 28 73 74 61 74 65 20 25 32 64 29  2s%s (state %2d)
16eb0 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d 3e 63   ","",tag,plp->c
16ec0 66 70 2d 3e 73 74 70 2d 3e 73 74 61 74 65 6e 75  fp->stp->statenu
16ed0 6d 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 50 72  m);.    ConfigPr
16ee0 69 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e 63 66 70  int(out,plp->cfp
16ef0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
16f00 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 70 6c  ut,"\n");.    pl
16f10 70 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20  p = plp->next;. 
16f20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20   }.}.#endif../* 
16f30 50 72 69 6e 74 20 61 6e 20 61 63 74 69 6f 6e 20  Print an action 
16f40 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
16f50 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
16f60 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 2a  eturn FALSE if.*
16f70 2a 20 6e 6f 74 68 69 6e 67 20 77 61 73 20 61 63  * nothing was ac
16f80 74 75 61 6c 6c 79 20 70 72 69 6e 74 65 64 2e 0a  tually printed..
16f90 2a 2f 0a 69 6e 74 20 50 72 69 6e 74 41 63 74 69  */.int PrintActi
16fa0 6f 6e 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  on(struct action
16fb0 20 2a 61 70 2c 20 46 49 4c 45 20 2a 66 70 2c 20   *ap, FILE *fp, 
16fc0 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 69  int indent){.  i
16fd0 6e 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20  nt result = 1;. 
16fe0 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70   switch( ap->typ
16ff0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48  e ){.    case SH
17000 49 46 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  IFT:.      fprin
17010 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74  tf(fp,"%*s shift
17020 20 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d    %d",indent,ap-
17030 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e  >sp->name,ap->x.
17040 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a  stp->statenum);.
17050 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17060 20 63 61 73 65 20 52 45 44 55 43 45 3a 0a 20 20   case REDUCE:.  
17070 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
17080 25 2a 73 20 72 65 64 75 63 65 20 25 64 22 2c 69  %*s reduce %d",i
17090 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
170a0 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64  me,ap->x.rp->ind
170b0 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
170c0 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43 45 50  ;.    case ACCEP
170d0 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  T:.      fprintf
170e0 28 66 70 2c 22 25 2a 73 20 61 63 63 65 70 74 22  (fp,"%*s accept"
170f0 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
17100 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  name);.      bre
17110 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52  ak;.    case ERR
17120 4f 52 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74  OR:.      fprint
17130 66 28 66 70 2c 22 25 2a 73 20 65 72 72 6f 72 22  f(fp,"%*s error"
17140 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
17150 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  name);.      bre
17160 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 52 43  ak;.    case SRC
17170 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 63 61 73  ONFLICT:.    cas
17180 65 20 52 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20  e RRCONFLICT:.  
17190 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
171a0 25 2a 73 20 72 65 64 75 63 65 20 25 2d 33 64 20  %*s reduce %-3d 
171b0 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c  ** Parsing confl
171c0 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20  ict **",.       
171d0 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
171e0 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69  name,ap->x.rp->i
171f0 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  ndex);.      bre
17200 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 43  ak;.    case SSC
17210 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20 66  ONFLICT:.      f
17220 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73  printf(fp,"%*s s
17230 68 69 66 74 20 20 25 2d 33 64 20 2a 2a 20 50 61  hift  %-3d ** Pa
17240 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a  rsing conflict *
17250 2a 22 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 64  *", .        ind
17260 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
17270 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74  ,ap->x.stp->stat
17280 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  enum);.      bre
17290 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f  ak;.    case SH_
172a0 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20  RESOLVED:.      
172b0 69 66 28 20 73 68 6f 77 50 72 65 63 65 64 65 6e  if( showPreceden
172c0 63 65 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20  ceConflict ){.  
172d0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
172e0 2c 22 25 2a 73 20 73 68 69 66 74 20 20 25 2d 33  ,"%*s shift  %-3
172f0 64 20 2d 2d 20 64 72 6f 70 70 65 64 20 62 79 20  d -- dropped by 
17300 70 72 65 63 65 64 65 6e 63 65 22 2c 0a 20 20 20  precedence",.   
17310 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 64               ind
17320 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
17330 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74  ,ap->x.stp->stat
17340 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  enum);.      }el
17350 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75  se{.        resu
17360 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  lt = 0;.      }.
17370 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17380 20 63 61 73 65 20 52 44 5f 52 45 53 4f 4c 56 45   case RD_RESOLVE
17390 44 3a 0a 20 20 20 20 20 20 69 66 28 20 73 68 6f  D:.      if( sho
173a0 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c  wPrecedenceConfl
173b0 69 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ict ){.        f
173c0 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 72  printf(fp,"%*s r
173d0 65 64 75 63 65 20 25 2d 33 64 20 2d 2d 20 64 72  educe %-3d -- dr
173e0 6f 70 70 65 64 20 62 79 20 70 72 65 63 65 64 65  opped by precede
173f0 6e 63 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20  nce",.          
17400 20 20 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d        indent,ap-
17410 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e  >sp->name,ap->x.
17420 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  rp->index);.    
17430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17440 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20   result = 0;.   
17450 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
17460 3b 0a 20 20 20 20 63 61 73 65 20 4e 4f 54 5f 55  ;.    case NOT_U
17470 53 45 44 3a 0a 20 20 20 20 20 20 72 65 73 75 6c  SED:.      resul
17480 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  t = 0;.      bre
17490 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
174a0 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47   result;.}../* G
174b0 65 6e 65 72 61 74 65 20 74 68 65 20 22 79 2e 6f  enerate the "y.o
174c0 75 74 70 75 74 22 20 6c 6f 67 20 66 69 6c 65 20  utput" log file 
174d0 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75  */.void ReportOu
174e0 74 70 75 74 28 73 74 72 75 63 74 20 6c 65 6d 6f  tput(struct lemo
174f0 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74  n *lemp).{.  int
17500 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
17510 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63  te *stp;.  struc
17520 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20  t config *cfp;. 
17530 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
17540 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a  ap;.  FILE *fp;.
17550 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f 6f 70 65  .  fp = file_ope
17560 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c 22 77  n(lemp,".out","w
17570 62 22 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30  b");.  if( fp==0
17580 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
17590 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
175a0 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
175b0 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
175c0 65 64 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e  ed[i];.    fprin
175d0 74 66 28 66 70 2c 22 53 74 61 74 65 20 25 64 3a  tf(fp,"State %d:
175e0 5c 6e 22 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75  \n",stp->statenu
175f0 6d 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70  m);.    if( lemp
17600 2d 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63 66  ->basisflag ) cf
17610 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20 20 20 65  p=stp->bp;.    e
17620 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
17630 20 20 20 20 20 63 66 70 3d 73 74 70 2d 3e 63 66       cfp=stp->cf
17640 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 66  p;.    while( cf
17650 70 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  p ){.      char 
17660 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20 20 20 69  buf[20];.      i
17670 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d 63 66 70  f( cfp->dot==cfp
17680 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20  ->rp->nrhs ){.  
17690 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69        lemon_spri
176a0 6e 74 66 28 62 75 66 2c 22 28 25 64 29 22 2c 63  ntf(buf,"(%d)",c
176b0 66 70 2d 3e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a  fp->rp->index);.
176c0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
176d0 66 70 2c 22 20 20 20 20 25 35 73 20 22 2c 62 75  fp,"    %5s ",bu
176e0 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  f);.      }else{
176f0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
17700 28 66 70 2c 22 20 20 20 20 20 20 20 20 20 20 22  (fp,"          "
17710 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17720 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 66 70 2c   ConfigPrint(fp,
17730 63 66 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69  cfp);.      fpri
17740 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69  ntf(fp,"\n");.#i
17750 66 20 30 0a 20 20 20 20 20 20 53 65 74 50 72 69  f 0.      SetPri
17760 6e 74 28 66 70 2c 63 66 70 2d 3e 66 77 73 2c 6c  nt(fp,cfp->fws,l
17770 65 6d 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e  emp);.      Plin
17780 6b 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66  kPrint(fp,cfp->f
17790 70 6c 70 2c 22 54 6f 20 20 22 29 3b 0a 20 20 20  plp,"To  ");.   
177a0 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70     PlinkPrint(fp
177b0 2c 63 66 70 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d  ,cfp->bplp,"From
177c0 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ");.#endif.     
177d0 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73   if( lemp->basis
177e0 66 6c 61 67 20 29 20 63 66 70 3d 63 66 70 2d 3e  flag ) cfp=cfp->
177f0 62 70 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 20  bp;.      else  
17800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17810 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 3b 0a 20  cfp=cfp->next;. 
17820 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
17830 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 66  (fp,"\n");.    f
17840 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
17850 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
17860 0a 20 20 20 20 20 20 69 66 28 20 50 72 69 6e 74  .      if( Print
17870 41 63 74 69 6f 6e 28 61 70 2c 66 70 2c 33 30 29  Action(ap,fp,30)
17880 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c   ) fprintf(fp,"\
17890 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  n");.    }.    f
178a0 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b  printf(fp,"\n");
178b0 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 66  .  }.  fprintf(f
178c0 70 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  p, "------------
178d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
178e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
178f0 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20  --------\n");.  
17900 66 70 72 69 6e 74 66 28 66 70 2c 20 22 53 79 6d  fprintf(fp, "Sym
17910 62 6f 6c 73 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72  bols:\n");.  for
17920 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
17930 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
17940 20 69 6e 74 20 6a 3b 0a 20 20 20 20 73 74 72 75   int j;.    stru
17950 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a  ct symbol *sp;..
17960 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73      sp = lemp->s
17970 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 66  ymbols[i];.    f
17980 70 72 69 6e 74 66 28 66 70 2c 20 22 20 20 25 33  printf(fp, "  %3
17990 64 3a 20 25 73 22 2c 20 69 2c 20 73 70 2d 3e 6e  d: %s", i, sp->n
179a0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 70  ame);.    if( sp
179b0 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49  ->type==NONTERMI
179c0 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72  NAL ){.      fpr
179d0 69 6e 74 66 28 66 70 2c 20 22 3a 22 29 3b 0a 20  intf(fp, ":");. 
179e0 20 20 20 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d       if( sp->lam
179f0 62 64 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66  bda ){.        f
17a00 70 72 69 6e 74 66 28 66 70 2c 20 22 20 3c 6c 61  printf(fp, " <la
17a10 6d 62 64 61 3e 22 29 3b 0a 20 20 20 20 20 20 7d  mbda>");.      }
17a20 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
17a30 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  j<lemp->ntermina
17a40 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
17a50 20 69 66 28 20 73 70 2d 3e 66 69 72 73 74 73 65   if( sp->firstse
17a60 74 20 26 26 20 53 65 74 46 69 6e 64 28 73 70 2d  t && SetFind(sp-
17a70 3e 66 69 72 73 74 73 65 74 2c 20 6a 29 20 29 7b  >firstset, j) ){
17a80 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
17a90 74 66 28 66 70 2c 20 22 20 25 73 22 2c 20 6c 65  tf(fp, " %s", le
17aa0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e  mp->symbols[j]->
17ab0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
17ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17ad0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
17ae0 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f  \n");.  }.  fclo
17af0 73 65 28 66 70 29 3b 0a 20 20 72 65 74 75 72 6e  se(fp);.  return
17b00 3b 0a 7d 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66  ;.}../* Search f
17b10 6f 72 20 74 68 65 20 66 69 6c 65 20 22 6e 61 6d  or the file "nam
17b20 65 22 20 77 68 69 63 68 20 69 73 20 69 6e 20 74  e" which is in t
17b30 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
17b40 79 20 61 73 0a 2a 2a 20 74 68 65 20 65 78 61 63  y as.** the exac
17b50 75 74 61 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54  utable */.PRIVAT
17b60 45 20 63 68 61 72 20 2a 70 61 74 68 73 65 61 72  E char *pathsear
17b70 63 68 28 63 68 61 72 20 2a 61 72 67 76 30 2c 20  ch(char *argv0, 
17b80 63 68 61 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 20  char *name, int 
17b90 6d 6f 64 65 6d 61 73 6b 29 0a 7b 0a 20 20 63 6f  modemask).{.  co
17ba0 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 6c 69  nst char *pathli
17bb0 73 74 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68  st;.  char *path
17bc0 62 75 66 70 74 72 3b 0a 20 20 63 68 61 72 20 2a  bufptr;.  char *
17bd0 70 61 74 68 62 75 66 3b 0a 20 20 63 68 61 72 20  pathbuf;.  char 
17be0 2a 70 61 74 68 2c 2a 63 70 3b 0a 20 20 63 68 61  *path,*cp;.  cha
17bf0 72 20 63 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57  r c;..#ifdef __W
17c00 49 4e 33 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74  IN32__.  cp = st
17c10 72 72 63 68 72 28 61 72 67 76 30 2c 27 5c 5c 27  rrchr(argv0,'\\'
17c20 29 3b 0a 23 65 6c 73 65 0a 20 20 63 70 20 3d 20  );.#else.  cp = 
17c30 73 74 72 72 63 68 72 28 61 72 67 76 30 2c 27 2f  strrchr(argv0,'/
17c40 27 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ');.#endif.  if(
17c50 20 63 70 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a   cp ){.    c = *
17c60 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b  cp;.    *cp = 0;
17c70 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63 68 61  .    path = (cha
17c80 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f  r *)malloc( lemo
17c90 6e 53 74 72 6c 65 6e 28 61 72 67 76 30 29 20 2b  nStrlen(argv0) +
17ca0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d   lemonStrlen(nam
17cb0 65 29 20 2b 20 32 20 29 3b 0a 20 20 20 20 69 66  e) + 2 );.    if
17cc0 28 20 70 61 74 68 20 29 20 6c 65 6d 6f 6e 5f 73  ( path ) lemon_s
17cd0 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f  printf(path,"%s/
17ce0 25 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b  %s",argv0,name);
17cf0 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20  .    *cp = c;.  
17d00 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61 74 68 6c  }else{.    pathl
17d10 69 73 74 20 3d 20 67 65 74 65 6e 76 28 22 50 41  ist = getenv("PA
17d20 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20 70 61  TH");.    if( pa
17d30 74 68 6c 69 73 74 3d 3d 30 20 29 20 70 61 74 68  thlist==0 ) path
17d40 6c 69 73 74 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f  list = ".:/bin:/
17d50 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20 70 61  usr/bin";.    pa
17d60 74 68 62 75 66 20 3d 20 28 63 68 61 72 20 2a 29  thbuf = (char *)
17d70 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74   malloc( lemonSt
17d80 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 20 2b  rlen(pathlist) +
17d90 20 31 20 29 3b 0a 20 20 20 20 70 61 74 68 20 3d   1 );.    path =
17da0 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
17db0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74   lemonStrlen(pat
17dc0 68 6c 69 73 74 29 2b 6c 65 6d 6f 6e 53 74 72 6c  hlist)+lemonStrl
17dd0 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b 0a 20 20  en(name)+2 );.  
17de0 20 20 69 66 28 20 28 70 61 74 68 62 75 66 20 21    if( (pathbuf !
17df0 3d 20 30 29 20 26 26 20 28 70 61 74 68 21 3d 30  = 0) && (path!=0
17e00 29 20 29 7b 0a 20 20 20 20 20 20 70 61 74 68 62  ) ){.      pathb
17e10 75 66 70 74 72 20 3d 20 70 61 74 68 62 75 66 3b  ufptr = pathbuf;
17e20 0a 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72  .      lemon_str
17e30 63 70 79 28 70 61 74 68 62 75 66 2c 20 70 61 74  cpy(pathbuf, pat
17e40 68 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  hlist);.      wh
17e50 69 6c 65 28 20 2a 70 61 74 68 62 75 66 20 29 7b  ile( *pathbuf ){
17e60 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20 73 74  .        cp = st
17e70 72 63 68 72 28 70 61 74 68 62 75 66 2c 27 3a 27  rchr(pathbuf,':'
17e80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
17e90 70 3d 3d 30 20 29 20 63 70 20 3d 20 26 70 61 74  p==0 ) cp = &pat
17ea0 68 62 75 66 5b 6c 65 6d 6f 6e 53 74 72 6c 65 6e  hbuf[lemonStrlen
17eb0 28 70 61 74 68 62 75 66 29 5d 3b 0a 20 20 20 20  (pathbuf)];.    
17ec0 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20      c = *cp;.   
17ed0 20 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20       *cp = 0;.  
17ee0 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69        lemon_spri
17ef0 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25 73 22  ntf(path,"%s/%s"
17f00 2c 70 61 74 68 62 75 66 2c 6e 61 6d 65 29 3b 0a  ,pathbuf,name);.
17f10 20 20 20 20 20 20 20 20 2a 63 70 20 3d 20 63 3b          *cp = c;
17f20 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
17f30 30 20 29 20 70 61 74 68 62 75 66 5b 30 5d 20 3d  0 ) pathbuf[0] =
17f40 20 30 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65   0;.        else
17f50 20 70 61 74 68 62 75 66 20 3d 20 26 63 70 5b 31   pathbuf = &cp[1
17f60 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ];.        if( a
17f70 63 63 65 73 73 28 70 61 74 68 2c 6d 6f 64 65 6d  ccess(path,modem
17f80 61 73 6b 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ask)==0 ) break;
17f90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
17fa0 72 65 65 28 70 61 74 68 62 75 66 70 74 72 29 3b  ree(pathbufptr);
17fb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17fc0 75 72 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20  urn path;.}../* 
17fd0 47 69 76 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c  Given an action,
17fe0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 69 6e 74   compute the int
17ff0 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74  eger value for t
18000 68 61 74 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68  hat action.** wh
18010 69 63 68 20 69 73 20 74 6f 20 62 65 20 70 75 74  ich is to be put
18020 20 69 6e 20 74 68 65 20 61 63 74 69 6f 6e 20 74   in the action t
18030 61 62 6c 65 20 6f 66 20 74 68 65 20 67 65 6e 65  able of the gene
18040 72 61 74 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a  rated machine..*
18050 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76  * Return negativ
18060 65 20 69 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73  e if no action s
18070 68 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74  hould be generat
18080 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69  ed..*/.PRIVATE i
18090 6e 74 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f  nt compute_actio
180a0 6e 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  n(struct lemon *
180b0 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 61 63 74  lemp, struct act
180c0 69 6f 6e 20 2a 61 70 29 0a 7b 0a 20 20 69 6e 74  ion *ap).{.  int
180d0 20 61 63 74 3b 0a 20 20 73 77 69 74 63 68 28 20   act;.  switch( 
180e0 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20 20  ap->type ){.    
180f0 63 61 73 65 20 53 48 49 46 54 3a 20 20 61 63 74  case SHIFT:  act
18100 20 3d 20 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74   = ap->x.stp->st
18110 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  atenum;         
18120 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
18130 73 65 20 52 45 44 55 43 45 3a 20 61 63 74 20 3d  se REDUCE: act =
18140 20 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78   ap->x.rp->index
18150 20 2b 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   + lemp->nstate;
18160 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
18170 20 45 52 52 4f 52 3a 20 20 61 63 74 20 3d 20 6c   ERROR:  act = l
18180 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65  emp->nstate + le
18190 6d 70 2d 3e 6e 72 75 6c 65 3b 20 20 20 20 20 62  mp->nrule;     b
181a0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41  reak;.    case A
181b0 43 43 45 50 54 3a 20 61 63 74 20 3d 20 6c 65 6d  CCEPT: act = lem
181c0 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70  p->nstate + lemp
181d0 2d 3e 6e 72 75 6c 65 20 2b 20 31 3b 20 62 72 65  ->nrule + 1; bre
181e0 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
181f0 20 20 20 20 20 61 63 74 20 3d 20 2d 31 3b 20 62       act = -1; b
18200 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
18210 72 6e 20 61 63 74 3b 0a 7d 0a 0a 23 64 65 66 69  rn act;.}..#defi
18220 6e 65 20 4c 49 4e 45 53 49 5a 45 20 31 30 30 30  ne LINESIZE 1000
18230 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20 63 6c 75  ./* The next clu
18240 73 74 65 72 20 6f 66 20 72 6f 75 74 69 6e 65 73  ster of routines
18250 20 61 72 65 20 66 6f 72 20 72 65 61 64 69 6e 67   are for reading
18260 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69   the template fi
18270 6c 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 69 6e  le.** and writin
18280 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  g the results to
18290 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70   the generated p
182a0 61 72 73 65 72 20 2a 2f 0a 2f 2a 20 54 68 65 20  arser */./* The 
182b0 66 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20 74  first function t
182c0 72 61 6e 73 66 65 72 73 20 64 61 74 61 20 66 72  ransfers data fr
182d0 6f 6d 20 22 69 6e 22 20 74 6f 20 22 6f 75 74 22  om "in" to "out"
182e0 20 75 6e 74 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65   until.** a line
182f0 20 69 73 20 73 65 65 6e 20 77 68 69 63 68 20 62   is seen which b
18300 65 67 69 6e 73 20 77 69 74 68 20 22 25 25 22 2e  egins with "%%".
18310 20 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65    The line numbe
18320 72 20 69 73 0a 2a 2a 20 74 72 61 63 6b 65 64 2e  r is.** tracked.
18330 0a 2a 2a 0a 2a 2a 20 69 66 20 6e 61 6d 65 21 3d  .**.** if name!=
18340 30 2c 20 74 68 65 6e 20 61 6e 79 20 77 6f 72 64  0, then any word
18350 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
18360 20 22 50 61 72 73 65 22 20 69 73 20 63 68 61 6e   "Parse" is chan
18370 67 65 64 20 74 6f 0a 2a 2a 20 62 65 67 69 6e 20  ged to.** begin 
18380 77 69 74 68 20 2a 6e 61 6d 65 20 69 6e 73 74 65  with *name inste
18390 61 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  ad..*/.PRIVATE v
183a0 6f 69 64 20 74 70 6c 74 5f 78 66 65 72 28 63 68  oid tplt_xfer(ch
183b0 61 72 20 2a 6e 61 6d 65 2c 20 46 49 4c 45 20 2a  ar *name, FILE *
183c0 69 6e 2c 20 46 49 4c 45 20 2a 6f 75 74 2c 20 69  in, FILE *out, i
183d0 6e 74 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20  nt *lineno).{.  
183e0 69 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20  int i, iStart;. 
183f0 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53   char line[LINES
18400 49 5a 45 5d 3b 0a 20 20 77 68 69 6c 65 28 20 66  IZE];.  while( f
18410 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49  gets(line,LINESI
18420 5a 45 2c 69 6e 29 20 26 26 20 28 6c 69 6e 65 5b  ZE,in) && (line[
18430 30 5d 21 3d 27 25 27 20 7c 7c 20 6c 69 6e 65 5b  0]!='%' || line[
18440 31 5d 21 3d 27 25 27 29 20 29 7b 0a 20 20 20 20  1]!='%') ){.    
18450 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
18460 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20   iStart = 0;.   
18470 20 69 66 28 20 6e 61 6d 65 20 29 7b 0a 20 20 20   if( name ){.   
18480 20 20 20 66 6f 72 28 69 3d 30 3b 20 6c 69 6e 65     for(i=0; line
18490 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
184a0 20 20 20 69 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d     if( line[i]==
184b0 27 50 27 20 26 26 20 73 74 72 6e 63 6d 70 28 26  'P' && strncmp(&
184c0 6c 69 6e 65 5b 69 5d 2c 22 50 61 72 73 65 22 2c  line[i],"Parse",
184d0 35 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  5)==0.          
184e0 26 26 20 28 69 3d 3d 30 20 7c 7c 20 21 69 73 61  && (i==0 || !isa
184f0 6c 70 68 61 28 6c 69 6e 65 5b 69 2d 31 5d 29 29  lpha(line[i-1]))
18500 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
18510 20 20 20 20 20 20 69 66 28 20 69 3e 69 53 74 61        if( i>iSta
18520 72 74 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  rt ) fprintf(out
18530 2c 22 25 2e 2a 73 22 2c 69 2d 69 53 74 61 72 74  ,"%.*s",i-iStart
18540 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b  ,&line[iStart]);
18550 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
18560 74 66 28 6f 75 74 2c 22 25 73 22 2c 6e 61 6d 65  tf(out,"%s",name
18570 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
18580 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 4;.          i
18590 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 20  Start = i+1;.   
185a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
185b0 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
185c0 28 6f 75 74 2c 22 25 73 22 2c 26 6c 69 6e 65 5b  (out,"%s",&line[
185d0 69 53 74 61 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a  iStart]);.  }.}.
185e0 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20 66 75 6e  ./* The next fun
185f0 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
18600 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 61 6e  template file an
18610 64 20 6f 70 65 6e 73 20 69 74 2c 20 72 65 74 75  d opens it, retu
18620 72 6e 69 6e 67 0a 2a 2a 20 61 20 70 6f 69 6e 74  rning.** a point
18630 65 72 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64  er to the opened
18640 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54   file. */.PRIVAT
18650 45 20 46 49 4c 45 20 2a 74 70 6c 74 5f 6f 70 65  E FILE *tplt_ope
18660 6e 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  n(struct lemon *
18670 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 61 74 69 63  lemp).{.  static
18680 20 63 68 61 72 20 74 65 6d 70 6c 61 74 65 6e 61   char templatena
18690 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70 61 72 2e 63  me[] = "lempar.c
186a0 22 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 31 30  ";.  char buf[10
186b0 30 30 5d 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b  00];.  FILE *in;
186c0 0a 20 20 63 68 61 72 20 2a 74 70 6c 74 6e 61 6d  .  char *tpltnam
186d0 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a  e;.  char *cp;..
186e0 20 20 2f 2a 20 66 69 72 73 74 2c 20 73 65 65 20    /* first, see 
186f0 69 66 20 75 73 65 72 20 73 70 65 63 69 66 69 65  if user specifie
18700 64 20 61 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  d a template fil
18710 65 6e 61 6d 65 20 6f 6e 20 74 68 65 20 63 6f 6d  ename on the com
18720 6d 61 6e 64 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20  mand line. */.  
18730 69 66 20 28 75 73 65 72 5f 74 65 6d 70 6c 61 74  if (user_templat
18740 65 6e 61 6d 65 20 21 3d 20 30 29 20 7b 0a 20 20  ename != 0) {.  
18750 20 20 69 66 28 20 61 63 63 65 73 73 28 75 73 65    if( access(use
18760 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30  r_templatename,0
18770 30 34 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  04)==-1 ){.     
18780 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
18790 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65 20  "Can't find the 
187a0 70 61 72 73 65 72 20 64 72 69 76 65 72 20 74 65  parser driver te
187b0 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73  mplate file \"%s
187c0 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  \".\n",.        
187d0 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
187e0 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e  e);.      lemp->
187f0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
18800 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
18810 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e  }.    in = fopen
18820 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61  (user_templatena
18830 6d 65 2c 22 72 62 22 29 3b 0a 20 20 20 20 69 66  me,"rb");.    if
18840 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ( in==0 ){.     
18850 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
18860 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 65 20  "Can't open the 
18870 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22  template file \"
18880 25 73 5c 22 2e 5c 6e 22 2c 75 73 65 72 5f 74 65  %s\".\n",user_te
18890 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20  mplatename);.   
188a0 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
188b0 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  t++;.      retur
188c0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 0;.    }.    r
188d0 65 74 75 72 6e 20 69 6e 3b 0a 20 20 7d 0a 0a 20  eturn in;.  }.. 
188e0 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 6c 65   cp = strrchr(le
188f0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 27 2e 27  mp->filename,'.'
18900 29 3b 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20  );.  if( cp ){. 
18910 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66     lemon_sprintf
18920 28 62 75 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28  (buf,"%.*s.lt",(
18930 69 6e 74 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69  int)(cp-lemp->fi
18940 6c 65 6e 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69  lename),lemp->fi
18950 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  lename);.  }else
18960 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69  {.    lemon_spri
18970 6e 74 66 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c  ntf(buf,"%s.lt",
18980 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
18990 0a 20 20 7d 0a 20 20 69 66 28 20 61 63 63 65 73  .  }.  if( acces
189a0 73 28 62 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b  s(buf,004)==0 ){
189b0 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20  .    tpltname = 
189c0 62 75 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  buf;.  }else if(
189d0 20 61 63 63 65 73 73 28 74 65 6d 70 6c 61 74 65   access(template
189e0 6e 61 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a  name,004)==0 ){.
189f0 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74      tpltname = t
18a00 65 6d 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d  emplatename;.  }
18a10 65 6c 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61  else{.    tpltna
18a20 6d 65 20 3d 20 70 61 74 68 73 65 61 72 63 68 28  me = pathsearch(
18a30 6c 65 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70  lemp->argv0,temp
18a40 6c 61 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d  latename,0);.  }
18a50 0a 20 20 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d  .  if( tpltname=
18a60 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
18a70 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
18a80 66 69 6e 64 20 74 68 65 20 70 61 72 73 65 72 20  find the parser 
18a90 64 72 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20  driver template 
18aa0 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c  file \"%s\".\n",
18ab0 0a 20 20 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d  .    templatenam
18ac0 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72  e);.    lemp->er
18ad0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65  rorcnt++;.    re
18ae0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e  turn 0;.  }.  in
18af0 20 3d 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d   = fopen(tpltnam
18b00 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  e,"rb");.  if( i
18b10 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  n==0 ){.    fpri
18b20 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27  ntf(stderr,"Can'
18b30 74 20 6f 70 65 6e 20 74 68 65 20 74 65 6d 70 6c  t open the templ
18b40 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e  ate file \"%s\".
18b50 5c 6e 22 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65  \n",templatename
18b60 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  );.    lemp->err
18b70 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
18b80 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
18b90 75 72 6e 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72  urn in;.}../* Pr
18ba0 69 6e 74 20 61 20 23 6c 69 6e 65 20 64 69 72 65  int a #line dire
18bb0 63 74 69 76 65 20 6c 69 6e 65 20 74 6f 20 74 68  ctive line to th
18bc0 65 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 2a  e output file. *
18bd0 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74  /.PRIVATE void t
18be0 70 6c 74 5f 6c 69 6e 65 64 69 72 28 46 49 4c 45  plt_linedir(FILE
18bf0 20 2a 6f 75 74 2c 20 69 6e 74 20 6c 69 6e 65 6e   *out, int linen
18c00 6f 2c 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  o, char *filenam
18c10 65 29 0a 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f  e).{.  fprintf(o
18c20 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 22  ut,"#line %d \""
18c30 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 77 68 69 6c  ,lineno);.  whil
18c40 65 28 20 2a 66 69 6c 65 6e 61 6d 65 20 29 7b 0a  e( *filename ){.
18c50 20 20 20 20 69 66 28 20 2a 66 69 6c 65 6e 61 6d      if( *filenam
18c60 65 20 3d 3d 20 27 5c 5c 27 20 29 20 70 75 74 63  e == '\\' ) putc
18c70 28 27 5c 5c 27 2c 6f 75 74 29 3b 0a 20 20 20 20  ('\\',out);.    
18c80 70 75 74 63 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f  putc(*filename,o
18c90 75 74 29 3b 0a 20 20 20 20 66 69 6c 65 6e 61 6d  ut);.    filenam
18ca0 65 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  e++;.  }.  fprin
18cb0 74 66 28 6f 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a  tf(out,"\"\n");.
18cc0 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 74  }../* Print a st
18cd0 72 69 6e 67 20 74 6f 20 74 68 65 20 66 69 6c 65  ring to the file
18ce0 20 61 6e 64 20 6b 65 65 70 20 74 68 65 20 6c 69   and keep the li
18cf0 6e 65 6e 75 6d 62 65 72 20 75 70 20 74 6f 20 64  nenumber up to d
18d00 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  ate */.PRIVATE v
18d10 6f 69 64 20 74 70 6c 74 5f 70 72 69 6e 74 28 46  oid tplt_print(F
18d20 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74  ILE *out, struct
18d30 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 68   lemon *lemp, ch
18d40 61 72 20 2a 73 74 72 2c 20 69 6e 74 20 2a 6c 69  ar *str, int *li
18d50 6e 65 6e 6f 29 0a 7b 0a 20 20 69 66 28 20 73 74  neno).{.  if( st
18d60 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
18d70 20 77 68 69 6c 65 28 20 2a 73 74 72 20 29 7b 0a   while( *str ){.
18d80 20 20 20 20 70 75 74 63 28 2a 73 74 72 2c 6f 75      putc(*str,ou
18d90 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 74 72  t);.    if( *str
18da0 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e  =='\n' ) (*linen
18db0 6f 29 2b 2b 3b 0a 20 20 20 20 73 74 72 2b 2b 3b  o)++;.    str++;
18dc0 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 5b 2d  .  }.  if( str[-
18dd0 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]!='\n' ){.    
18de0 70 75 74 63 28 27 5c 6e 27 2c 6f 75 74 29 3b 0a  putc('\n',out);.
18df0 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b      (*lineno)++;
18e00 0a 20 20 7d 0a 20 20 69 66 20 28 21 6c 65 6d 70  .  }.  if (!lemp
18e10 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29  ->nolinenosflag)
18e20 20 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29   {.    (*lineno)
18e30 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  ++; tplt_linedir
18e40 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d  (out,*lineno,lem
18e50 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 20  p->outname); .  
18e60 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
18e70 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
18e80 6e 67 20 72 6f 75 74 69 6e 65 20 65 6d 69 74 73  ng routine emits
18e90 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65   code for the de
18ea0 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
18eb0 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f  .** symbol sp.*/
18ec0 0a 76 6f 69 64 20 65 6d 69 74 5f 64 65 73 74 72  .void emit_destr
18ed0 75 63 74 6f 72 5f 63 6f 64 65 28 0a 20 20 46 49  uctor_code(.  FI
18ee0 4c 45 20 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63  LE *out,.  struc
18ef0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20  t symbol *sp,.  
18f00 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
18f10 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e  mp,.  int *linen
18f20 6f 0a 29 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d  o.){. char *cp =
18f30 20 30 3b 0a 0a 20 69 66 28 20 73 70 2d 3e 74 79   0;.. if( sp->ty
18f40 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
18f50 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f     cp = lemp->to
18f60 6b 65 6e 64 65 73 74 3b 0a 20 20 20 69 66 28 20  kendest;.   if( 
18f70 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  cp==0 ) return;.
18f80 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
18f90 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29  {\n"); (*lineno)
18fa0 2b 2b 3b 0a 20 7d 65 6c 73 65 20 69 66 28 20 73  ++;. }else if( s
18fb0 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 29 7b  p->destructor ){
18fc0 0a 20 20 20 63 70 20 3d 20 73 70 2d 3e 64 65 73  .   cp = sp->des
18fd0 74 72 75 63 74 6f 72 3b 0a 20 20 20 66 70 72 69  tructor;.   fpri
18fe0 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20  ntf(out,"{\n"); 
18ff0 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
19000 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e  if (!lemp->nolin
19010 65 6e 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69  enosflag) { (*li
19020 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69  neno)++; tplt_li
19030 6e 65 64 69 72 28 6f 75 74 2c 73 70 2d 3e 64 65  nedir(out,sp->de
19040 73 74 4c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 66  stLineno,lemp->f
19050 69 6c 65 6e 61 6d 65 29 3b 20 7d 0a 20 7d 65 6c  ilename); }. }el
19060 73 65 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72  se if( lemp->var
19070 64 65 73 74 20 29 7b 0a 20 20 20 63 70 20 3d 20  dest ){.   cp = 
19080 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20  lemp->vardest;. 
19090 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65    if( cp==0 ) re
190a0 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66  turn;.   fprintf
190b0 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c  (out,"{\n"); (*l
190c0 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65  ineno)++;. }else
190d0 7b 0a 20 20 20 61 73 73 65 72 74 28 20 30 20 29  {.   assert( 0 )
190e0 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70  ;  /* Cannot hap
190f0 70 65 6e 20 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b  pen */. }. for(;
19100 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20   *cp; cp++){.   
19110 69 66 28 20 2a 63 70 3d 3d 27 24 27 20 26 26 20  if( *cp=='$' && 
19120 63 70 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20  cp[1]=='$' ){.  
19130 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19140 28 79 79 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29  (yypminor->yy%d)
19150 22 2c 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20  ",sp->dtnum);.  
19160 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f     cp++;.     co
19170 6e 74 69 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20  ntinue;.   }.   
19180 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20  if( *cp=='\n' ) 
19190 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
191a0 66 70 75 74 63 28 2a 63 70 2c 6f 75 74 29 3b 0a  fputc(*cp,out);.
191b0 20 7d 0a 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   }. fprintf(out,
191c0 22 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29  "\n"); (*lineno)
191d0 2b 2b 3b 0a 20 69 66 20 28 21 6c 65 6d 70 2d 3e  ++;. if (!lemp->
191e0 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b  nolinenosflag) {
191f0 20 0a 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b   .   (*lineno)++
19200 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f  ; tplt_linedir(o
19210 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d  ut,*lineno,lemp-
19220 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 7d 0a 20  >outname); . }. 
19230 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e  fprintf(out,"}\n
19240 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
19250 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  . return;.}../*.
19260 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  ** Return TRUE (
19270 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68 65  non-zero) if the
19280 20 67 69 76 65 6e 20 73 79 6d 62 6f 6c 20 68 61   given symbol ha
19290 73 20 61 20 64 65 73 74 72 75 63 74 6f 72 2e 0a  s a destructor..
192a0 2a 2f 0a 69 6e 74 20 68 61 73 5f 64 65 73 74 72  */.int has_destr
192b0 75 63 74 6f 72 28 73 74 72 75 63 74 20 73 79 6d  uctor(struct sym
192c0 62 6f 6c 20 2a 73 70 2c 20 73 74 72 75 63 74 20  bol *sp, struct 
192d0 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
192e0 20 69 6e 74 20 72 65 74 3b 0a 20 20 69 66 28 20   int ret;.  if( 
192f0 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
19300 41 4c 20 29 7b 0a 20 20 20 20 72 65 74 20 3d 20  AL ){.    ret = 
19310 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 21  lemp->tokendest!
19320 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
19330 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 76 61 72   ret = lemp->var
19340 64 65 73 74 21 3d 30 20 7c 7c 20 73 70 2d 3e 64  dest!=0 || sp->d
19350 65 73 74 72 75 63 74 6f 72 21 3d 30 3b 0a 20 20  estructor!=0;.  
19360 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
19370 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
19380 74 65 78 74 20 74 6f 20 61 20 64 79 6e 61 6d 69  text to a dynami
19390 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
193a0 73 74 72 69 6e 67 2e 20 20 49 66 20 7a 54 65 78  string.  If zTex
193b0 74 20 69 73 20 30 20 74 68 65 6e 0a 2a 2a 20 72  t is 0 then.** r
193c0 65 73 65 74 20 74 68 65 20 73 74 72 69 6e 67 20  eset the string 
193d0 74 6f 20 62 65 20 65 6d 70 74 79 20 61 67 61 69  to be empty agai
193e0 6e 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  n.  Always retur
193f0 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  n the complete t
19400 65 78 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 74  ext.** of the st
19410 72 69 6e 67 20 28 77 68 69 63 68 20 69 73 20 6f  ring (which is o
19420 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20  verwritten with 
19430 65 61 63 68 20 63 61 6c 6c 29 2e 0a 2a 2a 0a 2a  each call)..**.*
19440 2a 20 6e 20 62 79 74 65 73 20 6f 66 20 7a 54 65  * n bytes of zTe
19450 78 74 20 61 72 65 20 73 74 6f 72 65 64 2e 20 20  xt are stored.  
19460 49 66 20 6e 3d 3d 30 20 74 68 65 6e 20 61 6c 6c  If n==0 then all
19470 20 6f 66 20 7a 54 65 78 74 20 75 70 20 74 6f 20   of zText up to 
19480 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 5c 30 30  the first.** \00
19490 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 69 73 20  0 terminator is 
194a0 73 74 6f 72 65 64 2e 20 20 7a 54 65 78 74 20 63  stored.  zText c
194b0 61 6e 20 63 6f 6e 74 61 69 6e 20 75 70 20 74 6f  an contain up to
194c0 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f   two instances o
194d0 66 0a 2a 2a 20 25 64 2e 20 20 54 68 65 20 76 61  f.** %d.  The va
194e0 6c 75 65 73 20 6f 66 20 70 31 20 61 6e 64 20 70  lues of p1 and p
194f0 32 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  2 are written in
19500 74 6f 20 74 68 65 20 66 69 72 73 74 20 61 6e 64  to the first and
19510 20 73 65 63 6f 6e 64 0a 2a 2a 20 25 64 2e 0a 2a   second.** %d..*
19520 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 2d 31 2c 20 74  *.** If n==-1, t
19530 68 65 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  hen the previous
19540 20 63 68 61 72 61 63 74 65 72 20 69 73 20 6f 76   character is ov
19550 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 50 52  erwritten..*/.PR
19560 49 56 41 54 45 20 63 68 61 72 20 2a 61 70 70 65  IVATE char *appe
19570 6e 64 5f 73 74 72 28 63 6f 6e 73 74 20 63 68 61  nd_str(const cha
19580 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 6e 2c  r *zText, int n,
19590 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
195a0 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
195b0 65 6d 70 74 79 5b 31 5d 20 3d 20 7b 20 30 20 7d  empty[1] = { 0 }
195c0 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  ;.  static char 
195d0 2a 7a 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  *z = 0;.  static
195e0 20 69 6e 74 20 61 6c 6c 6f 63 65 64 20 3d 20 30   int alloced = 0
195f0 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 75  ;.  static int u
19600 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  sed = 0;.  int c
19610 3b 0a 20 20 63 68 61 72 20 7a 49 6e 74 5b 34 30  ;.  char zInt[40
19620 5d 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d  ];.  if( zText==
19630 30 20 29 7b 0a 20 20 20 20 75 73 65 64 20 3d 20  0 ){.    used = 
19640 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 3b  0;.    return z;
19650 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 3d 30 20  .  }.  if( n<=0 
19660 29 7b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29  ){.    if( n<0 )
19670 7b 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20  {.      used += 
19680 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
19690 20 75 73 65 64 3e 3d 30 20 29 3b 0a 20 20 20 20   used>=0 );.    
196a0 7d 0a 20 20 20 20 6e 20 3d 20 6c 65 6d 6f 6e 53  }.    n = lemonS
196b0 74 72 6c 65 6e 28 7a 54 65 78 74 29 3b 0a 20 20  trlen(zText);.  
196c0 7d 0a 20 20 69 66 28 20 28 69 6e 74 29 20 28 6e  }.  if( (int) (n
196d0 2b 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 2b  +sizeof(zInt)*2+
196e0 75 73 65 64 29 20 3e 3d 20 61 6c 6c 6f 63 65 64  used) >= alloced
196f0 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 65 64 20   ){.    alloced 
19700 3d 20 6e 20 2b 20 73 69 7a 65 6f 66 28 7a 49 6e  = n + sizeof(zIn
19710 74 29 2a 32 20 2b 20 75 73 65 64 20 2b 20 32 30  t)*2 + used + 20
19720 30 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72  0;.    z = (char
19730 20 2a 29 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20   *) realloc(z,  
19740 61 6c 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20  alloced);.  }.  
19750 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
19760 6e 20 65 6d 70 74 79 3b 0a 20 20 77 68 69 6c 65  n empty;.  while
19770 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
19780 20 63 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b   c = *(zText++);
19790 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20  .    if( c=='%' 
197a0 26 26 20 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b  && n>0 && zText[
197b0 30 5d 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20  0]=='d' ){.     
197c0 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 7a   lemon_sprintf(z
197d0 49 6e 74 2c 20 22 25 64 22 2c 20 70 31 29 3b 0a  Int, "%d", p1);.
197e0 20 20 20 20 20 20 70 31 20 3d 20 70 32 3b 0a 20        p1 = p2;. 
197f0 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70       lemon_strcp
19800 79 28 26 7a 5b 75 73 65 64 5d 2c 20 7a 49 6e 74  y(&z[used], zInt
19810 29 3b 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d  );.      used +=
19820 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 26 7a 5b   lemonStrlen(&z[
19830 75 73 65 64 5d 29 3b 0a 20 20 20 20 20 20 7a 54  used]);.      zT
19840 65 78 74 2b 2b 3b 0a 20 20 20 20 20 20 6e 2d 2d  ext++;.      n--
19850 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19860 20 20 20 7a 5b 75 73 65 64 2b 2b 5d 20 3d 20 63     z[used++] = c
19870 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b  ;.    }.  }.  z[
19880 75 73 65 64 5d 20 3d 20 30 3b 0a 20 20 72 65 74  used] = 0;.  ret
19890 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
198a0 7a 43 6f 64 65 20 69 73 20 61 20 73 74 72 69 6e  zCode is a strin
198b0 67 20 74 68 61 74 20 69 73 20 74 68 65 20 61 63  g that is the ac
198c0 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
198d0 77 69 74 68 20 61 20 72 75 6c 65 2e 20 20 45 78  with a rule.  Ex
198e0 70 61 6e 64 0a 2a 2a 20 74 68 65 20 73 79 6d 62  pand.** the symb
198f0 6f 6c 73 20 69 6e 20 74 68 69 73 20 73 74 72 69  ols in this stri
19900 6e 67 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  ng so that the r
19910 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74 73  efer to elements
19920 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 0a 2a   of the parser.*
19930 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a 50 52 49 56  * stack..*/.PRIV
19940 41 54 45 20 76 6f 69 64 20 74 72 61 6e 73 6c 61  ATE void transla
19950 74 65 5f 63 6f 64 65 28 73 74 72 75 63 74 20 6c  te_code(struct l
19960 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75  emon *lemp, stru
19970 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20  ct rule *rp){.  
19980 63 68 61 72 20 2a 63 70 2c 20 2a 78 70 3b 0a 20  char *cp, *xp;. 
19990 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 6c   int i;.  char l
199a0 68 73 75 73 65 64 20 3d 20 30 3b 20 20 20 20 2f  hsused = 0;    /
199b0 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 4c 48  * True if the LH
199c0 53 20 65 6c 65 6d 65 6e 74 20 68 61 73 20 62 65  S element has be
199d0 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61  en used */.  cha
199e0 72 20 75 73 65 64 5b 4d 41 58 52 48 53 5d 3b 20  r used[MAXRHS]; 
199f0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 65 61    /* True for ea
19a00 63 68 20 52 48 53 20 65 6c 65 6d 65 6e 74 20 77  ch RHS element w
19a10 68 69 63 68 20 69 73 20 75 73 65 64 20 2a 2f 0a  hich is used */.
19a20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70  .  for(i=0; i<rp
19a30 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75 73 65  ->nrhs; i++) use
19a40 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 6c 68 73 75  d[i] = 0;.  lhsu
19a50 73 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  sed = 0;..  if( 
19a60 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 7b 0a 20  rp->code==0 ){. 
19a70 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 6e     static char n
19a80 65 77 6c 69 6e 65 73 74 72 5b 32 5d 20 3d 20 7b  ewlinestr[2] = {
19a90 20 27 5c 6e 27 2c 20 27 5c 30 27 20 7d 3b 0a 20   '\n', '\0' };. 
19aa0 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 6e 65     rp->code = ne
19ab0 77 6c 69 6e 65 73 74 72 3b 0a 20 20 20 20 72 70  wlinestr;.    rp
19ac0 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d 3e 72 75 6c  ->line = rp->rul
19ad0 65 6c 69 6e 65 3b 0a 20 20 7d 0a 0a 20 20 61 70  eline;.  }..  ap
19ae0 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30  pend_str(0,0,0,0
19af0 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
19b00 6e 73 74 20 63 61 73 74 20 69 73 20 77 72 6f 6e  nst cast is wron
19b10 67 20 62 75 74 20 68 61 72 6d 6c 65 73 73 2c 20  g but harmless, 
19b20 69 66 20 77 65 27 72 65 20 63 61 72 65 66 75 6c  if we're careful
19b30 2e 20 2a 2f 0a 20 20 66 6f 72 28 63 70 3d 28 63  . */.  for(cp=(c
19b40 68 61 72 20 2a 29 72 70 2d 3e 63 6f 64 65 3b 20  har *)rp->code; 
19b50 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20  *cp; cp++){.    
19b60 69 66 28 20 69 73 61 6c 70 68 61 28 2a 63 70 29  if( isalpha(*cp)
19b70 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63 6f 64   && (cp==rp->cod
19b80 65 20 7c 7c 20 28 21 69 73 61 6c 6e 75 6d 28 63  e || (!isalnum(c
19b90 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d 31 5d  p[-1]) && cp[-1]
19ba0 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20 20 20  !='_')) ){.     
19bb0 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20 20 20   char saved;.   
19bc0 20 20 20 66 6f 72 28 78 70 3d 20 26 63 70 5b 31     for(xp= &cp[1
19bd0 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a 78 70 29 20  ]; isalnum(*xp) 
19be0 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20 78 70 2b  || *xp=='_'; xp+
19bf0 2b 29 3b 0a 20 20 20 20 20 20 73 61 76 65 64 20  +);.      saved 
19c00 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20 2a 78 70  = *xp;.      *xp
19c10 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
19c20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20  rp->lhsalias && 
19c30 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 6c 68  strcmp(cp,rp->lh
19c40 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a 20 20  salias)==0 ){.  
19c50 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
19c60 28 22 79 79 67 6f 74 6f 6d 69 6e 6f 72 2e 79 79  ("yygotominor.yy
19c70 25 64 22 2c 30 2c 72 70 2d 3e 6c 68 73 2d 3e 64  %d",0,rp->lhs->d
19c80 74 6e 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20 20  tnum,0);.       
19c90 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20   cp = xp;.      
19ca0 20 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a 20    lhsused = 1;. 
19cb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19cc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
19cd0 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
19ce0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 70 2d           if( rp-
19cf0 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26 20  >rhsalias[i] && 
19d00 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 72 68  strcmp(cp,rp->rh
19d10 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20 29 7b  salias[i])==0 ){
19d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
19d30 20 63 70 21 3d 72 70 2d 3e 63 6f 64 65 20 26 26   cp!=rp->code &&
19d40 20 63 70 5b 2d 31 5d 3d 3d 27 40 27 20 29 7b 0a   cp[-1]=='@' ){.
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19d60 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   If the argument
19d70 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
19d80 40 58 20 74 68 65 6e 20 73 75 62 73 74 69 74 75  @X then substitu
19d90 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ted.            
19da0 20 20 2a 2a 20 74 68 65 20 74 6f 6b 65 6e 20 6e    ** the token n
19db0 75 6d 62 65 72 20 6f 66 20 58 2c 20 6e 6f 74 20  umber of X, not 
19dc0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 58 20 2a  the value of X *
19dd0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
19de0 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73  append_str("yyms
19df0 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22 2c 2d 31 2c  p[%d].major",-1,
19e00 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 30 29 3b  i-rp->nrhs+1,0);
19e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
19e20 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
19e30 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
19e40 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d  *sp = rp->rhs[i]
19e50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
19e60 69 6e 74 20 64 74 6e 75 6d 3b 0a 20 20 20 20 20  int dtnum;.     
19e70 20 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d           if( sp-
19e80 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
19e90 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
19ea0 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20 3d 20          dtnum = 
19eb0 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 64  sp->subsym[0]->d
19ec0 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
19ed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19ee0 20 20 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d             dtnum
19ef0 20 3d 20 73 70 2d 3e 64 74 6e 75 6d 3b 0a 20 20   = sp->dtnum;.  
19f00 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
19f10 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65              appe
19f20 6e 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25 64  nd_str("yymsp[%d
19f30 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30 2c  ].minor.yy%d",0,
19f40 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 20 64 74  i-rp->nrhs+1, dt
19f50 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  num);.          
19f60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
19f70 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20 20  cp = xp;.       
19f80 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d 20 31       used[i] = 1
19f90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
19fa0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
19fb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
19fc0 20 7d 0a 20 20 20 20 20 20 2a 78 70 20 3d 20 73   }.      *xp = s
19fd0 61 76 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  aved;.    }.    
19fe0 61 70 70 65 6e 64 5f 73 74 72 28 63 70 2c 20 31  append_str(cp, 1
19ff0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 20 2f 2a 20  , 0, 0);.  } /* 
1a000 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 2f  End loop */..  /
1a010 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
1a020 73 75 72 65 20 74 68 65 20 4c 48 53 20 68 61 73  sure the LHS has
1a030 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20   been used */.  
1a040 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
1a050 20 26 26 20 21 6c 68 73 75 73 65 64 20 29 7b 0a   && !lhsused ){.
1a060 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
1a070 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
1a080 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20  ruleline,.      
1a090 22 4c 61 62 65 6c 20 5c 22 25 73 5c 22 20 66 6f  "Label \"%s\" fo
1a0a0 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20  r \"%s(%s)\" is 
1a0b0 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20  never used.",.  
1a0c0 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69        rp->lhsali
1a0d0 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65  as,rp->lhs->name
1a0e0 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a  ,rp->lhsalias);.
1a0f0 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
1a100 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nt++;.  }..  /* 
1a110 47 65 6e 65 72 61 74 65 20 64 65 73 74 72 75 63  Generate destruc
1a120 74 6f 72 20 63 6f 64 65 20 66 6f 72 20 52 48 53  tor code for RHS
1a130 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 61   symbols which a
1a140 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 74  re not used in t
1a150 68 65 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 63  he.  ** reduce c
1a160 6f 64 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ode */.  for(i=0
1a170 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
1a180 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  +){.    if( rp->
1a190 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26 20 21  rhsalias[i] && !
1a1a0 75 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20  used[i] ){.     
1a1b0 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
1a1c0 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c  filename,rp->rul
1a1d0 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 22  eline,.        "
1a1e0 4c 61 62 65 6c 20 25 73 20 66 6f 72 20 5c 22 25  Label %s for \"%
1a1f0 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72  s(%s)\" is never
1a200 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20   used.",.       
1a210 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
1a220 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d  ,rp->rhs[i]->nam
1a230 65 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  e,rp->rhsalias[i
1a240 5d 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e  ]);.      lemp->
1a250 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
1a260 7d 65 6c 73 65 20 69 66 28 20 72 70 2d 3e 72 68  }else if( rp->rh
1a270 73 61 6c 69 61 73 5b 69 5d 3d 3d 30 20 29 7b 0a  salias[i]==0 ){.
1a280 20 20 20 20 20 20 69 66 28 20 68 61 73 5f 64 65        if( has_de
1a290 73 74 72 75 63 74 6f 72 28 72 70 2d 3e 72 68 73  structor(rp->rhs
1a2a0 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20 20  [i],lemp) ){.   
1a2b0 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28       append_str(
1a2c0 22 20 20 79 79 5f 64 65 73 74 72 75 63 74 6f 72  "  yy_destructor
1a2d0 28 79 79 70 50 61 72 73 65 72 2c 25 64 2c 26 79  (yypParser,%d,&y
1a2e0 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b  ymsp[%d].minor);
1a2f0 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  \n", 0,.        
1a300 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 69     rp->rhs[i]->i
1a310 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b  ndex,i-rp->nrhs+
1a320 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
1a330 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 64  .        /* No d
1a340 65 73 74 72 75 63 74 6f 72 20 64 65 66 69 6e 65  estructor define
1a350 64 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20  d for this term 
1a360 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
1a370 0a 20 20 7d 0a 20 20 69 66 28 20 72 70 2d 3e 63  .  }.  if( rp->c
1a380 6f 64 65 20 29 7b 0a 20 20 20 20 63 70 20 3d 20  ode ){.    cp = 
1a390 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30  append_str(0,0,0
1a3a0 2c 30 29 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64  ,0);.    rp->cod
1a3b0 65 20 3d 20 53 74 72 73 61 66 65 28 63 70 3f 63  e = Strsafe(cp?c
1a3c0 70 3a 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  p:"");.  }.}../*
1a3d0 20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f   .** Generate co
1a3e0 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
1a3f0 73 20 77 68 65 6e 20 74 68 65 20 72 75 6c 65 20  s when the rule 
1a400 22 72 70 22 20 69 73 20 72 65 64 75 63 65 64 2e  "rp" is reduced.
1a410 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 63    Write.** the c
1a420 6f 64 65 20 74 6f 20 22 6f 75 74 22 2e 20 20 4d  ode to "out".  M
1a430 61 6b 65 20 73 75 72 65 20 6c 69 6e 65 6e 6f 20  ake sure lineno 
1a440 73 74 61 79 73 20 75 70 2d 74 6f 2d 64 61 74 65  stays up-to-date
1a450 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  ..*/.PRIVATE voi
1a460 64 20 65 6d 69 74 5f 63 6f 64 65 28 0a 20 20 46  d emit_code(.  F
1a470 49 4c 45 20 2a 6f 75 74 2c 0a 20 20 73 74 72 75  ILE *out,.  stru
1a480 63 74 20 72 75 6c 65 20 2a 72 70 2c 0a 20 20 73  ct rule *rp,.  s
1a490 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
1a4a0 70 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f  p,.  int *lineno
1a4b0 0a 29 7b 0a 20 63 6f 6e 73 74 20 63 68 61 72 20  .){. const char 
1a4c0 2a 63 70 3b 0a 0a 20 2f 2a 20 47 65 6e 65 72 61  *cp;.. /* Genera
1a4d0 74 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  te code to do th
1a4e0 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20  e reduce action 
1a4f0 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65  */. if( rp->code
1a500 20 29 7b 0a 20 20 20 69 66 20 28 21 6c 65 6d 70   ){.   if (!lemp
1a510 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29  ->nolinenosflag)
1a520 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20   { (*lineno)++; 
1a530 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74  tplt_linedir(out
1a540 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e  ,rp->line,lemp->
1a550 66 69 6c 65 6e 61 6d 65 29 3b 20 7d 0a 20 20 20  filename); }.   
1a560 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 25 73  fprintf(out,"{%s
1a570 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 0a 20 20 20  ",rp->code);.   
1a580 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b  for(cp=rp->code;
1a590 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20   *cp; cp++){.   
1a5a0 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20    if( *cp=='\n' 
1a5b0 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20  ) (*lineno)++;. 
1a5c0 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
1a5d0 2a 2f 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  */.   fprintf(ou
1a5e0 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65  t,"}\n"); (*line
1a5f0 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 20 28 21 6c  no)++;.   if (!l
1a600 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c  emp->nolinenosfl
1a610 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  ag) { (*lineno)+
1a620 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28  +; tplt_linedir(
1a630 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70  out,*lineno,lemp
1a640 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 7d 0a 20 7d  ->outname); }. }
1a650 20 2f 2a 20 45 6e 64 20 69 66 28 20 72 70 2d 3e   /* End if( rp->
1a660 63 6f 64 65 20 29 20 2a 2f 0a 0a 20 72 65 74 75  code ) */.. retu
1a670 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  rn;.}../*.** Pri
1a680 6e 74 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  nt the definitio
1a690 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f 6e 20 75  n of the union u
1a6a0 73 65 64 20 66 6f 72 20 74 68 65 20 70 61 72 73  sed for the pars
1a6b0 65 72 27 73 20 64 61 74 61 20 73 74 61 63 6b 2e  er's data stack.
1a6c0 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f 6e 20 63  .** This union c
1a6d0 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64 73 20 66  ontains fields f
1a6e0 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c  or every possibl
1a6f0 65 20 64 61 74 61 20 74 79 70 65 20 66 6f 72 20  e data type for 
1a700 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f  tokens.** and no
1a710 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20 49 6e 20  nterminals.  In 
1a720 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 63  the process of c
1a730 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20 70 72 69  omputing and pri
1a740 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a 20 75 6e  nting this.** un
1a750 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74 20 74 68  ion, also set th
1a760 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64  e ".dtnum" field
1a770 20 6f 66 20 65 76 65 72 79 20 74 65 72 6d 69 6e   of every termin
1a780 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e  al and nontermin
1a790 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f  al.** symbol..*/
1a7a0 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73 74 61 63  .void print_stac
1a7b0 6b 5f 75 6e 69 6f 6e 28 0a 20 20 46 49 4c 45 20  k_union(.  FILE 
1a7c0 2a 6f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20  *out,           
1a7d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75         /* The ou
1a7e0 74 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20  tput stream */. 
1a7f0 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c   struct lemon *l
1a800 65 6d 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  emp,         /* 
1a810 54 68 65 20 6d 61 69 6e 20 69 6e 66 6f 20 73 74  The main info st
1a820 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 69 73  ructure for this
1a830 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 69 6e 74   parser */.  int
1a840 20 2a 70 6c 69 6e 65 6e 6f 2c 20 20 20 20 20 20   *plineno,      
1a850 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1a860 74 65 72 20 74 6f 20 74 68 65 20 6c 69 6e 65 20  ter to the line 
1a870 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
1a880 6d 68 66 6c 61 67 20 20 20 20 20 20 20 20 20 20  mhflag          
1a890 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1a8a0 69 66 20 67 65 6e 65 72 61 74 69 6e 67 20 6d 61  if generating ma
1a8b0 6b 65 68 65 61 64 65 72 73 20 6f 75 74 70 75 74  keheaders output
1a8c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6c 69 6e   */.){.  int lin
1a8d0 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20  eno = *plineno; 
1a8e0 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20 6e     /* The line n
1a8f0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6f 75 74  umber of the out
1a900 70 75 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  put */.  char **
1a910 74 79 70 65 73 3b 20 20 20 20 20 20 20 20 20 20  types;          
1a920 20 20 20 2f 2a 20 41 20 68 61 73 68 20 74 61 62     /* A hash tab
1a930 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65 73 20  le of datatypes 
1a940 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61 79 73 69  */.  int arraysi
1a950 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
1a960 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 22 74  * Size of the "t
1a970 79 70 65 73 22 20 61 72 72 61 79 20 2a 2f 0a 20  ypes" array */. 
1a980 20 69 6e 74 20 6d 61 78 64 74 6c 65 6e 67 74 68   int maxdtlength
1a990 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  ;          /* Ma
1a9a0 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20  ximum length of 
1a9b0 61 6e 79 20 22 2e 64 61 74 61 74 79 70 65 22 20  any ".datatype" 
1a9c0 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 63 68 61 72  field. */.  char
1a9d0 20 2a 73 74 64 64 74 3b 20 20 20 20 20 20 20 20   *stddt;        
1a9e0 20 20 20 20 20 20 2f 2a 20 53 74 61 6e 64 61 72        /* Standar
1a9f0 64 69 7a 65 64 20 6e 61 6d 65 20 66 6f 72 20 61  dized name for a
1aa00 20 64 61 74 61 74 79 70 65 20 2a 2f 0a 20 20 69   datatype */.  i
1aa10 6e 74 20 69 2c 6a 3b 20 20 20 20 20 20 20 20 20  nt i,j;         
1aa20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
1aa30 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 75   counters */.  u
1aa40 6e 73 69 67 6e 65 64 20 68 61 73 68 3b 20 20 20  nsigned hash;   
1aa50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1aa60 68 61 73 68 69 6e 67 20 74 68 65 20 6e 61 6d 65  hashing the name
1aa70 20 6f 66 20 61 20 74 79 70 65 20 2a 2f 0a 20 20   of a type */.  
1aa80 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65  const char *name
1aa90 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
1aaa0 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20  e of the parser 
1aab0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
1aac0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
1aad0 20 74 79 70 65 73 5b 5d 20 61 6e 64 20 61 6c 6c   types[] and all
1aae0 6f 63 61 74 65 20 73 74 64 64 74 5b 5d 20 2a 2f  ocate stddt[] */
1aaf0 0a 20 20 61 72 72 61 79 73 69 7a 65 20 3d 20 6c  .  arraysize = l
1ab00 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32  emp->nsymbol * 2
1ab10 3b 0a 20 20 74 79 70 65 73 20 3d 20 28 63 68 61  ;.  types = (cha
1ab20 72 2a 2a 29 63 61 6c 6c 6f 63 28 20 61 72 72 61  r**)calloc( arra
1ab30 79 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28 63 68  ysize, sizeof(ch
1ab40 61 72 2a 29 20 29 3b 0a 20 20 69 66 28 20 74 79  ar*) );.  if( ty
1ab50 70 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  pes==0 ){.    fp
1ab60 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75  rintf(stderr,"Ou
1ab70 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29  t of memory.\n")
1ab80 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
1ab90 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1aba0 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29 20  arraysize; i++) 
1abb0 74 79 70 65 73 5b 69 5d 20 3d 20 30 3b 0a 20 20  types[i] = 0;.  
1abc0 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 30 3b  maxdtlength = 0;
1abd0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72  .  if( lemp->var
1abe0 74 79 70 65 20 29 7b 0a 20 20 20 20 6d 61 78 64  type ){.    maxd
1abf0 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6d 6f 6e 53  tlength = lemonS
1ac00 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61 72 74  trlen(lemp->vart
1ac10 79 70 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ype);.  }.  for(
1ac20 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
1ac30 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
1ac40 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 73 74 72  int len;.    str
1ac50 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
1ac60 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
1ac70 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 64  ];.    if( sp->d
1ac80 61 74 61 74 79 70 65 3d 3d 30 20 29 20 63 6f 6e  atatype==0 ) con
1ac90 74 69 6e 75 65 3b 0a 20 20 20 20 6c 65 6e 20 3d  tinue;.    len =
1aca0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 70 2d   lemonStrlen(sp-
1acb0 3e 64 61 74 61 74 79 70 65 29 3b 0a 20 20 20 20  >datatype);.    
1acc0 69 66 28 20 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e  if( len>maxdtlen
1acd0 67 74 68 20 29 20 6d 61 78 64 74 6c 65 6e 67 74  gth ) maxdtlengt
1ace0 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73  h = len;.  }.  s
1acf0 74 64 64 74 20 3d 20 28 63 68 61 72 2a 29 6d 61  tddt = (char*)ma
1ad00 6c 6c 6f 63 28 20 6d 61 78 64 74 6c 65 6e 67 74  lloc( maxdtlengt
1ad10 68 2a 32 20 2b 20 31 20 29 3b 0a 20 20 69 66 28  h*2 + 1 );.  if(
1ad20 20 73 74 64 64 74 3d 3d 30 20 29 7b 0a 20 20 20   stddt==0 ){.   
1ad30 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1ad40 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c  "Out of memory.\
1ad50 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
1ad60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c  ;.  }..  /* Buil
1ad70 64 20 61 20 68 61 73 68 20 74 61 62 6c 65 20 6f  d a hash table o
1ad80 66 20 64 61 74 61 74 79 70 65 73 2e 20 54 68 65  f datatypes. The
1ad90 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20   ".dtnum" field 
1ada0 6f 66 20 65 61 63 68 20 73 79 6d 62 6f 6c 0a 20  of each symbol. 
1adb0 20 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 69 6e   ** is filled in
1adc0 20 77 69 74 68 20 74 68 65 20 68 61 73 68 20 69   with the hash i
1add0 6e 64 65 78 20 70 6c 75 73 20 31 2e 20 20 41 20  ndex plus 1.  A 
1ade0 22 2e 64 74 6e 75 6d 22 20 76 61 6c 75 65 20 6f  ".dtnum" value o
1adf0 66 20 30 20 69 73 0a 20 20 2a 2a 20 75 73 65 64  f 0 is.  ** used
1ae00 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 20 73 79   for terminal sy
1ae10 6d 62 6f 6c 73 2e 20 20 49 66 20 74 68 65 72 65  mbols.  If there
1ae20 20 69 73 20 6e 6f 20 25 64 65 66 61 75 6c 74 5f   is no %default_
1ae30 74 79 70 65 20 64 65 66 69 6e 65 64 20 74 68 65  type defined the
1ae40 6e 0a 20 20 2a 2a 20 30 20 69 73 20 61 6c 73 6f  n.  ** 0 is also
1ae50 20 75 73 65 64 20 61 73 20 74 68 65 20 2e 64 74   used as the .dt
1ae60 6e 75 6d 20 76 61 6c 75 65 20 66 6f 72 20 6e 6f  num value for no
1ae70 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68  nterminals which
1ae80 20 64 6f 20 6e 6f 74 20 73 70 65 63 69 66 79 0a   do not specify.
1ae90 20 20 2a 2a 20 61 20 64 61 74 61 74 79 70 65 20    ** a datatype 
1aea0 75 73 69 6e 67 20 74 68 65 20 25 74 79 70 65 20  using the %type 
1aeb0 64 69 72 65 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  directive..  */.
1aec0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1aed0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
1aee0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  {.    struct sym
1aef0 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e  bol *sp = lemp->
1af00 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
1af10 63 68 61 72 20 2a 63 70 3b 0a 20 20 20 20 69 66  char *cp;.    if
1af20 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e 65 72 72 73  ( sp==lemp->errs
1af30 79 6d 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e  ym ){.      sp->
1af40 64 74 6e 75 6d 20 3d 20 61 72 72 61 79 73 69 7a  dtnum = arraysiz
1af50 65 2b 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  e+1;.      conti
1af60 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
1af70 66 28 20 73 70 2d 3e 74 79 70 65 21 3d 4e 4f 4e  f( sp->type!=NON
1af80 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 28 73 70 2d  TERMINAL || (sp-
1af90 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 26 26 20  >datatype==0 && 
1afa0 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3d 3d 30  lemp->vartype==0
1afb0 29 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64  ) ){.      sp->d
1afc0 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  tnum = 0;.      
1afd0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1afe0 20 20 20 20 63 70 20 3d 20 73 70 2d 3e 64 61 74      cp = sp->dat
1aff0 61 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20 63  atype;.    if( c
1b000 70 3d 3d 30 20 29 20 63 70 20 3d 20 6c 65 6d 70  p==0 ) cp = lemp
1b010 2d 3e 76 61 72 74 79 70 65 3b 0a 20 20 20 20 6a  ->vartype;.    j
1b020 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
1b030 20 69 73 73 70 61 63 65 28 2a 63 70 29 20 29 20   isspace(*cp) ) 
1b040 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28  cp++;.    while(
1b050 20 2a 63 70 20 29 20 73 74 64 64 74 5b 6a 2b 2b   *cp ) stddt[j++
1b060 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20 20 20 20 77  ] = *cp++;.    w
1b070 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 69 73 73  hile( j>0 && iss
1b080 70 61 63 65 28 73 74 64 64 74 5b 6a 2d 31 5d 29  pace(stddt[j-1])
1b090 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 73 74 64 64   ) j--;.    stdd
1b0a0 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66  t[j] = 0;.    if
1b0b0 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70  ( lemp->tokentyp
1b0c0 65 20 26 26 20 73 74 72 63 6d 70 28 73 74 64 64  e && strcmp(stdd
1b0d0 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79  t, lemp->tokenty
1b0e0 70 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pe)==0 ){.      
1b0f0 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20  sp->dtnum = 0;. 
1b100 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1b110 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20     }.    hash = 
1b120 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
1b130 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  stddt[j]; j++){.
1b140 20 20 20 20 20 20 68 61 73 68 20 3d 20 68 61 73        hash = has
1b150 68 2a 35 33 20 2b 20 73 74 64 64 74 5b 6a 5d 3b  h*53 + stddt[j];
1b160 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20  .    }.    hash 
1b170 3d 20 28 68 61 73 68 20 26 20 30 78 37 66 66 66  = (hash & 0x7fff
1b180 66 66 66 66 29 25 61 72 72 61 79 73 69 7a 65 3b  ffff)%arraysize;
1b190 0a 20 20 20 20 77 68 69 6c 65 28 20 74 79 70 65  .    while( type
1b1a0 73 5b 68 61 73 68 5d 20 29 7b 0a 20 20 20 20 20  s[hash] ){.     
1b1b0 20 69 66 28 20 73 74 72 63 6d 70 28 74 79 70 65   if( strcmp(type
1b1c0 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3d 3d  s[hash],stddt)==
1b1d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70 2d  0 ){.        sp-
1b1e0 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20  >dtnum = hash + 
1b1f0 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
1b200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b210 68 61 73 68 2b 2b 3b 0a 20 20 20 20 20 20 69 66  hash++;.      if
1b220 28 20 68 61 73 68 3e 3d 28 75 6e 73 69 67 6e 65  ( hash>=(unsigne
1b230 64 29 61 72 72 61 79 73 69 7a 65 20 29 20 68 61  d)arraysize ) ha
1b240 73 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  sh = 0;.    }.  
1b250 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68    if( types[hash
1b260 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70  ]==0 ){.      sp
1b270 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b  ->dtnum = hash +
1b280 20 31 3b 0a 20 20 20 20 20 20 74 79 70 65 73 5b   1;.      types[
1b290 68 61 73 68 5d 20 3d 20 28 63 68 61 72 2a 29 6d  hash] = (char*)m
1b2a0 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
1b2b0 65 6e 28 73 74 64 64 74 29 2b 31 20 29 3b 0a 20  en(stddt)+1 );. 
1b2c0 20 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 68       if( types[h
1b2d0 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ash]==0 ){.     
1b2e0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1b2f0 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
1b300 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65  .\n");.        e
1b310 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a  xit(1);.      }.
1b320 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63        lemon_strc
1b330 70 79 28 74 79 70 65 73 5b 68 61 73 68 5d 2c 73  py(types[hash],s
1b340 74 64 64 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tddt);.    }.  }
1b350 0a 0a 20 20 2f 2a 20 50 72 69 6e 74 20 6f 75 74  ..  /* Print out
1b360 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20   the definition 
1b370 6f 66 20 59 59 54 4f 4b 45 4e 54 59 50 45 20 61  of YYTOKENTYPE a
1b380 6e 64 20 59 59 4d 49 4e 4f 52 54 59 50 45 20 2a  nd YYMINORTYPE *
1b390 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d  /.  name = lemp-
1b3a0 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61  >name ? lemp->na
1b3b0 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20  me : "Parse";.  
1b3c0 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e  lineno = *plinen
1b3d0 6f 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  o;.  if( mhflag 
1b3e0 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ){ fprintf(out,"
1b3f0 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22  #if INTERFACE\n"
1b400 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20  ); lineno++; }. 
1b410 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1b420 65 66 69 6e 65 20 25 73 54 4f 4b 45 4e 54 59 50  efine %sTOKENTYP
1b430 45 20 25 73 5c 6e 22 2c 6e 61 6d 65 2c 0a 20 20  E %s\n",name,.  
1b440 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70    lemp->tokentyp
1b450 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70  e?lemp->tokentyp
1b460 65 3a 22 76 6f 69 64 2a 22 29 3b 20 20 6c 69 6e  e:"void*");  lin
1b470 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66  eno++;.  if( mhf
1b480 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  lag ){ fprintf(o
1b490 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  ut,"#endif\n"); 
1b4a0 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70  lineno++; }.  fp
1b4b0 72 69 6e 74 66 28 6f 75 74 2c 22 74 79 70 65 64  rintf(out,"typed
1b4c0 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e 22 29 3b 20  ef union {\n"); 
1b4d0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1b4e0 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e 74 20 79  ntf(out,"  int y
1b4f0 79 69 6e 69 74 3b 5c 6e 22 29 3b 20 6c 69 6e 65  yinit;\n"); line
1b500 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1b510 6f 75 74 2c 22 20 20 25 73 54 4f 4b 45 4e 54 59  out,"  %sTOKENTY
1b520 50 45 20 79 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29  PE yy0;\n",name)
1b530 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
1b540 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69  r(i=0; i<arraysi
1b550 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ze; i++){.    if
1b560 28 20 74 79 70 65 73 5b 69 5d 3d 3d 30 20 29 20  ( types[i]==0 ) 
1b570 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70  continue;.    fp
1b580 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 20  rintf(out,"  %s 
1b590 79 79 25 64 3b 5c 6e 22 2c 74 79 70 65 73 5b 69  yy%d;\n",types[i
1b5a0 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ],i+1); lineno++
1b5b0 3b 0a 20 20 20 20 66 72 65 65 28 74 79 70 65 73  ;.    free(types
1b5c0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [i]);.  }.  if( 
1b5d0 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73  lemp->errsym->us
1b5e0 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69  eCnt ){.    fpri
1b5f0 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e 74 20 79  ntf(out,"  int y
1b600 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72  y%d;\n",lemp->er
1b610 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69  rsym->dtnum); li
1b620 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 72  neno++;.  }.  fr
1b630 65 65 28 73 74 64 64 74 29 3b 0a 20 20 66 72 65  ee(stddt);.  fre
1b640 65 28 74 79 70 65 73 29 3b 0a 20 20 66 70 72 69  e(types);.  fpri
1b650 6e 74 66 28 6f 75 74 2c 22 7d 20 59 59 4d 49 4e  ntf(out,"} YYMIN
1b660 4f 52 54 59 50 45 3b 5c 6e 22 29 3b 20 6c 69 6e  ORTYPE;\n"); lin
1b670 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c 69 6e 65 6e  eno++;.  *plinen
1b680 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 7d 0a 0a 2f  o = lineno;.}../
1b690 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1b6a0 6e 61 6d 65 20 6f 66 20 61 20 43 20 64 61 74 61  name of a C data
1b6b0 74 79 70 65 20 61 62 6c 65 20 74 6f 20 72 65 70  type able to rep
1b6c0 72 65 73 65 6e 74 20 76 61 6c 75 65 73 20 62 65  resent values be
1b6d0 74 77 65 65 6e 0a 2a 2a 20 6c 77 72 20 61 6e 64  tween.** lwr and
1b6e0 20 75 70 72 2c 20 69 6e 63 6c 75 73 69 76 65 2e   upr, inclusive.
1b6f0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1b700 20 63 68 61 72 20 2a 6d 69 6e 69 6d 75 6d 5f 73   char *minimum_s
1b710 69 7a 65 5f 74 79 70 65 28 69 6e 74 20 6c 77 72  ize_type(int lwr
1b720 2c 20 69 6e 74 20 75 70 72 29 7b 0a 20 20 69 66  , int upr){.  if
1b730 28 20 6c 77 72 3e 3d 30 20 29 7b 0a 20 20 20 20  ( lwr>=0 ){.    
1b740 69 66 28 20 75 70 72 3c 3d 32 35 35 20 29 7b 0a  if( upr<=255 ){.
1b750 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e        return "un
1b760 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20  signed char";.  
1b770 20 20 7d 65 6c 73 65 20 69 66 28 20 75 70 72 3c    }else if( upr<
1b780 36 35 35 33 35 20 29 7b 0a 20 20 20 20 20 20 72  65535 ){.      r
1b790 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65 64 20  eturn "unsigned 
1b7a0 73 68 6f 72 74 20 69 6e 74 22 3b 0a 20 20 20 20  short int";.    
1b7b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
1b7c0 75 72 6e 20 22 75 6e 73 69 67 6e 65 64 20 69 6e  urn "unsigned in
1b7d0 74 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t";.    }.  }els
1b7e0 65 20 69 66 28 20 6c 77 72 3e 3d 2d 31 32 37 20  e if( lwr>=-127 
1b7f0 26 26 20 75 70 72 3c 3d 31 32 37 20 29 7b 0a 20  && upr<=127 ){. 
1b800 20 20 20 72 65 74 75 72 6e 20 22 73 69 67 6e 65     return "signe
1b810 64 20 63 68 61 72 22 3b 0a 20 20 7d 65 6c 73 65  d char";.  }else
1b820 20 69 66 28 20 6c 77 72 3e 3d 2d 33 32 37 36 37   if( lwr>=-32767
1b830 20 26 26 20 75 70 72 3c 33 32 37 36 37 20 29 7b   && upr<32767 ){
1b840 0a 20 20 20 20 72 65 74 75 72 6e 20 22 73 68 6f  .    return "sho
1b850 72 74 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rt";.  }else{.  
1b860 20 20 72 65 74 75 72 6e 20 22 69 6e 74 22 3b 0a    return "int";.
1b870 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63    }.}../*.** Eac
1b880 68 20 73 74 61 74 65 20 63 6f 6e 74 61 69 6e 73  h state contains
1b890 20 61 20 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20   a set of token 
1b8a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
1b8b0 61 20 73 65 74 20 6f 66 0a 2a 2a 20 6e 6f 6e 74  a set of.** nont
1b8c0 65 72 6d 69 6e 61 6c 20 74 72 61 6e 73 61 63 74  erminal transact
1b8d0 69 6f 6e 73 2e 20 20 45 61 63 68 20 6f 66 20 74  ions.  Each of t
1b8e0 68 65 73 65 20 73 65 74 73 20 6d 61 6b 65 73 20  hese sets makes 
1b8f0 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f  an instance.** o
1b900 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1b910 73 74 72 75 63 74 75 72 65 2e 20 20 41 6e 20 61  structure.  An a
1b920 72 72 61 79 20 6f 66 20 74 68 65 73 65 20 73 74  rray of these st
1b930 72 75 63 74 75 72 65 73 20 69 73 20 75 73 65 64  ructures is used
1b940 0a 2a 2a 20 74 6f 20 6f 72 64 65 72 20 74 68 65  .** to order the
1b950 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 65 6e 74   creation of ent
1b960 72 69 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61  ries in the yy_a
1b970 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a  ction[] table..*
1b980 2f 0a 73 74 72 75 63 74 20 61 78 73 65 74 20 7b  /.struct axset {
1b990 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
1b9a0 2a 73 74 70 3b 20 20 20 2f 2a 20 41 20 70 6f 69  *stp;   /* A poi
1b9b0 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 65 20  nter to a state 
1b9c0 2a 2f 0a 20 20 69 6e 74 20 69 73 54 6b 6e 3b 20  */.  int isTkn; 
1b9d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1b9e0 65 20 74 6f 20 75 73 65 20 74 6f 6b 65 6e 73 2e  e to use tokens.
1b9f0 20 20 46 61 6c 73 65 20 66 6f 72 20 6e 6f 6e 2d    False for non-
1ba00 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69  terminals */.  i
1ba10 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20  nt nAction;     
1ba20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ba30 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   actions */.  in
1ba40 74 20 69 4f 72 64 65 72 3b 20 20 20 20 20 20 20  t iOrder;       
1ba50 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6f     /* Original o
1ba60 72 64 65 72 20 6f 66 20 61 63 74 69 6f 6e 20 73  rder of action s
1ba70 65 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ets */.};../*.**
1ba80 20 43 6f 6d 70 61 72 65 20 74 6f 20 61 78 73 65   Compare to axse
1ba90 74 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  t structures for
1baa0 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65   sorting purpose
1bab0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
1bac0 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 28 63 6f  axset_compare(co
1bad0 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e  nst void *a, con
1bae0 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 73  st void *b){.  s
1baf0 74 72 75 63 74 20 61 78 73 65 74 20 2a 70 31 20  truct axset *p1 
1bb00 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74 2a  = (struct axset*
1bb10 29 61 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73  )a;.  struct axs
1bb20 65 74 20 2a 70 32 20 3d 20 28 73 74 72 75 63 74  et *p2 = (struct
1bb30 20 61 78 73 65 74 2a 29 62 3b 0a 20 20 69 6e 74   axset*)b;.  int
1bb40 20 63 3b 0a 20 20 63 20 3d 20 70 32 2d 3e 6e 41   c;.  c = p2->nA
1bb50 63 74 69 6f 6e 20 2d 20 70 31 2d 3e 6e 41 63 74  ction - p1->nAct
1bb60 69 6f 6e 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20  ion;.  if( c==0 
1bb70 29 7b 0a 20 20 20 20 63 20 3d 20 70 32 2d 3e 69  ){.    c = p2->i
1bb80 4f 72 64 65 72 20 2d 20 70 31 2d 3e 69 4f 72 64  Order - p1->iOrd
1bb90 65 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  er;.  }.  assert
1bba0 28 20 63 21 3d 30 20 7c 7c 20 70 31 3d 3d 70 32  ( c!=0 || p1==p2
1bbb0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a   );.  return c;.
1bbc0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  }../*.** Write t
1bbd0 65 78 74 20 6f 6e 20 22 6f 75 74 22 20 74 68 61  ext on "out" tha
1bbe0 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
1bbf0 72 75 6c 65 20 22 72 70 22 2e 0a 2a 2f 0a 73 74  rule "rp"..*/.st
1bc00 61 74 69 63 20 76 6f 69 64 20 77 72 69 74 65 52  atic void writeR
1bc10 75 6c 65 54 65 78 74 28 46 49 4c 45 20 2a 6f 75  uleText(FILE *ou
1bc20 74 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  t, struct rule *
1bc30 72 70 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  rp){.  int j;.  
1bc40 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 20  fprintf(out,"%s 
1bc50 3a 3a 3d 22 2c 20 72 70 2d 3e 6c 68 73 2d 3e 6e  ::=", rp->lhs->n
1bc60 61 6d 65 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  ame);.  for(j=0;
1bc70 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b 20 6a 2b 2b   j<rp->nrhs; j++
1bc80 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79  ){.    struct sy
1bc90 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72  mbol *sp = rp->r
1bca0 68 73 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 73  hs[j];.    if( s
1bcb0 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45  p->type!=MULTITE
1bcc0 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
1bcd0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73  fprintf(out," %s
1bce0 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ", sp->name);.  
1bcf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1bd00 6e 74 20 6b 3b 0a 20 20 20 20 20 20 66 70 72 69  nt k;.      fpri
1bd10 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73  ntf(out," %s", s
1bd20 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61  p->subsym[0]->na
1bd30 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  me);.      for(k
1bd40 3d 31 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62 73 79  =1; k<sp->nsubsy
1bd50 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; k++){.       
1bd60 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c 25   fprintf(out,"|%
1bd70 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d  s",sp->subsym[k]
1bd80 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  ->name);.      }
1bd90 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
1bda0 2a 20 47 65 6e 65 72 61 74 65 20 43 20 73 6f 75  * Generate C sou
1bdb0 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  rce code for the
1bdc0 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20   parser */.void 
1bdd0 52 65 70 6f 72 74 54 61 62 6c 65 28 0a 20 20 73  ReportTable(.  s
1bde0 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
1bdf0 70 2c 0a 20 20 69 6e 74 20 6d 68 66 6c 61 67 20  p,.  int mhflag 
1be00 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 69 6e      /* Output in
1be10 20 6d 61 6b 65 68 65 61 64 65 72 73 20 66 6f 72   makeheaders for
1be20 6d 61 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  mat if true */.)
1be30 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a  {.  FILE *out, *
1be40 69 6e 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b  in;.  char line[
1be50 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  LINESIZE];.  int
1be60 20 20 6c 69 6e 65 6e 6f 3b 0a 20 20 73 74 72 75    lineno;.  stru
1be70 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
1be80 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
1be90 61 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ap;.  struct rul
1bea0 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20  e *rp;.  struct 
1beb0 61 63 74 74 61 62 20 2a 70 41 63 74 74 61 62 3b  acttab *pActtab;
1bec0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a  .  int i, j, n;.
1bed0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61    const char *na
1bee0 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b 6e 4f  me;.  int mnTknO
1bef0 66 73 74 2c 20 6d 78 54 6b 6e 4f 66 73 74 3b 0a  fst, mxTknOfst;.
1bf00 20 20 69 6e 74 20 6d 6e 4e 74 4f 66 73 74 2c 20    int mnNtOfst, 
1bf10 6d 78 4e 74 4f 66 73 74 3b 0a 20 20 73 74 72 75  mxNtOfst;.  stru
1bf20 63 74 20 61 78 73 65 74 20 2a 61 78 3b 0a 0a 20  ct axset *ax;.. 
1bf30 20 69 6e 20 3d 20 74 70 6c 74 5f 6f 70 65 6e 28   in = tplt_open(
1bf40 6c 65 6d 70 29 3b 0a 20 20 69 66 28 20 69 6e 3d  lemp);.  if( in=
1bf50 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f  =0 ) return;.  o
1bf60 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c  ut = file_open(l
1bf70 65 6d 70 2c 22 2e 63 22 2c 22 77 62 22 29 3b 0a  emp,".c","wb");.
1bf80 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a    if( out==0 ){.
1bf90 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
1bfa0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1bfb0 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20    lineno = 1;.  
1bfc0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1bfd0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1bfe0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1bff0 72 61 74 65 20 74 68 65 20 69 6e 63 6c 75 64 65  rate the include
1c000 20 63 6f 64 65 2c 20 69 66 20 61 6e 79 20 2a 2f   code, if any */
1c010 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
1c020 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63  t,lemp,lemp->inc
1c030 6c 75 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lude,&lineno);. 
1c040 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
1c050 20 20 20 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20     char *name = 
1c060 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65  file_makename(le
1c070 6d 70 2c 20 22 2e 68 22 29 3b 0a 20 20 20 20 66  mp, ".h");.    f
1c080 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63  printf(out,"#inc
1c090 6c 75 64 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  lude \"%s\"\n", 
1c0a0 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
1c0b0 0a 20 20 20 20 66 72 65 65 28 6e 61 6d 65 29 3b  .    free(name);
1c0c0 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1c0d0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1c0e0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1c0f0 2f 2a 20 47 65 6e 65 72 61 74 65 20 23 64 65 66  /* Generate #def
1c100 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b  ines for all tok
1c110 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66  ens */.  if( mhf
1c120 6c 61 67 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  lag ){.    const
1c130 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20   char *prefix;. 
1c140 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1c150 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22  #if INTERFACE\n"
1c160 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1c170 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e   if( lemp->token
1c180 70 72 65 66 69 78 20 29 20 70 72 65 66 69 78 20  prefix ) prefix 
1c190 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65  = lemp->tokenpre
1c1a0 66 69 78 3b 0a 20 20 20 20 65 6c 73 65 20 20 20  fix;.    else   
1c1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1c0 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20   prefix = "";.  
1c1d0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d    for(i=1; i<lem
1c1e0 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b  p->nterminal; i+
1c1f0 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  +){.      fprint
1c200 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1c210 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72  s%-30s %2d\n",pr
1c220 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  efix,lemp->symbo
1c230 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a  ls[i]->name,i);.
1c240 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a        lineno++;.
1c250 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
1c260 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22  f(out,"#endif\n"
1c270 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1c280 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1c290 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1c2a0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1c2b0 65 6e 65 72 61 74 65 20 74 68 65 20 64 65 66 69  enerate the defi
1c2c0 6e 65 73 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  nes */.  fprintf
1c2d0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1c2e0 43 4f 44 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a  CODETYPE %s\n",.
1c2f0 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65      minimum_size
1c300 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e  _type(0, lemp->n
1c310 73 79 6d 62 6f 6c 2b 31 29 29 3b 20 6c 69 6e 65  symbol+1)); line
1c320 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1c330 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e  out,"#define YYN
1c340 4f 43 4f 44 45 20 25 64 5c 6e 22 2c 6c 65 6d 70  OCODE %d\n",lemp
1c350 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c  ->nsymbol+1);  l
1c360 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1c370 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1c380 59 59 41 43 54 49 4f 4e 54 59 50 45 20 25 73 5c  YYACTIONTYPE %s\
1c390 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f  n",.    minimum_
1c3a0 73 69 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d  size_type(0, lem
1c3b0 70 2d 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e  p->nstate+lemp->
1c3c0 6e 72 75 6c 65 2b 35 29 29 3b 20 20 6c 69 6e 65  nrule+5));  line
1c3d0 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70  no++;.  if( lemp
1c3e0 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20  ->wildcard ){.  
1c3f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1c400 64 65 66 69 6e 65 20 59 59 57 49 4c 44 43 41 52  define YYWILDCAR
1c410 44 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  D %d\n",.       
1c420 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 2d 3e  lemp->wildcard->
1c430 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  index); lineno++
1c440 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 5f 73 74  ;.  }.  print_st
1c450 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65  ack_union(out,le
1c460 6d 70 2c 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61  mp,&lineno,mhfla
1c470 67 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  g);.  fprintf(ou
1c480 74 2c 20 22 23 69 66 6e 64 65 66 20 59 59 53 54  t, "#ifndef YYST
1c490 41 43 4b 44 45 50 54 48 5c 6e 22 29 3b 20 6c 69  ACKDEPTH\n"); li
1c4a0 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65  neno++;.  if( le
1c4b0 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b  mp->stacksize ){
1c4c0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1c4d0 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54 41 43  ,"#define YYSTAC
1c4e0 4b 44 45 50 54 48 20 25 73 5c 6e 22 2c 6c 65 6d  KDEPTH %s\n",lem
1c4f0 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 20 20  p->stacksize);  
1c500 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73  lineno++;.  }els
1c510 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e{.    fprintf(o
1c520 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54  ut,"#define YYST
1c530 41 43 4b 44 45 50 54 48 20 31 30 30 5c 6e 22 29  ACKDEPTH 100\n")
1c540 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ;  lineno++;.  }
1c550 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1c560 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e  "#endif\n"); lin
1c570 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66  eno++;.  if( mhf
1c580 6c 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  lag ){.    fprin
1c590 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45  tf(out,"#if INTE
1c5a0 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e  RFACE\n"); linen
1c5b0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 20  o++;.  }.  name 
1c5c0 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c  = lemp->name ? l
1c5d0 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72  emp->name : "Par
1c5e0 73 65 22 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  se";.  if( lemp-
1c5f0 3e 61 72 67 20 26 26 20 6c 65 6d 70 2d 3e 61 72  >arg && lemp->ar
1c600 67 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  g[0] ){.    int 
1c610 69 3b 0a 20 20 20 20 69 20 3d 20 6c 65 6d 6f 6e  i;.    i = lemon
1c620 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67  Strlen(lemp->arg
1c630 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e  );.    while( i>
1c640 3d 31 20 26 26 20 69 73 73 70 61 63 65 28 6c 65  =1 && isspace(le
1c650 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20  mp->arg[i-1]) ) 
1c660 69 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  i--;.    while( 
1c670 69 3e 3d 31 20 26 26 20 28 69 73 61 6c 6e 75 6d  i>=1 && (isalnum
1c680 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29  (lemp->arg[i-1])
1c690 20 7c 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d   || lemp->arg[i-
1c6a0 31 5d 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a  1]=='_') ) i--;.
1c6b0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1c6c0 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53  "#define %sARG_S
1c6d0 44 45 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65  DECL %s;\n",name
1c6e0 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69  ,lemp->arg);  li
1c6f0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1c700 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1c710 20 25 73 41 52 47 5f 50 44 45 43 4c 20 2c 25 73   %sARG_PDECL ,%s
1c720 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61  \n",name,lemp->a
1c730 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  rg);  lineno++;.
1c740 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1c750 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46  "#define %sARG_F
1c760 45 54 43 48 20 25 73 20 3d 20 79 79 70 50 61 72  ETCH %s = yypPar
1c770 73 65 72 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20  ser->%s\n",.    
1c780 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d               nam
1c790 65 2c 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d  e,lemp->arg,&lem
1c7a0 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e  p->arg[i]);  lin
1c7b0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
1c7c0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1c7d0 25 73 41 52 47 5f 53 54 4f 52 45 20 79 79 70 50  %sARG_STORE yypP
1c7e0 61 72 73 65 72 2d 3e 25 73 20 3d 20 25 73 5c 6e  arser->%s = %s\n
1c7f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1c800 20 20 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e      name,&lemp->
1c810 61 72 67 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72  arg[i],&lemp->ar
1c820 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  g[i]);  lineno++
1c830 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
1c840 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1c850 69 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c 5c  ine %sARG_SDECL\
1c860 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e  n",name);  linen
1c870 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1c880 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1c890 41 52 47 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d  ARG_PDECL\n",nam
1c8a0 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e);  lineno++;. 
1c8b0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1c8c0 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45  #define %sARG_FE
1c8d0 54 43 48 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69  TCH\n",name); li
1c8e0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1c8f0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1c900 20 25 73 41 52 47 5f 53 54 4f 52 45 5c 6e 22 2c   %sARG_STORE\n",
1c910 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
1c920 0a 20 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61  .  }.  if( mhfla
1c930 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  g ){.    fprintf
1c940 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29  (out,"#endif\n")
1c950 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1c960 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1c970 64 65 66 69 6e 65 20 59 59 4e 53 54 41 54 45 20  define YYNSTATE 
1c980 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61  %d\n",lemp->nsta
1c990 74 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  te);  lineno++;.
1c9a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1c9b0 64 65 66 69 6e 65 20 59 59 4e 52 55 4c 45 20 25  define YYNRULE %
1c9c0 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65  d\n",lemp->nrule
1c9d0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1c9e0 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  if( lemp->errsym
1c9f0 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20  ->useCnt ){.    
1ca00 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1ca10 66 69 6e 65 20 59 59 45 52 52 4f 52 53 59 4d 42  fine YYERRORSYMB
1ca20 4f 4c 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65  OL %d\n",lemp->e
1ca30 72 72 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 20  rrsym->index);  
1ca40 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70  lineno++;.    fp
1ca50 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1ca60 6e 65 20 59 59 45 52 52 53 59 4d 44 54 20 79 79  ne YYERRSYMDT yy
1ca70 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73  %d\n",lemp->errs
1ca80 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 20 6c 69 6e  ym->dtnum);  lin
1ca90 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  eno++;.  }.  if(
1caa0 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62   lemp->has_fallb
1cab0 61 63 6b 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ack ){.    fprin
1cac0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1cad0 59 59 46 41 4c 4c 42 41 43 4b 20 31 5c 6e 22 29  YYFALLBACK 1\n")
1cae0 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ;  lineno++;.  }
1caf0 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1cb00 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1cb10 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1cb20 65 6e 65 72 61 74 65 20 74 68 65 20 61 63 74 69  enerate the acti
1cb30 6f 6e 20 74 61 62 6c 65 20 61 6e 64 20 69 74 73  on table and its
1cb40 20 61 73 73 6f 63 69 61 74 65 73 3a 0a 20 20 2a   associates:.  *
1cb50 2a 0a 20 20 2a 2a 20 20 79 79 5f 61 63 74 69 6f  *.  **  yy_actio
1cb60 6e 5b 5d 20 20 20 20 20 20 20 20 41 20 73 69 6e  n[]        A sin
1cb70 67 6c 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  gle table contai
1cb80 6e 69 6e 67 20 61 6c 6c 20 61 63 74 69 6f 6e 73  ning all actions
1cb90 2e 0a 20 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61  ..  **  yy_looka
1cba0 68 65 61 64 5b 5d 20 20 20 20 20 41 20 74 61 62  head[]     A tab
1cbb0 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
1cbc0 65 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20  e lookahead for 
1cbd0 65 61 63 68 20 65 6e 74 72 79 20 69 6e 0a 20 20  each entry in.  
1cbe0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1cbf0 20 20 20 20 20 20 20 79 79 5f 61 63 74 69 6f 6e         yy_action
1cc00 2e 20 20 55 73 65 64 20 74 6f 20 64 65 74 65 63  .  Used to detec
1cc10 74 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  t hash collision
1cc20 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 73 68 69 66  s..  **  yy_shif
1cc30 74 5f 6f 66 73 74 5b 5d 20 20 20 20 46 6f 72 20  t_ofst[]    For 
1cc40 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65 20  each state, the 
1cc50 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61  offset into yy_a
1cc60 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20  ction for.  **  
1cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc80 20 20 20 73 68 69 66 74 69 6e 67 20 74 65 72 6d     shifting term
1cc90 69 6e 61 6c 73 2e 0a 20 20 2a 2a 20 20 79 79 5f  inals..  **  yy_
1cca0 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 20 20  reduce_ofst[]   
1ccb0 46 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c 20  For each state, 
1ccc0 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
1ccd0 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20  yy_action for.  
1cce0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1ccf0 20 20 20 20 20 20 20 73 68 69 66 74 69 6e 67 20         shifting 
1cd00 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 61 66  non-terminals af
1cd10 74 65 72 20 61 20 72 65 64 75 63 65 2e 0a 20 20  ter a reduce..  
1cd20 2a 2a 20 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d  **  yy_default[]
1cd30 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 20 61         Default a
1cd40 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 73  ction for each s
1cd50 74 61 74 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  tate..  */..  /*
1cd60 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74   Compute the act
1cd70 69 6f 6e 73 20 6f 6e 20 61 6c 6c 20 73 74 61 74  ions on all stat
1cd80 65 73 20 61 6e 64 20 63 6f 75 6e 74 20 74 68 65  es and count the
1cd90 6d 20 75 70 20 2a 2f 0a 20 20 61 78 20 3d 20 28  m up */.  ax = (
1cda0 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 29 20  struct axset *) 
1cdb0 63 61 6c 6c 6f 63 28 6c 65 6d 70 2d 3e 6e 73 74  calloc(lemp->nst
1cdc0 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78  ate*2, sizeof(ax
1cdd0 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 61 78 3d  [0]));.  if( ax=
1cde0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
1cdf0 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63  f(stderr,"malloc
1ce00 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20   failed\n");.   
1ce10 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
1ce20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1ce30 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
1ce40 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
1ce50 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 61 78  orted[i];.    ax
1ce60 5b 69 2a 32 5d 2e 73 74 70 20 3d 20 73 74 70 3b  [i*2].stp = stp;
1ce70 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 69 73 54  .    ax[i*2].isT
1ce80 6b 6e 20 3d 20 31 3b 0a 20 20 20 20 61 78 5b 69  kn = 1;.    ax[i
1ce90 2a 32 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74  *2].nAction = st
1cea0 70 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20  p->nTknAct;.    
1ceb0 61 78 5b 69 2a 32 2b 31 5d 2e 73 74 70 20 3d 20  ax[i*2+1].stp = 
1cec0 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b  stp;.    ax[i*2+
1ced0 31 5d 2e 69 73 54 6b 6e 20 3d 20 30 3b 0a 20 20  1].isTkn = 0;.  
1cee0 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74    ax[i*2+1].nAct
1cef0 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63  ion = stp->nNtAc
1cf00 74 3b 0a 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66  t;.  }.  mxTknOf
1cf10 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d  st = mnTknOfst =
1cf20 20 30 3b 0a 20 20 6d 78 4e 74 4f 66 73 74 20 3d   0;.  mxNtOfst =
1cf30 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 30 3b 0a 0a   mnNtOfst = 0;..
1cf40 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
1cf50 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20   action table.  
1cf60 49 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 79 20  In order to try 
1cf70 74 6f 20 6b 65 65 70 20 74 68 65 20 73 69 7a 65  to keep the size
1cf80 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 61 63 74   of the.  ** act
1cf90 69 6f 6e 20 74 61 62 6c 65 20 74 6f 20 61 20 6d  ion table to a m
1cfa0 69 6e 69 6d 75 6d 2c 20 74 68 65 20 68 65 75 72  inimum, the heur
1cfb0 69 73 74 69 63 20 6f 66 20 70 6c 61 63 69 6e 67  istic of placing
1cfc0 20 74 68 65 20 6c 61 72 67 65 73 74 20 61 63 74   the largest act
1cfd0 69 6f 6e 0a 20 20 2a 2a 20 73 65 74 73 20 66 69  ion.  ** sets fi
1cfe0 72 73 74 20 69 73 20 75 73 65 64 2e 0a 20 20 2a  rst is used..  *
1cff0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
1d000 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 3b 20 69  emp->nstate*2; i
1d010 2b 2b 29 20 61 78 5b 69 5d 2e 69 4f 72 64 65 72  ++) ax[i].iOrder
1d020 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74 28 61 78   = i;.  qsort(ax
1d030 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32  , lemp->nstate*2
1d040 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 2c  , sizeof(ax[0]),
1d050 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 29 3b   axset_compare);
1d060 0a 20 20 70 41 63 74 74 61 62 20 3d 20 61 63 74  .  pActtab = act
1d070 74 61 62 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 66  tab_alloc();.  f
1d080 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1d090 6e 73 74 61 74 65 2a 32 20 26 26 20 61 78 5b 69  nstate*2 && ax[i
1d0a0 5d 2e 6e 41 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b  ].nAction>0; i++
1d0b0 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 61 78 5b  ){.    stp = ax[
1d0c0 69 5d 2e 73 74 70 3b 0a 20 20 20 20 69 66 28 20  i].stp;.    if( 
1d0d0 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20  ax[i].isTkn ){. 
1d0e0 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d       for(ap=stp-
1d0f0 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
1d100 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  next){.        i
1d110 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20  nt action;.     
1d120 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69     if( ap->sp->i
1d130 6e 64 65 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72  ndex>=lemp->nter
1d140 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65  minal ) continue
1d150 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e  ;.        action
1d160 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f   = compute_actio
1d170 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20  n(lemp, ap);.   
1d180 20 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c       if( action<
1d190 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1d1a0 20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63 74        acttab_act
1d1b0 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70 2d  ion(pActtab, ap-
1d1c0 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69  >sp->index, acti
1d1d0 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  on);.      }.   
1d1e0 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74     stp->iTknOfst
1d1f0 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74   = acttab_insert
1d200 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20  (pActtab);.     
1d210 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66   if( stp->iTknOf
1d220 73 74 3c 6d 6e 54 6b 6e 4f 66 73 74 20 29 20 6d  st<mnTknOfst ) m
1d230 6e 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e  nTknOfst = stp->
1d240 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 20 20  iTknOfst;.      
1d250 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73  if( stp->iTknOfs
1d260 74 3e 6d 78 54 6b 6e 4f 66 73 74 20 29 20 6d 78  t>mxTknOfst ) mx
1d270 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69  TknOfst = stp->i
1d280 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 7d 65 6c  TknOfst;.    }el
1d290 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70  se{.      for(ap
1d2a0 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
1d2b0 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
1d2c0 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a      int action;.
1d2d0 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e          if( ap->
1d2e0 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e  sp->index<lemp->
1d2f0 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74  nterminal ) cont
1d300 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1d310 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d  ( ap->sp->index=
1d320 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29  =lemp->nsymbol )
1d330 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1d340 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70     action = comp
1d350 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c  ute_action(lemp,
1d360 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66   ap);.        if
1d370 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e  ( action<0 ) con
1d380 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
1d390 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63  cttab_action(pAc
1d3a0 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e  ttab, ap->sp->in
1d3b0 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20  dex, action);.  
1d3c0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d      }.      stp-
1d3d0 3e 69 4e 74 4f 66 73 74 20 3d 20 61 63 74 74 61  >iNtOfst = actta
1d3e0 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61 62  b_insert(pActtab
1d3f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  );.      if( stp
1d400 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66  ->iNtOfst<mnNtOf
1d410 73 74 20 29 20 6d 6e 4e 74 4f 66 73 74 20 3d 20  st ) mnNtOfst = 
1d420 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20  stp->iNtOfst;.  
1d430 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74      if( stp->iNt
1d440 4f 66 73 74 3e 6d 78 4e 74 4f 66 73 74 20 29 20  Ofst>mxNtOfst ) 
1d450 6d 78 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e  mxNtOfst = stp->
1d460 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 20  iNtOfst;.    }. 
1d470 20 7d 0a 20 20 66 72 65 65 28 61 78 29 3b 0a 0a   }.  free(ax);..
1d480 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
1d490 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  yy_action table 
1d4a0 2a 2f 0a 20 20 6e 20 3d 20 61 63 74 74 61 62 5f  */.  n = acttab_
1d4b0 73 69 7a 65 28 70 41 63 74 74 61 62 29 3b 0a 20  size(pActtab);. 
1d4c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1d4d0 65 66 69 6e 65 20 59 59 5f 41 43 54 54 41 42 5f  efine YY_ACTTAB_
1d4e0 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e  COUNT (%d)\n", n
1d4f0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1d500 70 72 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74  printf(out,"stat
1d510 69 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f  ic const YYACTIO
1d520 4e 54 59 50 45 20 79 79 5f 61 63 74 69 6f 6e 5b  NTYPE yy_action[
1d530 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ] = {\n"); linen
1d540 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  o++;.  for(i=j=0
1d550 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1d560 20 69 6e 74 20 61 63 74 69 6f 6e 20 3d 20 61 63   int action = ac
1d570 74 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 70 41  ttab_yyaction(pA
1d580 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20 20 69  cttab, i);.    i
1d590 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 61 63  f( action<0 ) ac
1d5a0 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74  tion = lemp->nst
1d5b0 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  ate + lemp->nrul
1d5c0 65 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 6a  e + 2;.    if( j
1d5d0 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75  ==0 ) fprintf(ou
1d5e0 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c  t," /* %5d */ ",
1d5f0 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   i);.    fprintf
1d600 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 61  (out, " %4d,", a
1d610 63 74 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20  ction);.    if( 
1d620 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29  j==9 || i==n-1 )
1d630 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1d640 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65  out, "\n"); line
1d650 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20  no++;.      j = 
1d660 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1d670 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      j++;.    }. 
1d680 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
1d690 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  , "};\n"); linen
1d6a0 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  o++;..  /* Outpu
1d6b0 74 20 74 68 65 20 79 79 5f 6c 6f 6f 6b 61 68 65  t the yy_lookahe
1d6c0 61 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70  ad table */.  fp
1d6d0 72 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69  rintf(out,"stati
1d6e0 63 20 63 6f 6e 73 74 20 59 59 43 4f 44 45 54 59  c const YYCODETY
1d6f0 50 45 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b  PE yy_lookahead[
1d700 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ] = {\n"); linen
1d710 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  o++;.  for(i=j=0
1d720 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1d730 20 69 6e 74 20 6c 61 20 3d 20 61 63 74 74 61 62   int la = acttab
1d740 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 70 41 63  _yylookahead(pAc
1d750 74 74 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66  ttab, i);.    if
1d760 28 20 6c 61 3c 30 20 29 20 6c 61 20 3d 20 6c 65  ( la<0 ) la = le
1d770 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a 20 20 20  mp->nsymbol;.   
1d780 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69   if( j==0 ) fpri
1d790 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64  ntf(out," /* %5d
1d7a0 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66   */ ", i);.    f
1d7b0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
1d7c0 64 2c 22 2c 20 6c 61 29 3b 0a 20 20 20 20 69 66  d,", la);.    if
1d7d0 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31  ( j==9 || i==n-1
1d7e0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1d7f0 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69  f(out, "\n"); li
1d800 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20  neno++;.      j 
1d810 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1d820 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
1d830 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
1d840 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e  ut, "};\n"); lin
1d850 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74  eno++;..  /* Out
1d860 70 75 74 20 74 68 65 20 79 79 5f 73 68 69 66 74  put the yy_shift
1d870 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f  _ofst[] table */
1d880 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1d890 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46  "#define YY_SHIF
1d8a0 54 5f 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c  T_USE_DFLT (%d)\
1d8b0 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 2d 31 29  n", mnTknOfst-1)
1d8c0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20  ; lineno++;.  n 
1d8d0 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a  = lemp->nstate;.
1d8e0 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
1d8f0 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31  lemp->sorted[n-1
1d900 5d 2d 3e 69 54 6b 6e 4f 66 73 74 3d 3d 4e 4f 5f  ]->iTknOfst==NO_
1d910 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20  OFFSET ) n--;.  
1d920 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
1d930 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 43  efine YY_SHIFT_C
1d940 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e 2d  OUNT (%d)\n", n-
1d950 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  1); lineno++;.  
1d960 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
1d970 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d  efine YY_SHIFT_M
1d980 49 4e 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e  IN   (%d)\n", mn
1d990 54 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f  TknOfst); lineno
1d9a0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1d9b0 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53  t, "#define YY_S
1d9c0 48 49 46 54 5f 4d 41 58 20 20 20 28 25 64 29 5c  HIFT_MAX   (%d)\
1d9d0 6e 22 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 3b 20  n", mxTknOfst); 
1d9e0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1d9f0 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63  ntf(out, "static
1da00 20 63 6f 6e 73 74 20 25 73 20 79 79 5f 73 68 69   const %s yy_shi
1da10 66 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22  ft_ofst[] = {\n"
1da20 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e  , .          min
1da30 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d  imum_size_type(m
1da40 6e 54 6b 6e 4f 66 73 74 2d 31 2c 20 6d 78 54 6b  nTknOfst-1, mxTk
1da50 6e 4f 66 73 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b  nOfst)); lineno+
1da60 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  +;.  for(i=j=0; 
1da70 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
1da80 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73 74 70  nt ofst;.    stp
1da90 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
1daa0 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20 73  i];.    ofst = s
1dab0 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20  tp->iTknOfst;.  
1dac0 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f    if( ofst==NO_O
1dad0 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6d  FFSET ) ofst = m
1dae0 6e 54 6b 6e 4f 66 73 74 20 2d 20 31 3b 0a 20 20  nTknOfst - 1;.  
1daf0 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
1db00 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
1db10 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
1db20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
1db30 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20  4d,", ofst);.   
1db40 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
1db50 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
1db60 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
1db70 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
1db80 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
1db90 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
1dba0 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
1dbb0 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
1dbc0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20  lineno++;..  /* 
1dbd0 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 72 65  Output the yy_re
1dbe0 64 75 63 65 5f 6f 66 73 74 5b 5d 20 74 61 62 6c  duce_ofst[] tabl
1dbf0 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  e */.  fprintf(o
1dc00 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f  ut, "#define YY_
1dc10 52 45 44 55 43 45 5f 55 53 45 5f 44 46 4c 54 20  REDUCE_USE_DFLT 
1dc20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73  (%d)\n", mnNtOfs
1dc30 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  t-1); lineno++;.
1dc40 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61    n = lemp->nsta
1dc50 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  te;.  while( n>0
1dc60 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64   && lemp->sorted
1dc70 5b 6e 2d 31 5d 2d 3e 69 4e 74 4f 66 73 74 3d 3d  [n-1]->iNtOfst==
1dc80 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b  NO_OFFSET ) n--;
1dc90 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1dca0 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55  "#define YY_REDU
1dcb0 43 45 5f 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22  CE_COUNT (%d)\n"
1dcc0 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  , n-1); lineno++
1dcd0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1dce0 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44   "#define YY_RED
1dcf0 55 43 45 5f 4d 49 4e 20 20 20 28 25 64 29 5c 6e  UCE_MIN   (%d)\n
1dd00 22 2c 20 6d 6e 4e 74 4f 66 73 74 29 3b 20 6c 69  ", mnNtOfst); li
1dd10 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1dd20 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
1dd30 59 59 5f 52 45 44 55 43 45 5f 4d 41 58 20 20 20  YY_REDUCE_MAX   
1dd40 28 25 64 29 5c 6e 22 2c 20 6d 78 4e 74 4f 66 73  (%d)\n", mxNtOfs
1dd50 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  t); lineno++;.  
1dd60 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74  fprintf(out, "st
1dd70 61 74 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79  atic const %s yy
1dd80 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 3d  _reduce_ofst[] =
1dd90 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20   {\n", .        
1dda0 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74    minimum_size_t
1ddb0 79 70 65 28 6d 6e 4e 74 4f 66 73 74 2d 31 2c 20  ype(mnNtOfst-1, 
1ddc0 6d 78 4e 74 4f 66 73 74 29 29 3b 20 6c 69 6e 65  mxNtOfst)); line
1ddd0 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  no++;.  for(i=j=
1dde0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
1ddf0 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20    int ofst;.    
1de00 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
1de10 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20  ed[i];.    ofst 
1de20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a  = stp->iNtOfst;.
1de30 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f      if( ofst==NO
1de40 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d  _OFFSET ) ofst =
1de50 20 6d 6e 4e 74 4f 66 73 74 20 2d 20 31 3b 0a 20   mnNtOfst - 1;. 
1de60 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70     if( j==0 ) fp
1de70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
1de80 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20  5d */ ", i);.   
1de90 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1dea0 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20  %4d,", ofst);.  
1deb0 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d    if( j==9 || i=
1dec0 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70  =n-1 ){.      fp
1ded0 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
1dee0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1def0 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c    j = 0;.    }el
1df00 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  se{.      j++;. 
1df10 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e     }.  }.  fprin
1df20 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b  tf(out, "};\n");
1df30 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a   lineno++;..  /*
1df40 20 4f 75 74 70 75 74 20 74 68 65 20 64 65 66 61   Output the defa
1df50 75 6c 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ult action table
1df60 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1df70 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74  t, "static const
1df80 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79   YYACTIONTYPE yy
1df90 5f 64 65 66 61 75 6c 74 5b 5d 20 3d 20 7b 5c 6e  _default[] = {\n
1dfa0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1dfb0 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  n = lemp->nstate
1dfc0 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
1dfd0 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  <n; i++){.    st
1dfe0 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
1dff0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  [i];.    if( j==
1e000 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
1e010 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
1e020 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1e030 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 73 74 70  ut, " %4d,", stp
1e040 2d 3e 69 44 66 6c 74 29 3b 0a 20 20 20 20 69 66  ->iDflt);.    if
1e050 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31  ( j==9 || i==n-1
1e060 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1e070 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69  f(out, "\n"); li
1e080 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20  neno++;.      j 
1e090 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1e0a0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
1e0b0 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
1e0c0 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e  ut, "};\n"); lin
1e0d0 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66  eno++;.  tplt_xf
1e0e0 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1e0f0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1e100 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
1e110 65 20 74 61 62 6c 65 20 6f 66 20 66 61 6c 6c 62  e table of fallb
1e120 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f  ack tokens..  */
1e130 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73  .  if( lemp->has
1e140 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _fallback ){.   
1e150 20 69 6e 74 20 6d 78 20 3d 20 6c 65 6d 70 2d 3e   int mx = lemp->
1e160 6e 74 65 72 6d 69 6e 61 6c 20 2d 20 31 3b 0a 20  nterminal - 1;. 
1e170 20 20 20 77 68 69 6c 65 28 20 6d 78 3e 30 20 26     while( mx>0 &
1e180 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  & lemp->symbols[
1e190 6d 78 5d 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30  mx]->fallback==0
1e1a0 20 29 7b 20 6d 78 2d 2d 3b 20 7d 0a 20 20 20 20   ){ mx--; }.    
1e1b0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6d 78 3b 20  for(i=0; i<=mx; 
1e1c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
1e1d0 63 74 20 73 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c  ct symbol *p = l
1e1e0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
1e1f0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 61  .      if( p->fa
1e200 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  llback==0 ){.   
1e210 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1e220 2c 20 22 20 20 20 20 30 2c 20 20 2f 2a 20 25 31  , "    0,  /* %1
1e230 30 73 20 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f  0s => nothing */
1e240 5c 6e 22 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20  \n", p->name);. 
1e250 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e260 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1e270 20 22 20 20 25 33 64 2c 20 20 2f 2a 20 25 31 30   "  %3d,  /* %10
1e280 73 20 3d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20 70  s => %s */\n", p
1e290 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65  ->fallback->inde
1e2a0 78 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  x,.          p->
1e2b0 6e 61 6d 65 2c 20 70 2d 3e 66 61 6c 6c 62 61 63  name, p->fallbac
1e2c0 6b 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  k->name);.      
1e2d0 7d 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b  }.      lineno++
1e2e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70  ;.    }.  }.  tp
1e2f0 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1e300 6d 65 2c 20 69 6e 2c 20 6f 75 74 2c 20 26 6c 69  me, in, out, &li
1e310 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1e320 65 72 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f  erate a table co
1e330 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 79 6d  ntaining the sym
1e340 62 6f 6c 69 63 20 6e 61 6d 65 20 6f 66 20 65 76  bolic name of ev
1e350 65 72 79 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a  ery symbol.  */.
1e360 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1e370 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
1e380 7b 0a 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69  {.    lemon_spri
1e390 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25 73 5c 22  ntf(line,"\"%s\"
1e3a0 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ,",lemp->symbols
1e3b0 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [i]->name);.    
1e3c0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25  fprintf(out,"  %
1e3d0 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a 20 20 20  -15s",line);.   
1e3e0 20 69 66 28 20 28 69 26 33 29 3d 3d 33 20 29 7b   if( (i&3)==3 ){
1e3f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e   fprintf(out,"\n
1e400 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a  "); lineno++; }.
1e410 20 20 7d 0a 20 20 69 66 28 20 28 69 26 33 29 21    }.  if( (i&3)!
1e420 3d 30 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75  =0 ){ fprintf(ou
1e430 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  t,"\n"); lineno+
1e440 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  +; }.  tplt_xfer
1e450 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1e460 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1e470 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74 61  /* Generate a ta
1e480 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ble containing a
1e490 20 74 65 78 74 20 73 74 72 69 6e 67 20 74 68 61   text string tha
1e4a0 74 20 64 65 73 63 72 69 62 65 73 20 65 76 65 72  t describes ever
1e4b0 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69 6e 20 74  y.  ** rule in t
1e4c0 68 65 20 72 75 6c 65 20 73 65 74 20 6f 66 20 74  he rule set of t
1e4d0 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 54 68 69  he grammar.  Thi
1e4e0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
1e4f0 20 75 73 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20   used.  ** when 
1e500 74 72 61 63 69 6e 67 20 52 45 44 55 43 45 20 61  tracing REDUCE a
1e510 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  ctions..  */.  f
1e520 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d  or(i=0, rp=lemp-
1e530 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1e540 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  ->next, i++){.  
1e550 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e 69 6e    assert( rp->in
1e560 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20 20 66 70  dex==i );.    fp
1e570 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
1e580 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29 3b 0a 20  3d */ \"", i);. 
1e590 20 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74     writeRuleText
1e5a0 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66  (out, rp);.    f
1e5b0 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 2c 5c  printf(out,"\",\
1e5c0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1e5d0 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
1e5e0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1e5f0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1e600 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
1e610 68 69 63 68 20 65 78 65 63 75 74 65 73 20 65 76  hich executes ev
1e620 65 72 79 20 74 69 6d 65 20 61 20 73 79 6d 62 6f  ery time a symbo
1e630 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d  l is popped from
1e640 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 20  .  ** the stack 
1e650 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
1e660 20 65 72 72 6f 72 73 20 6f 72 20 77 68 69 6c 65   errors or while
1e670 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68 65 20   destroying the 
1e680 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a 20 28 49  parser. .  ** (I
1e690 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 67  n other words, g
1e6a0 65 6e 65 72 61 74 65 20 74 68 65 20 25 64 65 73  enerate the %des
1e6b0 74 72 75 63 74 6f 72 20 61 63 74 69 6f 6e 73 29  tructor actions)
1e6c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70  .  */.  if( lemp
1e6d0 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a 20  ->tokendest ){. 
1e6e0 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b     int once = 1;
1e6f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1e700 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
1e710 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
1e720 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
1e730 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
1e740 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30  .      if( sp==0
1e750 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54 45   || sp->type!=TE
1e760 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75  RMINAL ) continu
1e770 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  e;.      if( onc
1e780 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  e ){.        fpr
1e790 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 20  intf(out, "     
1e7a0 20 2f 2a 20 54 45 52 4d 49 4e 41 4c 20 44 65 73   /* TERMINAL Des
1e7b0 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20  tructor */\n"); 
1e7c0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
1e7d0 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20    once = 0;.    
1e7e0 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
1e7f0 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20  f(out,"    case 
1e800 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c  %d: /* %s */\n",
1e810 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e   sp->index, sp->
1e820 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
1e830 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1e840 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
1e850 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d  bol && lemp->sym
1e860 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21 3d 54  bols[i]->type!=T
1e870 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20  ERMINAL; i++);. 
1e880 20 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e     if( i<lemp->n
1e890 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20  symbol ){.      
1e8a0 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  emit_destructor_
1e8b0 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73  code(out,lemp->s
1e8c0 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26  ymbols[i],lemp,&
1e8d0 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66  lineno);.      f
1e8e0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1e8f0 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69    break;\n"); li
1e900 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
1e910 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61  }.  if( lemp->va
1e920 72 64 65 73 74 20 29 7b 0a 20 20 20 20 73 74 72  rdest ){.    str
1e930 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66 6c 74  uct symbol *dflt
1e940 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  _sp = 0;.    int
1e950 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 66   once = 1;.    f
1e960 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1e970 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
1e980 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
1e990 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  ol *sp = lemp->s
1e9a0 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20  ymbols[i];.     
1e9b0 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70   if( sp==0 || sp
1e9c0 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
1e9d0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 73 70   ||.          sp
1e9e0 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73 70  ->index<=0 || sp
1e9f0 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30 20  ->destructor!=0 
1ea00 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1ea10 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20    if( once ){.  
1ea20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1ea30 74 2c 20 22 20 20 20 20 20 20 2f 2a 20 44 65 66  t, "      /* Def
1ea40 61 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49 4e 41  ault NON-TERMINA
1ea50 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c  L Destructor */\
1ea60 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1ea70 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b         once = 0;
1ea80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1ea90 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1eaa0 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a  case %d: /* %s *
1eab0 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c  /\n", sp->index,
1eac0 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65   sp->name); line
1ead0 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74  no++;.      dflt
1eae0 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a  _sp = sp;.    }.
1eaf0 20 20 20 20 69 66 28 20 64 66 6c 74 5f 73 70 21      if( dflt_sp!
1eb00 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74  =0 ){.      emit
1eb10 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65  _destructor_code
1eb20 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d  (out,dflt_sp,lem
1eb30 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  p,&lineno);.    
1eb40 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
1eb50 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c  t,"      break;\
1eb60 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1eb70 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1eb80 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
1eb90 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
1eba0 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
1ebb0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
1ebc0 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20     if( sp==0 || 
1ebd0 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
1ebe0 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75  AL || sp->destru
1ebf0 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ctor==0 ) contin
1ec00 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ue;.    fprintf(
1ec10 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64  out,"    case %d
1ec20 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73  : /* %s */\n", s
1ec30 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61  p->index, sp->na
1ec40 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a  me); lineno++;..
1ec50 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 64      /* Combine d
1ec60 75 70 6c 69 63 61 74 65 20 64 65 73 74 72 75 63  uplicate destruc
1ec70 74 6f 72 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  tors into a sing
1ec80 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 66  le case */.    f
1ec90 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65 6d 70  or(j=i+1; j<lemp
1eca0 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b  ->nsymbol; j++){
1ecb0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79  .      struct sy
1ecc0 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c 65 6d 70  mbol *sp2 = lemp
1ecd0 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20  ->symbols[j];.  
1ece0 20 20 20 20 69 66 28 20 73 70 32 20 26 26 20 73      if( sp2 && s
1ecf0 70 32 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e  p2->type!=TERMIN
1ed00 41 4c 20 26 26 20 73 70 32 2d 3e 64 65 73 74 72  AL && sp2->destr
1ed10 75 63 74 6f 72 0a 20 20 20 20 20 20 20 20 20 20  uctor.          
1ed20 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d 3d 3d 73  && sp2->dtnum==s
1ed30 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20 20 20 20  p->dtnum.       
1ed40 20 20 20 26 26 20 73 74 72 63 6d 70 28 73 70 2d     && strcmp(sp-
1ed50 3e 64 65 73 74 72 75 63 74 6f 72 2c 73 70 32 2d  >destructor,sp2-
1ed60 3e 64 65 73 74 72 75 63 74 6f 72 29 3d 3d 30 20  >destructor)==0 
1ed70 29 7b 0a 20 20 20 20 20 20 20 20 20 66 70 72 69  ){.         fpri
1ed80 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
1ed90 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e  e %d: /* %s */\n
1eda0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1edb0 20 20 20 20 73 70 32 2d 3e 69 6e 64 65 78 2c 20      sp2->index, 
1edc0 73 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65  sp2->name); line
1edd0 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 73  no++;.         s
1ede0 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 3d  p2->destructor =
1edf0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1ee00 7d 0a 0a 20 20 20 20 65 6d 69 74 5f 64 65 73 74  }..    emit_dest
1ee10 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c  ructor_code(out,
1ee20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1ee30 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  ,lemp,&lineno);.
1ee40 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1ee50 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22  "      break;\n"
1ee60 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1ee70 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1ee80 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1ee90 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1eea0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
1eeb0 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e  ch executes when
1eec0 65 76 65 72 20 74 68 65 20 70 61 72 73 65 72 20  ever the parser 
1eed0 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 73 20  stack overflows 
1eee0 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
1eef0 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 6f  out,lemp,lemp->o
1ef00 76 65 72 66 6c 6f 77 2c 26 6c 69 6e 65 6e 6f 29  verflow,&lineno)
1ef10 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
1ef20 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1ef30 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1ef40 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 61 62  Generate the tab
1ef50 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e 66 6f 72  le of rule infor
1ef60 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a 20 20 2a  mation .  **.  *
1ef70 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 63 6f 64  * Note: This cod
1ef80 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
1ef90 20 66 61 63 74 20 74 68 61 74 20 72 75 6c 65 73   fact that rules
1efa0 20 61 72 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a   are number.  **
1efb0 20 73 65 71 75 65 6e 74 75 61 6c 6c 79 20 62 65   sequentually be
1efc0 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 2e 0a  ginning with 0..
1efd0 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65    */.  for(rp=le
1efe0 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
1eff0 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
1f000 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 7b  fprintf(out,"  {
1f010 20 25 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c 72 70   %d, %d },\n",rp
1f020 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c 72 70 2d  ->lhs->index,rp-
1f030 3e 6e 72 68 73 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >nrhs); lineno++
1f040 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
1f050 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1f060 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1f070 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1f080 65 20 77 68 69 63 68 20 65 78 65 63 75 74 69 6f  e which executio
1f090 6e 20 64 75 72 69 6e 67 20 65 61 63 68 20 52 45  n during each RE
1f0a0 44 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  DUCE action */. 
1f0b0 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
1f0c0 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
1f0d0 65 78 74 29 7b 0a 20 20 20 20 74 72 61 6e 73 6c  ext){.    transl
1f0e0 61 74 65 5f 63 6f 64 65 28 6c 65 6d 70 2c 20 72  ate_code(lemp, r
1f0f0 70 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 72  p);.  }.  /* Fir
1f100 73 74 20 6f 75 74 70 75 74 20 72 75 6c 65 73 20  st output rules 
1f110 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 64  other than the d
1f120 65 66 61 75 6c 74 3a 20 72 75 6c 65 20 2a 2f 0a  efault: rule */.
1f130 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
1f140 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
1f150 6e 65 78 74 29 7b 0a 20 20 20 20 73 74 72 75 63  next){.    struc
1f160 74 20 72 75 6c 65 20 2a 72 70 32 3b 20 20 20 20  t rule *rp2;    
1f170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 74             /* Ot
1f180 68 65 72 20 72 75 6c 65 73 20 77 69 74 68 20 74  her rules with t
1f190 68 65 20 73 61 6d 65 20 61 63 74 69 6f 6e 20 2a  he same action *
1f1a0 2f 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f  /.    if( rp->co
1f1b0 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  de==0 ) continue
1f1c0 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f  ;.    if( rp->co
1f1d0 64 65 5b 30 5d 3d 3d 27 5c 6e 27 20 26 26 20 72  de[0]=='\n' && r
1f1e0 70 2d 3e 63 6f 64 65 5b 31 5d 3d 3d 30 20 29 20  p->code[1]==0 ) 
1f1f0 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 57 69 6c  continue; /* Wil
1f200 6c 20 62 65 20 64 65 66 61 75 6c 74 3a 20 2a 2f  l be default: */
1f210 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1f220 2c 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a  ,"      case %d:
1f230 20 2f 2a 20 22 2c 20 72 70 2d 3e 69 6e 64 65 78   /* ", rp->index
1f240 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65  );.    writeRule
1f250 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20  Text(out, rp);. 
1f260 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1f270 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  " */\n"); lineno
1f280 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 72 70 32 3d  ++;.    for(rp2=
1f290 72 70 2d 3e 6e 65 78 74 3b 20 72 70 32 3b 20 72  rp->next; rp2; r
1f2a0 70 32 3d 72 70 32 2d 3e 6e 65 78 74 29 7b 0a 20  p2=rp2->next){. 
1f2b0 20 20 20 20 20 69 66 28 20 72 70 32 2d 3e 63 6f       if( rp2->co
1f2c0 64 65 3d 3d 72 70 2d 3e 63 6f 64 65 20 29 7b 0a  de==rp->code ){.
1f2d0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1f2e0 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73 65 20  out,"      case 
1f2f0 25 64 3a 20 2f 2a 20 22 2c 20 72 70 32 2d 3e 69  %d: /* ", rp2->i
1f300 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 77  ndex);.        w
1f310 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74  riteRuleText(out
1f320 2c 20 72 70 32 29 3b 0a 20 20 20 20 20 20 20 20  , rp2);.        
1f330 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2a 2f  fprintf(out," */
1f340 20 79 79 74 65 73 74 63 61 73 65 28 79 79 72 75   yytestcase(yyru
1f350 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72  leno==%d);\n", r
1f360 70 32 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65  p2->index); line
1f370 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 70  no++;.        rp
1f380 32 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20  2->code = 0;.   
1f390 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65     }.    }.    e
1f3a0 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72 70 2c  mit_code(out,rp,
1f3b0 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lemp,&lineno);. 
1f3c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1f3d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e          break;\n
1f3e0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1f3f0 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a    rp->code = 0;.
1f400 20 20 7d 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79    }.  /* Finally
1f410 2c 20 6f 75 74 70 75 74 20 74 68 65 20 64 65 66  , output the def
1f420 61 75 6c 74 3a 20 72 75 6c 65 2e 20 20 57 65 20  ault: rule.  We 
1f430 63 68 6f 6f 73 65 20 61 73 20 74 68 65 20 64 65  choose as the de
1f440 66 61 75 6c 74 3a 20 61 6c 6c 0a 20 20 2a 2a 20  fault: all.  ** 
1f450 65 6d 70 74 79 20 61 63 74 69 6f 6e 73 2e 20 2a  empty actions. *
1f460 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
1f470 22 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 5c  "      default:\
1f480 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1f490 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
1f4a0 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
1f4b0 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70  ext){.    if( rp
1f4c0 2d 3e 63 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74  ->code==0 ) cont
1f4d0 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
1f4e0 28 20 72 70 2d 3e 63 6f 64 65 5b 30 5d 3d 3d 27  ( rp->code[0]=='
1f4f0 5c 6e 27 20 26 26 20 72 70 2d 3e 63 6f 64 65 5b  \n' && rp->code[
1f500 31 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 66 70 72  1]==0 );.    fpr
1f510 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
1f520 2f 2a 20 28 25 64 29 20 22 2c 20 72 70 2d 3e 69  /* (%d) ", rp->i
1f530 6e 64 65 78 29 3b 0a 20 20 20 20 77 72 69 74 65  ndex);.    write
1f540 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70  RuleText(out, rp
1f550 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1f560 75 74 2c 20 22 20 2a 2f 20 79 79 74 65 73 74 63  ut, " */ yytestc
1f570 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d 25 64  ase(yyruleno==%d
1f580 29 3b 5c 6e 22 2c 20 72 70 2d 3e 69 6e 64 65 78  );\n", rp->index
1f590 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1f5a0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1f5b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e          break;\n
1f5c0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1f5d0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1f5e0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1f5f0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1f600 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
1f610 65 78 65 63 75 74 65 73 20 69 66 20 61 20 70 61  executes if a pa
1f620 72 73 65 20 66 61 69 6c 73 20 2a 2f 0a 20 20 74  rse fails */.  t
1f630 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
1f640 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65  mp,lemp->failure
1f650 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c  ,&lineno);.  tpl
1f660 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1f670 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1f680 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1f690 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1f6a0 63 75 74 65 73 20 77 68 65 6e 20 61 20 73 79 6e  cutes when a syn
1f6b0 74 61 78 20 65 72 72 6f 72 20 6f 63 63 75 72 73  tax error occurs
1f6c0 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
1f6d0 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
1f6e0 65 72 72 6f 72 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  error,&lineno);.
1f6f0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1f700 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1f710 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1f720 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
1f730 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20  h executes when 
1f740 74 68 65 20 70 61 72 73 65 72 20 61 63 63 65 70  the parser accep
1f750 74 73 20 69 74 73 20 69 6e 70 75 74 20 2a 2f 0a  ts its input */.
1f760 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
1f770 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61 63 63 65  ,lemp,lemp->acce
1f780 70 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74  pt,&lineno);.  t
1f790 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1f7a0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1f7b0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  no);..  /* Appen
1f7c0 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e 20 63  d any addition c
1f7d0 6f 64 65 20 74 68 65 20 75 73 65 72 20 64 65 73  ode the user des
1f7e0 69 72 65 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  ires */.  tplt_p
1f7f0 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
1f800 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65 2c 26 6c  mp->extracode,&l
1f810 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73  ineno);..  fclos
1f820 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28  e(in);.  fclose(
1f830 6f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  out);.  return;.
1f840 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  }../* Generate a
1f850 20 68 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72   header file for
1f860 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76   the parser */.v
1f870 6f 69 64 20 52 65 70 6f 72 74 48 65 61 64 65 72  oid ReportHeader
1f880 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
1f890 65 6d 70 29 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f  emp).{.  FILE *o
1f8a0 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 6f 6e 73 74  ut, *in;.  const
1f8b0 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20   char *prefix;. 
1f8c0 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53   char line[LINES
1f8d0 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70 61 74  IZE];.  char pat
1f8e0 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a  tern[LINESIZE];.
1f8f0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
1f900 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
1f910 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d  x ) prefix = lem
1f920 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a  p->tokenprefix;.
1f930 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
1f940 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
1f950 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d 20 66 69   = "";.  in = fi
1f960 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68  le_open(lemp,".h
1f970 22 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  ","rb");.  if( i
1f980 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78  n ){.    int nex
1f990 74 43 68 61 72 3b 0a 20 20 20 20 66 6f 72 28 69  tChar;.    for(i
1f9a0 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =1; i<lemp->nter
1f9b0 6d 69 6e 61 6c 20 26 26 20 66 67 65 74 73 28 6c  minal && fgets(l
1f9c0 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29  ine,LINESIZE,in)
1f9d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6c 65  ; i++){.      le
1f9e0 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 70 61 74 74  mon_sprintf(patt
1f9f0 65 72 6e 2c 22 23 64 65 66 69 6e 65 20 25 73 25  ern,"#define %s%
1fa00 2d 33 30 73 20 25 33 64 5c 6e 22 2c 0a 20 20 20  -30s %3d\n",.   
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa20 20 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79   prefix,lemp->sy
1fa30 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69  mbols[i]->name,i
1fa40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
1fa50 63 6d 70 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e  cmp(line,pattern
1fa60 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
1fa70 0a 20 20 20 20 6e 65 78 74 43 68 61 72 20 3d 20  .    nextChar = 
1fa80 66 67 65 74 63 28 69 6e 29 3b 0a 20 20 20 20 66  fgetc(in);.    f
1fa90 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 69  close(in);.    i
1faa0 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72  f( i==lemp->nter
1fab0 6d 69 6e 61 6c 20 26 26 20 6e 65 78 74 43 68 61  minal && nextCha
1fac0 72 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20  r==EOF ){.      
1fad0 2f 2a 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20  /* No change in 
1fae0 74 68 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74  the file.  Don't
1faf0 20 72 65 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a   rewrite it. */.
1fb00 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
1fb10 20 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20    }.  }.  out = 
1fb20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22  file_open(lemp,"
1fb30 2e 68 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28  .h","wb");.  if(
1fb40 20 6f 75 74 20 29 7b 0a 20 20 20 20 66 6f 72 28   out ){.    for(
1fb50 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=1; i<lemp->nte
1fb60 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  rminal; i++){.  
1fb70 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1fb80 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73  "#define %s%-30s
1fb90 20 25 33 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c   %3d\n",prefix,l
1fba0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
1fbb0 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a  >name,i);.    }.
1fbc0 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
1fbd0 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b    .  }.  return;
1fbe0 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63 65 20 74 68  .}../* Reduce th
1fbf0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63  e size of the ac
1fc00 74 69 6f 6e 20 74 61 62 6c 65 73 2c 20 69 66 20  tion tables, if 
1fc10 70 6f 73 73 69 62 6c 65 2c 20 62 79 20 6d 61 6b  possible, by mak
1fc20 69 6e 67 20 75 73 65 0a 2a 2a 20 6f 66 20 64 65  ing use.** of de
1fc30 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  faults..**.** In
1fc40 20 74 68 69 73 20 76 65 72 73 69 6f 6e 2c 20 77   this version, w
1fc50 65 20 74 61 6b 65 20 74 68 65 20 6d 6f 73 74 20  e take the most 
1fc60 66 72 65 71 75 65 6e 74 20 52 45 44 55 43 45 20  frequent REDUCE 
1fc70 61 63 74 69 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a  action and make.
1fc80 2a 2a 20 69 74 20 74 68 65 20 64 65 66 61 75 6c  ** it the defaul
1fc90 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 72  t.  Except, ther
1fca0 65 20 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20  e is no default 
1fcb0 69 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20  if the wildcard 
1fcc0 74 6f 6b 65 6e 0a 2a 2a 20 69 73 20 61 20 70 6f  token.** is a po
1fcd0 73 73 69 62 6c 65 20 6c 6f 6f 6b 2d 61 68 65 61  ssible look-ahea
1fce0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70 72  d..*/.void Compr
1fcf0 65 73 73 54 61 62 6c 65 73 28 73 74 72 75 63 74  essTables(struct
1fd00 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
1fd10 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
1fd20 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63  stp;.  struct ac
1fd30 74 69 6f 6e 20 2a 61 70 2c 20 2a 61 70 32 3b 0a  tion *ap, *ap2;.
1fd40 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
1fd50 70 2c 20 2a 72 70 32 2c 20 2a 72 62 65 73 74 3b  p, *rp2, *rbest;
1fd60 0a 20 20 69 6e 74 20 6e 62 65 73 74 2c 20 6e 3b  .  int nbest, n;
1fd70 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1fd80 75 73 65 73 57 69 6c 64 63 61 72 64 3b 0a 0a 20  usesWildcard;.. 
1fd90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1fda0 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
1fdb0 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
1fdc0 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6e  sorted[i];.    n
1fdd0 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 72 62  best = 0;.    rb
1fde0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 75 73 65  est = 0;.    use
1fdf0 73 57 69 6c 64 63 61 72 64 20 3d 20 30 3b 0a 0a  sWildcard = 0;..
1fe00 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
1fe10 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
1fe20 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1fe30 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20  ap->type==SHIFT 
1fe40 26 26 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d 70 2d  && ap->sp==lemp-
1fe50 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20  >wildcard ){.   
1fe60 20 20 20 20 20 75 73 65 73 57 69 6c 64 63 61 72       usesWildcar
1fe70 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
1fe80 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
1fe90 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74  e!=REDUCE ) cont
1fea0 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 70 20 3d  inue;.      rp =
1feb0 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20   ap->x.rp;.     
1fec0 20 69 66 28 20 72 70 2d 3e 6c 68 73 53 74 61 72   if( rp->lhsStar
1fed0 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
1fee0 20 20 20 20 69 66 28 20 72 70 3d 3d 72 62 65 73      if( rp==rbes
1fef0 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
1ff00 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20      n = 1;.     
1ff10 20 66 6f 72 28 61 70 32 3d 61 70 2d 3e 6e 65 78   for(ap2=ap->nex
1ff20 74 3b 20 61 70 32 3b 20 61 70 32 3d 61 70 32 2d  t; ap2; ap2=ap2-
1ff30 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
1ff40 69 66 28 20 61 70 32 2d 3e 74 79 70 65 21 3d 52  if( ap2->type!=R
1ff50 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65  EDUCE ) continue
1ff60 3b 0a 20 20 20 20 20 20 20 20 72 70 32 20 3d 20  ;.        rp2 = 
1ff70 61 70 32 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20  ap2->x.rp;.     
1ff80 20 20 20 69 66 28 20 72 70 32 3d 3d 72 62 65 73     if( rp2==rbes
1ff90 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
1ffa0 20 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72        if( rp2==r
1ffb0 70 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d  p ) n++;.      }
1ffc0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 62 65  .      if( n>nbe
1ffd0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 62  st ){.        nb
1ffe0 65 73 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  est = n;.       
1fff0 20 72 62 65 73 74 20 3d 20 72 70 3b 0a 20 20 20   rbest = rp;.   
20000 20 20 20 7d 0a 20 20 20 20 7d 0a 20 0a 20 20 20     }.    }. .   
20010 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65 20   /* Do not make 
20020 61 20 64 65 66 61 75 6c 74 20 69 66 20 74 68 65  a default if the
20030 20 6e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73   number of rules
20040 20 74 6f 20 64 65 66 61 75 6c 74 0a 20 20 20 20   to default.    
20050 2a 2a 20 69 73 20 6e 6f 74 20 61 74 20 6c 65 61  ** is not at lea
20060 73 74 20 31 20 6f 72 20 69 66 20 74 68 65 20 77  st 1 or if the w
20070 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e 20 69 73  ildcard token is
20080 20 61 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20   a possible.    
20090 2a 2a 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20  ** lookahead..  
200a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 62 65    */.    if( nbe
200b0 73 74 3c 31 20 7c 7c 20 75 73 65 73 57 69 6c 64  st<1 || usesWild
200c0 63 61 72 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  card ) continue;
200d0 0a 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e  ...    /* Combin
200e0 65 20 6d 61 74 63 68 69 6e 67 20 52 45 44 55 43  e matching REDUC
200f0 45 20 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20 61  E actions into a
20100 20 73 69 6e 67 6c 65 20 64 65 66 61 75 6c 74 20   single default 
20110 2a 2f 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  */.    for(ap=st
20120 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
20130 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
20140 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44  f( ap->type==RED
20150 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d  UCE && ap->x.rp=
20160 3d 72 62 65 73 74 20 29 20 62 72 65 61 6b 3b 0a  =rbest ) break;.
20170 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
20180 28 20 61 70 20 29 3b 0a 20 20 20 20 61 70 2d 3e  ( ap );.    ap->
20190 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
201a0 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20  "{default}");.  
201b0 20 20 66 6f 72 28 61 70 3d 61 70 2d 3e 6e 65 78    for(ap=ap->nex
201c0 74 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  t; ap; ap=ap->ne
201d0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  xt){.      if( a
201e0 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  p->type==REDUCE 
201f0 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65  && ap->x.rp==rbe
20200 73 74 20 29 20 61 70 2d 3e 74 79 70 65 20 3d 20  st ) ap->type = 
20210 4e 4f 54 5f 55 53 45 44 3b 0a 20 20 20 20 7d 0a  NOT_USED;.    }.
20220 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63      stp->ap = Ac
20230 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61  tion_sort(stp->a
20240 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  p);.  }.}.../*.*
20250 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  * Compare two st
20260 61 74 65 73 20 66 6f 72 20 73 6f 72 74 69 6e 67  ates for sorting
20270 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20   purposes.  The 
20280 73 6d 61 6c 6c 65 72 20 73 74 61 74 65 20 69 73  smaller state is
20290 20 74 68 65 0a 2a 2a 20 6f 6e 65 20 77 69 74 68   the.** one with
202a0 20 74 68 65 20 6d 6f 73 74 20 6e 6f 6e 2d 74 65   the most non-te
202b0 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2e 20  rminal actions. 
202c0 20 49 66 20 74 68 65 79 20 68 61 76 65 20 74 68   If they have th
202d0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
202e0 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c   of non-terminal
202f0 20 61 63 74 69 6f 6e 73 2c 20 74 68 65 6e 20 74   actions, then t
20300 68 65 20 73 6d 61 6c 6c 65 72 20 69 73 20 74 68  he smaller is th
20310 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d  e one with the m
20320 6f 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 61 63 74  ost.** token act
20330 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
20340 69 6e 74 20 73 74 61 74 65 52 65 73 6f 72 74 43  int stateResortC
20350 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69  ompare(const voi
20360 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64  d *a, const void
20370 20 2a 62 29 7b 0a 20 20 63 6f 6e 73 74 20 73 74   *b){.  const st
20380 72 75 63 74 20 73 74 61 74 65 20 2a 70 41 20 3d  ruct state *pA =
20390 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20   *(const struct 
203a0 73 74 61 74 65 2a 2a 29 61 3b 0a 20 20 63 6f 6e  state**)a;.  con
203b0 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65 20  st struct state 
203c0 2a 70 42 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74  *pB = *(const st
203d0 72 75 63 74 20 73 74 61 74 65 2a 2a 29 62 3b 0a  ruct state**)b;.
203e0 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20    int n;..  n = 
203f0 70 42 2d 3e 6e 4e 74 41 63 74 20 2d 20 70 41 2d  pB->nNtAct - pA-
20400 3e 6e 4e 74 41 63 74 3b 0a 20 20 69 66 28 20 6e  >nNtAct;.  if( n
20410 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  ==0 ){.    n = p
20420 42 2d 3e 6e 54 6b 6e 41 63 74 20 2d 20 70 41 2d  B->nTknAct - pA-
20430 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20 69 66  >nTknAct;.    if
20440 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
20450 6e 20 3d 20 70 42 2d 3e 73 74 61 74 65 6e 75 6d  n = pB->statenum
20460 20 2d 20 70 41 2d 3e 73 74 61 74 65 6e 75 6d 3b   - pA->statenum;
20470 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
20480 65 72 74 28 20 6e 21 3d 30 20 29 3b 0a 20 20 72  ert( n!=0 );.  r
20490 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn n;.}.../*.
204a0 2a 2a 20 52 65 6e 75 6d 62 65 72 20 61 6e 64 20  ** Renumber and 
204b0 72 65 73 6f 72 74 20 73 74 61 74 65 73 20 73 6f  resort states so
204c0 20 74 68 61 74 20 73 74 61 74 65 73 20 77 69 74   that states wit
204d0 68 20 66 65 77 65 72 20 63 68 6f 69 63 65 73 0a  h fewer choices.
204e0 2a 2a 20 6f 63 63 75 72 20 61 74 20 74 68 65 20  ** occur at the 
204f0 65 6e 64 2e 20 20 45 78 63 65 70 74 2c 20 6b 65  end.  Except, ke
20500 65 70 20 73 74 61 74 65 20 30 20 61 73 20 74 68  ep state 0 as th
20510 65 20 66 69 72 73 74 20 73 74 61 74 65 2e 0a 2a  e first state..*
20520 2f 0a 76 6f 69 64 20 52 65 73 6f 72 74 53 74 61  /.void ResortSta
20530 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  tes(struct lemon
20540 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20   *lemp).{.  int 
20550 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
20560 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
20570 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a 20 20   action *ap;..  
20580 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
20590 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
205a0 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
205b0 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 73 74  orted[i];.    st
205c0 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73 74 70  p->nTknAct = stp
205d0 2d 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a 20 20  ->nNtAct = 0;.  
205e0 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 6c    stp->iDflt = l
205f0 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65  emp->nstate + le
20600 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20 20 73  mp->nrule;.    s
20610 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e  tp->iTknOfst = N
20620 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 73 74  O_OFFSET;.    st
20630 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f  p->iNtOfst = NO_
20640 4f 46 46 53 45 54 3b 0a 20 20 20 20 66 6f 72 28  OFFSET;.    for(
20650 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
20660 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
20670 20 20 20 20 69 66 28 20 63 6f 6d 70 75 74 65 5f      if( compute_
20680 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 3e  action(lemp,ap)>
20690 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
206a0 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c  ( ap->sp->index<
206b0 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
206c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70  ){.          stp
206d0 2d 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20 20 20  ->nTknAct++;.   
206e0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
206f0 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d  p->sp->index<lem
20700 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20  p->nsymbol ){.  
20710 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 4e 74          stp->nNt
20720 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Act++;.        }
20730 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
20740 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 63 6f 6d  stp->iDflt = com
20750 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70  pute_action(lemp
20760 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  , ap);.        }
20770 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20780 20 7d 0a 20 20 71 73 6f 72 74 28 26 6c 65 6d 70   }.  qsort(&lemp
20790 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c 20 6c 65 6d  ->sorted[1], lem
207a0 70 2d 3e 6e 73 74 61 74 65 2d 31 2c 20 73 69 7a  p->nstate-1, siz
207b0 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  eof(lemp->sorted
207c0 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20 73 74  [0]),.        st
207d0 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65  ateResortCompare
207e0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
207f0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
20800 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 6f  +){.    lemp->so
20810 72 74 65 64 5b 69 5d 2d 3e 73 74 61 74 65 6e 75  rted[i]->statenu
20820 6d 20 3d 20 69 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  m = i;.  }.}.../
20830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20840 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
20850 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  "set.c" ********
20860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
20880 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75 6c 61  .** Set manipula
20890 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 66 6f  tion routines fo
208a0 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
208b0 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
208c0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 7a  ..static int siz
208d0 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74 20 74  e = 0;../* Set t
208e0 68 65 20 73 65 74 20 73 69 7a 65 20 2a 2f 0a 76  he set size */.v
208f0 6f 69 64 20 53 65 74 53 69 7a 65 28 69 6e 74 20  oid SetSize(int 
20900 6e 29 0a 7b 0a 20 20 73 69 7a 65 20 3d 20 6e 2b  n).{.  size = n+
20910 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  1;.}../* Allocat
20920 65 20 61 20 6e 65 77 20 73 65 74 20 2a 2f 0a 63  e a new set */.c
20930 68 61 72 20 2a 53 65 74 4e 65 77 28 29 7b 0a 20  har *SetNew(){. 
20940 20 63 68 61 72 20 2a 73 3b 0a 20 20 73 20 3d 20   char *s;.  s = 
20950 28 63 68 61 72 2a 29 63 61 6c 6c 6f 63 28 20 73  (char*)calloc( s
20960 69 7a 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73  ize, 1);.  if( s
20970 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72  ==0 ){.    exter
20980 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72  n void memory_er
20990 72 6f 72 28 29 3b 0a 20 20 20 20 6d 65 6d 6f 72  ror();.    memor
209a0 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20  y_error();.  }. 
209b0 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a   return s;.}../*
209c0 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65   Deallocate a se
209d0 74 20 2a 2f 0a 76 6f 69 64 20 53 65 74 46 72 65  t */.void SetFre
209e0 65 28 63 68 61 72 20 2a 73 29 0a 7b 0a 20 20 66  e(char *s).{.  f
209f0 72 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64  ree(s);.}../* Ad
20a00 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
20a10 74 6f 20 74 68 65 20 73 65 74 2e 20 20 52 65 74  to the set.  Ret
20a20 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
20a30 65 6c 65 6d 65 6e 74 20 77 61 73 20 61 64 64 65  element was adde
20a40 64 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20 69  d.** and FALSE i
20a50 66 20 69 74 20 77 61 73 20 61 6c 72 65 61 64 79  f it was already
20a60 20 74 68 65 72 65 2e 20 2a 2f 0a 69 6e 74 20 53   there. */.int S
20a70 65 74 41 64 64 28 63 68 61 72 20 2a 73 2c 20 69  etAdd(char *s, i
20a80 6e 74 20 65 29 0a 7b 0a 20 20 69 6e 74 20 72 76  nt e).{.  int rv
20a90 3b 0a 20 20 61 73 73 65 72 74 28 20 65 3e 3d 30  ;.  assert( e>=0
20aa0 20 26 26 20 65 3c 73 69 7a 65 20 29 3b 0a 20 20   && e<size );.  
20ab0 72 76 20 3d 20 73 5b 65 5d 3b 0a 20 20 73 5b 65  rv = s[e];.  s[e
20ac0 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 1;.  return 
20ad0 21 72 76 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65  !rv;.}../* Add e
20ae0 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20  very element of 
20af0 73 32 20 74 6f 20 73 31 2e 20 20 52 65 74 75 72  s2 to s1.  Retur
20b00 6e 20 54 52 55 45 20 69 66 20 73 31 20 63 68 61  n TRUE if s1 cha
20b10 6e 67 65 73 2e 20 2a 2f 0a 69 6e 74 20 53 65 74  nges. */.int Set
20b20 55 6e 69 6f 6e 28 63 68 61 72 20 2a 73 31 2c 20  Union(char *s1, 
20b30 63 68 61 72 20 2a 73 32 29 0a 7b 0a 20 20 69 6e  char *s2).{.  in
20b40 74 20 69 2c 20 70 72 6f 67 72 65 73 73 3b 0a 20  t i, progress;. 
20b50 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20   progress = 0;. 
20b60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
20b70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
20b80 73 32 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  s2[i]==0 ) conti
20b90 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 31 5b  nue;.    if( s1[
20ba0 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  i]==0 ){.      p
20bb0 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20  rogress = 1;.   
20bc0 20 20 20 73 31 5b 69 5d 20 3d 20 31 3b 0a 20 20     s1[i] = 1;.  
20bd0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
20be0 20 70 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a   progress;.}./**
20bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c00 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
20c10 6c 65 20 22 74 61 62 6c 65 2e 63 22 20 2a 2a 2a  le "table.c" ***
20c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
20c40 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69   All code in thi
20c50 73 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  s file has been 
20c60 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
20c70 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  nerated.** from 
20c80 61 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  a specification 
20c90 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20  in the file.**  
20ca0 20 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62              "tab
20cb0 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20  le.q".** by the 
20cc0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
20cd0 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20  y code building 
20ce0 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e  program "aagen".
20cf0 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20  .** Do not edit 
20d00 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74  this file!  Inst
20d10 65 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70  ead, edit the sp
20d20 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66  ecification.** f
20d30 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20  ile, then rerun 
20d40 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  aagen..*/./*.** 
20d50 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73  Code for process
20d60 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68  ing tables in th
20d70 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
20d80 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52  enerator..*/..PR
20d90 49 56 41 54 45 20 75 6e 73 69 67 6e 65 64 20 73  IVATE unsigned s
20da0 74 72 68 61 73 68 28 63 6f 6e 73 74 20 63 68 61  trhash(const cha
20db0 72 20 2a 78 29 0a 7b 0a 20 20 75 6e 73 69 67 6e  r *x).{.  unsign
20dc0 65 64 20 68 20 3d 20 30 3b 0a 20 20 77 68 69 6c  ed h = 0;.  whil
20dd0 65 28 20 2a 78 20 29 20 68 20 3d 20 68 2a 31 33  e( *x ) h = h*13
20de0 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20 72 65 74   + *(x++);.  ret
20df0 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72  urn h;.}../* Wor
20e00 6b 73 20 6c 69 6b 65 20 73 74 72 64 75 70 2c 20  ks like strdup, 
20e10 73 6f 72 74 20 6f 66 2e 20 20 53 61 76 65 20 61  sort of.  Save a
20e20 20 73 74 72 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f   string in mallo
20e30 63 65 64 20 6d 65 6d 6f 72 79 2c 20 62 75 74 0a  ced memory, but.
20e40 2a 2a 20 6b 65 65 70 20 73 74 72 69 6e 67 73 20  ** keep strings 
20e50 69 6e 20 61 20 74 61 62 6c 65 20 73 6f 20 74 68  in a table so th
20e60 61 74 20 74 68 65 20 73 61 6d 65 20 73 74 72 69  at the same stri
20e70 6e 67 20 69 73 20 6e 6f 74 20 69 6e 20 6d 6f 72  ng is not in mor
20e80 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 70 6c  e.** than one pl
20e90 61 63 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ace..*/.const ch
20ea0 61 72 20 2a 53 74 72 73 61 66 65 28 63 6f 6e 73  ar *Strsafe(cons
20eb0 74 20 63 68 61 72 20 2a 79 29 0a 7b 0a 20 20 63  t char *y).{.  c
20ec0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
20ed0 63 68 61 72 20 2a 63 70 79 3b 0a 0a 20 20 69 66  char *cpy;..  if
20ee0 28 20 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( y==0 ) return 
20ef0 30 3b 0a 20 20 7a 20 3d 20 53 74 72 73 61 66 65  0;.  z = Strsafe
20f00 5f 66 69 6e 64 28 79 29 3b 0a 20 20 69 66 28 20  _find(y);.  if( 
20f10 7a 3d 3d 30 20 26 26 20 28 63 70 79 3d 28 63 68  z==0 && (cpy=(ch
20f20 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d  ar *)malloc( lem
20f30 6f 6e 53 74 72 6c 65 6e 28 79 29 2b 31 20 29 29  onStrlen(y)+1 ))
20f40 21 3d 30 20 29 7b 0a 20 20 20 20 6c 65 6d 6f 6e  !=0 ){.    lemon
20f50 5f 73 74 72 63 70 79 28 63 70 79 2c 79 29 3b 0a  _strcpy(cpy,y);.
20f60 20 20 20 20 7a 20 3d 20 63 70 79 3b 0a 20 20 20      z = cpy;.   
20f70 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28   Strsafe_insert(
20f80 7a 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72 79  z);.  }.  Memory
20f90 43 68 65 63 6b 28 7a 29 3b 0a 20 20 72 65 74 75  Check(z);.  retu
20fa0 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72  rn z;.}../* Ther
20fb0 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
20fc0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
20fd0 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  ng structure for
20fe0 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61   each.** associa
20ff0 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
21000 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 73 74 72 75  pe "x1"..*/.stru
21010 63 74 20 73 5f 78 31 20 7b 0a 20 20 69 6e 74 20  ct s_x1 {.  int 
21020 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
21030 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
21040 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73  r of available s
21050 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lots. */.       
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21070 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20     /*   Must be 
21080 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65  a power of 2 gre
21090 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a  ater than or */.
210a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65            /*   e
210c0 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69  qual to 1 */.  i
210d0 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20  nt count;       
210e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
210f0 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c   of currently sl
21100 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ots filled */.  
21110 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
21120 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61  *tbl;  /* The da
21130 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a  ta stored here *
21140 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e  /.  struct s_x1n
21150 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61  ode **ht;  /* Ha
21160 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f  sh table for loo
21170 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  kups */.};../* T
21180 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
21190 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
211a0 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79  ucture for every
211b0 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a   data element.**
211c0 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69   in an associati
211d0 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
211e0 20 22 78 31 22 2e 0a 2a 2f 0a 74 79 70 65 64 65   "x1"..*/.typede
211f0 66 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64  f struct s_x1nod
21200 65 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  e {.  const char
21210 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 2f   *data;        /
21220 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
21230 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
21240 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74  *next;   /* Next
21250 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
21260 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73  same hash */.  s
21270 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a  truct s_x1node *
21280 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69  *from;  /* Previ
21290 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31  ous link */.} x1
212a0 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  node;../* There 
212b0 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74  is only one inst
212c0 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61  ance of the arra
212d0 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  y, which is the 
212e0 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61  following */.sta
212f0 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 31 20  tic struct s_x1 
21300 2a 78 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  *x1a;../* Alloca
21310 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61  te a new associa
21320 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f  tive array */.vo
21330 69 64 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28  id Strsafe_init(
21340 29 7b 0a 20 20 69 66 28 20 78 31 61 20 29 20 72  ){.  if( x1a ) r
21350 65 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20 28  eturn;.  x1a = (
21360 73 74 72 75 63 74 20 73 5f 78 31 2a 29 6d 61 6c  struct s_x1*)mal
21370 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
21380 63 74 20 73 5f 78 31 29 20 29 3b 0a 20 20 69 66  ct s_x1) );.  if
21390 28 20 78 31 61 20 29 7b 0a 20 20 20 20 78 31 61  ( x1a ){.    x1a
213a0 2d 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  ->size = 1024;. 
213b0 20 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d 20     x1a->count = 
213c0 30 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c 20  0;.    x1a->tbl 
213d0 3d 20 28 78 31 6e 6f 64 65 2a 29 63 61 6c 6c 6f  = (x1node*)callo
213e0 63 28 31 30 32 34 2c 20 73 69 7a 65 6f 66 28 78  c(1024, sizeof(x
213f0 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  1node) + sizeof(
21400 78 31 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69  x1node*));.    i
21410 66 28 20 78 31 61 2d 3e 74 62 6c 3d 3d 30 20 29  f( x1a->tbl==0 )
21420 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 31 61  {.      free(x1a
21430 29 3b 0a 20 20 20 20 20 20 78 31 61 20 3d 20 30  );.      x1a = 0
21440 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21450 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
21460 78 31 61 2d 3e 68 74 20 3d 20 28 78 31 6e 6f 64  x1a->ht = (x1nod
21470 65 2a 2a 29 26 28 78 31 61 2d 3e 74 62 6c 5b 31  e**)&(x1a->tbl[1
21480 30 32 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  024]);.      for
21490 28 69 3d 30 3b 20 69 3c 31 30 32 34 3b 20 69 2b  (i=0; i<1024; i+
214a0 2b 29 20 78 31 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x1a->ht[i] = 
214b0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f  0;.    }.  }.}./
214c0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
214d0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61  ecord into the a
214e0 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52  rray.  Return TR
214f0 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  UE if successful
21500 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20  ..** Prior data 
21510 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
21520 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69  y is NOT overwri
21530 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 72 73  tten */.int Strs
21540 61 66 65 5f 69 6e 73 65 72 74 28 63 6f 6e 73 74  afe_insert(const
21550 20 63 68 61 72 20 2a 64 61 74 61 29 0a 7b 0a 20   char *data).{. 
21560 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 75   x1node *np;.  u
21570 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e 73  nsigned h;.  uns
21580 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66 28  igned ph;..  if(
21590 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x1a==0 ) return
215a0 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61   0;.  ph = strha
215b0 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20  sh(data);.  h = 
215c0 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d  ph & (x1a->size-
215d0 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e  1);.  np = x1a->
215e0 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
215f0 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
21600 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61  rcmp(np->data,da
21610 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ta)==0 ){.      
21620 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65  /* An existing e
21630 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
21640 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e  me key is found.
21650 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   */.      /* Fai
21660 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72  l because overwr
21670 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ite is not allow
21680 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  s. */.      retu
21690 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
216a0 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
216b0 20 7d 0a 20 20 69 66 28 20 78 31 61 2d 3e 63 6f   }.  if( x1a->co
216c0 75 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20 29  unt>=x1a->size )
216d0 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
216e0 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
216f0 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20  able bigger */. 
21700 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20     int i,size;. 
21710 20 20 20 73 74 72 75 63 74 20 73 5f 78 31 20 61     struct s_x1 a
21720 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e  rray;.    array.
21730 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 31  size = size = x1
21740 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61  a->size*2;.    a
21750 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31 61  rray.count = x1a
21760 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72  ->count;.    arr
21770 61 79 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65  ay.tbl = (x1node
21780 2a 29 63 61 6c 6c 6f 63 28 73 69 7a 65 2c 20 73  *)calloc(size, s
21790 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20  izeof(x1node) + 
217a0 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29  sizeof(x1node*))
217b0 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e  ;.    if( array.
217c0 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tbl==0 ) return 
217d0 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20  0;  /* Fail due 
217e0 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  to malloc failur
217f0 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68  e */.    array.h
21800 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28  t = (x1node**)&(
21810 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29  array.tbl[size])
21820 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
21830 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
21840 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  y.ht[i] = 0;.   
21850 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61 2d   for(i=0; i<x1a-
21860 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  >count; i++){.  
21870 20 20 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e      x1node *oldn
21880 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20  p, *newnp;.     
21890 20 6f 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d 3e   oldnp = &(x1a->
218a0 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68  tbl[i]);.      h
218b0 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70   = strhash(oldnp
218c0 2d 3e 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d  ->data) & (size-
218d0 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20  1);.      newnp 
218e0 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d  = &(array.tbl[i]
218f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72  );.      if( arr
21900 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79  ay.ht[h] ) array
21910 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  .ht[h]->from = &
21920 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  (newnp->next);. 
21930 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74       newnp->next
21940 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a   = array.ht[h];.
21950 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74        newnp->dat
21960 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b  a = oldnp->data;
21970 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72  .      newnp->fr
21980 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b  om = &(array.ht[
21990 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79  h]);.      array
219a0 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a  .ht[h] = newnp;.
219b0 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78      }.    free(x
219c0 31 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78  1a->tbl);.    *x
219d0 31 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a  1a = array;.  }.
219e0 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
219f0 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20  new data */.  h 
21a00 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a  = ph & (x1a->siz
21a10 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78  e-1);.  np = &(x
21a20 31 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f 75  1a->tbl[x1a->cou
21a30 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61  nt++]);.  np->da
21a40 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28  ta = data;.  if(
21a50 20 78 31 61 2d 3e 68 74 5b 68 5d 20 29 20 78 31   x1a->ht[h] ) x1
21a60 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  a->ht[h]->from =
21a70 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20   &(np->next);.  
21a80 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 31 61 2d 3e  np->next = x1a->
21a90 68 74 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e 68 74  ht[h];.  x1a->ht
21aa0 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e  [h] = np;.  np->
21ab0 66 72 6f 6d 20 3d 20 26 28 78 31 61 2d 3e 68 74  from = &(x1a->ht
21ac0 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  [h]);.  return 1
21ad0 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
21ae0 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
21af0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
21b00 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74   given key.  Ret
21b10 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e  urn NULL.** if n
21b20 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 63  o such key. */.c
21b30 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61  onst char *Strsa
21b40 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68  fe_find(const ch
21b50 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e 73  ar *key).{.  uns
21b60 69 67 6e 65 64 20 68 3b 0a 20 20 78 31 6e 6f 64  igned h;.  x1nod
21b70 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 31  e *np;..  if( x1
21b80 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
21b90 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b  .  h = strhash(k
21ba0 65 79 29 20 26 20 28 78 31 61 2d 3e 73 69 7a 65  ey) & (x1a->size
21bb0 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d  -1);.  np = x1a-
21bc0 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
21bd0 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
21be0 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b  trcmp(np->data,k
21bf0 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ey)==0 ) break;.
21c00 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
21c10 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
21c20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20  np ? np->data : 
21c30 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  0;.}../* Return 
21c40 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
21c50 20 28 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f   (terminal or no
21c60 6e 74 65 72 6d 69 6e 61 6c 29 20 73 79 6d 62 6f  nterminal) symbo
21c70 6c 20 22 78 22 2e 0a 2a 2a 20 43 72 65 61 74 65  l "x"..** Create
21c80 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 20 69 66   a new symbol if
21c90 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
21ca0 73 74 20 74 69 6d 65 20 22 78 22 20 68 61 73 20  st time "x" has 
21cb0 62 65 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74  been seen..*/.st
21cc0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
21cd0 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74 20 63 68  bol_new(const ch
21ce0 61 72 20 2a 78 29 0a 7b 0a 20 20 73 74 72 75 63  ar *x).{.  struc
21cf0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20  t symbol *sp;.. 
21d00 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e   sp = Symbol_fin
21d10 64 28 78 29 3b 0a 20 20 69 66 28 20 73 70 3d 3d  d(x);.  if( sp==
21d20 30 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 28 73  0 ){.    sp = (s
21d30 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 63  truct symbol *)c
21d40 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28  alloc(1, sizeof(
21d50 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 29 20 29  struct symbol) )
21d60 3b 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63  ;.    MemoryChec
21d70 6b 28 73 70 29 3b 0a 20 20 20 20 73 70 2d 3e 6e  k(sp);.    sp->n
21d80 61 6d 65 20 3d 20 53 74 72 73 61 66 65 28 78 29  ame = Strsafe(x)
21d90 3b 0a 20 20 20 20 73 70 2d 3e 74 79 70 65 20 3d  ;.    sp->type =
21da0 20 69 73 75 70 70 65 72 28 2a 78 29 20 3f 20 54   isupper(*x) ? T
21db0 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52  ERMINAL : NONTER
21dc0 4d 49 4e 41 4c 3b 0a 20 20 20 20 73 70 2d 3e 72  MINAL;.    sp->r
21dd0 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d  ule = 0;.    sp-
21de0 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  >fallback = 0;. 
21df0 20 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 2d 31     sp->prec = -1
21e00 3b 0a 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20  ;.    sp->assoc 
21e10 3d 20 55 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e 66  = UNK;.    sp->f
21e20 69 72 73 74 73 65 74 20 3d 20 30 3b 0a 20 20 20  irstset = 0;.   
21e30 20 73 70 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45   sp->lambda = LE
21e40 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 20 20 73  MON_FALSE;.    s
21e50 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 3d 20  p->destructor = 
21e60 30 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73 74 4c  0;.    sp->destL
21e70 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 73  ineno = 0;.    s
21e80 70 2d 3e 64 61 74 61 74 79 70 65 20 3d 20 30 3b  p->datatype = 0;
21e90 0a 20 20 20 20 73 70 2d 3e 75 73 65 43 6e 74 20  .    sp->useCnt 
21ea0 3d 20 30 3b 0a 20 20 20 20 53 79 6d 62 6f 6c 5f  = 0;.    Symbol_
21eb0 69 6e 73 65 72 74 28 73 70 2c 73 70 2d 3e 6e 61  insert(sp,sp->na
21ec0 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 70 2d 3e 75  me);.  }.  sp->u
21ed0 73 65 43 6e 74 2b 2b 3b 0a 20 20 72 65 74 75 72  seCnt++;.  retur
21ee0 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70  n sp;.}../* Comp
21ef0 61 72 65 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20  are two symbols 
21f00 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70  for sorting purp
21f10 6f 73 65 73 2e 20 20 52 65 74 75 72 6e 20 6e 65  oses.  Return ne
21f20 67 61 74 69 76 65 2c 0a 2a 2a 20 7a 65 72 6f 2c  gative,.** zero,
21f30 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
21f40 61 20 69 73 20 6c 65 73 73 20 74 68 65 6e 2c 20  a is less then, 
21f50 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
21f60 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 62 2e 0a  ater.** than b..
21f70 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 73 20 74 68  **.** Symbols th
21f80 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 75 70  at begin with up
21f90 70 65 72 20 63 61 73 65 20 6c 65 74 74 65 72 73  per case letters
21fa0 20 28 74 65 72 6d 69 6e 61 6c 73 20 6f 72 20 74   (terminals or t
21fb0 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75 73 74 20 73  okens).** must s
21fc0 6f 72 74 20 62 65 66 6f 72 65 20 73 79 6d 62 6f  ort before symbo
21fd0 6c 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  ls that begin wi
21fe0 74 68 20 6c 6f 77 65 72 20 63 61 73 65 20 6c 65  th lower case le
21ff0 74 74 65 72 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65  tters.** (non-te
22000 72 6d 69 6e 61 6c 73 29 2e 20 20 41 6e 64 20 4d  rminals).  And M
22010 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 73 79 6d  ULTITERMINAL sym
22020 62 6f 6c 73 20 28 63 72 65 61 74 65 64 20 75 73  bols (created us
22030 69 6e 67 20 74 68 65 0a 2a 2a 20 25 74 6f 6b 65  ing the.** %toke
22040 6e 5f 63 6c 61 73 73 20 64 69 72 65 63 74 69 76  n_class directiv
22050 65 29 20 6d 75 73 74 20 73 6f 72 74 20 61 74 20  e) must sort at 
22060 74 68 65 20 76 65 72 79 20 65 6e 64 2e 20 4f 74  the very end. Ot
22070 68 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 61 74  her than.** that
22080 2c 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  , the order does
22090 20 6e 6f 74 20 6d 61 74 74 65 72 2e 0a 2a 2a 0a   not matter..**.
220a0 2a 2a 20 57 65 20 66 69 6e 64 20 65 78 70 65 72  ** We find exper
220b0 69 6d 65 6e 74 61 6c 6c 79 20 74 68 61 74 20 6c  imentally that l
220c0 65 61 76 69 6e 67 20 74 68 65 20 73 79 6d 62 6f  eaving the symbo
220d0 6c 73 20 69 6e 20 74 68 65 69 72 20 6f 72 69 67  ls in their orig
220e0 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65 72 20 28 74  inal.** order (t
220f0 68 65 20 6f 72 64 65 72 20 74 68 65 79 20 61 70  he order they ap
22100 70 65 61 72 65 64 20 69 6e 20 74 68 65 20 67 72  peared in the gr
22110 61 6d 6d 61 72 20 66 69 6c 65 29 20 67 69 76 65  ammar file) give
22120 73 20 74 68 65 0a 2a 2a 20 73 6d 61 6c 6c 65 73  s the.** smalles
22130 74 20 70 61 72 73 65 72 20 74 61 62 6c 65 73 20  t parser tables 
22140 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 69 6e  in SQLite..*/.in
22150 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63 6f 6e  t Symbolcmpp(con
22160 73 74 20 76 6f 69 64 20 2a 5f 61 2c 20 63 6f 6e  st void *_a, con
22170 73 74 20 76 6f 69 64 20 2a 5f 62 29 0a 7b 0a 20  st void *_b).{. 
22180 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79   const struct sy
22190 6d 62 6f 6c 20 2a 61 20 3d 20 2a 28 63 6f 6e 73  mbol *a = *(cons
221a0 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  t struct symbol 
221b0 2a 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e 73 74 20  **) _a;.  const 
221c0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62  struct symbol *b
221d0 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63   = *(const struc
221e0 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 5f 62 3b  t symbol **) _b;
221f0 0a 20 20 69 6e 74 20 69 31 20 3d 20 61 2d 3e 74  .  int i1 = a->t
22200 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype==MULTITERMIN
22210 41 4c 20 3f 20 33 20 3a 20 61 2d 3e 6e 61 6d 65  AL ? 3 : a->name
22220 5b 30 5d 3e 27 5a 27 20 3f 20 32 20 3a 20 31 3b  [0]>'Z' ? 2 : 1;
22230 0a 20 20 69 6e 74 20 69 32 20 3d 20 62 2d 3e 74  .  int i2 = b->t
22240 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype==MULTITERMIN
22250 41 4c 20 3f 20 33 20 3a 20 62 2d 3e 6e 61 6d 65  AL ? 3 : b->name
22260 5b 30 5d 3e 27 5a 27 20 3f 20 32 20 3a 20 31 3b  [0]>'Z' ? 2 : 1;
22270 0a 20 20 72 65 74 75 72 6e 20 69 31 3d 3d 69 32  .  return i1==i2
22280 20 3f 20 61 2d 3e 69 6e 64 65 78 20 2d 20 62 2d   ? a->index - b-
22290 3e 69 6e 64 65 78 20 3a 20 69 31 20 2d 20 69 32  >index : i1 - i2
222a0 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  ;.}../* There is
222b0 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
222c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
222d0 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63  tructure for eac
222e0 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65  h.** associative
222f0 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
22300 78 32 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73  x2"..*/.struct s
22310 5f 78 32 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65  _x2 {.  int size
22320 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22330 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
22340 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73   available slots
22350 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22370 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f  *   Must be a po
22380 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72  wer of 2 greater
22390 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20   than or */.    
223a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223b0 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c        /*   equal
223c0 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63   to 1 */.  int c
223d0 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ount;           
223e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
223f0 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20  currently slots 
22400 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75  filled */.  stru
22410 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 74 62 6c  ct s_x2node *tbl
22420 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73  ;  /* The data s
22430 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20  tored here */.  
22440 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20  struct s_x2node 
22450 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74  **ht;  /* Hash t
22460 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73  able for lookups
22470 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65   */.};../* There
22480 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
22490 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
224a0 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  re for every dat
224b0 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20  a element.** in 
224c0 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  an associative a
224d0 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 32  rray of type "x2
224e0 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  "..*/.typedef st
224f0 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 7b 0a  ruct s_x2node {.
22500 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
22510 2a 64 61 74 61 3b 20 20 20 20 20 2f 2a 20 54 68  *data;     /* Th
22520 65 20 64 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73  e data */.  cons
22530 74 20 63 68 61 72 20 2a 6b 65 79 3b 20 20 20 20  t char *key;    
22540 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20       /* The key 
22550 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32  */.  struct s_x2
22560 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a  node *next;   /*
22570 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68   Next entry with
22580 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
22590 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
225a0 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20  ode **from;  /* 
225b0 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f  Previous link */
225c0 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20 54  .} x2node;../* T
225d0 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65  here is only one
225e0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
225f0 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73   array, which is
22600 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
22610 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
22620 73 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20 41  s_x2 *x2a;../* A
22630 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73  llocate a new as
22640 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
22650 2a 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69  */.void Symbol_i
22660 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 32 61  nit(){.  if( x2a
22670 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 32 61   ) return;.  x2a
22680 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 32 2a   = (struct s_x2*
22690 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
226a0 73 74 72 75 63 74 20 73 5f 78 32 29 20 29 3b 0a  struct s_x2) );.
226b0 20 20 69 66 28 20 78 32 61 20 29 7b 0a 20 20 20    if( x2a ){.   
226c0 20 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38   x2a->size = 128
226d0 3b 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e 74  ;.    x2a->count
226e0 20 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e 74   = 0;.    x2a->t
226f0 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 63 61  bl = (x2node*)ca
22700 6c 6c 6f 63 28 31 32 38 2c 20 73 69 7a 65 6f 66  lloc(128, sizeof
22710 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x2node) + sizeo
22720 66 28 78 32 6e 6f 64 65 2a 29 29 3b 0a 20 20 20  f(x2node*));.   
22730 20 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d 30   if( x2a->tbl==0
22740 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78   ){.      free(x
22750 32 61 29 3b 0a 20 20 20 20 20 20 78 32 61 20 3d  2a);.      x2a =
22760 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
22770 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
22780 20 20 78 32 61 2d 3e 68 74 20 3d 20 28 78 32 6e    x2a->ht = (x2n
22790 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62 6c  ode**)&(x2a->tbl
227a0 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f  [128]);.      fo
227b0 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b  r(i=0; i<128; i+
227c0 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x2a->ht[i] = 
227d0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f  0;.    }.  }.}./
227e0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
227f0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61  ecord into the a
22800 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52  rray.  Return TR
22810 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  UE if successful
22820 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20  ..** Prior data 
22830 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
22840 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69  y is NOT overwri
22850 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d 62  tten */.int Symb
22860 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74  ol_insert(struct
22870 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 2c 20 63   symbol *data, c
22880 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29 0a  onst char *key).
22890 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a  {.  x2node *np;.
228a0 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20    unsigned h;.  
228b0 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20  unsigned ph;..  
228c0 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74  if( x2a==0 ) ret
228d0 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74  urn 0;.  ph = st
228e0 72 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20  rhash(key);.  h 
228f0 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a  = ph & (x2a->siz
22900 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61  e-1);.  np = x2a
22910 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
22920 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
22930 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b  strcmp(np->key,k
22940 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ey)==0 ){.      
22950 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65  /* An existing e
22960 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
22970 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e  me key is found.
22980 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   */.      /* Fai
22990 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72  l because overwr
229a0 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ite is not allow
229b0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  s. */.      retu
229c0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
229d0 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
229e0 20 7d 0a 20 20 69 66 28 20 78 32 61 2d 3e 63 6f   }.  if( x2a->co
229f0 75 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a 65 20 29  unt>=x2a->size )
22a00 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
22a10 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
22a20 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20  able bigger */. 
22a30 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20     int i,size;. 
22a40 20 20 20 73 74 72 75 63 74 20 73 5f 78 32 20 61     struct s_x2 a
22a50 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e  rray;.    array.
22a60 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 32  size = size = x2
22a70 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61  a->size*2;.    a
22a80 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 32 61  rray.count = x2a
22a90 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72  ->count;.    arr
22aa0 61 79 2e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65  ay.tbl = (x2node
22ab0 2a 29 63 61 6c 6c 6f 63 28 73 69 7a 65 2c 20 73  *)calloc(size, s
22ac0 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20  izeof(x2node) + 
22ad0 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29  sizeof(x2node*))
22ae0 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e  ;.    if( array.
22af0 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tbl==0 ) return 
22b00 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20  0;  /* Fail due 
22b10 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  to malloc failur
22b20 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68  e */.    array.h
22b30 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28  t = (x2node**)&(
22b40 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29  array.tbl[size])
22b50 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
22b60 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
22b70 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  y.ht[i] = 0;.   
22b80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d   for(i=0; i<x2a-
22b90 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  >count; i++){.  
22ba0 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e      x2node *oldn
22bb0 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20  p, *newnp;.     
22bc0 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e   oldnp = &(x2a->
22bd0 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68  tbl[i]);.      h
22be0 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70   = strhash(oldnp
22bf0 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31  ->key) & (size-1
22c00 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
22c10 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
22c20 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
22c30 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
22c40 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
22c50 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
22c60 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
22c70 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
22c80 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20       newnp->key 
22c90 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20  = oldnp->key;.  
22ca0 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
22cb0 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
22cc0 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
22cd0 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
22ce0 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
22cf0 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
22d00 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 32 61    }.    free(x2a
22d10 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 32 61  ->tbl);.    *x2a
22d20 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
22d30 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
22d40 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
22d50 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d  ph & (x2a->size-
22d60 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 32 61  1);.  np = &(x2a
22d70 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74  ->tbl[x2a->count
22d80 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20  ++]);.  np->key 
22d90 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74  = key;.  np->dat
22da0 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
22db0 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20 78 32 61  x2a->ht[h] ) x2a
22dc0 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
22dd0 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
22de0 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61 2d 3e 68  p->next = x2a->h
22df0 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e 68 74 5b  t[h];.  x2a->ht[
22e00 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
22e10 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e 68 74 5b  rom = &(x2a->ht[
22e20 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
22e30 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
22e40 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
22e50 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
22e60 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
22e70 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
22e80 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
22e90 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
22ea0 62 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63  bol_find(const c
22eb0 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e  har *key).{.  un
22ec0 73 69 67 6e 65 64 20 68 3b 0a 20 20 78 32 6e 6f  signed h;.  x2no
22ed0 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78  de *np;..  if( x
22ee0 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  2a==0 ) return 0
22ef0 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68 28  ;.  h = strhash(
22f00 6b 65 79 29 20 26 20 28 78 32 61 2d 3e 73 69 7a  key) & (x2a->siz
22f10 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61  e-1);.  np = x2a
22f20 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
22f30 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
22f40 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b  strcmp(np->key,k
22f50 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ey)==0 ) break;.
22f60 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
22f70 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
22f80 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20  np ? np->data : 
22f90 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  0;.}../* Return 
22fa0 74 68 65 20 6e 2d 74 68 20 64 61 74 61 2e 20 20  the n-th data.  
22fb0 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
22fc0 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
22fd0 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62  . */.struct symb
22fe0 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 69  ol *Symbol_Nth(i
22ff0 6e 74 20 6e 29 0a 7b 0a 20 20 73 74 72 75 63 74  nt n).{.  struct
23000 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 20   symbol *data;. 
23010 20 69 66 28 20 78 32 61 20 26 26 20 6e 3e 30 20   if( x2a && n>0 
23020 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e 74  && n<=x2a->count
23030 20 29 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 78   ){.    data = x
23040 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61 74  2a->tbl[n-1].dat
23050 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
23060 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  data = 0;.  }.  
23070 72 65 74 75 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a  return data;.}..
23080 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  /* Return the si
23090 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ze of the array 
230a0 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f  */.int Symbol_co
230b0 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74 75 72 6e  unt().{.  return
230c0 20 78 32 61 20 3f 20 78 32 61 2d 3e 63 6f 75 6e   x2a ? x2a->coun
230d0 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  t : 0;.}../* Ret
230e0 75 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20  urn an array of 
230f0 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20  pointers to all 
23100 64 61 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c  data in the tabl
23110 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20  e..** The array 
23120 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
23130 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e   malloc.  Return
23140 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20   NULL if memory 
23150 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72  allocation.** pr
23160 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68  oblems, or if th
23170 65 20 61 72 72 61 79 20 69 73 20 65 6d 70 74 79  e array is empty
23180 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62  . */.struct symb
23190 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61  ol **Symbol_arra
231a0 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75 63 74  yof().{.  struct
231b0 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72 61 79 3b   symbol **array;
231c0 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20  .  int i,size;. 
231d0 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65   if( x2a==0 ) re
231e0 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d  turn 0;.  size =
231f0 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61   x2a->count;.  a
23200 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20 73  rray = (struct s
23210 79 6d 62 6f 6c 20 2a 2a 29 63 61 6c 6c 6f 63 28  ymbol **)calloc(
23220 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28 73 74 72  size, sizeof(str
23230 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 29 3b 0a  uct symbol *));.
23240 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a 20    if( array ){. 
23250 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
23260 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69  ze; i++) array[i
23270 5d 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e  ] = x2a->tbl[i].
23280 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75  data;.  }.  retu
23290 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20  rn array;.}../* 
232a0 43 6f 6d 70 61 72 65 20 74 77 6f 20 63 6f 6e 66  Compare two conf
232b0 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e  igurations */.in
232c0 74 20 43 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73  t Configcmp(cons
232d0 74 20 63 68 61 72 20 2a 5f 61 2c 63 6f 6e 73 74  t char *_a,const
232e0 20 63 68 61 72 20 2a 5f 62 29 0a 7b 0a 20 20 63   char *_b).{.  c
232f0 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6e 66  onst struct conf
23300 69 67 20 2a 61 20 3d 20 28 73 74 72 75 63 74 20  ig *a = (struct 
23310 63 6f 6e 66 69 67 20 2a 29 20 5f 61 3b 0a 20 20  config *) _a;.  
23320 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63 6f 6e  const struct con
23330 66 69 67 20 2a 62 20 3d 20 28 73 74 72 75 63 74  fig *b = (struct
23340 20 63 6f 6e 66 69 67 20 2a 29 20 5f 62 3b 0a 20   config *) _b;. 
23350 20 69 6e 74 20 78 3b 0a 20 20 78 20 3d 20 61 2d   int x;.  x = a-
23360 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e  >rp->index - b->
23370 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28  rp->index;.  if(
23380 20 78 3d 3d 30 20 29 20 78 20 3d 20 61 2d 3e 64   x==0 ) x = a->d
23390 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 72  ot - b->dot;.  r
233a0 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20 43  eturn x;.}../* C
233b0 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61 74 65  ompare two state
233c0 73 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74  s */.PRIVATE int
233d0 20 73 74 61 74 65 63 6d 70 28 73 74 72 75 63 74   statecmp(struct
233e0 20 63 6f 6e 66 69 67 20 2a 61 2c 20 73 74 72 75   config *a, stru
233f0 63 74 20 63 6f 6e 66 69 67 20 2a 62 29 0a 7b 0a  ct config *b).{.
23400 20 20 69 6e 74 20 72 63 3b 0a 20 20 66 6f 72 28    int rc;.  for(
23410 72 63 3d 30 3b 20 72 63 3d 3d 30 20 26 26 20 61  rc=0; rc==0 && a
23420 20 26 26 20 62 3b 20 20 61 3d 61 2d 3e 62 70 2c   && b;  a=a->bp,
23430 20 62 3d 62 2d 3e 62 70 29 7b 0a 20 20 20 20 72   b=b->bp){.    r
23440 63 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78  c = a->rp->index
23450 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b   - b->rp->index;
23460 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29  .    if( rc==0 )
23470 20 72 63 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62   rc = a->dot - b
23480 2d 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20 69 66 28  ->dot;.  }.  if(
23490 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
234a0 28 20 61 20 29 20 72 63 20 3d 20 31 3b 0a 20 20  ( a ) rc = 1;.  
234b0 20 20 69 66 28 20 62 20 29 20 72 63 20 3d 20 2d    if( b ) rc = -
234c0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
234d0 72 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61  rc;.}../* Hash a
234e0 20 73 74 61 74 65 20 2a 2f 0a 50 52 49 56 41 54   state */.PRIVAT
234f0 45 20 75 6e 73 69 67 6e 65 64 20 73 74 61 74 65  E unsigned state
23500 68 61 73 68 28 73 74 72 75 63 74 20 63 6f 6e 66  hash(struct conf
23510 69 67 20 2a 61 29 0a 7b 0a 20 20 75 6e 73 69 67  ig *a).{.  unsig
23520 6e 65 64 20 68 3d 30 3b 0a 20 20 77 68 69 6c 65  ned h=0;.  while
23530 28 20 61 20 29 7b 0a 20 20 20 20 68 20 3d 20 68  ( a ){.    h = h
23540 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e  *571 + a->rp->in
23550 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b  dex*37 + a->dot;
23560 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b 0a  .    a = a->bp;.
23570 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a    }.  return h;.
23580 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  }../* Allocate a
23590 20 6e 65 77 20 73 74 61 74 65 20 73 74 72 75 63   new state struc
235a0 74 75 72 65 20 2a 2f 0a 73 74 72 75 63 74 20 73  ture */.struct s
235b0 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28  tate *State_new(
235c0 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  ).{.  struct sta
235d0 74 65 20 2a 6e 65 77 73 74 61 74 65 3b 0a 20 20  te *newstate;.  
235e0 6e 65 77 73 74 61 74 65 20 3d 20 28 73 74 72 75  newstate = (stru
235f0 63 74 20 73 74 61 74 65 20 2a 29 63 61 6c 6c 6f  ct state *)callo
23600 63 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  c(1, sizeof(stru
23610 63 74 20 73 74 61 74 65 29 20 29 3b 0a 20 20 4d  ct state) );.  M
23620 65 6d 6f 72 79 43 68 65 63 6b 28 6e 65 77 73 74  emoryCheck(newst
23630 61 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  ate);.  return n
23640 65 77 73 74 61 74 65 3b 0a 7d 0a 0a 2f 2a 20 54  ewstate;.}../* T
23650 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
23660 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
23670 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
23680 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f  for each.** asso
23690 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
236a0 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73   type "x3"..*/.s
236b0 74 72 75 63 74 20 73 5f 78 33 20 7b 0a 20 20 69  truct s_x3 {.  i
236c0 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
236d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
236e0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
236f0 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20  e slots. */.    
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23710 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20        /*   Must 
23720 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
23730 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
23740 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23760 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a    equal to 1 */.
23770 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20    int count;    
23780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23790 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79  ber of currently
237a0 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f   slots filled */
237b0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  .  struct s_x3no
237c0 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65  de *tbl;  /* The
237d0 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72   data stored her
237e0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  e */.  struct s_
237f0 78 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a  x3node **ht;  /*
23800 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   Hash table for 
23810 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f  lookups */.};../
23820 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
23830 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
23840 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76  structure for ev
23850 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ery data element
23860 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69  .** in an associ
23870 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
23880 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70  ype "x3"..*/.typ
23890 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 33  edef struct s_x3
238a0 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20  node {.  struct 
238b0 73 74 61 74 65 20 2a 64 61 74 61 3b 20 20 20 20  state *data;    
238c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
238d0 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73   The data */.  s
238e0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
238f0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
23900 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20       /* The key 
23910 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33  */.  struct s_x3
23920 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a  node *next;   /*
23930 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68   Next entry with
23940 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
23950 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
23960 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20  ode **from;  /* 
23970 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f  Previous link */
23980 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54  .} x3node;../* T
23990 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65  here is only one
239a0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
239b0 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73   array, which is
239c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
239d0 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
239e0 73 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41  s_x3 *x3a;../* A
239f0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73  llocate a new as
23a00 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
23a10 2a 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e  */.void State_in
23a20 69 74 28 29 7b 0a 20 20 69 66 28 20 78 33 61 20  it(){.  if( x3a 
23a30 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 33 61 20  ) return;.  x3a 
23a40 3d 20 28 73 74 72 75 63 74 20 73 5f 78 33 2a 29  = (struct s_x3*)
23a50 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
23a60 74 72 75 63 74 20 73 5f 78 33 29 20 29 3b 0a 20  truct s_x3) );. 
23a70 20 69 66 28 20 78 33 61 20 29 7b 0a 20 20 20 20   if( x3a ){.    
23a80 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b  x3a->size = 128;
23a90 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e 74 20  .    x3a->count 
23aa0 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e 74 62  = 0;.    x3a->tb
23ab0 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 63 61 6c  l = (x3node*)cal
23ac0 6c 6f 63 28 31 32 38 2c 20 73 69 7a 65 6f 66 28  loc(128, sizeof(
23ad0 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x3node) + sizeof
23ae0 28 78 33 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20  (x3node*));.    
23af0 69 66 28 20 78 33 61 2d 3e 74 62 6c 3d 3d 30 20  if( x3a->tbl==0 
23b00 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 33  ){.      free(x3
23b10 61 29 3b 0a 20 20 20 20 20 20 78 33 61 20 3d 20  a);.      x3a = 
23b20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
23b30 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
23b40 20 78 33 61 2d 3e 68 74 20 3d 20 28 78 33 6e 6f   x3a->ht = (x3no
23b50 64 65 2a 2a 29 26 28 78 33 61 2d 3e 74 62 6c 5b  de**)&(x3a->tbl[
23b60 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  128]);.      for
23b70 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b  (i=0; i<128; i++
23b80 29 20 78 33 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x3a->ht[i] = 0
23b90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
23ba0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
23bb0 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
23bc0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
23bd0 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
23be0 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
23bf0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
23c00 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
23c10 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 61 74 65  ten */.int State
23c20 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 73  _insert(struct s
23c30 74 61 74 65 20 2a 64 61 74 61 2c 20 73 74 72 75  tate *data, stru
23c40 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a  ct config *key).
23c50 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a  {.  x3node *np;.
23c60 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20    unsigned h;.  
23c70 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20  unsigned ph;..  
23c80 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74  if( x3a==0 ) ret
23c90 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74  urn 0;.  ph = st
23ca0 61 74 65 68 61 73 68 28 6b 65 79 29 3b 0a 20 20  atehash(key);.  
23cb0 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73  h = ph & (x3a->s
23cc0 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
23cd0 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  3a->ht[h];.  whi
23ce0 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
23cf0 28 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b  ( statecmp(np->k
23d00 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20  ey,key)==0 ){.  
23d10 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
23d20 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  ng entry with th
23d30 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f  e same key is fo
23d40 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  und. */.      /*
23d50 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76   Fail because ov
23d60 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61  erwrite is not a
23d70 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  llows. */.      
23d80 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
23d90 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
23da0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 33 61  t;.  }.  if( x3a
23db0 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d 3e 73 69  ->count>=x3a->si
23dc0 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  ze ){.    /* Nee
23dd0 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61  d to make the ha
23de0 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20  sh table bigger 
23df0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a  */.    int i,siz
23e00 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f  e;.    struct s_
23e10 78 33 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72  x3 array;.    ar
23e20 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20  ray.size = size 
23e30 3d 20 78 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20  = x3a->size*2;. 
23e40 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d     array.count =
23e50 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20   x3a->count;.   
23e60 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 33   array.tbl = (x3
23e70 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 73 69 7a  node*)calloc(siz
23e80 65 2c 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65  e, sizeof(x3node
23e90 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64  ) + sizeof(x3nod
23ea0 65 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72  e*));.    if( ar
23eb0 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74  ray.tbl==0 ) ret
23ec0 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20  urn 0;  /* Fail 
23ed0 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61  due to malloc fa
23ee0 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72  ilure */.    arr
23ef0 61 79 2e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a  ay.ht = (x3node*
23f00 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69  *)&(array.tbl[si
23f10 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ze]);.    for(i=
23f20 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20  0; i<size; i++) 
23f30 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b  array.ht[i] = 0;
23f40 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23f50 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x3a->count; i++)
23f60 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64 65 20 2a  {.      x3node *
23f70 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20  oldnp, *newnp;. 
23f80 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78       oldnp = &(x
23f90 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  3a->tbl[i]);.   
23fa0 20 20 20 68 20 3d 20 73 74 61 74 65 68 61 73 68     h = statehash
23fb0 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28  (oldnp->key) & (
23fc0 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e  size-1);.      n
23fd0 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74  ewnp = &(array.t
23fe0 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  bl[i]);.      if
23ff0 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20  ( array.ht[h] ) 
24000 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f  array.ht[h]->fro
24010 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78  m = &(newnp->nex
24020 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  t);.      newnp-
24030 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74  >next = array.ht
24040 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  [h];.      newnp
24050 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b  ->key = oldnp->k
24060 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  ey;.      newnp-
24070 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64  >data = oldnp->d
24080 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  ata;.      newnp
24090 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79  ->from = &(array
240a0 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61  .ht[h]);.      a
240b0 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77  rray.ht[h] = new
240c0 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  np;.    }.    fr
240d0 65 65 28 78 33 61 2d 3e 74 62 6c 29 3b 0a 20 20  ee(x3a->tbl);.  
240e0 20 20 2a 78 33 61 20 3d 20 61 72 72 61 79 3b 0a    *x3a = array;.
240f0 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20    }.  /* Insert 
24100 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a  the new data */.
24110 20 20 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d    h = ph & (x3a-
24120 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
24130 20 26 28 78 33 61 2d 3e 74 62 6c 5b 78 33 61 2d   &(x3a->tbl[x3a-
24140 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70  >count++]);.  np
24150 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e  ->key = key;.  n
24160 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a  p->data = data;.
24170 20 20 69 66 28 20 78 33 61 2d 3e 68 74 5b 68 5d    if( x3a->ht[h]
24180 20 29 20 78 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66   ) x3a->ht[h]->f
24190 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74  rom = &(np->next
241a0 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20  );.  np->next = 
241b0 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 33  x3a->ht[h];.  x3
241c0 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20  a->ht[h] = np;. 
241d0 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 33   np->from = &(x3
241e0 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74  a->ht[h]);.  ret
241f0 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  urn 1;.}../* Ret
24200 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
24210 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74   data assigned t
24220 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e  o the given key.
24230 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a    Return NULL.**
24240 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e   if no such key.
24250 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65   */.struct state
24260 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 73 74 72   *State_find(str
24270 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29  uct config *key)
24280 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b  .{.  unsigned h;
24290 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a  .  x3node *np;..
242a0 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72    if( x3a==0 ) r
242b0 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73  eturn 0;.  h = s
242c0 74 61 74 65 68 61 73 68 28 6b 65 79 29 20 26 20  tatehash(key) & 
242d0 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x3a->size-1);. 
242e0 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d   np = x3a->ht[h]
242f0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
24300 0a 20 20 20 20 69 66 28 20 73 74 61 74 65 63 6d  .    if( statecm
24310 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d  p(np->key,key)==
24320 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e  0 ) break;.    n
24330 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
24340 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20  }.  return np ? 
24350 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a  np->data : 0;.}.
24360 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72  ./* Return an ar
24370 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ray of pointers 
24380 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74  to all data in t
24390 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65  he table..** The
243a0 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e   array is obtain
243b0 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  ed from malloc. 
243c0 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
243d0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
243e0 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f  n.** problems, o
243f0 72 20 69 66 20 74 68 65 20 61 72 72 61 79 20 69  r if the array i
24400 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75  s empty. */.stru
24410 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65  ct state **State
24420 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73  _arrayof().{.  s
24430 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 61 72  truct state **ar
24440 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a  ray;.  int i,siz
24450 65 3b 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20  e;.  if( x3a==0 
24460 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69  ) return 0;.  si
24470 7a 65 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b  ze = x3a->count;
24480 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74 72 75  .  array = (stru
24490 63 74 20 73 74 61 74 65 20 2a 2a 29 63 61 6c 6c  ct state **)call
244a0 6f 63 28 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28  oc(size, sizeof(
244b0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 29  struct state *))
244c0 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b  ;.  if( array ){
244d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
244e0 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  size; i++) array
244f0 5b 69 5d 20 3d 20 78 33 61 2d 3e 74 62 6c 5b 69  [i] = x3a->tbl[i
24500 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65  ].data;.  }.  re
24510 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f  turn array;.}../
24520 2a 20 48 61 73 68 20 61 20 63 6f 6e 66 69 67 75  * Hash a configu
24530 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54  ration */.PRIVAT
24540 45 20 75 6e 73 69 67 6e 65 64 20 63 6f 6e 66 69  E unsigned confi
24550 67 68 61 73 68 28 73 74 72 75 63 74 20 63 6f 6e  ghash(struct con
24560 66 69 67 20 2a 61 29 0a 7b 0a 20 20 75 6e 73 69  fig *a).{.  unsi
24570 67 6e 65 64 20 68 3d 30 3b 0a 20 20 68 20 3d 20  gned h=0;.  h = 
24580 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69  h*571 + a->rp->i
24590 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74  ndex*37 + a->dot
245a0 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a  ;.  return h;.}.
245b0 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
245c0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
245d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
245e0 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a  ture for each.**
245f0 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
24600 61 79 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e  ay of type "x4".
24610 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 34 20  .*/.struct s_x4 
24620 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  {.  int size;   
24630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24640 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
24650 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f  ilable slots. */
24660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
24680 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  Must be a power 
24690 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61  of 2 greater tha
246a0 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  n or */.        
246b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246c0 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20    /*   equal to 
246d0 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74  1 */.  int count
246e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
246f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72  * Number of curr
24700 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c  ently slots fill
24710 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ed */.  struct s
24720 5f 78 34 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f  _x4node *tbl;  /
24730 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65  * The data store
24740 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75  d here */.  stru
24750 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 68 74  ct s_x4node **ht
24760 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65  ;  /* Hash table
24770 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a   for lookups */.
24780 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  };../* There is 
24790 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
247a0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66  this structure f
247b0 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c  or every data el
247c0 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61  ement.** in an a
247d0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
247e0 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a   of type "x4"..*
247f0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24800 20 73 5f 78 34 6e 6f 64 65 20 7b 0a 20 20 73 74   s_x4node {.  st
24810 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74  ruct config *dat
24820 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
24830 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
24840 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34  */.  struct s_x4
24850 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a  node *next;   /*
24860 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68   Next entry with
24870 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
24880 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e  /.  struct s_x4n
24890 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20  ode **from;  /* 
248a0 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f  Previous link */
248b0 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54  .} x4node;../* T
248c0 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65  here is only one
248d0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
248e0 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73   array, which is
248f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
24900 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
24910 73 5f 78 34 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41  s_x4 *x4a;../* A
24920 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73  llocate a new as
24930 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
24940 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  */.void Configta
24950 62 6c 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66  ble_init(){.  if
24960 28 20 78 34 61 20 29 20 72 65 74 75 72 6e 3b 0a  ( x4a ) return;.
24970 20 20 78 34 61 20 3d 20 28 73 74 72 75 63 74 20    x4a = (struct 
24980 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  s_x4*)malloc( si
24990 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 34  zeof(struct s_x4
249a0 29 20 29 3b 0a 20 20 69 66 28 20 78 34 61 20 29  ) );.  if( x4a )
249b0 7b 0a 20 20 20 20 78 34 61 2d 3e 73 69 7a 65 20  {.    x4a->size 
249c0 3d 20 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63  = 64;.    x4a->c
249d0 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 34  ount = 0;.    x4
249e0 61 2d 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65  a->tbl = (x4node
249f0 2a 29 63 61 6c 6c 6f 63 28 36 34 2c 20 73 69 7a  *)calloc(64, siz
24a00 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69  eof(x4node) + si
24a10 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 3b 0a  zeof(x4node*));.
24a20 20 20 20 20 69 66 28 20 78 34 61 2d 3e 74 62 6c      if( x4a->tbl
24a30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65  ==0 ){.      fre
24a40 65 28 78 34 61 29 3b 0a 20 20 20 20 20 20 78 34  e(x4a);.      x4
24a50 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
24a60 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
24a70 20 20 20 20 20 78 34 61 2d 3e 68 74 20 3d 20 28       x4a->ht = (
24a80 78 34 6e 6f 64 65 2a 2a 29 26 28 78 34 61 2d 3e  x4node**)&(x4a->
24a90 74 62 6c 5b 36 34 5d 29 3b 0a 20 20 20 20 20 20  tbl[64]);.      
24aa0 66 6f 72 28 69 3d 30 3b 20 69 3c 36 34 3b 20 69  for(i=0; i<64; i
24ab0 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x4a->ht[i] =
24ac0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
24ad0 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
24ae0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
24af0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
24b00 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
24b10 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
24b20 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
24b30 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
24b40 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f 6e  itten */.int Con
24b50 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
24b60 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64  struct config *d
24b70 61 74 61 29 0a 7b 0a 20 20 78 34 6e 6f 64 65 20  ata).{.  x4node 
24b80 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  *np;.  unsigned 
24b90 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68  h;.  unsigned ph
24ba0 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20  ;..  if( x4a==0 
24bb0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68  ) return 0;.  ph
24bc0 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 64 61   = confighash(da
24bd0 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ta);.  h = ph & 
24be0 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x4a->size-1);. 
24bf0 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d   np = x4a->ht[h]
24c00 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
24c10 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63  .    if( Configc
24c20 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  mp((const char *
24c30 29 20 6e 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73  ) np->data,(cons
24c40 74 20 63 68 61 72 20 2a 29 20 64 61 74 61 29 3d  t char *) data)=
24c50 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
24c60 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
24c70 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
24c80 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a  ey is found. */.
24c90 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65        /* Fail be
24ca0 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20  cause overwrite 
24cb0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a  is not allows. *
24cc0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
24cd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d  ;.    }.    np =
24ce0 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
24cf0 20 69 66 28 20 78 34 61 2d 3e 63 6f 75 6e 74 3e   if( x4a->count>
24d00 3d 78 34 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20  =x4a->size ){.  
24d10 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
24d20 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
24d30 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69   bigger */.    i
24d40 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73  nt i,size;.    s
24d50 74 72 75 63 74 20 73 5f 78 34 20 61 72 72 61 79  truct s_x4 array
24d60 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65  ;.    array.size
24d70 20 3d 20 73 69 7a 65 20 3d 20 78 34 61 2d 3e 73   = size = x4a->s
24d80 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79  ize*2;.    array
24d90 2e 63 6f 75 6e 74 20 3d 20 78 34 61 2d 3e 63 6f  .count = x4a->co
24da0 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74  unt;.    array.t
24db0 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 63 61  bl = (x4node*)ca
24dc0 6c 6c 6f 63 28 73 69 7a 65 2c 20 73 69 7a 65 6f  lloc(size, sizeo
24dd0 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x4node) + size
24de0 6f 66 28 78 34 6e 6f 64 65 2a 29 29 3b 0a 20 20  of(x4node*));.  
24df0 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d    if( array.tbl=
24e00 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
24e10 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d  /* Fail due to m
24e20 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f  alloc failure */
24e30 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20  .    array.ht = 
24e40 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61  (x4node**)&(arra
24e50 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20  y.tbl[size]);.  
24e60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
24e70 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74  e; i++) array.ht
24e80 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  [i] = 0;.    for
24e90 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75  (i=0; i<x4a->cou
24ea0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
24eb0 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a  x4node *oldnp, *
24ec0 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64  newnp;.      old
24ed0 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b  np = &(x4a->tbl[
24ee0 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 63  i]);.      h = c
24ef0 6f 6e 66 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d  onfighash(oldnp-
24f00 3e 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d 31  >data) & (size-1
24f10 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
24f20 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
24f30 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
24f40 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
24f50 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
24f60 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
24f70 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
24f80 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
24f90 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61       newnp->data
24fa0 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a   = oldnp->data;.
24fb0 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f        newnp->fro
24fc0 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68  m = &(array.ht[h
24fd0 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e  ]);.      array.
24fe0 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20  ht[h] = newnp;. 
24ff0 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 34     }.    free(x4
25000 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34  a->tbl);.    *x4
25010 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20  a = array;.  }. 
25020 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
25030 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d  ew data */.  h =
25040 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65   ph & (x4a->size
25050 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34  -1);.  np = &(x4
25060 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e  a->tbl[x4a->coun
25070 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74  t++]);.  np->dat
25080 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
25090 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61  x4a->ht[h] ) x4a
250a0 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
250b0 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
250c0 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68  p->next = x4a->h
250d0 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b  t[h];.  x4a->ht[
250e0 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
250f0 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b  rom = &(x4a->ht[
25100 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
25110 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
25120 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
25130 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
25140 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
25150 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
25160 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
25170 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
25180 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74  figtable_find(st
25190 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
251a0 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78  ).{.  int h;.  x
251b0 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  4node *np;..  if
251c0 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x4a==0 ) retur
251d0 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69  n 0;.  h = confi
251e0 67 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 34  ghash(key) & (x4
251f0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
25200 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x4a->ht[h];. 
25210 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
25220 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28    if( Configcmp(
25230 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6e  (const char *) n
25240 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20 63  p->data,(const c
25250 68 61 72 20 2a 29 20 6b 65 79 29 3d 3d 30 20 29  har *) key)==0 )
25260 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
25270 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
25280 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
25290 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
252a0 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61   Remove all data
252b0 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e   from the table.
252c0 20 20 50 61 73 73 20 65 61 63 68 20 64 61 74 61    Pass each data
252d0 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
252e0 20 22 66 22 0a 2a 2a 20 61 73 20 69 74 20 69 73   "f".** as it is
252f0 20 72 65 6d 6f 76 65 64 2e 20 20 28 22 66 22 20   removed.  ("f" 
25300 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61  may be null to a
25310 76 6f 69 64 20 74 68 69 73 20 73 74 65 70 2e 29  void this step.)
25320 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74   */.void Configt
25330 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74 28 2a  able_clear(int(*
25340 66 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  f)(struct config
25350 20 2a 29 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a   *)).{.  int i;.
25360 20 20 69 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20    if( x4a==0 || 
25370 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20  x4a->count==0 ) 
25380 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 66 20  return;.  if( f 
25390 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61  ) for(i=0; i<x4a
253a0 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a  ->count; i++) (*
253b0 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64  f)(x4a->tbl[i].d
253c0 61 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ata);.  for(i=0;
253d0 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b   i<x4a->size; i+
253e0 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x4a->ht[i] = 
253f0 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20  0;.  x4a->count 
25400 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
25410 0a                                               .