/ Hex Artifact Content
Login

Artifact cc515b02a6610ed76c93d49bd01fdb219356d7ac:


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: 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 61 72  The first two ar
05c0: 65 20 72 65 70 6c 61 63 65 6d 65 6e 74 73 20 66  e replacements f
05d0: 6f 72 20 73 70 72 69 6e 74 66 28 29 20 61 6e 64  or sprintf() and
05e0: 20 76 73 70 72 69 6e 74 66 28 29 2e 0a 2a 2a 20   vsprintf()..** 
05f0: 54 68 65 20 74 68 69 72 64 20 69 73 20 61 20 68  The third is a h
0600: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 66 6f  elper routine fo
0610: 72 20 76 73 6e 70 72 69 6e 74 66 28 29 20 74 68  r vsnprintf() th
0620: 61 74 20 61 64 64 73 20 74 65 78 74 73 20 74 6f  at adds texts to
0630: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 0a 2a 2a   the end of a.**
0640: 20 62 75 66 66 65 72 2c 20 6d 61 6b 69 6e 67 20   buffer, making 
0650: 73 75 72 65 20 74 68 65 20 62 75 66 66 65 72 20  sure the buffer 
0660: 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 2d 74  is always zero-t
0670: 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  erminated..**.**
0680: 20 54 68 65 20 73 74 72 69 6e 67 20 66 6f 72 6d   The string form
0690: 61 74 74 65 72 20 69 73 20 61 20 6d 69 6e 69 6d  atter is a minim
06a0: 61 6c 20 73 75 62 73 65 74 20 6f 66 20 73 74 64  al subset of std
06b0: 6c 69 62 20 73 70 72 69 6e 74 66 28 29 20 73 75  lib sprintf() su
06c0: 70 70 6f 72 74 69 6e 67 20 6f 6e 6c 79 0a 2a 2a  pporting only.**
06d0: 20 61 20 66 65 77 20 73 69 6d 70 6c 79 20 63 6f   a few simply co
06e0: 6e 76 65 72 73 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  nversions:.**.**
06f0: 20 20 20 25 64 0a 2a 2a 20 20 20 25 73 0a 2a 2a     %d.**   %s.**
0700: 20 20 20 25 2e 2a 73 0a 2a 2a 0a 2a 2f 0a 73 74     %.*s.**.*/.st
0710: 61 74 69 63 20 76 6f 69 64 20 6c 65 6d 6f 6e 5f  atic void lemon_
0720: 61 64 64 74 65 78 74 28 0a 20 20 63 68 61 72 20  addtext(.  char 
0730: 2a 7a 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *zBuf,          
0740: 20 2f 2a 20 54 68 65 20 62 75 66 66 65 72 20 74   /* The buffer t
0750: 6f 20 77 68 69 63 68 20 74 65 78 74 20 69 73 20  o which text is 
0760: 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  added */.  int *
0770: 70 6e 55 73 65 64 2c 20 20 20 20 20 20 20 20 20  pnUsed,         
0780: 20 2f 2a 20 53 6c 6f 74 73 20 6f 66 20 74 68 65   /* Slots of the
0790: 20 62 75 66 66 65 72 20 75 73 65 64 20 73 6f 20   buffer used so 
07a0: 66 61 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  far */.  const c
07b0: 68 61 72 20 2a 7a 49 6e 2c 20 20 20 20 20 20 2f  har *zIn,      /
07c0: 2a 20 54 65 78 74 20 74 6f 20 61 64 64 20 2a 2f  * Text to add */
07d0: 0a 20 20 69 6e 74 20 6e 49 6e 2c 20 20 20 20 20  .  int nIn,     
07e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
07f0: 73 20 6f 66 20 74 65 78 74 20 74 6f 20 61 64 64  s of text to add
0800: 2e 20 20 2d 31 20 74 6f 20 75 73 65 20 73 74 72  .  -1 to use str
0810: 6c 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69  len() */.  int i
0820: 57 69 64 74 68 20 20 20 20 20 20 20 20 20 20 20  Width           
0830: 20 2f 2a 20 46 69 65 6c 64 20 77 69 64 74 68 2e   /* Field width.
0840: 20 20 4e 65 67 61 74 69 76 65 20 74 6f 20 6c 65    Negative to le
0850: 66 74 20 6a 75 73 74 69 66 79 20 2a 2f 0a 29 7b  ft justify */.){
0860: 0a 20 20 69 66 28 20 6e 49 6e 3c 30 20 29 20 66  .  if( nIn<0 ) f
0870: 6f 72 28 6e 49 6e 3d 30 3b 20 7a 49 6e 5b 6e 49  or(nIn=0; zIn[nI
0880: 6e 5d 3b 20 6e 49 6e 2b 2b 29 7b 7d 0a 20 20 77  n]; nIn++){}.  w
0890: 68 69 6c 65 28 20 69 57 69 64 74 68 3e 6e 49 6e  hile( iWidth>nIn
08a0: 20 29 7b 20 7a 42 75 66 5b 28 2a 70 6e 55 73 65   ){ zBuf[(*pnUse
08b0: 64 29 2b 2b 5d 20 3d 20 27 20 27 3b 20 69 57 69  d)++] = ' '; iWi
08c0: 64 74 68 2d 2d 3b 20 7d 0a 20 20 69 66 28 20 6e  dth--; }.  if( n
08d0: 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  In==0 ) return;.
08e0: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 2a    memcpy(&zBuf[*
08f0: 70 6e 55 73 65 64 5d 2c 20 7a 49 6e 2c 20 6e 49  pnUsed], zIn, nI
0900: 6e 29 3b 0a 20 20 2a 70 6e 55 73 65 64 20 2b 3d  n);.  *pnUsed +=
0910: 20 6e 49 6e 3b 0a 20 20 77 68 69 6c 65 28 20 28   nIn;.  while( (
0920: 2d 69 57 69 64 74 68 29 3e 6e 49 6e 20 29 7b 20  -iWidth)>nIn ){ 
0930: 7a 42 75 66 5b 28 2a 70 6e 55 73 65 64 29 2b 2b  zBuf[(*pnUsed)++
0940: 5d 20 3d 20 27 20 27 3b 20 69 57 69 64 74 68 2b  ] = ' '; iWidth+
0950: 2b 3b 20 7d 0a 20 20 7a 42 75 66 5b 2a 70 6e 55  +; }.  zBuf[*pnU
0960: 73 65 64 5d 20 3d 20 30 3b 0a 7d 0a 73 74 61 74  sed] = 0;.}.stat
0970: 69 63 20 69 6e 74 20 6c 65 6d 6f 6e 5f 76 73 70  ic int lemon_vsp
0980: 72 69 6e 74 66 28 63 68 61 72 20 2a 73 74 72 2c  rintf(char *str,
0990: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
09a0: 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70  rmat, va_list ap
09b0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  ){.  int i, j, k
09c0: 2c 20 63 3b 0a 20 20 69 6e 74 20 6e 55 73 65 64  , c;.  int nUsed
09d0: 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 0;.  const ch
09e0: 61 72 20 2a 7a 3b 0a 20 20 63 68 61 72 20 7a 54  ar *z;.  char zT
09f0: 65 6d 70 5b 35 30 5d 3b 0a 20 20 73 74 72 5b 30  emp[50];.  str[0
0a00: 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 6a  ] = 0;.  for(i=j
0a10: 3d 30 3b 20 28 63 20 3d 20 7a 46 6f 72 6d 61 74  =0; (c = zFormat
0a20: 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
0a30: 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 29 7b     if( c=='%' ){
0a40: 0a 20 20 20 20 20 20 69 6e 74 20 69 57 69 64 74  .      int iWidt
0a50: 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 6c 65 6d  h = 0;.      lem
0a60: 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20  on_addtext(str, 
0a70: 26 6e 55 73 65 64 2c 20 26 7a 46 6f 72 6d 61 74  &nUsed, &zFormat
0a80: 5b 6a 5d 2c 20 69 2d 6a 2c 20 30 29 3b 0a 20 20  [j], i-j, 0);.  
0a90: 20 20 20 20 63 20 3d 20 7a 46 6f 72 6d 61 74 5b      c = zFormat[
0aa0: 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ++i];.      if( 
0ab0: 69 73 64 69 67 69 74 28 63 29 20 7c 7c 20 28 63  isdigit(c) || (c
0ac0: 3d 3d 27 2d 27 20 26 26 20 69 73 64 69 67 69 74  =='-' && isdigit
0ad0: 28 7a 46 6f 72 6d 61 74 5b 69 2b 31 5d 29 29 20  (zFormat[i+1])) 
0ae0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
0af0: 3d 3d 27 2d 27 20 29 20 69 2b 2b 3b 0a 20 20 20  =='-' ) i++;.   
0b00: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 69       while( isdi
0b10: 67 69 74 28 7a 46 6f 72 6d 61 74 5b 69 5d 29 20  git(zFormat[i]) 
0b20: 29 20 69 57 69 64 74 68 20 3d 20 69 57 69 64 74  ) iWidth = iWidt
0b30: 68 2a 31 30 20 2b 20 7a 46 6f 72 6d 61 74 5b 69  h*10 + zFormat[i
0b40: 2b 2b 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20  ++] - '0';.     
0b50: 20 20 20 69 66 28 20 63 3d 3d 27 2d 27 20 29 20     if( c=='-' ) 
0b60: 69 57 69 64 74 68 20 3d 20 2d 69 57 69 64 74 68  iWidth = -iWidth
0b70: 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 46  ;.        c = zF
0b80: 6f 72 6d 61 74 5b 69 5d 3b 0a 20 20 20 20 20 20  ormat[i];.      
0b90: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
0ba0: 64 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  d' ){.        in
0bb0: 74 20 76 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  t v = va_arg(ap,
0bc0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69   int);.        i
0bd0: 66 28 20 76 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( v<0 ){.      
0be0: 20 20 20 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78      lemon_addtex
0bf0: 74 28 73 74 72 2c 20 26 6e 55 73 65 64 2c 20 22  t(str, &nUsed, "
0c00: 2d 22 2c 20 31 2c 20 69 57 69 64 74 68 29 3b 0a  -", 1, iWidth);.
0c10: 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 2d 76            v = -v
0c20: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
0c30: 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20  if( v==0 ){.    
0c40: 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64 64 74        lemon_addt
0c50: 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65 64 2c  ext(str, &nUsed,
0c60: 20 22 30 22 2c 20 31 2c 20 69 57 69 64 74 68 29   "0", 1, iWidth)
0c70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
0c80: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20      k = 0;.     
0c90: 20 20 20 77 68 69 6c 65 28 20 76 3e 30 20 29 7b     while( v>0 ){
0ca0: 0a 20 20 20 20 20 20 20 20 20 20 6b 2b 2b 3b 0a  .          k++;.
0cb0: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b            zTemp[
0cc0: 73 69 7a 65 6f 66 28 7a 54 65 6d 70 29 2d 6b 5d  sizeof(zTemp)-k]
0cd0: 20 3d 20 28 76 25 31 30 29 20 2b 20 27 30 27 3b   = (v%10) + '0';
0ce0: 0a 20 20 20 20 20 20 20 20 20 20 76 20 2f 3d 20  .          v /= 
0cf0: 31 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  10;.        }.  
0d00: 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 61 64 64 74        lemon_addt
0d10: 65 78 74 28 73 74 72 2c 20 26 6e 55 73 65 64 2c  ext(str, &nUsed,
0d20: 20 26 7a 54 65 6d 70 5b 73 69 7a 65 6f 66 28 7a   &zTemp[sizeof(z
0d30: 54 65 6d 70 29 2d 6b 5d 2c 20 6b 2c 20 69 57 69  Temp)-k], k, iWi
0d40: 64 74 68 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dth);.      }els
0d50: 65 20 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a  e if( c=='s' ){.
0d60: 20 20 20 20 20 20 20 20 7a 20 3d 20 76 61 5f 61          z = va_a
0d70: 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61  rg(ap, const cha
0d80: 72 2a 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d  r*);.        lem
0d90: 6f 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20  on_addtext(str, 
0da0: 26 6e 55 73 65 64 2c 20 7a 2c 20 2d 31 2c 20 69  &nUsed, z, -1, i
0db0: 57 69 64 74 68 29 3b 0a 20 20 20 20 20 20 7d 65  Width);.      }e
0dc0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 2e 27 20 26  lse if( c=='.' &
0dd0: 26 20 6d 65 6d 63 6d 70 28 26 7a 46 6f 72 6d 61  & memcmp(&zForma
0de0: 74 5b 69 5d 2c 20 22 2e 2a 73 22 2c 20 33 29 3d  t[i], ".*s", 3)=
0df0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20  =0 ){.        i 
0e00: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 6b 20  += 2;.        k 
0e10: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
0e20: 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 76  );.        z = v
0e30: 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20  a_arg(ap, const 
0e40: 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 20 20  char*);.        
0e50: 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73 74  lemon_addtext(st
0e60: 72 2c 20 26 6e 55 73 65 64 2c 20 7a 2c 20 6b 2c  r, &nUsed, z, k,
0e70: 20 69 57 69 64 74 68 29 3b 0a 20 20 20 20 20 20   iWidth);.      
0e80: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 25 27  }else if( c=='%'
0e90: 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6d 6f   ){.        lemo
0ea0: 6e 5f 61 64 64 74 65 78 74 28 73 74 72 2c 20 26  n_addtext(str, &
0eb0: 6e 55 73 65 64 2c 20 22 25 22 2c 20 31 2c 20 30  nUsed, "%", 1, 0
0ec0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
0ed0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
0ee0: 73 74 64 65 72 72 2c 20 22 69 6c 6c 65 67 61 6c  stderr, "illegal
0ef0: 20 66 6f 72 6d 61 74 5c 6e 22 29 3b 0a 20 20 20   format\n");.   
0f00: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
0f10: 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20      }.      j = 
0f20: 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  i+1;.    }.  }. 
0f30: 20 6c 65 6d 6f 6e 5f 61 64 64 74 65 78 74 28 73   lemon_addtext(s
0f40: 74 72 2c 20 26 6e 55 73 65 64 2c 20 26 7a 46 6f  tr, &nUsed, &zFo
0f50: 72 6d 61 74 5b 6a 5d 2c 20 69 2d 6a 2c 20 30 29  rmat[j], i-j, 0)
0f60: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 55 73 65 64  ;.  return nUsed
0f70: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  ;.}.static int l
0f80: 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 63 68 61  emon_sprintf(cha
0f90: 72 20 2a 73 74 72 2c 20 63 6f 6e 73 74 20 63 68  r *str, const ch
0fa0: 61 72 20 2a 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29  ar *format, ...)
0fb0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
0fc0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73    int rc;.  va_s
0fd0: 74 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29  tart(ap, format)
0fe0: 3b 0a 20 20 72 63 20 3d 20 6c 65 6d 6f 6e 5f 76  ;.  rc = lemon_v
0ff0: 73 70 72 69 6e 74 66 28 73 74 72 2c 20 66 6f 72  sprintf(str, for
1000: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
1010: 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  nd(ap);.  return
1020: 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f   rc;.}.static vo
1030: 69 64 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28  id lemon_strcpy(
1040: 63 68 61 72 20 2a 64 65 73 74 2c 20 63 6f 6e 73  char *dest, cons
1050: 74 20 63 68 61 72 20 2a 73 72 63 29 7b 0a 20 20  t char *src){.  
1060: 77 68 69 6c 65 28 20 28 2a 28 64 65 73 74 2b 2b  while( (*(dest++
1070: 29 20 3d 20 2a 28 73 72 63 2b 2b 29 29 21 3d 30  ) = *(src++))!=0
1080: 20 29 7b 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f   ){}.}.static vo
1090: 69 64 20 6c 65 6d 6f 6e 5f 73 74 72 63 61 74 28  id lemon_strcat(
10a0: 63 68 61 72 20 2a 64 65 73 74 2c 20 63 6f 6e 73  char *dest, cons
10b0: 74 20 63 68 61 72 20 2a 73 72 63 29 7b 0a 20 20  t char *src){.  
10c0: 77 68 69 6c 65 28 20 2a 64 65 73 74 20 29 20 64  while( *dest ) d
10d0: 65 73 74 2b 2b 3b 0a 20 20 6c 65 6d 6f 6e 5f 73  est++;.  lemon_s
10e0: 74 72 63 70 79 28 64 65 73 74 2c 20 73 72 63 29  trcpy(dest, src)
10f0: 3b 0a 7d 0a 0a 0a 2f 2a 20 61 20 66 65 77 20 66  ;.}.../* a few f
1100: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
1110: 6f 6e 73 2e 2e 2e 20 2a 2f 0a 73 74 72 75 63 74  ons... */.struct
1120: 20 72 75 6c 65 3b 0a 73 74 72 75 63 74 20 6c 65   rule;.struct le
1130: 6d 6f 6e 3b 0a 73 74 72 75 63 74 20 61 63 74 69  mon;.struct acti
1140: 6f 6e 3b 0a 0a 73 74 61 74 69 63 20 73 74 72 75  on;..static stru
1150: 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f  ct action *Actio
1160: 6e 5f 6e 65 77 28 76 6f 69 64 29 3b 0a 73 74 61  n_new(void);.sta
1170: 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f  tic struct actio
1180: 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73  n *Action_sort(s
1190: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b  truct action *);
11a0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
11b0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 62 75 69  om the file "bui
11c0: 6c 64 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ld.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 2f 0a 76 6f 69 64  **********/.void
11f0: 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65   FindRulePrecede
1200: 6e 63 65 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e  nces();.void Fin
1210: 64 46 69 72 73 74 53 65 74 73 28 29 3b 0a 76 6f  dFirstSets();.vo
1220: 69 64 20 46 69 6e 64 53 74 61 74 65 73 28 29 3b  id FindStates();
1230: 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28  .void FindLinks(
1240: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c  );.void FindFoll
1250: 6f 77 53 65 74 73 28 29 3b 0a 76 6f 69 64 20 46  owSets();.void F
1260: 69 6e 64 41 63 74 69 6f 6e 73 28 29 3b 0a 0a 2f  indActions();../
1270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
1280: 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c  he file "configl
1290: 69 73 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ist.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 2f 0a 76 6f 69 64 20 43  ********/.void C
12c0: 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 76  onfiglist_init(v
12d0: 6f 69 64 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e  oid);.struct con
12e0: 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f  fig *Configlist_
12f0: 61 64 64 28 73 74 72 75 63 74 20 72 75 6c 65 20  add(struct rule 
1300: 2a 2c 20 69 6e 74 29 3b 0a 73 74 72 75 63 74 20  *, int);.struct 
1310: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
1320: 73 74 5f 61 64 64 62 61 73 69 73 28 73 74 72 75  st_addbasis(stru
1330: 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74 29 3b  ct rule *, int);
1340: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
1350: 5f 63 6c 6f 73 75 72 65 28 73 74 72 75 63 74 20  _closure(struct 
1360: 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 43  lemon *);.void C
1370: 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 76  onfiglist_sort(v
1380: 6f 69 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  oid);.void Confi
1390: 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28  glist_sortbasis(
13a0: 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20 63 6f  void);.struct co
13b0: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
13c0: 5f 72 65 74 75 72 6e 28 76 6f 69 64 29 3b 0a 73  _return(void);.s
13d0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
13e0: 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 76  nfiglist_basis(v
13f0: 6f 69 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  oid);.void Confi
1400: 67 6c 69 73 74 5f 65 61 74 28 73 74 72 75 63 74  glist_eat(struct
1410: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64   config *);.void
1420: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65   Configlist_rese
1430: 74 28 76 6f 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  t(void);../*****
1440: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
1450: 6c 65 20 22 65 72 72 6f 72 2e 68 22 20 2a 2a 2a  le "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 2f 0a 76 6f 69 64 20 45 72 72 6f 72  ****/.void Error
1490: 4d 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Msg(const char *
14a0: 2c 20 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  , int,const char
14b0: 20 2a 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a   *, ...);../****
14c0: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
14d0: 20 22 6f 70 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a   "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 2f 0a 65 6e 75 6d 20 6f 70 74  ******/.enum opt
1510: 69 6f 6e 5f 74 79 70 65 20 7b 20 4f 50 54 5f 46  ion_type { OPT_F
1520: 4c 41 47 3d 31 2c 20 20 4f 50 54 5f 49 4e 54 2c  LAG=1,  OPT_INT,
1530: 20 20 4f 50 54 5f 44 42 4c 2c 20 20 4f 50 54 5f    OPT_DBL,  OPT_
1540: 53 54 52 2c 0a 20 20 20 20 20 20 20 20 20 4f 50  STR,.         OP
1550: 54 5f 46 46 4c 41 47 2c 20 4f 50 54 5f 46 49 4e  T_FFLAG, OPT_FIN
1560: 54 2c 20 4f 50 54 5f 46 44 42 4c 2c 20 4f 50 54  T, OPT_FDBL, OPT
1570: 5f 46 53 54 52 7d 3b 0a 73 74 72 75 63 74 20 73  _FSTR};.struct s
1580: 5f 6f 70 74 69 6f 6e 73 20 7b 0a 20 20 65 6e 75  _options {.  enu
1590: 6d 20 6f 70 74 69 6f 6e 5f 74 79 70 65 20 74 79  m option_type ty
15a0: 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pe;.  const char
15b0: 20 2a 6c 61 62 65 6c 3b 0a 20 20 63 68 61 72 20   *label;.  char 
15c0: 2a 61 72 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68  *arg;.  const ch
15d0: 61 72 20 2a 6d 65 73 73 61 67 65 3b 0a 7d 3b 0a  ar *message;.};.
15e0: 69 6e 74 20 20 20 20 4f 70 74 49 6e 69 74 28 63  int    OptInit(c
15f0: 68 61 72 2a 2a 2c 73 74 72 75 63 74 20 73 5f 6f  har**,struct s_o
1600: 70 74 69 6f 6e 73 2a 2c 46 49 4c 45 2a 29 3b 0a  ptions*,FILE*);.
1610: 69 6e 74 20 20 20 20 4f 70 74 4e 41 72 67 73 28  int    OptNArgs(
1620: 76 6f 69 64 29 3b 0a 63 68 61 72 20 20 2a 4f 70  void);.char  *Op
1630: 74 41 72 67 28 69 6e 74 29 3b 0a 76 6f 69 64 20  tArg(int);.void 
1640: 20 20 4f 70 74 45 72 72 28 69 6e 74 29 3b 0a 76    OptErr(int);.v
1650: 6f 69 64 20 20 20 4f 70 74 50 72 69 6e 74 28 76  oid   OptPrint(v
1660: 6f 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  oid);../********
1670: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
1680: 70 61 72 73 65 2e 68 22 20 2a 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 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 73  **/.void Parse(s
16c0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
16d0: 70 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  p);../********* 
16e0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70  From the file "p
16f0: 6c 69 6e 6b 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  link.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 2f  ***************/
1720: 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 50  .struct plink *P
1730: 6c 69 6e 6b 5f 6e 65 77 28 76 6f 69 64 29 3b 0a  link_new(void);.
1740: 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 73  void Plink_add(s
1750: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20  truct plink **, 
1760: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
1770: 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70  ;.void Plink_cop
1780: 79 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  y(struct plink *
1790: 2a 2c 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  *, struct plink 
17a0: 2a 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64  *);.void Plink_d
17b0: 65 6c 65 74 65 28 73 74 72 75 63 74 20 70 6c 69  elete(struct pli
17c0: 6e 6b 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  nk *);../*******
17d0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
17e0: 65 20 22 72 65 70 6f 72 74 2e 68 22 20 2a 2a 2a  e "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 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74  **/.void Reprint
1820: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29  (struct lemon *)
1830: 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74  ;.void ReportOut
1840: 70 75 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  put(struct lemon
1850: 20 2a 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74   *);.void Report
1860: 54 61 62 6c 65 28 73 74 72 75 63 74 20 6c 65 6d  Table(struct lem
1870: 6f 6e 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64  on *, int);.void
1880: 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 73 74   ReportHeader(st
1890: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76  ruct lemon *);.v
18a0: 6f 69 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c  oid CompressTabl
18b0: 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  es(struct lemon 
18c0: 2a 29 3b 0a 76 6f 69 64 20 52 65 73 6f 72 74 53  *);.void ResortS
18d0: 74 61 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d  tates(struct lem
18e0: 6f 6e 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  on *);../*******
18f0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1900: 65 20 22 73 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a  e "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 2f 0a 76 6f 69 64 20 20 53 65 74 53 69 7a  **/.void  SetSiz
1940: 65 28 69 6e 74 29 3b 20 20 20 20 20 20 20 20 20  e(int);         
1950: 20 20 20 20 2f 2a 20 41 6c 6c 20 73 65 74 73 20      /* All sets 
1960: 77 69 6c 6c 20 62 65 20 6f 66 20 73 69 7a 65 20  will be of size 
1970: 4e 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65  N */.char *SetNe
1980: 77 28 76 6f 69 64 29 3b 20 20 20 20 20 20 20 20  w(void);        
1990: 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20         /* A new 
19a0: 73 65 74 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20  set for element 
19b0: 30 2e 2e 4e 20 2a 2f 0a 76 6f 69 64 20 20 53 65  0..N */.void  Se
19c0: 74 46 72 65 65 28 63 68 61 72 2a 29 3b 20 20 20  tFree(char*);   
19d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 61            /* Dea
19e0: 6c 6c 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f  llocate a set */
19f0: 0a 69 6e 74 20 53 65 74 41 64 64 28 63 68 61 72  .int SetAdd(char
1a00: 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20 20 20  *,int);         
1a10: 20 20 20 2f 2a 20 41 64 64 20 65 6c 65 6d 65 6e     /* Add elemen
1a20: 74 20 74 6f 20 61 20 73 65 74 20 2a 2f 0a 69 6e  t to a set */.in
1a30: 74 20 53 65 74 55 6e 69 6f 6e 28 63 68 61 72 20  t SetUnion(char 
1a40: 2a 2c 63 68 61 72 20 2a 29 3b 20 20 20 20 2f 2a  *,char *);    /*
1a50: 20 41 20 3c 2d 20 41 20 55 20 42 2c 20 74 68 72   A <- A U B, thr
1a60: 75 20 65 6c 65 6d 65 6e 74 20 4e 20 2a 2f 0a 23  u element N */.#
1a70: 64 65 66 69 6e 65 20 53 65 74 46 69 6e 64 28 58  define SetFind(X
1a80: 2c 59 29 20 28 58 5b 59 5d 29 20 20 20 20 20 20  ,Y) (X[Y])      
1a90: 20 2f 2a 20 54 72 75 65 20 69 66 20 59 20 69 73   /* True if Y is
1aa0: 20 69 6e 20 73 65 74 20 58 20 2a 2f 0a 0a 2f 2a   in set X */../*
1ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
1ac0: 68 65 20 66 69 6c 65 20 22 73 74 72 75 63 74 2e  he file "struct.
1ad0: 68 22 20 2a 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 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
1b00: 50 72 69 6e 63 69 70 61 6c 20 64 61 74 61 20 73  Principal data s
1b10: 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68  tructures for th
1b20: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
1b30: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 74 79  enerator..*/..ty
1b40: 70 65 64 65 66 20 65 6e 75 6d 20 7b 4c 45 4d 4f  pedef enum {LEMO
1b50: 4e 5f 46 41 4c 53 45 3d 30 2c 20 4c 45 4d 4f 4e  N_FALSE=0, LEMON
1b60: 5f 54 52 55 45 7d 20 42 6f 6f 6c 65 61 6e 3b 0a  _TRUE} Boolean;.
1b70: 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20 28 74 65 72  ./* Symbols (ter
1b80: 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65  minals and nonte
1b90: 72 6d 69 6e 61 6c 73 29 20 6f 66 20 74 68 65 20  rminals) of the 
1ba0: 67 72 61 6d 6d 61 72 20 61 72 65 20 73 74 6f 72  grammar are stor
1bb0: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c  ed.** in the fol
1bc0: 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 65 6e 75 6d 20  lowing: */.enum 
1bd0: 73 79 6d 62 6f 6c 5f 74 79 70 65 20 7b 0a 20 20  symbol_type {.  
1be0: 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 4e 4f 4e 54  TERMINAL,.  NONT
1bf0: 45 52 4d 49 4e 41 4c 2c 0a 20 20 4d 55 4c 54 49  ERMINAL,.  MULTI
1c00: 54 45 52 4d 49 4e 41 4c 0a 7d 3b 0a 65 6e 75 6d  TERMINAL.};.enum
1c10: 20 65 5f 61 73 73 6f 63 20 7b 0a 20 20 20 20 4c   e_assoc {.    L
1c20: 45 46 54 2c 0a 20 20 20 20 52 49 47 48 54 2c 0a  EFT,.    RIGHT,.
1c30: 20 20 20 20 4e 4f 4e 45 2c 0a 20 20 20 20 55 4e      NONE,.    UN
1c40: 4b 0a 7d 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  K.};.struct symb
1c50: 6f 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ol {.  const cha
1c60: 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  r *name;        
1c70: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
1c80: 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  ymbol */.  int i
1c90: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
1ca0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
1cb0: 62 65 72 20 66 6f 72 20 74 68 69 73 20 73 79 6d  ber for this sym
1cc0: 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 73 79  bol */.  enum sy
1cd0: 6d 62 6f 6c 5f 74 79 70 65 20 74 79 70 65 3b 20  mbol_type type; 
1ce0: 20 20 2f 2a 20 53 79 6d 62 6f 6c 73 20 61 72 65    /* Symbols are
1cf0: 20 61 6c 6c 20 65 69 74 68 65 72 20 54 45 52 4d   all either TERM
1d00: 49 4e 41 4c 53 20 6f 72 20 4e 54 73 20 2a 2f 0a  INALS or NTs */.
1d10: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
1d20: 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  ule;       /* Li
1d30: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 72 75 6c  nked list of rul
1d40: 65 73 20 6f 66 20 74 68 69 73 20 28 69 66 20 61  es of this (if a
1d50: 6e 20 4e 54 29 20 2a 2f 0a 20 20 73 74 72 75 63  n NT) */.  struc
1d60: 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61  t symbol *fallba
1d70: 63 6b 3b 20 2f 2a 20 66 61 6c 6c 62 61 63 6b 20  ck; /* fallback 
1d80: 74 6f 6b 65 6e 20 69 6e 20 63 61 73 65 20 74 68  token in case th
1d90: 69 73 20 74 6f 6b 65 6e 20 64 6f 65 73 6e 27 74  is token doesn't
1da0: 20 70 61 72 73 65 20 2a 2f 0a 20 20 69 6e 74 20   parse */.  int 
1db0: 70 72 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  prec;           
1dc0: 20 20 20 20 20 2f 2a 20 50 72 65 63 65 64 65 6e       /* Preceden
1dd0: 63 65 20 69 66 20 64 65 66 69 6e 65 64 20 28 2d  ce if defined (-
1de0: 31 20 6f 74 68 65 72 77 69 73 65 29 20 2a 2f 0a  1 otherwise) */.
1df0: 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 61    enum e_assoc a
1e00: 73 73 6f 63 3b 20 20 20 20 20 20 2f 2a 20 41 73  ssoc;      /* As
1e10: 73 6f 63 69 61 74 69 76 69 74 79 20 69 66 20 70  sociativity if p
1e20: 72 65 63 65 64 65 6e 63 65 20 69 73 20 64 65 66  recedence is def
1e30: 69 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ined */.  char *
1e40: 66 69 72 73 74 73 65 74 3b 20 20 20 20 20 20 20  firstset;       
1e50: 20 20 20 2f 2a 20 46 69 72 73 74 2d 73 65 74 20     /* First-set 
1e60: 66 6f 72 20 61 6c 6c 20 72 75 6c 65 73 20 6f 66  for all rules of
1e70: 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a   this symbol */.
1e80: 20 20 42 6f 6f 6c 65 61 6e 20 6c 61 6d 62 64 61    Boolean lambda
1e90: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
1ea0: 75 65 20 69 66 20 4e 54 20 61 6e 64 20 63 61 6e  ue if NT and can
1eb0: 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 6d 70   generate an emp
1ec0: 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69  ty string */.  i
1ed0: 6e 74 20 75 73 65 43 6e 74 3b 20 20 20 20 20 20  nt useCnt;      
1ee0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ef0: 72 20 6f 66 20 74 69 6d 65 73 20 75 73 65 64 20  r of times used 
1f00: 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 73 74 72  */.  char *destr
1f10: 75 63 74 6f 72 3b 20 20 20 20 20 20 20 20 2f 2a  uctor;        /*
1f20: 20 43 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   Code which exec
1f30: 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74 68  utes whenever th
1f40: 69 73 20 73 79 6d 62 6f 6c 20 69 73 0a 20 20 20  is 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 2a 2a 20 70 6f 70 70 65          ** poppe
1f70: 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  d from the stack
1f80: 20 64 75 72 69 6e 67 20 65 72 72 6f 72 20 70 72   during error pr
1f90: 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e  ocessing */.  in
1fa0: 74 20 64 65 73 74 4c 69 6e 65 6e 6f 3b 20 20 20  t destLineno;   
1fb0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
1fc0: 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72 74 20  umber for start 
1fd0: 6f 66 20 64 65 73 74 72 75 63 74 6f 72 20 2a 2f  of destructor */
1fe0: 0a 20 20 63 68 61 72 20 2a 64 61 74 61 74 79 70  .  char *datatyp
1ff0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
2000: 68 65 20 64 61 74 61 20 74 79 70 65 20 6f 66 20  he data type of 
2010: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c 64  information held
2020: 20 62 79 20 74 68 69 73 0a 20 20 20 20 20 20 20   by this.       
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f      ** object. O
2050: 6e 6c 79 20 75 73 65 64 20 69 66 20 74 79 70 65  nly used if type
2060: 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f  ==NONTERMINAL */
2070: 0a 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20 20  .  int dtnum;   
2080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2090: 68 65 20 64 61 74 61 20 74 79 70 65 20 6e 75 6d  he data type num
20a0: 62 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61 72  ber.  In the par
20b0: 73 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a 20  ser, 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 2a 2a 20 73 74 61            ** sta
20e0: 63 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20 20  ck is a union.  
20f0: 54 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65 6e  The .yy%d elemen
2100: 74 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20 20  t 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 2a 2a 20 75 6e 69 6f 6e 20 69 73       ** union is
2130: 20 74 68 65 20 63 6f 72 72 65 63 74 20 64 61 74   the correct dat
2140: 61 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20  a type for this 
2150: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a 20 54  object */.  /* T
2160: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
2170: 6c 64 73 20 61 72 65 20 75 73 65 64 20 62 79 20  lds are used by 
2180: 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73 20 6f  MULTITERMINALs o
2190: 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 75  nly */.  int nsu
21a0: 62 73 79 6d 3b 20 20 20 20 20 20 20 20 20 20 20  bsym;           
21b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
21c0: 6f 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62 6f  onstituent symbo
21d0: 6c 73 20 69 6e 20 74 68 65 20 4d 55 4c 54 49 20  ls in the MULTI 
21e0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
21f0: 6f 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20 2f 2a  ol **subsym;  /*
2200: 20 41 72 72 61 79 20 6f 66 20 63 6f 6e 73 74 69   Array of consti
2210: 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 2a 2f  tuent symbols */
2220: 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70 72 6f  .};../* Each pro
2230: 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 69 6e 20  duction rule in 
2240: 74 68 65 20 67 72 61 6d 6d 61 72 20 69 73 20 73  the grammar is s
2250: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 66 6f 6c  tored in the fol
2260: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
2270: 75 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63 74 20  ure.  */.struct 
2280: 72 75 6c 65 20 7b 0a 20 20 73 74 72 75 63 74 20  rule {.  struct 
2290: 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20  symbol *lhs;    
22a0: 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73    /* Left-hand s
22b0: 69 64 65 20 6f 66 20 74 68 65 20 72 75 6c 65 20  ide of the rule 
22c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
22d0: 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 2f 2a  *lhsalias;    /*
22e0: 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c   Alias for the L
22f0: 48 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65  HS (NULL if none
2300: 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73 53 74  ) */.  int lhsSt
2310: 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  art;            
2320: 2f 2a 20 54 72 75 65 20 69 66 20 6c 65 66 74 2d  /* True if left-
2330: 68 61 6e 64 20 73 69 64 65 20 69 73 20 74 68 65  hand side is the
2340: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f   start symbol */
2350: 0a 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b  .  int ruleline;
2360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2370: 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ine number for t
2380: 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74  he rule */.  int
2390: 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20   nrhs;          
23a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23b0: 6f 66 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  of RHS symbols *
23c0: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
23d0: 6c 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20  l **rhs;     /* 
23e0: 54 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 73 20  The RHS symbols 
23f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2400: 2a 2a 72 68 73 61 6c 69 61 73 3b 20 20 20 2f 2a  **rhsalias;   /*
2410: 20 41 6e 20 61 6c 69 61 73 20 66 6f 72 20 65 61   An alias for ea
2420: 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e  ch RHS symbol (N
2430: 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a  ULL if none) */.
2440: 20 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20    int line;     
2450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2460: 6e 65 20 6e 75 6d 62 65 72 20 61 74 20 77 68 69  ne number at whi
2470: 63 68 20 63 6f 64 65 20 62 65 67 69 6e 73 20 2a  ch code begins *
2480: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2490: 63 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  code;        /* 
24a0: 54 68 65 20 63 6f 64 65 20 65 78 65 63 75 74 65  The code execute
24b0: 64 20 77 68 65 6e 20 74 68 69 73 20 72 75 6c 65  d when this rule
24c0: 20 69 73 20 72 65 64 75 63 65 64 20 2a 2f 0a 20   is reduced */. 
24d0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
24e0: 70 72 65 63 73 79 6d 3b 20 20 2f 2a 20 50 72 65  precsym;  /* Pre
24f0: 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 66  cedence symbol f
2500: 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a  or this rule */.
2510: 20 20 69 6e 74 20 69 6e 64 65 78 3b 20 20 20 20    int index;    
2520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
2530: 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f   index number fo
2540: 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20  r this rule */. 
2550: 20 42 6f 6f 6c 65 61 6e 20 63 61 6e 52 65 64 75   Boolean canRedu
2560: 63 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ce;       /* Tru
2570: 65 20 69 66 20 74 68 69 73 20 72 75 6c 65 20 69  e if this rule i
2580: 73 20 65 76 65 72 20 72 65 64 75 63 65 64 20 2a  s ever reduced *
2590: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
25a0: 2a 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20  *nextlhs;    /* 
25b0: 4e 65 78 74 20 72 75 6c 65 20 77 69 74 68 20 74  Next rule with t
25c0: 68 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20  he same LHS */. 
25d0: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65   struct rule *ne
25e0: 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  xt;       /* Nex
25f0: 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 6c  t rule in the gl
2600: 6f 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a  obal list */.};.
2610: 0a 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72 61 74  ./* A configurat
2620: 69 6f 6e 20 69 73 20 61 20 70 72 6f 64 75 63 74  ion is a product
2630: 69 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68 65 20  ion rule of the 
2640: 67 72 61 6d 6d 61 72 20 74 6f 67 65 74 68 65 72  grammar together
2650: 20 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20   with.** a mark 
2660: 28 64 6f 74 29 20 73 68 6f 77 69 6e 67 20 68 6f  (dot) showing ho
2670: 77 20 6d 75 63 68 20 6f 66 20 74 68 61 74 20 72  w much of that r
2680: 75 6c 65 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ule has been pro
2690: 63 65 73 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a  cessed so far..*
26a0: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  * Configurations
26b0: 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20   also contain a 
26c0: 66 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63 68  follow-set which
26d0: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 65   is a list of te
26e0: 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c  rminal.** symbol
26f0: 73 20 77 68 69 63 68 20 61 72 65 20 61 6c 6c 6f  s which are allo
2700: 77 65 64 20 74 6f 20 69 6d 6d 65 64 69 61 74 65  wed to immediate
2710: 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e  ly follow the en
2720: 64 20 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a  d of the rule..*
2730: 2a 20 45 76 65 72 79 20 63 6f 6e 66 69 67 75 72  * Every configur
2740: 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65  ation is recorde
2750: 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  d as an instance
2760: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2770: 67 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67 73 74  g: */.enum cfgst
2780: 61 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c 45 54  atus {.  COMPLET
2790: 45 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54 45 0a  E,.  INCOMPLETE.
27a0: 7d 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  };.struct config
27b0: 20 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65   {.  struct rule
27c0: 20 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a   *rp;         /*
27d0: 20 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77   The rule upon w
27e0: 68 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75  hich the configu
27f0: 72 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20  ration is based 
2800: 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20  */.  int dot;   
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2820: 20 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74   The parse point
2830: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b   */.  char *fws;
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2850: 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72  * Follow-set for
2860: 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74   this configurat
2870: 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ion only */.  st
2880: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70  ruct plink *fplp
2890: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ;      /* Follow
28a0: 2d 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f  -set forward pro
28b0: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a  pagation links *
28c0: 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  /.  struct plink
28d0: 20 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20   *bplp;      /* 
28e0: 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77  Follow-set backw
28f0: 61 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e  ards propagation
2900: 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75   links */.  stru
2910: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
2920: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2930: 74 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63  to state which c
2940: 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a  ontains this */.
2950: 20 20 65 6e 75 6d 20 63 66 67 73 74 61 74 75 73    enum cfgstatus
2960: 20 73 74 61 74 75 73 3b 20 20 20 2f 2a 20 75 73   status;   /* us
2970: 65 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f 77  ed during follow
2980: 73 65 74 20 61 6e 64 20 73 68 69 66 74 20 63 6f  set and shift co
2990: 6d 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  mputations */.  
29a0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
29b0: 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74  ext;     /* Next
29c0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69   configuration i
29d0: 6e 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a 20  n the state */. 
29e0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
29f0: 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  bp;       /* The
2a00: 20 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e 66   next basis conf
2a10: 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a  iguration */.};.
2a20: 0a 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 7b  .enum e_action {
2a30: 0a 20 20 53 48 49 46 54 2c 0a 20 20 41 43 43 45  .  SHIFT,.  ACCE
2a40: 50 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a 20 20  PT,.  REDUCE,.  
2a50: 45 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e 46 4c  ERROR,.  SSCONFL
2a60: 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  ICT,            
2a70: 20 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68 69    /* A shift/shi
2a80: 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ft conflict */. 
2a90: 20 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20   SRCONFLICT,    
2aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73            /* Was
2ab0: 20 61 20 72 65 64 75 63 65 2c 20 62 75 74 20 70   a reduce, but p
2ac0: 61 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63  art of a conflic
2ad0: 74 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c 49 43  t */.  RRCONFLIC
2ae0: 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
2af0: 2f 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c  /* Was a reduce,
2b00: 20 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63   but part of a c
2b10: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 48 5f  onflict */.  SH_
2b20: 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20  RESOLVED,       
2b30: 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 73        /* Was a s
2b40: 68 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e 63  hift.  Precedenc
2b50: 65 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c  e resolved confl
2b60: 69 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45 53 4f  ict */.  RD_RESO
2b70: 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20 20 20  LVED,           
2b80: 20 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65 2e    /* Was reduce.
2b90: 20 20 50 72 65 63 65 64 65 6e 63 65 20 72 65 73    Precedence res
2ba0: 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a  olved conflict *
2bb0: 2f 0a 20 20 4e 4f 54 5f 55 53 45 44 20 20 20 20  /.  NOT_USED    
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bd0: 44 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70 72  Deleted by compr
2be0: 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ession */.};../*
2bf0: 20 45 76 65 72 79 20 73 68 69 66 74 20 6f 72 20   Every shift or 
2c00: 72 65 64 75 63 65 20 6f 70 65 72 61 74 69 6f 6e  reduce operation
2c10: 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 6f 6e   is stored as on
2c20: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2c30: 6e 67 20 2a 2f 0a 73 74 72 75 63 74 20 61 63 74  ng */.struct act
2c40: 69 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ion {.  struct s
2c50: 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 20 20 20  ymbol *sp;      
2c60: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 2d 61 68 65   /* The look-ahe
2c70: 61 64 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 65  ad symbol */.  e
2c80: 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79 70  num e_action typ
2c90: 65 3b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  e;.  union {.   
2ca0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
2cb0: 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  tp;     /* The n
2cc0: 65 77 20 73 74 61 74 65 2c 20 69 66 20 61 20 73  ew state, if a s
2cd0: 68 69 66 74 20 2a 2f 0a 20 20 20 20 73 74 72 75  hift */.    stru
2ce0: 63 74 20 72 75 6c 65 20 2a 72 70 3b 20 20 20 20  ct rule *rp;    
2cf0: 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 2c 20     /* The rule, 
2d00: 69 66 20 61 20 72 65 64 75 63 65 20 2a 2f 0a 20  if a reduce */. 
2d10: 20 7d 20 78 3b 0a 20 20 73 74 72 75 63 74 20 61   } x;.  struct a
2d20: 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20 20 20  ction *next;    
2d30: 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20   /* Next action 
2d40: 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20 2a  for this state *
2d50: 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  /.  struct actio
2d60: 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f 2a 20  n *collide;  /* 
2d70: 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69 74 68  Next action with
2d80: 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
2d90: 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 73 74  /.};../* Each st
2da0: 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ate of the gener
2db0: 61 74 65 64 20 70 61 72 73 65 72 27 73 20 66 69  ated parser's fi
2dc0: 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69  nite state machi
2dd0: 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64 65 64  ne.** is encoded
2de0: 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   as an instance 
2df0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2e00: 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 73   structure. */.s
2e10: 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a 20 20  truct state {.  
2e20: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
2e30: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
2e40: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
2e50: 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74  ions for this st
2e60: 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
2e70: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 20 20  config *cfp;    
2e80: 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69 67 75    /* All configu
2e90: 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69 73 20  rations in this 
2ea0: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73 74 61  set */.  int sta
2eb0: 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  tenum;          
2ec0: 20 20 2f 2a 20 53 65 71 75 65 6e 74 69 61 6c 20    /* Sequential 
2ed0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
2ee0: 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  state */.  struc
2ef0: 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20 20 20  t action *ap;   
2f00: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2f10: 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73  actions for this
2f20: 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20   state */.  int 
2f30: 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63 74 3b  nTknAct, nNtAct;
2f40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2f50: 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74 65 72  f actions on ter
2f60: 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65  minals and nonte
2f70: 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e 74  rminals */.  int
2f80: 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74 4f 66   iTknOfst, iNtOf
2f90: 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63 74 69  st;   /* yy_acti
2fa0: 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f 72 20  on[] offset for 
2fb0: 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f  terminals and no
2fc0: 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  nterms */.  int 
2fd0: 69 44 66 6c 74 3b 20 20 20 20 20 20 20 20 20 20  iDflt;          
2fe0: 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20       /* Default 
2ff0: 61 63 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 64 65  action */.};.#de
3000: 66 69 6e 65 20 4e 4f 5f 4f 46 46 53 45 54 20 28  fine NO_OFFSET (
3010: 2d 32 31 34 37 34 38 33 36 34 37 29 0a 0a 2f 2a  -2147483647)../*
3020: 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 70 72 6f   A followset pro
3030: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 20 69 6e  pagation link in
3040: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
3050: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6f 6e 65   contents of one
3060: 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  .** configuratio
3070: 6e 20 66 6f 6c 6c 6f 77 73 65 74 20 73 68 6f 75  n followset shou
3080: 6c 64 20 62 65 20 70 72 6f 70 61 67 61 74 65 64  ld be propagated
3090: 20 74 6f 20 61 6e 6f 74 68 65 72 20 77 68 65 6e   to another when
30a0: 65 76 65 72 0a 2a 2a 20 74 68 65 20 66 69 72 73  ever.** the firs
30b0: 74 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 73 74  t changes. */.st
30c0: 72 75 63 74 20 70 6c 69 6e 6b 20 7b 0a 20 20 73  ruct plink {.  s
30d0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
30e0: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  p;      /* The c
30f0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20  onfiguration to 
3100: 77 68 69 63 68 20 6c 69 6e 6b 65 64 20 2a 2f 0a  which linked */.
3110: 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
3120: 6e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 54 68  next;      /* Th
3130: 65 20 6e 65 78 74 20 70 72 6f 70 61 67 61 74 65  e next propagate
3140: 20 6c 69 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20   link */.};../* 
3150: 54 68 65 20 73 74 61 74 65 20 76 65 63 74 6f 72  The state vector
3160: 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
3170: 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
3180: 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 73 0a   is recorded as.
3190: 2a 2a 20 66 6f 6c 6c 6f 77 73 2e 20 20 28 4c 45  ** follows.  (LE
31a0: 4d 4f 4e 20 75 73 65 73 20 6e 6f 20 67 6c 6f 62  MON uses no glob
31b0: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64  al variables and
31c0: 20 6d 61 6b 65 73 20 6c 69 74 74 6c 65 20 75 73   makes little us
31d0: 65 20 6f 66 0a 2a 2a 20 73 74 61 74 69 63 20 76  e of.** static v
31e0: 61 72 69 61 62 6c 65 73 2e 20 20 46 69 65 6c 64  ariables.  Field
31f0: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
3200: 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  ng structure can
3210: 20 62 65 20 74 68 6f 75 67 68 74 0a 2a 2a 20 6f   be thought.** o
3220: 66 20 61 73 20 62 65 67 69 6e 20 67 6c 6f 62 61  f as begin globa
3230: 6c 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74  l variables in t
3240: 68 65 20 70 72 6f 67 72 61 6d 2e 29 20 2a 2f 0a  he program.) */.
3250: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 7b 0a 20  struct lemon {. 
3260: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a   struct state **
3270: 73 6f 72 74 65 64 3b 20 20 20 2f 2a 20 54 61 62  sorted;   /* Tab
3280: 6c 65 20 6f 66 20 73 74 61 74 65 73 20 73 6f 72  le of states sor
3290: 74 65 64 20 62 79 20 73 74 61 74 65 20 6e 75 6d  ted by state num
32a0: 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ber */.  struct 
32b0: 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20 20 20 20  rule *rule;     
32c0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
32d0: 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20   rules */.  int 
32e0: 6e 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  nstate;         
32f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3300: 66 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 69 6e  f states */.  in
3310: 74 20 6e 72 75 6c 65 3b 20 20 20 20 20 20 20 20  t nrule;        
3320: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3330: 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69   of rules */.  i
3340: 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20 20 20 20  nt nsymbol;     
3350: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3360: 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 61 6e  r of terminal an
3370: 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 73 79  d nonterminal sy
3380: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  mbols */.  int n
3390: 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20 20  terminal;       
33a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
33b0: 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c   terminal symbol
33c0: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  s */.  struct sy
33d0: 6d 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20  mbol **symbols; 
33e0: 2f 2a 20 53 6f 72 74 65 64 20 61 72 72 61 79 20  /* Sorted array 
33f0: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  of pointers to s
3400: 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  ymbols */.  int 
3410: 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20  errorcnt;       
3420: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3430: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 74  f errors */.  st
3440: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72 72  ruct symbol *err
3450: 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20 65 72  sym;   /* The er
3460: 72 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  ror symbol */.  
3470: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 77  struct symbol *w
3480: 69 6c 64 63 61 72 64 3b 20 2f 2a 20 54 6f 6b 65  ildcard; /* Toke
3490: 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61  n that matches a
34a0: 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 63 68 61  nything */.  cha
34b0: 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  r *name;        
34c0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
34d0: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70   the generated p
34e0: 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  arser */.  char 
34f0: 2a 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  *arg;           
3500: 20 20 20 20 2f 2a 20 44 65 63 6c 61 72 61 74 69      /* Declarati
3510: 6f 6e 20 6f 66 20 74 68 65 20 33 74 68 20 61 72  on of the 3th ar
3520: 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73 65 72  gument to parser
3530: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65   */.  char *toke
3540: 6e 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 2f  ntype;         /
3550: 2a 20 54 79 70 65 20 6f 66 20 74 65 72 6d 69 6e  * Type of termin
3560: 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68  al symbols in th
3570: 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a  e parser stack *
3580: 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 74 79 70  /.  char *vartyp
3590: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
35a0: 54 68 65 20 64 65 66 61 75 6c 74 20 74 79 70 65  The default type
35b0: 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c   of non-terminal
35c0: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68   symbols */.  ch
35d0: 61 72 20 2a 73 74 61 72 74 3b 20 20 20 20 20 20  ar *start;      
35e0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
35f0: 66 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62  f the start symb
3600: 6f 6c 20 66 6f 72 20 74 68 65 20 67 72 61 6d 6d  ol for the gramm
3610: 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74  ar */.  char *st
3620: 61 63 6b 73 69 7a 65 3b 20 20 20 20 20 20 20 20  acksize;        
3630: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
3640: 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a  parser stack */.
3650: 20 20 63 68 61 72 20 2a 69 6e 63 6c 75 64 65 3b    char *include;
3660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3670: 64 65 20 74 6f 20 70 75 74 20 61 74 20 74 68 65  de to put at the
3680: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 43 20   start of the C 
3690: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
36a0: 65 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20  error;          
36b0: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
36c0: 65 63 75 74 65 20 77 68 65 6e 20 61 6e 20 65 72  ecute when an er
36d0: 72 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  ror is seen */. 
36e0: 20 63 68 61 72 20 2a 6f 76 65 72 66 6c 6f 77 3b   char *overflow;
36f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64            /* Cod
3700: 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e 20  e to execute on 
3710: 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77  a stack overflow
3720: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 61 69 6c   */.  char *fail
3730: 75 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ure;           /
3740: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
3750: 65 20 6f 6e 20 70 61 72 73 65 72 20 66 61 69 6c  e on parser fail
3760: 75 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ure */.  char *a
3770: 63 63 65 70 74 3b 20 20 20 20 20 20 20 20 20 20  ccept;          
3780: 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65    /* Code to exe
3790: 63 75 74 65 20 77 68 65 6e 20 74 68 65 20 70 61  cute when the pa
37a0: 72 73 65 72 20 65 78 63 65 70 74 73 20 2a 2f 0a  rser excepts */.
37b0: 20 20 63 68 61 72 20 2a 65 78 74 72 61 63 6f 64    char *extracod
37c0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  e;         /* Co
37d0: 64 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  de appended to t
37e0: 68 65 20 67 65 6e 65 72 61 74 65 64 20 66 69 6c  he generated fil
37f0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  e */.  char *tok
3800: 65 6e 64 65 73 74 3b 20 20 20 20 20 20 20 20 20  endest;         
3810: 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75  /* Code to execu
3820: 74 65 20 74 6f 20 64 65 73 74 72 6f 79 20 74 6f  te to destroy to
3830: 6b 65 6e 20 64 61 74 61 20 2a 2f 0a 20 20 63 68  ken data */.  ch
3840: 61 72 20 2a 76 61 72 64 65 73 74 3b 20 20 20 20  ar *vardest;    
3850: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 66         /* Code f
3860: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 6e  or the default n
3870: 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64 65 73 74  on-terminal dest
3880: 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72  ructor */.  char
3890: 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20   *filename;     
38a0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
38b0: 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  the input file *
38c0: 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e 61 6d  /.  char *outnam
38d0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
38e0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72  Name of the curr
38f0: 65 6e 74 20 6f 75 74 70 75 74 20 66 69 6c 65 20  ent output file 
3900: 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e  */.  char *token
3910: 70 72 65 66 69 78 3b 20 20 20 20 20 20 20 2f 2a  prefix;       /*
3920: 20 41 20 70 72 65 66 69 78 20 61 64 64 65 64 20   A prefix added 
3930: 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73 20 69  to token names i
3940: 6e 20 74 68 65 20 2e 68 20 66 69 6c 65 20 2a 2f  n the .h file */
3950: 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69 63 74  .  int nconflict
3960: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
3970: 75 6d 62 65 72 20 6f 66 20 70 61 72 73 69 6e 67  umber of parsing
3980: 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20   conflicts */.  
3990: 69 6e 74 20 6e 61 63 74 69 6f 6e 74 61 62 3b 20  int nactiontab; 
39a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
39b0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
39c0: 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   the yy_action[]
39d0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
39e0: 74 61 62 6c 65 73 69 7a 65 3b 20 20 20 20 20 20  tablesize;      
39f0: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 74 61       /* Total ta
3a00: 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  ble size of all 
3a10: 74 61 62 6c 65 73 20 69 6e 20 62 79 74 65 73 20  tables in bytes 
3a20: 2a 2f 0a 20 20 69 6e 74 20 62 61 73 69 73 66 6c  */.  int basisfl
3a30: 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ag;           /*
3a40: 20 50 72 69 6e 74 20 6f 6e 6c 79 20 62 61 73 69   Print only basi
3a50: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  s configurations
3a60: 20 2a 2f 0a 20 20 69 6e 74 20 68 61 73 5f 66 61   */.  int has_fa
3a70: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 2f  llback;        /
3a80: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 25 66  * True if any %f
3a90: 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 65 6e 20  allback is seen 
3aa0: 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  in the grammar *
3ab0: 2f 0a 20 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f  /.  int nolineno
3ac0: 73 66 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  sflag;       /* 
3ad0: 54 72 75 65 20 69 66 20 23 6c 69 6e 65 20 73 74  True if #line st
3ae0: 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  atements should 
3af0: 6e 6f 74 20 62 65 20 70 72 69 6e 74 65 64 20 2a  not be printed *
3b00: 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 76 30 3b  /.  char *argv0;
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3b20: 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 67  Name of the prog
3b30: 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69  ram */.};..#defi
3b40: 6e 65 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 58  ne MemoryCheck(X
3b50: 29 20 69 66 28 28 58 29 3d 3d 30 29 7b 20 5c 0a  ) if((X)==0){ \.
3b60: 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d 65    extern void me
3b70: 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c 0a  mory_error(); \.
3b80: 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29    memory_error()
3b90: 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ; \.}../********
3ba0: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
3bb0: 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 68 22  e file "table.h"
3bc0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
3bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3be0: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f  **/./*.** All co
3bf0: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
3c00: 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61 74  has been automat
3c10: 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64  ically generated
3c20: 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63 69  .** from a speci
3c30: 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  fication in the 
3c40: 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  file.**         
3c50: 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a       "table.q".*
3c60: 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69 61  * by the associa
3c70: 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65 20  tive array code 
3c80: 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d  building program
3c90: 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20   "aagen"..** Do 
3ca0: 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66 69  not edit this fi
3cb0: 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65 64  le!  Instead, ed
3cc0: 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63 61  it the specifica
3cd0: 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  tion.** file, th
3ce0: 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a  en rerun aagen..
3cf0: 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f  */./*.** Code fo
3d00: 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61 62  r processing tab
3d10: 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  les in the LEMON
3d20: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
3d30: 72 2e 0a 2a 2f 0a 2f 2a 20 52 6f 75 74 69 6e 65  r..*/./* Routine
3d40: 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 61  s for handling a
3d50: 20 73 74 72 69 6e 67 73 20 2a 2f 0a 0a 63 6f 6e   strings */..con
3d60: 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65  st char *Strsafe
3d70: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a  (const char *);.
3d80: 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e  .void Strsafe_in
3d90: 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53 74  it(void);.int St
3da0: 72 73 61 66 65 5f 69 6e 73 65 72 74 28 63 6f 6e  rsafe_insert(con
3db0: 73 74 20 63 68 61 72 20 2a 29 3b 0a 63 6f 6e 73  st char *);.cons
3dc0: 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f  t char *Strsafe_
3dd0: 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20  find(const char 
3de0: 2a 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73  *);../* Routines
3df0: 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 73 79   for handling sy
3e00: 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61  mbols of the gra
3e10: 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75 63 74 20  mmar */..struct 
3e20: 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e  symbol *Symbol_n
3e30: 65 77 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  ew(const char *)
3e40: 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70  ;.int Symbolcmpp
3e50: 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 2c 20 63  (const void *, c
3e60: 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 76 6f  onst void *);.vo
3e70: 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 76  id Symbol_init(v
3e80: 6f 69 64 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c  oid);.int Symbol
3e90: 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 73  _insert(struct s
3ea0: 79 6d 62 6f 6c 20 2a 2c 20 63 6f 6e 73 74 20 63  ymbol *, const c
3eb0: 68 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20 73  har *);.struct s
3ec0: 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69  ymbol *Symbol_fi
3ed0: 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  nd(const char *)
3ee0: 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  ;.struct symbol 
3ef0: 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74 29  *Symbol_Nth(int)
3f00: 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75  ;.int Symbol_cou
3f10: 6e 74 28 76 6f 69 64 29 3b 0a 73 74 72 75 63 74  nt(void);.struct
3f20: 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c   symbol **Symbol
3f30: 5f 61 72 72 61 79 6f 66 28 76 6f 69 64 29 3b 0a  _arrayof(void);.
3f40: 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  ./* Routines to 
3f50: 6d 61 6e 61 67 65 20 74 68 65 20 73 74 61 74 65  manage the state
3f60: 20 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e 74 20 43   table */..int C
3f70: 6f 6e 66 69 67 63 6d 70 28 63 6f 6e 73 74 20 63  onfigcmp(const c
3f80: 68 61 72 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61  har *, const cha
3f90: 72 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74 61  r *);.struct sta
3fa0: 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 76 6f  te *State_new(vo
3fb0: 69 64 29 3b 0a 76 6f 69 64 20 53 74 61 74 65 5f  id);.void State_
3fc0: 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20  init(void);.int 
3fd0: 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74 72  State_insert(str
3fe0: 75 63 74 20 73 74 61 74 65 20 2a 2c 20 73 74 72  uct state *, str
3ff0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73  uct config *);.s
4000: 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61  truct state *Sta
4010: 74 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63  te_find(struct c
4020: 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75 63 74  onfig *);.struct
4030: 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61   state **State_a
4040: 72 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a  rrayof(/*  */);.
4050: 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75 73 65  ./* Routines use
4060: 64 20 66 6f 72 20 65 66 66 69 63 69 65 6e 63 79  d for efficiency
4070: 20 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61   in Configlist_a
4080: 64 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66  dd */..void Conf
4090: 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 76 6f 69  igtable_init(voi
40a0: 64 29 3b 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61  d);.int Configta
40b0: 62 6c 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63  ble_insert(struc
40c0: 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72  t config *);.str
40d0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
40e0: 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74 72  igtable_find(str
40f0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76  uct config *);.v
4100: 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  oid Configtable_
4110: 63 6c 65 61 72 28 69 6e 74 28 2a 29 28 73 74 72  clear(int(*)(str
4120: 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 29 3b 0a  uct config *));.
4130: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
4140: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
4150: 6c 65 20 22 61 63 74 69 6f 6e 2e 63 22 20 2a 2a  le "action.c" **
4160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
4180: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70 72  *.** Routines pr
4190: 6f 63 65 73 73 69 6e 67 20 70 61 72 73 65 72 20  ocessing parser 
41a0: 61 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c  actions in the L
41b0: 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
41c0: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 41 6c  rator..*/../* Al
41d0: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 72  locate a new par
41e0: 73 65 72 20 61 63 74 69 6f 6e 20 2a 2f 0a 73 74  ser action */.st
41f0: 61 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69  atic struct acti
4200: 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77 28 76  on *Action_new(v
4210: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73  oid){.  static s
4220: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 66 72  truct action *fr
4230: 65 65 6c 69 73 74 20 3d 20 30 3b 0a 20 20 73 74  eelist = 0;.  st
4240: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77  ruct action *new
4250: 61 63 74 69 6f 6e 3b 0a 0a 20 20 69 66 28 20 66  action;..  if( f
4260: 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reelist==0 ){.  
4270: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
4280: 20 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20   amt = 100;.    
4290: 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75  freelist = (stru
42a0: 63 74 20 61 63 74 69 6f 6e 20 2a 29 63 61 6c 6c  ct action *)call
42b0: 6f 63 28 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73  oc(amt, sizeof(s
42c0: 74 72 75 63 74 20 61 63 74 69 6f 6e 29 29 3b 0a  truct action));.
42d0: 20 20 20 20 69 66 28 20 66 72 65 65 6c 69 73 74      if( freelist
42e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
42f0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61  intf(stderr,"Una
4300: 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
4310: 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77  memory for a new
4320: 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 2e 22   parser action."
4330: 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29  );.      exit(1)
4340: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
4350: 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b  i=0; i<amt-1; i+
4360: 2b 29 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e  +) freelist[i].n
4370: 65 78 74 20 3d 20 26 66 72 65 65 6c 69 73 74 5b  ext = &freelist[
4380: 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69  i+1];.    freeli
4390: 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d  st[amt-1].next =
43a0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 61 63 74   0;.  }.  newact
43b0: 69 6f 6e 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a  ion = freelist;.
43c0: 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65    freelist = fre
43d0: 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72  elist->next;.  r
43e0: 65 74 75 72 6e 20 6e 65 77 61 63 74 69 6f 6e 3b  eturn newaction;
43f0: 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74  .}../* Compare t
4400: 77 6f 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 73  wo actions for s
4410: 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  orting purposes.
4420: 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76    Return negativ
4430: 65 2c 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20 70  e, zero, or.** p
4440: 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66  ositive if the f
4450: 69 72 73 74 20 61 63 74 69 6f 6e 20 69 73 20 6c  irst action is l
4460: 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
4470: 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74  to, or greater t
4480: 68 61 6e 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  han.** the first
4490: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
44a0: 63 74 69 6f 6e 63 6d 70 28 0a 20 20 73 74 72 75  ctioncmp(.  stru
44b0: 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 31 2c 0a  ct action *ap1,.
44c0: 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
44d0: 2a 61 70 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  *ap2.){.  int rc
44e0: 3b 0a 20 20 72 63 20 3d 20 61 70 31 2d 3e 73 70  ;.  rc = ap1->sp
44f0: 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e 73  ->index - ap2->s
4500: 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  p->index;.  if( 
4510: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  rc==0 ){.    rc 
4520: 3d 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70 65  = (int)ap1->type
4530: 20 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79 70   - (int)ap2->typ
4540: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  e;.  }.  if( rc=
4550: 3d 30 20 26 26 20 61 70 31 2d 3e 74 79 70 65 3d  =0 && ap1->type=
4560: 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 72  =REDUCE ){.    r
4570: 63 20 3d 20 61 70 31 2d 3e 78 2e 72 70 2d 3e 69  c = ap1->x.rp->i
4580: 6e 64 65 78 20 2d 20 61 70 32 2d 3e 78 2e 72 70  ndex - ap2->x.rp
4590: 2d 3e 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  ->index;.  }.  i
45a0: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
45b0: 72 63 20 3d 20 28 69 6e 74 29 20 28 61 70 32 20  rc = (int) (ap2 
45c0: 2d 20 61 70 31 29 3b 0a 20 20 7d 0a 20 20 72 65  - ap1);.  }.  re
45d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53  turn rc;.}../* S
45e0: 6f 72 74 20 70 61 72 73 65 72 20 61 63 74 69 6f  ort parser actio
45f0: 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ns */.static str
4600: 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74 69  uct action *Acti
4610: 6f 6e 5f 73 6f 72 74 28 0a 20 20 73 74 72 75 63  on_sort(.  struc
4620: 74 20 61 63 74 69 6f 6e 20 2a 61 70 0a 29 7b 0a  t action *ap.){.
4630: 20 20 61 70 20 3d 20 28 73 74 72 75 63 74 20 61    ap = (struct a
4640: 63 74 69 6f 6e 20 2a 29 6d 73 6f 72 74 28 28 63  ction *)msort((c
4650: 68 61 72 20 2a 29 61 70 2c 28 63 68 61 72 20 2a  har *)ap,(char *
4660: 2a 29 26 61 70 2d 3e 6e 65 78 74 2c 0a 20 20 20  *)&ap->next,.   
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 28             (int(
4690: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  *)(const char*,c
46a0: 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 63 74 69  onst char*))acti
46b0: 6f 6e 63 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e  oncmp);.  return
46c0: 20 61 70 3b 0a 7d 0a 0a 76 6f 69 64 20 41 63 74   ap;.}..void Act
46d0: 69 6f 6e 5f 61 64 64 28 0a 20 20 73 74 72 75 63  ion_add(.  struc
46e0: 74 20 61 63 74 69 6f 6e 20 2a 2a 61 70 70 2c 0a  t action **app,.
46f0: 20 20 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20    enum e_action 
4700: 74 79 70 65 2c 0a 20 20 73 74 72 75 63 74 20 73  type,.  struct s
4710: 79 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20 63 68 61  ymbol *sp,.  cha
4720: 72 20 2a 61 72 67 0a 29 7b 0a 20 20 73 74 72 75  r *arg.){.  stru
4730: 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 61 63  ct action *newac
4740: 74 69 6f 6e 3b 0a 20 20 6e 65 77 61 63 74 69 6f  tion;.  newactio
4750: 6e 20 3d 20 41 63 74 69 6f 6e 5f 6e 65 77 28 29  n = Action_new()
4760: 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 6e  ;.  newaction->n
4770: 65 78 74 20 3d 20 2a 61 70 70 3b 0a 20 20 2a 61  ext = *app;.  *a
4780: 70 70 20 3d 20 6e 65 77 61 63 74 69 6f 6e 3b 0a  pp = newaction;.
4790: 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 74 79 70    newaction->typ
47a0: 65 20 3d 20 74 79 70 65 3b 0a 20 20 6e 65 77 61  e = type;.  newa
47b0: 63 74 69 6f 6e 2d 3e 73 70 20 3d 20 73 70 3b 0a  ction->sp = sp;.
47c0: 20 20 69 66 28 20 74 79 70 65 3d 3d 53 48 49 46    if( type==SHIF
47d0: 54 20 29 7b 0a 20 20 20 20 6e 65 77 61 63 74 69  T ){.    newacti
47e0: 6f 6e 2d 3e 78 2e 73 74 70 20 3d 20 28 73 74 72  on->x.stp = (str
47f0: 75 63 74 20 73 74 61 74 65 20 2a 29 61 72 67 3b  uct state *)arg;
4800: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 65  .  }else{.    ne
4810: 77 61 63 74 69 6f 6e 2d 3e 78 2e 72 70 20 3d 20  waction->x.rp = 
4820: 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29 61  (struct rule *)a
4830: 72 67 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a  rg;.  }.}./*****
4840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4850: 2a 20 4e 65 77 20 63 6f 64 65 20 74 6f 20 69 6d  * New code to im
4860: 70 6c 65 6d 65 6e 74 20 74 68 65 20 22 61 63 74  plement the "act
4870: 74 61 62 22 20 6d 6f 64 75 6c 65 20 2a 2a 2a 2a  tab" module ****
4880: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 54  *******/./*.** T
4890: 68 69 73 20 6d 6f 64 75 6c 65 20 69 6d 70 6c 65  his module imple
48a0: 6d 65 6e 74 73 20 72 6f 75 74 69 6e 65 73 20 75  ments routines u
48b0: 73 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  se to construct 
48c0: 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  the yy_action[] 
48d0: 74 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  table..*/../*.**
48e0: 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   The state of th
48f0: 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c  e yy_action tabl
4900: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
4910: 74 69 6f 6e 20 69 73 20 61 6e 20 69 6e 73 74 61  tion is an insta
4920: 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  nce of.** the fo
4930: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
4940: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 79 79 5f  e..**.** The yy_
4950: 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6d 61 70  action table map
4960: 73 20 74 68 65 20 70 61 69 72 20 28 73 74 61 74  s the pair (stat
4970: 65 5f 6e 75 6d 62 65 72 2c 20 6c 6f 6f 6b 61 68  e_number, lookah
4980: 65 61 64 29 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20  ead) into an.** 
4990: 61 63 74 69 6f 6e 5f 6e 75 6d 62 65 72 2e 20 20  action_number.  
49a0: 54 68 65 20 74 61 62 6c 65 20 69 73 20 61 6e 20  The table is an 
49b0: 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72  array of integer
49c0: 73 20 70 61 69 72 73 2e 20 20 54 68 65 20 73 74  s pairs.  The st
49d0: 61 74 65 5f 6e 75 6d 62 65 72 0a 2a 2a 20 64 65  ate_number.** de
49e0: 74 65 72 6d 69 6e 65 73 20 61 6e 20 69 6e 69 74  termines an init
49f0: 69 61 6c 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  ial offset into 
4a00: 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 61 72  the yy_action ar
4a10: 72 61 79 2e 20 20 54 68 65 20 6c 6f 6f 6b 61 68  ray.  The lookah
4a20: 65 61 64 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  ead.** value is 
4a30: 74 68 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68  then added to th
4a40: 69 73 20 69 6e 69 74 69 61 6c 20 6f 66 66 73 65  is initial offse
4a50: 74 20 74 6f 20 67 65 74 20 61 6e 20 69 6e 64 65  t to get an inde
4a60: 78 20 58 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  x X into the.** 
4a70: 79 79 5f 61 63 74 69 6f 6e 20 61 72 72 61 79 2e  yy_action array.
4a80: 20 49 66 20 74 68 65 20 61 41 63 74 69 6f 6e 5b   If the aAction[
4a90: 58 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 65 71 75  X].lookahead equ
4aa0: 61 6c 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  als the value of
4ab0: 20 74 68 65 0a 2a 2a 20 6f 66 20 74 68 65 20 6c   the.** of the l
4ac0: 6f 6f 6b 61 68 65 61 64 20 69 6e 70 75 74 2c 20  ookahead input, 
4ad0: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  then the value o
4ae0: 66 20 74 68 65 20 61 63 74 69 6f 6e 5f 6e 75 6d  f the action_num
4af0: 62 65 72 20 6f 75 74 70 75 74 20 69 73 0a 2a 2a  ber output is.**
4b00: 20 61 41 63 74 69 6f 6e 5b 58 5d 2e 61 63 74 69   aAction[X].acti
4b10: 6f 6e 2e 20 20 49 66 20 74 68 65 20 6c 6f 6f 6b  on.  If the look
4b20: 61 68 65 61 64 73 20 64 6f 20 6e 6f 74 20 6d 61  aheads do not ma
4b30: 74 63 68 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  tch then the.** 
4b40: 64 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 66  default action f
4b50: 6f 72 20 74 68 65 20 73 74 61 74 65 5f 6e 75 6d  or the state_num
4b60: 62 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ber is returned.
4b70: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 61 63 74 69 6f  .**.** All actio
4b80: 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ns associated wi
4b90: 74 68 20 61 20 73 69 6e 67 6c 65 20 73 74 61 74  th a single stat
4ba0: 65 5f 6e 75 6d 62 65 72 20 61 72 65 20 66 69 72  e_number are fir
4bb0: 73 74 20 65 6e 74 65 72 65 64 0a 2a 2a 20 69 6e  st entered.** in
4bc0: 74 6f 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20  to aLookahead[] 
4bd0: 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 63  using multiple c
4be0: 61 6c 6c 73 20 74 6f 20 61 63 74 74 61 62 5f 61  alls to acttab_a
4bf0: 63 74 69 6f 6e 28 29 2e 20 20 54 68 65 6e 20 74  ction().  Then t
4c00: 68 65 20 0a 2a 2a 20 61 63 74 69 6f 6e 73 20 66  he .** actions f
4c10: 6f 72 20 74 68 61 74 20 73 69 6e 67 6c 65 20 73  or that single s
4c20: 74 61 74 65 5f 6e 75 6d 62 65 72 20 61 72 65 20  tate_number are 
4c30: 70 6c 61 63 65 64 20 69 6e 74 6f 20 74 68 65 20  placed into the 
4c40: 61 41 63 74 69 6f 6e 5b 5d 20 0a 2a 2a 20 61 72  aAction[] .** ar
4c50: 72 61 79 20 77 69 74 68 20 61 20 73 69 6e 67 6c  ray with a singl
4c60: 65 20 63 61 6c 6c 20 74 6f 20 61 63 74 74 61 62  e call to acttab
4c70: 5f 69 6e 73 65 72 74 28 29 2e 20 20 54 68 65 20  _insert().  The 
4c80: 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 29 20  acttab_insert() 
4c90: 63 61 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 72 65 73  call.** also res
4ca0: 65 74 73 20 74 68 65 20 61 4c 6f 6f 6b 61 68 65  ets the aLookahe
4cb0: 61 64 5b 5d 20 61 72 72 61 79 20 69 6e 20 70 72  ad[] array in pr
4cc0: 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 74 68  eparation for th
4cd0: 65 20 6e 65 78 74 0a 2a 2a 20 73 74 61 74 65 20  e next.** state 
4ce0: 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 72 75 63  number..*/.struc
4cf0: 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74 69  t lookahead_acti
4d00: 6f 6e 20 7b 0a 20 20 69 6e 74 20 6c 6f 6f 6b 61  on {.  int looka
4d10: 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  head;           
4d20: 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68    /* Value of th
4d30: 65 20 6c 6f 6f 6b 61 68 65 61 64 20 74 6f 6b 65  e lookahead toke
4d40: 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 63 74 69 6f  n */.  int actio
4d50: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
4d60: 20 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74    /* Action to t
4d70: 61 6b 65 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ake on the given
4d80: 20 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 7d 3b   lookahead */.};
4d90: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
4da0: 61 63 74 74 61 62 20 61 63 74 74 61 62 3b 0a 73  acttab acttab;.s
4db0: 74 72 75 63 74 20 61 63 74 74 61 62 20 7b 0a 20  truct acttab {. 
4dc0: 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20 20   int nAction;   
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4de0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 64 20   Number of used 
4df0: 73 6c 6f 74 73 20 69 6e 20 61 41 63 74 69 6f 6e  slots in aAction
4e00: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74  [] */.  int nAct
4e10: 69 6f 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  ionAlloc;       
4e20: 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c       /* Slots al
4e30: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 41 63 74  located for aAct
4e40: 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 73 74 72 75 63  ion[] */.  struc
4e50: 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74 69  t lookahead_acti
4e60: 6f 6e 0a 20 20 20 20 2a 61 41 63 74 69 6f 6e 2c  on.    *aAction,
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e80: 20 20 2f 2a 20 54 68 65 20 79 79 5f 61 63 74 69    /* The yy_acti
4e90: 6f 6e 5b 5d 20 74 61 62 6c 65 20 75 6e 64 65 72  on[] table under
4ea0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
4eb0: 0a 20 20 20 20 2a 61 4c 6f 6f 6b 61 68 65 61 64  .    *aLookahead
4ec0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4ed0: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e 65 77 20  /* A single new 
4ee0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20  transaction set 
4ef0: 2a 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f 6f 6b 61  */.  int mnLooka
4f00: 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  head;           
4f10: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 4c 6f    /* Minimum aLo
4f20: 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68  okahead[].lookah
4f30: 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 41  ead */.  int mnA
4f40: 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
4f50: 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20        /* Action 
4f60: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4f70: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20  mnLookahead */. 
4f80: 20 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68 65 61 64   int mxLookahead
4f90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4fa0: 20 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68   Maximum aLookah
4fb0: 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  ead[].lookahead 
4fc0: 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68  */.  int nLookah
4fd0: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
4fe0: 20 20 2f 2a 20 55 73 65 64 20 73 6c 6f 74 73 20    /* Used slots 
4ff0: 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20  in aLookahead[] 
5000: 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68  */.  int nLookah
5010: 65 61 64 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  eadAlloc;       
5020: 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f 63    /* Slots alloc
5030: 61 74 65 64 20 69 6e 20 61 4c 6f 6f 6b 61 68 65  ated in aLookahe
5040: 61 64 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52  ad[] */.};../* R
5050: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
5060: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
5070: 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62  he yy_action tab
5080: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63  le */.#define ac
5090: 74 74 61 62 5f 73 69 7a 65 28 58 29 20 28 28 58  ttab_size(X) ((X
50a0: 29 2d 3e 6e 41 63 74 69 6f 6e 29 0a 0a 2f 2a 20  )->nAction)../* 
50b0: 54 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  The value for th
50c0: 65 20 4e 2d 74 68 20 65 6e 74 72 79 20 69 6e 20  e N-th entry in 
50d0: 79 79 5f 61 63 74 69 6f 6e 20 2a 2f 0a 23 64 65  yy_action */.#de
50e0: 66 69 6e 65 20 61 63 74 74 61 62 5f 79 79 61 63  fine acttab_yyac
50f0: 74 69 6f 6e 28 58 2c 4e 29 20 20 28 28 58 29 2d  tion(X,N)  ((X)-
5100: 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 61 63 74 69  >aAction[N].acti
5110: 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75  on)../* The valu
5120: 65 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 65  e for the N-th e
5130: 6e 74 72 79 20 69 6e 20 79 79 5f 6c 6f 6f 6b 61  ntry in yy_looka
5140: 68 65 61 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  head */.#define 
5150: 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61 68 65  acttab_yylookahe
5160: 61 64 28 58 2c 4e 29 20 20 28 28 58 29 2d 3e 61  ad(X,N)  ((X)->a
5170: 41 63 74 69 6f 6e 5b 4e 5d 2e 6c 6f 6f 6b 61 68  Action[N].lookah
5180: 65 61 64 29 0a 0a 2f 2a 20 46 72 65 65 20 61 6c  ead)../* Free al
5190: 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
51a0: 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
51b0: 65 6e 20 61 63 74 74 61 62 20 2a 2f 0a 76 6f 69  en acttab */.voi
51c0: 64 20 61 63 74 74 61 62 5f 66 72 65 65 28 61 63  d acttab_free(ac
51d0: 74 74 61 62 20 2a 70 29 7b 0a 20 20 66 72 65 65  ttab *p){.  free
51e0: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 20 29 3b 0a  ( p->aAction );.
51f0: 20 20 66 72 65 65 28 20 70 2d 3e 61 4c 6f 6f 6b    free( p->aLook
5200: 61 68 65 61 64 20 29 3b 0a 20 20 66 72 65 65 28  ahead );.  free(
5210: 20 70 20 29 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f   p );.}../* Allo
5220: 63 61 74 65 20 61 20 6e 65 77 20 61 63 74 74 61  cate a new actta
5230: 62 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 61  b structure */.a
5240: 63 74 74 61 62 20 2a 61 63 74 74 61 62 5f 61 6c  cttab *acttab_al
5250: 6c 6f 63 28 76 6f 69 64 29 7b 0a 20 20 61 63 74  loc(void){.  act
5260: 74 61 62 20 2a 70 20 3d 20 28 61 63 74 74 61 62  tab *p = (acttab
5270: 20 2a 29 20 63 61 6c 6c 6f 63 28 20 31 2c 20 73   *) calloc( 1, s
5280: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
5290: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 66  f( p==0 ){.    f
52a0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55  printf(stderr,"U
52b0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
52c0: 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e  e memory for a n
52d0: 65 77 20 61 63 74 74 61 62 2e 22 29 3b 0a 20 20  ew acttab.");.  
52e0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
52f0: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
5300: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 72 65 74  zeof(*p));.  ret
5310: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64  urn p;.}../* Add
5320: 20 61 20 6e 65 77 20 61 63 74 69 6f 6e 20 74 6f   a new action to
5330: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5340: 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 20 20 0a  nsaction set.  .
5350: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5360: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
5370: 65 20 66 6f 72 20 65 61 63 68 20 6c 6f 6f 6b 61  e for each looka
5380: 68 65 61 64 20 66 6f 72 20 61 20 70 61 72 74 69  head for a parti
5390: 63 75 6c 61 72 0a 2a 2a 20 73 74 61 74 65 2e 0a  cular.** state..
53a0: 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 61  */.void acttab_a
53b0: 63 74 69 6f 6e 28 61 63 74 74 61 62 20 2a 70 2c  ction(acttab *p,
53c0: 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 2c 20   int lookahead, 
53d0: 69 6e 74 20 61 63 74 69 6f 6e 29 7b 0a 20 20 69  int action){.  i
53e0: 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  f( p->nLookahead
53f0: 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41  >=p->nLookaheadA
5400: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
5410: 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 2b  LookaheadAlloc +
5420: 3d 20 32 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 6f  = 25;.    p->aLo
5430: 6f 6b 61 68 65 61 64 20 3d 20 28 73 74 72 75 63  okahead = (struc
5440: 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74 69  t lookahead_acti
5450: 6f 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28 20 70  on *) realloc( p
5460: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 2c 0a 20 20  ->aLookahead,.  
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5480: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
5490: 66 28 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  f(p->aLookahead[
54a0: 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  0])*p->nLookahea
54b0: 64 41 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 69 66  dAlloc );.    if
54c0: 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 3d  ( p->aLookahead=
54d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
54e0: 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c  ntf(stderr,"mall
54f0: 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20  oc failed\n");. 
5500: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
5510: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
5520: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29  >nLookahead==0 )
5530: 7b 0a 20 20 20 20 70 2d 3e 6d 78 4c 6f 6f 6b 61  {.    p->mxLooka
5540: 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64  head = lookahead
5550: 3b 0a 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61  ;.    p->mnLooka
5560: 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64  head = lookahead
5570: 3b 0a 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f  ;.    p->mnActio
5580: 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 7d 65  n = action;.  }e
5590: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  lse{.    if( p->
55a0: 6d 78 4c 6f 6f 6b 61 68 65 61 64 3c 6c 6f 6f 6b  mxLookahead<look
55b0: 61 68 65 61 64 20 29 20 70 2d 3e 6d 78 4c 6f 6f  ahead ) p->mxLoo
55c0: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
55d0: 61 64 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d  ad;.    if( p->m
55e0: 6e 4c 6f 6f 6b 61 68 65 61 64 3e 6c 6f 6f 6b 61  nLookahead>looka
55f0: 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  head ){.      p-
5600: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  >mnLookahead = l
5610: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 20 20  ookahead;.      
5620: 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63  p->mnAction = ac
5630: 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tion;.    }.  }.
5640: 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b    p->aLookahead[
5650: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 6c  p->nLookahead].l
5660: 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61  ookahead = looka
5670: 68 65 61 64 3b 0a 20 20 70 2d 3e 61 4c 6f 6f 6b  head;.  p->aLook
5680: 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68  ahead[p->nLookah
5690: 65 61 64 5d 2e 61 63 74 69 6f 6e 20 3d 20 61 63  ead].action = ac
56a0: 74 69 6f 6e 3b 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b  tion;.  p->nLook
56b0: 61 68 65 61 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  ahead++;.}../*.*
56c0: 2a 20 41 64 64 20 74 68 65 20 74 72 61 6e 73 61  * Add the transa
56d0: 63 74 69 6f 6e 20 73 65 74 20 62 75 69 6c 74 20  ction set built 
56e0: 75 70 20 77 69 74 68 20 70 72 69 6f 72 20 63 61  up with prior ca
56f0: 6c 6c 73 20 74 6f 20 61 63 74 74 61 62 5f 61 63  lls to acttab_ac
5700: 74 69 6f 6e 28 29 0a 2a 2a 20 69 6e 74 6f 20 74  tion().** into t
5710: 68 65 20 63 75 72 72 65 6e 74 20 61 63 74 69 6f  he current actio
5720: 6e 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 72  n table.  Then r
5730: 65 73 65 74 20 74 68 65 20 74 72 61 6e 73 61 63  eset the transac
5740: 74 69 6f 6e 20 73 65 74 20 62 61 63 6b 0a 2a 2a  tion set back.**
5750: 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 73 65 74   to an empty set
5760: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20   in preparation 
5770: 66 6f 72 20 61 20 6e 65 77 20 72 6f 75 6e 64 20  for a new round 
5780: 6f 66 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e  of acttab_action
5790: 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  () calls..**.** 
57a0: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
57b0: 74 20 69 6e 74 6f 20 74 68 65 20 61 63 74 69 6f  t into the actio
57c0: 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6e  n table of the n
57d0: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
57e0: 2a 2f 0a 69 6e 74 20 61 63 74 74 61 62 5f 69 6e  */.int acttab_in
57f0: 73 65 72 74 28 61 63 74 74 61 62 20 2a 70 29 7b  sert(acttab *p){
5800: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20  .  int i, j, k, 
5810: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  n;.  assert( p->
5820: 6e 4c 6f 6f 6b 61 68 65 61 64 3e 30 20 29 3b 0a  nLookahead>0 );.
5830: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
5840: 77 65 20 68 61 76 65 20 65 6e 6f 75 67 68 20 73  we have enough s
5850: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
5860: 20 65 78 70 61 6e 64 65 64 20 61 63 74 69 6f 6e   expanded action
5870: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74   table.  ** in t
5880: 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e 20 20  he worst case.  
5890: 54 68 65 20 77 6f 72 73 74 20 63 61 73 65 20 6f  The worst case o
58a0: 63 63 75 72 73 20 69 66 20 74 68 65 20 74 72 61  ccurs if the tra
58b0: 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a 20 20 2a  nsaction set.  *
58c0: 2a 20 6d 75 73 74 20 62 65 20 61 70 70 65 6e 64  * must be append
58d0: 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ed to the curren
58e0: 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a 20  t action table. 
58f0: 20 2a 2f 0a 20 20 6e 20 3d 20 70 2d 3e 6d 78 4c   */.  n = p->mxL
5900: 6f 6f 6b 61 68 65 61 64 20 2b 20 31 3b 0a 20 20  ookahead + 1;.  
5910: 69 66 28 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b  if( p->nAction +
5920: 20 6e 20 3e 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e   n >= p->nAction
5930: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74  Alloc ){.    int
5940: 20 6f 6c 64 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e   oldAlloc = p->n
5950: 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 0a 20 20 20  ActionAlloc;.   
5960: 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63   p->nActionAlloc
5970: 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20   = p->nAction + 
5980: 6e 20 2b 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c  n + p->nActionAl
5990: 6c 6f 63 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d  loc + 20;.    p-
59a0: 3e 61 41 63 74 69 6f 6e 20 3d 20 28 73 74 72 75  >aAction = (stru
59b0: 63 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74  ct lookahead_act
59c0: 69 6f 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28 20  ion *) realloc( 
59d0: 70 2d 3e 61 41 63 74 69 6f 6e 2c 0a 20 20 20 20  p->aAction,.    
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59f0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e        sizeof(p->
5a00: 61 41 63 74 69 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e  aAction[0])*p->n
5a10: 41 63 74 69 6f 6e 41 6c 6c 6f 63 29 3b 0a 20 20  ActionAlloc);.  
5a20: 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e    if( p->aAction
5a30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
5a40: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c  intf(stderr,"mal
5a50: 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a  loc failed\n");.
5a60: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
5a70: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6f     }.    for(i=o
5a80: 6c 64 41 6c 6c 6f 63 3b 20 69 3c 70 2d 3e 6e 41  ldAlloc; i<p->nA
5a90: 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 69 2b 2b 29  ctionAlloc; i++)
5aa0: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69  {.      p->aActi
5ab0: 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  on[i].lookahead 
5ac0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 61  = -1;.      p->a
5ad0: 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e  Action[i].action
5ae0: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d   = -1;.    }.  }
5af0: 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20  ..  /* Scan the 
5b00: 65 78 69 73 74 69 6e 67 20 61 63 74 69 6f 6e 20  existing action 
5b10: 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  table looking fo
5b20: 72 20 61 6e 20 6f 66 66 73 65 74 20 74 68 61 74  r an offset that
5b30: 20 69 73 20 61 20 0a 20 20 2a 2a 20 64 75 70 6c   is a .  ** dupl
5b40: 69 63 61 74 65 20 6f 66 20 74 68 65 20 63 75 72  icate of the cur
5b50: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
5b60: 20 73 65 74 2e 20 20 46 61 6c 6c 20 6f 75 74 20   set.  Fall out 
5b70: 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2a  of the loop.  **
5b80: 20 69 66 20 61 6e 64 20 77 68 65 6e 20 74 68 65   if and when the
5b90: 20 64 75 70 6c 69 63 61 74 65 20 69 73 20 66 6f   duplicate is fo
5ba0: 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69  und..  **.  ** i
5bb0: 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e   is the index in
5bc0: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 5d 20 77 68   p->aAction[] wh
5bd0: 65 72 65 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  ere p->mnLookahe
5be0: 61 64 20 69 73 20 69 6e 73 65 72 74 65 64 2e 0a  ad is inserted..
5bf0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 2d 3e    */.  for(i=p->
5c00: 6e 41 63 74 69 6f 6e 2d 31 3b 20 69 3e 3d 30 3b  nAction-1; i>=0;
5c10: 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70   i--){.    if( p
5c20: 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f  ->aAction[i].loo
5c30: 6b 61 68 65 61 64 3d 3d 70 2d 3e 6d 6e 4c 6f 6f  kahead==p->mnLoo
5c40: 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20  kahead ){.      
5c50: 2f 2a 20 41 6c 6c 20 6c 6f 6f 6b 61 68 65 61 64  /* All lookahead
5c60: 73 20 61 6e 64 20 61 63 74 69 6f 6e 73 20 69 6e  s and actions in
5c70: 20 74 68 65 20 61 4c 6f 6f 6b 61 68 65 61 64 5b   the aLookahead[
5c80: 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  ] transaction.  
5c90: 20 20 20 20 2a 2a 20 6d 75 73 74 20 6d 61 74 63      ** must matc
5ca0: 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 63 61  h against the ca
5cb0: 6e 64 69 64 61 74 65 20 61 41 63 74 69 6f 6e 5b  ndidate aAction[
5cc0: 69 5d 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 20  i] entry. */.   
5cd0: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
5ce0: 6e 5b 69 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e  n[i].action!=p->
5cf0: 6d 6e 41 63 74 69 6f 6e 20 29 20 63 6f 6e 74 69  mnAction ) conti
5d00: 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nue;.      for(j
5d10: 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68  =0; j<p->nLookah
5d20: 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ead; j++){.     
5d30: 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61     k = p->aLooka
5d40: 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  head[j].lookahea
5d50: 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  d - p->mnLookahe
5d60: 61 64 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20  ad + i;.        
5d70: 69 66 28 20 6b 3c 30 20 7c 7c 20 6b 3e 3d 70 2d  if( k<0 || k>=p-
5d80: 3e 6e 41 63 74 69 6f 6e 20 29 20 62 72 65 61 6b  >nAction ) break
5d90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
5da0: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c  >aLookahead[j].l
5db0: 6f 6f 6b 61 68 65 61 64 21 3d 70 2d 3e 61 41 63  ookahead!=p->aAc
5dc0: 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[k].lookahea
5dd0: 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
5de0: 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61     if( p->aLooka
5df0: 68 65 61 64 5b 6a 5d 2e 61 63 74 69 6f 6e 21 3d  head[j].action!=
5e00: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 61 63  p->aAction[k].ac
5e10: 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20  tion ) break;.  
5e20: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
5e30: 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20  j<p->nLookahead 
5e40: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
5e50: 20 20 20 2f 2a 20 4e 6f 20 70 6f 73 73 69 62 6c     /* No possibl
5e60: 65 20 6c 6f 6f 6b 61 68 65 61 64 20 76 61 6c 75  e lookahead valu
5e70: 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 69 6e  e that is not in
5e80: 20 74 68 65 20 61 4c 6f 6f 6b 61 68 65 61 64 5b   the aLookahead[
5e90: 5d 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73  ].      ** trans
5ea0: 61 63 74 69 6f 6e 20 69 73 20 61 6c 6c 6f 77 65  action is allowe
5eb0: 64 20 74 6f 20 6d 61 74 63 68 20 61 41 63 74 69  d to match aActi
5ec0: 6f 6e 5b 69 5d 20 2a 2f 0a 20 20 20 20 20 20 6e  on[i] */.      n
5ed0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
5ee0: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f  j=0; j<p->nActio
5ef0: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
5f00: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
5f10: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29  j].lookahead<0 )
5f20: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
5f30: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
5f40: 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d  n[j].lookahead==
5f50: 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  j+p->mnLookahead
5f60: 2d 69 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20  -i ) n++;.      
5f70: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 70  }.      if( n==p
5f80: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a  ->nLookahead ){.
5f90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20          break;  
5fa0: 2f 2a 20 41 6e 20 65 78 61 63 74 20 6d 61 74 63  /* An exact matc
5fb0: 68 20 69 73 20 66 6f 75 6e 64 20 61 74 20 6f 66  h is found at of
5fc0: 66 73 65 74 20 69 20 2a 2f 0a 20 20 20 20 20 20  fset i */.      
5fd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
5fe0: 2a 20 49 66 20 6e 6f 20 65 78 69 73 74 69 6e 67  * If no existing
5ff0: 20 6f 66 66 73 65 74 73 20 65 78 61 63 74 6c 79   offsets exactly
6000: 20 6d 61 74 63 68 20 74 68 65 20 63 75 72 72 65   match the curre
6010: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
6020: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 61 6e 20  find an.  ** an 
6030: 65 6d 70 74 79 20 6f 66 66 73 65 74 20 69 6e 20  empty offset in 
6040: 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 74 61  the aAction[] ta
6050: 62 6c 65 20 69 6e 20 77 68 69 63 68 20 77 65 20  ble in which we 
6060: 63 61 6e 20 61 64 64 20 74 68 65 0a 20 20 2a 2a  can add the.  **
6070: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72   aLookahead[] tr
6080: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
6090: 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
60a0: 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 68 6f 6c   /* Look for hol
60b0: 65 73 20 69 6e 20 74 68 65 20 61 41 63 74 69 6f  es in the aActio
60c0: 6e 5b 5d 20 74 61 62 6c 65 20 74 68 61 74 20 66  n[] table that f
60d0: 69 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  it the current. 
60e0: 20 20 20 2a 2a 20 61 4c 6f 6f 6b 61 68 65 61 64     ** aLookahead
60f0: 5b 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  [] transaction. 
6100: 20 4c 65 61 76 65 20 69 20 73 65 74 20 74 6f 20   Leave i set to 
6110: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
6120: 65 20 68 6f 6c 65 2e 0a 20 20 20 20 2a 2a 20 49  e hole..    ** I
6130: 66 20 6e 6f 20 68 6f 6c 65 73 20 61 72 65 20 66  f no holes are f
6140: 6f 75 6e 64 2c 20 69 20 69 73 20 6c 65 66 74 20  ound, i is left 
6150: 61 74 20 70 2d 3e 6e 41 63 74 69 6f 6e 2c 20 77  at p->nAction, w
6160: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 0a 20  hich means the. 
6170: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
6180: 6e 20 77 69 6c 6c 20 62 65 20 61 70 70 65 6e 64  n will be append
6190: 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ed. */.    for(i
61a0: 3d 30 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e  =0; i<p->nAction
61b0: 41 6c 6c 6f 63 20 2d 20 70 2d 3e 6d 78 4c 6f 6f  Alloc - p->mxLoo
61c0: 6b 61 68 65 61 64 3b 20 69 2b 2b 29 7b 0a 20 20  kahead; i++){.  
61d0: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
61e0: 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c  on[i].lookahead<
61f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
6200: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b  (j=0; j<p->nLook
6210: 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ahead; j++){.   
6220: 20 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c         k = p->aL
6230: 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b  ookahead[j].look
6240: 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f  ahead - p->mnLoo
6250: 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20  kahead + i;.    
6260: 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20 29 20        if( k<0 ) 
6270: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
6280: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
6290: 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e 3d 30 20  k].lookahead>=0 
62a0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
62b0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
62c0: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  <p->nLookahead )
62d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
62e0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
62f0: 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a  >nAction; j++){.
6300: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
6310: 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b  >aAction[j].look
6320: 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f  ahead==j+p->mnLo
6330: 6f 6b 61 68 65 61 64 2d 69 20 29 20 62 72 65 61  okahead-i ) brea
6340: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
6350: 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e       if( j==p->n
6360: 41 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Action ){.      
6370: 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 46      break;  /* F
6380: 69 74 73 20 69 6e 20 65 6d 70 74 79 20 73 6c 6f  its in empty slo
6390: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  ts */.        }.
63a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
63b0: 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 72  }.  /* Insert tr
63c0: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 61 74  ansaction set at
63d0: 20 69 6e 64 65 78 20 69 2e 20 2a 2f 0a 20 20 66   index i. */.  f
63e0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f  or(j=0; j<p->nLo
63f0: 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20  okahead; j++){. 
6400: 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61     k = p->aLooka
6410: 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  head[j].lookahea
6420: 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  d - p->mnLookahe
6430: 61 64 20 2b 20 69 3b 0a 20 20 20 20 70 2d 3e 61  ad + i;.    p->a
6440: 41 63 74 69 6f 6e 5b 6b 5d 20 3d 20 70 2d 3e 61  Action[k] = p->a
6450: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 3b 0a 20 20  Lookahead[j];.  
6460: 20 20 69 66 28 20 6b 3e 3d 70 2d 3e 6e 41 63 74    if( k>=p->nAct
6470: 69 6f 6e 20 29 20 70 2d 3e 6e 41 63 74 69 6f 6e  ion ) p->nAction
6480: 20 3d 20 6b 2b 31 3b 0a 20 20 7d 0a 20 20 70 2d   = k+1;.  }.  p-
6490: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 30 3b  >nLookahead = 0;
64a0: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  ..  /* Return th
64b0: 65 20 6f 66 66 73 65 74 20 74 68 61 74 20 69 73  e offset that is
64c0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 6f   added to the lo
64d0: 6f 6b 61 68 65 61 64 20 69 6e 20 6f 72 64 65 72  okahead in order
64e0: 20 74 6f 20 67 65 74 20 74 68 65 0a 20 20 2a 2a   to get the.  **
64f0: 20 69 6e 64 65 78 20 69 6e 74 6f 20 79 79 5f 61   index into yy_a
6500: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 63 74  ction of the act
6510: 69 6f 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ion */.  return 
6520: 69 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  i - p->mnLookahe
6530: 61 64 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ad;.}../********
6540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
6550: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 62 75  rom the file "bu
6560: 69 6c 64 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ild.c" *********
6570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6580: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ****/./*.** Rout
6590: 69 6e 65 73 20 74 6f 20 63 6f 6e 73 74 72 75 63  ines to construc
65a0: 74 69 6f 6e 20 74 68 65 20 66 69 6e 69 74 65 20  tion the finite 
65b0: 73 74 61 74 65 20 6d 61 63 68 69 6e 65 20 66 6f  state machine fo
65c0: 72 20 74 68 65 20 4c 45 4d 4f 4e 0a 2a 2a 20 70  r the LEMON.** p
65d0: 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
65e0: 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61 20 70  .*/../* Find a p
65f0: 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c  recedence symbol
6600: 20 6f 66 20 65 76 65 72 79 20 72 75 6c 65 20 69   of every rule i
6610: 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 0a 2a  n the grammar..*
6620: 2a 20 0a 2a 2a 20 54 68 6f 73 65 20 72 75 6c 65  * .** Those rule
6630: 73 20 77 68 69 63 68 20 68 61 76 65 20 61 20 70  s which have a p
6640: 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c  recedence symbol
6650: 20 63 6f 64 65 64 20 69 6e 20 74 68 65 20 69 6e   coded in the in
6660: 70 75 74 0a 2a 2a 20 67 72 61 6d 6d 61 72 20 75  put.** grammar u
6670: 73 69 6e 67 20 74 68 65 20 22 5b 73 79 6d 62 6f  sing the "[symbo
6680: 6c 5d 22 20 63 6f 6e 73 74 72 75 63 74 20 77 69  l]" construct wi
6690: 6c 6c 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ll already have 
66a0: 74 68 65 0a 2a 2a 20 72 70 2d 3e 70 72 65 63 73  the.** rp->precs
66b0: 79 6d 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 2e  ym field filled.
66c0: 20 20 4f 74 68 65 72 20 72 75 6c 65 73 20 74 61    Other rules ta
66d0: 6b 65 20 61 73 20 74 68 65 69 72 20 70 72 65 63  ke as their prec
66e0: 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c  edence.** symbol
66f0: 20 74 68 65 20 66 69 72 73 74 20 52 48 53 20 73   the first RHS s
6700: 79 6d 62 6f 6c 20 77 69 74 68 20 61 20 64 65 66  ymbol with a def
6710: 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65 2e  ined precedence.
6720: 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
6730: 65 20 6e 6f 74 20 52 48 53 20 73 79 6d 62 6f 6c  e not RHS symbol
6740: 73 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64  s with a defined
6750: 20 70 72 65 63 65 64 65 6e 63 65 2c 20 74 68 65   precedence, the
6760: 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73   precedence.** s
6770: 79 6d 62 6f 6c 20 66 69 65 6c 64 20 69 73 20 6c  ymbol field is l
6780: 65 66 74 20 62 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f  eft blank..*/.vo
6790: 69 64 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65  id FindRulePrece
67a0: 64 65 6e 63 65 73 28 73 74 72 75 63 74 20 6c 65  dences(struct le
67b0: 6d 6f 6e 20 2a 78 70 29 0a 7b 0a 20 20 73 74 72  mon *xp).{.  str
67c0: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
67d0: 66 6f 72 28 72 70 3d 78 70 2d 3e 72 75 6c 65 3b  for(rp=xp->rule;
67e0: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
67f0: 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 70  ){.    if( rp->p
6800: 72 65 63 73 79 6d 3d 3d 30 20 29 7b 0a 20 20 20  recsym==0 ){.   
6810: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
6820: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
6830: 2d 3e 6e 72 68 73 20 26 26 20 72 70 2d 3e 70 72  ->nrhs && rp->pr
6840: 65 63 73 79 6d 3d 3d 30 3b 20 69 2b 2b 29 7b 0a  ecsym==0; i++){.
6850: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
6860: 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e  ymbol *sp = rp->
6870: 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  rhs[i];.        
6880: 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55  if( sp->type==MU
6890: 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
68a0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
68b0: 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; j<sp->nsubsym;
68c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
68d0: 20 20 20 69 66 28 20 73 70 2d 3e 73 75 62 73 79     if( sp->subsy
68e0: 6d 5b 6a 5d 2d 3e 70 72 65 63 3e 3d 30 20 29 7b  m[j]->prec>=0 ){
68f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
6900: 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 73 70 2d  p->precsym = sp-
6910: 3e 73 75 62 73 79 6d 5b 6a 5d 3b 0a 20 20 20 20  >subsym[j];.    
6920: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
6930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6940: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6950: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d     }else if( sp-
6960: 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20  >prec>=0 ){.    
6970: 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79        rp->precsy
6980: 6d 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  m = rp->rhs[i];.
6990: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
69a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
69b0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64  turn;.}../* Find
69c0: 20 61 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   all nonterminal
69d0: 73 20 77 68 69 63 68 20 77 69 6c 6c 20 67 65 6e  s which will gen
69e0: 65 72 61 74 65 20 74 68 65 20 65 6d 70 74 79 20  erate the empty 
69f0: 73 74 72 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e 20  string..** Then 
6a00: 67 6f 20 62 61 63 6b 20 61 6e 64 20 63 6f 6d 70  go back and comp
6a10: 75 74 65 20 74 68 65 20 66 69 72 73 74 20 73 65  ute the first se
6a20: 74 73 20 6f 66 20 65 76 65 72 79 20 6e 6f 6e 74  ts of every nont
6a30: 65 72 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20  erminal..** The 
6a40: 66 69 72 73 74 20 73 65 74 20 69 73 20 74 68 65  first set is the
6a50: 20 73 65 74 20 6f 66 20 61 6c 6c 20 74 65 72 6d   set of all term
6a60: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69  inal symbols whi
6a70: 63 68 20 63 61 6e 20 62 65 67 69 6e 0a 2a 2a 20  ch can begin.** 
6a80: 61 20 73 74 72 69 6e 67 20 67 65 6e 65 72 61 74  a string generat
6a90: 65 64 20 62 79 20 74 68 61 74 20 6e 6f 6e 74 65  ed by that nonte
6aa0: 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  rminal..*/.void 
6ab0: 46 69 6e 64 46 69 72 73 74 53 65 74 73 28 73 74  FindFirstSets(st
6ac0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
6ad0: 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  ).{.  int i, j;.
6ae0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
6af0: 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73  p;.  int progres
6b00: 73 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  s;..  for(i=0; i
6b10: 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
6b20: 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e  i++){.    lemp->
6b30: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d 62  symbols[i]->lamb
6b40: 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45  da = LEMON_FALSE
6b50: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6c 65  ;.  }.  for(i=le
6b60: 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69  mp->nterminal; i
6b70: 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
6b80: 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e  i++){.    lemp->
6b90: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69 72 73  symbols[i]->firs
6ba0: 74 73 65 74 20 3d 20 53 65 74 4e 65 77 28 29 3b  tset = SetNew();
6bb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74  .  }..  /* First
6bc0: 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20 6c 61 6d   compute all lam
6bd0: 62 64 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20  bdas */.  do{.  
6be0: 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a    progress = 0;.
6bf0: 20 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d      for(rp=lemp-
6c00: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
6c10: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
6c20: 66 28 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62  f( rp->lhs->lamb
6c30: 64 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  da ) continue;. 
6c40: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
6c50: 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
6c60: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
6c70: 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e  ymbol *sp = rp->
6c80: 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  rhs[i];.        
6c90: 61 73 73 65 72 74 28 20 73 70 2d 3e 74 79 70 65  assert( sp->type
6ca0: 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c  ==NONTERMINAL ||
6cb0: 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d   sp->lambda==LEM
6cc0: 4f 4e 5f 46 41 4c 53 45 20 29 3b 0a 20 20 20 20  ON_FALSE );.    
6cd0: 20 20 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62      if( sp->lamb
6ce0: 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20  da==LEMON_FALSE 
6cf0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
6d00: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72 70  .      if( i==rp
6d10: 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  ->nrhs ){.      
6d20: 20 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64    rp->lhs->lambd
6d30: 61 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b 0a  a = LEMON_TRUE;.
6d40: 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73          progress
6d50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
6d60: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72    }.  }while( pr
6d70: 6f 67 72 65 73 73 20 29 3b 0a 0a 20 20 2f 2a 20  ogress );..  /* 
6d80: 4e 6f 77 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20  Now compute all 
6d90: 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20  first sets */.  
6da0: 64 6f 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73  do{.    struct s
6db0: 79 6d 62 6f 6c 20 2a 73 31 2c 20 2a 73 32 3b 0a  ymbol *s1, *s2;.
6dc0: 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30      progress = 0
6dd0: 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d  ;.    for(rp=lem
6de0: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
6df0: 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  rp->next){.     
6e00: 20 73 31 20 3d 20 72 70 2d 3e 6c 68 73 3b 0a 20   s1 = rp->lhs;. 
6e10: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
6e20: 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
6e30: 20 20 20 20 20 20 20 20 73 32 20 3d 20 72 70 2d          s2 = rp-
6e40: 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  >rhs[i];.       
6e50: 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d 54   if( s2->type==T
6e60: 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
6e70: 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d       progress +=
6e80: 20 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72 73   SetAdd(s1->firs
6e90: 74 73 65 74 2c 73 32 2d 3e 69 6e 64 65 78 29 3b  tset,s2->index);
6ea0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
6eb0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
6ec0: 69 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d 4d 55  if( s2->type==MU
6ed0: 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
6ee0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
6ef0: 3b 20 6a 3c 73 32 2d 3e 6e 73 75 62 73 79 6d 3b  ; j<s2->nsubsym;
6f00: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
6f10: 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53     progress += S
6f20: 65 74 41 64 64 28 73 31 2d 3e 66 69 72 73 74 73  etAdd(s1->firsts
6f30: 65 74 2c 73 32 2d 3e 73 75 62 73 79 6d 5b 6a 5d  et,s2->subsym[j]
6f40: 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
6f50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6f60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
6f70: 65 6c 73 65 20 69 66 28 20 73 31 3d 3d 73 32 20  else if( s1==s2 
6f80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
6f90: 20 73 31 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d   s1->lambda==LEM
6fa0: 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b  ON_FALSE ) break
6fb0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
6fc0: 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72  .          progr
6fd0: 65 73 73 20 2b 3d 20 53 65 74 55 6e 69 6f 6e 28  ess += SetUnion(
6fe0: 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d  s1->firstset,s2-
6ff0: 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20  >firstset);.    
7000: 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e 6c 61        if( s2->la
7010: 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53  mbda==LEMON_FALS
7020: 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  E ) break;.     
7030: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7040: 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f   }.  }while( pro
7050: 67 72 65 73 73 20 29 3b 0a 20 20 72 65 74 75 72  gress );.  retur
7060: 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65  n;.}../* Compute
7070: 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65   all LR(0) state
7080: 73 20 66 6f 72 20 74 68 65 20 67 72 61 6d 6d 61  s for the gramma
7090: 72 2e 20 20 4c 69 6e 6b 73 0a 2a 2a 20 61 72 65  r.  Links.** are
70a0: 20 61 64 64 65 64 20 74 6f 20 62 65 74 77 65 65   added to betwee
70b0: 6e 20 73 6f 6d 65 20 73 74 61 74 65 73 20 73 6f  n some states so
70c0: 20 74 68 61 74 20 74 68 65 20 4c 52 28 31 29 20   that the LR(1) 
70d0: 66 6f 6c 6c 6f 77 20 73 65 74 73 0a 2a 2a 20 63  follow sets.** c
70e0: 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c  an be computed l
70f0: 61 74 65 72 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  ater..*/.PRIVATE
7100: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 67   struct state *g
7110: 65 74 73 74 61 74 65 28 73 74 72 75 63 74 20 6c  etstate(struct l
7120: 65 6d 6f 6e 20 2a 29 3b 20 20 2f 2a 20 66 6f 72  emon *);  /* for
7130: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
7140: 2f 0a 76 6f 69 64 20 46 69 6e 64 53 74 61 74 65  /.void FindState
7150: 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
7160: 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74  lemp).{.  struct
7170: 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73   symbol *sp;.  s
7180: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
7190: 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e  .  Configlist_in
71a0: 69 74 28 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  it();..  /* Find
71b0: 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f   the start symbo
71c0: 6c 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d  l */.  if( lemp-
71d0: 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73 70  >start ){.    sp
71e0: 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c   = Symbol_find(l
71f0: 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20  emp->start);.   
7200: 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20   if( sp==0 ){.  
7210: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
7220: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22  p->filename,0,."
7230: 54 68 65 20 73 70 65 63 69 66 69 65 64 20 73 74  The specified st
7240: 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c  art symbol \"%s\
7250: 22 20 69 73 20 6e 6f 74 20 5c 0a 69 6e 20 61 20  " is not \.in a 
7260: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f 66 20 74  nonterminal of t
7270: 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 5c 22 25  he grammar.  \"%
7280: 73 5c 22 20 77 69 6c 6c 20 62 65 20 75 73 65 64  s\" will be used
7290: 20 61 73 20 74 68 65 20 73 74 61 72 74 20 5c 0a   as the start \.
72a0: 73 79 6d 62 6f 6c 20 69 6e 73 74 65 61 64 2e 22  symbol instead."
72b0: 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 2c 6c 65 6d  ,lemp->start,lem
72c0: 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 2d 3e 6e 61  p->rule->lhs->na
72d0: 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d  me);.      lemp-
72e0: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
72f0: 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75     sp = lemp->ru
7300: 6c 65 2d 3e 6c 68 73 3b 0a 20 20 20 20 7d 0a 20  le->lhs;.    }. 
7310: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d   }else{.    sp =
7320: 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73   lemp->rule->lhs
7330: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
7340: 20 73 75 72 65 20 74 68 65 20 73 74 61 72 74 20   sure the start 
7350: 73 79 6d 62 6f 6c 20 64 6f 65 73 6e 27 74 20 6f  symbol doesn't o
7360: 63 63 75 72 20 6f 6e 20 74 68 65 20 72 69 67 68  ccur on the righ
7370: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 0a 20  t-hand side of. 
7380: 20 2a 2a 20 61 6e 79 20 72 75 6c 65 2e 20 20 52   ** any rule.  R
7390: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
73a0: 66 20 69 74 20 64 6f 65 73 2e 20 20 28 59 41 43  f it does.  (YAC
73b0: 43 20 77 6f 75 6c 64 20 67 65 6e 65 72 61 74 65  C would generate
73c0: 20 61 20 6e 65 77 0a 20 20 2a 2a 20 73 74 61 72   a new.  ** star
73d0: 74 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73  t symbol in this
73e0: 20 63 61 73 65 2e 29 20 2a 2f 0a 20 20 66 6f 72   case.) */.  for
73f0: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
7400: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
7410: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
7420: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
7430: 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
7440: 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d    if( rp->rhs[i]
7450: 3d 3d 73 70 20 29 7b 20 20 20 2f 2a 20 46 49 58  ==sp ){   /* FIX
7460: 20 4d 45 3a 20 20 44 65 61 6c 20 77 69 74 68 20   ME:  Deal with 
7470: 6d 75 6c 74 69 74 65 72 6d 69 6e 61 6c 73 20 2a  multiterminals *
7480: 2f 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  /.        ErrorM
7490: 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  sg(lemp->filenam
74a0: 65 2c 30 2c 0a 22 54 68 65 20 73 74 61 72 74 20  e,0,."The start 
74b0: 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 6f 63  symbol \"%s\" oc
74c0: 63 75 72 73 20 6f 6e 20 74 68 65 20 5c 0a 72 69  curs on the \.ri
74d0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
74e0: 20 61 20 72 75 6c 65 2e 20 54 68 69 73 20 77 69   a rule. This wi
74f0: 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 20 70  ll result in a p
7500: 61 72 73 65 72 20 77 68 69 63 68 20 5c 0a 64 6f  arser which \.do
7510: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 70 72 6f 70  es not work prop
7520: 65 72 6c 79 2e 22 2c 73 70 2d 3e 6e 61 6d 65 29  erly.",sp->name)
7530: 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e  ;.        lemp->
7540: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
7550: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
7560: 20 2f 2a 20 54 68 65 20 62 61 73 69 73 20 63 6f   /* The basis co
7570: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 20  nfiguration set 
7580: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 73 74  for the first st
7590: 61 74 65 0a 20 20 2a 2a 20 69 73 20 61 6c 6c 20  ate.  ** is all 
75a0: 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76 65  rules which have
75b0: 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f   the start symbo
75c0: 6c 20 61 73 20 74 68 65 69 72 0a 20 20 2a 2a 20  l as their.  ** 
75d0: 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 2a  left-hand side *
75e0: 2f 0a 20 20 66 6f 72 28 72 70 3d 73 70 2d 3e 72  /.  for(rp=sp->r
75f0: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
7600: 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20 73 74  nextlhs){.    st
7610: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77  ruct config *new
7620: 63 66 70 3b 0a 20 20 20 20 72 70 2d 3e 6c 68 73  cfp;.    rp->lhs
7630: 53 74 61 72 74 20 3d 20 31 3b 0a 20 20 20 20 6e  Start = 1;.    n
7640: 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69  ewcfp = Configli
7650: 73 74 5f 61 64 64 62 61 73 69 73 28 72 70 2c 30  st_addbasis(rp,0
7660: 29 3b 0a 20 20 20 20 53 65 74 41 64 64 28 6e 65  );.    SetAdd(ne
7670: 77 63 66 70 2d 3e 66 77 73 2c 30 29 3b 0a 20 20  wcfp->fws,0);.  
7680: 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
7690: 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 2e  the first state.
76a0: 20 20 41 6c 6c 20 6f 74 68 65 72 20 73 74 61 74    All other stat
76b0: 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  es will be.  ** 
76c0: 63 6f 6d 70 75 74 65 64 20 61 75 74 6f 6d 61 74  computed automat
76d0: 69 63 61 6c 6c 79 20 64 75 72 69 6e 67 20 74 68  ically during th
76e0: 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66  e computation of
76f0: 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 0a   the first one..
7700: 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65    ** The returne
7710: 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  d pointer to the
7720: 20 66 69 72 73 74 20 73 74 61 74 65 20 69 73 20   first state is 
7730: 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 28  not used. */.  (
7740: 76 6f 69 64 29 67 65 74 73 74 61 74 65 28 6c 65  void)getstate(le
7750: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  mp);.  return;.}
7760: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
7770: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 65  inter to a state
7780: 20 77 68 69 63 68 20 69 73 20 64 65 73 63 72 69   which is descri
7790: 62 65 64 20 62 79 20 74 68 65 20 63 6f 6e 66 69  bed by the confi
77a0: 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74  guration.** list
77b0: 20 77 68 69 63 68 20 68 61 73 20 62 65 65 6e 20   which has been 
77c0: 62 75 69 6c 74 20 66 72 6f 6d 20 63 61 6c 6c 73  built from calls
77d0: 20 74 6f 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61   to Configlist_a
77e0: 64 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  dd..*/.PRIVATE v
77f0: 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74 73 28  oid buildshifts(
7800: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20  struct lemon *, 
7810: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 3b  struct state *);
7820: 20 2f 2a 20 46 6f 72 77 64 20 72 65 66 20 2a 2f   /* Forwd ref */
7830: 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20  .PRIVATE struct 
7840: 73 74 61 74 65 20 2a 67 65 74 73 74 61 74 65 28  state *getstate(
7850: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
7860: 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63  mp).{.  struct c
7870: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 62 70 3b  onfig *cfp, *bp;
7880: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
7890: 2a 73 74 70 3b 0a 0a 20 20 2f 2a 20 45 78 74 72  *stp;..  /* Extr
78a0: 61 63 74 20 74 68 65 20 73 6f 72 74 65 64 20 62  act the sorted b
78b0: 61 73 69 73 20 6f 66 20 74 68 65 20 6e 65 77 20  asis of the new 
78c0: 73 74 61 74 65 2e 20 20 54 68 65 20 62 61 73 69  state.  The basi
78d0: 73 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65  s was constructe
78e0: 64 0a 20 20 2a 2a 20 62 79 20 70 72 69 6f 72 20  d.  ** by prior 
78f0: 63 61 6c 6c 73 20 74 6f 20 22 43 6f 6e 66 69 67  calls to "Config
7900: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 29 22  list_addbasis()"
7910: 2e 20 2a 2f 0a 20 20 43 6f 6e 66 69 67 6c 69 73  . */.  Configlis
7920: 74 5f 73 6f 72 74 62 61 73 69 73 28 29 3b 0a 20  t_sortbasis();. 
7930: 20 62 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74   bp = Configlist
7940: 5f 62 61 73 69 73 28 29 3b 0a 0a 20 20 2f 2a 20  _basis();..  /* 
7950: 47 65 74 20 61 20 73 74 61 74 65 20 77 69 74 68  Get a state with
7960: 20 74 68 65 20 73 61 6d 65 20 62 61 73 69 73 20   the same basis 
7970: 2a 2f 0a 20 20 73 74 70 20 3d 20 53 74 61 74 65  */.  stp = State
7980: 5f 66 69 6e 64 28 62 70 29 3b 0a 20 20 69 66 28  _find(bp);.  if(
7990: 20 73 74 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41   stp ){.    /* A
79a0: 20 73 74 61 74 65 20 77 69 74 68 20 74 68 65 20   state with the 
79b0: 73 61 6d 65 20 62 61 73 69 73 20 61 6c 72 65 61  same basis alrea
79c0: 64 79 20 65 78 69 73 74 73 21 20 20 43 6f 70 79  dy exists!  Copy
79d0: 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 2d   all the follow-
79e0: 73 65 74 0a 20 20 20 20 2a 2a 20 70 72 6f 70 61  set.    ** propa
79f0: 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f  gation links fro
7a00: 6d 20 74 68 65 20 73 74 61 74 65 20 75 6e 64 65  m the state unde
7a10: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
7a20: 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  nto the.    ** p
7a30: 72 65 65 78 69 73 74 69 6e 67 20 73 74 61 74 65  reexisting state
7a40: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  , then return a 
7a50: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
7a60: 72 65 65 78 69 73 74 69 6e 67 20 73 74 61 74 65  reexisting state
7a70: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 63   */.    struct c
7a80: 6f 6e 66 69 67 20 2a 78 2c 20 2a 79 3b 0a 20 20  onfig *x, *y;.  
7a90: 20 20 66 6f 72 28 78 3d 62 70 2c 20 79 3d 73 74    for(x=bp, y=st
7aa0: 70 2d 3e 62 70 3b 20 78 20 26 26 20 79 3b 20 78  p->bp; x && y; x
7ab0: 3d 78 2d 3e 62 70 2c 20 79 3d 79 2d 3e 62 70 29  =x->bp, y=y->bp)
7ac0: 7b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 63 6f  {.      Plink_co
7ad0: 70 79 28 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62  py(&y->bplp,x->b
7ae0: 70 6c 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e  plp);.      Plin
7af0: 6b 5f 64 65 6c 65 74 65 28 78 2d 3e 66 70 6c 70  k_delete(x->fplp
7b00: 29 3b 0a 20 20 20 20 20 20 78 2d 3e 66 70 6c 70  );.      x->fplp
7b10: 20 3d 20 78 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a   = x->bplp = 0;.
7b20: 20 20 20 20 7d 0a 20 20 20 20 63 66 70 20 3d 20      }.    cfp = 
7b30: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72  Configlist_retur
7b40: 6e 28 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 6c  n();.    Configl
7b50: 69 73 74 5f 65 61 74 28 63 66 70 29 3b 0a 20 20  ist_eat(cfp);.  
7b60: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
7b70: 69 73 20 72 65 61 6c 6c 79 20 69 73 20 61 20 6e  is really is a n
7b80: 65 77 20 73 74 61 74 65 2e 20 20 43 6f 6e 73 74  ew state.  Const
7b90: 72 75 63 74 20 61 6c 6c 20 74 68 65 20 64 65 74  ruct all the det
7ba0: 61 69 6c 73 20 2a 2f 0a 20 20 20 20 43 6f 6e 66  ails */.    Conf
7bb0: 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c  iglist_closure(l
7bc0: 65 6d 70 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70  emp);    /* Comp
7bd0: 75 74 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ute the configur
7be0: 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f  ation closure */
7bf0: 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  .    Configlist_
7c00: 73 6f 72 74 28 29 3b 20 20 20 20 20 20 20 20 20  sort();         
7c10: 20 20 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f    /* Sort the co
7c20: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73  nfiguration clos
7c30: 75 72 65 20 2a 2f 0a 20 20 20 20 63 66 70 20 3d  ure */.    cfp =
7c40: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75   Configlist_retu
7c50: 72 6e 28 29 3b 20 20 20 2f 2a 20 47 65 74 20 61  rn();   /* Get a
7c60: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7c70: 63 6f 6e 66 69 67 20 6c 69 73 74 20 2a 2f 0a 20  config list */. 
7c80: 20 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f 6e     stp = State_n
7c90: 65 77 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  ew();           
7ca0: 2f 2a 20 41 20 6e 65 77 20 73 74 61 74 65 20 73  /* A new state s
7cb0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
7cc0: 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 74 70 29  MemoryCheck(stp)
7cd0: 3b 0a 20 20 20 20 73 74 70 2d 3e 62 70 20 3d 20  ;.    stp->bp = 
7ce0: 62 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  bp;             
7cf0: 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74     /* Remember t
7d00: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
7d10: 20 62 61 73 69 73 20 2a 2f 0a 20 20 20 20 73 74   basis */.    st
7d20: 70 2d 3e 63 66 70 20 3d 20 63 66 70 3b 20 20 20  p->cfp = cfp;   
7d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
7d40: 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69  member the confi
7d50: 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65  guration closure
7d60: 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 73 74 61   */.    stp->sta
7d70: 74 65 6e 75 6d 20 3d 20 6c 65 6d 70 2d 3e 6e 73  tenum = lemp->ns
7d80: 74 61 74 65 2b 2b 3b 20 2f 2a 20 45 76 65 72 79  tate++; /* Every
7d90: 20 73 74 61 74 65 20 67 65 74 73 20 61 20 73 65   state gets a se
7da0: 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f  quence number */
7db0: 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 30  .    stp->ap = 0
7dc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7dd0: 20 20 2f 2a 20 4e 6f 20 61 63 74 69 6f 6e 73 2c    /* No actions,
7de0: 20 79 65 74 2e 20 2a 2f 0a 20 20 20 20 53 74 61   yet. */.    Sta
7df0: 74 65 5f 69 6e 73 65 72 74 28 73 74 70 2c 73 74  te_insert(stp,st
7e00: 70 2d 3e 62 70 29 3b 20 20 20 2f 2a 20 41 64 64  p->bp);   /* Add
7e10: 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 61   to the state ta
7e20: 62 6c 65 20 2a 2f 0a 20 20 20 20 62 75 69 6c 64  ble */.    build
7e30: 73 68 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29  shifts(lemp,stp)
7e40: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 63 75 72  ;       /* Recur
7e50: 73 69 76 65 6c 79 20 63 6f 6d 70 75 74 65 20 73  sively compute s
7e60: 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 73 20  uccessor states 
7e70: 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
7e80: 73 74 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  stp;.}../*.** Re
7e90: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 77 6f  turn true if two
7ea0: 20 73 79 6d 62 6f 6c 73 20 61 72 65 20 74 68 65   symbols are the
7eb0: 20 73 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 61   same..*/.int sa
7ec0: 6d 65 5f 73 79 6d 62 6f 6c 28 73 74 72 75 63 74  me_symbol(struct
7ed0: 20 73 79 6d 62 6f 6c 20 2a 61 2c 20 73 74 72 75   symbol *a, stru
7ee0: 63 74 20 73 79 6d 62 6f 6c 20 2a 62 29 0a 7b 0a  ct symbol *b).{.
7ef0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61    int i;.  if( a
7f00: 3d 3d 62 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==b ) return 1;.
7f10: 20 20 69 66 28 20 61 2d 3e 74 79 70 65 21 3d 4d    if( a->type!=M
7f20: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 20 72  ULTITERMINAL ) r
7f30: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 62  eturn 0;.  if( b
7f40: 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52  ->type!=MULTITER
7f50: 4d 49 4e 41 4c 20 29 20 72 65 74 75 72 6e 20 30  MINAL ) return 0
7f60: 3b 0a 20 20 69 66 28 20 61 2d 3e 6e 73 75 62 73  ;.  if( a->nsubs
7f70: 79 6d 21 3d 62 2d 3e 6e 73 75 62 73 79 6d 20 29  ym!=b->nsubsym )
7f80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
7f90: 28 69 3d 30 3b 20 69 3c 61 2d 3e 6e 73 75 62 73  (i=0; i<a->nsubs
7fa0: 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ym; i++){.    if
7fb0: 28 20 61 2d 3e 73 75 62 73 79 6d 5b 69 5d 21 3d  ( a->subsym[i]!=
7fc0: 62 2d 3e 73 75 62 73 79 6d 5b 69 5d 20 29 20 72  b->subsym[i] ) r
7fd0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
7fe0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 43  eturn 1;.}../* C
7ff0: 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20 73 75 63  onstruct all suc
8000: 63 65 73 73 6f 72 20 73 74 61 74 65 73 20 74 6f  cessor states to
8010: 20 74 68 65 20 67 69 76 65 6e 20 73 74 61 74 65   the given state
8020: 2e 20 20 41 20 22 73 75 63 63 65 73 73 6f 72 22  .  A "successor"
8030: 0a 2a 2a 20 73 74 61 74 65 20 69 73 20 61 6e 79  .** state is any
8040: 20 73 74 61 74 65 20 77 68 69 63 68 20 63 61 6e   state which can
8050: 20 62 65 20 72 65 61 63 68 65 64 20 62 79 20 61   be reached by a
8060: 20 73 68 69 66 74 20 61 63 74 69 6f 6e 2e 0a 2a   shift action..*
8070: 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 62  /.PRIVATE void b
8080: 75 69 6c 64 73 68 69 66 74 73 28 73 74 72 75 63  uildshifts(struc
8090: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73  t lemon *lemp, s
80a0: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
80b0: 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ).{.  struct con
80c0: 66 69 67 20 2a 63 66 70 3b 20 20 2f 2a 20 46 6f  fig *cfp;  /* Fo
80d0: 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 75 20 74  r looping thru t
80e0: 68 65 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72  he config closur
80f0: 65 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20  e of "stp" */.  
8100: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
8110: 63 66 70 3b 20 2f 2a 20 46 6f 72 20 74 68 65 20  cfp; /* For the 
8120: 69 6e 6e 65 72 20 6c 6f 6f 70 20 6f 6e 20 63 6f  inner loop on co
8130: 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20  nfig closure of 
8140: 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63  "stp" */.  struc
8150: 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 67  t config *newcfg
8160: 3b 20 20 2f 2a 20 2a 2f 0a 20 20 73 74 72 75 63  ;  /* */.  struc
8170: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20  t symbol *sp;   
8180: 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77  /* Symbol follow
8190: 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e 20 63  ing the dot in c
81a0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 63 66  onfiguration "cf
81b0: 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  p" */.  struct s
81c0: 79 6d 62 6f 6c 20 2a 62 73 70 3b 20 20 2f 2a 20  ymbol *bsp;  /* 
81d0: 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67  Symbol following
81e0: 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66   the dot in conf
81f0: 69 67 75 72 61 74 69 6f 6e 20 22 62 63 66 70 22  iguration "bcfp"
8200: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
8210: 74 65 20 2a 6e 65 77 73 74 70 3b 20 2f 2a 20 41  te *newstp; /* A
8220: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
8230: 63 63 65 73 73 6f 72 20 73 74 61 74 65 20 2a 2f  ccessor state */
8240: 0a 0a 20 20 2f 2a 20 45 61 63 68 20 63 6f 6e 66  ..  /* Each conf
8250: 69 67 75 72 61 74 69 6f 6e 20 62 65 63 6f 6d 65  iguration become
8260: 73 20 63 6f 6d 70 6c 65 74 65 20 61 66 74 65 72  s complete after
8270: 20 69 74 20 63 6f 6e 74 69 62 75 74 65 73 20 74   it contibutes t
8280: 6f 20 61 20 73 75 63 63 65 73 73 6f 72 0a 20 20  o a successor.  
8290: 2a 2a 20 73 74 61 74 65 2e 20 20 49 6e 69 74 69  ** state.  Initi
82a0: 61 6c 6c 79 2c 20 61 6c 6c 20 63 6f 6e 66 69 67  ally, all config
82b0: 75 72 61 74 69 6f 6e 73 20 61 72 65 20 69 6e 63  urations are inc
82c0: 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 66 6f 72  omplete */.  for
82d0: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
82e0: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
82f0: 74 29 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d  t) cfp->status =
8300: 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 0a 20 20   INCOMPLETE;..  
8310: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
8320: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
8330: 6e 73 20 6f 66 20 74 68 65 20 73 74 61 74 65 20  ns of the state 
8340: 22 73 74 70 22 20 2a 2f 0a 20 20 66 6f 72 28 63  "stp" */.  for(c
8350: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
8360: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
8370: 7b 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 73  {.    if( cfp->s
8380: 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20  tatus==COMPLETE 
8390: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f  ) continue;    /
83a0: 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64 20 62  * Already used b
83b0: 79 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  y inner loop */.
83c0: 20 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74      if( cfp->dot
83d0: 3e 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20  >=cfp->rp->nrhs 
83e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20  ) continue;  /* 
83f0: 43 61 6e 27 74 20 73 68 69 66 74 20 74 68 69 73  Can't shift this
8400: 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20 43   config */.    C
8410: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28  onfiglist_reset(
8420: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
8430: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74          /* Reset
8440: 20 74 68 65 20 6e 65 77 20 63 6f 6e 66 69 67 20   the new config 
8450: 73 65 74 20 2a 2f 0a 20 20 20 20 73 70 20 3d 20  set */.    sp = 
8460: 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 63 66 70  cfp->rp->rhs[cfp
8470: 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20  ->dot];         
8480: 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 61 66      /* Symbol af
8490: 74 65 72 20 74 68 65 20 64 6f 74 20 2a 2f 0a 0a  ter the dot */..
84a0: 20 20 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79      /* For every
84b0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69   configuration i
84c0: 6e 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70  n the state "stp
84d0: 22 20 77 68 69 63 68 20 68 61 73 20 74 68 65 20  " which has the 
84e0: 73 79 6d 62 6f 6c 20 22 73 70 22 0a 20 20 20 20  symbol "sp".    
84f0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 73  ** following its
8500: 20 64 6f 74 2c 20 61 64 64 20 74 68 65 20 73 61   dot, add the sa
8510: 6d 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  me configuration
8520: 20 74 6f 20 74 68 65 20 62 61 73 69 73 20 73 65   to the basis se
8530: 74 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 63  t under.    ** c
8540: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 62 75 74 20  onstruction but 
8550: 77 69 74 68 20 74 68 65 20 64 6f 74 20 73 68 69  with the dot shi
8560: 66 74 65 64 20 6f 6e 65 20 73 79 6d 62 6f 6c 20  fted one symbol 
8570: 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  to the right. */
8580: 0a 20 20 20 20 66 6f 72 28 62 63 66 70 3d 63 66  .    for(bcfp=cf
8590: 70 3b 20 62 63 66 70 3b 20 62 63 66 70 3d 62 63  p; bcfp; bcfp=bc
85a0: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
85b0: 20 69 66 28 20 62 63 66 70 2d 3e 73 74 61 74 75   if( bcfp->statu
85c0: 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f  s==COMPLETE ) co
85d0: 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c  ntinue;    /* Al
85e0: 72 65 61 64 79 20 75 73 65 64 20 2a 2f 0a 20 20  ready used */.  
85f0: 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e 64 6f      if( bcfp->do
8600: 74 3e 3d 62 63 66 70 2d 3e 72 70 2d 3e 6e 72 68  t>=bcfp->rp->nrh
8610: 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a  s ) continue; /*
8620: 20 43 61 6e 27 74 20 73 68 69 66 74 20 74 68 69   Can't shift thi
8630: 73 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 62  s one */.      b
8640: 73 70 20 3d 20 62 63 66 70 2d 3e 72 70 2d 3e 72  sp = bcfp->rp->r
8650: 68 73 5b 62 63 66 70 2d 3e 64 6f 74 5d 3b 20 20  hs[bcfp->dot];  
8660: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20           /* Get 
8670: 73 79 6d 62 6f 6c 20 61 66 74 65 72 20 64 6f 74  symbol after dot
8680: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 73   */.      if( !s
8690: 61 6d 65 5f 73 79 6d 62 6f 6c 28 62 73 70 2c 73  ame_symbol(bsp,s
86a0: 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  p) ) continue;  
86b0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 73      /* Must be s
86c0: 61 6d 65 20 61 73 20 66 6f 72 20 22 63 66 70 22  ame as for "cfp"
86d0: 20 2a 2f 0a 20 20 20 20 20 20 62 63 66 70 2d 3e   */.      bcfp->
86e0: 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54  status = COMPLET
86f0: 45 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E;              
8700: 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 69 73      /* Mark this
8710: 20 63 6f 6e 66 69 67 20 61 73 20 75 73 65 64 20   config as used 
8720: 2a 2f 0a 20 20 20 20 20 20 6e 65 77 63 66 67 20  */.      newcfg 
8730: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64  = Configlist_add
8740: 62 61 73 69 73 28 62 63 66 70 2d 3e 72 70 2c 62  basis(bcfp->rp,b
8750: 63 66 70 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20 20  cfp->dot+1);.   
8760: 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6e 65     Plink_add(&ne
8770: 77 63 66 67 2d 3e 62 70 6c 70 2c 62 63 66 70 29  wcfg->bplp,bcfp)
8780: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8790: 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  Get a pointer to
87a0: 20 74 68 65 20 73 74 61 74 65 20 64 65 73 63 72   the state descr
87b0: 69 62 65 64 20 62 79 20 74 68 65 20 62 61 73 69  ibed by the basi
87c0: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
87d0: 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74  set.    ** const
87e0: 72 75 63 74 65 64 20 69 6e 20 74 68 65 20 70 72  ructed in the pr
87f0: 65 63 65 64 69 6e 67 20 6c 6f 6f 70 20 2a 2f 0a  eceding loop */.
8800: 20 20 20 20 6e 65 77 73 74 70 20 3d 20 67 65 74      newstp = get
8810: 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 0a 20 20  state(lemp);..  
8820: 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20 22    /* The state "
8830: 6e 65 77 73 74 70 22 20 69 73 20 72 65 61 63 68  newstp" is reach
8840: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74  ed from the stat
8850: 65 20 22 73 74 70 22 20 62 79 20 61 20 73 68 69  e "stp" by a shi
8860: 66 74 20 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ft action.    **
8870: 20 6f 6e 20 74 68 65 20 73 79 6d 62 6f 6c 20 22   on the symbol "
8880: 73 70 22 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  sp" */.    if( s
8890: 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
88a0: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
88b0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
88c0: 28 69 3d 30 3b 20 69 3c 73 70 2d 3e 6e 73 75 62  (i=0; i<sp->nsub
88d0: 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sym; i++){.     
88e0: 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73     Action_add(&s
88f0: 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70 2d  tp->ap,SHIFT,sp-
8900: 3e 73 75 62 73 79 6d 5b 69 5d 2c 28 63 68 61 72  >subsym[i],(char
8910: 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20 20 20  *)newstp);.     
8920: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
8930: 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26      Action_add(&
8940: 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70  stp->ap,SHIFT,sp
8950: 2c 28 63 68 61 72 20 2a 29 6e 65 77 73 74 70 29  ,(char *)newstp)
8960: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
8970: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74  *.** Construct t
8980: 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  he propagation l
8990: 69 6e 6b 73 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e  inks.*/.void Fin
89a0: 64 4c 69 6e 6b 73 28 73 74 72 75 63 74 20 6c 65  dLinks(struct le
89b0: 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69  mon *lemp).{.  i
89c0: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63  nt i;.  struct c
89d0: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6f 74 68  onfig *cfp, *oth
89e0: 65 72 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  er;.  struct sta
89f0: 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63  te *stp;.  struc
8a00: 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a 20  t plink *plp;.. 
8a10: 20 2f 2a 20 48 6f 75 73 65 6b 65 65 70 69 6e 67   /* Housekeeping
8a20: 20 64 65 74 61 69 6c 3a 0a 20 20 2a 2a 20 41 64   detail:.  ** Ad
8a30: 64 20 74 6f 20 65 76 65 72 79 20 70 72 6f 70 61  d to every propa
8a40: 67 61 74 65 20 6c 69 6e 6b 20 61 20 70 6f 69 6e  gate link a poin
8a50: 74 65 72 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ter back to the 
8a60: 73 74 61 74 65 20 74 6f 0a 20 20 2a 2a 20 77 68  state to.  ** wh
8a70: 69 63 68 20 74 68 65 20 6c 69 6e 6b 20 69 73 20  ich the link is 
8a80: 61 74 74 61 63 68 65 64 2e 20 2a 2f 0a 20 20 66  attached. */.  f
8a90: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
8aa0: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
8ab0: 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
8ac0: 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  rted[i];.    for
8ad0: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
8ae0: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
8af0: 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e 73  t){.      cfp->s
8b00: 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 7d 0a  tp = stp;.    }.
8b10: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72    }..  /* Conver
8b20: 74 20 61 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73 20  t all backlinks 
8b30: 69 6e 74 6f 20 66 6f 72 77 61 72 64 20 6c 69 6e  into forward lin
8b40: 6b 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 6f  ks.  Only the fo
8b50: 72 77 61 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b 73  rward.  ** links
8b60: 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68 65   are used in the
8b70: 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d 70   follow-set comp
8b80: 75 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f  utation. */.  fo
8b90: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
8ba0: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
8bb0: 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
8bc0: 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28  ted[i];.    for(
8bd0: 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66  cfp=stp->cfp; cf
8be0: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
8bf0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 6c 70  ){.      for(plp
8c00: 3d 63 66 70 2d 3e 62 70 6c 70 3b 20 70 6c 70 3b  =cfp->bplp; plp;
8c10: 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b   plp=plp->next){
8c20: 0a 20 20 20 20 20 20 20 20 6f 74 68 65 72 20 3d  .        other =
8c30: 20 70 6c 70 2d 3e 63 66 70 3b 0a 20 20 20 20 20   plp->cfp;.     
8c40: 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6f 74     Plink_add(&ot
8c50: 68 65 72 2d 3e 66 70 6c 70 2c 63 66 70 29 3b 0a  her->fplp,cfp);.
8c60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8c70: 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20  }.}../* Compute 
8c80: 61 6c 6c 20 66 6f 6c 6c 6f 77 73 65 74 73 2e 0a  all followsets..
8c90: 2a 2a 0a 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73 65  **.** A followse
8ca0: 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66 20  t is the set of 
8cb0: 61 6c 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69 63  all symbols whic
8cc0: 68 20 63 61 6e 20 63 6f 6d 65 20 69 6d 6d 65 64  h can come immed
8cd0: 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20  iately.** after 
8ce0: 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  a configuration.
8cf0: 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c  .*/.void FindFol
8d00: 6c 6f 77 53 65 74 73 28 73 74 72 75 63 74 20 6c  lowSets(struct l
8d10: 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
8d20: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
8d30: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73  config *cfp;.  s
8d40: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70  truct plink *plp
8d50: 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73  ;.  int progress
8d60: 3b 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 3b 0a  ;.  int change;.
8d70: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
8d80: 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
8d90: 7b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65  {.    for(cfp=le
8da0: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63  mp->sorted[i]->c
8db0: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
8dc0: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 63  ->next){.      c
8dd0: 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43  fp->status = INC
8de0: 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20  OMPLETE;.    }. 
8df0: 20 7d 0a 20 20 0a 20 20 64 6f 7b 0a 20 20 20 20   }.  .  do{.    
8e00: 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
8e10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
8e20: 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
8e30: 0a 20 20 20 20 20 20 66 6f 72 28 63 66 70 3d 6c  .      for(cfp=l
8e40: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e  emp->sorted[i]->
8e50: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
8e60: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
8e70: 20 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75    if( cfp->statu
8e80: 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f  s==COMPLETE ) co
8e90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
8ea0: 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 66 70 6c  for(plp=cfp->fpl
8eb0: 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d  p; plp; plp=plp-
8ec0: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
8ed0: 20 20 63 68 61 6e 67 65 20 3d 20 53 65 74 55 6e    change = SetUn
8ee0: 69 6f 6e 28 70 6c 70 2d 3e 63 66 70 2d 3e 66 77  ion(plp->cfp->fw
8ef0: 73 2c 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20  s,cfp->fws);.   
8f00: 20 20 20 20 20 20 20 69 66 28 20 63 68 61 6e 67         if( chang
8f10: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
8f20: 20 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 61 74 75   plp->cfp->statu
8f30: 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a  s = INCOMPLETE;.
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 67              prog
8f50: 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ress = 1;.      
8f60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8f70: 20 20 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61          cfp->sta
8f80: 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 0a  tus = COMPLETE;.
8f90: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8fa0: 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73  }while( progress
8fb0: 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e   );.}..static in
8fc0: 74 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69  t resolve_confli
8fd0: 63 74 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  ct(struct action
8fe0: 20 2a 2c 73 74 72 75 63 74 20 61 63 74 69 6f 6e   *,struct action
8ff0: 20 2a 29 3b 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65   *);../* Compute
9000: 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69   the reduce acti
9010: 6f 6e 73 2c 20 61 6e 64 20 72 65 73 6f 6c 76 65  ons, and resolve
9020: 20 63 6f 6e 66 6c 69 63 74 73 2e 0a 2a 2f 0a 76   conflicts..*/.v
9030: 6f 69 64 20 46 69 6e 64 41 63 74 69 6f 6e 73 28  oid FindActions(
9040: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
9050: 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b  mp).{.  int i,j;
9060: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
9070: 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20   *cfp;.  struct 
9080: 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
9090: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
90a0: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
90b0: 72 70 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c  rp;..  /* Add al
90c0: 6c 20 6f 66 20 74 68 65 20 72 65 64 75 63 65 20  l of the reduce 
90d0: 61 63 74 69 6f 6e 73 20 0a 20 20 2a 2a 20 41 20  actions .  ** A 
90e0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 69 73  reduce action is
90f0: 20 61 64 64 65 64 20 66 6f 72 20 65 61 63 68 20   added for each 
9100: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 66  element of the f
9110: 6f 6c 6c 6f 77 73 65 74 20 6f 66 0a 20 20 2a 2a  ollowset of.  **
9120: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
9130: 20 77 68 69 63 68 20 68 61 73 20 69 74 73 20 64   which has its d
9140: 6f 74 20 61 74 20 74 68 65 20 65 78 74 72 65 6d  ot at the extrem
9150: 65 20 72 69 67 68 74 2e 0a 20 20 2a 2f 0a 20 20  e right..  */.  
9160: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
9170: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 20 20  >nstate; i++){  
9180: 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
9190: 6c 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 20 20  l states */.    
91a0: 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
91b0: 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63  ed[i];.    for(c
91c0: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
91d0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
91e0: 7b 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  {  /* Loop over 
91f0: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
9200: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ns */.      if( 
9210: 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 3d 3d 63  cfp->rp->nrhs==c
9220: 66 70 2d 3e 64 6f 74 20 29 7b 20 20 20 20 20 20  fp->dot ){      
9230: 20 20 2f 2a 20 49 73 20 64 6f 74 20 61 74 20 65    /* Is dot at e
9240: 78 74 72 65 6d 65 20 72 69 67 68 74 3f 20 2a 2f  xtreme right? */
9250: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
9260: 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; j<lemp->ntermi
9270: 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nal; j++){.     
9280: 20 20 20 20 20 69 66 28 20 53 65 74 46 69 6e 64       if( SetFind
9290: 28 63 66 70 2d 3e 66 77 73 2c 6a 29 20 29 7b 0a  (cfp->fws,j) ){.
92a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
92b0: 64 64 20 61 20 72 65 64 75 63 65 20 61 63 74 69  dd a reduce acti
92c0: 6f 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  on to the state 
92d0: 22 73 74 70 22 20 77 68 69 63 68 20 77 69 6c 6c  "stp" which will
92e0: 20 72 65 64 75 63 65 20 62 79 20 74 68 65 0a 20   reduce by the. 
92f0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 75             ** ru
9300: 6c 65 20 22 63 66 70 2d 3e 72 70 22 20 69 66 20  le "cfp->rp" if 
9310: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 73 79  the lookahead sy
9320: 6d 62 6f 6c 20 69 73 20 22 6c 65 6d 70 2d 3e 73  mbol is "lemp->s
9330: 79 6d 62 6f 6c 73 5b 6a 5d 22 20 2a 2f 0a 20 20  ymbols[j]" */.  
9340: 20 20 20 20 20 20 20 20 20 20 41 63 74 69 6f 6e            Action
9350: 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 52 45  _add(&stp->ap,RE
9360: 44 55 43 45 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  DUCE,lemp->symbo
9370: 6c 73 5b 6a 5d 2c 28 63 68 61 72 20 2a 29 63 66  ls[j],(char *)cf
9380: 70 2d 3e 72 70 29 3b 0a 20 20 20 20 20 20 20 20  p->rp);.        
9390: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
93a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
93b0: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61 63  .  /* Add the ac
93c0: 63 65 70 74 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f  cepting token */
93d0: 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61  .  if( lemp->sta
93e0: 72 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53  rt ){.    sp = S
93f0: 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d  ymbol_find(lemp-
9400: 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28  >start);.    if(
9410: 20 73 70 3d 3d 30 20 29 20 73 70 20 3d 20 6c 65   sp==0 ) sp = le
9420: 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20  mp->rule->lhs;. 
9430: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d   }else{.    sp =
9440: 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73   lemp->rule->lhs
9450: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 64 64 20 74  ;.  }.  /* Add t
9460: 6f 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74  o the first stat
9470: 65 20 28 77 68 69 63 68 20 69 73 20 61 6c 77 61  e (which is alwa
9480: 79 73 20 74 68 65 20 73 74 61 72 74 69 6e 67 20  ys the starting 
9490: 73 74 61 74 65 20 6f 66 20 74 68 65 0a 20 20 2a  state of the.  *
94a0: 2a 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d  * finite state m
94b0: 61 63 68 69 6e 65 29 20 61 6e 20 61 63 74 69 6f  achine) an actio
94c0: 6e 20 74 6f 20 41 43 43 45 50 54 20 69 66 20 74  n to ACCEPT if t
94d0: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 73 20  he lookahead is 
94e0: 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6e  the.  ** start n
94f0: 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f 0a  onterminal.  */.
9500: 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 6c 65    Action_add(&le
9510: 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e 61  mp->sorted[0]->a
9520: 70 2c 41 43 43 45 50 54 2c 73 70 2c 30 29 3b 0a  p,ACCEPT,sp,0);.
9530: 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 63 6f  .  /* Resolve co
9540: 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20 66 6f 72  nflicts */.  for
9550: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
9560: 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
9570: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
9580: 70 2c 20 2a 6e 61 70 3b 0a 20 20 20 20 73 74 70  p, *nap;.    stp
9590: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
95a0: 69 5d 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72  i];.    /* asser
95b0: 74 28 20 73 74 70 2d 3e 61 70 20 29 3b 20 2a 2f  t( stp->ap ); */
95c0: 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41  .    stp->ap = A
95d0: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e  ction_sort(stp->
95e0: 61 70 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  ap);.    for(ap=
95f0: 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26 20 61  stp->ap; ap && a
9600: 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70 2d 3e  p->next; ap=ap->
9610: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66 6f 72  next){.      for
9620: 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 6e  (nap=ap->next; n
9630: 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d 3d 61  ap && nap->sp==a
9640: 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70 2d 3e  p->sp; nap=nap->
9650: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  next){.         
9660: 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74 69 6f  /* The two actio
9670: 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e 61 70  ns "ap" and "nap
9680: 22 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  " have the same 
9690: 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 20  lookahead..     
96a0: 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75      ** Figure ou
96b0: 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68 6f 75  t which one shou
96c0: 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a 20 20  ld be used */.  
96d0: 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e 63 6f         lemp->nco
96e0: 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f 6c 76  nflict += resolv
96f0: 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c 6e 61  e_conflict(ap,na
9700: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
9710: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f  }.  }..  /* Repo
9720: 72 74 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20  rt an error for 
9730: 65 61 63 68 20 72 75 6c 65 20 74 68 61 74 20 63  each rule that c
9740: 61 6e 20 6e 65 76 65 72 20 62 65 20 72 65 64 75  an never be redu
9750: 63 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 72 70  ced. */.  for(rp
9760: 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
9770: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70   rp=rp->next) rp
9780: 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 4c 45  ->canReduce = LE
9790: 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 66 6f 72  MON_FALSE;.  for
97a0: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
97b0: 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
97c0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
97d0: 70 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 6c 65  p;.    for(ap=le
97e0: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 61  mp->sorted[i]->a
97f0: 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
9800: 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  xt){.      if( a
9810: 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  p->type==REDUCE 
9820: 29 20 61 70 2d 3e 78 2e 72 70 2d 3e 63 61 6e 52  ) ap->x.rp->canR
9830: 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f 54 52  educe = LEMON_TR
9840: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  UE;.    }.  }.  
9850: 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
9860: 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
9870: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d  xt){.    if( rp-
9880: 3e 63 61 6e 52 65 64 75 63 65 20 29 20 63 6f 6e  >canReduce ) con
9890: 74 69 6e 75 65 3b 0a 20 20 20 20 45 72 72 6f 72  tinue;.    Error
98a0: 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
98b0: 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c  me,rp->ruleline,
98c0: 22 54 68 69 73 20 72 75 6c 65 20 63 61 6e 20 6e  "This rule can n
98d0: 6f 74 20 62 65 20 72 65 64 75 63 65 64 2e 5c 6e  ot be reduced.\n
98e0: 22 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72  ");.    lemp->er
98f0: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a  rorcnt++;.  }.}.
9900: 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61 20 63 6f  ./* Resolve a co
9910: 6e 66 6c 69 63 74 20 62 65 74 77 65 65 6e 20 74  nflict between t
9920: 68 65 20 74 77 6f 20 67 69 76 65 6e 20 61 63 74  he two given act
9930: 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 0a 2a 2a  ions.  If the.**
9940: 20 63 6f 6e 66 6c 69 63 74 20 63 61 6e 27 74 20   conflict can't 
9950: 62 65 20 72 65 73 6f 6c 76 65 64 2c 20 72 65 74  be resolved, ret
9960: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a  urn non-zero..**
9970: 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47 45 52 20 54 52  .** NO LONGER TR
9980: 55 45 3a 0a 2a 2a 20 20 20 54 6f 20 72 65 73 6f  UE:.**   To reso
9990: 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 2c 20  lve a conflict, 
99a0: 66 69 72 73 74 20 6c 6f 6f 6b 20 74 6f 20 73 65  first look to se
99b0: 65 20 69 66 20 65 69 74 68 65 72 20 61 63 74 69  e if either acti
99c0: 6f 6e 0a 2a 2a 20 20 20 69 73 20 6f 6e 20 61 6e  on.**   is on an
99d0: 20 65 72 72 6f 72 20 72 75 6c 65 2e 20 20 49 6e   error rule.  In
99e0: 20 74 68 61 74 20 63 61 73 65 2c 20 74 61 6b 65   that case, take
99f0: 20 74 68 65 20 61 63 74 69 6f 6e 20 77 68 69 63   the action whic
9a00: 68 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20 61 73  h.**   is not as
9a10: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
9a20: 65 20 65 72 72 6f 72 20 72 75 6c 65 2e 20 20 49  e error rule.  I
9a30: 66 20 6e 65 69 74 68 65 72 20 6f 72 20 62 6f 74  f neither or bot
9a40: 68 0a 2a 2a 20 20 20 61 63 74 69 6f 6e 73 20 61  h.**   actions a
9a50: 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
9a60: 74 68 20 61 6e 20 65 72 72 6f 72 20 72 75 6c 65  th an error rule
9a70: 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 0a 2a 2a  , then try to.**
9a80: 20 20 20 75 73 65 20 70 72 65 63 65 64 65 6e 63     use precedenc
9a90: 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65  e to resolve the
9aa0: 20 63 6f 6e 66 6c 69 63 74 2e 0a 2a 2a 0a 2a 2a   conflict..**.**
9ab0: 20 49 66 20 65 69 74 68 65 72 20 61 63 74 69 6f   If either actio
9ac0: 6e 20 69 73 20 61 20 53 48 49 46 54 2c 20 74 68  n is a SHIFT, th
9ad0: 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20 61 70  en it must be ap
9ae0: 78 2e 20 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  x.  This.** func
9af0: 74 69 6f 6e 20 77 6f 6e 27 74 20 77 6f 72 6b 20  tion won't work 
9b00: 69 66 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45  if apx->type==RE
9b10: 44 55 43 45 20 61 6e 64 20 61 70 79 2d 3e 74 79  DUCE and apy->ty
9b20: 70 65 3d 3d 53 48 49 46 54 2e 0a 2a 2f 0a 73 74  pe==SHIFT..*/.st
9b30: 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65  atic int resolve
9b40: 5f 63 6f 6e 66 6c 69 63 74 28 0a 20 20 73 74 72  _conflict(.  str
9b50: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 78 2c  uct action *apx,
9b60: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
9b70: 20 2a 61 70 79 0a 29 7b 0a 20 20 73 74 72 75 63   *apy.){.  struc
9b80: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a  t symbol *spx, *
9b90: 73 70 79 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e  spy;.  int errcn
9ba0: 74 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  t = 0;.  assert(
9bb0: 20 61 70 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73   apx->sp==apy->s
9bc0: 70 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69  p );  /* Otherwi
9bd0: 73 65 20 74 68 65 72 65 20 77 6f 75 6c 64 20 62  se there would b
9be0: 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  e no conflict */
9bf0: 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65  .  if( apx->type
9c00: 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79 2d 3e  ==SHIFT && apy->
9c10: 74 79 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20  type==SHIFT ){. 
9c20: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 53     apy->type = S
9c30: 53 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 65  SCONFLICT;.    e
9c40: 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69  rrcnt++;.  }.  i
9c50: 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48  f( apx->type==SH
9c60: 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70 65  IFT && apy->type
9c70: 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  ==REDUCE ){.    
9c80: 73 70 78 20 3d 20 61 70 78 2d 3e 73 70 3b 0a 20  spx = apx->sp;. 
9c90: 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e     spy = apy->x.
9ca0: 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20  rp->precsym;.   
9cb0: 20 69 66 28 20 73 70 79 3d 3d 30 20 7c 7c 20 73   if( spy==0 || s
9cc0: 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70  px->prec<0 || sp
9cd0: 79 2d 3e 70 72 65 63 3c 30 20 29 7b 0a 20 20 20  y->prec<0 ){.   
9ce0: 20 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f 75 67 68     /* Not enough
9cf0: 20 70 72 65 63 65 64 65 6e 63 65 20 69 6e 66 6f   precedence info
9d00: 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  rmation. */.    
9d10: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 53 52    apy->type = SR
9d20: 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20  CONFLICT;.      
9d30: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65  errcnt++;.    }e
9d40: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
9d50: 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 20 20  c>spy->prec ){  
9d60: 20 20 2f 2a 20 68 69 67 68 65 72 20 70 72 65 63    /* higher prec
9d70: 65 64 65 6e 63 65 20 77 69 6e 73 20 2a 2f 0a 20  edence wins */. 
9d80: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
9d90: 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   RD_RESOLVED;.  
9da0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
9db0: 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20  >prec<spy->prec 
9dc0: 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  ){.      apx->ty
9dd0: 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44  pe = SH_RESOLVED
9de0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9df0: 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e  spx->prec==spy->
9e00: 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73  prec && spx->ass
9e10: 6f 63 3d 3d 52 49 47 48 54 20 29 7b 20 2f 2a 20  oc==RIGHT ){ /* 
9e20: 55 73 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  Use operator */.
9e30: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20        apy->type 
9e40: 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 20 20  = RD_RESOLVED;  
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 73             /* as
9e70: 73 6f 63 69 61 74 69 76 69 74 79 20 2a 2f 0a 20  sociativity */. 
9e80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78     }else if( spx
9e90: 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65  ->prec==spy->pre
9ea0: 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d  c && spx->assoc=
9eb0: 3d 4c 45 46 54 20 29 7b 20 20 2f 2a 20 74 6f 20  =LEFT ){  /* to 
9ec0: 62 72 65 61 6b 20 74 69 65 20 2a 2f 0a 20 20 20  break tie */.   
9ed0: 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 53     apx->type = S
9ee0: 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20  H_RESOLVED;.    
9ef0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
9f00: 65 72 74 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d  ert( spx->prec==
9f10: 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78  spy->prec && spx
9f20: 2d 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b  ->assoc==NONE );
9f30: 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65  .      apx->type
9f40: 20 3d 20 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a   = ERROR;.    }.
9f50: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70 78 2d    }else if( apx-
9f60: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26  >type==REDUCE &&
9f70: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44 55   apy->type==REDU
9f80: 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d 20  CE ){.    spx = 
9f90: 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73  apx->x.rp->precs
9fa0: 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d 20 61 70  ym;.    spy = ap
9fb0: 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d  y->x.rp->precsym
9fc0: 3b 0a 20 20 20 20 69 66 28 20 73 70 78 3d 3d 30  ;.    if( spx==0
9fd0: 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70   || spy==0 || sp
9fe0: 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a 20 20 20  x->prec<0 ||.   
9ff0: 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 7c 7c 20   spy->prec<0 || 
a000: 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e  spx->prec==spy->
a010: 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70  prec ){.      ap
a020: 79 2d 3e 74 79 70 65 20 3d 20 52 52 43 4f 4e 46  y->type = RRCONF
a030: 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63  LICT;.      errc
a040: 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  nt++;.    }else 
a050: 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73 70  if( spx->prec>sp
a060: 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20  y->prec ){.     
a070: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f   apy->type = RD_
a080: 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65  RESOLVED;.    }e
a090: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
a0a0: 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  c<spy->prec ){. 
a0b0: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d       apx->type =
a0c0: 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   RD_RESOLVED;.  
a0d0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
a0e0: 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
a0f0: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45  apx->type==SH_RE
a100: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
a110: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45  apx->type==RD_RE
a120: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
a130: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e  apx->type==SSCON
a140: 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61  FLICT ||.      a
a150: 70 78 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46  px->type==SRCONF
a160: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
a170: 78 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c  x->type==RRCONFL
a180: 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  ICT ||.      apy
a190: 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c  ->type==SH_RESOL
a1a0: 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  VED ||.      apy
a1b0: 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c  ->type==RD_RESOL
a1c0: 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  VED ||.      apy
a1d0: 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49  ->type==SSCONFLI
a1e0: 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d  CT ||.      apy-
a1f0: 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43  >type==SRCONFLIC
a200: 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e  T ||.      apy->
a210: 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54  type==RRCONFLICT
a220: 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f 2a 20 54  .    );.    /* T
a230: 68 65 20 52 45 44 55 43 45 2f 53 48 49 46 54 20  he REDUCE/SHIFT 
a240: 63 61 73 65 20 63 61 6e 6e 6f 74 20 68 61 70 70  case cannot happ
a250: 65 6e 20 62 65 63 61 75 73 65 20 53 48 49 46 54  en because SHIFT
a260: 73 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a 20 20  s come before.  
a270: 20 20 2a 2a 20 52 45 44 55 43 45 73 20 6f 6e 20    ** REDUCEs on 
a280: 74 68 65 20 6c 69 73 74 2e 20 20 49 66 20 77 65  the list.  If we
a290: 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
a2a0: 74 20 69 74 20 6d 75 73 74 20 62 65 20 62 65 63  t it must be bec
a2b0: 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ause.    ** the 
a2c0: 70 61 72 73 65 72 20 63 6f 6e 66 6c 69 63 74 20  parser conflict 
a2d0: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
a2e0: 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20   resolved. */.  
a2f0: 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e  }.  return errcn
a300: 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t;.}./**********
a310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
a320: 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69   the file "confi
a330: 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  glist.c" *******
a340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a350: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  **/./*.** Routin
a360: 65 73 20 74 6f 20 70 72 6f 63 65 73 73 69 6e 67  es to processing
a370: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
a380: 20 6c 69 73 74 20 61 6e 64 20 62 75 69 6c 64 69   list and buildi
a390: 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a 20 69 6e  ng a state.** in
a3a0: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
a3b0: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
a3c0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
a3d0: 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69 73 74 20  onfig *freelist 
a3e0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  = 0;      /* Lis
a3f0: 74 20 6f 66 20 66 72 65 65 20 63 6f 6e 66 69 67  t of free config
a400: 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  urations */.stat
a410: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
a420: 20 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   *current = 0;  
a430: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c       /* Top of l
a440: 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61  ist of configura
a450: 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
a460: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a  struct config **
a470: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 20  currentend = 0; 
a480: 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c 69 73    /* Last on lis
a490: 74 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a 2f 0a  t of configs */.
a4a0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f  static struct co
a4b0: 6e 66 69 67 20 2a 62 61 73 69 73 20 3d 20 30 3b  nfig *basis = 0;
a4c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
a4d0: 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73  of list of basis
a4e0: 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74   configs */.stat
a4f0: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
a500: 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20 30 3b   **basisend = 0;
a510: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c       /* End of l
a520: 69 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e  ist of basis con
a530: 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74 75  figs */../* Retu
a540: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
a550: 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74  a new configurat
a560: 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 73  ion */.PRIVATE s
a570: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
a580: 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20 73 74 72  wconfig(){.  str
a590: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63  uct config *newc
a5a0: 66 67 3b 0a 20 20 69 66 28 20 66 72 65 65 6c 69  fg;.  if( freeli
a5b0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  st==0 ){.    int
a5c0: 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   i;.    int amt 
a5d0: 3d 20 33 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  = 3;.    freelis
a5e0: 74 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  t = (struct conf
a5f0: 69 67 20 2a 29 63 61 6c 6c 6f 63 28 20 61 6d 74  ig *)calloc( amt
a600: 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  , sizeof(struct 
a610: 63 6f 6e 66 69 67 29 20 29 3b 0a 20 20 20 20 69  config) );.    i
a620: 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29  f( freelist==0 )
a630: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
a640: 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74  stderr,"Unable t
a650: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
a660: 79 20 66 6f 72 20 61 20 6e 65 77 20 63 6f 6e 66  y for a new conf
a670: 69 67 75 72 61 74 69 6f 6e 2e 22 29 3b 0a 20 20  iguration.");.  
a680: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
a690: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
a6a0: 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72  i<amt-1; i++) fr
a6b0: 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d  eelist[i].next =
a6c0: 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b   &freelist[i+1];
a6d0: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d  .    freelist[am
a6e0: 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20  t-1].next = 0;. 
a6f0: 20 7d 0a 20 20 6e 65 77 63 66 67 20 3d 20 66 72   }.  newcfg = fr
a700: 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69  eelist;.  freeli
a710: 73 74 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e  st = freelist->n
a720: 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65  ext;.  return ne
a730: 77 63 66 67 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  wcfg;.}../* The 
a740: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 6f  configuration "o
a750: 6c 64 22 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  ld" is no longer
a760: 20 75 73 65 64 20 2a 2f 0a 50 52 49 56 41 54 45   used */.PRIVATE
a770: 20 76 6f 69 64 20 64 65 6c 65 74 65 63 6f 6e 66   void deleteconf
a780: 69 67 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ig(struct config
a790: 20 2a 6f 6c 64 29 0a 7b 0a 20 20 6f 6c 64 2d 3e   *old).{.  old->
a7a0: 6e 65 78 74 20 3d 20 66 72 65 65 6c 69 73 74 3b  next = freelist;
a7b0: 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 6f 6c  .  freelist = ol
a7c0: 64 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c  d;.}../* Initial
a7d0: 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69 67 75  ized the configu
a7e0: 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c  ration list buil
a7f0: 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  der */.void Conf
a800: 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 7b 0a 20  iglist_init(){. 
a810: 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20   current = 0;.  
a820: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 75  currentend = &cu
a830: 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d  rrent;.  basis =
a840: 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d   0;.  basisend =
a850: 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69   &basis;.  Confi
a860: 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 3b 0a 20  gtable_init();. 
a870: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49   return;.}../* I
a880: 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63  nitialized the c
a890: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
a8a0: 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69  t builder */.voi
a8b0: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73  d Configlist_res
a8c0: 65 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20  et(){.  current 
a8d0: 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e  = 0;.  currenten
a8e0: 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20  d = &current;.  
a8f0: 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73  basis = 0;.  bas
a900: 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a  isend = &basis;.
a910: 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c    Configtable_cl
a920: 65 61 72 28 30 29 3b 0a 20 20 72 65 74 75 72 6e  ear(0);.  return
a930: 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f 74  ;.}../* Add anot
a940: 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  her configuratio
a950: 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75  n to the configu
a960: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73  ration list */.s
a970: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
a980: 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 0a 20 20  nfiglist_add(.  
a990: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
a9a0: 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 20      /* The rule 
a9b0: 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 20 20 20 20  */.  int dot    
a9c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
a9d0: 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53 20 6f  x into the RHS o
a9e0: 66 20 74 68 65 20 72 75 6c 65 20 77 68 65 72 65  f the rule where
a9f0: 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20 2a 2f   the dot goes */
aa00: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  .){.  struct con
aa10: 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b  fig *cfp, model;
aa20: 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72  ..  assert( curr
aa30: 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d  entend!=0 );.  m
aa40: 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20  odel.rp = rp;.  
aa50: 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b  model.dot = dot;
aa60: 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74  .  cfp = Configt
aa70: 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c  able_find(&model
aa80: 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20  );.  if( cfp==0 
aa90: 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77  ){.    cfp = new
aaa0: 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66  config();.    cf
aab0: 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20  p->rp = rp;.    
aac0: 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a  cfp->dot = dot;.
aad0: 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53      cfp->fws = S
aae0: 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70  etNew();.    cfp
aaf0: 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63  ->stp = 0;.    c
ab00: 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e  fp->fplp = cfp->
ab10: 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66  bplp = 0;.    cf
ab20: 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20  p->next = 0;.   
ab30: 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20   cfp->bp = 0;.  
ab40: 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20    *currentend = 
ab50: 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74  cfp;.    current
ab60: 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74  end = &cfp->next
ab70: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c  ;.    Configtabl
ab80: 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20  e_insert(cfp);. 
ab90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b   }.  return cfp;
aba0: 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62 61 73  .}../* Add a bas
abb0: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
abc0: 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72   to the configur
abd0: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74  ation list */.st
abe0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
abf0: 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73  figlist_addbasis
ac00: 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70  (struct rule *rp
ac10: 2c 20 69 6e 74 20 64 6f 74 29 0a 7b 0a 20 20 73  , int dot).{.  s
ac20: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
ac30: 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73  p, model;..  ass
ac40: 65 72 74 28 20 62 61 73 69 73 65 6e 64 21 3d 30  ert( basisend!=0
ac50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
ac60: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
ac70: 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a   model.rp = rp;.
ac80: 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f    model.dot = do
ac90: 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  t;.  cfp = Confi
aca0: 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64  gtable_find(&mod
acb0: 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d  el);.  if( cfp==
acc0: 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e  0 ){.    cfp = n
acd0: 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20  ewconfig();.    
ace0: 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20  cfp->rp = rp;.  
acf0: 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74    cfp->dot = dot
ad00: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d  ;.    cfp->fws =
ad10: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63   SetNew();.    c
ad20: 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20  fp->stp = 0;.   
ad30: 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70   cfp->fplp = cfp
ad40: 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20  ->bplp = 0;.    
ad50: 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20  cfp->next = 0;. 
ad60: 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a     cfp->bp = 0;.
ad70: 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20      *currentend 
ad80: 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65  = cfp;.    curre
ad90: 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65  ntend = &cfp->ne
ada0: 78 74 3b 0a 20 20 20 20 2a 62 61 73 69 73 65 6e  xt;.    *basisen
adb0: 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 62 61 73  d = cfp;.    bas
adc0: 69 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e 62 70  isend = &cfp->bp
add0: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c  ;.    Configtabl
ade0: 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20  e_insert(cfp);. 
adf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b   }.  return cfp;
ae00: 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74  .}../* Compute t
ae10: 68 65 20 63 6c 6f 73 75 72 65 20 6f 66 20 74 68  he closure of th
ae20: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
ae30: 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  list */.void Con
ae40: 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28  figlist_closure(
ae50: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
ae60: 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63  mp).{.  struct c
ae70: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6e 65 77  onfig *cfp, *new
ae80: 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75  cfp;.  struct ru
ae90: 6c 65 20 2a 72 70 2c 20 2a 6e 65 77 72 70 3b 0a  le *rp, *newrp;.
aea0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
aeb0: 2a 73 70 2c 20 2a 78 73 70 3b 0a 20 20 69 6e 74  *sp, *xsp;.  int
aec0: 20 69 2c 20 64 6f 74 3b 0a 0a 20 20 61 73 73 65   i, dot;..  asse
aed0: 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d  rt( currentend!=
aee0: 30 20 29 3b 0a 20 20 66 6f 72 28 63 66 70 3d 63  0 );.  for(cfp=c
aef0: 75 72 72 65 6e 74 3b 20 63 66 70 3b 20 63 66 70  urrent; cfp; cfp
af00: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
af10: 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20   rp = cfp->rp;. 
af20: 20 20 20 64 6f 74 20 3d 20 63 66 70 2d 3e 64 6f     dot = cfp->do
af30: 74 3b 0a 20 20 20 20 69 66 28 20 64 6f 74 3e 3d  t;.    if( dot>=
af40: 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69  rp->nrhs ) conti
af50: 6e 75 65 3b 0a 20 20 20 20 73 70 20 3d 20 72 70  nue;.    sp = rp
af60: 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20 20 20 20  ->rhs[dot];.    
af70: 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f  if( sp->type==NO
af80: 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  NTERMINAL ){.   
af90: 20 20 20 69 66 28 20 73 70 2d 3e 72 75 6c 65 3d     if( sp->rule=
afa0: 3d 30 20 26 26 20 73 70 21 3d 6c 65 6d 70 2d 3e  =0 && sp!=lemp->
afb0: 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20  errsym ){.      
afc0: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
afd0: 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69  >filename,rp->li
afe0: 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20  ne,"Nonterminal 
aff0: 5c 22 25 73 5c 22 20 68 61 73 20 6e 6f 20 72 75  \"%s\" has no ru
b000: 6c 65 73 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  les.",.         
b010: 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
b020: 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
b030: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt++;.      }.  
b040: 20 20 20 20 66 6f 72 28 6e 65 77 72 70 3d 73 70      for(newrp=sp
b050: 2d 3e 72 75 6c 65 3b 20 6e 65 77 72 70 3b 20 6e  ->rule; newrp; n
b060: 65 77 72 70 3d 6e 65 77 72 70 2d 3e 6e 65 78 74  ewrp=newrp->next
b070: 6c 68 73 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  lhs){.        ne
b080: 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73  wcfp = Configlis
b090: 74 5f 61 64 64 28 6e 65 77 72 70 2c 30 29 3b 0a  t_add(newrp,0);.
b0a0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 64 6f          for(i=do
b0b0: 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  t+1; i<rp->nrhs;
b0c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
b0d0: 20 78 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   xsp = rp->rhs[i
b0e0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
b0f0: 20 78 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d   xsp->type==TERM
b100: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
b110: 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66      SetAdd(newcf
b120: 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 69 6e 64 65  p->fws,xsp->inde
b130: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x);.            
b140: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
b150: 20 7d 65 6c 73 65 20 69 66 28 20 78 73 70 2d 3e   }else if( xsp->
b160: 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
b170: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
b180: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
b190: 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
b1a0: 3c 78 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b  <xsp->nsubsym; k
b1b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
b1c0: 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70     SetAdd(newcfp
b1d0: 2d 3e 66 77 73 2c 20 78 73 70 2d 3e 73 75 62 73  ->fws, xsp->subs
b1e0: 79 6d 5b 6b 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20  ym[k]->index);. 
b1f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
b200: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b210: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
b220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74  .            Set
b230: 55 6e 69 6f 6e 28 6e 65 77 63 66 70 2d 3e 66 77  Union(newcfp->fw
b240: 73 2c 78 73 70 2d 3e 66 69 72 73 74 73 65 74 29  s,xsp->firstset)
b250: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
b260: 28 20 78 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c  ( xsp->lambda==L
b270: 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65  EMON_FALSE ) bre
b280: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
b290: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b2a0: 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68    if( i==rp->nrh
b2b0: 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28 26 63  s ) Plink_add(&c
b2c0: 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66 70 29  fp->fplp,newcfp)
b2d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b2e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a    }.  return;.}.
b2f0: 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e  ./* Sort the con
b300: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
b310: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
b320: 73 74 5f 73 6f 72 74 28 29 7b 0a 20 20 63 75 72  st_sort(){.  cur
b330: 72 65 6e 74 20 3d 20 28 73 74 72 75 63 74 20 63  rent = (struct c
b340: 6f 6e 66 69 67 2a 29 6d 73 6f 72 74 28 28 63 68  onfig*)msort((ch
b350: 61 72 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61  ar*)current,(cha
b360: 72 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 6e  r**)&(current->n
b370: 65 78 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ext),.          
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 20 20 20 20 20 20 20 20 43 6f 6e 66 69 67 63 6d          Configcm
b3a0: 70 29 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64  p);.  currentend
b3b0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a   = 0;.  return;.
b3c0: 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 62  }../* Sort the b
b3d0: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
b3e0: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20  on list */.void 
b3f0: 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62  Configlist_sortb
b400: 61 73 69 73 28 29 7b 0a 20 20 62 61 73 69 73 20  asis(){.  basis 
b410: 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  = (struct config
b420: 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 2a 29 63  *)msort((char*)c
b430: 75 72 72 65 6e 74 2c 28 63 68 61 72 2a 2a 29 26  urrent,(char**)&
b440: 28 63 75 72 72 65 6e 74 2d 3e 62 70 29 2c 0a 20  (current->bp),. 
b450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
b470: 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20 62 61 73  onfigcmp);.  bas
b480: 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74  isend = 0;.  ret
b490: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  urn;.}../* Retur
b4a0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
b4b0: 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 63  he head of the c
b4c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
b4d0: 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74  t and.** reset t
b4e0: 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63  he list */.struc
b4f0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
b500: 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 7b 0a 20  list_return(){. 
b510: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
b520: 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 63 75 72  old;.  old = cur
b530: 72 65 6e 74 3b 0a 20 20 63 75 72 72 65 6e 74 20  rent;.  current 
b540: 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e  = 0;.  currenten
b550: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
b560: 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  old;.}../* Retur
b570: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
b580: 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 63  he head of the c
b590: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
b5a0: 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74  t and.** reset t
b5b0: 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63  he list */.struc
b5c0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
b5d0: 6c 69 73 74 5f 62 61 73 69 73 28 29 7b 0a 20 20  list_basis(){.  
b5e0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f  struct config *o
b5f0: 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 62 61 73 69  ld;.  old = basi
b600: 73 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a  s;.  basis = 0;.
b610: 20 20 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a    basisend = 0;.
b620: 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a    return old;.}.
b630: 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 65 6c 65  ./* Free all ele
b640: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 67 69 76  ments of the giv
b650: 65 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  en configuration
b660: 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f   list */.void Co
b670: 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 73 74 72  nfiglist_eat(str
b680: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 29  uct config *cfp)
b690: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
b6a0: 69 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66  ig *nextcfp;.  f
b6b0: 6f 72 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65  or(; cfp; cfp=ne
b6c0: 78 74 63 66 70 29 7b 0a 20 20 20 20 6e 65 78 74  xtcfp){.    next
b6d0: 63 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b  cfp = cfp->next;
b6e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 66 70  .    assert( cfp
b6f0: 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20  ->fplp==0 );.   
b700: 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e 62 70   assert( cfp->bp
b710: 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  lp==0 );.    if(
b720: 20 63 66 70 2d 3e 66 77 73 20 29 20 53 65 74 46   cfp->fws ) SetF
b730: 72 65 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20  ree(cfp->fws);. 
b740: 20 20 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28     deleteconfig(
b750: 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  cfp);.  }.  retu
b760: 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  rn;.}./*********
b770: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
b780: 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 63 22  e file "error.c"
b790: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
b7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b7b0: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66  **/./*.** Code f
b7c0: 6f 72 20 70 72 69 6e 74 69 6e 67 20 65 72 72 6f  or printing erro
b7d0: 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 76  r message..*/..v
b7e0: 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f 6e  oid ErrorMsg(con
b7f0: 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  st char *filenam
b800: 65 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63  e, int lineno, c
b810: 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72 6d 61  onst char *forma
b820: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
b830: 73 74 20 61 70 3b 0a 20 20 66 70 72 69 6e 74 66  st ap;.  fprintf
b840: 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
b850: 20 22 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 6c 69   ", filename, li
b860: 6e 65 6e 6f 29 3b 0a 20 20 76 61 5f 73 74 61 72  neno);.  va_star
b870: 74 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20  t(ap, format);. 
b880: 20 76 66 70 72 69 6e 74 66 28 73 74 64 65 72 72   vfprintf(stderr
b890: 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76  ,format,ap);.  v
b8a0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 70 72  a_end(ap);.  fpr
b8b0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e  intf(stderr, "\n
b8c0: 22 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ");.}./*********
b8d0: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
b8e0: 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a   file "main.c" *
b8f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b910: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20  ***/./*.** Main 
b920: 70 72 6f 67 72 61 6d 20 66 69 6c 65 20 66 6f 72  program file for
b930: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
b940: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
b950: 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75  ./* Report an ou
b960: 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64  t-of-memory cond
b970: 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e  ition and abort.
b980: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a    This function.
b990: 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f 73 74 6c  ** is used mostl
b9a0: 79 20 62 79 20 74 68 65 20 22 4d 65 6d 6f 72 79  y by the "Memory
b9b0: 43 68 65 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20  Check" macro in 
b9c0: 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64  struct.h.*/.void
b9d0: 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 7b   memory_error(){
b9e0: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
b9f0: 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
ba00: 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e  .  Aborting...\n
ba10: 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d  ");.  exit(1);.}
ba20: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 44 65  ..static int nDe
ba30: 66 69 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 2f  fine = 0;      /
ba40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 2d 44 20 6f  * Number of -D o
ba50: 70 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 63 6f  ptions on the co
ba60: 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 73 74  mmand line */.st
ba70: 61 74 69 63 20 63 68 61 72 20 2a 2a 61 7a 44 65  atic char **azDe
ba80: 66 69 6e 65 20 3d 20 30 3b 20 20 2f 2a 20 4e 61  fine = 0;  /* Na
ba90: 6d 65 20 6f 66 20 74 68 65 20 2d 44 20 6d 61 63  me of the -D mac
baa0: 72 6f 73 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20  ros */../* This 
bab0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
bac0: 64 20 77 69 74 68 20 74 68 65 20 61 72 67 75 6d  d with the argum
bad0: 65 6e 74 20 74 6f 20 65 61 63 68 20 2d 44 20 63  ent to each -D c
bae0: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
baf0: 6f 6e 2e 0a 2a 2a 20 41 64 64 20 74 68 65 20 6d  on..** Add the m
bb00: 61 63 72 6f 20 64 65 66 69 6e 65 64 20 74 6f 20  acro defined to 
bb10: 74 68 65 20 61 7a 44 65 66 69 6e 65 20 61 72 72  the azDefine arr
bb20: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
bb30: 69 64 20 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69  id handle_D_opti
bb40: 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  on(char *z){.  c
bb50: 68 61 72 20 2a 2a 70 61 7a 3b 0a 20 20 6e 44 65  har **paz;.  nDe
bb60: 66 69 6e 65 2b 2b 3b 0a 20 20 61 7a 44 65 66 69  fine++;.  azDefi
bb70: 6e 65 20 3d 20 28 63 68 61 72 20 2a 2a 29 20 72  ne = (char **) r
bb80: 65 61 6c 6c 6f 63 28 61 7a 44 65 66 69 6e 65 2c  ealloc(azDefine,
bb90: 20 73 69 7a 65 6f 66 28 61 7a 44 65 66 69 6e 65   sizeof(azDefine
bba0: 5b 30 5d 29 2a 6e 44 65 66 69 6e 65 29 3b 0a 20  [0])*nDefine);. 
bbb0: 20 69 66 28 20 61 7a 44 65 66 69 6e 65 3d 3d 30   if( azDefine==0
bbc0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
bbd0: 73 74 64 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d  stderr,"out of m
bbe0: 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65  emory\n");.    e
bbf0: 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 70 61  xit(1);.  }.  pa
bc00: 7a 20 3d 20 26 61 7a 44 65 66 69 6e 65 5b 6e 44  z = &azDefine[nD
bc10: 65 66 69 6e 65 2d 31 5d 3b 0a 20 20 2a 70 61 7a  efine-1];.  *paz
bc20: 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c   = (char *) mall
bc30: 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
bc40: 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28 20 2a 70  z)+1 );.  if( *p
bc50: 61 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  az==0 ){.    fpr
bc60: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74  intf(stderr,"out
bc70: 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a   of memory\n");.
bc80: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
bc90: 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28  .  lemon_strcpy(
bca0: 2a 70 61 7a 2c 20 7a 29 3b 0a 20 20 66 6f 72 28  *paz, z);.  for(
bcb0: 7a 3d 2a 70 61 7a 3b 20 2a 7a 20 26 26 20 2a 7a  z=*paz; *z && *z
bcc0: 21 3d 27 3d 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20  !='='; z++){}.  
bcd0: 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  *z = 0;.}..stati
bce0: 63 20 63 68 61 72 20 2a 75 73 65 72 5f 74 65 6d  c char *user_tem
bcf0: 70 6c 61 74 65 6e 61 6d 65 20 3d 20 4e 55 4c 4c  platename = NULL
bd00: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68 61  ;.static void ha
bd10: 6e 64 6c 65 5f 54 5f 6f 70 74 69 6f 6e 28 63 68  ndle_T_option(ch
bd20: 61 72 20 2a 7a 29 7b 0a 20 20 75 73 65 72 5f 74  ar *z){.  user_t
bd30: 65 6d 70 6c 61 74 65 6e 61 6d 65 20 3d 20 28 63  emplatename = (c
bd40: 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c  har *) malloc( l
bd50: 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b 31 20  emonStrlen(z)+1 
bd60: 29 3b 0a 20 20 69 66 28 20 75 73 65 72 5f 74 65  );.  if( user_te
bd70: 6d 70 6c 61 74 65 6e 61 6d 65 3d 3d 30 20 29 7b  mplatename==0 ){
bd80: 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  .    memory_erro
bd90: 72 28 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e  r();.  }.  lemon
bda0: 5f 73 74 72 63 70 79 28 75 73 65 72 5f 74 65 6d  _strcpy(user_tem
bdb0: 70 6c 61 74 65 6e 61 6d 65 2c 20 7a 29 3b 0a 7d  platename, z);.}
bdc0: 0a 0a 2f 2a 20 66 6f 72 77 61 72 64 20 72 65 66  ../* forward ref
bdd0: 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63  erence */.static
bde0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e   const char *min
bdf0: 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69  imum_size_type(i
be00: 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 2c  nt lwr, int upr,
be10: 20 69 6e 74 20 2a 70 6e 42 79 74 65 29 3b 0a 0a   int *pnByte);..
be20: 2f 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c  /* Print a singl
be30: 65 20 6c 69 6e 65 20 6f 66 20 74 68 65 20 22 50  e line of the "P
be40: 61 72 73 65 72 20 53 74 61 74 73 22 20 6f 75 74  arser Stats" out
be50: 70 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  put.*/.static vo
be60: 69 64 20 73 74 61 74 73 5f 6c 69 6e 65 28 63 6f  id stats_line(co
be70: 6e 73 74 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c  nst char *zLabel
be80: 2c 20 69 6e 74 20 69 56 61 6c 75 65 29 7b 0a 20  , int iValue){. 
be90: 20 69 6e 74 20 6e 4c 61 62 65 6c 20 3d 20 6c 65   int nLabel = le
bea0: 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4c 61 62 65 6c  monStrlen(zLabel
beb0: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 20 25  );.  printf("  %
bec0: 73 25 2e 2a 73 20 25 35 64 5c 6e 22 2c 20 7a 4c  s%.*s %5d\n", zL
bed0: 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 33  abel,.         3
bee0: 35 2d 6e 4c 61 62 65 6c 2c 20 22 2e 2e 2e 2e 2e  5-nLabel, ".....
bef0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
bf00: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 22 2c 0a 20 20  ...........",.  
bf10: 20 20 20 20 20 20 20 69 56 61 6c 75 65 29 3b 0a         iValue);.
bf20: 7d 0a 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70  }../* The main p
bf30: 72 6f 67 72 61 6d 2e 20 20 50 61 72 73 65 20 74  rogram.  Parse t
bf40: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
bf50: 61 6e 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a  and do it... */.
bf60: 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67  int main(int arg
bf70: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 0a  c, char **argv).
bf80: 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 76  {.  static int v
bf90: 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74  ersion = 0;.  st
bfa0: 61 74 69 63 20 69 6e 74 20 72 70 66 6c 61 67 20  atic int rpflag 
bfb0: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
bfc0: 74 20 62 61 73 69 73 66 6c 61 67 20 3d 20 30 3b  t basisflag = 0;
bfd0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f  .  static int co
bfe0: 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 73 74  mpress = 0;.  st
bff0: 61 74 69 63 20 69 6e 74 20 71 75 69 65 74 20 3d  atic int quiet =
c000: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
c010: 20 73 74 61 74 69 73 74 69 63 73 20 3d 20 30 3b   statistics = 0;
c020: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6d 68  .  static int mh
c030: 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74  flag = 0;.  stat
c040: 69 63 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73  ic int nolinenos
c050: 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74  flag = 0;.  stat
c060: 69 63 20 69 6e 74 20 6e 6f 52 65 73 6f 72 74 20  ic int noResort 
c070: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74  = 0;.  static st
c080: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f  ruct s_options o
c090: 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20  ptions[] = {.   
c0a0: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c   {OPT_FLAG, "b",
c0b0: 20 28 63 68 61 72 2a 29 26 62 61 73 69 73 66 6c   (char*)&basisfl
c0c0: 61 67 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20  ag, "Print only 
c0d0: 74 68 65 20 62 61 73 69 73 20 69 6e 20 72 65 70  the basis in rep
c0e0: 6f 72 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ort."},.    {OPT
c0f0: 5f 46 4c 41 47 2c 20 22 63 22 2c 20 28 63 68 61  _FLAG, "c", (cha
c100: 72 2a 29 26 63 6f 6d 70 72 65 73 73 2c 20 22 44  r*)&compress, "D
c110: 6f 6e 27 74 20 63 6f 6d 70 72 65 73 73 20 74 68  on't compress th
c120: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22  e action table."
c130: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52  },.    {OPT_FSTR
c140: 2c 20 22 44 22 2c 20 28 63 68 61 72 2a 29 68 61  , "D", (char*)ha
c150: 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22  ndle_D_option, "
c160: 44 65 66 69 6e 65 20 61 6e 20 25 69 66 64 65 66  Define an %ifdef
c170: 20 6d 61 63 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b   macro."},.    {
c180: 4f 50 54 5f 46 53 54 52 2c 20 22 66 22 2c 20 30  OPT_FSTR, "f", 0
c190: 2c 20 22 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c  , "Ignored.  (Pl
c1a0: 61 63 65 68 6f 6c 64 65 72 20 66 6f 72 20 2d 66  aceholder for -f
c1b0: 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e   compiler option
c1c0: 73 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  s.)"},.    {OPT_
c1d0: 46 4c 41 47 2c 20 22 67 22 2c 20 28 63 68 61 72  FLAG, "g", (char
c1e0: 2a 29 26 72 70 66 6c 61 67 2c 20 22 50 72 69 6e  *)&rpflag, "Prin
c1f0: 74 20 67 72 61 6d 6d 61 72 20 77 69 74 68 6f 75  t grammar withou
c200: 74 20 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20  t actions."},.  
c210: 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 49 22    {OPT_FSTR, "I"
c220: 2c 20 30 2c 20 22 49 67 6e 6f 72 65 64 2e 20 20  , 0, "Ignored.  
c230: 28 50 6c 61 63 65 68 6f 6c 64 65 72 20 66 6f 72  (Placeholder for
c240: 20 27 2d 49 27 20 63 6f 6d 70 69 6c 65 72 20 6f   '-I' compiler o
c250: 70 74 69 6f 6e 73 2e 29 22 7d 2c 0a 20 20 20 20  ptions.)"},.    
c260: 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c 20  {OPT_FLAG, "m", 
c270: 28 63 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c 20  (char*)&mhflag, 
c280: 22 4f 75 74 70 75 74 20 61 20 6d 61 6b 65 68 65  "Output a makehe
c290: 61 64 65 72 73 20 63 6f 6d 70 61 74 69 62 6c 65  aders compatible
c2a0: 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f   file."},.    {O
c2b0: 50 54 5f 46 4c 41 47 2c 20 22 6c 22 2c 20 28 63  PT_FLAG, "l", (c
c2c0: 68 61 72 2a 29 26 6e 6f 6c 69 6e 65 6e 6f 73 66  har*)&nolinenosf
c2d0: 6c 61 67 2c 20 22 44 6f 20 6e 6f 74 20 70 72 69  lag, "Do not pri
c2e0: 6e 74 20 23 6c 69 6e 65 20 73 74 61 74 65 6d 65  nt #line stateme
c2f0: 6e 74 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  nts."},.    {OPT
c300: 5f 46 53 54 52 2c 20 22 4f 22 2c 20 30 2c 20 22  _FSTR, "O", 0, "
c310: 49 67 6e 6f 72 65 64 2e 20 20 28 50 6c 61 63 65  Ignored.  (Place
c320: 68 6f 6c 64 65 72 20 66 6f 72 20 27 2d 4f 27 20  holder for '-O' 
c330: 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73  compiler options
c340: 2e 29 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  .)"},.    {OPT_F
c350: 4c 41 47 2c 20 22 70 22 2c 20 28 63 68 61 72 2a  LAG, "p", (char*
c360: 29 26 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65  )&showPrecedence
c370: 43 6f 6e 66 6c 69 63 74 2c 0a 20 20 20 20 20 20  Conflict,.      
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
c390: 68 6f 77 20 63 6f 6e 66 6c 69 63 74 73 20 72 65  how conflicts re
c3a0: 73 6f 6c 76 65 64 20 62 79 20 70 72 65 63 65 64  solved by preced
c3b0: 65 6e 63 65 20 72 75 6c 65 73 22 7d 2c 0a 20 20  ence rules"},.  
c3c0: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22    {OPT_FLAG, "q"
c3d0: 2c 20 28 63 68 61 72 2a 29 26 71 75 69 65 74 2c  , (char*)&quiet,
c3e0: 20 22 28 51 75 69 65 74 29 20 44 6f 6e 27 74 20   "(Quiet) Don't 
c3f0: 70 72 69 6e 74 20 74 68 65 20 72 65 70 6f 72 74  print the report
c400: 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f   file."},.    {O
c410: 50 54 5f 46 4c 41 47 2c 20 22 72 22 2c 20 28 63  PT_FLAG, "r", (c
c420: 68 61 72 2a 29 26 6e 6f 52 65 73 6f 72 74 2c 20  har*)&noResort, 
c430: 22 44 6f 20 6e 6f 74 20 73 6f 72 74 20 6f 72 20  "Do not sort or 
c440: 72 65 6e 75 6d 62 65 72 20 73 74 61 74 65 73 22  renumber states"
c450: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
c460: 2c 20 22 73 22 2c 20 28 63 68 61 72 2a 29 26 73  , "s", (char*)&s
c470: 74 61 74 69 73 74 69 63 73 2c 0a 20 20 20 20 20  tatistics,.     
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 50                "P
c4a0: 72 69 6e 74 20 70 61 72 73 65 72 20 73 74 61 74  rint parser stat
c4b0: 73 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75  s to standard ou
c4c0: 74 70 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  tput."},.    {OP
c4d0: 54 5f 46 4c 41 47 2c 20 22 78 22 2c 20 28 63 68  T_FLAG, "x", (ch
c4e0: 61 72 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22 50  ar*)&version, "P
c4f0: 72 69 6e 74 20 74 68 65 20 76 65 72 73 69 6f 6e  rint the version
c500: 20 6e 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20   number."},.    
c510: 7b 4f 50 54 5f 46 53 54 52 2c 20 22 54 22 2c 20  {OPT_FSTR, "T", 
c520: 28 63 68 61 72 2a 29 68 61 6e 64 6c 65 5f 54 5f  (char*)handle_T_
c530: 6f 70 74 69 6f 6e 2c 20 22 53 70 65 63 69 66 79  option, "Specify
c540: 20 61 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65   a template file
c550: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53  ."},.    {OPT_FS
c560: 54 52 2c 20 22 57 22 2c 20 30 2c 20 22 49 67 6e  TR, "W", 0, "Ign
c570: 6f 72 65 64 2e 20 20 28 50 6c 61 63 65 68 6f 6c  ored.  (Placehol
c580: 64 65 72 20 66 6f 72 20 27 2d 57 27 20 63 6f 6d  der for '-W' com
c590: 70 69 6c 65 72 20 6f 70 74 69 6f 6e 73 2e 29 22  piler options.)"
c5a0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
c5b0: 2c 30 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69  ,0,0,0}.  };.  i
c5c0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 69 74  nt i;.  int exit
c5d0: 63 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 6c  code;.  struct l
c5e0: 65 6d 6f 6e 20 6c 65 6d 3b 0a 0a 20 20 4f 70 74  emon lem;..  Opt
c5f0: 49 6e 69 74 28 61 72 67 76 2c 6f 70 74 69 6f 6e  Init(argv,option
c600: 73 2c 73 74 64 65 72 72 29 3b 0a 20 20 69 66 28  s,stderr);.  if(
c610: 20 76 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20   version ){.    
c620: 20 70 72 69 6e 74 66 28 22 4c 65 6d 6f 6e 20 76   printf("Lemon v
c630: 65 72 73 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b 0a  ersion 1.0\n");.
c640: 20 20 20 20 20 65 78 69 74 28 30 29 3b 20 0a 20       exit(0); . 
c650: 20 7d 0a 20 20 69 66 28 20 4f 70 74 4e 41 72 67   }.  if( OptNArg
c660: 73 28 29 21 3d 31 20 29 7b 0a 20 20 20 20 66 70  s()!=1 ){.    fp
c670: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 78  rintf(stderr,"Ex
c680: 61 63 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e 61  actly one filena
c690: 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72  me argument is r
c6a0: 65 71 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20 20  equired.\n");.  
c6b0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
c6c0: 20 6d 65 6d 73 65 74 28 26 6c 65 6d 2c 20 30 2c   memset(&lem, 0,
c6d0: 20 73 69 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a 20   sizeof(lem));. 
c6e0: 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d 20   lem.errorcnt = 
c6f0: 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  0;..  /* Initial
c700: 69 7a 65 20 74 68 65 20 6d 61 63 68 69 6e 65 20  ize the machine 
c710: 2a 2f 0a 20 20 53 74 72 73 61 66 65 5f 69 6e 69  */.  Strsafe_ini
c720: 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e  t();.  Symbol_in
c730: 69 74 28 29 3b 0a 20 20 53 74 61 74 65 5f 69 6e  it();.  State_in
c740: 69 74 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67 76  it();.  lem.argv
c750: 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6c  0 = argv[0];.  l
c760: 65 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f 70  em.filename = Op
c770: 74 41 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e 62  tArg(0);.  lem.b
c780: 61 73 69 73 66 6c 61 67 20 3d 20 62 61 73 69 73  asisflag = basis
c790: 66 6c 61 67 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c 69  flag;.  lem.noli
c7a0: 6e 65 6e 6f 73 66 6c 61 67 20 3d 20 6e 6f 6c 69  nenosflag = noli
c7b0: 6e 65 6e 6f 73 66 6c 61 67 3b 0a 20 20 53 79 6d  nenosflag;.  Sym
c7c0: 62 6f 6c 5f 6e 65 77 28 22 24 22 29 3b 0a 20 20  bol_new("$");.  
c7d0: 6c 65 6d 2e 65 72 72 73 79 6d 20 3d 20 53 79 6d  lem.errsym = Sym
c7e0: 62 6f 6c 5f 6e 65 77 28 22 65 72 72 6f 72 22 29  bol_new("error")
c7f0: 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 2d 3e  ;.  lem.errsym->
c800: 75 73 65 43 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f  useCnt = 0;..  /
c810: 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75  * Parse the inpu
c820: 74 20 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72 73  t file */.  Pars
c830: 65 28 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20 6c  e(&lem);.  if( l
c840: 65 6d 2e 65 72 72 6f 72 63 6e 74 20 29 20 65 78  em.errorcnt ) ex
c850: 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 29  it(lem.errorcnt)
c860: 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 72 75 6c  ;.  if( lem.nrul
c870: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  e==0 ){.    fpri
c880: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 6d 70 74  ntf(stderr,"Empt
c890: 79 20 67 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a  y grammar.\n");.
c8a0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
c8b0: 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 61 6e 64  ..  /* Count and
c8c0: 20 69 6e 64 65 78 20 74 68 65 20 73 79 6d 62 6f   index the symbo
c8d0: 6c 73 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  ls of the gramma
c8e0: 72 20 2a 2f 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65  r */.  Symbol_ne
c8f0: 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a  w("{default}");.
c900: 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20    lem.nsymbol = 
c910: 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a  Symbol_count();.
c920: 20 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20    lem.symbols = 
c930: 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29  Symbol_arrayof()
c940: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
c950: 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  em.nsymbol; i++)
c960: 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d   lem.symbols[i]-
c970: 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 71 73  >index = i;.  qs
c980: 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c  ort(lem.symbols,
c990: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2c 73 69 7a 65  lem.nsymbol,size
c9a0: 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
c9b0: 2a 29 2c 20 53 79 6d 62 6f 6c 63 6d 70 70 29 3b  *), Symbolcmpp);
c9c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
c9d0: 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20  m.nsymbol; i++) 
c9e0: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  lem.symbols[i]->
c9f0: 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 77 68 69  index = i;.  whi
ca00: 6c 65 28 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b  le( lem.symbols[
ca10: 69 2d 31 5d 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54  i-1]->type==MULT
ca20: 49 54 45 52 4d 49 4e 41 4c 20 29 7b 20 69 2d 2d  ITERMINAL ){ i--
ca30: 3b 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 74  ; }.  assert( st
ca40: 72 63 6d 70 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73  rcmp(lem.symbols
ca50: 5b 69 2d 31 5d 2d 3e 6e 61 6d 65 2c 22 7b 64 65  [i-1]->name,"{de
ca60: 66 61 75 6c 74 7d 22 29 3d 3d 30 20 29 3b 0a 20  fault}")==0 );. 
ca70: 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 69   lem.nsymbol = i
ca80: 20 2d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b   - 1;.  for(i=1;
ca90: 20 69 73 75 70 70 65 72 28 6c 65 6d 2e 73 79 6d   isupper(lem.sym
caa0: 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30 5d  bols[i]->name[0]
cab0: 29 3b 20 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e 6e  ); i++);.  lem.n
cac0: 74 65 72 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a 20  terminal = i;.. 
cad0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 72   /* Generate a r
cae0: 65 70 72 69 6e 74 20 6f 66 20 74 68 65 20 67 72  eprint of the gr
caf0: 61 6d 6d 61 72 2c 20 69 66 20 72 65 71 75 65 73  ammar, if reques
cb00: 74 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  ted on the comma
cb10: 6e 64 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66 28  nd line */.  if(
cb20: 20 72 70 66 6c 61 67 20 29 7b 0a 20 20 20 20 52   rpflag ){.    R
cb30: 65 70 72 69 6e 74 28 26 6c 65 6d 29 3b 0a 20 20  eprint(&lem);.  
cb40: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
cb50: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 69 7a  itialize the siz
cb60: 65 20 66 6f 72 20 61 6c 6c 20 66 6f 6c 6c 6f 77  e for all follow
cb70: 20 61 6e 64 20 66 69 72 73 74 20 73 65 74 73 20   and first sets 
cb80: 2a 2f 0a 20 20 20 20 53 65 74 53 69 7a 65 28 6c  */.    SetSize(l
cb90: 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2b 31 29 3b  em.nterminal+1);
cba0: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68  ..    /* Find th
cbb0: 65 20 70 72 65 63 65 64 65 6e 63 65 20 66 6f 72  e precedence for
cbc0: 20 65 76 65 72 79 20 70 72 6f 64 75 63 74 69 6f   every productio
cbd0: 6e 20 72 75 6c 65 20 28 74 68 61 74 20 68 61 73  n rule (that has
cbe0: 20 6f 6e 65 29 20 2a 2f 0a 20 20 20 20 46 69 6e   one) */.    Fin
cbf0: 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73  dRulePrecedences
cc00: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
cc10: 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 61 6d 62  Compute the lamb
cc20: 64 61 2d 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20  da-nonterminals 
cc30: 61 6e 64 20 74 68 65 20 66 69 72 73 74 2d 73 65  and the first-se
cc40: 74 73 20 66 6f 72 20 65 76 65 72 79 0a 20 20 20  ts for every.   
cc50: 20 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20   ** nonterminal 
cc60: 2a 2f 0a 20 20 20 20 46 69 6e 64 46 69 72 73 74  */.    FindFirst
cc70: 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  Sets(&lem);..   
cc80: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20   /* Compute all 
cc90: 4c 52 28 30 29 20 73 74 61 74 65 73 2e 20 20 41  LR(0) states.  A
cca0: 6c 73 6f 20 72 65 63 6f 72 64 20 66 6f 6c 6c 6f  lso record follo
ccb0: 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f  w-set propagatio
ccc0: 6e 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b 73 20 73  n.    ** links s
ccd0: 6f 20 74 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f  o that the follo
cce0: 77 2d 73 65 74 20 63 61 6e 20 62 65 20 63 6f 6d  w-set can be com
ccf0: 70 75 74 65 64 20 6c 61 74 65 72 20 2a 2f 0a 20  puted later */. 
cd00: 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65 20 3d 20     lem.nstate = 
cd10: 30 3b 0a 20 20 20 20 46 69 6e 64 53 74 61 74 65  0;.    FindState
cd20: 73 28 26 6c 65 6d 29 3b 0a 20 20 20 20 6c 65 6d  s(&lem);.    lem
cd30: 2e 73 6f 72 74 65 64 20 3d 20 53 74 61 74 65 5f  .sorted = State_
cd40: 61 72 72 61 79 6f 66 28 29 3b 0a 0a 20 20 20 20  arrayof();..    
cd50: 2f 2a 20 54 69 65 20 75 70 20 6c 6f 6f 73 65 20  /* Tie up loose 
cd60: 65 6e 64 73 20 6f 6e 20 74 68 65 20 70 72 6f 70  ends on the prop
cd70: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f  agation links */
cd80: 0a 20 20 20 20 46 69 6e 64 4c 69 6e 6b 73 28 26  .    FindLinks(&
cd90: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
cda0: 6d 70 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77  mpute the follow
cdb0: 20 73 65 74 20 6f 66 20 65 76 65 72 79 20 72 65   set of every re
cdc0: 64 75 63 69 62 6c 65 20 63 6f 6e 66 69 67 75 72  ducible configur
cdd0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 46 69 6e  ation */.    Fin
cde0: 64 46 6f 6c 6c 6f 77 53 65 74 73 28 26 6c 65 6d  dFollowSets(&lem
cdf0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  );..    /* Compu
ce00: 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  te the action ta
ce10: 62 6c 65 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64  bles */.    Find
ce20: 41 63 74 69 6f 6e 73 28 26 6c 65 6d 29 3b 0a 0a  Actions(&lem);..
ce30: 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 20      /* Compress 
ce40: 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
ce50: 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 6d  s */.    if( com
ce60: 70 72 65 73 73 3d 3d 30 20 29 20 43 6f 6d 70 72  press==0 ) Compr
ce70: 65 73 73 54 61 62 6c 65 73 28 26 6c 65 6d 29 3b  essTables(&lem);
ce80: 0a 0a 20 20 20 20 2f 2a 20 52 65 6f 72 64 65 72  ..    /* Reorder
ce90: 20 61 6e 64 20 72 65 6e 75 6d 62 65 72 20 74 68   and renumber th
cea0: 65 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74  e states so that
ceb0: 20 73 74 61 74 65 73 20 77 69 74 68 20 66 65 77   states with few
cec0: 65 72 20 63 68 6f 69 63 65 73 0a 20 20 20 20 2a  er choices.    *
ced0: 2a 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65  * occur at the e
cee0: 6e 64 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  nd.  This is an 
cef0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61  optimization tha
cf00: 74 20 68 65 6c 70 73 20 6d 61 6b 65 20 74 68 65  t helps make the
cf10: 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  .    ** generate
cf20: 64 20 70 61 72 73 65 72 20 74 61 62 6c 65 73 20  d parser tables 
cf30: 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20  smaller. */.    
cf40: 69 66 28 20 6e 6f 52 65 73 6f 72 74 3d 3d 30 20  if( noResort==0 
cf50: 29 20 52 65 73 6f 72 74 53 74 61 74 65 73 28 26  ) ResortStates(&
cf60: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  lem);..    /* Ge
cf70: 6e 65 72 61 74 65 20 61 20 72 65 70 6f 72 74 20  nerate a report 
cf80: 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 67 65  of the parser ge
cf90: 6e 65 72 61 74 65 64 2e 20 20 28 74 68 65 20 22  nerated.  (the "
cfa0: 79 2e 6f 75 74 70 75 74 22 20 66 69 6c 65 29 20  y.output" file) 
cfb0: 2a 2f 0a 20 20 20 20 69 66 28 20 21 71 75 69 65  */.    if( !quie
cfc0: 74 20 29 20 52 65 70 6f 72 74 4f 75 74 70 75 74  t ) ReportOutput
cfd0: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
cfe0: 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 6f 75  Generate the sou
cff0: 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  rce code for the
d000: 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 20 20 52   parser */.    R
d010: 65 70 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d 2c  eportTable(&lem,
d020: 20 6d 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20 2f   mhflag);..    /
d030: 2a 20 50 72 6f 64 75 63 65 20 61 20 68 65 61 64  * Produce a head
d040: 65 72 20 66 69 6c 65 20 66 6f 72 20 75 73 65 20  er file for use 
d050: 62 79 20 74 68 65 20 73 63 61 6e 6e 65 72 2e 20  by the scanner. 
d060: 20 28 54 68 69 73 20 73 74 65 70 20 69 73 0a 20   (This step is. 
d070: 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66     ** omitted if
d080: 20 74 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f 6e   the "-m" option
d090: 20 69 73 20 75 73 65 64 20 62 65 63 61 75 73 65   is used because
d0a0: 20 6d 61 6b 65 68 65 61 64 65 72 73 20 77 69 6c   makeheaders wil
d0b0: 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74  l.    ** generat
d0c0: 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 75  e the file for u
d0d0: 73 2e 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  s.) */.    if( !
d0e0: 6d 68 66 6c 61 67 20 29 20 52 65 70 6f 72 74 48  mhflag ) ReportH
d0f0: 65 61 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20 7d  eader(&lem);.  }
d100: 0a 20 20 69 66 28 20 73 74 61 74 69 73 74 69 63  .  if( statistic
d110: 73 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  s ){.    printf(
d120: 22 50 61 72 73 65 72 20 73 74 61 74 69 73 74 69  "Parser statisti
d130: 63 73 3a 5c 6e 22 29 3b 0a 20 20 20 20 73 74 61  cs:\n");.    sta
d140: 74 73 5f 6c 69 6e 65 28 22 74 65 72 6d 69 6e 61  ts_line("termina
d150: 6c 20 73 79 6d 62 6f 6c 73 22 2c 20 6c 65 6d 2e  l symbols", lem.
d160: 6e 74 65 72 6d 69 6e 61 6c 29 3b 0a 20 20 20 20  nterminal);.    
d170: 73 74 61 74 73 5f 6c 69 6e 65 28 22 6e 6f 6e 2d  stats_line("non-
d180: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
d190: 22 2c 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d  ", lem.nsymbol -
d1a0: 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 29 3b   lem.nterminal);
d1b0: 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28  .    stats_line(
d1c0: 22 74 6f 74 61 6c 20 73 79 6d 62 6f 6c 73 22 2c  "total symbols",
d1d0: 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 29 3b 0a 20   lem.nsymbol);. 
d1e0: 20 20 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 72     stats_line("r
d1f0: 75 6c 65 73 22 2c 20 6c 65 6d 2e 6e 72 75 6c 65  ules", lem.nrule
d200: 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c 69 6e  );.    stats_lin
d210: 65 28 22 73 74 61 74 65 73 22 2c 20 6c 65 6d 2e  e("states", lem.
d220: 6e 73 74 61 74 65 29 3b 0a 20 20 20 20 73 74 61  nstate);.    sta
d230: 74 73 5f 6c 69 6e 65 28 22 63 6f 6e 66 6c 69 63  ts_line("conflic
d240: 74 73 22 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69  ts", lem.nconfli
d250: 63 74 29 3b 0a 20 20 20 20 73 74 61 74 73 5f 6c  ct);.    stats_l
d260: 69 6e 65 28 22 61 63 74 69 6f 6e 20 74 61 62 6c  ine("action tabl
d270: 65 20 65 6e 74 72 69 65 73 22 2c 20 6c 65 6d 2e  e entries", lem.
d280: 6e 61 63 74 69 6f 6e 74 61 62 29 3b 0a 20 20 20  nactiontab);.   
d290: 20 73 74 61 74 73 5f 6c 69 6e 65 28 22 74 6f 74   stats_line("tot
d2a0: 61 6c 20 74 61 62 6c 65 20 73 69 7a 65 20 28 62  al table size (b
d2b0: 79 74 65 73 29 22 2c 20 6c 65 6d 2e 74 61 62 6c  ytes)", lem.tabl
d2c0: 65 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66  esize);.  }.  if
d2d0: 28 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20  ( lem.nconflict 
d2e0: 3e 20 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  > 0 ){.    fprin
d2f0: 74 66 28 73 74 64 65 72 72 2c 22 25 64 20 70 61  tf(stderr,"%d pa
d300: 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73 2e  rsing conflicts.
d310: 5c 6e 22 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63  \n",lem.nconflic
d320: 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 72 65  t);.  }..  /* re
d330: 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73  turn 0 on succes
d340: 73 2c 20 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e  s, 1 on failure.
d350: 20 2a 2f 0a 20 20 65 78 69 74 63 6f 64 65 20 3d   */.  exitcode =
d360: 20 28 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20   ((lem.errorcnt 
d370: 3e 20 30 29 20 7c 7c 20 28 6c 65 6d 2e 6e 63 6f  > 0) || (lem.nco
d380: 6e 66 6c 69 63 74 20 3e 20 30 29 29 20 3f 20 31  nflict > 0)) ? 1
d390: 20 3a 20 30 3b 0a 20 20 65 78 69 74 28 65 78 69   : 0;.  exit(exi
d3a0: 74 63 6f 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  tcode);.  return
d3b0: 20 28 65 78 69 74 63 6f 64 65 29 3b 0a 7d 0a 2f   (exitcode);.}./
d3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d3d0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
d3e0: 6c 65 20 22 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a  le "msort.c" ***
d3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
d410: 0a 2a 2a 20 41 20 67 65 6e 65 72 69 63 20 6d 65  .** A generic me
d420: 72 67 65 2d 73 6f 72 74 20 70 72 6f 67 72 61 6d  rge-sort program
d430: 2e 0a 2a 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a  ..**.** USAGE:.*
d440: 2a 20 4c 65 74 20 22 70 74 72 22 20 62 65 20 61  * Let "ptr" be a
d450: 20 70 6f 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65   pointer to some
d460: 20 73 74 72 75 63 74 75 72 65 20 77 68 69 63 68   structure which
d470: 20 69 73 20 61 74 20 74 68 65 20 68 65 61 64 20   is at the head 
d480: 6f 66 0a 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65 72  of.** a null-ter
d490: 6d 69 6e 61 74 65 64 20 6c 69 73 74 2e 20 20 54  minated list.  T
d4a0: 68 65 6e 20 74 6f 20 73 6f 72 74 20 74 68 65 20  hen to sort the 
d4b0: 6c 69 73 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a  list call:.**.**
d4c0: 20 20 20 20 20 70 74 72 20 3d 20 6d 73 6f 72 74       ptr = msort
d4d0: 28 70 74 72 2c 26 28 70 74 72 2d 3e 6e 65 78 74  (ptr,&(ptr->next
d4e0: 29 2c 63 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a  ),cmpfnc);.**.**
d4f0: 20 49 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 22   In the above, "
d500: 63 6d 70 66 6e 63 22 20 69 73 20 61 20 70 6f 69  cmpfnc" is a poi
d510: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
d520: 6f 6e 20 77 68 69 63 68 20 63 6f 6d 70 61 72 65  on which compare
d530: 73 0a 2a 2a 20 74 77 6f 20 69 6e 73 74 61 6e 63  s.** two instanc
d540: 65 73 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  es of the struct
d550: 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20  ure and returns 
d560: 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 73 20 69  an integer, as i
d570: 6e 0a 2a 2a 20 73 74 72 63 6d 70 2e 20 20 54 68  n.** strcmp.  Th
d580: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
d590: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
d5a0: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f  o the pointer to
d5b0: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 65   the.** second e
d5c0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69  lement of the li
d5d0: 6e 6b 65 64 20 6c 69 73 74 2e 20 20 54 68 69 73  nked list.  This
d5e0: 20 61 64 64 72 65 73 73 20 69 73 20 75 73 65 64   address is used
d5f0: 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74   to compute.** t
d600: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
d610: 20 22 6e 65 78 74 22 20 66 69 65 6c 64 20 77 69   "next" field wi
d620: 74 68 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  thin the structu
d630: 72 65 2e 20 20 54 68 65 20 6f 66 66 73 65 74 20  re.  The offset 
d640: 74 6f 0a 2a 2a 20 74 68 65 20 22 6e 65 78 74 22  to.** the "next"
d650: 20 66 69 65 6c 64 20 6d 75 73 74 20 62 65 20 63   field must be c
d660: 6f 6e 73 74 61 6e 74 20 66 6f 72 20 61 6c 6c 20  onstant for all 
d670: 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
d680: 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  e list..**.** Th
d690: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
d6a0: 6e 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  ns a new pointer
d6b0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 68 65   which is the he
d6c0: 61 64 20 6f 66 20 74 68 65 20 6c 69 73 74 0a 2a  ad of the list.*
d6d0: 2a 20 61 66 74 65 72 20 73 6f 72 74 69 6e 67 2e  * after sorting.
d6e0: 0a 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d  .**.** ALGORITHM
d6f0: 3a 0a 2a 2a 20 4d 65 72 67 65 2d 73 6f 72 74 2e  :.** Merge-sort.
d700: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
d710: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
d720: 68 65 20 6e 65 78 74 20 73 74 72 75 63 74 75 72  he next structur
d730: 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
d740: 6c 69 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  list..*/.#define
d750: 20 4e 45 58 54 28 41 29 20 28 2a 28 63 68 61 72   NEXT(A) (*(char
d760: 2a 2a 29 28 28 28 63 68 61 72 2a 29 41 29 2b 6f  **)(((char*)A)+o
d770: 66 66 73 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49  ffset))../*.** I
d780: 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20  nputs:.**   a:  
d790: 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e       A sorted, n
d7a0: 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c  ull-terminated l
d7b0: 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61  inked list.  (Ma
d7c0: 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20  y be null)..**  
d7d0: 20 62 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74   b:       A sort
d7e0: 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61  ed, null-termina
d7f0: 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  ted linked list.
d800: 20 20 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e    (May be null).
d810: 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 41  .**   cmp:     A
d820: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
d830: 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
d840: 69 6f 6e 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74  ion..**   offset
d850: 3a 20 20 4f 66 66 73 65 74 20 69 6e 20 74 68 65  :  Offset in the
d860: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68   structure to th
d870: 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a  e "next" field..
d880: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c  **.** Return Val
d890: 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74  ue:.**   A point
d8a0: 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
d8b0: 66 20 61 20 73 6f 72 74 65 64 20 6c 69 73 74 20  f a sorted list 
d8c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
d8d0: 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20  lements.**   of 
d8e0: 62 6f 74 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a  both a and b..**
d8f0: 0a 2a 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  .** Side effects
d900: 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e 65 78 74  :.**   The "next
d910: 22 20 70 6f 69 6e 74 65 72 73 20 66 6f 72 20 65  " pointers for e
d920: 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6c  lements in the l
d930: 69 73 74 73 20 61 20 61 6e 64 20 62 20 61 72 65  ists a and b are
d940: 0a 2a 2a 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a  .**   changed..*
d950: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6d  /.static char *m
d960: 65 72 67 65 28 0a 20 20 63 68 61 72 20 2a 61 2c  erge(.  char *a,
d970: 0a 20 20 63 68 61 72 20 2a 62 2c 0a 20 20 69 6e  .  char *b,.  in
d980: 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63  t (*cmp)(const c
d990: 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  har*,const char*
d9a0: 29 2c 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 0a  ),.  int offset.
d9b0: 29 7b 0a 20 20 63 68 61 72 20 2a 70 74 72 2c 20  ){.  char *ptr, 
d9c0: 2a 68 65 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d  *head;..  if( a=
d9d0: 3d 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d  =0 ){.    head =
d9e0: 20 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   b;.  }else if( 
d9f0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 68 65 61 64  b==0 ){.    head
da00: 20 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = a;.  }else{. 
da10: 20 20 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c     if( (*cmp)(a,
da20: 62 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  b)<=0 ){.      p
da30: 74 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 61 20  tr = a;.      a 
da40: 3d 20 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 7d  = NEXT(a);.    }
da50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 74 72 20  else{.      ptr 
da60: 3d 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 4e  = b;.      b = N
da70: 45 58 54 28 62 29 3b 0a 20 20 20 20 7d 0a 20 20  EXT(b);.    }.  
da80: 20 20 68 65 61 64 20 3d 20 70 74 72 3b 0a 20 20    head = ptr;.  
da90: 20 20 77 68 69 6c 65 28 20 61 20 26 26 20 62 20    while( a && b 
daa0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 63  ){.      if( (*c
dab0: 6d 70 29 28 61 2c 62 29 3c 3d 30 20 29 7b 0a 20  mp)(a,b)<=0 ){. 
dac0: 20 20 20 20 20 20 20 4e 45 58 54 28 70 74 72 29         NEXT(ptr)
dad0: 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 74   = a;.        pt
dae0: 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 61  r = a;.        a
daf0: 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20 20 20 20   = NEXT(a);.    
db00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
db10: 20 4e 45 58 54 28 70 74 72 29 20 3d 20 62 3b 0a   NEXT(ptr) = b;.
db20: 20 20 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b          ptr = b;
db30: 0a 20 20 20 20 20 20 20 20 62 20 3d 20 4e 45 58  .        b = NEX
db40: 54 28 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  T(b);.      }.  
db50: 20 20 7d 0a 20 20 20 20 69 66 28 20 61 20 29 20    }.    if( a ) 
db60: 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20  NEXT(ptr) = a;. 
db70: 20 20 20 65 6c 73 65 20 20 20 20 4e 45 58 54 28     else    NEXT(
db80: 70 74 72 29 20 3d 20 62 3b 0a 20 20 7d 0a 20 20  ptr) = b;.  }.  
db90: 72 65 74 75 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a  return head;.}..
dba0: 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a  /*.** Inputs:.**
dbb0: 20 20 20 6c 69 73 74 3a 20 20 20 20 20 20 50 6f     list:      Po
dbc0: 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c  inter to a singl
dbd0: 79 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  y-linked list of
dbe0: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 20   structures..** 
dbf0: 20 20 6e 65 78 74 3a 20 20 20 20 20 20 50 6f 69    next:      Poi
dc00: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 65 72 20  nter to pointer 
dc10: 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c  to the second el
dc20: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73  ement of the lis
dc30: 74 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20  t..**   cmp:    
dc40: 20 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20     A comparison 
dc50: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
dc60: 52 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a  Return Value:.**
dc70: 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20     A pointer to 
dc80: 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f  the head of a so
dc90: 72 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69  rted list contai
dca0: 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74  ning the element
dcb0: 73 0a 2a 2a 20 20 20 6f 72 67 69 6e 61 6c 6c 79  s.**   orginally
dcc0: 20 69 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20   in list..**.** 
dcd0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a  Side effects:.**
dce0: 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70 6f     The "next" po
dcf0: 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d 65  inters for eleme
dd00: 6e 74 73 20 69 6e 20 6c 69 73 74 20 61 72 65 20  nts in list are 
dd10: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65 66  changed..*/.#def
dd20: 69 6e 65 20 4c 49 53 54 53 49 5a 45 20 33 30 0a  ine LISTSIZE 30.
dd30: 73 74 61 74 69 63 20 63 68 61 72 20 2a 6d 73 6f  static char *mso
dd40: 72 74 28 0a 20 20 63 68 61 72 20 2a 6c 69 73 74  rt(.  char *list
dd50: 2c 0a 20 20 63 68 61 72 20 2a 2a 6e 65 78 74 2c  ,.  char **next,
dd60: 0a 20 20 69 6e 74 20 28 2a 63 6d 70 29 28 63 6f  .  int (*cmp)(co
dd70: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
dd80: 63 68 61 72 2a 29 0a 29 7b 0a 20 20 75 6e 73 69  char*).){.  unsi
dd90: 67 6e 65 64 20 6c 6f 6e 67 20 6f 66 66 73 65 74  gned long offset
dda0: 3b 0a 20 20 63 68 61 72 20 2a 65 70 3b 0a 20 20  ;.  char *ep;.  
ddb0: 63 68 61 72 20 2a 73 65 74 5b 4c 49 53 54 53 49  char *set[LISTSI
ddc0: 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ZE];.  int i;.  
ddd0: 6f 66 66 73 65 74 20 3d 20 28 75 6e 73 69 67 6e  offset = (unsign
dde0: 65 64 20 6c 6f 6e 67 29 28 28 63 68 61 72 2a 29  ed long)((char*)
ddf0: 6e 65 78 74 20 2d 20 28 63 68 61 72 2a 29 6c 69  next - (char*)li
de00: 73 74 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  st);.  for(i=0; 
de10: 69 3c 4c 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29  i<LISTSIZE; i++)
de20: 20 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 77   set[i] = 0;.  w
de30: 68 69 6c 65 28 20 6c 69 73 74 20 29 7b 0a 20 20  hile( list ){.  
de40: 20 20 65 70 20 3d 20 6c 69 73 74 3b 0a 20 20 20    ep = list;.   
de50: 20 6c 69 73 74 20 3d 20 4e 45 58 54 28 6c 69 73   list = NEXT(lis
de60: 74 29 3b 0a 20 20 20 20 4e 45 58 54 28 65 70 29  t);.    NEXT(ep)
de70: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
de80: 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 2d 31 20  0; i<LISTSIZE-1 
de90: 26 26 20 73 65 74 5b 69 5d 21 3d 30 3b 20 69 2b  && set[i]!=0; i+
dea0: 2b 29 7b 0a 20 20 20 20 20 20 65 70 20 3d 20 6d  +){.      ep = m
deb0: 65 72 67 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63  erge(ep,set[i],c
dec0: 6d 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  mp,offset);.    
ded0: 20 20 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20    set[i] = 0;.  
dee0: 20 20 7d 0a 20 20 20 20 73 65 74 5b 69 5d 20 3d    }.    set[i] =
def0: 20 65 70 3b 0a 20 20 7d 0a 20 20 65 70 20 3d 20   ep;.  }.  ep = 
df00: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
df10: 4c 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 69  LISTSIZE; i++) i
df20: 66 28 20 73 65 74 5b 69 5d 20 29 20 65 70 20 3d  f( set[i] ) ep =
df30: 20 6d 65 72 67 65 28 73 65 74 5b 69 5d 2c 65 70   merge(set[i],ep
df40: 2c 63 6d 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20  ,cmp,offset);.  
df50: 72 65 74 75 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a  return ep;.}./**
df60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
df70: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
df80: 66 69 6c 65 20 22 6f 70 74 69 6f 6e 2e 63 22 20  file "option.c" 
df90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dfa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74  **********/.stat
dfb0: 69 63 20 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a  ic char **argv;.
dfc0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f  static struct s_
dfd0: 6f 70 74 69 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61  options *op;.sta
dfe0: 74 69 63 20 46 49 4c 45 20 2a 65 72 72 73 74 72  tic FILE *errstr
dff0: 65 61 6d 3b 0a 0a 23 64 65 66 69 6e 65 20 49 53  eam;..#define IS
e000: 4f 50 54 28 58 29 20 28 28 58 29 5b 30 5d 3d 3d  OPT(X) ((X)[0]==
e010: 27 2d 27 7c 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27  '-'||(X)[0]=='+'
e020: 7c 7c 73 74 72 63 68 72 28 28 58 29 2c 27 3d 27  ||strchr((X),'='
e030: 29 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  )!=0)../*.** Pri
e040: 6e 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  nt the command l
e050: 69 6e 65 20 77 69 74 68 20 61 20 63 61 72 72 6f  ine with a carro
e060: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
e070: 65 20 6b 2d 74 68 20 63 68 61 72 61 63 74 65 72  e k-th character
e080: 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 2d 74 68 20  .** of the n-th 
e090: 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  field..*/.static
e0a0: 20 76 6f 69 64 20 65 72 72 6c 69 6e 65 28 69 6e   void errline(in
e0b0: 74 20 6e 2c 20 69 6e 74 20 6b 2c 20 46 49 4c 45  t n, int k, FILE
e0c0: 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74 20 73   *err).{.  int s
e0d0: 70 63 6e 74 2c 20 69 3b 0a 20 20 69 66 28 20 61  pcnt, i;.  if( a
e0e0: 72 67 76 5b 30 5d 20 29 20 66 70 72 69 6e 74 66  rgv[0] ) fprintf
e0f0: 28 65 72 72 2c 22 25 73 22 2c 61 72 67 76 5b 30  (err,"%s",argv[0
e100: 5d 29 3b 0a 20 20 73 70 63 6e 74 20 3d 20 6c 65  ]);.  spcnt = le
e110: 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76 5b 30  monStrlen(argv[0
e120: 5d 29 20 2b 20 31 3b 0a 20 20 66 6f 72 28 69 3d  ]) + 1;.  for(i=
e130: 31 3b 20 69 3c 6e 20 26 26 20 61 72 67 76 5b 69  1; i<n && argv[i
e140: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 70 72  ]; i++){.    fpr
e150: 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22 2c 61  intf(err," %s",a
e160: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 73 70 63  rgv[i]);.    spc
e170: 6e 74 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  nt += lemonStrle
e180: 6e 28 61 72 67 76 5b 69 5d 29 2b 31 3b 0a 20 20  n(argv[i])+1;.  
e190: 7d 0a 20 20 73 70 63 6e 74 20 2b 3d 20 6b 3b 0a  }.  spcnt += k;.
e1a0: 20 20 66 6f 72 28 3b 20 61 72 67 76 5b 69 5d 3b    for(; argv[i];
e1b0: 20 69 2b 2b 29 20 66 70 72 69 6e 74 66 28 65 72   i++) fprintf(er
e1c0: 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29  r," %s",argv[i])
e1d0: 3b 0a 20 20 69 66 28 20 73 70 63 6e 74 3c 32 30  ;.  if( spcnt<20
e1e0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
e1f0: 65 72 72 2c 22 5c 6e 25 2a 73 5e 2d 2d 20 68 65  err,"\n%*s^-- he
e200: 72 65 5c 6e 22 2c 73 70 63 6e 74 2c 22 22 29 3b  re\n",spcnt,"");
e210: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70  .  }else{.    fp
e220: 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73  rintf(err,"\n%*s
e230: 68 65 72 65 20 2d 2d 5e 5c 6e 22 2c 73 70 63 6e  here --^\n",spcn
e240: 74 2d 37 2c 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  t-7,"");.  }.}..
e250: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
e260: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4e 2d   index of the N-
e270: 74 68 20 6e 6f 6e 2d 73 77 69 74 63 68 20 61 72  th non-switch ar
e280: 67 75 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  gument.  Return 
e290: 2d 31 0a 2a 2a 20 69 66 20 4e 20 69 73 20 6f 75  -1.** if N is ou
e2a0: 74 20 6f 66 20 72 61 6e 67 65 2e 0a 2a 2f 0a 73  t of range..*/.s
e2b0: 74 61 74 69 63 20 69 6e 74 20 61 72 67 69 6e 64  tatic int argind
e2c0: 65 78 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e  ex(int n).{.  in
e2d0: 74 20 69 3b 0a 20 20 69 6e 74 20 64 61 73 68 64  t i;.  int dashd
e2e0: 61 73 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  ash = 0;.  if( a
e2f0: 72 67 76 21 3d 30 20 26 26 20 2a 61 72 67 76 21  rgv!=0 && *argv!
e300: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
e310: 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29  1; argv[i]; i++)
e320: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 61 73 68  {.      if( dash
e330: 64 61 73 68 20 7c 7c 20 21 49 53 4f 50 54 28 61  dash || !ISOPT(a
e340: 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  rgv[i]) ){.     
e350: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 72 65     if( n==0 ) re
e360: 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 20 20  turn i;.        
e370: 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n--;.      }.   
e380: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72     if( strcmp(ar
e390: 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29  gv[i],"--")==0 )
e3a0: 20 64 61 73 68 64 61 73 68 20 3d 20 31 3b 0a 20   dashdash = 1;. 
e3b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
e3c0: 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n -1;.}..static 
e3d0: 63 68 61 72 20 65 6d 73 67 5b 5d 20 3d 20 22 43  char emsg[] = "C
e3e0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 79 6e 74  ommand line synt
e3f0: 61 78 20 65 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a  ax error: ";../*
e400: 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 66 6c  .** Process a fl
e410: 61 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  ag command line 
e420: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
e430: 74 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 66 6c  tic int handlefl
e440: 61 67 73 28 69 6e 74 20 69 2c 20 46 49 4c 45 20  ags(int i, FILE 
e450: 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74 20 76 3b  *err).{.  int v;
e460: 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20  .  int errcnt = 
e470: 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f  0;.  int j;.  fo
e480: 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62  r(j=0; op[j].lab
e490: 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  el; j++){.    if
e4a0: 28 20 73 74 72 6e 63 6d 70 28 26 61 72 67 76 5b  ( strncmp(&argv[
e4b0: 69 5d 5b 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65  i][1],op[j].labe
e4c0: 6c 2c 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70  l,lemonStrlen(op
e4d0: 5b 6a 5d 2e 6c 61 62 65 6c 29 29 3d 3d 30 20 29  [j].label))==0 )
e4e0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 76 20   break;.  }.  v 
e4f0: 3d 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d  = argv[i][0]=='-
e500: 27 20 3f 20 31 20 3a 20 30 3b 0a 20 20 69 66 28  ' ? 1 : 0;.  if(
e510: 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20   op[j].label==0 
e520: 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20 29  ){.    if( err )
e530: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
e540: 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e 65 64  err,"%sundefined
e550: 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67   option.\n",emsg
e560: 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65  );.      errline
e570: 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d  (i,1,err);.    }
e580: 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20  .    errcnt++;. 
e590: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d   }else if( op[j]
e5a0: 2e 61 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  .arg==0 ){.    /
e5b0: 2a 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f 70  * Ignore this op
e5c0: 74 69 6f 6e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  tion */.  }else 
e5d0: 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d  if( op[j].type==
e5e0: 4f 50 54 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20  OPT_FLAG ){.    
e5f0: 2a 28 28 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72  *((int*)op[j].ar
e600: 67 29 20 3d 20 76 3b 0a 20 20 7d 65 6c 73 65 20  g) = v;.  }else 
e610: 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d  if( op[j].type==
e620: 4f 50 54 5f 46 46 4c 41 47 20 29 7b 0a 20 20 20  OPT_FFLAG ){.   
e630: 20 28 2a 28 76 6f 69 64 28 2a 29 28 69 6e 74 29   (*(void(*)(int)
e640: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 76 29  )(op[j].arg))(v)
e650: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
e660: 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 53  [j].type==OPT_FS
e670: 54 52 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69  TR ){.    (*(voi
e680: 64 28 2a 29 28 63 68 61 72 20 2a 29 29 28 6f 70  d(*)(char *))(op
e690: 5b 6a 5d 2e 61 72 67 29 29 28 26 61 72 67 76 5b  [j].arg))(&argv[
e6a0: 69 5d 5b 32 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  i][2]);.  }else{
e6b0: 0a 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a  .    if( err ){.
e6c0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
e6d0: 72 2c 22 25 73 6d 69 73 73 69 6e 67 20 61 72 67  r,"%smissing arg
e6e0: 75 6d 65 6e 74 20 6f 6e 20 73 77 69 74 63 68 2e  ument on switch.
e6f0: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
e700: 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72   errline(i,1,err
e710: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72  );.    }.    err
e720: 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  cnt++;.  }.  ret
e730: 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f  urn errcnt;.}../
e740: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 63  *.** Process a c
e750: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 77 69 74  ommand line swit
e760: 63 68 20 77 68 69 63 68 20 68 61 73 20 61 6e 20  ch which has an 
e770: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
e780: 74 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 73 77  tic int handlesw
e790: 69 74 63 68 28 69 6e 74 20 69 2c 20 46 49 4c 45  itch(int i, FILE
e7a0: 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74 20 6c   *err).{.  int l
e7b0: 76 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20  v = 0;.  double 
e7c0: 64 76 20 3d 20 30 2e 30 3b 0a 20 20 63 68 61 72  dv = 0.0;.  char
e7d0: 20 2a 73 76 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a   *sv = 0, *end;.
e7e0: 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 69 6e    char *cp;.  in
e7f0: 74 20 6a 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e  t j;.  int errcn
e800: 74 20 3d 20 30 3b 0a 20 20 63 70 20 3d 20 73 74  t = 0;.  cp = st
e810: 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27  rchr(argv[i],'='
e820: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 70 21  );.  assert( cp!
e830: 3d 30 20 29 3b 0a 20 20 2a 63 70 20 3d 20 30 3b  =0 );.  *cp = 0;
e840: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a  .  for(j=0; op[j
e850: 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20  ].label; j++){. 
e860: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72     if( strcmp(ar
e870: 67 76 5b 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65  gv[i],op[j].labe
e880: 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  l)==0 ) break;. 
e890: 20 7d 0a 20 20 2a 63 70 20 3d 20 27 3d 27 3b 0a   }.  *cp = '=';.
e8a0: 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65    if( op[j].labe
e8b0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  l==0 ){.    if( 
e8c0: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72  err ){.      fpr
e8d0: 69 6e 74 66 28 65 72 72 2c 22 25 73 75 6e 64 65  intf(err,"%sunde
e8e0: 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22  fined option.\n"
e8f0: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72  ,emsg);.      er
e900: 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a  rline(i,0,err);.
e910: 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74      }.    errcnt
e920: 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
e930: 20 63 70 2b 2b 3b 0a 20 20 20 20 73 77 69 74 63   cp++;.    switc
e940: 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b  h( op[j].type ){
e950: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
e960: 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65  FLAG:.      case
e970: 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20   OPT_FFLAG:.    
e980: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
e990: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
e9a0: 28 65 72 72 2c 22 25 73 6f 70 74 69 6f 6e 20 72  (err,"%soption r
e9b0: 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
e9c0: 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  ent.\n",emsg);. 
e9d0: 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65           errline
e9e0: 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20 20  (i,0,err);.     
e9f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 72 72     }.        err
ea00: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62  cnt++;.        b
ea10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ea20: 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20   OPT_DBL:.      
ea30: 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20  case OPT_FDBL:. 
ea40: 20 20 20 20 20 20 20 64 76 20 3d 20 73 74 72 74         dv = strt
ea50: 6f 64 28 63 70 2c 26 65 6e 64 29 3b 0a 20 20 20  od(cp,&end);.   
ea60: 20 20 20 20 20 69 66 28 20 2a 65 6e 64 20 29 7b       if( *end ){
ea70: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
ea80: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rr ){.          
ea90: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 0a 20    fprintf(err,. 
eaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
eab0: 73 69 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74  sillegal charact
eac0: 65 72 20 69 6e 20 66 6c 6f 61 74 69 6e 67 2d 70  er in floating-p
ead0: 6f 69 6e 74 20 61 72 67 75 6d 65 6e 74 2e 5c 6e  oint argument.\n
eae0: 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  ",emsg);.       
eaf0: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 28       errline(i,(
eb00: 69 6e 74 29 28 28 63 68 61 72 2a 29 65 6e 64 2d  int)((char*)end-
eb10: 28 63 68 61 72 2a 29 61 72 67 76 5b 69 5d 29 2c  (char*)argv[i]),
eb20: 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  err);.          
eb30: 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 63  }.          errc
eb40: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nt++;.        }.
eb50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
eb60: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e       case OPT_IN
eb70: 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  T:.      case OP
eb80: 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20  T_FINT:.        
eb90: 6c 76 20 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26  lv = strtol(cp,&
eba0: 65 6e 64 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  end,0);.        
ebb0: 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20  if( *end ){.    
ebc0: 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b        if( err ){
ebd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
ebe0: 69 6e 74 66 28 65 72 72 2c 22 25 73 69 6c 6c 65  intf(err,"%sille
ebf0: 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 69 6e  gal character in
ec00: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
ec10: 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20  t.\n",emsg);.   
ec20: 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65           errline
ec30: 28 69 2c 28 69 6e 74 29 28 28 63 68 61 72 2a 29  (i,(int)((char*)
ec40: 65 6e 64 2d 28 63 68 61 72 2a 29 61 72 67 76 5b  end-(char*)argv[
ec50: 69 5d 29 2c 65 72 72 29 3b 0a 20 20 20 20 20 20  i]),err);.      
ec60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ec70: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  errcnt++;.      
ec80: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
ec90: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
eca0: 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73  T_STR:.      cas
ecb0: 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20  e OPT_FSTR:.    
ecc0: 20 20 20 20 73 76 20 3d 20 63 70 3b 0a 20 20 20      sv = cp;.   
ecd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ece0: 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  }.    switch( op
ecf0: 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20  [j].type ){.    
ed00: 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a    case OPT_FLAG:
ed10: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
ed20: 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62  FFLAG:.        b
ed30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ed40: 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20   OPT_DBL:.      
ed50: 20 20 2a 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b    *(double*)(op[
ed60: 6a 5d 2e 61 72 67 29 20 3d 20 64 76 3b 0a 20 20  j].arg) = dv;.  
ed70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ed80: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c     case OPT_FDBL
ed90: 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69  :.        (*(voi
eda0: 64 28 2a 29 28 64 6f 75 62 6c 65 29 29 28 6f 70  d(*)(double))(op
edb0: 5b 6a 5d 2e 61 72 67 29 29 28 64 76 29 3b 0a 20  [j].arg))(dv);. 
edc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
edd0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54      case OPT_INT
ede0: 3a 0a 20 20 20 20 20 20 20 20 2a 28 69 6e 74 2a  :.        *(int*
edf0: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 6c  )(op[j].arg) = l
ee00: 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  v;.        break
ee10: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
ee20: 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 28  _FINT:.        (
ee30: 2a 28 76 6f 69 64 28 2a 29 28 69 6e 74 29 29 28  *(void(*)(int))(
ee40: 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 28 69 6e 74  op[j].arg))((int
ee50: 29 6c 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )lv);.        br
ee60: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ee70: 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 20  OPT_STR:.       
ee80: 20 2a 28 63 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d   *(char**)(op[j]
ee90: 2e 61 72 67 29 20 3d 20 73 76 3b 0a 20 20 20 20  .arg) = sv;.    
eea0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
eeb0: 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a   case OPT_FSTR:.
eec0: 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28          (*(void(
eed0: 2a 29 28 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a  *)(char *))(op[j
eee0: 5d 2e 61 72 67 29 29 28 73 76 29 3b 0a 20 20 20  ].arg))(sv);.   
eef0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ef00: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  }.  }.  return e
ef10: 72 72 63 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70  rrcnt;.}..int Op
ef20: 74 49 6e 69 74 28 63 68 61 72 20 2a 2a 61 2c 20  tInit(char **a, 
ef30: 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73  struct s_options
ef40: 20 2a 6f 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a   *o, FILE *err).
ef50: 7b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  {.  int errcnt =
ef60: 20 30 3b 0a 20 20 61 72 67 76 20 3d 20 61 3b 0a   0;.  argv = a;.
ef70: 20 20 6f 70 20 3d 20 6f 3b 0a 20 20 65 72 72 73    op = o;.  errs
ef80: 74 72 65 61 6d 20 3d 20 65 72 72 3b 0a 20 20 69  tream = err;.  i
ef90: 66 28 20 61 72 67 76 20 26 26 20 2a 61 72 67 76  f( argv && *argv
efa0: 20 26 26 20 6f 70 20 29 7b 0a 20 20 20 20 69 6e   && op ){.    in
efb0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  t i;.    for(i=1
efc0: 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b  ; argv[i]; i++){
efd0: 0a 20 20 20 20 20 20 69 66 28 20 61 72 67 76 5b  .      if( argv[
efe0: 69 5d 5b 30 5d 3d 3d 27 2b 27 20 7c 7c 20 61 72  i][0]=='+' || ar
eff0: 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b  gv[i][0]=='-' ){
f000: 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 20  .        errcnt 
f010: 2b 3d 20 68 61 6e 64 6c 65 66 6c 61 67 73 28 69  += handleflags(i
f020: 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ,err);.      }el
f030: 73 65 20 69 66 28 20 73 74 72 63 68 72 28 61 72  se if( strchr(ar
f040: 67 76 5b 69 5d 2c 27 3d 27 29 20 29 7b 0a 20 20  gv[i],'=') ){.  
f050: 20 20 20 20 20 20 65 72 72 63 6e 74 20 2b 3d 20        errcnt += 
f060: 68 61 6e 64 6c 65 73 77 69 74 63 68 28 69 2c 65  handleswitch(i,e
f070: 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rr);.      }.   
f080: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 72 72   }.  }.  if( err
f090: 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 66 70 72  cnt>0 ){.    fpr
f0a0: 69 6e 74 66 28 65 72 72 2c 22 56 61 6c 69 64 20  intf(err,"Valid 
f0b0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74  command line opt
f0c0: 69 6f 6e 73 20 66 6f 72 20 5c 22 25 73 5c 22 20  ions for \"%s\" 
f0d0: 61 72 65 3a 5c 6e 22 2c 2a 61 29 3b 0a 20 20 20  are:\n",*a);.   
f0e0: 20 4f 70 74 50 72 69 6e 74 28 29 3b 0a 20 20 20   OptPrint();.   
f0f0: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
f100: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74  return 0;.}..int
f110: 20 4f 70 74 4e 41 72 67 73 28 29 7b 0a 20 20 69   OptNArgs(){.  i
f120: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
f130: 74 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b 0a  t dashdash = 0;.
f140: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61    int i;.  if( a
f150: 72 67 76 21 3d 30 20 26 26 20 61 72 67 76 5b 30  rgv!=0 && argv[0
f160: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  ]!=0 ){.    for(
f170: 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b  i=1; argv[i]; i+
f180: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 61  +){.      if( da
f190: 73 68 64 61 73 68 20 7c 7c 20 21 49 53 4f 50 54  shdash || !ISOPT
f1a0: 28 61 72 67 76 5b 69 5d 29 20 29 20 63 6e 74 2b  (argv[i]) ) cnt+
f1b0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  +;.      if( str
f1c0: 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22  cmp(argv[i],"--"
f1d0: 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73 68 20  )==0 ) dashdash 
f1e0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
f1f0: 20 72 65 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a   return cnt;.}..
f200: 63 68 61 72 20 2a 4f 70 74 41 72 67 28 69 6e 74  char *OptArg(int
f210: 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   n).{.  int i;. 
f220: 20 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29   i = argindex(n)
f230: 3b 0a 20 20 72 65 74 75 72 6e 20 69 3e 3d 30 20  ;.  return i>=0 
f240: 3f 20 61 72 67 76 5b 69 5d 20 3a 20 30 3b 0a 7d  ? argv[i] : 0;.}
f250: 0a 0a 76 6f 69 64 20 4f 70 74 45 72 72 28 69 6e  ..void OptErr(in
f260: 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  t n).{.  int i;.
f270: 20 20 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e    i = argindex(n
f280: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  );.  if( i>=0 ) 
f290: 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 73  errline(i,0,errs
f2a0: 74 72 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20  tream);.}..void 
f2b0: 4f 70 74 50 72 69 6e 74 28 29 7b 0a 20 20 69 6e  OptPrint(){.  in
f2c0: 74 20 69 3b 0a 20 20 69 6e 74 20 6d 61 78 2c 20  t i;.  int max, 
f2d0: 6c 65 6e 3b 0a 20 20 6d 61 78 20 3d 20 30 3b 0a  len;.  max = 0;.
f2e0: 20 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d    for(i=0; op[i]
f2f0: 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  .label; i++){.  
f300: 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72    len = lemonStr
f310: 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29  len(op[i].label)
f320: 20 2b 20 31 3b 0a 20 20 20 20 73 77 69 74 63 68   + 1;.    switch
f330: 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a  ( op[i].type ){.
f340: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
f350: 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20  LAG:.      case 
f360: 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20  OPT_FFLAG:.     
f370: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f380: 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20  case OPT_INT:.  
f390: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e      case OPT_FIN
f3a0: 54 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b  T:.        len +
f3b0: 3d 20 39 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65  = 9;       /* le
f3c0: 6e 67 74 68 20 6f 66 20 22 3c 69 6e 74 65 67 65  ngth of "<intege
f3d0: 72 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  r>" */.        b
f3e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
f3f0: 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20   OPT_DBL:.      
f400: 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20  case OPT_FDBL:. 
f410: 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 36 3b         len += 6;
f420: 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68         /* length
f430: 20 6f 66 20 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a   of "<real>" */.
f440: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f450: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54       case OPT_ST
f460: 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  R:.      case OP
f470: 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20  T_FSTR:.        
f480: 6c 65 6e 20 2b 3d 20 38 3b 20 20 20 20 20 20 20  len += 8;       
f490: 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 73  /* length of "<s
f4a0: 74 72 69 6e 67 3e 22 20 2a 2f 0a 20 20 20 20 20  tring>" */.     
f4b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f4c0: 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 20      if( len>max 
f4d0: 29 20 6d 61 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d  ) max = len;.  }
f4e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69  .  for(i=0; op[i
f4f0: 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20  ].label; i++){. 
f500: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d     switch( op[i]
f510: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
f520: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
f530: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
f540: 41 47 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69  AG:.        fpri
f550: 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20  ntf(errstream," 
f560: 20 2d 25 2d 2a 73 20 20 25 73 5c 6e 22 2c 6d 61   -%-*s  %s\n",ma
f570: 78 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70  x,op[i].label,op
f580: 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20  [i].message);.  
f590: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f5a0: 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a     case OPT_INT:
f5b0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
f5c0: 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 66 70  FINT:.        fp
f5d0: 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c  rintf(errstream,
f5e0: 22 20 20 2d 25 73 3c 69 6e 74 65 67 65 72 3e 25  "  -%s<integer>%
f5f0: 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e  *s  %s\n",op[i].
f600: 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  label,.         
f610: 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e   (int)(max-lemon
f620: 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62  Strlen(op[i].lab
f630: 65 6c 29 2d 39 29 2c 22 22 2c 6f 70 5b 69 5d 2e  el)-9),"",op[i].
f640: 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20  message);.      
f650: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
f660: 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20  ase OPT_DBL:.   
f670: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c     case OPT_FDBL
f680: 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  :.        fprint
f690: 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d  f(errstream,"  -
f6a0: 25 73 3c 72 65 61 6c 3e 25 2a 73 20 20 25 73 5c  %s<real>%*s  %s\
f6b0: 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a  n",op[i].label,.
f6c0: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
f6d0: 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  max-lemonStrlen(
f6e0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c  op[i].label)-6),
f6f0: 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  "",op[i].message
f700: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
f710: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
f720: 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65  _STR:.      case
f730: 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20   OPT_FSTR:.     
f740: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74     fprintf(errst
f750: 72 65 61 6d 2c 22 20 20 2d 25 73 3c 73 74 72 69  ream,"  -%s<stri
f760: 6e 67 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70  ng>%*s  %s\n",op
f770: 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20  [i].label,.     
f780: 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c       (int)(max-l
f790: 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d  emonStrlen(op[i]
f7a0: 2e 6c 61 62 65 6c 29 2d 38 29 2c 22 22 2c 6f 70  .label)-8),"",op
f7b0: 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20  [i].message);.  
f7c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f7d0: 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a   }.  }.}./******
f7e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f7f0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
f800: 22 70 61 72 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a  "parse.c" ******
f810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f820: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e  ******/./*.** In
f830: 70 75 74 20 66 69 6c 65 20 70 61 72 73 65 72 20  put file parser 
f840: 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
f850: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
f860: 2a 2f 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65  */../* The state
f870: 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a   of the parser *
f880: 2f 0a 65 6e 75 6d 20 65 5f 73 74 61 74 65 20 7b  /.enum e_state {
f890: 0a 20 20 49 4e 49 54 49 41 4c 49 5a 45 2c 0a 20  .  INITIALIZE,. 
f8a0: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
f8b0: 4c 5f 4f 52 5f 52 55 4c 45 2c 0a 20 20 57 41 49  L_OR_RULE,.  WAI
f8c0: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45  TING_FOR_DECL_KE
f8d0: 59 57 4f 52 44 2c 0a 20 20 57 41 49 54 49 4e 47  YWORD,.  WAITING
f8e0: 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 2c 0a 20  _FOR_DECL_ARG,. 
f8f0: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45   WAITING_FOR_PRE
f900: 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a  CEDENCE_SYMBOL,.
f910: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52    WAITING_FOR_AR
f920: 52 4f 57 2c 0a 20 20 49 4e 5f 52 48 53 2c 0a 20  ROW,.  IN_RHS,. 
f930: 20 4c 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20   LHS_ALIAS_1,.  
f940: 4c 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 4c  LHS_ALIAS_2,.  L
f950: 48 53 5f 41 4c 49 41 53 5f 33 2c 0a 20 20 52 48  HS_ALIAS_3,.  RH
f960: 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 52 48 53  S_ALIAS_1,.  RHS
f970: 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 50 52 45 43  _ALIAS_2,.  PREC
f980: 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20  EDENCE_MARK_1,. 
f990: 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
f9a0: 5f 32 2c 0a 20 20 52 45 53 59 4e 43 5f 41 46 54  _2,.  RESYNC_AFT
f9b0: 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20  ER_RULE_ERROR,. 
f9c0: 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
f9d0: 43 4c 5f 45 52 52 4f 52 2c 0a 20 20 57 41 49 54  CL_ERROR,.  WAIT
f9e0: 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54  ING_FOR_DESTRUCT
f9f0: 4f 52 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49  OR_SYMBOL,.  WAI
fa00: 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50  TING_FOR_DATATYP
fa10: 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54  E_SYMBOL,.  WAIT
fa20: 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b  ING_FOR_FALLBACK
fa30: 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  _ID,.  WAITING_F
fa40: 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 2c 0a  OR_WILDCARD_ID,.
fa50: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c    WAITING_FOR_CL
fa60: 41 53 53 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e  ASS_ID,.  WAITIN
fa70: 47 5f 46 4f 52 5f 43 4c 41 53 53 5f 54 4f 4b 45  G_FOR_CLASS_TOKE
fa80: 4e 0a 7d 3b 0a 73 74 72 75 63 74 20 70 73 74 61  N.};.struct psta
fa90: 74 65 20 7b 0a 20 20 63 68 61 72 20 2a 66 69 6c  te {.  char *fil
faa0: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20  ename;       /* 
fab0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75  Name of the inpu
fac0: 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  t file */.  int 
fad0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20  tokenlineno;    
fae0: 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20    /* Linenumber 
faf0: 61 74 20 77 68 69 63 68 20 63 75 72 72 65 6e 74  at which current
fb00: 20 74 6f 6b 65 6e 20 73 74 61 72 74 73 20 2a 2f   token starts */
fb10: 0a 20 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b  .  int errorcnt;
fb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
fb30: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 6f 20  er of errors so 
fb40: 66 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74  far */.  char *t
fb50: 6f 6b 65 6e 73 74 61 72 74 3b 20 20 20 20 20 2f  okenstart;     /
fb60: 2a 20 54 65 78 74 20 6f 66 20 63 75 72 72 65 6e  * Text of curren
fb70: 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72  t token */.  str
fb80: 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20  uct lemon *gp;  
fb90: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 74 61     /* Global sta
fba0: 74 65 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 65  te vector */.  e
fbb0: 6e 75 6d 20 65 5f 73 74 61 74 65 20 73 74 61 74  num e_state stat
fbc0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
fbd0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
fbe0: 72 73 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74  rser */.  struct
fbf0: 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63   symbol *fallbac
fc00: 6b 3b 20 20 20 2f 2a 20 54 68 65 20 66 61 6c 6c  k;   /* The fall
fc10: 62 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  back token */.  
fc20: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 74  struct symbol *t
fc30: 6b 63 6c 61 73 73 3b 20 20 20 20 2f 2a 20 54 6f  kclass;    /* To
fc40: 6b 65 6e 20 63 6c 61 73 73 20 73 79 6d 62 6f 6c  ken class symbol
fc50: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
fc60: 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 20  bol *lhs;       
fc70: 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69   /* Left-hand si
fc80: 64 65 20 6f 66 20 63 75 72 72 65 6e 74 20 72 75  de of current ru
fc90: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
fca0: 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20  ar *lhsalias;   
fcb0: 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20     /* Alias for 
fcc0: 74 68 65 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74  the LHS */.  int
fcd0: 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20   nrhs;          
fce0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
fcf0: 72 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  r of right-hand 
fd00: 73 69 64 65 20 73 79 6d 62 6f 6c 73 20 73 65 65  side symbols see
fd10: 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  n */.  struct sy
fd20: 6d 62 6f 6c 20 2a 72 68 73 5b 4d 41 58 52 48 53  mbol *rhs[MAXRHS
fd30: 5d 3b 20 20 2f 2a 20 52 48 53 20 73 79 6d 62 6f  ];  /* RHS symbo
fd40: 6c 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ls */.  const ch
fd50: 61 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53  ar *alias[MAXRHS
fd60: 5d 3b 20 2f 2a 20 41 6c 69 61 73 65 73 20 66 6f  ]; /* Aliases fo
fd70: 72 20 65 61 63 68 20 52 48 53 20 73 79 6d 62 6f  r each RHS symbo
fd80: 6c 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  l (or NULL) */. 
fd90: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 72   struct rule *pr
fda0: 65 76 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50  evrule;     /* P
fdb0: 72 65 76 69 6f 75 73 20 72 75 6c 65 20 70 61 72  revious rule par
fdc0: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
fdd0: 68 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64  har *declkeyword
fde0: 3b 20 20 20 2f 2a 20 4b 65 79 77 6f 72 64 20 6f  ;   /* Keyword o
fdf0: 66 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  f a declaration 
fe00: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 64 65 63 6c  */.  char **decl
fe10: 61 72 67 73 6c 6f 74 3b 20 20 20 20 20 20 20 20  argslot;        
fe20: 2f 2a 20 57 68 65 72 65 20 74 68 65 20 64 65 63  /* Where the dec
fe30: 6c 61 72 61 74 69 6f 6e 20 61 72 67 75 6d 65 6e  laration argumen
fe40: 74 20 73 68 6f 75 6c 64 20 62 65 20 70 75 74 20  t should be put 
fe50: 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 65 72 74 4c  */.  int insertL
fe60: 69 6e 65 4d 61 63 72 6f 3b 20 20 20 20 20 20 20  ineMacro;       
fe70: 2f 2a 20 41 64 64 20 23 6c 69 6e 65 20 62 65 66  /* Add #line bef
fe80: 6f 72 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ore declaration 
fe90: 69 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20  insert */.  int 
fea0: 2a 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b  *decllinenoslot;
feb0: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
fec0: 74 6f 20 77 72 69 74 65 20 64 65 63 6c 61 72 61  to write declara
fed0: 74 69 6f 6e 20 6c 69 6e 65 20 6e 75 6d 62 65 72  tion line number
fee0: 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73   */.  enum e_ass
fef0: 6f 63 20 64 65 63 6c 61 73 73 6f 63 3b 20 20 20  oc declassoc;   
ff00: 20 2f 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20   /* Assign this 
ff10: 61 73 73 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64  association to d
ff20: 65 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ecl arguments */
ff30: 0a 20 20 69 6e 74 20 70 72 65 63 63 6f 75 6e 74  .  int preccount
ff40: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er;           /*
ff50: 20 41 73 73 69 67 6e 20 74 68 69 73 20 70 72 65   Assign this pre
ff60: 63 65 64 65 6e 63 65 20 74 6f 20 64 65 63 6c 20  cedence to decl 
ff70: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73  arguments */.  s
ff80: 74 72 75 63 74 20 72 75 6c 65 20 2a 66 69 72 73  truct rule *firs
ff90: 74 72 75 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69  trule;    /* Poi
ffa0: 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 72 75  nter to first ru
ffb0: 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  le in the gramma
ffc0: 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  r */.  struct ru
ffd0: 6c 65 20 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20  le *lastrule;   
ffe0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
fff0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
10000 79 20 70 61 72 73 65 64 20 72 75 6c 65 20 2a 2f  y parsed rule */
10010 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20  .};../* Parse a 
10020 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a  single token */.
10030 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73  static void pars
10040 65 6f 6e 65 74 6f 6b 65 6e 28 73 74 72 75 63 74  eonetoken(struct
10050 20 70 73 74 61 74 65 20 2a 70 73 70 29 0a 7b 0a   pstate *psp).{.
10060 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 3b    const char *x;
10070 0a 20 20 78 20 3d 20 53 74 72 73 61 66 65 28 70  .  x = Strsafe(p
10080 73 70 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b  sp->tokenstart);
10090 20 20 20 20 20 2f 2a 20 53 61 76 65 20 74 68 65       /* Save the
100a0 20 74 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74   token permanent
100b0 6c 79 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72  ly */.#if 0.  pr
100c0 69 6e 74 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b  intf("%s:%d: Tok
100d0 65 6e 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25 64  en=[%s] state=%d
100e0 5c 6e 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  \n",psp->filenam
100f0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
10100 6e 6f 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73  no,.    x,psp->s
10110 74 61 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  tate);.#endif.  
10120 73 77 69 74 63 68 28 20 70 73 70 2d 3e 73 74 61  switch( psp->sta
10130 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 49  te ){.    case I
10140 4e 49 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20  NITIALIZE:.     
10150 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d   psp->prevrule =
10160 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 70   0;.      psp->p
10170 72 65 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a  reccounter = 0;.
10180 20 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74        psp->first
10190 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74  rule = psp->last
101a0 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rule = 0;.      
101b0 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d  psp->gp->nrule =
101c0 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c   0;.      /* Fal
101d0 6c 20 74 68 72 75 20 74 6f 20 6e 65 78 74 20 63  l thru to next c
101e0 61 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ase */.    case 
101f0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
10200 5f 4f 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20  _OR_RULE:.      
10210 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b  if( x[0]=='%' ){
10220 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10230 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
10240 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a  R_DECL_KEYWORD;.
10250 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10260 69 73 6c 6f 77 65 72 28 78 5b 30 5d 29 20 29 7b  islower(x[0]) ){
10270 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68  .        psp->lh
10280 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  s = Symbol_new(x
10290 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
102a0 6e 72 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  nrhs = 0;.      
102b0 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20    psp->lhsalias 
102c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 0;.        psp
102d0 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
102e0 47 5f 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20  G_FOR_ARROW;.   
102f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30     }else if( x[0
10300 5d 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20 20  ]=='{' ){.      
10310 20 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72    if( psp->prevr
10320 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ule==0 ){.      
10330 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
10340 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
10350 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68  tokenlineno,."Th
10360 65 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20  ere is no prior 
10370 72 75 6c 65 20 75 70 6f 6e 20 77 68 69 63 68 20  rule upon which 
10380 74 6f 20 61 74 74 61 63 68 20 74 68 65 20 63 6f  to attach the co
10390 64 65 20 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68  de \.fragment wh
103a0 69 63 68 20 62 65 67 69 6e 73 20 6f 6e 20 74 68  ich begins on th
103b0 69 73 20 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20  is line.");.    
103c0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
103d0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
103e0 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72  else if( psp->pr
103f0 65 76 72 75 6c 65 2d 3e 63 6f 64 65 21 3d 30 20  evrule->code!=0 
10400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
10410 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
10420 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
10430 6e 65 6e 6f 2c 0a 22 43 6f 64 65 20 66 72 61 67  neno,."Code frag
10440 6d 65 6e 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f  ment beginning o
10450 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
10460 6f 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74  ot the first \.t
10470 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65  o follow the pre
10480 76 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20  vious rule.");. 
10490 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
104a0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
104b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
104c0 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
104d0 2d 3e 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f  ->line = psp->to
104e0 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20  kenlineno;.     
104f0 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
10500 6c 65 2d 3e 63 6f 64 65 20 3d 20 26 78 5b 31 5d  le->code = &x[1]
10510 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10520 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
10530 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='[' ){.       
10540 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52   psp->state = PR
10550 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b  ECEDENCE_MARK_1;
10560 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10570 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
10580 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
10590 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
105a0 20 20 20 20 20 20 20 20 20 22 54 6f 6b 65 6e 20           "Token 
105b0 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65  \"%s\" should be
105c0 20 65 69 74 68 65 72 20 5c 22 25 25 5c 22 20 6f   either \"%%\" o
105d0 72 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20  r a nonterminal 
105e0 6e 61 6d 65 2e 22 2c 0a 20 20 20 20 20 20 20 20  name.",.        
105f0 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73    x);.        ps
10600 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
10610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
10620 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45  ak;.    case PRE
10630 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a  CEDENCE_MARK_1:.
10640 20 20 20 20 20 20 69 66 28 20 21 69 73 75 70 70        if( !isupp
10650 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  er(x[0]) ){.    
10660 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
10670 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
10680 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
10690 20 20 20 20 20 20 20 22 54 68 65 20 70 72 65 63         "The prec
106a0 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6d 75  edence symbol mu
106b0 73 74 20 62 65 20 61 20 74 65 72 6d 69 6e 61 6c  st be a terminal
106c0 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  .");.        psp
106d0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
106e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73      }else if( ps
106f0 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20 29  p->prevrule==0 )
10700 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
10710 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
10720 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
10730 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54 68  o,.          "Th
10740 65 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20  ere is no prior 
10750 72 75 6c 65 20 74 6f 20 61 73 73 69 67 6e 20 70  rule to assign p
10760 72 65 63 65 64 65 6e 63 65 20 5c 22 5b 25 73 5d  recedence \"[%s]
10770 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
10780 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
10790 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
107a0 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d  ( psp->prevrule-
107b0 3e 70 72 65 63 73 79 6d 21 3d 30 20 29 7b 0a 20  >precsym!=0 ){. 
107c0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
107d0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
107e0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
107f0 22 50 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b  "Precedence mark
10800 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73   on this line is
10810 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 20 5c   not the first \
10820 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70  .to follow the p
10830 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b  revious rule.");
10840 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
10850 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
10860 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
10870 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72  sp->prevrule->pr
10880 65 63 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e  ecsym = Symbol_n
10890 65 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ew(x);.      }. 
108a0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
108b0 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52  = PRECEDENCE_MAR
108c0 4b 5f 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  K_2;.      break
108d0 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45 43 45  ;.    case PRECE
108e0 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20  DENCE_MARK_2:.  
108f0 20 20 20 20 69 66 28 20 78 5b 30 5d 21 3d 27 5d      if( x[0]!=']
10900 27 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ' ){.        Err
10910 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
10920 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
10930 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
10940 22 4d 69 73 73 69 6e 67 20 5c 22 5d 5c 22 20 6f  "Missing \"]\" o
10950 6e 20 70 72 65 63 65 64 65 6e 63 65 20 6d 61 72  n precedence mar
10960 6b 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  k.");.        ps
10970 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
10980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 73 70       }.      psp
10990 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
109a0 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
109b0 4c 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  LE;.      break;
109c0 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
109d0 47 5f 46 4f 52 5f 41 52 52 4f 57 3a 0a 20 20 20  G_FOR_ARROW:.   
109e0 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27     if( x[0]==':'
109f0 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26   && x[1]==':' &&
10a00 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20   x[2]=='=' ){.  
10a10 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10a20 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20   = IN_RHS;.     
10a30 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d   }else if( x[0]=
10a40 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='(' ){.        
10a50 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53  psp->state = LHS
10a60 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20 20  _ALIAS_1;.      
10a70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
10a80 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
10a90 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
10aa0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
10ab0 20 20 22 45 78 70 65 63 74 65 64 20 74 6f 20 73    "Expected to s
10ac0 65 65 20 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f  ee a \":\" follo
10ad0 77 69 6e 67 20 74 68 65 20 4c 48 53 20 73 79 6d  wing the LHS sym
10ae0 62 6f 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20  bol \"%s\".",.  
10af0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
10b00 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
10b10 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
10b20 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
10b30 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
10b40 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
10b50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
10b60 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48  eak;.    case LH
10b70 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20  S_ALIAS_1:.     
10b80 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30   if( isalpha(x[0
10b90 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  ]) ){.        ps
10ba0 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 78 3b  p->lhsalias = x;
10bb0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10bc0 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f  ate = LHS_ALIAS_
10bd0 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
10be0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
10bf0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
10c00 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
10c10 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 25 73  .          "\"%s
10c20 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69  \" is not a vali
10c30 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  d alias for the 
10c40 4c 48 53 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20  LHS \"%s\"\n",. 
10c50 20 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d 3e           x,psp->
10c60 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  lhs->name);.    
10c70 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
10c80 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
10c90 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
10ca0 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
10cb0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
10cc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
10cd0 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20   LHS_ALIAS_2:.  
10ce0 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29      if( x[0]==')
10cf0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
10d00 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c  ->state = LHS_AL
10d10 49 41 53 5f 33 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_3;.      }el
10d20 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
10d30 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
10d40 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
10d50 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
10d60 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f  Missing \")\" fo
10d70 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61  llowing LHS alia
10d80 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c  s name \"%s\".",
10d90 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a  psp->lhsalias);.
10da0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
10db0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
10dc0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
10dd0 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
10de0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
10df0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10e00 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 33  case LHS_ALIAS_3
10e10 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
10e20 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27  ==':' && x[1]=='
10e30 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20  :' && x[2]=='=' 
10e40 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
10e50 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a  state = IN_RHS;.
10e60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10e70 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
10e80 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
10e90 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
10ea0 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67          "Missing
10eb0 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e   \"->\" followin
10ec0 67 3a 20 5c 22 25 73 28 25 73 29 5c 22 2e 22 2c  g: \"%s(%s)\".",
10ed0 0a 20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  .           psp-
10ee0 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e  >lhs->name,psp->
10ef0 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20  lhsalias);.     
10f00 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
10f10 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
10f20 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
10f30 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
10f40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10f50 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
10f60 49 4e 5f 52 48 53 3a 0a 20 20 20 20 20 20 69 66  IN_RHS:.      if
10f70 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
10f80 20 20 20 20 20 20 20 73 74 72 75 63 74 20 72 75         struct ru
10f90 6c 65 20 2a 72 70 3b 0a 20 20 20 20 20 20 20 20  le *rp;.        
10fa0 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c  rp = (struct rul
10fb0 65 20 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65  e *)calloc( size
10fc0 6f 66 28 73 74 72 75 63 74 20 72 75 6c 65 29 20  of(struct rule) 
10fd0 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  + .             
10fe0 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79  sizeof(struct sy
10ff0 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68 73  mbol*)*psp->nrhs
11000 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29   + sizeof(char*)
11010 2a 70 73 70 2d 3e 6e 72 68 73 2c 20 31 29 3b 0a  *psp->nrhs, 1);.
11020 20 20 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d          if( rp==
11030 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
11040 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
11050 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
11060 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
11070 20 20 20 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63      "Can't alloc
11080 61 74 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72  ate enough memor
11090 79 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65 2e  y for this rule.
110a0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ");.          ps
110b0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
110c0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
110d0 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20  evrule = 0;.    
110e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
110f0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
11100 20 20 20 20 20 20 72 70 2d 3e 72 75 6c 65 6c 69        rp->ruleli
11110 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ne = psp->tokenl
11120 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  ineno;.         
11130 20 72 70 2d 3e 72 68 73 20 3d 20 28 73 74 72 75   rp->rhs = (stru
11140 63 74 20 73 79 6d 62 6f 6c 2a 2a 29 26 72 70 5b  ct symbol**)&rp[
11150 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  1];.          rp
11160 2d 3e 72 68 73 61 6c 69 61 73 20 3d 20 28 63 6f  ->rhsalias = (co
11170 6e 73 74 20 63 68 61 72 2a 2a 29 26 28 72 70 2d  nst char**)&(rp-
11180 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 29  >rhs[psp->nrhs])
11190 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
111a0 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e 72 68 73  i=0; i<psp->nrhs
111b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
111c0 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 20 3d      rp->rhs[i] =
111d0 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20   psp->rhs[i];.  
111e0 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
111f0 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70 73 70 2d  salias[i] = psp-
11200 3e 61 6c 69 61 73 5b 69 5d 3b 0a 20 20 20 20 20  >alias[i];.     
11210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
11220 20 72 70 2d 3e 6c 68 73 20 3d 20 70 73 70 2d 3e   rp->lhs = psp->
11230 6c 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72  lhs;.          r
11240 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 70 73  p->lhsalias = ps
11250 70 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a 20 20 20  p->lhsalias;.   
11260 20 20 20 20 20 20 20 72 70 2d 3e 6e 72 68 73 20         rp->nrhs 
11270 3d 20 70 73 70 2d 3e 6e 72 68 73 3b 0a 20 20 20  = psp->nrhs;.   
11280 20 20 20 20 20 20 20 72 70 2d 3e 63 6f 64 65 20         rp->code 
11290 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
112a0 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 30 3b 0a  p->precsym = 0;.
112b0 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 69 6e            rp->in
112c0 64 65 78 20 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e  dex = psp->gp->n
112d0 72 75 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rule++;.        
112e0 20 20 72 70 2d 3e 6e 65 78 74 6c 68 73 20 3d 20    rp->nextlhs = 
112f0 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20  rp->lhs->rule;. 
11300 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73           rp->lhs
11310 2d 3e 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20  ->rule = rp;.   
11320 20 20 20 20 20 20 20 72 70 2d 3e 6e 65 78 74 20         rp->next 
11330 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
11340 66 28 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c  f( psp->firstrul
11350 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
11360 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75      psp->firstru
11370 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75  le = psp->lastru
11380 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20  le = rp;.       
11390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
113a0 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72        psp->lastr
113b0 75 6c 65 2d 3e 6e 65 78 74 20 3d 20 72 70 3b 0a  ule->next = rp;.
113c0 20 20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d              psp-
113d0 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a  >lastrule = rp;.
113e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
113f0 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
11400 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20  ule = rp;.      
11410 20 20 7d 0a 20 20 20 20 20 20 20 20 70 73 70 2d    }.        psp-
11420 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
11430 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
11440 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
11450 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  f( isalpha(x[0])
11460 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11470 70 73 70 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52 48  psp->nrhs>=MAXRH
11480 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  S ){.          E
11490 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
114a0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
114b0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
114c0 20 20 20 20 22 54 6f 6f 20 6d 61 6e 79 20 73 79      "Too many sy
114d0 6d 62 6f 6c 73 20 6f 6e 20 52 48 53 20 6f 66 20  mbols on RHS of 
114e0 72 75 6c 65 20 62 65 67 69 6e 6e 69 6e 67 20 61  rule beginning a
114f0 74 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20  t \"%s\".",.    
11500 20 20 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20          x);.    
11510 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
11520 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
11530 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
11540 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
11550 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
11560 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11570 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72  psp->rhs[psp->nr
11580 68 73 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  hs] = Symbol_new
11590 28 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  (x);.          p
115a0 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e  sp->alias[psp->n
115b0 72 68 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  rhs] = 0;.      
115c0 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b      psp->nrhs++;
115d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
115e0 20 7d 65 6c 73 65 20 69 66 28 20 28 78 5b 30 5d   }else if( (x[0]
115f0 3d 3d 27 7c 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27  =='|' || x[0]=='
11600 2f 27 29 20 26 26 20 70 73 70 2d 3e 6e 72 68 73  /') && psp->nrhs
11610 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  >0 ){.        st
11620 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70  ruct symbol *msp
11630 20 3d 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d   = psp->rhs[psp-
11640 3e 6e 72 68 73 2d 31 5d 3b 0a 20 20 20 20 20 20  >nrhs-1];.      
11650 20 20 69 66 28 20 6d 73 70 2d 3e 74 79 70 65 21    if( msp->type!
11660 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
11670 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
11680 63 74 20 73 79 6d 62 6f 6c 20 2a 6f 72 69 67 73  ct symbol *origs
11690 70 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20  p = msp;.       
116a0 20 20 20 6d 73 70 20 3d 20 28 73 74 72 75 63 74     msp = (struct
116b0 20 73 79 6d 62 6f 6c 20 2a 29 20 63 61 6c 6c 6f   symbol *) callo
116c0 63 28 31 2c 73 69 7a 65 6f 66 28 2a 6d 73 70 29  c(1,sizeof(*msp)
116d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
116e0 73 65 74 28 6d 73 70 2c 20 30 2c 20 73 69 7a 65  set(msp, 0, size
116f0 6f 66 28 2a 6d 73 70 29 29 3b 0a 20 20 20 20 20  of(*msp));.     
11700 20 20 20 20 20 6d 73 70 2d 3e 74 79 70 65 20 3d       msp->type =
11710 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 3b 0a   MULTITERMINAL;.
11720 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e            msp->n
11730 73 75 62 73 79 6d 20 3d 20 31 3b 0a 20 20 20 20  subsym = 1;.    
11740 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79        msp->subsy
11750 6d 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  m = (struct symb
11760 6f 6c 20 2a 2a 29 20 63 61 6c 6c 6f 63 28 31 2c  ol **) calloc(1,
11770 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79  sizeof(struct sy
11780 6d 62 6f 6c 2a 29 29 3b 0a 20 20 20 20 20 20 20  mbol*));.       
11790 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30     msp->subsym[0
117a0 5d 20 3d 20 6f 72 69 67 73 70 3b 0a 20 20 20 20  ] = origsp;.    
117b0 20 20 20 20 20 20 6d 73 70 2d 3e 6e 61 6d 65 20        msp->name 
117c0 3d 20 6f 72 69 67 73 70 2d 3e 6e 61 6d 65 3b 0a  = origsp->name;.
117d0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72            psp->r
117e0 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20  hs[psp->nrhs-1] 
117f0 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 7d  = msp;.        }
11800 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73  .        msp->ns
11810 75 62 73 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  ubsym++;.       
11820 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28   msp->subsym = (
11830 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
11840 29 20 72 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73  ) realloc(msp->s
11850 75 62 73 79 6d 2c 0a 20 20 20 20 20 20 20 20 20  ubsym,.         
11860 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
11870 79 6d 62 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75  ymbol*)*msp->nsu
11880 62 73 79 6d 29 3b 0a 20 20 20 20 20 20 20 20 6d  bsym);.        m
11890 73 70 2d 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e  sp->subsym[msp->
118a0 6e 73 75 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d  nsubsym-1] = Sym
118b0 62 6f 6c 5f 6e 65 77 28 26 78 5b 31 5d 29 3b 0a  bol_new(&x[1]);.
118c0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 6c 6f          if( islo
118d0 77 65 72 28 78 5b 31 5d 29 20 7c 7c 20 69 73 6c  wer(x[1]) || isl
118e0 6f 77 65 72 28 6d 73 70 2d 3e 73 75 62 73 79 6d  ower(msp->subsym
118f0 5b 30 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 20 29 7b  [0]->name[0]) ){
11900 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
11910 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
11920 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
11930 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
11940 22 43 61 6e 6e 6f 74 20 66 6f 72 6d 20 61 20 63  "Cannot form a c
11950 6f 6d 70 6f 75 6e 64 20 63 6f 6e 74 61 69 6e 69  ompound containi
11960 6e 67 20 61 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  ng a non-termina
11970 6c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  l");.          p
11980 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
119a0 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d  }else if( x[0]==
119b0 27 28 27 20 26 26 20 70 73 70 2d 3e 6e 72 68 73  '(' && psp->nrhs
119c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  >0 ){.        ps
119d0 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41  p->state = RHS_A
119e0 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65  LIAS_1;.      }e
119f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
11a00 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11a10 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
11a20 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
11a30 22 49 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74  "Illegal charact
11a40 65 72 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c  er on RHS of rul
11a50 65 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a  e: \"%s\".",x);.
11a60 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11a70 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
11a80 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
11a90 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
11aa0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
11ab0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11ac0 63 61 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 31  case RHS_ALIAS_1
11ad0 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73 61 6c  :.      if( isal
11ae0 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  pha(x[0]) ){.   
11af0 20 20 20 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b       psp->alias[
11b00 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 78  psp->nrhs-1] = x
11b10 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
11b20 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53  tate = RHS_ALIAS
11b30 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _2;.      }else{
11b40 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
11b50 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
11b60 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
11b70 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 25  ,.          "\"%
11b80 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  s\" is not a val
11b90 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  id alias for the
11ba0 20 52 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73   RHS symbol \"%s
11bb0 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  \"\n",.         
11bc0 20 78 2c 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d   x,psp->rhs[psp-
11bd0 3e 6e 72 68 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b  >nrhs-1]->name);
11be0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
11bf0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
11c00 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
11c10 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
11c20 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
11c30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11c40 20 63 61 73 65 20 52 48 53 5f 41 4c 49 41 53 5f   case RHS_ALIAS_
11c50 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  2:.      if( x[0
11c60 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20  ]==')' ){.      
11c70 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49    psp->state = I
11c80 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c  N_RHS;.      }el
11c90 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
11ca0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
11cb0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
11cc0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
11cd0 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f  Missing \")\" fo
11ce0 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61  llowing LHS alia
11cf0 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c  s name \"%s\".",
11d00 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a  psp->lhsalias);.
11d10 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11d20 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
11d30 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
11d40 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
11d50 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
11d60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11d70 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
11d80 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20  _DECL_KEYWORD:. 
11d90 20 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61       if( isalpha
11da0 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
11db0 20 20 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f    psp->declkeywo
11dc0 72 64 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  rd = x;.        
11dd0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
11de0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
11df0 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f  p->decllinenoslo
11e00 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
11e10 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
11e20 63 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  cro = 1;.       
11e30 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
11e40 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
11e50 52 47 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  RG;.        if( 
11e60 73 74 72 63 6d 70 28 78 2c 22 6e 61 6d 65 22 29  strcmp(x,"name")
11e70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11e80 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
11e90 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6e  t = &(psp->gp->n
11ea0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
11eb0 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
11ec0 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  acro = 0;.      
11ed0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
11ee0 6d 70 28 78 2c 22 69 6e 63 6c 75 64 65 22 29 3d  mp(x,"include")=
11ef0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11f00 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
11f10 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 69 6e   = &(psp->gp->in
11f20 63 6c 75 64 65 29 3b 0a 20 20 20 20 20 20 20 20  clude);.        
11f30 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
11f40 28 78 2c 22 63 6f 64 65 22 29 3d 3d 30 20 29 7b  (x,"code")==0 ){
11f50 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11f60 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
11f70 70 73 70 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f  psp->gp->extraco
11f80 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  de);.        }el
11f90 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
11fa0 22 74 6f 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f  "token_destructo
11fb0 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
11fc0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
11fd0 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d  slot = &psp->gp-
11fe0 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20 20  >tokendest;.    
11ff0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
12000 72 63 6d 70 28 78 2c 22 64 65 66 61 75 6c 74 5f  rcmp(x,"default_
12010 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20  destructor")==0 
12020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
12030 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
12040 26 70 73 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73  &psp->gp->vardes
12050 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
12060 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74   if( strcmp(x,"t
12070 6f 6b 65 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30  oken_prefix")==0
12080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
12090 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
120a0 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e   &psp->gp->token
120b0 70 72 65 66 69 78 3b 0a 20 20 20 20 20 20 20 20  prefix;.        
120c0 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e    psp->insertLin
120d0 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20  eMacro = 0;.    
120e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
120f0 72 63 6d 70 28 78 2c 22 73 79 6e 74 61 78 5f 65  rcmp(x,"syntax_e
12100 72 72 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  rror")==0 ){.   
12110 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
12120 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
12130 3e 67 70 2d 3e 65 72 72 6f 72 29 3b 0a 20 20 20  >gp->error);.   
12140 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
12150 74 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 61  trcmp(x,"parse_a
12160 63 63 65 70 74 22 29 3d 3d 30 20 29 7b 0a 20 20  ccept")==0 ){.  
12170 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
12180 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
12190 2d 3e 67 70 2d 3e 61 63 63 65 70 74 29 3b 0a 20  ->gp->accept);. 
121a0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
121b0 20 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73 65   strcmp(x,"parse
121c0 5f 66 61 69 6c 75 72 65 22 29 3d 3d 30 20 29 7b  _failure")==0 ){
121d0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
121e0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
121f0 70 73 70 2d 3e 67 70 2d 3e 66 61 69 6c 75 72 65  psp->gp->failure
12200 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
12210 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73   if( strcmp(x,"s
12220 74 61 63 6b 5f 6f 76 65 72 66 6c 6f 77 22 29 3d  tack_overflow")=
12230 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12240 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
12250 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6f 76   = &(psp->gp->ov
12260 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20  erflow);.       
12270 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12280 70 28 78 2c 22 65 78 74 72 61 5f 61 72 67 75 6d  p(x,"extra_argum
12290 65 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ent")==0 ){.    
122a0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
122b0 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
122c0 67 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 20 20  gp->arg);.      
122d0 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
122e0 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20  ineMacro = 0;.  
122f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12300 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f  strcmp(x,"token_
12310 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  type")==0 ){.   
12320 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
12330 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
12340 3e 67 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b  >gp->tokentype);
12350 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12360 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
12370 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
12380 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
12390 22 64 65 66 61 75 6c 74 5f 74 79 70 65 22 29 3d  "default_type")=
123a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
123b0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
123c0 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61   = &(psp->gp->va
123d0 72 74 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20  rtype);.        
123e0 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e    psp->insertLin
123f0 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20  eMacro = 0;.    
12400 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
12410 72 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f 73 69  rcmp(x,"stack_si
12420 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ze")==0 ){.     
12430 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
12440 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
12450 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20  p->stacksize);. 
12460 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
12470 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
12480 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
12490 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73   if( strcmp(x,"s
124a0 74 61 72 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30  tart_symbol")==0
124b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
124c0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
124d0 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61 72   &(psp->gp->star
124e0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  t);.          ps
124f0 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
12500 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
12510 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
12520 28 78 2c 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b  (x,"left")==0 ){
12530 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12540 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  preccounter++;. 
12550 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
12560 63 6c 61 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a  classoc = LEFT;.
12570 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
12580 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
12590 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59  OR_PRECEDENCE_SY
125a0 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65  MBOL;.        }e
125b0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
125c0 2c 22 72 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a  ,"right")==0 ){.
125d0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
125e0 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  reccounter++;.  
125f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
12600 6c 61 73 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a  lassoc = RIGHT;.
12610 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
12620 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
12630 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59  OR_PRECEDENCE_SY
12640 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65  MBOL;.        }e
12650 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
12660 2c 22 6e 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20  ,"nonassoc")==0 
12670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
12680 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b  ->preccounter++;
12690 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
126a0 64 65 63 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45  declassoc = NONE
126b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
126c0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
126d0 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f  _FOR_PRECEDENCE_
126e0 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20  SYMBOL;.        
126f0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
12700 28 78 2c 22 64 65 73 74 72 75 63 74 6f 72 22 29  (x,"destructor")
12710 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12720 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
12730 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55  ITING_FOR_DESTRU
12740 43 54 4f 52 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20  CTOR_SYMBOL;.   
12750 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
12760 74 72 63 6d 70 28 78 2c 22 74 79 70 65 22 29 3d  trcmp(x,"type")=
12770 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12780 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
12790 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50  TING_FOR_DATATYP
127a0 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20  E_SYMBOL;.      
127b0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
127c0 6d 70 28 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29  mp(x,"fallback")
127d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
127e0 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d   psp->fallback =
127f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73   0;.          ps
12800 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
12810 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f  NG_FOR_FALLBACK_
12820 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ID;.        }els
12830 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
12840 77 69 6c 64 63 61 72 64 22 29 3d 3d 30 20 29 7b  wildcard")==0 ){
12850 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12860 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
12870 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 3b  FOR_WILDCARD_ID;
12880 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
12890 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b  f( strcmp(x,"tok
128a0 65 6e 5f 63 6c 61 73 73 22 29 3d 3d 30 20 29 7b  en_class")==0 ){
128b0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
128c0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
128d0 46 4f 52 5f 43 4c 41 53 53 5f 49 44 3b 0a 20 20  FOR_CLASS_ID;.  
128e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
128f0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
12900 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
12910 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
12920 20 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 6b              "Unk
12930 6e 6f 77 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  nown declaration
12940 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 25 25 73   keyword: \"%%%s
12950 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
12960 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
12970 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
12980 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
12990 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
129a0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
129b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
129c0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
129d0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
129e0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
129f0 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 64        "Illegal d
12a00 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f  eclaration keywo
12a10 72 64 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b  rd: \"%s\".",x);
12a20 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
12a30 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
12a40 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
12a50 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
12a60 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
12a70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12a80 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
12a90 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d  R_DESTRUCTOR_SYM
12aa0 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21  BOL:.      if( !
12ab0 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b  isalpha(x[0]) ){
12ac0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
12ad0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
12ae0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
12af0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d  ,.          "Sym
12b00 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67  bol name missing
12b10 20 61 66 74 65 72 20 25 25 64 65 73 74 72 75 63   after %%destruc
12b20 74 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20  tor keyword");. 
12b30 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
12b40 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
12b50 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
12b60 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
12b70 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
12b80 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
12b90 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53  t symbol *sp = S
12ba0 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
12bb0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
12bc0 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65  rgslot = &sp->de
12bd0 73 74 72 75 63 74 6f 72 3b 0a 20 20 20 20 20 20  structor;.      
12be0 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e    psp->decllinen
12bf0 6f 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73  oslot = &sp->des
12c00 74 4c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20  tLineno;.       
12c10 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
12c20 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20  Macro = 1;.     
12c30 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
12c40 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
12c50 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _ARG;.      }.  
12c60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
12c70 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
12c80 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3a  DATATYPE_SYMBOL:
12c90 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 61 6c  .      if( !isal
12ca0 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  pha(x[0]) ){.   
12cb0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
12cc0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
12cd0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
12ce0 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20          "Symbol 
12cf0 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74  name missing aft
12d00 65 72 20 25 25 74 79 70 65 20 6b 65 79 77 6f 72  er %%type keywor
12d10 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  d");.        psp
12d20 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
12d30 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
12d40 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
12d50 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20  DECL_ERROR;.    
12d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12d70 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
12d80 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64  sp = Symbol_find
12d90 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
12da0 28 73 70 29 20 26 26 20 28 73 70 2d 3e 64 61 74  (sp) && (sp->dat
12db0 61 74 79 70 65 29 29 7b 0a 20 20 20 20 20 20 20  atype)){.       
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 25 25 74 79 70 65 20 5c 22 25 73 5c 22 20 61 6c  %%type \"%s\" al
12e10 72 65 61 64 79 20 64 65 66 69 6e 65 64 22 2c 20  ready defined", 
12e20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
12e30 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
12e40 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
12e50 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
12e60 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
12e70 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12e80 20 20 20 20 20 20 20 20 69 66 20 28 21 73 70 29          if (!sp)
12e90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 70  {.            sp
12ea0 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
12eb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
12ec0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
12ed0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e  largslot = &sp->
12ee0 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20 20 20  datatype;.      
12ef0 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
12f00 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20  ineMacro = 0;.  
12f10 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
12f20 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
12f30 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20  _DECL_ARG;.     
12f40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12f50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
12f60 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50  se WAITING_FOR_P
12f70 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c  RECEDENCE_SYMBOL
12f80 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
12f90 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='.' ){.       
12fa0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
12fb0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
12fc0 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65  R_RULE;.      }e
12fd0 6c 73 65 20 69 66 28 20 69 73 75 70 70 65 72 28  lse if( isupper(
12fe0 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
12ff0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
13000 73 70 3b 0a 20 20 20 20 20 20 20 20 73 70 20 3d  sp;.        sp =
13010 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
13020 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e          if( sp->
13030 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  prec>=0 ){.     
13040 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
13050 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
13060 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
13070 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f            "Symbo
13080 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 61 6c 72  l \"%s\" has alr
13090 65 61 64 79 20 62 65 20 67 69 76 65 6e 20 61 20  eady be given a 
130a0 70 72 65 63 65 64 65 6e 63 65 2e 22 2c 78 29 3b  precedence.",x);
130b0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
130c0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
130d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
130e0 20 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d 20       sp->prec = 
130f0 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
13100 3b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  ;.          sp->
13110 61 73 73 6f 63 20 3d 20 70 73 70 2d 3e 64 65 63  assoc = psp->dec
13120 6c 61 73 73 6f 63 3b 0a 20 20 20 20 20 20 20 20  lassoc;.        
13130 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
13140 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
13150 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
13160 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
13170 20 20 20 20 20 20 20 20 20 20 22 43 61 6e 27 74            "Can't
13180 20 61 73 73 69 67 6e 20 61 20 70 72 65 63 65 64   assign a preced
13190 65 6e 63 65 20 74 6f 20 5c 22 25 73 5c 22 2e 22  ence to \"%s\"."
131a0 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  ,x);.        psp
131b0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
131c0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
131d0 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
131e0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47  ING_FOR_DECL_ARG
131f0 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
13200 3d 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27  =='{' || x[0]=='
13210 5c 22 27 20 7c 7c 20 69 73 61 6c 6e 75 6d 28 78  \"' || isalnum(x
13220 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
13230 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64  const char *zOld
13240 2c 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20  , *zNew;.       
13250 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 2a 7a 3b   char *zBuf, *z;
13260 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4f 6c  .        int nOl
13270 64 2c 20 6e 2c 20 6e 4c 69 6e 65 20 3d 20 30 2c  d, n, nLine = 0,
13280 20 6e 4e 65 77 2c 20 6e 42 61 63 6b 3b 0a 20 20   nNew, nBack;.  
13290 20 20 20 20 20 20 69 6e 74 20 61 64 64 4c 69 6e        int addLin
132a0 65 4d 61 63 72 6f 3b 0a 20 20 20 20 20 20 20 20  eMacro;.        
132b0 63 68 61 72 20 7a 4c 69 6e 65 5b 35 30 5d 3b 0a  char zLine[50];.
132c0 20 20 20 20 20 20 20 20 7a 4e 65 77 20 3d 20 78          zNew = x
132d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  ;.        if( zN
132e0 65 77 5b 30 5d 3d 3d 27 22 27 20 7c 7c 20 7a 4e  ew[0]=='"' || zN
132f0 65 77 5b 30 5d 3d 3d 27 7b 27 20 29 20 7a 4e 65  ew[0]=='{' ) zNe
13300 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 4e 65  w++;.        nNe
13310 77 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  w = lemonStrlen(
13320 7a 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69  zNew);.        i
13330 66 28 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67  f( *psp->declarg
13340 73 6c 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  slot ){.        
13350 20 20 7a 4f 6c 64 20 3d 20 2a 70 73 70 2d 3e 64    zOld = *psp->d
13360 65 63 6c 61 72 67 73 6c 6f 74 3b 0a 20 20 20 20  eclargslot;.    
13370 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13380 20 20 20 20 20 7a 4f 6c 64 20 3d 20 22 22 3b 0a       zOld = "";.
13390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
133a0 20 20 6e 4f 6c 64 20 3d 20 6c 65 6d 6f 6e 53 74    nOld = lemonSt
133b0 72 6c 65 6e 28 7a 4f 6c 64 29 3b 0a 20 20 20 20  rlen(zOld);.    
133c0 20 20 20 20 6e 20 3d 20 6e 4f 6c 64 20 2b 20 6e      n = nOld + n
133d0 4e 65 77 20 2b 20 32 30 3b 0a 20 20 20 20 20 20  New + 20;.      
133e0 20 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 3d    addLineMacro =
133f0 20 21 70 73 70 2d 3e 67 70 2d 3e 6e 6f 6c 69 6e   !psp->gp->nolin
13400 65 6e 6f 73 66 6c 61 67 20 26 26 20 70 73 70 2d  enosflag && psp-
13410 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
13420 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
13430 20 20 20 20 20 20 20 20 20 20 20 20 28 70 73 70              (psp
13440 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74  ->decllinenoslot
13450 3d 3d 30 20 7c 7c 20 70 73 70 2d 3e 64 65 63 6c  ==0 || psp->decl
13460 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 21 3d 30  linenoslot[0]!=0
13470 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
13480 64 64 4c 69 6e 65 4d 61 63 72 6f 20 29 7b 0a 20  ddLineMacro ){. 
13490 20 20 20 20 20 20 20 20 20 66 6f 72 28 7a 3d 70           for(z=p
134a0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 6e 42  sp->filename, nB
134b0 61 63 6b 3d 30 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b  ack=0; *z; z++){
134c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
134d0 20 2a 7a 3d 3d 27 5c 5c 27 20 29 20 6e 42 61 63   *z=='\\' ) nBac
134e0 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  k++;.          }
134f0 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6d 6f 6e  .          lemon
13500 5f 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20  _sprintf(zLine, 
13510 22 23 6c 69 6e 65 20 25 64 20 22 2c 20 70 73 70  "#line %d ", psp
13520 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 29 3b 0a  ->tokenlineno);.
13530 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65 20            nLine 
13540 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4c  = lemonStrlen(zL
13550 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ine);.          
13560 6e 20 2b 3d 20 6e 4c 69 6e 65 20 2b 20 6c 65 6d  n += nLine + lem
13570 6f 6e 53 74 72 6c 65 6e 28 70 73 70 2d 3e 66 69  onStrlen(psp->fi
13580 6c 65 6e 61 6d 65 29 20 2b 20 6e 42 61 63 6b 3b  lename) + nBack;
13590 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
135a0 20 20 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67     *psp->declarg
135b0 73 6c 6f 74 20 3d 20 28 63 68 61 72 20 2a 29 20  slot = (char *) 
135c0 72 65 61 6c 6c 6f 63 28 2a 70 73 70 2d 3e 64 65  realloc(*psp->de
135d0 63 6c 61 72 67 73 6c 6f 74 2c 20 6e 29 3b 0a 20  clargslot, n);. 
135e0 20 20 20 20 20 20 20 7a 42 75 66 20 3d 20 2a 70         zBuf = *p
135f0 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
13600 2b 20 6e 4f 6c 64 3b 0a 20 20 20 20 20 20 20 20  + nOld;.        
13610 69 66 28 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f  if( addLineMacro
13620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
13630 28 20 6e 4f 6c 64 20 26 26 20 7a 42 75 66 5b 2d  ( nOld && zBuf[-
13640 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]!='\n' ){.    
13650 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b          *(zBuf++
13660 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20  ) = '\n';.      
13670 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13680 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69  memcpy(zBuf, zLi
13690 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20  ne, nLine);.    
136a0 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4c        zBuf += nL
136b0 69 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  ine;.          *
136c0 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a  (zBuf++) = '"';.
136d0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 7a 3d            for(z=
136e0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b 20 2a  psp->filename; *
136f0 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; z++){.       
13700 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c       if( *z=='\\
13710 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
13720 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27     *(zBuf++) = '
13730 5c 5c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  \\';.           
13740 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a   }.            *
13750 28 7a 42 75 66 2b 2b 29 20 3d 20 2a 7a 3b 0a 20  (zBuf++) = *z;. 
13760 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13770 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
13780 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '"';.          
13790 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27  *(zBuf++) = '\n'
137a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
137b0 20 20 20 20 69 66 28 20 70 73 70 2d 3e 64 65 63      if( psp->dec
137c0 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 26 26 20 70  llinenoslot && p
137d0 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
137e0 6f 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ot[0]==0 ){.    
137f0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c        psp->decll
13800 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 20 3d 20 70  inenoslot[0] = p
13810 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b  sp->tokenlineno;
13820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13830 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
13840 7a 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  zNew, nNew);.   
13850 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4e 65       zBuf += nNe
13860 77 3b 0a 20 20 20 20 20 20 20 20 2a 7a 42 75 66  w;.        *zBuf
13870 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
13880 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
13890 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
138a0 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
138b0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
138c0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
138d0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
138e0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c  o,.          "Il
138f0 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e 74 20 74  legal argument t
13900 6f 20 25 25 25 73 3a 20 25 73 22 2c 70 73 70 2d  o %%%s: %s",psp-
13910 3e 64 65 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b  >declkeyword,x);
13920 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
13930 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
13940 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
13950 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
13960 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
13970 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13980 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
13990 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20  R_FALLBACK_ID:. 
139a0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
139b0 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  .' ){.        ps
139c0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
139d0 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
139e0 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
139f0 20 69 66 28 20 21 69 73 75 70 70 65 72 28 78 5b   if( !isupper(x[
13a00 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
13a10 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
13a20 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65  ename, psp->toke
13a30 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
13a40 20 20 20 22 25 25 66 61 6c 6c 62 61 63 6b 20 61     "%%fallback a
13a50 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73  rgument \"%s\" s
13a60 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e  hould be a token
13a70 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ", x);.        p
13a80 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
13a90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13aa0 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
13ab0 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ol *sp = Symbol_
13ac0 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
13ad0 69 66 28 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63  if( psp->fallbac
13ae0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
13af0 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20    psp->fallback 
13b00 3d 20 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 65  = sp;.        }e
13b10 6c 73 65 20 69 66 28 20 73 70 2d 3e 66 61 6c 6c  lse if( sp->fall
13b20 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
13b30 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
13b40 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74  filename, psp->t
13b50 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
13b60 20 20 20 20 20 20 20 20 22 4d 6f 72 65 20 74 68          "More th
13b70 61 6e 20 6f 6e 65 20 66 61 6c 6c 62 61 63 6b 20  an one fallback 
13b80 61 73 73 69 67 6e 65 64 20 74 6f 20 74 6f 6b 65  assigned to toke
13b90 6e 20 25 73 22 2c 20 78 29 3b 0a 20 20 20 20 20  n %s", x);.     
13ba0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
13bb0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  nt++;.        }e
13bc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
13bd0 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 70 73  p->fallback = ps
13be0 70 2d 3e 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20  p->fallback;.   
13bf0 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e         psp->gp->
13c00 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 3d 20 31  has_fallback = 1
13c10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13c20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
13c30 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
13c40 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49  G_FOR_WILDCARD_I
13c50 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  D:.      if( x[0
13c60 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
13c70 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
13c80 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
13c90 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d  OR_RULE;.      }
13ca0 65 6c 73 65 20 69 66 28 20 21 69 73 75 70 70 65  else if( !isuppe
13cb0 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  r(x[0]) ){.     
13cc0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
13cd0 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e  >filename, psp->
13ce0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
13cf0 20 20 20 20 20 20 20 22 25 25 77 69 6c 64 63 61         "%%wildca
13d00 72 64 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73  rd argument \"%s
13d10 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74  \" should be a t
13d20 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20  oken", x);.     
13d30 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
13d40 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
13d50 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
13d60 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d  symbol *sp = Sym
13d70 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
13d80 20 20 20 20 69 66 28 20 70 73 70 2d 3e 67 70 2d      if( psp->gp-
13d90 3e 77 69 6c 64 63 61 72 64 3d 3d 30 20 29 7b 0a  >wildcard==0 ){.
13da0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67            psp->g
13db0 70 2d 3e 77 69 6c 64 63 61 72 64 20 3d 20 73 70  p->wildcard = sp
13dc0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
13dd0 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
13de0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
13df0 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
13e00 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
13e10 20 22 45 78 74 72 61 20 77 69 6c 64 63 61 72 64   "Extra wildcard
13e20 20 74 6f 20 74 6f 6b 65 6e 3a 20 25 73 22 2c 20   to token: %s", 
13e30 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
13e40 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
13e50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13e60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13e70 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
13e80 4f 52 5f 43 4c 41 53 53 5f 49 44 3a 0a 20 20 20  OR_CLASS_ID:.   
13e90 20 20 20 69 66 28 20 21 69 73 6c 6f 77 65 72 28     if( !islower(
13ea0 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
13eb0 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
13ec0 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f  ilename, psp->to
13ed0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
13ee0 20 20 20 20 20 22 25 25 74 6f 6b 65 6e 5f 63 6c       "%%token_cl
13ef0 61 73 73 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c  ass must be foll
13f00 6f 77 65 64 20 62 79 20 61 6e 20 69 64 65 6e 74  owed by an ident
13f10 69 66 69 65 72 3a 20 22 2c 20 78 29 3b 0a 20 20  ifier: ", x);.  
13f20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
13f30 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
13f40 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
13f50 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
13f60 52 4f 52 3b 0a 20 20 20 20 20 7d 65 6c 73 65 20  ROR;.     }else 
13f70 69 66 28 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  if( Symbol_find(
13f80 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  x) ){.        Er
13f90 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
13fa0 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e  name, psp->token
13fb0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
13fc0 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c 22    "Symbol \"%s\"
13fd0 20 61 6c 72 65 61 64 79 20 75 73 65 64 22 2c 20   already used", 
13fe0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
13ff0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
14000 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
14010 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
14020 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
14030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14040 70 73 70 2d 3e 74 6b 63 6c 61 73 73 20 3d 20 53  psp->tkclass = S
14050 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
14060 20 20 20 20 20 20 70 73 70 2d 3e 74 6b 63 6c 61        psp->tkcla
14070 73 73 2d 3e 74 79 70 65 20 3d 20 4d 55 4c 54 49  ss->type = MULTI
14080 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 20 20  TERMINAL;.      
14090 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
140a0 41 49 54 49 4e 47 5f 46 4f 52 5f 43 4c 41 53 53  AITING_FOR_CLASS
140b0 5f 54 4f 4b 45 4e 3b 0a 20 20 20 20 20 20 7d 0a  _TOKEN;.      }.
140c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
140d0 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
140e0 52 5f 43 4c 41 53 53 5f 54 4f 4b 45 4e 3a 0a 20  R_CLASS_TOKEN:. 
140f0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
14100 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  .' ){.        ps
14110 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
14120 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
14130 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
14140 20 69 66 28 20 69 73 75 70 70 65 72 28 78 5b 30   if( isupper(x[0
14150 5d 29 20 7c 7c 20 28 28 78 5b 30 5d 3d 3d 27 7c  ]) || ((x[0]=='|
14160 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20  ' || x[0]=='/') 
14170 26 26 20 69 73 75 70 70 65 72 28 78 5b 31 5d 29  && isupper(x[1])
14180 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ) ){.        str
14190 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20  uct symbol *msp 
141a0 3d 20 70 73 70 2d 3e 74 6b 63 6c 61 73 73 3b 0a  = psp->tkclass;.
141b0 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75          msp->nsu
141c0 62 73 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  bsym++;.        
141d0 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73  msp->subsym = (s
141e0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29  truct symbol **)
141f0 20 72 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75   realloc(msp->su
14200 62 73 79 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  bsym,.          
14210 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79  sizeof(struct sy
14220 6d 62 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62  mbol*)*msp->nsub
14230 73 79 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sym);.        if
14240 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29  ( !isupper(x[0])
14250 20 29 20 78 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) x++;.        
14260 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 6d 73 70 2d  msp->subsym[msp-
14270 3e 6e 73 75 62 73 79 6d 2d 31 5d 20 3d 20 53 79  >nsubsym-1] = Sy
14280 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
14290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
142a0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
142b0 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74  filename, psp->t
142c0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
142d0 20 20 20 20 20 20 22 25 25 74 6f 6b 65 6e 5f 63        "%%token_c
142e0 6c 61 73 73 20 61 72 67 75 6d 65 6e 74 20 5c 22  lass argument \"
142f0 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61  %s\" should be a
14300 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20   token", x);.   
14310 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
14320 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
14330 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
14340 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
14350 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
14360 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
14370 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  e RESYNC_AFTER_R
14380 55 4c 45 5f 45 52 52 4f 52 3a 0a 2f 2a 20 20 20  ULE_ERROR:./*   
14390 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
143a0 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20   ) psp->state = 
143b0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
143c0 5f 4f 52 5f 52 55 4c 45 3b 0a 2a 2a 20 20 20 20  _OR_RULE;.**    
143d0 20 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20    break; */.    
143e0 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45  case RESYNC_AFTE
143f0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3a 0a 20 20  R_DECL_ERROR:.  
14400 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e      if( x[0]=='.
14410 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d  ' ) psp->state =
14420 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
14430 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
14440 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29   if( x[0]=='%' )
14450 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
14460 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b  ITING_FOR_DECL_K
14470 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20 62 72  EYWORD;.      br
14480 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52  eak;.  }.}../* R
14490 75 6e 20 74 68 65 20 70 72 65 70 72 6f 63 65 73  un the preproces
144a0 73 6f 72 20 6f 76 65 72 20 74 68 65 20 69 6e 70  sor over the inp
144b0 75 74 20 66 69 6c 65 20 74 65 78 74 2e 20 20 54  ut file text.  T
144c0 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  he global variab
144d0 6c 65 73 0a 2a 2a 20 61 7a 44 65 66 69 6e 65 5b  les.** azDefine[
144e0 30 5d 20 74 68 72 6f 75 67 68 20 61 7a 44 65 66  0] through azDef
144f0 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 20 63  ine[nDefine-1] c
14500 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
14510 73 20 6f 66 20 61 6c 6c 20 64 65 66 69 6e 65 64  s of all defined
14520 0a 2a 2a 20 6d 61 63 72 6f 73 2e 20 20 54 68 69  .** macros.  Thi
14530 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
14540 66 6f 72 20 22 25 69 66 64 65 66 22 20 61 6e 64  for "%ifdef" and
14550 20 22 25 69 66 6e 64 65 66 22 20 61 6e 64 20 22   "%ifndef" and "
14560 25 65 6e 64 69 66 22 20 61 6e 64 0a 2a 2a 20 63  %endif" and.** c
14570 6f 6d 6d 65 6e 74 73 20 74 68 65 6d 20 6f 75 74  omments them out
14580 2e 20 20 54 65 78 74 20 69 6e 20 62 65 74 77 65  .  Text in betwe
14590 65 6e 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65  en is also comme
145a0 6e 74 65 64 20 6f 75 74 20 61 73 20 61 70 70 72  nted out as appr
145b0 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
145c0 69 63 20 76 6f 69 64 20 70 72 65 70 72 6f 63 65  ic void preproce
145d0 73 73 5f 69 6e 70 75 74 28 63 68 61 72 20 2a 7a  ss_input(char *z
145e0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  ){.  int i, j, k
145f0 2c 20 6e 3b 0a 20 20 69 6e 74 20 65 78 63 6c 75  , n;.  int exclu
14600 64 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 74  de = 0;.  int st
14610 61 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c  art = 0;.  int l
14620 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 69 6e 74  ineno = 1;.  int
14630 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20   start_lineno = 
14640 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  1;.  for(i=0; z[
14650 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
14660 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6c  ( z[i]=='\n' ) l
14670 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28  ineno++;.    if(
14680 20 7a 5b 69 5d 21 3d 27 25 27 20 7c 7c 20 28 69   z[i]!='%' || (i
14690 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 21 3d 27 5c  >0 && z[i-1]!='\
146a0 6e 27 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  n') ) continue;.
146b0 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
146c0 26 7a 5b 69 5d 2c 22 25 65 6e 64 69 66 22 2c 36  &z[i],"%endif",6
146d0 29 3d 3d 30 20 26 26 20 69 73 73 70 61 63 65 28  )==0 && isspace(
146e0 7a 5b 69 2b 36 5d 29 20 29 7b 0a 20 20 20 20 20  z[i+6]) ){.     
146f0 20 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a   if( exclude ){.
14700 20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 2d          exclude-
14710 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  -;.        if( e
14720 78 63 6c 75 64 65 3d 3d 30 20 29 7b 0a 20 20 20  xclude==0 ){.   
14730 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 73 74 61         for(j=sta
14740 72 74 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 20 69 66  rt; j<i; j++) if
14750 28 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 20 29 20 7a  ( z[j]!='\n' ) z
14760 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  [j] = ' ';.     
14770 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14780 20 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d     for(j=i; z[j]
14790 20 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20   && z[j]!='\n'; 
147a0 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b  j++) z[j] = ' ';
147b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
147c0 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25  strncmp(&z[i],"%
147d0 69 66 64 65 66 22 2c 36 29 3d 3d 30 20 26 26 20  ifdef",6)==0 && 
147e0 69 73 73 70 61 63 65 28 7a 5b 69 2b 36 5d 29 29  isspace(z[i+6]))
147f0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73  .          || (s
14800 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69  trncmp(&z[i],"%i
14810 66 6e 64 65 66 22 2c 37 29 3d 3d 30 20 26 26 20  fndef",7)==0 && 
14820 69 73 73 70 61 63 65 28 7a 5b 69 2b 37 5d 29 29  isspace(z[i+7]))
14830 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78   ){.      if( ex
14840 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20  clude ){.       
14850 20 65 78 63 6c 75 64 65 2b 2b 3b 0a 20 20 20 20   exclude++;.    
14860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14870 20 66 6f 72 28 6a 3d 69 2b 37 3b 20 69 73 73 70   for(j=i+7; issp
14880 61 63 65 28 7a 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b  ace(z[j]); j++){
14890 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6e 3d  }.        for(n=
148a0 30 3b 20 7a 5b 6a 2b 6e 5d 20 26 26 20 21 69 73  0; z[j+n] && !is
148b0 73 70 61 63 65 28 7a 5b 6a 2b 6e 5d 29 3b 20 6e  space(z[j+n]); n
148c0 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 65 78  ++){}.        ex
148d0 63 6c 75 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  clude = 1;.     
148e0 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 44     for(k=0; k<nD
148f0 65 66 69 6e 65 3b 20 6b 2b 2b 29 7b 0a 20 20 20  efine; k++){.   
14900 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
14910 6d 70 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 2c 26  mp(azDefine[k],&
14920 7a 5b 6a 5d 2c 6e 29 3d 3d 30 20 26 26 20 6c 65  z[j],n)==0 && le
14930 6d 6f 6e 53 74 72 6c 65 6e 28 61 7a 44 65 66 69  monStrlen(azDefi
14940 6e 65 5b 6b 5d 29 3d 3d 6e 20 29 7b 0a 20 20 20  ne[k])==n ){.   
14950 20 20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65           exclude
14960 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
14970 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
14980 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
14990 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 33         if( z[i+3
149a0 5d 3d 3d 27 6e 27 20 29 20 65 78 63 6c 75 64 65  ]=='n' ) exclude
149b0 20 3d 20 21 65 78 63 6c 75 64 65 3b 0a 20 20 20   = !exclude;.   
149c0 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65       if( exclude
149d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
149e0 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  art = i;.       
149f0 20 20 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20     start_lineno 
14a00 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  = lineno;.      
14a10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14a20 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20    for(j=i; z[j] 
14a30 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a  && z[j]!='\n'; j
14a40 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a  ++) z[j] = ' ';.
14a50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
14a60 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 66  exclude ){.    f
14a70 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 75  printf(stderr,"u
14a80 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 25 69 66  nterminated %%if
14a90 64 65 66 20 73 74 61 72 74 69 6e 67 20 6f 6e 20  def starting on 
14aa0 6c 69 6e 65 20 25 64 5c 6e 22 2c 20 73 74 61 72  line %d\n", star
14ab0 74 5f 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 65  t_lineno);.    e
14ac0 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  xit(1);.  }.}../
14ad0 2a 20 49 6e 20 73 70 69 74 65 20 6f 66 20 69 74  * In spite of it
14ae0 73 20 6e 61 6d 65 2c 20 74 68 69 73 20 66 75 6e  s name, this fun
14af0 63 74 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20  ction is really 
14b00 61 20 73 63 61 6e 6e 65 72 2e 20 20 49 74 20 72  a scanner.  It r
14b10 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 65 6e  ead.** in the en
14b20 74 69 72 65 20 69 6e 70 75 74 20 66 69 6c 65 20  tire input file 
14b30 28 61 6c 6c 20 61 74 20 6f 6e 63 65 29 20 74 68  (all at once) th
14b40 65 6e 20 74 6f 6b 65 6e 69 7a 65 73 20 69 74 2e  en tokenizes it.
14b50 20 20 45 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20    Each.** token 
14b60 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  is passed to the
14b70 20 66 75 6e 63 74 69 6f 6e 20 22 70 61 72 73 65   function "parse
14b80 6f 6e 65 74 6f 6b 65 6e 22 20 77 68 69 63 68 20  onetoken" which 
14b90 62 75 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74 68  builds all.** th
14ba0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 61  e appropriate da
14bb0 74 61 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ta structures in
14bc0 20 74 68 65 20 67 6c 6f 62 61 6c 20 73 74 61 74   the global stat
14bd0 65 20 76 65 63 74 6f 72 20 22 67 70 22 2e 0a 2a  e vector "gp"..*
14be0 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 73 74 72  /.void Parse(str
14bf0 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 29 0a 7b  uct lemon *gp).{
14c00 0a 20 20 73 74 72 75 63 74 20 70 73 74 61 74 65  .  struct pstate
14c10 20 70 73 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b   ps;.  FILE *fp;
14c20 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 62 75 66  .  char *filebuf
14c30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
14c40 20 66 69 6c 65 73 69 7a 65 3b 0a 20 20 69 6e 74   filesize;.  int
14c50 20 6c 69 6e 65 6e 6f 3b 0a 20 20 69 6e 74 20 63   lineno;.  int c
14c60 3b 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 6e  ;.  char *cp, *n
14c70 65 78 74 63 70 3b 0a 20 20 69 6e 74 20 73 74 61  extcp;.  int sta
14c80 72 74 6c 69 6e 65 20 3d 20 30 3b 0a 0a 20 20 6d  rtline = 0;..  m
14c90 65 6d 73 65 74 28 26 70 73 2c 20 27 5c 30 27 2c  emset(&ps, '\0',
14ca0 20 73 69 7a 65 6f 66 28 70 73 29 29 3b 0a 20 20   sizeof(ps));.  
14cb0 70 73 2e 67 70 20 3d 20 67 70 3b 0a 20 20 70 73  ps.gp = gp;.  ps
14cc0 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 67 70 2d 3e  .filename = gp->
14cd0 66 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 73 2e 65  filename;.  ps.e
14ce0 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 20 20 70  rrorcnt = 0;.  p
14cf0 73 2e 73 74 61 74 65 20 3d 20 49 4e 49 54 49 41  s.state = INITIA
14d00 4c 49 5a 45 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  LIZE;..  /* Begi
14d10 6e 20 62 79 20 72 65 61 64 69 6e 67 20 74 68 65  n by reading the
14d20 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
14d30 20 66 70 20 3d 20 66 6f 70 65 6e 28 70 73 2e 66   fp = fopen(ps.f
14d40 69 6c 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20  ilename,"rb");. 
14d50 20 69 66 28 20 66 70 3d 3d 30 20 29 7b 0a 20 20   if( fp==0 ){.  
14d60 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69    ErrorMsg(ps.fi
14d70 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20  lename,0,"Can't 
14d80 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65 20 66  open this file f
14d90 6f 72 20 72 65 61 64 69 6e 67 2e 22 29 3b 0a 20  or reading.");. 
14da0 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b     gp->errorcnt+
14db0 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
14dc0 20 7d 0a 20 20 66 73 65 65 6b 28 66 70 2c 30 2c   }.  fseek(fp,0,
14dd0 32 29 3b 0a 20 20 66 69 6c 65 73 69 7a 65 20 3d  2);.  filesize =
14de0 20 66 74 65 6c 6c 28 66 70 29 3b 0a 20 20 72 65   ftell(fp);.  re
14df0 77 69 6e 64 28 66 70 29 3b 0a 20 20 66 69 6c 65  wind(fp);.  file
14e00 62 75 66 20 3d 20 28 63 68 61 72 20 2a 29 6d 61  buf = (char *)ma
14e10 6c 6c 6f 63 28 20 66 69 6c 65 73 69 7a 65 2b 31  lloc( filesize+1
14e20 20 29 3b 0a 20 20 69 66 28 20 66 69 6c 65 73 69   );.  if( filesi
14e30 7a 65 3e 31 30 30 30 30 30 30 30 30 20 7c 7c 20  ze>100000000 || 
14e40 66 69 6c 65 62 75 66 3d 3d 30 20 29 7b 0a 20 20  filebuf==0 ){.  
14e50 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69    ErrorMsg(ps.fi
14e60 6c 65 6e 61 6d 65 2c 30 2c 22 49 6e 70 75 74 20  lename,0,"Input 
14e70 66 69 6c 65 20 74 6f 6f 20 6c 61 72 67 65 2e 22  file too large."
14e80 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72  );.    gp->error
14e90 63 6e 74 2b 2b 3b 0a 20 20 20 20 66 63 6c 6f 73  cnt++;.    fclos
14ea0 65 28 66 70 29 3b 0a 20 20 20 20 72 65 74 75 72  e(fp);.    retur
14eb0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65  n;.  }.  if( fre
14ec0 61 64 28 66 69 6c 65 62 75 66 2c 31 2c 66 69 6c  ad(filebuf,1,fil
14ed0 65 73 69 7a 65 2c 66 70 29 21 3d 66 69 6c 65 73  esize,fp)!=files
14ee0 69 7a 65 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ize ){.    Error
14ef0 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
14f00 30 2c 22 43 61 6e 27 74 20 72 65 61 64 20 69 6e  0,"Can't read in
14f10 20 61 6c 6c 20 25 64 20 62 79 74 65 73 20 6f 66   all %d bytes of
14f20 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20   this file.",.  
14f30 20 20 20 20 66 69 6c 65 73 69 7a 65 29 3b 0a 20      filesize);. 
14f40 20 20 20 66 72 65 65 28 66 69 6c 65 62 75 66 29     free(filebuf)
14f50 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63  ;.    gp->errorc
14f60 6e 74 2b 2b 3b 0a 20 20 20 20 66 63 6c 6f 73 65  nt++;.    fclose
14f70 28 66 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (fp);.    return
14f80 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  ;.  }.  fclose(f
14f90 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 5b 66 69  p);.  filebuf[fi
14fa0 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20  lesize] = 0;..  
14fb0 2f 2a 20 4d 61 6b 65 20 61 6e 20 69 6e 69 74 69  /* Make an initi
14fc0 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67 68 20  al pass through 
14fd0 74 68 65 20 66 69 6c 65 20 74 6f 20 68 61 6e 64  the file to hand
14fe0 6c 65 20 25 69 66 64 65 66 20 61 6e 64 20 25 69  le %ifdef and %i
14ff0 66 6e 64 65 66 20 2a 2f 0a 20 20 70 72 65 70 72  fndef */.  prepr
15000 6f 63 65 73 73 5f 69 6e 70 75 74 28 66 69 6c 65  ocess_input(file
15010 62 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20  buf);..  /* Now 
15020 73 63 61 6e 20 74 68 65 20 74 65 78 74 20 6f 66  scan the text of
15030 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
15040 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b  */.  lineno = 1;
15050 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c 65 62 75  .  for(cp=filebu
15060 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 3b 20  f; (c= *cp)!=0; 
15070 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  ){.    if( c=='\
15080 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 20  n' ) lineno++;  
15090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
150a0 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
150b0 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
150c0 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28      if( isspace(
150d0 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63 6f 6e 74  c) ){ cp++; cont
150e0 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53 6b 69 70  inue; }  /* Skip
150f0 20 61 6c 6c 20 77 68 69 74 65 20 73 70 61 63 65   all white space
15100 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   */.    if( c=='
15110 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27  /' && cp[1]=='/'
15120 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
15130 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63  Skip C++ style c
15140 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  omments */.     
15150 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68   cp+=2;.      wh
15160 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
15170 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70   && c!='\n' ) cp
15180 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ++;.      contin
15190 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
151a0 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31  ( c=='/' && cp[1
151b0 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20 20 20 20  ]=='*' ){       
151c0 20 20 20 2f 2a 20 53 6b 69 70 20 43 20 73 74 79     /* Skip C sty
151d0 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20  le comments */. 
151e0 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20       cp+=2;.    
151f0 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
15200 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20  )!=0 && (c!='/' 
15210 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a 27 29 20  || cp[-1]!='*') 
15220 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
15230 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
15240 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b  +;.        cp++;
15250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15260 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a 20 20 20  f( c ) cp++;.   
15270 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
15280 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 73   }.    ps.tokens
15290 74 61 72 74 20 3d 20 63 70 3b 20 20 20 20 20 20  tart = cp;      
152a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72            /* Mar
152b0 6b 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  k the beginning 
152c0 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a  of the token */.
152d0 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65      ps.tokenline
152e0 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20 20 20  no = lineno;    
152f0 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75         /* Linenu
15300 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 20 74 6f  mber on which to
15310 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20  ken begins */.  
15320 20 20 69 66 28 20 63 3d 3d 27 5c 22 27 20 29 7b    if( c=='\"' ){
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15340 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c       /* String l
15350 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20  iterals */.     
15360 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69   cp++;.      whi
15370 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
15380 26 26 20 63 21 3d 27 5c 22 27 20 29 7b 0a 20 20  && c!='\"' ){.  
15390 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
153a0 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
153b0 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
153c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
153d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  =0 ){.        Er
153e0 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
153f0 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c 0a 22 53  me,startline,."S
15400 74 72 69 6e 67 20 73 74 61 72 74 69 6e 67 20 6f  tring starting o
15410 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
15420 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65  ot terminated be
15430 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20  fore the end of 
15440 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20  the file.");.   
15450 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74       ps.errorcnt
15460 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  ++;.        next
15470 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d  cp = cp;.      }
15480 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65  else{.        ne
15490 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20  xtcp = cp+1;.   
154a0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
154b0 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20 20 20 20  f( c=='{' ){    
154c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
154d0 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f 64 65 20  block of C code 
154e0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 76  */.      int lev
154f0 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a  el;.      cp++;.
15500 20 20 20 20 20 20 66 6f 72 28 6c 65 76 65 6c 3d        for(level=
15510 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  1; (c= *cp)!=0 &
15520 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c 20 63 21  & (level>1 || c!
15530 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20  ='}'); cp++){.  
15540 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
15550 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
15560 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
15570 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c 2b 2b 3b  =='{' ) level++;
15580 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
15590 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65 76 65 6c  ( c=='}' ) level
155a0 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65  --;.        else
155b0 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
155c0 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 2f 2a  p[1]=='*' ){  /*
155d0 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74 73 20 2a   Skip comments *
155e0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
155f0 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20 20  prevc;.         
15600 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20   cp = &cp[2];.  
15610 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20          prevc = 
15620 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  0;.          whi
15630 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
15640 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 70 72  && (c!='/' || pr
15650 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20  evc!='*') ){.   
15660 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
15670 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
15680 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65  .            pre
15690 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  vc = c;.        
156a0 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
156b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
156c0 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26  lse if( c=='/' &
156d0 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20  & cp[1]=='/' ){ 
156e0 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79   /* Skip C++ sty
156f0 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 6f 20  le comments too 
15700 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 70 20  */.          cp 
15710 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20  = &cp[2];.      
15720 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a      while( (c= *
15730 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e  cp)!=0 && c!='\n
15740 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20  ' ) cp++;.      
15750 20 20 20 20 69 66 28 20 63 20 29 20 6c 69 6e 65      if( c ) line
15760 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  no++;.        }e
15770 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20  lse if( c=='\'' 
15780 7c 7c 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20  || c=='\"' ){   
15790 20 2f 2a 20 53 74 72 69 6e 67 20 61 20 63 68 61   /* String a cha
157a0 72 61 63 74 65 72 20 6c 69 74 65 72 61 6c 73 20  racter literals 
157b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  */.          int
157c0 20 73 74 61 72 74 63 68 61 72 2c 20 70 72 65 76   startchar, prev
157d0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  c;.          sta
157e0 72 74 63 68 61 72 20 3d 20 63 3b 0a 20 20 20 20  rtchar = c;.    
157f0 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b        prevc = 0;
15800 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 63  .          for(c
15810 70 2b 2b 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30  p++; (c= *cp)!=0
15820 20 26 26 20 28 63 21 3d 73 74 61 72 74 63 68 61   && (c!=startcha
15830 72 20 7c 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27  r || prevc=='\\'
15840 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ); cp++){.      
15850 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
15860 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
15870 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72            if( pr
15880 65 76 63 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76  evc=='\\' ) prev
15890 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
158a0 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
158b0 20 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a       prevc = c;.
158c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
158d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
158e0 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
158f0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
15900 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e  (ps.filename,ps.
15910 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20  tokenlineno,."C 
15920 63 6f 64 65 20 73 74 61 72 74 69 6e 67 20 6f 6e  code starting on
15930 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
15940 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66  t terminated bef
15950 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ore the end of t
15960 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20  he file.");.    
15970 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b      ps.errorcnt+
15980 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63  +;.        nextc
15990 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65  p = cp;.      }e
159a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  lse{.        nex
159b0 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20  tcp = cp+1;.    
159c0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
159d0 28 20 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 20  ( isalnum(c) ){ 
159e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 65 6e           /* Iden
159f0 74 69 66 69 65 72 73 20 2a 2f 0a 20 20 20 20 20  tifiers */.     
15a00 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29   while( (c= *cp)
15a10 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28  !=0 && (isalnum(
15a20 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20  c) || c=='_') ) 
15a30 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74  cp++;.      next
15a40 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c  cp = cp;.    }el
15a50 73 65 20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26  se if( c==':' &&
15a60 20 63 70 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63   cp[1]==':' && c
15a70 70 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20  p[2]=='=' ){ /* 
15a80 54 68 65 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a  The operator "::
15a90 3d 22 20 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b  =" */.      cp +
15aa0 3d 20 33 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  = 3;.      nextc
15ab0 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73  p = cp;.    }els
15ac0 65 20 69 66 28 20 28 63 3d 3d 27 2f 27 20 7c 7c  e if( (c=='/' ||
15ad0 20 63 3d 3d 27 7c 27 29 20 26 26 20 69 73 61 6c   c=='|') && isal
15ae0 70 68 61 28 63 70 5b 31 5d 29 20 29 7b 0a 20 20  pha(cp[1]) ){.  
15af0 20 20 20 20 63 70 20 2b 3d 20 32 3b 0a 20 20 20      cp += 2;.   
15b00 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a     while( (c = *
15b10 63 70 29 21 3d 30 20 26 26 20 28 69 73 61 6c 6e  cp)!=0 && (isaln
15b20 75 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29  um(c) || c=='_')
15b30 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e   ) cp++;.      n
15b40 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20  extcp = cp;.    
15b50 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20  }else{          
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b70 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e  /* All other (on
15b80 65 20 63 68 61 72 61 63 74 65 72 29 20 6f 70 65  e character) ope
15b90 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  rators */.      
15ba0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74  cp++;.      next
15bb0 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20  cp = cp;.    }. 
15bc0 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20     c = *cp;.    
15bd0 2a 63 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *cp = 0;        
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bf0 2f 2a 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  /* Null terminat
15c00 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20  e the token */. 
15c10 20 20 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e     parseonetoken
15c20 28 26 70 73 29 3b 20 20 20 20 20 20 20 20 20 20  (&ps);          
15c30 20 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20     /* Parse the 
15c40 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70  token */.    *cp
15c50 20 3d 20 28 63 68 61 72 29 63 3b 20 20 20 20 20   = (char)c;     
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c70 52 65 73 74 6f 72 65 20 74 68 65 20 62 75 66 66  Restore the buff
15c80 65 72 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e  er */.    cp = n
15c90 65 78 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65  extcp;.  }.  fre
15ca0 65 28 66 69 6c 65 62 75 66 29 3b 20 20 20 20 20  e(filebuf);     
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15cc0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 62 75  * Release the bu
15cd0 66 66 65 72 20 61 66 74 65 72 20 70 61 72 73 69  ffer after parsi
15ce0 6e 67 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65  ng */.  gp->rule
15cf0 20 3d 20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b   = ps.firstrule;
15d00 0a 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20  .  gp->errorcnt 
15d10 3d 20 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d  = ps.errorcnt;.}
15d20 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
15d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
15d40 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69  om the file "pli
15d50 6e 6b 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nk.c" **********
15d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
15d70 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63  ** Routines proc
15d80 65 73 73 69 6e 67 20 63 6f 6e 66 69 67 75 72 61  essing configura
15d90 74 69 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20  tion follow-set 
15da0 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
15db0 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f  s.** in the LEMO
15dc0 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
15dd0 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  or..*/.static st
15de0 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e  ruct plink *plin
15df0 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a  k_freelist = 0;.
15e00 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
15e10 65 77 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75  ew plink */.stru
15e20 63 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f  ct plink *Plink_
15e30 6e 65 77 28 29 7b 0a 20 20 73 74 72 75 63 74 20  new(){.  struct 
15e40 70 6c 69 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a  plink *newlink;.
15e50 0a 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65  .  if( plink_fre
15e60 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
15e70 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61  int i;.    int a
15e80 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c  mt = 100;.    pl
15e90 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 28  ink_freelist = (
15ea0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 63  struct plink *)c
15eb0 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65  alloc( amt, size
15ec0 6f 66 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 29  of(struct plink)
15ed0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 6c 69 6e   );.    if( plin
15ee0 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b  k_freelist==0 ){
15ef0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
15f00 74 64 65 72 72 2c 0a 20 20 20 20 20 20 22 55 6e  tderr,.      "Un
15f10 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
15f20 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65   memory for a ne
15f30 77 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f  w follow-set pro
15f40 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e  pagation link.\n
15f50 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
15f60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
15f70 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69  (i=0; i<amt-1; i
15f80 2b 2b 29 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  ++) plink_freeli
15f90 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c  st[i].next = &pl
15fa0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31  ink_freelist[i+1
15fb0 5d 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65  ];.    plink_fre
15fc0 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78  elist[amt-1].nex
15fd0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77  t = 0;.  }.  new
15fe0 6c 69 6e 6b 20 3d 20 70 6c 69 6e 6b 5f 66 72 65  link = plink_fre
15ff0 65 6c 69 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66  elist;.  plink_f
16000 72 65 65 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f  reelist = plink_
16010 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a  freelist->next;.
16020 20 20 72 65 74 75 72 6e 20 6e 65 77 6c 69 6e 6b    return newlink
16030 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c  ;.}../* Add a pl
16040 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c  ink to a plink l
16050 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
16060 6b 5f 61 64 64 28 73 74 72 75 63 74 20 70 6c 69  k_add(struct pli
16070 6e 6b 20 2a 2a 70 6c 70 70 2c 20 73 74 72 75 63  nk **plpp, struc
16080 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b  t config *cfp).{
16090 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
160a0 2a 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c  *newlink;.  newl
160b0 69 6e 6b 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28  ink = Plink_new(
160c0 29 3b 0a 20 20 6e 65 77 6c 69 6e 6b 2d 3e 6e 65  );.  newlink->ne
160d0 78 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70  xt = *plpp;.  *p
160e0 6c 70 70 20 3d 20 6e 65 77 6c 69 6e 6b 3b 0a 20  lpp = newlink;. 
160f0 20 6e 65 77 6c 69 6e 6b 2d 3e 63 66 70 20 3d 20   newlink->cfp = 
16100 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73  cfp;.}../* Trans
16110 66 65 72 20 65 76 65 72 79 20 70 6c 69 6e 6b 20  fer every plink 
16120 6f 6e 20 74 68 65 20 6c 69 73 74 20 22 66 72 6f  on the list "fro
16130 6d 22 20 74 6f 20 74 68 65 20 6c 69 73 74 20 22  m" to the list "
16140 74 6f 22 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  to" */.void Plin
16150 6b 5f 63 6f 70 79 28 73 74 72 75 63 74 20 70 6c  k_copy(struct pl
16160 69 6e 6b 20 2a 2a 74 6f 2c 20 73 74 72 75 63 74  ink **to, struct
16170 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 29 0a 7b 0a   plink *from).{.
16180 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
16190 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28  nextpl;.  while(
161a0 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78   from ){.    nex
161b0 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74  tpl = from->next
161c0 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74  ;.    from->next
161d0 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20   = *to;.    *to 
161e0 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d  = from;.    from
161f0 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d   = nextpl;.  }.}
16200 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72  ../* Delete ever
16210 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c  y plink on the l
16220 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
16230 6b 5f 64 65 6c 65 74 65 28 73 74 72 75 63 74 20  k_delete(struct 
16240 70 6c 69 6e 6b 20 2a 70 6c 70 29 0a 7b 0a 20 20  plink *plp).{.  
16250 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
16260 78 74 70 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20  xtpl;..  while( 
16270 70 6c 70 20 29 7b 0a 20 20 20 20 6e 65 78 74 70  plp ){.    nextp
16280 6c 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20  l = plp->next;. 
16290 20 20 20 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70     plp->next = p
162a0 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20  link_freelist;. 
162b0 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73     plink_freelis
162c0 74 20 3d 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70  t = plp;.    plp
162d0 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d   = nextpl;.  }.}
162e0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
162f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
16300 68 65 20 66 69 6c 65 20 22 72 65 70 6f 72 74 2e  he file "report.
16310 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
16320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
16330 2a 0a 2a 2a 20 50 72 6f 63 65 64 75 72 65 73 20  *.** Procedures 
16340 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 72  for generating r
16350 65 70 6f 72 74 73 20 61 6e 64 20 74 61 62 6c 65  eports and table
16360 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  s in the LEMON p
16370 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
16380 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  .*/../* Generate
16390 20 61 20 66 69 6c 65 6e 61 6d 65 20 77 69 74 68   a filename with
163a0 20 74 68 65 20 67 69 76 65 6e 20 73 75 66 66 69   the given suffi
163b0 78 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  x.  Space to hol
163c0 64 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f  d the.** name co
163d0 6d 65 73 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  mes from malloc(
163e0 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
163f0 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
16400 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
16410 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72 20  */.PRIVATE char 
16420 2a 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 73  *file_makename(s
16430 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
16440 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  p, const char *s
16450 75 66 66 69 78 29 0a 7b 0a 20 20 63 68 61 72 20  uffix).{.  char 
16460 2a 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63  *name;.  char *c
16470 70 3b 0a 0a 20 20 6e 61 6d 65 20 3d 20 28 63 68  p;..  name = (ch
16480 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f  ar*)malloc( lemo
16490 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69  nStrlen(lemp->fi
164a0 6c 65 6e 61 6d 65 29 20 2b 20 6c 65 6d 6f 6e 53  lename) + lemonS
164b0 74 72 6c 65 6e 28 73 75 66 66 69 78 29 20 2b 20  trlen(suffix) + 
164c0 35 20 29 3b 0a 20 20 69 66 28 20 6e 61 6d 65 3d  5 );.  if( name=
164d0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
164e0 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
164f0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
16500 6f 72 20 61 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e  or a filename.\n
16510 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
16520 0a 20 20 7d 0a 20 20 6c 65 6d 6f 6e 5f 73 74 72  .  }.  lemon_str
16530 63 70 79 28 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 66  cpy(name,lemp->f
16540 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 63 70 20 3d  ilename);.  cp =
16550 20 73 74 72 72 63 68 72 28 6e 61 6d 65 2c 27 2e   strrchr(name,'.
16560 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29 20 2a  ');.  if( cp ) *
16570 63 70 20 3d 20 30 3b 0a 20 20 6c 65 6d 6f 6e 5f  cp = 0;.  lemon_
16580 73 74 72 63 61 74 28 6e 61 6d 65 2c 73 75 66 66  strcat(name,suff
16590 69 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 61  ix);.  return na
165a0 6d 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61  me;.}../* Open a
165b0 20 66 69 6c 65 20 77 69 74 68 20 61 20 6e 61 6d   file with a nam
165c0 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6e  e based on the n
165d0 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ame of the input
165e0 20 66 69 6c 65 2c 0a 2a 2a 20 62 75 74 20 77 69   file,.** but wi
165f0 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 28  th a different (
16600 73 70 65 63 69 66 69 65 64 29 20 73 75 66 66 69  specified) suffi
16610 78 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  x, and return a 
16620 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
16630 65 20 73 74 72 65 61 6d 20 2a 2f 0a 50 52 49 56  e stream */.PRIV
16640 41 54 45 20 46 49 4c 45 20 2a 66 69 6c 65 5f 6f  ATE FILE *file_o
16650 70 65 6e 28 0a 20 20 73 74 72 75 63 74 20 6c 65  pen(.  struct le
16660 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 63 6f 6e  mon *lemp,.  con
16670 73 74 20 63 68 61 72 20 2a 73 75 66 66 69 78 2c  st char *suffix,
16680 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d  .  const char *m
16690 6f 64 65 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 66  ode.){.  FILE *f
166a0 70 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  p;..  if( lemp->
166b0 6f 75 74 6e 61 6d 65 20 29 20 66 72 65 65 28 6c  outname ) free(l
166c0 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20  emp->outname);. 
166d0 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d   lemp->outname =
166e0 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c   file_makename(l
166f0 65 6d 70 2c 20 73 75 66 66 69 78 29 3b 0a 20 20  emp, suffix);.  
16700 66 70 20 3d 20 66 6f 70 65 6e 28 6c 65 6d 70 2d  fp = fopen(lemp-
16710 3e 6f 75 74 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a  >outname,mode);.
16720 20 20 69 66 28 20 66 70 3d 3d 30 20 26 26 20 2a    if( fp==0 && *
16730 6d 6f 64 65 3d 3d 27 77 27 20 29 7b 0a 20 20 20  mode=='w' ){.   
16740 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
16750 22 43 61 6e 27 74 20 6f 70 65 6e 20 66 69 6c 65  "Can't open file
16760 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70   \"%s\".\n",lemp
16770 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 20 20  ->outname);.    
16780 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
16790 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
167a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 70 3b    }.  return fp;
167b0 0a 7d 0a 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65  .}../* Duplicate
167c0 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
167d0 77 69 74 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73  without comments
167e0 20 61 6e 64 20 77 69 74 68 6f 75 74 20 61 63 74   and without act
167f0 69 6f 6e 73 20 0a 2a 2a 20 6f 6e 20 72 75 6c 65  ions .** on rule
16800 73 20 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e  s */.void Reprin
16810 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  t(struct lemon *
16820 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74  lemp).{.  struct
16830 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72   rule *rp;.  str
16840 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
16850 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6d 61 78 6c    int i, j, maxl
16860 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e  en, len, ncolumn
16870 73 2c 20 73 6b 69 70 3b 0a 20 20 70 72 69 6e 74  s, skip;.  print
16880 66 28 22 2f 2f 20 52 65 70 72 69 6e 74 20 6f 66  f("// Reprint of
16890 20 69 6e 70 75 74 20 66 69 6c 65 20 5c 22 25 73   input file \"%s
168a0 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a  \".\n// Symbols:
168b0 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  \n",lemp->filena
168c0 6d 65 29 3b 0a 20 20 6d 61 78 6c 65 6e 20 3d 20  me);.  maxlen = 
168d0 31 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  10;.  for(i=0; i
168e0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
168f0 69 2b 2b 29 7b 0a 20 20 20 20 73 70 20 3d 20 6c  i++){.    sp = l
16900 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
16910 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e  .    len = lemon
16920 53 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29  Strlen(sp->name)
16930 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61  ;.    if( len>ma
16940 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20  xlen ) maxlen = 
16950 6c 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75  len;.  }.  ncolu
16960 6d 6e 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e  mns = 76/(maxlen
16970 2b 35 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75  +5);.  if( ncolu
16980 6d 6e 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73  mns<1 ) ncolumns
16990 20 3d 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28   = 1;.  skip = (
169a0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20  lemp->nsymbol + 
169b0 6e 63 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63  ncolumns - 1)/nc
169c0 6f 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d  olumns;.  for(i=
169d0 30 3b 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b  0; i<skip; i++){
169e0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22  .    printf("//"
169f0 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20  );.    for(j=i; 
16a00 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  j<lemp->nsymbol;
16a10 20 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20   j+=skip){.     
16a20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   sp = lemp->symb
16a30 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73  ols[j];.      as
16a40 73 65 72 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d  sert( sp->index=
16a50 3d 6a 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6e  =j );.      prin
16a60 74 66 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22  tf(" %3d %-*.*s"
16a70 2c 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e  ,j,maxlen,maxlen
16a80 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  ,sp->name);.    
16a90 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e  }.    printf("\n
16aa0 22 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70  ");.  }.  for(rp
16ab0 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
16ac0 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
16ad0 20 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c 72     printf("%s",r
16ae0 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  p->lhs->name);. 
16af0 20 20 20 2f 2a 20 20 20 20 69 66 28 20 72 70 2d     /*    if( rp-
16b00 3e 6c 68 73 61 6c 69 61 73 20 29 20 70 72 69 6e  >lhsalias ) prin
16b10 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68  tf("(%s)",rp->lh
16b20 73 61 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 20 20  salias); */.    
16b30 70 72 69 6e 74 66 28 22 20 3a 3a 3d 22 29 3b 0a  printf(" ::=");.
16b40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
16b50 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
16b60 20 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68       sp = rp->rh
16b70 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  s[i];.      if( 
16b80 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54  sp->type==MULTIT
16b90 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
16ba0 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c     printf(" %s",
16bb0 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e   sp->subsym[0]->
16bc0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 66  name);.        f
16bd0 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73  or(j=1; j<sp->ns
16be0 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ubsym; j++){.   
16bf0 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 7c         printf("|
16c00 25 73 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b  %s", sp->subsym[
16c10 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  j]->name);.     
16c20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
16c30 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
16c40 28 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65  (" %s", sp->name
16c50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16c60 20 2f 2a 20 69 66 28 20 72 70 2d 3e 72 68 73 61   /* if( rp->rhsa
16c70 6c 69 61 73 5b 69 5d 20 29 20 70 72 69 6e 74 66  lias[i] ) printf
16c80 28 22 28 25 73 29 22 2c 72 70 2d 3e 72 68 73 61  ("(%s)",rp->rhsa
16c90 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20 20  lias[i]); */.   
16ca0 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2e   }.    printf(".
16cb0 22 29 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  ");.    if( rp->
16cc0 70 72 65 63 73 79 6d 20 29 20 70 72 69 6e 74 66  precsym ) printf
16cd0 28 22 20 5b 25 73 5d 22 2c 72 70 2d 3e 70 72 65  (" [%s]",rp->pre
16ce0 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  csym->name);.   
16cf0 20 2f 2a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65   /* if( rp->code
16d00 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 20 20 20   ) printf("\n   
16d10 20 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 20   %s",rp->code); 
16d20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c  */.    printf("\
16d30 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64  n");.  }.}..void
16d40 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 46 49 4c   ConfigPrint(FIL
16d50 45 20 2a 66 70 2c 20 73 74 72 75 63 74 20 63 6f  E *fp, struct co
16d60 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73  nfig *cfp).{.  s
16d70 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
16d80 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
16d90 2a 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  *sp;.  int i, j;
16da0 0a 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b  .  rp = cfp->rp;
16db0 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25  .  fprintf(fp,"%
16dc0 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e  s ::=",rp->lhs->
16dd0 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  name);.  for(i=0
16de0 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68 73 3b 20 69  ; i<=rp->nrhs; i
16df0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d  ++){.    if( i==
16e00 63 66 70 2d 3e 64 6f 74 20 29 20 66 70 72 69 6e  cfp->dot ) fprin
16e10 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a 20 20 20  tf(fp," *");.   
16e20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73   if( i==rp->nrhs
16e30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 70   ) break;.    sp
16e40 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
16e50 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d     if( sp->type=
16e60 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
16e70 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
16e80 66 70 2c 22 20 25 73 22 2c 20 73 70 2d 3e 73 75  fp," %s", sp->su
16e90 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29 3b 0a  bsym[0]->name);.
16ea0 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a        for(j=1; j
16eb0 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b  <sp->nsubsym; j+
16ec0 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
16ed0 6e 74 66 28 66 70 2c 22 7c 25 73 22 2c 73 70 2d  ntf(fp,"|%s",sp-
16ee0 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65  >subsym[j]->name
16ef0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
16f00 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72 69  else{.      fpri
16f10 6e 74 66 28 66 70 2c 22 20 25 73 22 2c 20 73 70  ntf(fp," %s", sp
16f20 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  ->name);.    }. 
16f30 20 7d 0a 7d 0a 0a 2f 2a 20 23 64 65 66 69 6e 65   }.}../* #define
16f40 20 54 45 53 54 20 2a 2f 0a 23 69 66 20 30 0a 2f   TEST */.#if 0./
16f50 2a 20 50 72 69 6e 74 20 61 20 73 65 74 20 2a 2f  * Print a set */
16f60 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 53 65  .PRIVATE void Se
16f70 74 50 72 69 6e 74 28 6f 75 74 2c 73 65 74 2c 6c  tPrint(out,set,l
16f80 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a  emp).FILE *out;.
16f90 63 68 61 72 20 2a 73 65 74 3b 0a 73 74 72 75 63  char *set;.struc
16fa0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
16fb0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
16fc0 20 2a 73 70 61 63 65 72 3b 0a 20 20 73 70 61 63   *spacer;.  spac
16fd0 65 72 20 3d 20 22 22 3b 0a 20 20 66 70 72 69 6e  er = "";.  fprin
16fe0 74 66 28 6f 75 74 2c 22 25 31 32 73 5b 22 2c 22  tf(out,"%12s[","
16ff0 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
17000 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
17010 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
17020 53 65 74 46 69 6e 64 28 73 65 74 2c 69 29 20 29  SetFind(set,i) )
17030 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
17040 6f 75 74 2c 22 25 73 25 73 22 2c 73 70 61 63 65  out,"%s%s",space
17050 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  r,lemp->symbols[
17060 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  i]->name);.     
17070 20 73 70 61 63 65 72 20 3d 20 22 20 22 3b 0a 20   spacer = " ";. 
17080 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e     }.  }.  fprin
17090 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b 0a 7d  tf(out,"]\n");.}
170a0 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 70 6c 69  ../* Print a pli
170b0 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50 52 49 56  nk chain */.PRIV
170c0 41 54 45 20 76 6f 69 64 20 50 6c 69 6e 6b 50 72  ATE void PlinkPr
170d0 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74 61 67 29  int(out,plp,tag)
170e0 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75  .FILE *out;.stru
170f0 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 63  ct plink *plp;.c
17100 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20 20 77 68  har *tag;.{.  wh
17110 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20  ile( plp ){.    
17120 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32  fprintf(out,"%12
17130 73 25 73 20 28 73 74 61 74 65 20 25 32 64 29 20  s%s (state %2d) 
17140 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d 3e 63 66  ","",tag,plp->cf
17150 70 2d 3e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d  p->stp->statenum
17160 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 50 72 69  );.    ConfigPri
17170 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e 63 66 70 29  nt(out,plp->cfp)
17180 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
17190 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 70 6c 70  t,"\n");.    plp
171a0 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20   = plp->next;.  
171b0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 50  }.}.#endif../* P
171c0 72 69 6e 74 20 61 6e 20 61 63 74 69 6f 6e 20 74  rint an action t
171d0 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
171e0 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
171f0 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 2a 2a  turn FALSE if.**
17200 20 6e 6f 74 68 69 6e 67 20 77 61 73 20 61 63 74   nothing was act
17210 75 61 6c 6c 79 20 70 72 69 6e 74 65 64 2e 0a 2a  ually printed..*
17220 2f 0a 69 6e 74 20 50 72 69 6e 74 41 63 74 69 6f  /.int PrintActio
17230 6e 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  n(struct action 
17240 2a 61 70 2c 20 46 49 4c 45 20 2a 66 70 2c 20 69  *ap, FILE *fp, i
17250 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 69 6e  nt indent){.  in
17260 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20 20  t result = 1;.  
17270 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65  switch( ap->type
17280 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49   ){.    case SHI
17290 46 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74  FT:.      fprint
172a0 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20  f(fp,"%*s shift 
172b0 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e   %d",indent,ap->
172c0 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73  sp->name,ap->x.s
172d0 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20  tp->statenum);. 
172e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
172f0 63 61 73 65 20 52 45 44 55 43 45 3a 0a 20 20 20  case REDUCE:.   
17300 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
17310 2a 73 20 72 65 64 75 63 65 20 25 64 22 2c 69 6e  *s reduce %d",in
17320 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
17330 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65  e,ap->x.rp->inde
17340 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
17350 0a 20 20 20 20 63 61 73 65 20 41 43 43 45 50 54  .    case ACCEPT
17360 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
17370 66 70 2c 22 25 2a 73 20 61 63 63 65 70 74 22 2c  fp,"%*s accept",
17380 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e  indent,ap->sp->n
17390 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
173a0 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f  k;.    case ERRO
173b0 52 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  R:.      fprintf
173c0 28 66 70 2c 22 25 2a 73 20 65 72 72 6f 72 22 2c  (fp,"%*s error",
173d0 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e  indent,ap->sp->n
173e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
173f0 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 52 43 4f  k;.    case SRCO
17400 4e 46 4c 49 43 54 3a 0a 20 20 20 20 63 61 73 65  NFLICT:.    case
17410 20 52 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20   RRCONFLICT:.   
17420 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
17430 2a 73 20 72 65 64 75 63 65 20 25 2d 33 64 20 2a  *s reduce %-3d *
17440 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69  * Parsing confli
17450 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20  ct **",.        
17460 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e  indent,ap->sp->n
17470 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e  ame,ap->x.rp->in
17480 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dex);.      brea
17490 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 43 4f  k;.    case SSCO
174a0 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20 66 70  NFLICT:.      fp
174b0 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68  rintf(fp,"%*s sh
174c0 69 66 74 20 20 25 2d 33 64 20 2a 2a 20 50 61 72  ift  %-3d ** Par
174d0 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a  sing conflict **
174e0 22 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 64 65  ", .        inde
174f0 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
17500 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65  ap->x.stp->state
17510 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  num);.      brea
17520 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52  k;.    case SH_R
17530 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20 69  ESOLVED:.      i
17540 66 28 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63  f( showPrecedenc
17550 65 43 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20  eConflict ){.   
17560 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
17570 22 25 2a 73 20 73 68 69 66 74 20 20 25 2d 33 64  "%*s shift  %-3d
17580 20 2d 2d 20 64 72 6f 70 70 65 64 20 62 79 20 70   -- dropped by p
17590 72 65 63 65 64 65 6e 63 65 22 2c 0a 20 20 20 20  recedence",.    
175a0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 64 65              inde
175b0 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
175c0 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65  ap->x.stp->state
175d0 6e 75 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  num);.      }els
175e0 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 75 6c  e{.        resul
175f0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
17600 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
17610 63 61 73 65 20 52 44 5f 52 45 53 4f 4c 56 45 44  case RD_RESOLVED
17620 3a 0a 20 20 20 20 20 20 69 66 28 20 73 68 6f 77  :.      if( show
17630 50 72 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69  PrecedenceConfli
17640 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  ct ){.        fp
17650 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65  rintf(fp,"%*s re
17660 64 75 63 65 20 25 2d 33 64 20 2d 2d 20 64 72 6f  duce %-3d -- dro
17670 70 70 65 64 20 62 79 20 70 72 65 63 65 64 65 6e  pped by preceden
17680 63 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ce",.           
17690 20 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e       indent,ap->
176a0 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72  sp->name,ap->x.r
176b0 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  p->index);.     
176c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
176d0 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20  result = 0;.    
176e0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
176f0 0a 20 20 20 20 63 61 73 65 20 4e 4f 54 5f 55 53  .    case NOT_US
17700 45 44 3a 0a 20 20 20 20 20 20 72 65 73 75 6c 74  ED:.      result
17710 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
17720 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
17730 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65  result;.}../* Ge
17740 6e 65 72 61 74 65 20 74 68 65 20 22 79 2e 6f 75  nerate the "y.ou
17750 74 70 75 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a  tput" log file *
17760 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74  /.void ReportOut
17770 70 75 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  put(struct lemon
17780 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20   *lemp).{.  int 
17790 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
177a0 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
177b0 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20   config *cfp;.  
177c0 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
177d0 70 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a  p;.  FILE *fp;..
177e0 20 20 66 70 20 3d 20 66 69 6c 65 5f 6f 70 65 6e    fp = file_open
177f0 28 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c 22 77 62  (lemp,".out","wb
17800 22 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20  ");.  if( fp==0 
17810 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
17820 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
17830 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
17840 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
17850 64 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74  d[i];.    fprint
17860 66 28 66 70 2c 22 53 74 61 74 65 20 25 64 3a 5c  f(fp,"State %d:\
17870 6e 22 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d  n",stp->statenum
17880 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d  );.    if( lemp-
17890 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63 66 70  >basisflag ) cfp
178a0 3d 73 74 70 2d 3e 62 70 3b 0a 20 20 20 20 65 6c  =stp->bp;.    el
178b0 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
178c0 20 20 20 20 63 66 70 3d 73 74 70 2d 3e 63 66 70      cfp=stp->cfp
178d0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 66 70  ;.    while( cfp
178e0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 62   ){.      char b
178f0 75 66 5b 32 30 5d 3b 0a 20 20 20 20 20 20 69 66  uf[20];.      if
17900 28 20 63 66 70 2d 3e 64 6f 74 3d 3d 63 66 70 2d  ( cfp->dot==cfp-
17910 3e 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20  >rp->nrhs ){.   
17920 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e       lemon_sprin
17930 74 66 28 62 75 66 2c 22 28 25 64 29 22 2c 63 66  tf(buf,"(%d)",cf
17940 70 2d 3e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20  p->rp->index);. 
17950 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
17960 70 2c 22 20 20 20 20 25 35 73 20 22 2c 62 75 66  p,"    %5s ",buf
17970 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
17980 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
17990 66 70 2c 22 20 20 20 20 20 20 20 20 20 20 22 29  fp,"          ")
179a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
179b0 43 6f 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63  ConfigPrint(fp,c
179c0 66 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  fp);.      fprin
179d0 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66  tf(fp,"\n");.#if
179e0 20 30 0a 20 20 20 20 20 20 53 65 74 50 72 69 6e   0.      SetPrin
179f0 74 28 66 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65  t(fp,cfp->fws,le
17a00 6d 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b  mp);.      Plink
17a10 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70  Print(fp,cfp->fp
17a20 6c 70 2c 22 54 6f 20 20 22 29 3b 0a 20 20 20 20  lp,"To  ");.    
17a30 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c    PlinkPrint(fp,
17a40 63 66 70 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22  cfp->bplp,"From"
17a50 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
17a60 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66  if( lemp->basisf
17a70 6c 61 67 20 29 20 63 66 70 3d 63 66 70 2d 3e 62  lag ) cfp=cfp->b
17a80 70 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 20 20  p;.      else   
17a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
17aa0 66 70 3d 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20  fp=cfp->next;.  
17ab0 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
17ac0 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f  fp,"\n");.    fo
17ad0 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
17ae0 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
17af0 20 20 20 20 20 20 69 66 28 20 50 72 69 6e 74 41        if( PrintA
17b00 63 74 69 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20  ction(ap,fp,30) 
17b10 29 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e  ) fprintf(fp,"\n
17b20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  ");.    }.    fp
17b30 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a  rintf(fp,"\n");.
17b40 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 66 70    }.  fprintf(fp
17b50 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  , "-------------
17b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17b80 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66  -------\n");.  f
17b90 70 72 69 6e 74 66 28 66 70 2c 20 22 53 79 6d 62  printf(fp, "Symb
17ba0 6f 6c 73 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28  ols:\n");.  for(
17bb0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
17bc0 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
17bd0 69 6e 74 20 6a 3b 0a 20 20 20 20 73 74 72 75 63  int j;.    struc
17be0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20  t symbol *sp;.. 
17bf0 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79     sp = lemp->sy
17c00 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 66 70  mbols[i];.    fp
17c10 72 69 6e 74 66 28 66 70 2c 20 22 20 20 25 33 64  rintf(fp, "  %3d
17c20 3a 20 25 73 22 2c 20 69 2c 20 73 70 2d 3e 6e 61  : %s", i, sp->na
17c30 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d  me);.    if( sp-
17c40 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e  >type==NONTERMIN
17c50 41 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  AL ){.      fpri
17c60 6e 74 66 28 66 70 2c 20 22 3a 22 29 3b 0a 20 20  ntf(fp, ":");.  
17c70 20 20 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62      if( sp->lamb
17c80 64 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  da ){.        fp
17c90 72 69 6e 74 66 28 66 70 2c 20 22 20 3c 6c 61 6d  rintf(fp, " <lam
17ca0 62 64 61 3e 22 29 3b 0a 20 20 20 20 20 20 7d 0a  bda>");.      }.
17cb0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
17cc0 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
17cd0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
17ce0 69 66 28 20 73 70 2d 3e 66 69 72 73 74 73 65 74  if( sp->firstset
17cf0 20 26 26 20 53 65 74 46 69 6e 64 28 73 70 2d 3e   && SetFind(sp->
17d00 66 69 72 73 74 73 65 74 2c 20 6a 29 20 29 7b 0a  firstset, j) ){.
17d10 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
17d20 66 28 66 70 2c 20 22 20 25 73 22 2c 20 6c 65 6d  f(fp, " %s", lem
17d30 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e  p->symbols[j]->n
17d40 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ame);.        }.
17d50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17d60 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 5c    fprintf(fp, "\
17d70 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73  n");.  }.  fclos
17d80 65 28 66 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b  e(fp);.  return;
17d90 0a 7d 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f  .}../* Search fo
17da0 72 20 74 68 65 20 66 69 6c 65 20 22 6e 61 6d 65  r the file "name
17db0 22 20 77 68 69 63 68 20 69 73 20 69 6e 20 74 68  " which is in th
17dc0 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
17dd0 20 61 73 0a 2a 2a 20 74 68 65 20 65 78 61 63 75   as.** the exacu
17de0 74 61 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45  table */.PRIVATE
17df0 20 63 68 61 72 20 2a 70 61 74 68 73 65 61 72 63   char *pathsearc
17e00 68 28 63 68 61 72 20 2a 61 72 67 76 30 2c 20 63  h(char *argv0, c
17e10 68 61 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 20 6d  har *name, int m
17e20 6f 64 65 6d 61 73 6b 29 0a 7b 0a 20 20 63 6f 6e  odemask).{.  con
17e30 73 74 20 63 68 61 72 20 2a 70 61 74 68 6c 69 73  st char *pathlis
17e40 74 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68 62  t;.  char *pathb
17e50 75 66 70 74 72 3b 0a 20 20 63 68 61 72 20 2a 70  ufptr;.  char *p
17e60 61 74 68 62 75 66 3b 0a 20 20 63 68 61 72 20 2a  athbuf;.  char *
17e70 70 61 74 68 2c 2a 63 70 3b 0a 20 20 63 68 61 72  path,*cp;.  char
17e80 20 63 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49   c;..#ifdef __WI
17e90 4e 33 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72  N32__.  cp = str
17ea0 72 63 68 72 28 61 72 67 76 30 2c 27 5c 5c 27 29  rchr(argv0,'\\')
17eb0 3b 0a 23 65 6c 73 65 0a 20 20 63 70 20 3d 20 73  ;.#else.  cp = s
17ec0 74 72 72 63 68 72 28 61 72 67 76 30 2c 27 2f 27  trrchr(argv0,'/'
17ed0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
17ee0 63 70 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63  cp ){.    c = *c
17ef0 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a  p;.    *cp = 0;.
17f00 20 20 20 20 70 61 74 68 20 3d 20 28 63 68 61 72      path = (char
17f10 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e   *)malloc( lemon
17f20 53 74 72 6c 65 6e 28 61 72 67 76 30 29 20 2b 20  Strlen(argv0) + 
17f30 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d 65  lemonStrlen(name
17f40 29 20 2b 20 32 20 29 3b 0a 20 20 20 20 69 66 28  ) + 2 );.    if(
17f50 20 70 61 74 68 20 29 20 6c 65 6d 6f 6e 5f 73 70   path ) lemon_sp
17f60 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25  rintf(path,"%s/%
17f70 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b 0a  s",argv0,name);.
17f80 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 7d      *cp = c;.  }
17f90 65 6c 73 65 7b 0a 20 20 20 20 70 61 74 68 6c 69  else{.    pathli
17fa0 73 74 20 3d 20 67 65 74 65 6e 76 28 22 50 41 54  st = getenv("PAT
17fb0 48 22 29 3b 0a 20 20 20 20 69 66 28 20 70 61 74  H");.    if( pat
17fc0 68 6c 69 73 74 3d 3d 30 20 29 20 70 61 74 68 6c  hlist==0 ) pathl
17fd0 69 73 74 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f 75  ist = ".:/bin:/u
17fe0 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20 70 61 74  sr/bin";.    pat
17ff0 68 62 75 66 20 3d 20 28 63 68 61 72 20 2a 29 20  hbuf = (char *) 
18000 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72  malloc( lemonStr
18010 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 20 2b 20  len(pathlist) + 
18020 31 20 29 3b 0a 20 20 20 20 70 61 74 68 20 3d 20  1 );.    path = 
18030 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20  (char *)malloc( 
18040 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68  lemonStrlen(path
18050 6c 69 73 74 29 2b 6c 65 6d 6f 6e 53 74 72 6c 65  list)+lemonStrle
18060 6e 28 6e 61 6d 65 29 2b 32 20 29 3b 0a 20 20 20  n(name)+2 );.   
18070 20 69 66 28 20 28 70 61 74 68 62 75 66 20 21 3d   if( (pathbuf !=
18080 20 30 29 20 26 26 20 28 70 61 74 68 21 3d 30 29   0) && (path!=0)
18090 20 29 7b 0a 20 20 20 20 20 20 70 61 74 68 62 75   ){.      pathbu
180a0 66 70 74 72 20 3d 20 70 61 74 68 62 75 66 3b 0a  fptr = pathbuf;.
180b0 20 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 74 72 63        lemon_strc
180c0 70 79 28 70 61 74 68 62 75 66 2c 20 70 61 74 68  py(pathbuf, path
180d0 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  list);.      whi
180e0 6c 65 28 20 2a 70 61 74 68 62 75 66 20 29 7b 0a  le( *pathbuf ){.
180f0 20 20 20 20 20 20 20 20 63 70 20 3d 20 73 74 72          cp = str
18100 63 68 72 28 70 61 74 68 62 75 66 2c 27 3a 27 29  chr(pathbuf,':')
18110 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 70  ;.        if( cp
18120 3d 3d 30 20 29 20 63 70 20 3d 20 26 70 61 74 68  ==0 ) cp = &path
18130 62 75 66 5b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  buf[lemonStrlen(
18140 70 61 74 68 62 75 66 29 5d 3b 0a 20 20 20 20 20  pathbuf)];.     
18150 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20     c = *cp;.    
18160 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20      *cp = 0;.   
18170 20 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e       lemon_sprin
18180 74 66 28 70 61 74 68 2c 22 25 73 2f 25 73 22 2c  tf(path,"%s/%s",
18190 70 61 74 68 62 75 66 2c 6e 61 6d 65 29 3b 0a 20  pathbuf,name);. 
181a0 20 20 20 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a         *cp = c;.
181b0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30          if( c==0
181c0 20 29 20 70 61 74 68 62 75 66 5b 30 5d 20 3d 20   ) pathbuf[0] = 
181d0 30 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20  0;.        else 
181e0 70 61 74 68 62 75 66 20 3d 20 26 63 70 5b 31 5d  pathbuf = &cp[1]
181f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63  ;.        if( ac
18200 63 65 73 73 28 70 61 74 68 2c 6d 6f 64 65 6d 61  cess(path,modema
18210 73 6b 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  sk)==0 ) break;.
18220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72        }.      fr
18230 65 65 28 70 61 74 68 62 75 66 70 74 72 29 3b 0a  ee(pathbufptr);.
18240 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18250 72 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47  rn path;.}../* G
18260 69 76 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20  iven an action, 
18270 63 6f 6d 70 75 74 65 20 74 68 65 20 69 6e 74 65  compute the inte
18280 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ger value for th
18290 61 74 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69  at action.** whi
182a0 63 68 20 69 73 20 74 6f 20 62 65 20 70 75 74 20  ch is to be put 
182b0 69 6e 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  in the action ta
182c0 62 6c 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ble of the gener
182d0 61 74 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  ated machine..**
182e0 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
182f0 20 69 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68   if no action sh
18300 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65  ould be generate
18310 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e  d..*/.PRIVATE in
18320 74 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e  t compute_action
18330 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
18340 65 6d 70 2c 20 73 74 72 75 63 74 20 61 63 74 69  emp, struct acti
18350 6f 6e 20 2a 61 70 29 0a 7b 0a 20 20 69 6e 74 20  on *ap).{.  int 
18360 61 63 74 3b 0a 20 20 73 77 69 74 63 68 28 20 61  act;.  switch( a
18370 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20 20 63  p->type ){.    c
18380 61 73 65 20 53 48 49 46 54 3a 20 20 61 63 74 20  ase SHIFT:  act 
18390 3d 20 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61  = ap->x.stp->sta
183a0 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  tenum;          
183b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
183c0 65 20 52 45 44 55 43 45 3a 20 61 63 74 20 3d 20  e REDUCE: act = 
183d0 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20  ap->x.rp->index 
183e0 2b 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  + lemp->nstate; 
183f0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
18400 45 52 52 4f 52 3a 20 20 61 63 74 20 3d 20 6c 65  ERROR:  act = le
18410 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d  mp->nstate + lem
18420 70 2d 3e 6e 72 75 6c 65 3b 20 20 20 20 20 62 72  p->nrule;     br
18430 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 43  eak;.    case AC
18440 43 45 50 54 3a 20 61 63 74 20 3d 20 6c 65 6d 70  CEPT: act = lemp
18450 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d  ->nstate + lemp-
18460 3e 6e 72 75 6c 65 20 2b 20 31 3b 20 62 72 65 61  >nrule + 1; brea
18470 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
18480 20 20 20 20 61 63 74 20 3d 20 2d 31 3b 20 62 72      act = -1; br
18490 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
184a0 6e 20 61 63 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e  n act;.}..#defin
184b0 65 20 4c 49 4e 45 53 49 5a 45 20 31 30 30 30 0a  e LINESIZE 1000.
184c0 2f 2a 20 54 68 65 20 6e 65 78 74 20 63 6c 75 73  /* The next clus
184d0 74 65 72 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  ter of routines 
184e0 61 72 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  are for reading 
184f0 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  the template fil
18500 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 69 6e 67  e.** and writing
18510 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
18520 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70 61  the generated pa
18530 72 73 65 72 20 2a 2f 0a 2f 2a 20 54 68 65 20 66  rser */./* The f
18540 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20 74 72  irst function tr
18550 61 6e 73 66 65 72 73 20 64 61 74 61 20 66 72 6f  ansfers data fro
18560 6d 20 22 69 6e 22 20 74 6f 20 22 6f 75 74 22 20  m "in" to "out" 
18570 75 6e 74 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20  until.** a line 
18580 69 73 20 73 65 65 6e 20 77 68 69 63 68 20 62 65  is seen which be
18590 67 69 6e 73 20 77 69 74 68 20 22 25 25 22 2e 20  gins with "%%". 
185a0 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72   The line number
185b0 20 69 73 0a 2a 2a 20 74 72 61 63 6b 65 64 2e 0a   is.** tracked..
185c0 2a 2a 0a 2a 2a 20 69 66 20 6e 61 6d 65 21 3d 30  **.** if name!=0
185d0 2c 20 74 68 65 6e 20 61 6e 79 20 77 6f 72 64 20  , then any word 
185e0 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
185f0 22 50 61 72 73 65 22 20 69 73 20 63 68 61 6e 67  "Parse" is chang
18600 65 64 20 74 6f 0a 2a 2a 20 62 65 67 69 6e 20 77  ed to.** begin w
18610 69 74 68 20 2a 6e 61 6d 65 20 69 6e 73 74 65 61  ith *name instea
18620 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  d..*/.PRIVATE vo
18630 69 64 20 74 70 6c 74 5f 78 66 65 72 28 63 68 61  id tplt_xfer(cha
18640 72 20 2a 6e 61 6d 65 2c 20 46 49 4c 45 20 2a 69  r *name, FILE *i
18650 6e 2c 20 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e  n, FILE *out, in
18660 74 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20 69  t *lineno).{.  i
18670 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20  nt i, iStart;.  
18680 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49  char line[LINESI
18690 5a 45 5d 3b 0a 20 20 77 68 69 6c 65 28 20 66 67  ZE];.  while( fg
186a0 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a  ets(line,LINESIZ
186b0 45 2c 69 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30  E,in) && (line[0
186c0 5d 21 3d 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31  ]!='%' || line[1
186d0 5d 21 3d 27 25 27 29 20 29 7b 0a 20 20 20 20 28  ]!='%') ){.    (
186e0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20  *lineno)++;.    
186f0 69 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20  iStart = 0;.    
18700 69 66 28 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20  if( name ){.    
18710 20 20 66 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b    for(i=0; line[
18720 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
18730 20 20 69 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27    if( line[i]=='
18740 50 27 20 26 26 20 73 74 72 6e 63 6d 70 28 26 6c  P' && strncmp(&l
18750 69 6e 65 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35  ine[i],"Parse",5
18760 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  )==0.          &
18770 26 20 28 69 3d 3d 30 20 7c 7c 20 21 69 73 61 6c  & (i==0 || !isal
18780 70 68 61 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a  pha(line[i-1])).
18790 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
187a0 20 20 20 20 20 69 66 28 20 69 3e 69 53 74 61 72       if( i>iStar
187b0 74 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  t ) fprintf(out,
187c0 22 25 2e 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c  "%.*s",i-iStart,
187d0 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a  &line[iStart]);.
187e0 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
187f0 66 28 6f 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29  f(out,"%s",name)
18800 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
18810 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53   4;.          iS
18820 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20  tart = i+1;.    
18830 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
18840 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
18850 6f 75 74 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69  out,"%s",&line[i
18860 53 74 61 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a  Start]);.  }.}..
18870 2f 2a 20 54 68 65 20 6e 65 78 74 20 66 75 6e 63  /* The next func
18880 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 74  tion finds the t
18890 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 61 6e 64  emplate file and
188a0 20 6f 70 65 6e 73 20 69 74 2c 20 72 65 74 75 72   opens it, retur
188b0 6e 69 6e 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  ning.** a pointe
188c0 72 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  r to the opened 
188d0 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45  file. */.PRIVATE
188e0 20 46 49 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e   FILE *tplt_open
188f0 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
18900 65 6d 70 29 0a 7b 0a 20 20 73 74 61 74 69 63 20  emp).{.  static 
18910 63 68 61 72 20 74 65 6d 70 6c 61 74 65 6e 61 6d  char templatenam
18920 65 5b 5d 20 3d 20 22 6c 65 6d 70 61 72 2e 63 22  e[] = "lempar.c"
18930 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 31 30 30  ;.  char buf[100
18940 30 5d 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a  0];.  FILE *in;.
18950 20 20 63 68 61 72 20 2a 74 70 6c 74 6e 61 6d 65    char *tpltname
18960 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20  ;.  char *cp;.. 
18970 20 2f 2a 20 66 69 72 73 74 2c 20 73 65 65 20 69   /* first, see i
18980 66 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64  f user specified
18990 20 61 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65   a template file
189a0 6e 61 6d 65 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  name on the comm
189b0 61 6e 64 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 69  and line. */.  i
189c0 66 20 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65  f (user_template
189d0 6e 61 6d 65 20 21 3d 20 30 29 20 7b 0a 20 20 20  name != 0) {.   
189e0 20 69 66 28 20 61 63 63 65 73 73 28 75 73 65 72   if( access(user
189f0 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30  _templatename,00
18a00 34 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  4)==-1 ){.      
18a10 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
18a20 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65 20 70  Can't find the p
18a30 61 72 73 65 72 20 64 72 69 76 65 72 20 74 65 6d  arser driver tem
18a40 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c  plate file \"%s\
18a50 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 75  ".\n",.        u
18a60 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ser_templatename
18a70 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65  );.      lemp->e
18a80 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
18a90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
18aa0 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28  .    in = fopen(
18ab0 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
18ac0 65 2c 22 72 62 22 29 3b 0a 20 20 20 20 69 66 28  e,"rb");.    if(
18ad0 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   in==0 ){.      
18ae0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
18af0 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 65 20 74  Can't open the t
18b00 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25  emplate file \"%
18b10 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s\".\n",.       
18b20 20 20 20 20 20 20 20 75 73 65 72 5f 74 65 6d 70         user_temp
18b30 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  latename);.     
18b40 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
18b50 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  +;.      return 
18b60 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  0;.    }.    ret
18b70 75 72 6e 20 69 6e 3b 0a 20 20 7d 0a 0a 20 20 63  urn in;.  }..  c
18b80 70 20 3d 20 73 74 72 72 63 68 72 28 6c 65 6d 70  p = strrchr(lemp
18b90 2d 3e 66 69 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b  ->filename,'.');
18ba0 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20  .  if( cp ){.   
18bb0 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74 66 28 62   lemon_sprintf(b
18bc0 75 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e  uf,"%.*s.lt",(in
18bd0 74 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65  t)(cp-lemp->file
18be0 6e 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65  name),lemp->file
18bf0 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  name);.  }else{.
18c00 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74      lemon_sprint
18c10 66 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65  f(buf,"%s.lt",le
18c20 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
18c30 20 7d 0a 20 20 69 66 28 20 61 63 63 65 73 73 28   }.  if( access(
18c40 62 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20  buf,004)==0 ){. 
18c50 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75     tpltname = bu
18c60 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  f;.  }else if( a
18c70 63 63 65 73 73 28 74 65 6d 70 6c 61 74 65 6e 61  ccess(templatena
18c80 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20  me,004)==0 ){.  
18c90 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74 65 6d    tpltname = tem
18ca0 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c  platename;.  }el
18cb0 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65  se{.    tpltname
18cc0 20 3d 20 70 61 74 68 73 65 61 72 63 68 28 6c 65   = pathsearch(le
18cd0 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70 6c 61  mp->argv0,templa
18ce0 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20  tename,0);.  }. 
18cf0 20 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d 3d 30   if( tpltname==0
18d00 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
18d10 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69  stderr,"Can't fi
18d20 6e 64 20 74 68 65 20 70 61 72 73 65 72 20 64 72  nd the parser dr
18d30 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69  iver template fi
18d40 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20  le \"%s\".\n",. 
18d50 20 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29     templatename)
18d60 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
18d70 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
18d80 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d  rn 0;.  }.  in =
18d90 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d 65 2c   fopen(tpltname,
18da0 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d  "rb");.  if( in=
18db0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
18dc0 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
18dd0 6f 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  open the templat
18de0 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e  e file \"%s\".\n
18df0 22 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b  ",templatename);
18e00 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
18e10 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
18e20 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
18e30 6e 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e  n in;.}../* Prin
18e40 74 20 61 20 23 6c 69 6e 65 20 64 69 72 65 63 74  t a #line direct
18e50 69 76 65 20 6c 69 6e 65 20 74 6f 20 74 68 65 20  ive line to the 
18e60 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 2a 2f 0a  output file. */.
18e70 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c  PRIVATE void tpl
18e80 74 5f 6c 69 6e 65 64 69 72 28 46 49 4c 45 20 2a  t_linedir(FILE *
18e90 6f 75 74 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c  out, int lineno,
18ea0 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 29   char *filename)
18eb0 0a 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .{.  fprintf(out
18ec0 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 22 2c 6c  ,"#line %d \"",l
18ed0 69 6e 65 6e 6f 29 3b 0a 20 20 77 68 69 6c 65 28  ineno);.  while(
18ee0 20 2a 66 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20   *filename ){.  
18ef0 20 20 69 66 28 20 2a 66 69 6c 65 6e 61 6d 65 20    if( *filename 
18f00 3d 3d 20 27 5c 5c 27 20 29 20 70 75 74 63 28 27  == '\\' ) putc('
18f10 5c 5c 27 2c 6f 75 74 29 3b 0a 20 20 20 20 70 75  \\',out);.    pu
18f20 74 63 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f 75 74  tc(*filename,out
18f30 29 3b 0a 20 20 20 20 66 69 6c 65 6e 61 6d 65 2b  );.    filename+
18f40 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  +;.  }.  fprintf
18f50 28 6f 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a 7d 0a  (out,"\"\n");.}.
18f60 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 74 72 69  ./* Print a stri
18f70 6e 67 20 74 6f 20 74 68 65 20 66 69 6c 65 20 61  ng to the file a
18f80 6e 64 20 6b 65 65 70 20 74 68 65 20 6c 69 6e 65  nd keep the line
18f90 6e 75 6d 62 65 72 20 75 70 20 74 6f 20 64 61 74  number up to dat
18fa0 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  e */.PRIVATE voi
18fb0 64 20 74 70 6c 74 5f 70 72 69 6e 74 28 46 49 4c  d tplt_print(FIL
18fc0 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 6c  E *out, struct l
18fd0 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 68 61 72  emon *lemp, char
18fe0 20 2a 73 74 72 2c 20 69 6e 74 20 2a 6c 69 6e 65   *str, int *line
18ff0 6e 6f 29 0a 7b 0a 20 20 69 66 28 20 73 74 72 3d  no).{.  if( str=
19000 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
19010 68 69 6c 65 28 20 2a 73 74 72 20 29 7b 0a 20 20  hile( *str ){.  
19020 20 20 70 75 74 63 28 2a 73 74 72 2c 6f 75 74 29    putc(*str,out)
19030 3b 0a 20 20 20 20 69 66 28 20 2a 73 74 72 3d 3d  ;.    if( *str==
19040 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29  '\n' ) (*lineno)
19050 2b 2b 3b 0a 20 20 20 20 73 74 72 2b 2b 3b 0a 20  ++;.    str++;. 
19060 20 7d 0a 20 20 69 66 28 20 73 74 72 5b 2d 31 5d   }.  if( str[-1]
19070 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 70 75  !='\n' ){.    pu
19080 74 63 28 27 5c 6e 27 2c 6f 75 74 29 3b 0a 20 20  tc('\n',out);.  
19090 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20    (*lineno)++;. 
190a0 20 7d 0a 20 20 69 66 20 28 21 6c 65 6d 70 2d 3e   }.  if (!lemp->
190b0 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b  nolinenosflag) {
190c0 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  .    (*lineno)++
190d0 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f  ; tplt_linedir(o
190e0 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d  ut,*lineno,lemp-
190f0 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 20 7d 0a  >outname); .  }.
19100 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
19110 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
19120 20 72 6f 75 74 69 6e 65 20 65 6d 69 74 73 20 63   routine emits c
19130 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65 73 74  ode for the dest
19140 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 0a 2a  ructor for the.*
19150 2a 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76  * symbol sp.*/.v
19160 6f 69 64 20 65 6d 69 74 5f 64 65 73 74 72 75 63  oid emit_destruc
19170 74 6f 72 5f 63 6f 64 65 28 0a 20 20 46 49 4c 45  tor_code(.  FILE
19180 20 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63 74 20   *out,.  struct 
19190 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20 73 74  symbol *sp,.  st
191a0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
191b0 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a  ,.  int *lineno.
191c0 29 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d 20 30  ){. char *cp = 0
191d0 3b 0a 0a 20 69 66 28 20 73 70 2d 3e 74 79 70 65  ;.. if( sp->type
191e0 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ==TERMINAL ){.  
191f0 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65   cp = lemp->toke
19200 6e 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70  ndest;.   if( cp
19210 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
19220 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c   fprintf(out,"{\
19230 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n"); (*lineno)++
19240 3b 0a 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d  ;. }else if( sp-
19250 3e 64 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  >destructor ){. 
19260 20 20 63 70 20 3d 20 73 70 2d 3e 64 65 73 74 72    cp = sp->destr
19270 75 63 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e 74  uctor;.   fprint
19280 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a  f(out,"{\n"); (*
19290 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66  lineno)++;.   if
192a0 28 20 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e  ( !lemp->nolinen
192b0 6f 73 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 28  osflag ){.     (
192c0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20  *lineno)++;.    
192d0 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75   tplt_linedir(ou
192e0 74 2c 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f  t,sp->destLineno
192f0 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
19300 3b 0a 20 20 20 7d 0a 20 7d 65 6c 73 65 20 69 66  ;.   }. }else if
19310 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20  ( lemp->vardest 
19320 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d  ){.   cp = lemp-
19330 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 69 66 28  >vardest;.   if(
19340 20 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   cp==0 ) return;
19350 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
19360 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f  "{\n"); (*lineno
19370 29 2b 2b 3b 0a 20 7d 65 6c 73 65 7b 0a 20 20 20  )++;. }else{.   
19380 61 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a  assert( 0 );  /*
19390 20 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20 2a   Cannot happen *
193a0 2f 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a 63 70 3b  /. }. for(; *cp;
193b0 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66 28 20 2a   cp++){.   if( *
193c0 63 70 3d 3d 27 24 27 20 26 26 20 63 70 5b 31 5d  cp=='$' && cp[1]
193d0 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20 20 66 70  =='$' ){.     fp
193e0 72 69 6e 74 66 28 6f 75 74 2c 22 28 79 79 70 6d  rintf(out,"(yypm
193f0 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c 73 70 2d  inor->yy%d)",sp-
19400 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 63 70  >dtnum);.     cp
19410 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74 69 6e 75  ++;.     continu
19420 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66 28 20 2a  e;.   }.   if( *
19430 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e  cp=='\n' ) (*lin
19440 65 6e 6f 29 2b 2b 3b 0a 20 20 20 66 70 75 74 63  eno)++;.   fputc
19450 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20 66  (*cp,out);. }. f
19460 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29  printf(out,"\n")
19470 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20  ; (*lineno)++;. 
19480 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e  if (!lemp->nolin
19490 65 6e 6f 73 66 6c 61 67 29 20 7b 20 0a 20 20 20  enosflag) { .   
194a0 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c  (*lineno)++; tpl
194b0 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c  t_linedir(out,*l
194c0 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e  ineno,lemp->outn
194d0 61 6d 65 29 3b 20 0a 20 7d 0a 20 66 70 72 69 6e  ame); . }. fprin
194e0 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28  tf(out,"}\n"); (
194f0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 72 65 74  *lineno)++;. ret
19500 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  urn;.}../*.** Re
19510 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a  turn TRUE (non-z
19520 65 72 6f 29 20 69 66 20 74 68 65 20 67 69 76 65  ero) if the give
19530 6e 20 73 79 6d 62 6f 6c 20 68 61 73 20 61 20 64  n symbol has a d
19540 65 73 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e  estructor..*/.in
19550 74 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72  t has_destructor
19560 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
19570 73 70 2c 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  sp, struct lemon
19580 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20   *lemp).{.  int 
19590 72 65 74 3b 0a 20 20 69 66 28 20 73 70 2d 3e 74  ret;.  if( sp->t
195a0 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b  ype==TERMINAL ){
195b0 0a 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d  .    ret = lemp-
195c0 3e 74 6f 6b 65 6e 64 65 73 74 21 3d 30 3b 0a 20  >tokendest!=0;. 
195d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 20   }else{.    ret 
195e0 3d 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 21  = lemp->vardest!
195f0 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75  =0 || sp->destru
19600 63 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a 20 20 72  ctor!=0;.  }.  r
19610 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
19620 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20  .** Append text 
19630 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  to a dynamically
19640 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69 6e   allocated strin
19650 67 2e 20 20 49 66 20 7a 54 65 78 74 20 69 73 20  g.  If zText is 
19660 30 20 74 68 65 6e 0a 2a 2a 20 72 65 73 65 74 20  0 then.** reset 
19670 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20 62 65  the string to be
19680 20 65 6d 70 74 79 20 61 67 61 69 6e 2e 20 20 41   empty again.  A
19690 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
196a0 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 0a 2a   complete text.*
196b0 2a 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  * of the string 
196c0 28 77 68 69 63 68 20 69 73 20 6f 76 65 72 77 72  (which is overwr
196d0 69 74 74 65 6e 20 77 69 74 68 20 65 61 63 68 20  itten with each 
196e0 63 61 6c 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62  call)..**.** n b
196f0 79 74 65 73 20 6f 66 20 7a 54 65 78 74 20 61 72  ytes of zText ar
19700 65 20 73 74 6f 72 65 64 2e 20 20 49 66 20 6e 3d  e stored.  If n=
19710 3d 30 20 74 68 65 6e 20 61 6c 6c 20 6f 66 20 7a  =0 then all of z
19720 54 65 78 74 20 75 70 20 74 6f 20 74 68 65 20 66  Text up to the f
19730 69 72 73 74 0a 2a 2a 20 5c 30 30 30 20 74 65 72  irst.** \000 ter
19740 6d 69 6e 61 74 6f 72 20 69 73 20 73 74 6f 72 65  minator is store
19750 64 2e 20 20 7a 54 65 78 74 20 63 61 6e 20 63 6f  d.  zText can co
19760 6e 74 61 69 6e 20 75 70 20 74 6f 20 74 77 6f 20  ntain up to two 
19770 69 6e 73 74 61 6e 63 65 73 20 6f 66 0a 2a 2a 20  instances of.** 
19780 25 64 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20  %d.  The values 
19790 6f 66 20 70 31 20 61 6e 64 20 70 32 20 61 72 65  of p1 and p2 are
197a0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
197b0 65 20 66 69 72 73 74 20 61 6e 64 20 73 65 63 6f  e first and seco
197c0 6e 64 0a 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20  nd.** %d..**.** 
197d0 49 66 20 6e 3d 3d 2d 31 2c 20 74 68 65 6e 20 74  If n==-1, then t
197e0 68 65 20 70 72 65 76 69 6f 75 73 20 63 68 61 72  he previous char
197f0 61 63 74 65 72 20 69 73 20 6f 76 65 72 77 72 69  acter is overwri
19800 74 74 65 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  tten..*/.PRIVATE
19810 20 63 68 61 72 20 2a 61 70 70 65 6e 64 5f 73 74   char *append_st
19820 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  r(const char *zT
19830 65 78 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20  ext, int n, int 
19840 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 73  p1, int p2){.  s
19850 74 61 74 69 63 20 63 68 61 72 20 65 6d 70 74 79  tatic char empty
19860 5b 31 5d 20 3d 20 7b 20 30 20 7d 3b 0a 20 20 73  [1] = { 0 };.  s
19870 74 61 74 69 63 20 63 68 61 72 20 2a 7a 20 3d 20  tatic char *z = 
19880 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
19890 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 73  alloced = 0;.  s
198a0 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 20 3d  tatic int used =
198b0 20 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63   0;.  int c;.  c
198c0 68 61 72 20 7a 49 6e 74 5b 34 30 5d 3b 0a 20 20  har zInt[40];.  
198d0 69 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a  if( zText==0 ){.
198e0 20 20 20 20 75 73 65 64 20 3d 20 30 3b 0a 20 20      used = 0;.  
198f0 20 20 72 65 74 75 72 6e 20 7a 3b 0a 20 20 7d 0a    return z;.  }.
19900 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b 0a 20 20    if( n<=0 ){.  
19910 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
19920 20 20 20 75 73 65 64 20 2b 3d 20 6e 3b 0a 20 20     used += n;.  
19930 20 20 20 20 61 73 73 65 72 74 28 20 75 73 65 64      assert( used
19940 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >=0 );.    }.   
19950 20 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e   n = lemonStrlen
19960 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69  (zText);.  }.  i
19970 66 28 20 28 69 6e 74 29 20 28 6e 2b 73 69 7a 65  f( (int) (n+size
19980 6f 66 28 7a 49 6e 74 29 2a 32 2b 75 73 65 64 29  of(zInt)*2+used)
19990 20 3e 3d 20 61 6c 6c 6f 63 65 64 20 29 7b 0a 20   >= alloced ){. 
199a0 20 20 20 61 6c 6c 6f 63 65 64 20 3d 20 6e 20 2b     alloced = n +
199b0 20 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 20   sizeof(zInt)*2 
199c0 2b 20 75 73 65 64 20 2b 20 32 30 30 3b 0a 20 20  + used + 200;.  
199d0 20 20 7a 20 3d 20 28 63 68 61 72 20 2a 29 20 72    z = (char *) r
199e0 65 61 6c 6c 6f 63 28 7a 2c 20 20 61 6c 6c 6f 63  ealloc(z,  alloc
199f0 65 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ed);.  }.  if( z
19a00 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 65 6d 70  ==0 ) return emp
19a10 74 79 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d  ty;.  while( n--
19a20 20 3e 20 30 20 29 7b 0a 20 20 20 20 63 20 3d 20   > 0 ){.    c = 
19a30 2a 28 7a 54 65 78 74 2b 2b 29 3b 0a 20 20 20 20  *(zText++);.    
19a40 69 66 28 20 63 3d 3d 27 25 27 20 26 26 20 6e 3e  if( c=='%' && n>
19a50 30 20 26 26 20 7a 54 65 78 74 5b 30 5d 3d 3d 27  0 && zText[0]=='
19a60 64 27 20 29 7b 0a 20 20 20 20 20 20 6c 65 6d 6f  d' ){.      lemo
19a70 6e 5f 73 70 72 69 6e 74 66 28 7a 49 6e 74 2c 20  n_sprintf(zInt, 
19a80 22 25 64 22 2c 20 70 31 29 3b 0a 20 20 20 20 20  "%d", p1);.     
19a90 20 70 31 20 3d 20 70 32 3b 0a 20 20 20 20 20 20   p1 = p2;.      
19aa0 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 26 7a 5b  lemon_strcpy(&z[
19ab0 75 73 65 64 5d 2c 20 7a 49 6e 74 29 3b 0a 20 20  used], zInt);.  
19ac0 20 20 20 20 75 73 65 64 20 2b 3d 20 6c 65 6d 6f      used += lemo
19ad0 6e 53 74 72 6c 65 6e 28 26 7a 5b 75 73 65 64 5d  nStrlen(&z[used]
19ae0 29 3b 0a 20 20 20 20 20 20 7a 54 65 78 74 2b 2b  );.      zText++
19af0 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20  ;.      n--;.   
19b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b   }else{.      z[
19b10 75 73 65 64 2b 2b 5d 20 3d 20 28 63 68 61 72 29  used++] = (char)
19b20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  c;.    }.  }.  z
19b30 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20 20 72 65  [used] = 0;.  re
19b40 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn z;.}../*.**
19b50 20 7a 43 6f 64 65 20 69 73 20 61 20 73 74 72 69   zCode is a stri
19b60 6e 67 20 74 68 61 74 20 69 73 20 74 68 65 20 61  ng that is the a
19b70 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ction associated
19b80 20 77 69 74 68 20 61 20 72 75 6c 65 2e 20 20 45   with a rule.  E
19b90 78 70 61 6e 64 0a 2a 2a 20 74 68 65 20 73 79 6d  xpand.** the sym
19ba0 62 6f 6c 73 20 69 6e 20 74 68 69 73 20 73 74 72  bols in this str
19bb0 69 6e 67 20 73 6f 20 74 68 61 74 20 74 68 65 20  ing so that the 
19bc0 72 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74  refer to element
19bd0 73 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 0a  s of the parser.
19be0 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a 50 52 49  ** stack..*/.PRI
19bf0 56 41 54 45 20 76 6f 69 64 20 74 72 61 6e 73 6c  VATE void transl
19c00 61 74 65 5f 63 6f 64 65 28 73 74 72 75 63 74 20  ate_code(struct 
19c10 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72  lemon *lemp, str
19c20 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20  uct rule *rp){. 
19c30 20 63 68 61 72 20 2a 63 70 2c 20 2a 78 70 3b 0a   char *cp, *xp;.
19c40 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
19c50 6c 68 73 75 73 65 64 20 3d 20 30 3b 20 20 20 20  lhsused = 0;    
19c60 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 4c  /* True if the L
19c70 48 53 20 65 6c 65 6d 65 6e 74 20 68 61 73 20 62  HS element has b
19c80 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 63 68  een used */.  ch
19c90 61 72 20 75 73 65 64 5b 4d 41 58 52 48 53 5d 3b  ar used[MAXRHS];
19ca0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 65     /* True for e
19cb0 61 63 68 20 52 48 53 20 65 6c 65 6d 65 6e 74 20  ach RHS element 
19cc0 77 68 69 63 68 20 69 73 20 75 73 65 64 20 2a 2f  which is used */
19cd0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72  ..  for(i=0; i<r
19ce0 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75 73  p->nrhs; i++) us
19cf0 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 6c 68 73  ed[i] = 0;.  lhs
19d00 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28  used = 0;..  if(
19d10 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 7b 0a   rp->code==0 ){.
19d20 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
19d30 6e 65 77 6c 69 6e 65 73 74 72 5b 32 5d 20 3d 20  newlinestr[2] = 
19d40 7b 20 27 5c 6e 27 2c 20 27 5c 30 27 20 7d 3b 0a  { '\n', '\0' };.
19d50 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 6e      rp->code = n
19d60 65 77 6c 69 6e 65 73 74 72 3b 0a 20 20 20 20 72  ewlinestr;.    r
19d70 70 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d 3e 72 75  p->line = rp->ru
19d80 6c 65 6c 69 6e 65 3b 0a 20 20 7d 0a 0a 20 20 61  leline;.  }..  a
19d90 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c  ppend_str(0,0,0,
19da0 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63  0);..  /* This c
19db0 6f 6e 73 74 20 63 61 73 74 20 69 73 20 77 72 6f  onst cast is wro
19dc0 6e 67 20 62 75 74 20 68 61 72 6d 6c 65 73 73 2c  ng but harmless,
19dd0 20 69 66 20 77 65 27 72 65 20 63 61 72 65 66 75   if we're carefu
19de0 6c 2e 20 2a 2f 0a 20 20 66 6f 72 28 63 70 3d 28  l. */.  for(cp=(
19df0 63 68 61 72 20 2a 29 72 70 2d 3e 63 6f 64 65 3b  char *)rp->code;
19e00 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20   *cp; cp++){.   
19e10 20 69 66 28 20 69 73 61 6c 70 68 61 28 2a 63 70   if( isalpha(*cp
19e20 29 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63 6f  ) && (cp==rp->co
19e30 64 65 20 7c 7c 20 28 21 69 73 61 6c 6e 75 6d 28  de || (!isalnum(
19e40 63 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d 31  cp[-1]) && cp[-1
19e50 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20 20  ]!='_')) ){.    
19e60 20 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20 20    char saved;.  
19e70 20 20 20 20 66 6f 72 28 78 70 3d 20 26 63 70 5b      for(xp= &cp[
19e80 31 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a 78 70 29  1]; isalnum(*xp)
19e90 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20 78 70   || *xp=='_'; xp
19ea0 2b 2b 29 3b 0a 20 20 20 20 20 20 73 61 76 65 64  ++);.      saved
19eb0 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20 2a 78   = *xp;.      *x
19ec0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  p = 0;.      if(
19ed0 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26   rp->lhsalias &&
19ee0 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 6c   strcmp(cp,rp->l
19ef0 68 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a 20  hsalias)==0 ){. 
19f00 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74         append_st
19f10 72 28 22 79 79 67 6f 74 6f 6d 69 6e 6f 72 2e 79  r("yygotominor.y
19f20 79 25 64 22 2c 30 2c 72 70 2d 3e 6c 68 73 2d 3e  y%d",0,rp->lhs->
19f30 64 74 6e 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20  dtnum,0);.      
19f40 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20    cp = xp;.     
19f50 20 20 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a     lhsused = 1;.
19f60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19f70 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
19f80 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
19f90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 70            if( rp
19fa0 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26  ->rhsalias[i] &&
19fb0 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 72   strcmp(cp,rp->r
19fc0 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20 29  hsalias[i])==0 )
19fd0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
19fe0 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64 65 20 26  ( cp!=rp->code &
19ff0 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27 20 29 7b  & cp[-1]=='@' ){
1a000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
1a010 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e  * If the argumen
1a020 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
1a030 20 40 58 20 74 68 65 6e 20 73 75 62 73 74 69 74   @X then substit
1a040 75 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  uted.           
1a050 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b 65 6e 20     ** the token 
1a060 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20 6e 6f 74  number of X, not
1a070 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 58 20   the value of X 
1a080 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1a090 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d   append_str("yym
1a0a0 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22 2c 2d 31  sp[%d].major",-1
1a0b0 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 30 29  ,i-rp->nrhs+1,0)
1a0c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
1a0d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1a0e0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1a0f0 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   *sp = rp->rhs[i
1a100 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
1a110 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20 20 20 20   int dtnum;.    
1a120 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 70            if( sp
1a130 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
1a140 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
1a150 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20 3d           dtnum =
1a160 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e   sp->subsym[0]->
1a170 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  dtnum;.         
1a180 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a190 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e 75              dtnu
1a1a0 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d 3b 0a 20  m = sp->dtnum;. 
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
1a1d0 65 6e 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25  end_str("yymsp[%
1a1e0 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30  d].minor.yy%d",0
1a1f0 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 20 64  ,i-rp->nrhs+1, d
1a200 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  tnum);.         
1a210 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1a220 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20   cp = xp;.      
1a230 20 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d 20        used[i] = 
1a240 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  1;.            b
1a250 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1a260 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1a270 20 20 7d 0a 20 20 20 20 20 20 2a 78 70 20 3d 20    }.      *xp = 
1a280 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  saved;.    }.   
1a290 20 61 70 70 65 6e 64 5f 73 74 72 28 63 70 2c 20   append_str(cp, 
1a2a0 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 20 2f 2a  1, 0, 0);.  } /*
1a2b0 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20   End loop */..  
1a2c0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  /* Check to make
1a2d0 20 73 75 72 65 20 74 68 65 20 4c 48 53 20 68 61   sure the LHS ha
1a2e0 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20  s been used */. 
1a2f0 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61   if( rp->lhsalia
1a300 73 20 26 26 20 21 6c 68 73 75 73 65 64 20 29 7b  s && !lhsused ){
1a310 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65  .    ErrorMsg(le
1a320 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
1a330 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20  >ruleline,.     
1a340 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c 22 20 66   "Label \"%s\" f
1a350 6f 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73  or \"%s(%s)\" is
1a360 20 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20   never used.",. 
1a370 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c         rp->lhsal
1a380 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d  ias,rp->lhs->nam
1a390 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b  e,rp->lhsalias);
1a3a0 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
1a3b0 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  cnt++;.  }..  /*
1a3c0 20 47 65 6e 65 72 61 74 65 20 64 65 73 74 72 75   Generate destru
1a3d0 63 74 6f 72 20 63 6f 64 65 20 66 6f 72 20 52 48  ctor code for RH
1a3e0 53 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20  S symbols which 
1a3f0 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20  are not used in 
1a400 74 68 65 0a 20 20 2a 2a 20 72 65 64 75 63 65 20  the.  ** reduce 
1a410 63 6f 64 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  code */.  for(i=
1a420 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
1a430 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d  ++){.    if( rp-
1a440 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26 20  >rhsalias[i] && 
1a450 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20  !used[i] ){.    
1a460 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
1a470 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
1a480 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20  leline,.        
1a490 22 4c 61 62 65 6c 20 25 73 20 66 6f 72 20 5c 22  "Label %s for \"
1a4a0 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65  %s(%s)\" is neve
1a4b0 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20  r used.",.      
1a4c0 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69    rp->rhsalias[i
1a4d0 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61  ],rp->rhs[i]->na
1a4e0 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  me,rp->rhsalias[
1a4f0 69 5d 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d  i]);.      lemp-
1a500 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
1a510 20 7d 65 6c 73 65 20 69 66 28 20 72 70 2d 3e 72   }else if( rp->r
1a520 68 73 61 6c 69 61 73 5b 69 5d 3d 3d 30 20 29 7b  hsalias[i]==0 ){
1a530 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 5f 64  .      if( has_d
1a540 65 73 74 72 75 63 74 6f 72 28 72 70 2d 3e 72 68  estructor(rp->rh
1a550 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20  s[i],lemp) ){.  
1a560 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
1a570 28 22 20 20 79 79 5f 64 65 73 74 72 75 63 74 6f  ("  yy_destructo
1a580 72 28 79 79 70 50 61 72 73 65 72 2c 25 64 2c 26  r(yypParser,%d,&
1a590 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29  yymsp[%d].minor)
1a5a0 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20 20  ;\n", 0,.       
1a5b0 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e      rp->rhs[i]->
1a5c0 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72 68 73  index,i-rp->nrhs
1a5d0 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
1a5e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20  {.        /* No 
1a5f0 64 65 73 74 72 75 63 74 6f 72 20 64 65 66 69 6e  destructor defin
1a600 65 64 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d  ed for this term
1a610 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
1a620 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 70 2d 3e  }.  }.  if( rp->
1a630 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 70 20 3d  code ){.    cp =
1a640 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c   append_str(0,0,
1a650 30 2c 30 29 3b 0a 20 20 20 20 72 70 2d 3e 63 6f  0,0);.    rp->co
1a660 64 65 20 3d 20 53 74 72 73 61 66 65 28 63 70 3f  de = Strsafe(cp?
1a670 63 70 3a 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  cp:"");.  }.}../
1a680 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  * .** Generate c
1a690 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
1a6a0 65 73 20 77 68 65 6e 20 74 68 65 20 72 75 6c 65  es when the rule
1a6b0 20 22 72 70 22 20 69 73 20 72 65 64 75 63 65 64   "rp" is reduced
1a6c0 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20  .  Write.** the 
1a6d0 63 6f 64 65 20 74 6f 20 22 6f 75 74 22 2e 20 20  code to "out".  
1a6e0 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e 65 6e 6f  Make sure lineno
1a6f0 20 73 74 61 79 73 20 75 70 2d 74 6f 2d 64 61 74   stays up-to-dat
1a700 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  e..*/.PRIVATE vo
1a710 69 64 20 65 6d 69 74 5f 63 6f 64 65 28 0a 20 20  id emit_code(.  
1a720 46 49 4c 45 20 2a 6f 75 74 2c 0a 20 20 73 74 72  FILE *out,.  str
1a730 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 0a 20 20  uct rule *rp,.  
1a740 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
1a750 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e  mp,.  int *linen
1a760 6f 0a 29 7b 0a 20 63 6f 6e 73 74 20 63 68 61 72  o.){. const char
1a770 20 2a 63 70 3b 0a 0a 20 2f 2a 20 47 65 6e 65 72   *cp;.. /* Gener
1a780 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  ate code to do t
1a790 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e  he reduce action
1a7a0 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64   */. if( rp->cod
1a7b0 65 20 29 7b 0a 20 20 20 69 66 28 20 21 6c 65 6d  e ){.   if( !lem
1a7c0 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
1a7d0 20 29 7b 0a 20 20 20 20 20 28 2a 6c 69 6e 65 6e   ){.     (*linen
1a7e0 6f 29 2b 2b 3b 0a 20 20 20 20 20 74 70 6c 74 5f  o)++;.     tplt_
1a7f0 6c 69 6e 65 64 69 72 28 6f 75 74 2c 72 70 2d 3e  linedir(out,rp->
1a800 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  line,lemp->filen
1a810 61 6d 65 29 3b 0a 20 20 20 7d 0a 20 20 20 66 70  ame);.   }.   fp
1a820 72 69 6e 74 66 28 6f 75 74 2c 22 7b 25 73 22 2c  rintf(out,"{%s",
1a830 72 70 2d 3e 63 6f 64 65 29 3b 0a 20 20 20 66 6f  rp->code);.   fo
1a840 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a  r(cp=rp->code; *
1a850 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20  cp; cp++){.     
1a860 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20  if( *cp=='\n' ) 
1a870 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
1a880 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f  } /* End loop */
1a890 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
1a8a0 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f  "}\n"); (*lineno
1a8b0 29 2b 2b 3b 0a 20 20 20 69 66 28 20 21 6c 65 6d  )++;.   if( !lem
1a8c0 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
1a8d0 20 29 7b 0a 20 20 20 20 20 28 2a 6c 69 6e 65 6e   ){.     (*linen
1a8e0 6f 29 2b 2b 3b 0a 20 20 20 20 20 74 70 6c 74 5f  o)++;.     tplt_
1a8f0 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e  linedir(out,*lin
1a900 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  eno,lemp->outnam
1a910 65 29 3b 0a 20 20 20 7d 0a 20 7d 20 2f 2a 20 45  e);.   }. } /* E
1a920 6e 64 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20  nd if( rp->code 
1a930 29 20 2a 2f 0a 0a 20 72 65 74 75 72 6e 3b 0a 7d  ) */.. return;.}
1a940 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  ../*.** Print th
1a950 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20  e definition of 
1a960 74 68 65 20 75 6e 69 6f 6e 20 75 73 65 64 20 66  the union used f
1a970 6f 72 20 74 68 65 20 70 61 72 73 65 72 27 73 20  or the parser's 
1a980 64 61 74 61 20 73 74 61 63 6b 2e 0a 2a 2a 20 54  data stack..** T
1a990 68 69 73 20 75 6e 69 6f 6e 20 63 6f 6e 74 61 69  his union contai
1a9a0 6e 73 20 66 69 65 6c 64 73 20 66 6f 72 20 65 76  ns fields for ev
1a9b0 65 72 79 20 70 6f 73 73 69 62 6c 65 20 64 61 74  ery possible dat
1a9c0 61 20 74 79 70 65 20 66 6f 72 20 74 6f 6b 65 6e  a type for token
1a9d0 73 0a 2a 2a 20 61 6e 64 20 6e 6f 6e 74 65 72 6d  s.** and nonterm
1a9e0 69 6e 61 6c 73 2e 20 20 49 6e 20 74 68 65 20 70  inals.  In the p
1a9f0 72 6f 63 65 73 73 20 6f 66 20 63 6f 6d 70 75 74  rocess of comput
1aa00 69 6e 67 20 61 6e 64 20 70 72 69 6e 74 69 6e 67  ing and printing
1aa10 20 74 68 69 73 0a 2a 2a 20 75 6e 69 6f 6e 2c 20   this.** union, 
1aa20 61 6c 73 6f 20 73 65 74 20 74 68 65 20 22 2e 64  also set the ".d
1aa30 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66 20 65  tnum" field of e
1aa40 76 65 72 79 20 74 65 72 6d 69 6e 61 6c 20 61 6e  very terminal an
1aa50 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 0a 2a 2a  d nonterminal.**
1aa60 20 73 79 6d 62 6f 6c 2e 0a 2a 2f 0a 76 6f 69 64   symbol..*/.void
1aa70 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69   print_stack_uni
1aa80 6f 6e 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c  on(.  FILE *out,
1aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aaa0 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20    /* The output 
1aab0 73 74 72 65 61 6d 20 2a 2f 0a 20 20 73 74 72 75  stream */.  stru
1aac0 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20  ct lemon *lemp, 
1aad0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
1aae0 61 69 6e 20 69 6e 66 6f 20 73 74 72 75 63 74 75  ain info structu
1aaf0 72 65 20 66 6f 72 20 74 68 69 73 20 70 61 72 73  re for this pars
1ab00 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6c 69  er */.  int *pli
1ab10 6e 65 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  neno,           
1ab20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1ab30 6f 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65  o the line numbe
1ab40 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 68 66 6c 61  r */.  int mhfla
1ab50 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
1ab60 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 67 65     /* True if ge
1ab70 6e 65 72 61 74 69 6e 67 20 6d 61 6b 65 68 65 61  nerating makehea
1ab80 64 65 72 73 20 6f 75 74 70 75 74 20 2a 2f 0a 29  ders output */.)
1ab90 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d  {.  int lineno =
1aba0 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20 2f 2a   *plineno;    /*
1abb0 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72   The line number
1abc0 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20 2a   of the output *
1abd0 2f 0a 20 20 63 68 61 72 20 2a 2a 74 79 70 65 73  /.  char **types
1abe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1abf0 20 41 20 68 61 73 68 20 74 61 62 6c 65 20 6f 66   A hash table of
1ac00 20 64 61 74 61 74 79 70 65 73 20 2a 2f 0a 20 20   datatypes */.  
1ac10 69 6e 74 20 61 72 72 61 79 73 69 7a 65 3b 20 20  int arraysize;  
1ac20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1ac30 65 20 6f 66 20 74 68 65 20 22 74 79 70 65 73 22  e of the "types"
1ac40 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
1ac50 6d 61 78 64 74 6c 65 6e 67 74 68 3b 20 20 20 20  maxdtlength;    
1ac60 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
1ac70 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e 79 20 22   length of any "
1ac80 2e 64 61 74 61 74 79 70 65 22 20 66 69 65 6c 64  .datatype" field
1ac90 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74 64  . */.  char *std
1aca0 64 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dt;             
1acb0 20 2f 2a 20 53 74 61 6e 64 61 72 64 69 7a 65 64   /* Standardized
1acc0 20 6e 61 6d 65 20 66 6f 72 20 61 20 64 61 74 61   name for a data
1acd0 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  type */.  int i,
1ace0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
1acf0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1ad00 74 65 72 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ters */.  unsign
1ad10 65 64 20 68 61 73 68 3b 20 20 20 20 20 20 20 20  ed hash;        
1ad20 20 20 20 20 2f 2a 20 46 6f 72 20 68 61 73 68 69      /* For hashi
1ad30 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ng the name of a
1ad40 20 74 79 70 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   type */.  const
1ad50 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20   char *name;    
1ad60 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1ad70 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 0a 20  the parser */.. 
1ad80 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64   /* Allocate and
1ad90 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 79 70 65   initialize type
1ada0 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65  s[] and allocate
1adb0 20 73 74 64 64 74 5b 5d 20 2a 2f 0a 20 20 61 72   stddt[] */.  ar
1adc0 72 61 79 73 69 7a 65 20 3d 20 6c 65 6d 70 2d 3e  raysize = lemp->
1add0 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b 0a 20 20 74  nsymbol * 2;.  t
1ade0 79 70 65 73 20 3d 20 28 63 68 61 72 2a 2a 29 63  ypes = (char**)c
1adf0 61 6c 6c 6f 63 28 20 61 72 72 61 79 73 69 7a 65  alloc( arraysize
1ae00 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20  , sizeof(char*) 
1ae10 29 3b 0a 20 20 69 66 28 20 74 79 70 65 73 3d 3d  );.  if( types==
1ae20 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
1ae30 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20  (stderr,"Out of 
1ae40 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20  memory.\n");.   
1ae50 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
1ae60 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79  for(i=0; i<array
1ae70 73 69 7a 65 3b 20 69 2b 2b 29 20 74 79 70 65 73  size; i++) types
1ae80 5b 69 5d 20 3d 20 30 3b 0a 20 20 6d 61 78 64 74  [i] = 0;.  maxdt
1ae90 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 69 66  length = 0;.  if
1aea0 28 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 20  ( lemp->vartype 
1aeb0 29 7b 0a 20 20 20 20 6d 61 78 64 74 6c 65 6e 67  ){.    maxdtleng
1aec0 74 68 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  th = lemonStrlen
1aed0 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 29 3b  (lemp->vartype);
1aee0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1aef0 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
1af00 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c   i++){.    int l
1af10 65 6e 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  en;.    struct s
1af20 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
1af30 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
1af40 20 20 69 66 28 20 73 70 2d 3e 64 61 74 61 74 79    if( sp->dataty
1af50 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pe==0 ) continue
1af60 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f  ;.    len = lemo
1af70 6e 53 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74 61  nStrlen(sp->data
1af80 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 6c  type);.    if( l
1af90 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20 29  en>maxdtlength )
1afa0 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c   maxdtlength = l
1afb0 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74 20  en;.  }.  stddt 
1afc0 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28  = (char*)malloc(
1afd0 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32 20 2b   maxdtlength*2 +
1afe0 20 31 20 29 3b 0a 20 20 69 66 28 20 73 74 64 64   1 );.  if( stdd
1aff0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  t==0 ){.    fpri
1b000 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20  ntf(stderr,"Out 
1b010 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a  of memory.\n");.
1b020 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
1b030 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20 61 20 68  ..  /* Build a h
1b040 61 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74  ash table of dat
1b050 61 74 79 70 65 73 2e 20 54 68 65 20 22 2e 64 74  atypes. The ".dt
1b060 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66 20 65 61  num" field of ea
1b070 63 68 20 73 79 6d 62 6f 6c 0a 20 20 2a 2a 20 69  ch symbol.  ** i
1b080 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
1b090 20 74 68 65 20 68 61 73 68 20 69 6e 64 65 78 20   the hash index 
1b0a0 70 6c 75 73 20 31 2e 20 20 41 20 22 2e 64 74 6e  plus 1.  A ".dtn
1b0b0 75 6d 22 20 76 61 6c 75 65 20 6f 66 20 30 20 69  um" value of 0 i
1b0c0 73 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20  s.  ** used for 
1b0d0 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
1b0e0 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
1b0f0 6f 20 25 64 65 66 61 75 6c 74 5f 74 79 70 65 20  o %default_type 
1b100 64 65 66 69 6e 65 64 20 74 68 65 6e 0a 20 20 2a  defined then.  *
1b110 2a 20 30 20 69 73 20 61 6c 73 6f 20 75 73 65 64  * 0 is also used
1b120 20 61 73 20 74 68 65 20 2e 64 74 6e 75 6d 20 76   as the .dtnum v
1b130 61 6c 75 65 20 66 6f 72 20 6e 6f 6e 74 65 72 6d  alue for nonterm
1b140 69 6e 61 6c 73 20 77 68 69 63 68 20 64 6f 20 6e  inals which do n
1b150 6f 74 20 73 70 65 63 69 66 79 0a 20 20 2a 2a 20  ot specify.  ** 
1b160 61 20 64 61 74 61 74 79 70 65 20 75 73 69 6e 67  a datatype using
1b170 20 74 68 65 20 25 74 79 70 65 20 64 69 72 65 63   the %type direc
1b180 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  tive..  */.  for
1b190 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1b1a0 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
1b1b0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1b1c0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
1b1d0 6c 73 5b 69 5d 3b 0a 20 20 20 20 63 68 61 72 20  ls[i];.    char 
1b1e0 2a 63 70 3b 0a 20 20 20 20 69 66 28 20 73 70 3d  *cp;.    if( sp=
1b1f0 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b  =lemp->errsym ){
1b200 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d  .      sp->dtnum
1b210 20 3d 20 61 72 72 61 79 73 69 7a 65 2b 31 3b 0a   = arraysize+1;.
1b220 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1b230 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 70      }.    if( sp
1b240 2d 3e 74 79 70 65 21 3d 4e 4f 4e 54 45 52 4d 49  ->type!=NONTERMI
1b250 4e 41 4c 20 7c 7c 20 28 73 70 2d 3e 64 61 74 61  NAL || (sp->data
1b260 74 79 70 65 3d 3d 30 20 26 26 20 6c 65 6d 70 2d  type==0 && lemp-
1b270 3e 76 61 72 74 79 70 65 3d 3d 30 29 20 29 7b 0a  >vartype==0) ){.
1b280 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20        sp->dtnum 
1b290 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 0;.      conti
1b2a0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  nue;.    }.    c
1b2b0 70 20 3d 20 73 70 2d 3e 64 61 74 61 74 79 70 65  p = sp->datatype
1b2c0 3b 0a 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20  ;.    if( cp==0 
1b2d0 29 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61 72  ) cp = lemp->var
1b2e0 74 79 70 65 3b 0a 20 20 20 20 6a 20 3d 20 30 3b  type;.    j = 0;
1b2f0 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70  .    while( issp
1b300 61 63 65 28 2a 63 70 29 20 29 20 63 70 2b 2b 3b  ace(*cp) ) cp++;
1b310 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 63 70 20  .    while( *cp 
1b320 29 20 73 74 64 64 74 5b 6a 2b 2b 5d 20 3d 20 2a  ) stddt[j++] = *
1b330 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28  cp++;.    while(
1b340 20 6a 3e 30 20 26 26 20 69 73 73 70 61 63 65 28   j>0 && isspace(
1b350 73 74 64 64 74 5b 6a 2d 31 5d 29 20 29 20 6a 2d  stddt[j-1]) ) j-
1b360 2d 3b 0a 20 20 20 20 73 74 64 64 74 5b 6a 5d 20  -;.    stddt[j] 
1b370 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d  = 0;.    if( lem
1b380 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 20 26 26 20  p->tokentype && 
1b390 73 74 72 63 6d 70 28 73 74 64 64 74 2c 20 6c 65  strcmp(stddt, le
1b3a0 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3d 3d  mp->tokentype)==
1b3b0 30 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64  0 ){.      sp->d
1b3c0 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  tnum = 0;.      
1b3d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
1b3e0 20 20 20 20 68 61 73 68 20 3d 20 30 3b 0a 20 20      hash = 0;.  
1b3f0 20 20 66 6f 72 28 6a 3d 30 3b 20 73 74 64 64 74    for(j=0; stddt
1b400 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  [j]; j++){.     
1b410 20 68 61 73 68 20 3d 20 68 61 73 68 2a 35 33 20   hash = hash*53 
1b420 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a 20 20 20 20  + stddt[j];.    
1b430 7d 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  }.    hash = (ha
1b440 73 68 20 26 20 30 78 37 66 66 66 66 66 66 66 29  sh & 0x7fffffff)
1b450 25 61 72 72 61 79 73 69 7a 65 3b 0a 20 20 20 20  %arraysize;.    
1b460 77 68 69 6c 65 28 20 74 79 70 65 73 5b 68 61 73  while( types[has
1b470 68 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  h] ){.      if( 
1b480 73 74 72 63 6d 70 28 74 79 70 65 73 5b 68 61 73  strcmp(types[has
1b490 68 5d 2c 73 74 64 64 74 29 3d 3d 30 20 29 7b 0a  h],stddt)==0 ){.
1b4a0 20 20 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75          sp->dtnu
1b4b0 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20  m = hash + 1;.  
1b4c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b4d0 20 20 20 7d 0a 20 20 20 20 20 20 68 61 73 68 2b     }.      hash+
1b4e0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  +;.      if( has
1b4f0 68 3e 3d 28 75 6e 73 69 67 6e 65 64 29 61 72 72  h>=(unsigned)arr
1b500 61 79 73 69 7a 65 20 29 20 68 61 73 68 20 3d 20  aysize ) hash = 
1b510 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1b520 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20   types[hash]==0 
1b530 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e  ){.      sp->dtn
1b540 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20  um = hash + 1;. 
1b550 20 20 20 20 20 74 79 70 65 73 5b 68 61 73 68 5d       types[hash]
1b560 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63   = (char*)malloc
1b570 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 74  ( lemonStrlen(st
1b580 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20 20  ddt)+1 );.      
1b590 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d  if( types[hash]=
1b5a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  =0 ){.        fp
1b5b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75  rintf(stderr,"Ou
1b5c0 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29  t of memory.\n")
1b5d0 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31  ;.        exit(1
1b5e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1b5f0 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 74 79   lemon_strcpy(ty
1b600 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29  pes[hash],stddt)
1b610 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1b620 2a 20 50 72 69 6e 74 20 6f 75 74 20 74 68 65 20  * Print out the 
1b630 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 59 59  definition of YY
1b640 54 4f 4b 45 4e 54 59 50 45 20 61 6e 64 20 59 59  TOKENTYPE and YY
1b650 4d 49 4e 4f 52 54 59 50 45 20 2a 2f 0a 20 20 6e  MINORTYPE */.  n
1b660 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65  ame = lemp->name
1b670 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20   ? lemp->name : 
1b680 22 50 61 72 73 65 22 3b 0a 20 20 6c 69 6e 65 6e  "Parse";.  linen
1b690 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 0a 20 20  o = *plineno;.  
1b6a0 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70  if( mhflag ){ fp
1b6b0 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49  rintf(out,"#if I
1b6c0 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69  NTERFACE\n"); li
1b6d0 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69  neno++; }.  fpri
1b6e0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1b6f0 20 25 73 54 4f 4b 45 4e 54 59 50 45 20 25 73 5c   %sTOKENTYPE %s\
1b700 6e 22 2c 6e 61 6d 65 2c 0a 20 20 20 20 6c 65 6d  n",name,.    lem
1b710 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3f 6c 65 6d  p->tokentype?lem
1b720 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3a 22 76 6f  p->tokentype:"vo
1b730 69 64 2a 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  id*");  lineno++
1b740 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29  ;.  if( mhflag )
1b750 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23  { fprintf(out,"#
1b760 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e  endif\n"); linen
1b770 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66  o++; }.  fprintf
1b780 28 6f 75 74 2c 22 74 79 70 65 64 65 66 20 75 6e  (out,"typedef un
1b790 69 6f 6e 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ion {\n"); linen
1b7a0 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1b7b0 75 74 2c 22 20 20 69 6e 74 20 79 79 69 6e 69 74  ut,"  int yyinit
1b7c0 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1b7d0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1b7e0 20 20 25 73 54 4f 4b 45 4e 54 59 50 45 20 79 79    %sTOKENTYPE yy
1b7f0 30 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e  0;\n",name); lin
1b800 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30  eno++;.  for(i=0
1b810 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69  ; i<arraysize; i
1b820 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 79 70  ++){.    if( typ
1b830 65 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  es[i]==0 ) conti
1b840 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  nue;.    fprintf
1b850 28 6f 75 74 2c 22 20 20 25 73 20 79 79 25 64 3b  (out,"  %s yy%d;
1b860 5c 6e 22 2c 74 79 70 65 73 5b 69 5d 2c 69 2b 31  \n",types[i],i+1
1b870 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1b880 20 66 72 65 65 28 74 79 70 65 73 5b 69 5d 29 3b   free(types[i]);
1b890 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d  .  }.  if( lemp-
1b8a0 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20  >errsym->useCnt 
1b8b0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1b8c0 75 74 2c 22 20 20 69 6e 74 20 79 79 25 64 3b 5c  ut,"  int yy%d;\
1b8d0 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  n",lemp->errsym-
1b8e0 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b  >dtnum); lineno+
1b8f0 2b 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 73 74  +;.  }.  free(st
1b900 64 64 74 29 3b 0a 20 20 66 72 65 65 28 74 79 70  ddt);.  free(typ
1b910 65 73 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  es);.  fprintf(o
1b920 75 74 2c 22 7d 20 59 59 4d 49 4e 4f 52 54 59 50  ut,"} YYMINORTYP
1b930 45 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  E;\n"); lineno++
1b940 3b 0a 20 20 2a 70 6c 69 6e 65 6e 6f 20 3d 20 6c  ;.  *plineno = l
1b950 69 6e 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ineno;.}../*.** 
1b960 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
1b970 6f 66 20 61 20 43 20 64 61 74 61 74 79 70 65 20  of a C datatype 
1b980 61 62 6c 65 20 74 6f 20 72 65 70 72 65 73 65 6e  able to represen
1b990 74 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  t values between
1b9a0 0a 2a 2a 20 6c 77 72 20 61 6e 64 20 75 70 72 2c  .** lwr and upr,
1b9b0 20 69 6e 63 6c 75 73 69 76 65 2e 20 20 49 66 20   inclusive.  If 
1b9c0 70 6e 42 79 74 65 21 3d 4e 55 4c 4c 20 74 68 65  pnByte!=NULL the
1b9d0 6e 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  n also write the
1b9e0 20 73 69 7a 65 6f 66 0a 2a 2a 20 66 6f 72 20 74   sizeof.** for t
1b9f0 68 61 74 20 74 79 70 65 20 28 31 2c 20 32 2c 20  hat type (1, 2, 
1ba00 6f 72 20 34 29 20 69 6e 74 6f 20 2a 70 6e 42 79  or 4) into *pnBy
1ba10 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  te..*/.static co
1ba20 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d 75  nst char *minimu
1ba30 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74 20  m_size_type(int 
1ba40 6c 77 72 2c 20 69 6e 74 20 75 70 72 2c 20 69 6e  lwr, int upr, in
1ba50 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20 63 6f  t *pnByte){.  co
1ba60 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
1ba70 3d 20 22 69 6e 74 22 3b 0a 20 20 69 6e 74 20 6e  = "int";.  int n
1ba80 42 79 74 65 20 3d 20 34 3b 0a 20 20 69 66 28 20  Byte = 4;.  if( 
1ba90 6c 77 72 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  lwr>=0 ){.    if
1baa0 28 20 75 70 72 3c 3d 32 35 35 20 29 7b 0a 20 20  ( upr<=255 ){.  
1bab0 20 20 20 20 7a 54 79 70 65 20 3d 20 22 75 6e 73      zType = "uns
1bac0 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20 20  igned char";.   
1bad0 20 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a 20 20     nByte = 1;.  
1bae0 20 20 7d 65 6c 73 65 20 69 66 28 20 75 70 72 3c    }else if( upr<
1baf0 36 35 35 33 35 20 29 7b 0a 20 20 20 20 20 20 7a  65535 ){.      z
1bb00 54 79 70 65 20 3d 20 22 75 6e 73 69 67 6e 65 64  Type = "unsigned
1bb10 20 73 68 6f 72 74 20 69 6e 74 22 3b 0a 20 20 20   short int";.   
1bb20 20 20 20 6e 42 79 74 65 20 3d 20 32 3b 0a 20 20     nByte = 2;.  
1bb30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
1bb40 54 79 70 65 20 3d 20 22 75 6e 73 69 67 6e 65 64  Type = "unsigned
1bb50 20 69 6e 74 22 3b 0a 20 20 20 20 20 20 6e 42 79   int";.      nBy
1bb60 74 65 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  te = 4;.    }.  
1bb70 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d  }else if( lwr>=-
1bb80 31 32 37 20 26 26 20 75 70 72 3c 3d 31 32 37 20  127 && upr<=127 
1bb90 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
1bba0 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20  signed char";.  
1bbb0 20 20 6e 42 79 74 65 20 3d 20 31 3b 0a 20 20 7d    nByte = 1;.  }
1bbc0 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d 33  else if( lwr>=-3
1bbd0 32 37 36 37 20 26 26 20 75 70 72 3c 33 32 37 36  2767 && upr<3276
1bbe0 37 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  7 ){.    zType =
1bbf0 20 22 73 68 6f 72 74 22 3b 0a 20 20 20 20 6e 42   "short";.    nB
1bc00 79 74 65 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 69  yte = 2;.  }.  i
1bc10 66 28 20 70 6e 42 79 74 65 20 29 20 2a 70 6e 42  f( pnByte ) *pnB
1bc20 79 74 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 72  yte = nByte;.  r
1bc30 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
1bc40 2f 2a 0a 2a 2a 20 45 61 63 68 20 73 74 61 74 65  /*.** Each state
1bc50 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 65 74 20   contains a set 
1bc60 6f 66 20 74 6f 6b 65 6e 20 74 72 61 6e 73 61 63  of token transac
1bc70 74 69 6f 6e 20 61 6e 64 20 61 20 73 65 74 20 6f  tion and a set o
1bc80 66 0a 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  f.** nonterminal
1bc90 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 20   transactions.  
1bca0 45 61 63 68 20 6f 66 20 74 68 65 73 65 20 73 65  Each of these se
1bcb0 74 73 20 6d 61 6b 65 73 20 61 6e 20 69 6e 73 74  ts makes an inst
1bcc0 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ance.** of the f
1bcd0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1bce0 72 65 2e 20 20 41 6e 20 61 72 72 61 79 20 6f 66  re.  An array of
1bcf0 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65   these structure
1bd00 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20  s is used.** to 
1bd10 6f 72 64 65 72 20 74 68 65 20 63 72 65 61 74 69  order the creati
1bd20 6f 6e 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  on of entries in
1bd30 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   the yy_action[]
1bd40 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63   table..*/.struc
1bd50 74 20 61 78 73 65 74 20 7b 0a 20 20 73 74 72 75  t axset {.  stru
1bd60 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
1bd70 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f   /* A pointer to
1bd80 20 61 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e   a state */.  in
1bd90 74 20 69 73 54 6b 6e 3b 20 20 20 20 20 20 20 20  t isTkn;        
1bda0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
1bdb0 65 20 74 6f 6b 65 6e 73 2e 20 20 46 61 6c 73 65  e tokens.  False
1bdc0 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61   for non-termina
1bdd0 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74  ls */.  int nAct
1bde0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ion;         /* 
1bdf0 4e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e  Number of action
1be00 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 72 64 65  s */.  int iOrde
1be10 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  r;          /* O
1be20 72 69 67 69 6e 61 6c 20 6f 72 64 65 72 20 6f 66  riginal order of
1be30 20 61 63 74 69 6f 6e 20 73 65 74 73 20 2a 2f 0a   action sets */.
1be40 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  };../*.** Compar
1be50 65 20 74 6f 20 61 78 73 65 74 20 73 74 72 75 63  e to axset struc
1be60 74 75 72 65 73 20 66 6f 72 20 73 6f 72 74 69 6e  tures for sortin
1be70 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74  g purposes.*/.st
1be80 61 74 69 63 20 69 6e 74 20 61 78 73 65 74 5f 63  atic int axset_c
1be90 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69  ompare(const voi
1bea0 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64  d *a, const void
1beb0 20 2a 62 29 7b 0a 20 20 73 74 72 75 63 74 20 61   *b){.  struct a
1bec0 78 73 65 74 20 2a 70 31 20 3d 20 28 73 74 72 75  xset *p1 = (stru
1bed0 63 74 20 61 78 73 65 74 2a 29 61 3b 0a 20 20 73  ct axset*)a;.  s
1bee0 74 72 75 63 74 20 61 78 73 65 74 20 2a 70 32 20  truct axset *p2 
1bef0 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74 2a  = (struct axset*
1bf00 29 62 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63  )b;.  int c;.  c
1bf10 20 3d 20 70 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d   = p2->nAction -
1bf20 20 70 31 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 20 20   p1->nAction;.  
1bf30 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
1bf40 63 20 3d 20 70 32 2d 3e 69 4f 72 64 65 72 20 2d  c = p2->iOrder -
1bf50 20 70 31 2d 3e 69 4f 72 64 65 72 3b 0a 20 20 7d   p1->iOrder;.  }
1bf60 0a 20 20 61 73 73 65 72 74 28 20 63 21 3d 30 20  .  assert( c!=0 
1bf70 7c 7c 20 70 31 3d 3d 70 32 20 29 3b 0a 20 20 72  || p1==p2 );.  r
1bf80 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
1bf90 2a 20 57 72 69 74 65 20 74 65 78 74 20 6f 6e 20  * Write text on 
1bfa0 22 6f 75 74 22 20 74 68 61 74 20 64 65 73 63 72  "out" that descr
1bfb0 69 62 65 73 20 74 68 65 20 72 75 6c 65 20 22 72  ibes the rule "r
1bfc0 70 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  p"..*/.static vo
1bfd0 69 64 20 77 72 69 74 65 52 75 6c 65 54 65 78 74  id writeRuleText
1bfe0 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75  (FILE *out, stru
1bff0 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20  ct rule *rp){.  
1c000 69 6e 74 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66  int j;.  fprintf
1c010 28 6f 75 74 2c 22 25 73 20 3a 3a 3d 22 2c 20 72  (out,"%s ::=", r
1c020 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  p->lhs->name);. 
1c030 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d 3e   for(j=0; j<rp->
1c040 6e 72 68 73 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nrhs; j++){.    
1c050 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
1c060 70 20 3d 20 72 70 2d 3e 72 68 73 5b 6a 5d 3b 0a  p = rp->rhs[j];.
1c070 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
1c080 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  !=MULTITERMINAL 
1c090 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
1c0a0 28 6f 75 74 2c 22 20 25 73 22 2c 20 73 70 2d 3e  (out," %s", sp->
1c0b0 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  name);.    }else
1c0c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20  {.      int k;. 
1c0d0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1c0e0 2c 22 20 25 73 22 2c 20 73 70 2d 3e 73 75 62 73  ," %s", sp->subs
1c0f0 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ym[0]->name);.  
1c100 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 73      for(k=1; k<s
1c110 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29  p->nsubsym; k++)
1c120 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1c130 66 28 6f 75 74 2c 22 7c 25 73 22 2c 73 70 2d 3e  f(out,"|%s",sp->
1c140 73 75 62 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65 29  subsym[k]->name)
1c150 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c160 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72    }.}.../* Gener
1c170 61 74 65 20 43 20 73 6f 75 72 63 65 20 63 6f 64  ate C source cod
1c180 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72  e for the parser
1c190 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 54   */.void ReportT
1c1a0 61 62 6c 65 28 0a 20 20 73 74 72 75 63 74 20 6c  able(.  struct l
1c1b0 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e  emon *lemp,.  in
1c1c0 74 20 6d 68 66 6c 61 67 20 20 20 20 20 2f 2a 20  t mhflag     /* 
1c1d0 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b 65 68 65  Output in makehe
1c1e0 61 64 65 72 73 20 66 6f 72 6d 61 74 20 69 66 20  aders format if 
1c1f0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 46 49 4c  true */.){.  FIL
1c200 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63  E *out, *in;.  c
1c210 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a  har line[LINESIZ
1c220 45 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e  E];.  int  linen
1c230 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  o;.  struct stat
1c240 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
1c250 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73   action *ap;.  s
1c260 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
1c270 20 20 73 74 72 75 63 74 20 61 63 74 74 61 62 20    struct acttab 
1c280 2a 70 41 63 74 74 61 62 3b 0a 20 20 69 6e 74 20  *pActtab;.  int 
1c290 69 2c 20 6a 2c 20 6e 2c 20 73 7a 3b 0a 20 20 69  i, j, n, sz;.  i
1c2a0 6e 74 20 73 7a 41 63 74 69 6f 6e 54 79 70 65 3b  nt szActionType;
1c2b0 20 20 20 20 20 2f 2a 20 73 69 7a 65 6f 66 28 59       /* sizeof(Y
1c2c0 59 41 43 54 49 4f 4e 54 59 50 45 29 20 2a 2f 0a  YACTIONTYPE) */.
1c2d0 20 20 69 6e 74 20 73 7a 43 6f 64 65 54 79 70 65    int szCodeType
1c2e0 3b 20 20 20 20 20 20 20 2f 2a 20 73 69 7a 65 6f  ;       /* sizeo
1c2f0 66 28 59 59 43 4f 44 45 54 59 50 45 29 20 20 20  f(YYCODETYPE)   
1c300 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1c310 2a 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e 54  *name;.  int mnT
1c320 6b 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e 4f 66 73  knOfst, mxTknOfs
1c330 74 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74 4f 66 73  t;.  int mnNtOfs
1c340 74 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a 20 20 73  t, mxNtOfst;.  s
1c350 74 72 75 63 74 20 61 78 73 65 74 20 2a 61 78 3b  truct axset *ax;
1c360 0a 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f 6f 70  ..  in = tplt_op
1c370 65 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66 28 20  en(lemp);.  if( 
1c380 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  in==0 ) return;.
1c390 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65    out = file_ope
1c3a0 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77 62 22  n(lemp,".c","wb"
1c3b0 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20  );.  if( out==0 
1c3c0 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  ){.    fclose(in
1c3d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1c3e0 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b   }.  lineno = 1;
1c3f0 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1c400 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1c410 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1c420 65 6e 65 72 61 74 65 20 74 68 65 20 69 6e 63 6c  enerate the incl
1c430 75 64 65 20 63 6f 64 65 2c 20 69 66 20 61 6e 79  ude code, if any
1c440 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
1c450 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
1c460 69 6e 63 6c 75 64 65 2c 26 6c 69 6e 65 6e 6f 29  include,&lineno)
1c470 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29  ;.  if( mhflag )
1c480 7b 0a 20 20 20 20 63 68 61 72 20 2a 69 6e 63 4e  {.    char *incN
1c490 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e  ame = file_maken
1c4a0 61 6d 65 28 6c 65 6d 70 2c 20 22 2e 68 22 29 3b  ame(lemp, ".h");
1c4b0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1c4c0 2c 22 23 69 6e 63 6c 75 64 65 20 5c 22 25 73 5c  ,"#include \"%s\
1c4d0 22 5c 6e 22 2c 20 69 6e 63 4e 61 6d 65 29 3b 20  "\n", incName); 
1c4e0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72  lineno++;.    fr
1c4f0 65 65 28 69 6e 63 4e 61 6d 65 29 3b 0a 20 20 7d  ee(incName);.  }
1c500 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1c510 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1c520 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1c530 65 6e 65 72 61 74 65 20 23 64 65 66 69 6e 65 73  enerate #defines
1c540 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e 73 20   for all tokens 
1c550 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  */.  if( mhflag 
1c560 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1c570 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20 20 66  r *prefix;.    f
1c580 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20  printf(out,"#if 
1c590 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c  INTERFACE\n"); l
1c5a0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28  ineno++;.    if(
1c5b0 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66   lemp->tokenpref
1c5c0 69 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65  ix ) prefix = le
1c5d0 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b  mp->tokenprefix;
1c5e0 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20  .    else       
1c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
1c600 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f  fix = "";.    fo
1c610 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=1; i<lemp->n
1c620 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a  terminal; i++){.
1c630 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1c640 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33  t,"#define %s%-3
1c650 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78  0s %2d\n",prefix
1c660 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
1c670 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20  ]->name,i);.    
1c680 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
1c690 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
1c6a0 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c  t,"#endif\n"); l
1c6b0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
1c6c0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1c6d0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1c6e0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1c6f0 61 74 65 20 74 68 65 20 64 65 66 69 6e 65 73 20  ate the defines 
1c700 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
1c710 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f 44 45  ,"#define YYCODE
1c720 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20  TYPE %s\n",.    
1c730 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
1c740 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  e(0, lemp->nsymb
1c750 6f 6c 2b 31 2c 20 26 73 7a 43 6f 64 65 54 79 70  ol+1, &szCodeTyp
1c760 65 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e)); lineno++;. 
1c770 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1c780 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20 25  efine YYNOCODE %
1c790 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  d\n",lemp->nsymb
1c7a0 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  ol+1);  lineno++
1c7b0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1c7c0 22 23 64 65 66 69 6e 65 20 59 59 41 43 54 49 4f  "#define YYACTIO
1c7d0 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20  NTYPE %s\n",.   
1c7e0 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79   minimum_size_ty
1c7f0 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61  pe(0, lemp->nsta
1c800 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2b 35  te+lemp->nrule+5
1c810 2c 20 26 73 7a 41 63 74 69 6f 6e 54 79 70 65 29  , &szActionType)
1c820 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69  ); lineno++;.  i
1c830 66 28 20 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72  f( lemp->wildcar
1c840 64 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  d ){.    fprintf
1c850 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1c860 57 49 4c 44 43 41 52 44 20 25 64 5c 6e 22 2c 0a  WILDCARD %d\n",.
1c870 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 77 69 6c         lemp->wil
1c880 64 63 61 72 64 2d 3e 69 6e 64 65 78 29 3b 20 6c  dcard->index); l
1c890 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 70  ineno++;.  }.  p
1c8a0 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e  rint_stack_union
1c8b0 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e  (out,lemp,&linen
1c8c0 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20 66 70 72  o,mhflag);.  fpr
1c8d0 69 6e 74 66 28 6f 75 74 2c 20 22 23 69 66 6e 64  intf(out, "#ifnd
1c8e0 65 66 20 59 59 53 54 41 43 4b 44 45 50 54 48 5c  ef YYSTACKDEPTH\
1c8f0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1c900 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 63 6b   if( lemp->stack
1c910 73 69 7a 65 20 29 7b 0a 20 20 20 20 66 70 72 69  size ){.    fpri
1c920 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1c930 20 59 59 53 54 41 43 4b 44 45 50 54 48 20 25 73   YYSTACKDEPTH %s
1c940 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61 63 6b 73  \n",lemp->stacks
1c950 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  ize);  lineno++;
1c960 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70  .  }else{.    fp
1c970 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1c980 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48 20  ne YYSTACKDEPTH 
1c990 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f  100\n");  lineno
1c9a0 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74  ++;.  }.  fprint
1c9b0 66 28 6f 75 74 2c 20 22 23 65 6e 64 69 66 5c 6e  f(out, "#endif\n
1c9c0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1c9d0 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20  if( mhflag ){.  
1c9e0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1c9f0 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29  if INTERFACE\n")
1ca00 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1ca10 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e    name = lemp->n
1ca20 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65  ame ? lemp->name
1ca30 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 69 66   : "Parse";.  if
1ca40 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26 26 20 6c  ( lemp->arg && l
1ca50 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29 7b 0a 20  emp->arg[0] ){. 
1ca60 20 20 20 69 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c     i = lemonStrl
1ca70 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29 3b 0a 20  en(lemp->arg);. 
1ca80 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26     while( i>=1 &
1ca90 26 20 69 73 73 70 61 63 65 28 6c 65 6d 70 2d 3e  & isspace(lemp->
1caa0 61 72 67 5b 69 2d 31 5d 29 20 29 20 69 2d 2d 3b  arg[i-1]) ) i--;
1cab0 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31  .    while( i>=1
1cac0 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 6c 65 6d   && (isalnum(lem
1cad0 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 7c 7c 20  p->arg[i-1]) || 
1cae0 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 3d 3d  lemp->arg[i-1]==
1caf0 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20  '_') ) i--;.    
1cb00 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1cb10 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c  fine %sARG_SDECL
1cb20 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d   %s;\n",name,lem
1cb30 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f  p->arg);  lineno
1cb40 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1cb50 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1cb60 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c 6e 22 2c  RG_PDECL ,%s\n",
1cb70 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b  name,lemp->arg);
1cb80 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
1cb90 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1cba0 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48  fine %sARG_FETCH
1cbb0 20 25 73 20 3d 20 79 79 70 50 61 72 73 65 72 2d   %s = yypParser-
1cbc0 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  >%s\n",.        
1cbd0 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 6c 65           name,le
1cbe0 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e 61  mp->arg,&lemp->a
1cbf0 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b  rg[i]);  lineno+
1cc00 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
1cc10 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1cc20 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72 73 65  G_STORE yypParse
1cc30 72 2d 3e 25 73 20 3d 20 25 73 5c 6e 22 2c 0a 20  r->%s = %s\n",. 
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc50 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b  name,&lemp->arg[
1cc60 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d  i],&lemp->arg[i]
1cc70 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1cc80 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
1cc90 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1cca0 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22 2c 6e  %sARG_SDECL\n",n
1ccb0 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  ame);  lineno++;
1ccc0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1ccd0 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1cce0 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20  PDECL\n",name); 
1ccf0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1cd00 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1cd10 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48 5c  ine %sARG_FETCH\
1cd20 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  n",name); lineno
1cd30 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1cd40 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1cd50 52 47 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65  RG_STORE\n",name
1cd60 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1cd70 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
1cd80 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1cd90 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69  ,"#endif\n"); li
1cda0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70  neno++;.  }.  fp
1cdb0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1cdc0 6e 65 20 59 59 4e 53 54 41 54 45 20 25 64 5c 6e  ne YYNSTATE %d\n
1cdd0 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 29 3b  ",lemp->nstate);
1cde0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70    lineno++;.  fp
1cdf0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1ce00 6e 65 20 59 59 4e 52 55 4c 45 20 25 64 5c 6e 22  ne YYNRULE %d\n"
1ce10 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20 20  ,lemp->nrule);  
1ce20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20  lineno++;.  if( 
1ce30 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73  lemp->errsym->us
1ce40 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69  eCnt ){.    fpri
1ce50 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1ce60 20 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20 25   YYERRORSYMBOL %
1ce70 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79  d\n",lemp->errsy
1ce80 6d 2d 3e 69 6e 64 65 78 29 3b 20 20 6c 69 6e 65  m->index);  line
1ce90 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1cea0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1ceb0 59 45 52 52 53 59 4d 44 54 20 79 79 25 64 5c 6e  YERRSYMDT yy%d\n
1cec0 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e  ",lemp->errsym->
1ced0 64 74 6e 75 6d 29 3b 20 20 6c 69 6e 65 6e 6f 2b  dtnum);  lineno+
1cee0 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d  +;.  }.  if( lem
1cef0 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20  p->has_fallback 
1cf00 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1cf10 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 46 41  ut,"#define YYFA
1cf20 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20 20 6c  LLBACK 1\n");  l
1cf30 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
1cf40 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1cf50 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1cf60 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1cf70 61 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74  ate the action t
1cf80 61 62 6c 65 20 61 6e 64 20 69 74 73 20 61 73 73  able and its ass
1cf90 6f 63 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20  ociates:.  **.  
1cfa0 2a 2a 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  **  yy_action[] 
1cfb0 20 20 20 20 20 20 20 41 20 73 69 6e 67 6c 65 20         A single 
1cfc0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1cfd0 20 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20   all actions..  
1cfe0 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64  **  yy_lookahead
1cff0 5b 5d 20 20 20 20 20 41 20 74 61 62 6c 65 20 63  []     A table c
1d000 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f  ontaining the lo
1d010 6f 6b 61 68 65 61 64 20 66 6f 72 20 65 61 63 68  okahead for each
1d020 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20   entry in.  **  
1d030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d040 20 20 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55     yy_action.  U
1d050 73 65 64 20 74 6f 20 64 65 74 65 63 74 20 68 61  sed to detect ha
1d060 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20  sh collisions.. 
1d070 20 2a 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f 66   **  yy_shift_of
1d080 73 74 5b 5d 20 20 20 20 46 6f 72 20 65 61 63 68  st[]    For each
1d090 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73   state, the offs
1d0a0 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f  et into yy_actio
1d0b0 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20  n for.  **      
1d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1d0d0 68 69 66 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c  hifting terminal
1d0e0 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64 75  s..  **  yy_redu
1d0f0 63 65 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20  ce_ofst[]   For 
1d100 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65 20  each state, the 
1d110 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61  offset into yy_a
1d120 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20  ction for.  **  
1d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d140 20 20 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d     shifting non-
1d150 74 65 72 6d 69 6e 61 6c 73 20 61 66 74 65 72 20  terminals after 
1d160 61 20 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20  a reduce..  **  
1d170 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20 20  yy_default[]    
1d180 20 20 20 44 65 66 61 75 6c 74 20 61 63 74 69 6f     Default actio
1d190 6e 20 66 6f 72 20 65 61 63 68 20 73 74 61 74 65  n for each state
1d1a0 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  ..  */..  /* Com
1d1b0 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e 73  pute the actions
1d1c0 20 6f 6e 20 61 6c 6c 20 73 74 61 74 65 73 20 61   on all states a
1d1d0 6e 64 20 63 6f 75 6e 74 20 74 68 65 6d 20 75 70  nd count them up
1d1e0 20 2a 2f 0a 20 20 61 78 20 3d 20 28 73 74 72 75   */.  ax = (stru
1d1f0 63 74 20 61 78 73 65 74 20 2a 29 20 63 61 6c 6c  ct axset *) call
1d200 6f 63 28 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a  oc(lemp->nstate*
1d210 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29  2, sizeof(ax[0])
1d220 29 3b 0a 20 20 69 66 28 20 61 78 3d 3d 30 20 29  );.  if( ax==0 )
1d230 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
1d240 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69  derr,"malloc fai
1d250 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  led\n");.    exi
1d260 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  t(1);.  }.  for(
1d270 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
1d280 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
1d290 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
1d2a0 64 5b 69 5d 3b 0a 20 20 20 20 61 78 5b 69 2a 32  d[i];.    ax[i*2
1d2b0 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20  ].stp = stp;.   
1d2c0 20 61 78 5b 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d   ax[i*2].isTkn =
1d2d0 20 31 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e   1;.    ax[i*2].
1d2e0 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e  nAction = stp->n
1d2f0 54 6b 6e 41 63 74 3b 0a 20 20 20 20 61 78 5b 69  TknAct;.    ax[i
1d300 2a 32 2b 31 5d 2e 73 74 70 20 3d 20 73 74 70 3b  *2+1].stp = stp;
1d310 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 69  .    ax[i*2+1].i
1d320 73 54 6b 6e 20 3d 20 30 3b 0a 20 20 20 20 61 78  sTkn = 0;.    ax
1d330 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20  [i*2+1].nAction 
1d340 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20  = stp->nNtAct;. 
1d350 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73 74 20 3d   }.  mxTknOfst =
1d360 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a   mnTknOfst = 0;.
1d370 20 20 6d 78 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e    mxNtOfst = mnN
1d380 74 4f 66 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  tOfst = 0;..  /*
1d390 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74   Compute the act
1d3a0 69 6f 6e 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f  ion table.  In o
1d3b0 72 64 65 72 20 74 6f 20 74 72 79 20 74 6f 20 6b  rder to try to k
1d3c0 65 65 70 20 74 68 65 20 73 69 7a 65 20 6f 66 20  eep the size of 
1d3d0 74 68 65 0a 20 20 2a 2a 20 61 63 74 69 6f 6e 20  the.  ** action 
1d3e0 74 61 62 6c 65 20 74 6f 20 61 20 6d 69 6e 69 6d  table to a minim
1d3f0 75 6d 2c 20 74 68 65 20 68 65 75 72 69 73 74 69  um, the heuristi
1d400 63 20 6f 66 20 70 6c 61 63 69 6e 67 20 74 68 65  c of placing the
1d410 20 6c 61 72 67 65 73 74 20 61 63 74 69 6f 6e 0a   largest action.
1d420 20 20 2a 2a 20 73 65 74 73 20 66 69 72 73 74 20    ** sets first 
1d430 69 73 20 75 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  is used..  */.  
1d440 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1d450 3e 6e 73 74 61 74 65 2a 32 3b 20 69 2b 2b 29 20  >nstate*2; i++) 
1d460 61 78 5b 69 5d 2e 69 4f 72 64 65 72 20 3d 20 69  ax[i].iOrder = i
1d470 3b 0a 20 20 71 73 6f 72 74 28 61 78 2c 20 6c 65  ;.  qsort(ax, le
1d480 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20 73 69  mp->nstate*2, si
1d490 7a 65 6f 66 28 61 78 5b 30 5d 29 2c 20 61 78 73  zeof(ax[0]), axs
1d4a0 65 74 5f 63 6f 6d 70 61 72 65 29 3b 0a 20 20 70  et_compare);.  p
1d4b0 41 63 74 74 61 62 20 3d 20 61 63 74 74 61 62 5f  Acttab = acttab_
1d4c0 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69  alloc();.  for(i
1d4d0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
1d4e0 74 65 2a 32 20 26 26 20 61 78 5b 69 5d 2e 6e 41  te*2 && ax[i].nA
1d4f0 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20  ction>0; i++){. 
1d500 20 20 20 73 74 70 20 3d 20 61 78 5b 69 5d 2e 73     stp = ax[i].s
1d510 74 70 3b 0a 20 20 20 20 69 66 28 20 61 78 5b 69  tp;.    if( ax[i
1d520 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20 20 20 20 20  ].isTkn ){.     
1d530 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
1d540 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
1d550 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
1d560 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  ction;.        i
1d570 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
1d580 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  >=lemp->ntermina
1d590 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
1d5a0 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20 63        action = c
1d5b0 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
1d5c0 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20  mp, ap);.       
1d5d0 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20   if( action<0 ) 
1d5e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1d5f0 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28    acttab_action(
1d600 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d  pActtab, ap->sp-
1d610 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b  >index, action);
1d620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1d630 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 61  tp->iTknOfst = a
1d640 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41 63  cttab_insert(pAc
1d650 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ttab);.      if(
1d660 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d   stp->iTknOfst<m
1d670 6e 54 6b 6e 4f 66 73 74 20 29 20 6d 6e 54 6b 6e  nTknOfst ) mnTkn
1d680 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e  Ofst = stp->iTkn
1d690 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Ofst;.      if( 
1d6a0 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78  stp->iTknOfst>mx
1d6b0 54 6b 6e 4f 66 73 74 20 29 20 6d 78 54 6b 6e 4f  TknOfst ) mxTknO
1d6c0 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f  fst = stp->iTknO
1d6d0 66 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fst;.    }else{.
1d6e0 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70        for(ap=stp
1d6f0 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
1d700 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
1d710 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20  int action;.    
1d720 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e      if( ap->sp->
1d730 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72  index<lemp->nter
1d740 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65  minal ) continue
1d750 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  ;.        if( ap
1d760 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d  ->sp->index==lem
1d770 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 20 63 6f 6e  p->nsymbol ) con
1d780 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
1d790 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f  ction = compute_
1d7a0 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29  action(lemp, ap)
1d7b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63  ;.        if( ac
1d7c0 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75  tion<0 ) continu
1d7d0 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74 61  e;.        actta
1d7e0 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62  b_action(pActtab
1d7f0 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c  , ap->sp->index,
1d800 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20   action);.      
1d810 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 4e 74  }.      stp->iNt
1d820 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69 6e  Ofst = acttab_in
1d830 73 65 72 74 28 70 41 63 74 74 61 62 29 3b 0a 20  sert(pActtab);. 
1d840 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e       if( stp->iN
1d850 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66 73 74 20 29  tOfst<mnNtOfst )
1d860 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d   mnNtOfst = stp-
1d870 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 20 20  >iNtOfst;.      
1d880 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  if( stp->iNtOfst
1d890 3e 6d 78 4e 74 4f 66 73 74 20 29 20 6d 78 4e 74  >mxNtOfst ) mxNt
1d8a0 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f  Ofst = stp->iNtO
1d8b0 66 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  fst;.    }.  }. 
1d8c0 20 66 72 65 65 28 61 78 29 3b 0a 0a 20 20 2f 2a   free(ax);..  /*
1d8d0 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 61   Output the yy_a
1d8e0 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20  ction table */. 
1d8f0 20 6c 65 6d 70 2d 3e 6e 61 63 74 69 6f 6e 74 61   lemp->nactionta
1d900 62 20 3d 20 6e 20 3d 20 61 63 74 74 61 62 5f 73  b = n = acttab_s
1d910 69 7a 65 28 70 41 63 74 74 61 62 29 3b 0a 20 20  ize(pActtab);.  
1d920 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20  lemp->tablesize 
1d930 2b 3d 20 6e 2a 73 7a 41 63 74 69 6f 6e 54 79 70  += n*szActionTyp
1d940 65 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  e;.  fprintf(out
1d950 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 41 43 54  ,"#define YY_ACT
1d960 54 41 42 5f 43 4f 55 4e 54 20 28 25 64 29 5c 6e  TAB_COUNT (%d)\n
1d970 22 2c 20 6e 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ", n); lineno++;
1d980 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1d990 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59 41  static const YYA
1d9a0 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 61 63 74  CTIONTYPE yy_act
1d9b0 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c  ion[] = {\n"); l
1d9c0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69  ineno++;.  for(i
1d9d0 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
1d9e0 0a 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 20  .    int action 
1d9f0 3d 20 61 63 74 74 61 62 5f 79 79 61 63 74 69 6f  = acttab_yyactio
1da00 6e 28 70 41 63 74 74 61 62 2c 20 69 29 3b 0a 20  n(pActtab, i);. 
1da10 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20     if( action<0 
1da20 29 20 61 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d  ) action = lemp-
1da30 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e  >nstate + lemp->
1da40 6e 72 75 6c 65 20 2b 20 32 3b 0a 20 20 20 20 69  nrule + 2;.    i
1da50 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74  f( j==0 ) fprint
1da60 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a  f(out," /* %5d *
1da70 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72  / ", i);.    fpr
1da80 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c  intf(out, " %4d,
1da90 22 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20  ", action);.    
1daa0 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
1dab0 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
1dac0 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
1dad0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
1dae0 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
1daf0 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
1db00 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
1db10 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
1db20 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f  ineno++;..  /* O
1db30 75 74 70 75 74 20 74 68 65 20 79 79 5f 6c 6f 6f  utput the yy_loo
1db40 6b 61 68 65 61 64 20 74 61 62 6c 65 20 2a 2f 0a  kahead table */.
1db50 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a    lemp->tablesiz
1db60 65 20 2b 3d 20 6e 2a 73 7a 43 6f 64 65 54 79 70  e += n*szCodeTyp
1db70 65 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  e;.  fprintf(out
1db80 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59  ,"static const Y
1db90 59 43 4f 44 45 54 59 50 45 20 79 79 5f 6c 6f 6f  YCODETYPE yy_loo
1dba0 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e 22 29  kahead[] = {\n")
1dbb0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
1dbc0 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
1dbd0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61 20 3d  +){.    int la =
1dbe0 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61 68   acttab_yylookah
1dbf0 65 61 64 28 70 41 63 74 74 61 62 2c 20 69 29 3b  ead(pActtab, i);
1dc00 0a 20 20 20 20 69 66 28 20 6c 61 3c 30 20 29 20  .    if( la<0 ) 
1dc10 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  la = lemp->nsymb
1dc20 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30  ol;.    if( j==0
1dc30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
1dc40 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
1dc50 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1dc60 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61 29 3b  t, " %4d,", la);
1dc70 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
1dc80 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
1dc90 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
1dca0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1dcb0 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
1dcc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
1dcd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
1dce0 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
1dcf0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
1dd00 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79   /* Output the y
1dd10 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 74  y_shift_ofst[] t
1dd20 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74  able */.  fprint
1dd30 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
1dd40 59 59 5f 53 48 49 46 54 5f 55 53 45 5f 44 46 4c  YY_SHIFT_USE_DFL
1dd50 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b 6e  T (%d)\n", mnTkn
1dd60 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b  Ofst-1); lineno+
1dd70 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e  +;.  n = lemp->n
1dd80 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20  state;.  while( 
1dd90 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72  n>0 && lemp->sor
1dda0 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e 4f 66  ted[n-1]->iTknOf
1ddb0 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20  st==NO_OFFSET ) 
1ddc0 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  n--;.  fprintf(o
1ddd0 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f  ut, "#define YY_
1dde0 53 48 49 46 54 5f 43 4f 55 4e 54 20 28 25 64 29  SHIFT_COUNT (%d)
1ddf0 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e  \n", n-1); linen
1de00 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1de10 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f  ut, "#define YY_
1de20 53 48 49 46 54 5f 4d 49 4e 20 20 20 28 25 64 29  SHIFT_MIN   (%d)
1de30 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 29 3b  \n", mnTknOfst);
1de40 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1de50 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
1de60 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 41 58 20  ne YY_SHIFT_MAX 
1de70 20 20 28 25 64 29 5c 6e 22 2c 20 6d 78 54 6b 6e    (%d)\n", mxTkn
1de80 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  Ofst); lineno++;
1de90 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1dea0 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73  "static const %s
1deb0 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d   yy_shift_ofst[]
1dec0 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20 20   = {\n", .      
1ded0 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65      minimum_size
1dee0 5f 74 79 70 65 28 6d 6e 54 6b 6e 4f 66 73 74 2d  _type(mnTknOfst-
1def0 31 2c 20 6d 78 54 6b 6e 4f 66 73 74 2c 20 26 73  1, mxTknOfst, &s
1df00 7a 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  z)); lineno++;. 
1df10 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73 69 7a 65   lemp->tablesize
1df20 20 2b 3d 20 6e 2a 73 7a 3b 0a 20 20 66 6f 72 28   += n*sz;.  for(
1df30 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
1df40 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a  {.    int ofst;.
1df50 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
1df60 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f  sorted[i];.    o
1df70 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f  fst = stp->iTknO
1df80 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66 73  fst;.    if( ofs
1df90 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f  t==NO_OFFSET ) o
1dfa0 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20  fst = mnTknOfst 
1dfb0 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  - 1;.    if( j==
1dfc0 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
1dfd0 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
1dfe0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1dff0 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66 73  ut, " %4d,", ofs
1e000 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39  t);.    if( j==9
1e010 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20   || i==n-1 ){.  
1e020 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1e030 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   "\n"); lineno++
1e040 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20  ;.      j = 0;. 
1e050 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e060 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  j++;.    }.  }. 
1e070 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d   fprintf(out, "}
1e080 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1e090 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
1e0a0 65 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74  e yy_reduce_ofst
1e0b0 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70  [] table */.  fp
1e0c0 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
1e0d0 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 55 53  ine YY_REDUCE_US
1e0e0 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20  E_DFLT (%d)\n", 
1e0f0 6d 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c 69 6e  mnNtOfst-1); lin
1e100 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d  eno++;.  n = lem
1e110 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68 69  p->nstate;.  whi
1e120 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d  le( n>0 && lemp-
1e130 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 4e  >sorted[n-1]->iN
1e140 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54  tOfst==NO_OFFSET
1e150 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74   ) n--;.  fprint
1e160 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
1e170 59 59 5f 52 45 44 55 43 45 5f 43 4f 55 4e 54 20  YY_REDUCE_COUNT 
1e180 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c  (%d)\n", n-1); l
1e190 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1e1a0 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65  tf(out, "#define
1e1b0 20 59 59 5f 52 45 44 55 43 45 5f 4d 49 4e 20 20   YY_REDUCE_MIN  
1e1c0 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66   (%d)\n", mnNtOf
1e1d0 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  st); lineno++;. 
1e1e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
1e1f0 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45  define YY_REDUCE
1e200 5f 4d 41 58 20 20 20 28 25 64 29 5c 6e 22 2c 20  _MAX   (%d)\n", 
1e210 6d 78 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65 6e  mxNtOfst); linen
1e220 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1e230 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73  ut, "static cons
1e240 74 20 25 73 20 79 79 5f 72 65 64 75 63 65 5f 6f  t %s yy_reduce_o
1e250 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20  fst[] = {\n", . 
1e260 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d           minimum
1e270 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e 74 4f  _size_type(mnNtO
1e280 66 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73 74 2c  fst-1, mxNtOfst,
1e290 20 26 73 7a 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   &sz)); lineno++
1e2a0 3b 0a 20 20 6c 65 6d 70 2d 3e 74 61 62 6c 65 73  ;.  lemp->tables
1e2b0 69 7a 65 20 2b 3d 20 6e 2a 73 7a 3b 0a 20 20 66  ize += n*sz;.  f
1e2c0 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
1e2d0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73  ++){.    int ofs
1e2e0 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  t;.    stp = lem
1e2f0 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
1e300 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e    ofst = stp->iN
1e310 74 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f  tOfst;.    if( o
1e320 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
1e330 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74   ofst = mnNtOfst
1e340 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d   - 1;.    if( j=
1e350 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
1e360 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
1e370 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
1e380 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66  out, " %4d,", of
1e390 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  st);.    if( j==
1e3a0 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
1e3b0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1e3c0 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
1e3d0 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
1e3e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e3f0 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
1e400 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1e410 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
1e420 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
1e430 68 65 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f  he default actio
1e440 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72  n table */.  fpr
1e450 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69  intf(out, "stati
1e460 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e  c const YYACTION
1e470 54 59 50 45 20 79 79 5f 64 65 66 61 75 6c 74 5b  TYPE yy_default[
1e480 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ] = {\n"); linen
1e490 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d  o++;.  n = lemp-
1e4a0 3e 6e 73 74 61 74 65 3b 0a 20 20 6c 65 6d 70 2d  >nstate;.  lemp-
1e4b0 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 6e 2a  >tablesize += n*
1e4c0 73 7a 41 63 74 69 6f 6e 54 79 70 65 3b 0a 20 20  szActionType;.  
1e4d0 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1e4e0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
1e4f0 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
1e500 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20  .    if( j==0 ) 
1e510 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
1e520 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20   %5d */ ", i);. 
1e530 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1e540 22 20 25 34 64 2c 22 2c 20 73 74 70 2d 3e 69 44  " %4d,", stp->iD
1e550 66 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  flt);.    if( j=
1e560 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
1e570 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1e580 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
1e590 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
1e5a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e5b0 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1e5c0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1e5d0 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
1e5e0 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  +;.  tplt_xfer(l
1e5f0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1e600 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1e610 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 61   Generate the ta
1e620 62 6c 65 20 6f 66 20 66 61 6c 6c 62 61 63 6b 20  ble of fallback 
1e630 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  tokens..  */.  i
1e640 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c  f( lemp->has_fal
1e650 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74  lback ){.    int
1e660 20 6d 78 20 3d 20 6c 65 6d 70 2d 3e 6e 74 65 72   mx = lemp->nter
1e670 6d 69 6e 61 6c 20 2d 20 31 3b 0a 20 20 20 20 77  minal - 1;.    w
1e680 68 69 6c 65 28 20 6d 78 3e 30 20 26 26 20 6c 65  hile( mx>0 && le
1e690 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6d 78 5d 2d  mp->symbols[mx]-
1e6a0 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 20  >fallback==0 ){ 
1e6b0 6d 78 2d 2d 3b 20 7d 0a 20 20 20 20 6c 65 6d 70  mx--; }.    lemp
1e6c0 2d 3e 74 61 62 6c 65 73 69 7a 65 20 2b 3d 20 28  ->tablesize += (
1e6d0 6d 78 2b 31 29 2a 73 7a 43 6f 64 65 54 79 70 65  mx+1)*szCodeType
1e6e0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1e6f0 3c 3d 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <=mx; i++){.    
1e700 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1e710 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  *p = lemp->symbo
1e720 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ls[i];.      if(
1e730 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20   p->fallback==0 
1e740 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1e750 74 66 28 6f 75 74 2c 20 22 20 20 20 20 30 2c 20  tf(out, "    0, 
1e760 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e 6f 74 68   /* %10s => noth
1e770 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 6e 61  ing */\n", p->na
1e780 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
1e790 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1e7a0 66 28 6f 75 74 2c 20 22 20 20 25 33 64 2c 20 20  f(out, "  %3d,  
1e7b0 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73 20 2a 2f  /* %10s => %s */
1e7c0 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b  \n", p->fallback
1e7d0 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  ->index,.       
1e7e0 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70 2d 3e 66     p->name, p->f
1e7f0 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65 29 3b 0a  allback->name);.
1e800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 69        }.      li
1e810 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
1e820 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
1e830 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c 20 6f 75  mp->name, in, ou
1e840 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  t, &lineno);..  
1e850 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74 61  /* Generate a ta
1e860 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
1e870 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65  he symbolic name
1e880 20 6f 66 20 65 76 65 72 79 20 73 79 6d 62 6f 6c   of every symbol
1e890 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
1e8a0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1e8b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 6f  ; i++){.    lemo
1e8c0 6e 5f 73 70 72 69 6e 74 66 28 6c 69 6e 65 2c 22  n_sprintf(line,"
1e8d0 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73  \"%s\",",lemp->s
1e8e0 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29  ymbols[i]->name)
1e8f0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1e900 74 2c 22 20 20 25 2d 31 35 73 22 2c 6c 69 6e 65  t,"  %-15s",line
1e910 29 3b 0a 20 20 20 20 69 66 28 20 28 69 26 33 29  );.    if( (i&3)
1e920 3d 3d 33 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  ==3 ){ fprintf(o
1e930 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ut,"\n"); lineno
1e940 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20  ++; }.  }.  if( 
1e950 28 69 26 33 29 21 3d 30 20 29 7b 20 66 70 72 69  (i&3)!=0 ){ fpri
1e960 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c  ntf(out,"\n"); l
1e970 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c  ineno++; }.  tpl
1e980 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1e990 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1e9a0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1e9b0 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  e a table contai
1e9c0 6e 69 6e 67 20 61 20 74 65 78 74 20 73 74 72 69  ning a text stri
1e9d0 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
1e9e0 73 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c  s every.  ** rul
1e9f0 65 20 69 6e 20 74 68 65 20 72 75 6c 65 20 73 65  e in the rule se
1ea00 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72  t of the grammar
1ea10 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
1ea20 69 6f 6e 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  ion is used.  **
1ea30 20 77 68 65 6e 20 74 72 61 63 69 6e 67 20 52 45   when tracing RE
1ea40 44 55 43 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20  DUCE actions..  
1ea50 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72 70  */.  for(i=0, rp
1ea60 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
1ea70 20 72 70 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b   rp=rp->next, i+
1ea80 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
1ea90 72 70 2d 3e 69 6e 64 65 78 3d 3d 69 20 29 3b 0a  rp->index==i );.
1eaa0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1eab0 22 20 2f 2a 20 25 33 64 20 2a 2f 20 5c 22 22 2c  " /* %3d */ \"",
1eac0 20 69 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75   i);.    writeRu
1ead0 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b  leText(out, rp);
1eae0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1eaf0 2c 22 5c 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ,"\",\n"); linen
1eb00 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
1eb10 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1eb20 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1eb30 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1eb40 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
1eb50 74 65 73 20 65 76 65 72 79 20 74 69 6d 65 20 61  tes every time a
1eb60 20 73 79 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65   symbol is poppe
1eb70 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  d from.  ** the 
1eb80 73 74 61 63 6b 20 77 68 69 6c 65 20 70 72 6f 63  stack while proc
1eb90 65 73 73 69 6e 67 20 65 72 72 6f 72 73 20 6f 72  essing errors or
1eba0 20 77 68 69 6c 65 20 64 65 73 74 72 6f 79 69 6e   while destroyin
1ebb0 67 20 74 68 65 20 70 61 72 73 65 72 2e 20 0a 20  g the parser. . 
1ebc0 20 2a 2a 20 28 49 6e 20 6f 74 68 65 72 20 77 6f   ** (In other wo
1ebd0 72 64 73 2c 20 67 65 6e 65 72 61 74 65 20 74 68  rds, generate th
1ebe0 65 20 25 64 65 73 74 72 75 63 74 6f 72 20 61 63  e %destructor ac
1ebf0 74 69 6f 6e 73 29 0a 20 20 2a 2f 0a 20 20 69 66  tions).  */.  if
1ec00 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73  ( lemp->tokendes
1ec10 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6e 63  t ){.    int onc
1ec20 65 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  e = 1;.    for(i
1ec30 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
1ec40 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  bol; i++){.     
1ec50 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1ec60 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
1ec70 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ls[i];.      if(
1ec80 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79   sp==0 || sp->ty
1ec90 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 29 20 63  pe!=TERMINAL ) c
1eca0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
1ecb0 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20  f( once ){.     
1ecc0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1ecd0 22 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 49 4e  "      /* TERMIN
1ece0 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a 2f  AL Destructor */
1ecf0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1ed00 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30          once = 0
1ed10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ed20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1ed30 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20   case %d: /* %s 
1ed40 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78  */\n", sp->index
1ed50 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e  , sp->name); lin
1ed60 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  eno++;.    }.   
1ed70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1ed80 2d 3e 6e 73 79 6d 62 6f 6c 20 26 26 20 6c 65 6d  ->nsymbol && lem
1ed90 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74  p->symbols[i]->t
1eda0 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 3b 20 69  ype!=TERMINAL; i
1edb0 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 6c  ++);.    if( i<l
1edc0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a  emp->nsymbol ){.
1edd0 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72        emit_destr
1ede0 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c  uctor_code(out,l
1edf0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c  emp->symbols[i],
1ee00 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lemp,&lineno);. 
1ee10 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1ee20 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e  ,"      break;\n
1ee30 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1ee40 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65    }.  }.  if( le
1ee50 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a 20  mp->vardest ){. 
1ee60 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1ee70 20 2a 64 66 6c 74 5f 73 70 20 3d 20 30 3b 0a 20   *dflt_sp = 0;. 
1ee80 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b     int once = 1;
1ee90 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1eea0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
1eeb0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
1eec0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
1eed0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
1eee0 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30  .      if( sp==0
1eef0 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45   || sp->type==TE
1ef00 52 4d 49 4e 41 4c 20 7c 7c 0a 20 20 20 20 20 20  RMINAL ||.      
1ef10 20 20 20 20 73 70 2d 3e 69 6e 64 65 78 3c 3d 30      sp->index<=0
1ef20 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74   || sp->destruct
1ef30 6f 72 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  or!=0 ) continue
1ef40 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
1ef50 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
1ef60 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 20 20  ntf(out, "      
1ef70 2f 2a 20 44 65 66 61 75 6c 74 20 4e 4f 4e 2d 54  /* Default NON-T
1ef80 45 52 4d 49 4e 41 4c 20 44 65 73 74 72 75 63 74  ERMINAL Destruct
1ef90 6f 72 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e  or */\n"); linen
1efa0 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6f 6e 63  o++;.        onc
1efb0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
1efc0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1efd0 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f  ,"    case %d: /
1efe0 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e  * %s */\n", sp->
1eff0 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29  index, sp->name)
1f000 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1f010 20 20 64 66 6c 74 5f 73 70 20 3d 20 73 70 3b 0a    dflt_sp = sp;.
1f020 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 66      }.    if( df
1f030 6c 74 5f 73 70 21 3d 30 20 29 7b 0a 20 20 20 20  lt_sp!=0 ){.    
1f040 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f    emit_destructo
1f050 72 5f 63 6f 64 65 28 6f 75 74 2c 64 66 6c 74 5f  r_code(out,dflt_
1f060 73 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  sp,lemp,&lineno)
1f070 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
1f080 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62  ntf(out,"      b
1f090 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
1f0a0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  o++;.  }.  for(i
1f0b0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
1f0c0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bol; i++){.    s
1f0d0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
1f0e0 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
1f0f0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 3d  [i];.    if( sp=
1f100 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d  =0 || sp->type==
1f110 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e  TERMINAL || sp->
1f120 64 65 73 74 72 75 63 74 6f 72 3d 3d 30 20 29 20  destructor==0 ) 
1f130 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70  continue;.    fp
1f140 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63  rintf(out,"    c
1f150 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f  ase %d: /* %s */
1f160 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20  \n", sp->index, 
1f170 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  sp->name); linen
1f180 6f 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  o++;..    /* Com
1f190 62 69 6e 65 20 64 75 70 6c 69 63 61 74 65 20 64  bine duplicate d
1f1a0 65 73 74 72 75 63 74 6f 72 73 20 69 6e 74 6f 20  estructors into 
1f1b0 61 20 73 69 6e 67 6c 65 20 63 61 73 65 20 2a 2f  a single case */
1f1c0 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20  .    for(j=i+1; 
1f1d0 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  j<lemp->nsymbol;
1f1e0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   j++){.      str
1f1f0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 32 20  uct symbol *sp2 
1f200 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
1f210 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70  j];.      if( sp
1f220 32 20 26 26 20 73 70 32 2d 3e 74 79 70 65 21 3d  2 && sp2->type!=
1f230 54 45 52 4d 49 4e 41 4c 20 26 26 20 73 70 32 2d  TERMINAL && sp2-
1f240 3e 64 65 73 74 72 75 63 74 6f 72 0a 20 20 20 20  >destructor.    
1f250 20 20 20 20 20 20 26 26 20 73 70 32 2d 3e 64 74        && sp2->dt
1f260 6e 75 6d 3d 3d 73 70 2d 3e 64 74 6e 75 6d 0a 20  num==sp->dtnum. 
1f270 20 20 20 20 20 20 20 20 20 26 26 20 73 74 72 63           && strc
1f280 6d 70 28 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  mp(sp->destructo
1f290 72 2c 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f  r,sp2->destructo
1f2a0 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  r)==0 ){.       
1f2b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1f2c0 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25     case %d: /* %
1f2d0 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s */\n",.       
1f2e0 20 20 20 20 20 20 20 20 20 20 73 70 32 2d 3e 69            sp2->i
1f2f0 6e 64 65 78 2c 20 73 70 32 2d 3e 6e 61 6d 65 29  ndex, sp2->name)
1f300 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1f310 20 20 20 20 20 73 70 32 2d 3e 64 65 73 74 72 75       sp2->destru
1f320 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ctor = 0;.      
1f330 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6d 69  }.    }..    emi
1f340 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64  t_destructor_cod
1f350 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62  e(out,lemp->symb
1f360 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e  ols[i],lemp,&lin
1f370 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  eno);.    fprint
1f380 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65  f(out,"      bre
1f390 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ak;\n"); lineno+
1f3a0 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
1f3b0 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1f3c0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1f3d0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1f3e0 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
1f3f0 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 70  s whenever the p
1f400 61 72 73 65 72 20 73 74 61 63 6b 20 6f 76 65 72  arser stack over
1f410 66 6c 6f 77 73 20 2a 2f 0a 20 20 74 70 6c 74 5f  flows */.  tplt_
1f420 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
1f430 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 2c 26 6c  emp->overflow,&l
1f440 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78  ineno);.  tplt_x
1f450 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1f460 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1f470 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
1f480 68 65 20 74 61 62 6c 65 20 6f 66 20 72 75 6c 65  he table of rule
1f490 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 20 20   information .  
1f4a0 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  **.  ** Note: Th
1f4b0 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20  is code depends 
1f4c0 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74  on the fact that
1f4d0 20 72 75 6c 65 73 20 61 72 65 20 6e 75 6d 62 65   rules are numbe
1f4e0 72 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74 75 61  r.  ** sequentua
1f4f0 6c 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  lly beginning wi
1f500 74 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  th 0..  */.  for
1f510 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
1f520 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
1f530 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1f540 74 2c 22 20 20 7b 20 25 64 2c 20 25 64 20 7d 2c  t,"  { %d, %d },
1f550 5c 6e 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64  \n",rp->lhs->ind
1f560 65 78 2c 72 70 2d 3e 6e 72 68 73 29 3b 20 6c 69  ex,rp->nrhs); li
1f570 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70  neno++;.  }.  tp
1f580 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1f590 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
1f5a0 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1f5b0 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
1f5c0 65 63 75 74 69 6f 6e 20 64 75 72 69 6e 67 20 65  ecution during e
1f5d0 61 63 68 20 52 45 44 55 43 45 20 61 63 74 69 6f  ach REDUCE actio
1f5e0 6e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65  n */.  for(rp=le
1f5f0 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
1f600 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
1f610 74 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28 6c  translate_code(l
1f620 65 6d 70 2c 20 72 70 29 3b 0a 20 20 7d 0a 20 20  emp, rp);.  }.  
1f630 2f 2a 20 46 69 72 73 74 20 6f 75 74 70 75 74 20  /* First output 
1f640 72 75 6c 65 73 20 6f 74 68 65 72 20 74 68 61 6e  rules other than
1f650 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20 72 75   the default: ru
1f660 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c  le */.  for(rp=l
1f670 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
1f680 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
1f690 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
1f6a0 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
1f6b0 20 2f 2a 20 4f 74 68 65 72 20 72 75 6c 65 73 20   /* Other rules 
1f6c0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 61 63  with the same ac
1f6d0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tion */.    if( 
1f6e0 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 20 63 6f  rp->code==0 ) co
1f6f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
1f700 72 70 2d 3e 63 6f 64 65 5b 30 5d 3d 3d 27 5c 6e  rp->code[0]=='\n
1f710 27 20 26 26 20 72 70 2d 3e 63 6f 64 65 5b 31 5d  ' && rp->code[1]
1f720 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ==0 ) continue; 
1f730 2f 2a 20 57 69 6c 6c 20 62 65 20 64 65 66 61 75  /* Will be defau
1f740 6c 74 3a 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e  lt: */.    fprin
1f750 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61  tf(out,"      ca
1f760 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70 2d  se %d: /* ", rp-
1f770 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 77 72 69  >index);.    wri
1f780 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20  teRuleText(out, 
1f790 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  rp);.    fprintf
1f7a0 28 6f 75 74 2c 20 22 20 2a 2f 5c 6e 22 29 3b 20  (out, " */\n"); 
1f7b0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 6f  lineno++;.    fo
1f7c0 72 28 72 70 32 3d 72 70 2d 3e 6e 65 78 74 3b 20  r(rp2=rp->next; 
1f7d0 72 70 32 3b 20 72 70 32 3d 72 70 32 2d 3e 6e 65  rp2; rp2=rp2->ne
1f7e0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  xt){.      if( r
1f7f0 70 32 2d 3e 63 6f 64 65 3d 3d 72 70 2d 3e 63 6f  p2->code==rp->co
1f800 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  de ){.        fp
1f810 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
1f820 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20   case %d: /* ", 
1f830 72 70 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  rp2->index);.   
1f840 20 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65       writeRuleTe
1f850 78 74 28 6f 75 74 2c 20 72 70 32 29 3b 0a 20 20  xt(out, rp2);.  
1f860 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1f870 74 2c 22 20 2a 2f 20 79 79 74 65 73 74 63 61 73  t," */ yytestcas
1f880 65 28 79 79 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b  e(yyruleno==%d);
1f890 5c 6e 22 2c 20 72 70 32 2d 3e 69 6e 64 65 78 29  \n", rp2->index)
1f8a0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1f8b0 20 20 20 20 72 70 32 2d 3e 63 6f 64 65 20 3d 20      rp2->code = 
1f8c0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1f8d0 0a 20 20 20 20 65 6d 69 74 5f 63 6f 64 65 28 6f  .    emit_code(o
1f8e0 75 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65  ut,rp,lemp,&line
1f8f0 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  no);.    fprintf
1f900 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20 62 72  (out,"        br
1f910 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  eak;\n"); lineno
1f920 2b 2b 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65  ++;.    rp->code
1f930 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46   = 0;.  }.  /* F
1f940 69 6e 61 6c 6c 79 2c 20 6f 75 74 70 75 74 20 74  inally, output t
1f950 68 65 20 64 65 66 61 75 6c 74 3a 20 72 75 6c 65  he default: rule
1f960 2e 20 20 57 65 20 63 68 6f 6f 73 65 20 61 73 20  .  We choose as 
1f970 74 68 65 20 64 65 66 61 75 6c 74 3a 20 61 6c 6c  the default: all
1f980 0a 20 20 2a 2a 20 65 6d 70 74 79 20 61 63 74 69  .  ** empty acti
1f990 6f 6e 73 2e 20 2a 2f 0a 20 20 66 70 72 69 6e 74  ons. */.  fprint
1f9a0 66 28 6f 75 74 2c 22 20 20 20 20 20 20 64 65 66  f(out,"      def
1f9b0 61 75 6c 74 3a 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ault:\n"); linen
1f9c0 6f 2b 2b 3b 0a 20 20 66 6f 72 28 72 70 3d 6c 65  o++;.  for(rp=le
1f9d0 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
1f9e0 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
1f9f0 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20  if( rp->code==0 
1fa00 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1fa10 61 73 73 65 72 74 28 20 72 70 2d 3e 63 6f 64 65  assert( rp->code
1fa20 5b 30 5d 3d 3d 27 5c 6e 27 20 26 26 20 72 70 2d  [0]=='\n' && rp-
1fa30 3e 63 6f 64 65 5b 31 5d 3d 3d 30 20 29 3b 0a 20  >code[1]==0 );. 
1fa40 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1fa50 20 20 20 20 20 20 2f 2a 20 28 25 64 29 20 22 2c        /* (%d) ",
1fa60 20 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20   rp->index);.   
1fa70 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f   writeRuleText(o
1fa80 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72  ut, rp);.    fpr
1fa90 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f 20 79  intf(out, " */ y
1faa0 79 74 65 73 74 63 61 73 65 28 79 79 72 75 6c 65  ytestcase(yyrule
1fab0 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72 70 2d  no==%d);\n", rp-
1fac0 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b  >index); lineno+
1fad0 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  +;.  }.  fprintf
1fae0 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20 62 72  (out,"        br
1faf0 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  eak;\n"); lineno
1fb00 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  ++;.  tplt_xfer(
1fb10 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1fb20 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1fb30 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1fb40 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 69  which executes i
1fb50 66 20 61 20 70 61 72 73 65 20 66 61 69 6c 73 20  f a parse fails 
1fb60 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
1fb70 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66  out,lemp,lemp->f
1fb80 61 69 6c 75 72 65 2c 26 6c 69 6e 65 6e 6f 29 3b  ailure,&lineno);
1fb90 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1fba0 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1fbb0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1fbc0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
1fbd0 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e  ch executes when
1fbe0 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20   a syntax error 
1fbf0 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74 70 6c 74  occurs */.  tplt
1fc00 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
1fc10 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 26 6c 69 6e  lemp->error,&lin
1fc20 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65  eno);.  tplt_xfe
1fc30 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1fc40 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1fc50 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1fc60 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1fc70 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   when the parser
1fc80 20 61 63 63 65 70 74 73 20 69 74 73 20 69 6e 70   accepts its inp
1fc90 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ut */.  tplt_pri
1fca0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1fcb0 2d 3e 61 63 63 65 70 74 2c 26 6c 69 6e 65 6e 6f  ->accept,&lineno
1fcc0 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
1fcd0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1fce0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1fcf0 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64 64 69   Append any addi
1fd00 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20 75 73  tion code the us
1fd10 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a 20 20  er desires */.  
1fd20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
1fd30 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63  emp,lemp->extrac
1fd40 6f 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  ode,&lineno);.. 
1fd50 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 66   fclose(in);.  f
1fd60 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 72 65  close(out);.  re
1fd70 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  turn;.}../* Gene
1fd80 72 61 74 65 20 61 20 68 65 61 64 65 72 20 66 69  rate a header fi
1fd90 6c 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  le for the parse
1fda0 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74  r */.void Report
1fdb0 48 65 61 64 65 72 28 73 74 72 75 63 74 20 6c 65  Header(struct le
1fdc0 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 46  mon *lemp).{.  F
1fdd0 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20  ILE *out, *in;. 
1fde0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 65   const char *pre
1fdf0 66 69 78 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65  fix;.  char line
1fe00 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 63 68  [LINESIZE];.  ch
1fe10 61 72 20 70 61 74 74 65 72 6e 5b 4c 49 4e 45 53  ar pattern[LINES
1fe20 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  IZE];.  int i;..
1fe30 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65    if( lemp->toke
1fe40 6e 70 72 65 66 69 78 20 29 20 70 72 65 66 69 78  nprefix ) prefix
1fe50 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72   = lemp->tokenpr
1fe60 65 66 69 78 3b 0a 20 20 65 6c 73 65 20 20 20 20  efix;.  else    
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe80 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 69  prefix = "";.  i
1fe90 6e 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  n = file_open(le
1fea0 6d 70 2c 22 2e 68 22 2c 22 72 62 22 29 3b 0a 20  mp,".h","rb");. 
1feb0 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20 20 69   if( in ){.    i
1fec0 6e 74 20 6e 65 78 74 43 68 61 72 3b 0a 20 20 20  nt nextChar;.   
1fed0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70   for(i=1; i<lemp
1fee0 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20 66  ->nterminal && f
1fef0 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49  gets(line,LINESI
1ff00 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20  ZE,in); i++){.  
1ff10 20 20 20 20 6c 65 6d 6f 6e 5f 73 70 72 69 6e 74      lemon_sprint
1ff20 66 28 70 61 74 74 65 72 6e 2c 22 23 64 65 66 69  f(pattern,"#defi
1ff30 6e 65 20 25 73 25 2d 33 30 73 20 25 33 64 5c 6e  ne %s%-30s %3d\n
1ff40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1ff50 20 20 20 20 20 20 20 70 72 65 66 69 78 2c 6c 65         prefix,le
1ff60 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
1ff70 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 69  name,i);.      i
1ff80 66 28 20 73 74 72 63 6d 70 28 6c 69 6e 65 2c 70  f( strcmp(line,p
1ff90 61 74 74 65 72 6e 29 20 29 20 62 72 65 61 6b 3b  attern) ) break;
1ffa0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 78 74 43  .    }.    nextC
1ffb0 68 61 72 20 3d 20 66 67 65 74 63 28 69 6e 29 3b  har = fgetc(in);
1ffc0 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
1ffd0 0a 20 20 20 20 69 66 28 20 69 3d 3d 6c 65 6d 70  .    if( i==lemp
1ffe0 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20 6e  ->nterminal && n
1fff0 65 78 74 43 68 61 72 3d 3d 45 4f 46 20 29 7b 0a  extChar==EOF ){.
20000 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 68 61 6e        /* No chan
20010 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  ge in the file. 
20020 20 44 6f 6e 27 74 20 72 65 77 72 69 74 65 20 69   Don't rewrite i
20030 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
20040 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
20050 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28  out = file_open(
20060 6c 65 6d 70 2c 22 2e 68 22 2c 22 77 62 22 29 3b  lemp,".h","wb");
20070 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20  .  if( out ){.  
20080 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d    for(i=1; i<lem
20090 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b  p->nterminal; i+
200a0 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  +){.      fprint
200b0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
200c0 73 25 2d 33 30 73 20 25 33 64 5c 6e 22 2c 70 72  s%-30s %3d\n",pr
200d0 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  efix,lemp->symbo
200e0 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a  ls[i]->name,i);.
200f0 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65      }.    fclose
20100 28 6f 75 74 29 3b 20 20 0a 20 20 7d 0a 20 20 72  (out);  .  }.  r
20110 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 64  eturn;.}../* Red
20120 75 63 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  uce the size of 
20130 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
20140 73 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  s, if possible, 
20150 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 0a 2a 2a  by making use.**
20160 20 6f 66 20 64 65 66 61 75 6c 74 73 2e 0a 2a 2a   of defaults..**
20170 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
20180 69 6f 6e 2c 20 77 65 20 74 61 6b 65 20 74 68 65  ion, we take the
20190 20 6d 6f 73 74 20 66 72 65 71 75 65 6e 74 20 52   most frequent R
201a0 45 44 55 43 45 20 61 63 74 69 6f 6e 20 61 6e 64  EDUCE action and
201b0 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20   make.** it the 
201c0 64 65 66 61 75 6c 74 2e 20 20 45 78 63 65 70 74  default.  Except
201d0 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65  , there is no de
201e0 66 61 75 6c 74 20 69 66 20 74 68 65 20 77 69 6c  fault if the wil
201f0 64 63 61 72 64 20 74 6f 6b 65 6e 0a 2a 2a 20 69  dcard token.** i
20200 73 20 61 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f  s a possible loo
20210 6b 2d 61 68 65 61 64 2e 0a 2a 2f 0a 76 6f 69 64  k-ahead..*/.void
20220 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28   CompressTables(
20230 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
20240 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  mp).{.  struct s
20250 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
20260 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20  uct action *ap, 
20270 2a 61 70 32 3b 0a 20 20 73 74 72 75 63 74 20 72  *ap2;.  struct r
20280 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c 20 2a  ule *rp, *rp2, *
20290 72 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e 62 65  rbest;.  int nbe
202a0 73 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  st, n;.  int i;.
202b0 20 20 69 6e 74 20 75 73 65 73 57 69 6c 64 63 61    int usesWildca
202c0 72 64 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  rd;..  for(i=0; 
202d0 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
202e0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
202f0 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
20300 0a 20 20 20 20 6e 62 65 73 74 20 3d 20 30 3b 0a  .    nbest = 0;.
20310 20 20 20 20 72 62 65 73 74 20 3d 20 30 3b 0a 20      rbest = 0;. 
20320 20 20 20 75 73 65 73 57 69 6c 64 63 61 72 64 20     usesWildcard 
20330 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28 61 70  = 0;..    for(ap
20340 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
20350 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
20360 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
20370 53 48 49 46 54 20 26 26 20 61 70 2d 3e 73 70 3d  SHIFT && ap->sp=
20380 3d 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 20  =lemp->wildcard 
20390 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65 73 57  ){.        usesW
203a0 69 6c 64 63 61 72 64 20 3d 20 31 3b 0a 20 20 20  ildcard = 1;.   
203b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
203c0 70 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20  p->type!=REDUCE 
203d0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
203e0 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b    rp = ap->x.rp;
203f0 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c  .      if( rp->l
20400 68 73 53 74 61 72 74 20 29 20 63 6f 6e 74 69 6e  hsStart ) contin
20410 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70  ue;.      if( rp
20420 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e  ==rbest ) contin
20430 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b  ue;.      n = 1;
20440 0a 20 20 20 20 20 20 66 6f 72 28 61 70 32 3d 61  .      for(ap2=a
20450 70 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20 61 70  p->next; ap2; ap
20460 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20  2=ap2->next){.  
20470 20 20 20 20 20 20 69 66 28 20 61 70 32 2d 3e 74        if( ap2->t
20480 79 70 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f  ype!=REDUCE ) co
20490 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
204a0 72 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72 70 3b  rp2 = ap2->x.rp;
204b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70 32  .        if( rp2
204c0 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e  ==rbest ) contin
204d0 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
204e0 72 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a 20  rp2==rp ) n++;. 
204f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20500 20 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20 20 20   n>nbest ){.    
20510 20 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b 0a 20      nbest = n;. 
20520 20 20 20 20 20 20 20 72 62 65 73 74 20 3d 20 72         rbest = r
20530 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
20540 0a 20 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  . .    /* Do not
20550 20 6d 61 6b 65 20 61 20 64 65 66 61 75 6c 74 20   make a default 
20560 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  if the number of
20570 20 72 75 6c 65 73 20 74 6f 20 64 65 66 61 75 6c   rules to defaul
20580 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  t.    ** is not 
20590 61 74 20 6c 65 61 73 74 20 31 20 6f 72 20 69 66  at least 1 or if
205a0 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f   the wildcard to
205b0 6b 65 6e 20 69 73 20 61 20 70 6f 73 73 69 62 6c  ken is a possibl
205c0 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 6b 61 68 65  e.    ** lookahe
205d0 61 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ad..    */.    i
205e0 66 28 20 6e 62 65 73 74 3c 31 20 7c 7c 20 75 73  f( nbest<1 || us
205f0 65 73 57 69 6c 64 63 61 72 64 20 29 20 63 6f 6e  esWildcard ) con
20600 74 69 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a 20  tinue;...    /* 
20610 43 6f 6d 62 69 6e 65 20 6d 61 74 63 68 69 6e 67  Combine matching
20620 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73 20   REDUCE actions 
20630 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 64 65  into a single de
20640 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f 72  fault */.    for
20650 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
20660 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
20670 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
20680 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d  e==REDUCE && ap-
20690 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 62  >x.rp==rbest ) b
206a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
206b0 61 73 73 65 72 74 28 20 61 70 20 29 3b 0a 20 20  assert( ap );.  
206c0 20 20 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62 6f    ap->sp = Symbo
206d0 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74 7d  l_new("{default}
206e0 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 61  ");.    for(ap=a
206f0 70 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70 3d  p->next; ap; ap=
20700 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
20710 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52   if( ap->type==R
20720 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72  EDUCE && ap->x.r
20730 70 3d 3d 72 62 65 73 74 20 29 20 61 70 2d 3e 74  p==rbest ) ap->t
20740 79 70 65 20 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a  ype = NOT_USED;.
20750 20 20 20 20 7d 0a 20 20 20 20 73 74 70 2d 3e 61      }.    stp->a
20760 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28  p = Action_sort(
20770 73 74 70 2d 3e 61 70 29 3b 0a 20 20 7d 0a 7d 0a  stp->ap);.  }.}.
20780 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
20790 74 77 6f 20 73 74 61 74 65 73 20 66 6f 72 20 73  two states for s
207a0 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e  orting purposes.
207b0 20 20 54 68 65 20 73 6d 61 6c 6c 65 72 20 73 74    The smaller st
207c0 61 74 65 20 69 73 20 74 68 65 0a 2a 2a 20 6f 6e  ate is the.** on
207d0 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74 20  e with the most 
207e0 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74  non-terminal act
207f0 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 79 20 68  ions.  If they h
20800 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
20810 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f 6e 2d 74 65  ber.** of non-te
20820 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2c 20  rminal actions, 
20830 74 68 65 6e 20 74 68 65 20 73 6d 61 6c 6c 65 72  then the smaller
20840 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
20850 20 74 68 65 20 6d 6f 73 74 0a 2a 2a 20 74 6f 6b   the most.** tok
20860 65 6e 20 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73  en actions..*/.s
20870 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 65 52  tatic int stateR
20880 65 73 6f 72 74 43 6f 6d 70 61 72 65 28 63 6f 6e  esortCompare(con
20890 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73  st void *a, cons
208a0 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 63 6f  t void *b){.  co
208b0 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65  nst struct state
208c0 20 2a 70 41 20 3d 20 2a 28 63 6f 6e 73 74 20 73   *pA = *(const s
208d0 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29 61 3b  truct state**)a;
208e0 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
208f0 73 74 61 74 65 20 2a 70 42 20 3d 20 2a 28 63 6f  state *pB = *(co
20900 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65  nst struct state
20910 2a 2a 29 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  **)b;.  int n;..
20920 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e 74 41 63 74    n = pB->nNtAct
20930 20 2d 20 70 41 2d 3e 6e 4e 74 41 63 74 3b 0a 20   - pA->nNtAct;. 
20940 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
20950 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b 6e 41 63 74   n = pB->nTknAct
20960 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41 63 74 3b 0a   - pA->nTknAct;.
20970 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
20980 20 20 20 20 20 20 6e 20 3d 20 70 42 2d 3e 73 74        n = pB->st
20990 61 74 65 6e 75 6d 20 2d 20 70 41 2d 3e 73 74 61  atenum - pA->sta
209a0 74 65 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  tenum;.    }.  }
209b0 0a 20 20 61 73 73 65 72 74 28 20 6e 21 3d 30 20  .  assert( n!=0 
209c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
209d0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 75 6d 62 65  .../*.** Renumbe
209e0 72 20 61 6e 64 20 72 65 73 6f 72 74 20 73 74 61  r and resort sta
209f0 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61 74  tes so that stat
20a00 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63 68  es with fewer ch
20a10 6f 69 63 65 73 0a 2a 2a 20 6f 63 63 75 72 20 61  oices.** occur a
20a20 74 20 74 68 65 20 65 6e 64 2e 20 20 45 78 63 65  t the end.  Exce
20a30 70 74 2c 20 6b 65 65 70 20 73 74 61 74 65 20 30  pt, keep state 0
20a40 20 61 73 20 74 68 65 20 66 69 72 73 74 20 73 74   as the first st
20a50 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 52 65 73  ate..*/.void Res
20a60 6f 72 74 53 74 61 74 65 73 28 73 74 72 75 63 74  ortStates(struct
20a70 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
20a80 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
20a90 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20  t state *stp;.  
20aa0 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
20ab0 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  p;..  for(i=0; i
20ac0 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
20ad0 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
20ae0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
20af0 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74      stp->nTknAct
20b00 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 20 3d   = stp->nNtAct =
20b10 20 30 3b 0a 20 20 20 20 73 74 70 2d 3e 69 44 66   0;.    stp->iDf
20b20 6c 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  lt = lemp->nstat
20b30 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b  e + lemp->nrule;
20b40 0a 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66  .    stp->iTknOf
20b50 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a  st = NO_OFFSET;.
20b60 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74      stp->iNtOfst
20b70 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20   = NO_OFFSET;.  
20b80 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
20b90 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
20ba0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 6f  t){.      if( co
20bb0 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d  mpute_action(lem
20bc0 70 2c 61 70 29 3e 3d 30 20 29 7b 0a 20 20 20 20  p,ap)>=0 ){.    
20bd0 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e      if( ap->sp->
20be0 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72  index<lemp->nter
20bf0 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  minal ){.       
20c00 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 2b     stp->nTknAct+
20c10 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
20c20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
20c30 65 78 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c  ex<lemp->nsymbol
20c40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
20c50 70 2d 3e 6e 4e 74 41 63 74 2b 2b 3b 0a 20 20 20  p->nNtAct++;.   
20c60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20c70 20 20 20 20 20 20 73 74 70 2d 3e 69 44 66 6c 74        stp->iDflt
20c80 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f   = compute_actio
20c90 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20  n(lemp, ap);.   
20ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
20cb0 20 20 20 7d 0a 20 20 7d 0a 20 20 71 73 6f 72 74     }.  }.  qsort
20cc0 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 31  (&lemp->sorted[1
20cd0 5d 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2d  ], lemp->nstate-
20ce0 31 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 70 2d 3e  1, sizeof(lemp->
20cf0 73 6f 72 74 65 64 5b 30 5d 29 2c 0a 20 20 20 20  sorted[0]),.    
20d00 20 20 20 20 73 74 61 74 65 52 65 73 6f 72 74 43      stateResortC
20d10 6f 6d 70 61 72 65 29 3b 0a 20 20 66 6f 72 28 69  ompare);.  for(i
20d20 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
20d30 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65  te; i++){.    le
20d40 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 73  mp->sorted[i]->s
20d50 74 61 74 65 6e 75 6d 20 3d 20 69 3b 0a 20 20 7d  tatenum = i;.  }
20d60 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
20d70 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
20d80 20 66 69 6c 65 20 22 73 65 74 2e 63 22 20 2a 2a   file "set.c" **
20d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20db0 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61  **/./*.** Set ma
20dc0 6e 69 70 75 6c 61 74 69 6f 6e 20 72 6f 75 74 69  nipulation routi
20dd0 6e 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f  nes for the LEMO
20de0 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
20df0 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69  or..*/..static i
20e00 6e 74 20 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a  nt size = 0;../*
20e10 20 53 65 74 20 74 68 65 20 73 65 74 20 73 69 7a   Set the set siz
20e20 65 20 2a 2f 0a 76 6f 69 64 20 53 65 74 53 69 7a  e */.void SetSiz
20e30 65 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73 69 7a  e(int n).{.  siz
20e40 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41  e = n+1;.}../* A
20e50 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65  llocate a new se
20e60 74 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65  t */.char *SetNe
20e70 77 28 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b 0a  w(){.  char *s;.
20e80 20 20 73 20 3d 20 28 63 68 61 72 2a 29 63 61 6c    s = (char*)cal
20e90 6c 6f 63 28 20 73 69 7a 65 2c 20 31 29 3b 0a 20  loc( size, 1);. 
20ea0 20 69 66 28 20 73 3d 3d 30 20 29 7b 0a 20 20 20   if( s==0 ){.   
20eb0 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d   extern void mem
20ec0 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20  ory_error();.   
20ed0 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b   memory_error();
20ee0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 3b  .  }.  return s;
20ef0 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  .}../* Deallocat
20f00 65 20 61 20 73 65 74 20 2a 2f 0a 76 6f 69 64 20  e a set */.void 
20f10 53 65 74 46 72 65 65 28 63 68 61 72 20 2a 73 29  SetFree(char *s)
20f20 0a 7b 0a 20 20 66 72 65 65 28 73 29 3b 0a 7d 0a  .{.  free(s);.}.
20f30 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  ./* Add a new el
20f40 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 73 65 74  ement to the set
20f50 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
20f60 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 77 61  f the element wa
20f70 73 20 61 64 64 65 64 0a 2a 2a 20 61 6e 64 20 46  s added.** and F
20f80 41 4c 53 45 20 69 66 20 69 74 20 77 61 73 20 61  ALSE if it was a
20f90 6c 72 65 61 64 79 20 74 68 65 72 65 2e 20 2a 2f  lready there. */
20fa0 0a 69 6e 74 20 53 65 74 41 64 64 28 63 68 61 72  .int SetAdd(char
20fb0 20 2a 73 2c 20 69 6e 74 20 65 29 0a 7b 0a 20 20   *s, int e).{.  
20fc0 69 6e 74 20 72 76 3b 0a 20 20 61 73 73 65 72 74  int rv;.  assert
20fd0 28 20 65 3e 3d 30 20 26 26 20 65 3c 73 69 7a 65  ( e>=0 && e<size
20fe0 20 29 3b 0a 20 20 72 76 20 3d 20 73 5b 65 5d 3b   );.  rv = s[e];
20ff0 0a 20 20 73 5b 65 5d 20 3d 20 31 3b 0a 20 20 72  .  s[e] = 1;.  r
21000 65 74 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f 2a  eturn !rv;.}../*
21010 20 41 64 64 20 65 76 65 72 79 20 65 6c 65 6d 65   Add every eleme
21020 6e 74 20 6f 66 20 73 32 20 74 6f 20 73 31 2e 20  nt of s2 to s1. 
21030 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
21040 73 31 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 69  s1 changes. */.i
21050 6e 74 20 53 65 74 55 6e 69 6f 6e 28 63 68 61 72  nt SetUnion(char
21060 20 2a 73 31 2c 20 63 68 61 72 20 2a 73 32 29 0a   *s1, char *s2).
21070 7b 0a 20 20 69 6e 74 20 69 2c 20 70 72 6f 67 72  {.  int i, progr
21080 65 73 73 3b 0a 20 20 70 72 6f 67 72 65 73 73 20  ess;.  progress 
21090 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
210a0 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  i<size; i++){.  
210b0 20 20 69 66 28 20 73 32 5b 69 5d 3d 3d 30 20 29    if( s2[i]==0 )
210c0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
210d0 66 28 20 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20  f( s1[i]==0 ){. 
210e0 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20       progress = 
210f0 31 3b 0a 20 20 20 20 20 20 73 31 5b 69 5d 20 3d  1;.      s1[i] =
21100 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
21110 72 65 74 75 72 6e 20 70 72 6f 67 72 65 73 73 3b  return progress;
21120 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
21130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
21140 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e  the file "table.
21150 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
21160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
21170 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20  ./*.** All code 
21180 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68 61 73  in this file has
21190 20 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61   been automatica
211a0 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  lly generated.**
211b0 20 66 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63   from a specific
211c0 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c  ation in the fil
211d0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
211e0 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62    "table.q".** b
211f0 79 20 74 68 65 20 61 73 73 6f 63 69 61 74 69 76  y the associativ
21200 65 20 61 72 72 61 79 20 63 6f 64 65 20 62 75 69  e array code bui
21210 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61  lding program "a
21220 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  agen"..** Do not
21230 20 65 64 69 74 20 74 68 69 73 20 66 69 6c 65 21   edit this file!
21240 20 20 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20    Instead, edit 
21250 74 68 65 20 73 70 65 63 69 66 69 63 61 74 69 6f  the specificatio
21260 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  n.** file, then 
21270 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a  rerun aagen..*/.
21280 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70  /*.** Code for p
21290 72 6f 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73  rocessing tables
212a0 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
212b0 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
212c0 2a 2f 0a 0a 50 52 49 56 41 54 45 20 75 6e 73 69  */..PRIVATE unsi
212d0 67 6e 65 64 20 73 74 72 68 61 73 68 28 63 6f 6e  gned strhash(con
212e0 73 74 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20  st char *x).{.  
212f0 75 6e 73 69 67 6e 65 64 20 68 20 3d 20 30 3b 0a  unsigned h = 0;.
21300 20 20 77 68 69 6c 65 28 20 2a 78 20 29 20 68 20    while( *x ) h 
21310 3d 20 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b  = h*13 + *(x++);
21320 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a  .  return h;.}..
21330 2f 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74  /* Works like st
21340 72 64 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20  rdup, sort of.  
21350 53 61 76 65 20 61 20 73 74 72 69 6e 67 20 69 6e  Save a string in
21360 20 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79   malloced memory
21370 2c 20 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74  , but.** keep st
21380 72 69 6e 67 73 20 69 6e 20 61 20 74 61 62 6c 65  rings in a table
21390 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d   so that the sam
213a0 65 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20  e string is not 
213b0 69 6e 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20  in more.** than 
213c0 6f 6e 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 6f  one place..*/.co
213d0 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61 66  nst char *Strsaf
213e0 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 79 29  e(const char *y)
213f0 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .{.  const char 
21400 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 63 70 79 3b  *z;.  char *cpy;
21410 0a 0a 20 20 69 66 28 20 79 3d 3d 30 20 29 20 72  ..  if( y==0 ) r
21420 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 53  eturn 0;.  z = S
21430 74 72 73 61 66 65 5f 66 69 6e 64 28 79 29 3b 0a  trsafe_find(y);.
21440 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 28 63    if( z==0 && (c
21450 70 79 3d 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f  py=(char *)mallo
21460 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 79  c( lemonStrlen(y
21470 29 2b 31 20 29 29 21 3d 30 20 29 7b 0a 20 20 20  )+1 ))!=0 ){.   
21480 20 6c 65 6d 6f 6e 5f 73 74 72 63 70 79 28 63 70   lemon_strcpy(cp
21490 79 2c 79 29 3b 0a 20 20 20 20 7a 20 3d 20 63 70  y,y);.    z = cp
214a0 79 3b 0a 20 20 20 20 53 74 72 73 61 66 65 5f 69  y;.    Strsafe_i
214b0 6e 73 65 72 74 28 7a 29 3b 0a 20 20 7d 0a 20 20  nsert(z);.  }.  
214c0 4d 65 6d 6f 72 79 43 68 65 63 6b 28 7a 29 3b 0a  MemoryCheck(z);.
214d0 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f    return z;.}../
214e0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
214f0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
21500 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
21510 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
21520 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
21530 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a   of type "x1"..*
21540 2f 0a 73 74 72 75 63 74 20 73 5f 78 31 20 7b 0a  /.struct s_x1 {.
21550 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
21560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21570 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
21580 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
21590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215a0 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
215b0 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
215c0 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
215d0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
215e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215f0 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
21600 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
21610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21620 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
21630 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
21640 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
21650 31 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  1node *tbl;  /* 
21660 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
21670 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
21680 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x1node **ht; 
21690 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
216a0 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
216b0 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
216c0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
216d0 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
216e0 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
216f0 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
21700 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
21710 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a  f type "x1"..*/.
21720 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
21730 5f 78 31 6e 6f 64 65 20 7b 0a 20 20 63 6f 6e 73  _x1node {.  cons
21740 74 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  t char *data;   
21750 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
21760 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
21770 31 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f  1node *next;   /
21780 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74  * Next entry wit
21790 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20  h the same hash 
217a0 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31  */.  struct s_x1
217b0 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a  node **from;  /*
217c0 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a   Previous link *
217d0 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a 20  /.} x1node;../* 
217e0 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e  There is only on
217f0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
21800 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69  e array, which i
21810 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
21820 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
21830 20 73 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a 20   s_x1 *x1a;../* 
21840 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61  Allocate a new a
21850 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
21860 20 2a 2f 0a 76 6f 69 64 20 53 74 72 73 61 66 65   */.void Strsafe
21870 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78  _init(){.  if( x
21880 31 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  1a ) return;.  x
21890 31 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78  1a = (struct s_x
218a0 31 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  1*)malloc( sizeo
218b0 66 28 73 74 72 75 63 74 20 73 5f 78 31 29 20 29  f(struct s_x1) )
218c0 3b 0a 20 20 69 66 28 20 78 31 61 20 29 7b 0a 20  ;.  if( x1a ){. 
218d0 20 20 20 78 31 61 2d 3e 73 69 7a 65 20 3d 20 31     x1a->size = 1
218e0 30 32 34 3b 0a 20 20 20 20 78 31 61 2d 3e 63 6f  024;.    x1a->co
218f0 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 31 61  unt = 0;.    x1a
21900 2d 3e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a  ->tbl = (x1node*
21910 29 63 61 6c 6c 6f 63 28 31 30 32 34 2c 20 73 69  )calloc(1024, si
21920 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73  zeof(x1node) + s
21930 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 3b  izeof(x1node*));
21940 0a 20 20 20 20 69 66 28 20 78 31 61 2d 3e 74 62  .    if( x1a->tb
21950 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  l==0 ){.      fr
21960 65 65 28 78 31 61 29 3b 0a 20 20 20 20 20 20 78  ee(x1a);.      x
21970 31 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  1a = 0;.    }els
21980 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
21990 20 20 20 20 20 20 78 31 61 2d 3e 68 74 20 3d 20        x1a->ht = 
219a0 28 78 31 6e 6f 64 65 2a 2a 29 26 28 78 31 61 2d  (x1node**)&(x1a-
219b0 3e 74 62 6c 5b 31 30 32 34 5d 29 3b 0a 20 20 20  >tbl[1024]);.   
219c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30     for(i=0; i<10
219d0 32 34 3b 20 69 2b 2b 29 20 78 31 61 2d 3e 68 74  24; i++) x1a->ht
219e0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
219f0 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61   }.}./* Insert a
21a00 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
21a10 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74   the array.  Ret
21a20 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63  urn TRUE if succ
21a30 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72  essful..** Prior
21a40 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73   data with the s
21a50 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f  ame key is NOT o
21a60 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e  verwritten */.in
21a70 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74  t Strsafe_insert
21a80 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 61 74  (const char *dat
21a90 61 29 0a 7b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e  a).{.  x1node *n
21aa0 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b  p;.  unsigned h;
21ab0 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a  .  unsigned ph;.
21ac0 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29 20  .  if( x1a==0 ) 
21ad0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
21ae0 20 73 74 72 68 61 73 68 28 64 61 74 61 29 3b 0a   strhash(data);.
21af0 20 20 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d    h = ph & (x1a-
21b00 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
21b10 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77   x1a->ht[h];.  w
21b20 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20  hile( np ){.    
21b30 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64  if( strcmp(np->d
21b40 61 74 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a  ata,data)==0 ){.
21b50 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
21b60 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20  ting entry with 
21b70 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
21b80 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20  found. */.      
21b90 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20  /* Fail because 
21ba0 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74  overwrite is not
21bb0 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20   allows. */.    
21bc0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
21bd0 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  }.    np = np->n
21be0 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78  ext;.  }.  if( x
21bf0 31 61 2d 3e 63 6f 75 6e 74 3e 3d 78 31 61 2d 3e  1a->count>=x1a->
21c00 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  size ){.    /* N
21c10 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  eed to make the 
21c20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65  hash table bigge
21c30 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 61  r */.    int i,a
21c40 72 72 53 69 7a 65 3b 0a 20 20 20 20 73 74 72 75  rrSize;.    stru
21c50 63 74 20 73 5f 78 31 20 61 72 72 61 79 3b 0a 20  ct s_x1 array;. 
21c60 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20     array.size = 
21c70 61 72 72 53 69 7a 65 20 3d 20 78 31 61 2d 3e 73  arrSize = x1a->s
21c80 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79  ize*2;.    array
21c90 2e 63 6f 75 6e 74 20 3d 20 78 31 61 2d 3e 63 6f  .count = x1a->co
21ca0 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74  unt;.    array.t
21cb0 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 63 61  bl = (x1node*)ca
21cc0 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20 73 69  lloc(arrSize, si
21cd0 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73  zeof(x1node) + s
21ce0 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 3b  izeof(x1node*));
21cf0 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74  .    if( array.t
21d00 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  bl==0 ) return 0
21d10 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74  ;  /* Fail due t
21d20 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  o malloc failure
21d30 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74   */.    array.ht
21d40 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 61   = (x1node**)&(a
21d50 72 72 61 79 2e 74 62 6c 5b 61 72 72 53 69 7a 65  rray.tbl[arrSize
21d60 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
21d70 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29   i<arrSize; i++)
21d80 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30   array.ht[i] = 0
21d90 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
21da0 3c 78 31 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b  <x1a->count; i++
21db0 29 7b 0a 20 20 20 20 20 20 78 31 6e 6f 64 65 20  ){.      x1node 
21dc0 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a  *oldnp, *newnp;.
21dd0 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28        oldnp = &(
21de0 78 31 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20  x1a->tbl[i]);.  
21df0 20 20 20 20 68 20 3d 20 73 74 72 68 61 73 68 28      h = strhash(
21e00 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20 28  oldnp->data) & (
21e10 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20  arrSize-1);.    
21e20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61    newnp = &(arra
21e30 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  y.tbl[i]);.     
21e40 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d   if( array.ht[h]
21e50 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e   ) array.ht[h]->
21e60 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e  from = &(newnp->
21e70 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77  next);.      new
21e80 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79  np->next = array
21e90 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65  .ht[h];.      ne
21ea0 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e  wnp->data = oldn
21eb0 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e  p->data;.      n
21ec0 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61  ewnp->from = &(a
21ed0 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20  rray.ht[h]);.   
21ee0 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d     array.ht[h] =
21ef0 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20   newnp;.    }.  
21f00 20 20 66 72 65 65 28 78 31 61 2d 3e 74 62 6c 29    free(x1a->tbl)
21f10 3b 0a 20 20 20 20 2a 78 31 61 20 3d 20 61 72 72  ;.    *x1a = arr
21f20 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73  ay;.  }.  /* Ins
21f30 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61  ert the new data
21f40 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28   */.  h = ph & (
21f50 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x1a->size-1);.  
21f60 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b  np = &(x1a->tbl[
21f70 78 31 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a  x1a->count++]);.
21f80 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74    np->data = dat
21f90 61 3b 0a 20 20 69 66 28 20 78 31 61 2d 3e 68 74  a;.  if( x1a->ht
21fa0 5b 68 5d 20 29 20 78 31 61 2d 3e 68 74 5b 68 5d  [h] ) x1a->ht[h]
21fb0 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e  ->from = &(np->n
21fc0 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74  ext);.  np->next
21fd0 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x1a->ht[h];. 
21fe0 20 78 31 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70   x1a->ht[h] = np
21ff0 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26  ;.  np->from = &
22000 28 78 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20  (x1a->ht[h]);.  
22010 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20  return 1;.}../* 
22020 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
22030 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65   to data assigne
22040 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b  d to the given k
22050 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ey.  Return NULL
22060 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b  .** if no such k
22070 65 79 2e 20 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ey. */.const cha
22080 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28  r *Strsafe_find(
22090 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29  const char *key)
220a0 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b  .{.  unsigned h;
220b0 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 0a  .  x1node *np;..
220c0 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29 20 72    if( x1a==0 ) r
220d0 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73  eturn 0;.  h = s
220e0 74 72 68 61 73 68 28 6b 65 79 29 20 26 20 28 78  trhash(key) & (x
220f0 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  1a->size-1);.  n
22100 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x1a->ht[h];.
22110 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
22120 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70     if( strcmp(np
22130 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30 20 29  ->data,key)==0 )
22140 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
22150 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
22160 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
22170 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
22180 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
22190 72 20 74 6f 20 74 68 65 20 28 74 65 72 6d 69 6e  r to the (termin
221a0 61 6c 20 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61  al or nontermina
221b0 6c 29 20 73 79 6d 62 6f 6c 20 22 78 22 2e 0a 2a  l) symbol "x"..*
221c0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73  * Create a new s
221d0 79 6d 62 6f 6c 20 69 66 20 74 68 69 73 20 69 73  ymbol if this is
221e0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
221f0 22 78 22 20 68 61 73 20 62 65 65 6e 20 73 65 65  "x" has been see
22200 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d  n..*/.struct sym
22210 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28  bol *Symbol_new(
22220 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 29 0a 7b  const char *x).{
22230 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
22240 20 2a 73 70 3b 0a 0a 20 20 73 70 20 3d 20 53 79   *sp;..  sp = Sy
22250 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20  mbol_find(x);.  
22260 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20  if( sp==0 ){.   
22270 20 73 70 20 3d 20 28 73 74 72 75 63 74 20 73 79   sp = (struct sy
22280 6d 62 6f 6c 20 2a 29 63 61 6c 6c 6f 63 28 31 2c  mbol *)calloc(1,
22290 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
222a0 79 6d 62 6f 6c 29 20 29 3b 0a 20 20 20 20 4d 65  ymbol) );.    Me
222b0 6d 6f 72 79 43 68 65 63 6b 28 73 70 29 3b 0a 20  moryCheck(sp);. 
222c0 20 20 20 73 70 2d 3e 6e 61 6d 65 20 3d 20 53 74     sp->name = St
222d0 72 73 61 66 65 28 78 29 3b 0a 20 20 20 20 73 70  rsafe(x);.    sp
222e0 2d 3e 74 79 70 65 20 3d 20 69 73 75 70 70 65 72  ->type = isupper
222f0 28 2a 78 29 20 3f 20 54 45 52 4d 49 4e 41 4c 20  (*x) ? TERMINAL 
22300 3a 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c 3b 0a 20  : NONTERMINAL;. 
22310 20 20 20 73 70 2d 3e 72 75 6c 65 20 3d 20 30 3b     sp->rule = 0;
22320 0a 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63  .    sp->fallbac
22330 6b 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 70  k = 0;.    sp->p
22340 72 65 63 20 3d 20 2d 31 3b 0a 20 20 20 20 73 70  rec = -1;.    sp
22350 2d 3e 61 73 73 6f 63 20 3d 20 55 4e 4b 3b 0a 20  ->assoc = UNK;. 
22360 20 20 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20     sp->firstset 
22370 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 6c 61 6d  = 0;.    sp->lam
22380 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53  bda = LEMON_FALS
22390 45 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73 74 72  E;.    sp->destr
223a0 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73  uctor = 0;.    s
223b0 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 20 3d 20  p->destLineno = 
223c0 30 3b 0a 20 20 20 20 73 70 2d 3e 64 61 74 61 74  0;.    sp->datat
223d0 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d  ype = 0;.    sp-
223e0 3e 75 73 65 43 6e 74 20 3d 20 30 3b 0a 20 20 20  >useCnt = 0;.   
223f0 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73   Symbol_insert(s
22400 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d  p,sp->name);.  }
22410 0a 20 20 73 70 2d 3e 75 73 65 43 6e 74 2b 2b 3b  .  sp->useCnt++;
22420 0a 20 20 72 65 74 75 72 6e 20 73 70 3b 0a 7d 0a  .  return sp;.}.
22430 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
22440 73 79 6d 62 6f 6c 73 20 66 6f 72 20 73 6f 72 74  symbols for sort
22450 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 52  ing purposes.  R
22460 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 0a  eturn negative,.
22470 2a 2a 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  ** zero, or posi
22480 74 69 76 65 20 69 66 20 61 20 69 73 20 6c 65 73  tive if a is les
22490 73 20 74 68 65 6e 2c 20 65 71 75 61 6c 20 74 6f  s then, equal to
224a0 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20  , or greater.** 
224b0 74 68 61 6e 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 79  than b..**.** Sy
224c0 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69 6e  mbols that begin
224d0 20 77 69 74 68 20 75 70 70 65 72 20 63 61 73 65   with upper case
224e0 20 6c 65 74 74 65 72 73 20 28 74 65 72 6d 69 6e   letters (termin
224f0 61 6c 73 20 6f 72 20 74 6f 6b 65 6e 73 29 0a 2a  als or tokens).*
22500 2a 20 6d 75 73 74 20 73 6f 72 74 20 62 65 66 6f  * must sort befo
22510 72 65 20 73 79 6d 62 6f 6c 73 20 74 68 61 74 20  re symbols that 
22520 62 65 67 69 6e 20 77 69 74 68 20 6c 6f 77 65 72  begin with lower
22530 20 63 61 73 65 20 6c 65 74 74 65 72 73 0a 2a 2a   case letters.**
22540 20 28 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 29   (non-terminals)
22550 2e 20 20 41 6e 64 20 4d 55 4c 54 49 54 45 52 4d  .  And MULTITERM
22560 49 4e 41 4c 20 73 79 6d 62 6f 6c 73 20 28 63 72  INAL symbols (cr
22570 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 0a  eated using the.
22580 2a 2a 20 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20  ** %token_class 
22590 64 69 72 65 63 74 69 76 65 29 20 6d 75 73 74 20  directive) must 
225a0 73 6f 72 74 20 61 74 20 74 68 65 20 76 65 72 79  sort at the very
225b0 20 65 6e 64 2e 20 4f 74 68 65 72 20 74 68 61 6e   end. Other than
225c0 0a 2a 2a 20 74 68 61 74 2c 20 74 68 65 20 6f 72  .** that, the or
225d0 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  der does not mat
225e0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 66 69  ter..**.** We fi
225f0 6e 64 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 6c  nd experimentall
22600 79 20 74 68 61 74 20 6c 65 61 76 69 6e 67 20 74  y that leaving t
22610 68 65 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68  he symbols in th
22620 65 69 72 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  eir original.** 
22630 6f 72 64 65 72 20 28 74 68 65 20 6f 72 64 65 72  order (the order
22640 20 74 68 65 79 20 61 70 70 65 61 72 65 64 20 69   they appeared i
22650 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 66 69  n the grammar fi
22660 6c 65 29 20 67 69 76 65 73 20 74 68 65 0a 2a 2a  le) gives the.**
22670 20 73 6d 61 6c 6c 65 73 74 20 70 61 72 73 65 72   smallest parser
22680 20 74 61 62 6c 65 73 20 69 6e 20 53 51 4c 69 74   tables in SQLit
22690 65 2e 0a 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c  e..*/.int Symbol
226a0 63 6d 70 70 28 63 6f 6e 73 74 20 76 6f 69 64 20  cmpp(const void 
226b0 2a 5f 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  *_a, const void 
226c0 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 73  *_b).{.  const s
226d0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 61 20  truct symbol *a 
226e0 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74  = *(const struct
226f0 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 5f 61 3b 0a   symbol **) _a;.
22700 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
22710 79 6d 62 6f 6c 20 2a 62 20 3d 20 2a 28 63 6f 6e  ymbol *b = *(con
22720 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  st struct symbol
22730 20 2a 2a 29 20 5f 62 3b 0a 20 20 69 6e 74 20 69   **) _b;.  int i
22740 31 20 3d 20 61 2d 3e 74 79 70 65 3d 3d 4d 55 4c  1 = a->type==MUL
22750 54 49 54 45 52 4d 49 4e 41 4c 20 3f 20 33 20 3a  TITERMINAL ? 3 :
22760 20 61 2d 3e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 20   a->name[0]>'Z' 
22770 3f 20 32 20 3a 20 31 3b 0a 20 20 69 6e 74 20 69  ? 2 : 1;.  int i
22780 32 20 3d 20 62 2d 3e 74 79 70 65 3d 3d 4d 55 4c  2 = b->type==MUL
22790 54 49 54 45 52 4d 49 4e 41 4c 20 3f 20 33 20 3a  TITERMINAL ? 3 :
227a0 20 62 2d 3e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 20   b->name[0]>'Z' 
227b0 3f 20 32 20 3a 20 31 3b 0a 20 20 72 65 74 75 72  ? 2 : 1;.  retur
227c0 6e 20 69 31 3d 3d 69 32 20 3f 20 61 2d 3e 69 6e  n i1==i2 ? a->in
227d0 64 65 78 20 2d 20 62 2d 3e 69 6e 64 65 78 20 3a  dex - b->index :
227e0 20 69 31 20 2d 20 69 32 3b 0a 7d 0a 0a 2f 2a 20   i1 - i2;.}../* 
227f0 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
22800 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
22810 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
22820 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
22830 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
22840 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a  f type "x2"..*/.
22850 73 74 72 75 63 74 20 73 5f 78 32 20 7b 0a 20 20  struct s_x2 {.  
22860 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
22870 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
22880 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
22890 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228b0 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
228c0 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
228d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
228e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22900 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
22910 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
22920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22930 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
22940 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
22950 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
22960 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
22970 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
22980 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
22990 5f 78 32 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x2node **ht;  /
229a0 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
229b0 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
229c0 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
229d0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
229e0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
229f0 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
22a00 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
22a10 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
22a20 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 74 79  type "x2"..*/.ty
22a30 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
22a40 32 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74  2node {.  struct
22a50 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 20 20   symbol *data;  
22a60 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
22a70 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
22a80 6b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  key;         /* 
22a90 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72  The key */.  str
22aa0 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 6e 65  uct s_x2node *ne
22ab0 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e  xt;   /* Next en
22ac0 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
22ad0 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75  e hash */.  stru
22ae0 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 66 72  ct s_x2node **fr
22af0 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  om;  /* Previous
22b00 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64   link */.} x2nod
22b10 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  e;../* There is 
22b20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63  only one instanc
22b30 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20  e of the array, 
22b40 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c  which is the fol
22b50 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63  lowing */.static
22b60 20 73 74 72 75 63 74 20 73 5f 78 32 20 2a 78 32   struct s_x2 *x2
22b70 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  a;../* Allocate 
22b80 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76  a new associativ
22b90 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20  e array */.void 
22ba0 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a 20  Symbol_init(){. 
22bb0 20 69 66 28 20 78 32 61 20 29 20 72 65 74 75 72   if( x2a ) retur
22bc0 6e 3b 0a 20 20 78 32 61 20 3d 20 28 73 74 72 75  n;.  x2a = (stru
22bd0 63 74 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28  ct s_x2*)malloc(
22be0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
22bf0 5f 78 32 29 20 29 3b 0a 20 20 69 66 28 20 78 32  _x2) );.  if( x2
22c00 61 20 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69  a ){.    x2a->si
22c10 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 32  ze = 128;.    x2
22c20 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
22c30 20 20 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32    x2a->tbl = (x2
22c40 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 31 32 38  node*)calloc(128
22c50 2c 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29  , sizeof(x2node)
22c60 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65   + sizeof(x2node
22c70 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 78 32 61  *));.    if( x2a
22c80 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ->tbl==0 ){.    
22c90 20 20 66 72 65 65 28 78 32 61 29 3b 0a 20 20 20    free(x2a);.   
22ca0 20 20 20 78 32 61 20 3d 20 30 3b 0a 20 20 20 20     x2a = 0;.    
22cb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
22cc0 20 69 3b 0a 20 20 20 20 20 20 78 32 61 2d 3e 68   i;.      x2a->h
22cd0 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28  t = (x2node**)&(
22ce0 78 32 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a  x2a->tbl[128]);.
22cf0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
22d00 3c 31 32 38 3b 20 69 2b 2b 29 20 78 32 61 2d 3e  <128; i++) x2a->
22d10 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ht[i] = 0;.    }
22d20 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74  .  }.}./* Insert
22d30 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
22d40 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52  to the array.  R
22d50 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75  eturn TRUE if su
22d60 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69  ccessful..** Pri
22d70 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65  or data with the
22d80 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54   same key is NOT
22d90 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a   overwritten */.
22da0 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72  int Symbol_inser
22db0 74 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  t(struct symbol 
22dc0 2a 64 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 61  *data, const cha
22dd0 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 78 32 6e 6f  r *key).{.  x2no
22de0 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e  de *np;.  unsign
22df0 65 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ed h;.  unsigned
22e00 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d   ph;..  if( x2a=
22e10 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
22e20 20 70 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65   ph = strhash(ke
22e30 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28  y);.  h = ph & (
22e40 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x2a->size-1);.  
22e50 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b  np = x2a->ht[h];
22e60 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
22e70 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e      if( strcmp(n
22e80 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29  p->key,key)==0 )
22e90 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  {.      /* An ex
22ea0 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74  isting entry wit
22eb0 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
22ec0 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20  s found. */.    
22ed0 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73    /* Fail becaus
22ee0 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e  e overwrite is n
22ef0 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20  ot allows. */.  
22f00 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
22f10 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d    }.    np = np-
22f20 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  >next;.  }.  if(
22f30 20 78 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61   x2a->count>=x2a
22f40 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  ->size ){.    /*
22f50 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68   Need to make th
22f60 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67  e hash table big
22f70 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ger */.    int i
22f80 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20 20 73 74  ,arrSize;.    st
22f90 72 75 63 74 20 73 5f 78 32 20 61 72 72 61 79 3b  ruct s_x2 array;
22fa0 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20  .    array.size 
22fb0 3d 20 61 72 72 53 69 7a 65 20 3d 20 78 32 61 2d  = arrSize = x2a-
22fc0 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72  >size*2;.    arr
22fd0 61 79 2e 63 6f 75 6e 74 20 3d 20 78 32 61 2d 3e  ay.count = x2a->
22fe0 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79  count;.    array
22ff0 2e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29  .tbl = (x2node*)
23000 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65 2c 20  calloc(arrSize, 
23010 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b  sizeof(x2node) +
23020 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29   sizeof(x2node*)
23030 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79  );.    if( array
23040 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  .tbl==0 ) return
23050 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65   0;  /* Fail due
23060 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   to malloc failu
23070 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e  re */.    array.
23080 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26  ht = (x2node**)&
23090 28 61 72 72 61 79 2e 74 62 6c 5b 61 72 72 53 69  (array.tbl[arrSi
230a0 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ze]);.    for(i=
230b0 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20 69 2b  0; i<arrSize; i+
230c0 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d  +) array.ht[i] =
230d0 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
230e0 20 69 3c 78 32 61 2d 3e 63 6f 75 6e 74 3b 20 69   i<x2a->count; i
230f0 2b 2b 29 7b 0a 20 20 20 20 20 20 78 32 6e 6f 64  ++){.      x2nod
23100 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70  e *oldnp, *newnp
23110 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20  ;.      oldnp = 
23120 26 28 78 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a  &(x2a->tbl[i]);.
23130 20 20 20 20 20 20 68 20 3d 20 73 74 72 68 61 73        h = strhas
23140 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20  h(oldnp->key) & 
23150 28 61 72 72 53 69 7a 65 2d 31 29 3b 0a 20 20 20  (arrSize-1);.   
23160 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72     newnp = &(arr
23170 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  ay.tbl[i]);.    
23180 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68    if( array.ht[h
23190 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d  ] ) array.ht[h]-
231a0 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d  >from = &(newnp-
231b0 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65  >next);.      ne
231c0 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61  wnp->next = arra
231d0 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e  y.ht[h];.      n
231e0 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e  ewnp->key = oldn
231f0 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65  p->key;.      ne
23200 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e  wnp->data = oldn
23210 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e  p->data;.      n
23220 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61  ewnp->from = &(a
23230 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20  rray.ht[h]);.   
23240 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d     array.ht[h] =
23250 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20   newnp;.    }.  
23260 20 20 66 72 65 65 28 78 32 61 2d 3e 74 62 6c 29    free(x2a->tbl)
23270 3b 0a 20 20 20 20 2a 78 32 61 20 3d 20 61 72 72  ;.    *x2a = arr
23280 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73  ay;.  }.  /* Ins
23290 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61  ert the new data
232a0 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28   */.  h = ph & (
232b0 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x2a->size-1);.  
232c0 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b  np = &(x2a->tbl[
232d0 78 32 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a  x2a->count++]);.
232e0 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b    np->key = key;
232f0 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61  .  np->data = da
23300 74 61 3b 0a 20 20 69 66 28 20 78 32 61 2d 3e 68  ta;.  if( x2a->h
23310 74 5b 68 5d 20 29 20 78 32 61 2d 3e 68 74 5b 68  t[h] ) x2a->ht[h
23320 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e  ]->from = &(np->
23330 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78  next);.  np->nex
23340 74 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a  t = x2a->ht[h];.
23350 20 20 78 32 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e    x2a->ht[h] = n
23360 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20  p;.  np->from = 
23370 26 28 78 32 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20  &(x2a->ht[h]);. 
23380 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
23390 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
233a0 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e  r to data assign
233b0 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  ed to the given 
233c0 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  key.  Return NUL
233d0 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20  L.** if no such 
233e0 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  key. */.struct s
233f0 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69  ymbol *Symbol_fi
23400 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b  nd(const char *k
23410 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ey).{.  unsigned
23420 20 68 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70   h;.  x2node *np
23430 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20  ;..  if( x2a==0 
23440 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
23450 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26  = strhash(key) &
23460 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x2a->size-1);.
23470 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68    np = x2a->ht[h
23480 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
23490 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
234a0 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30  (np->key,key)==0
234b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
234c0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
234d0 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
234e0 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
234f0 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 2d  /* Return the n-
23500 74 68 20 64 61 74 61 2e 20 20 52 65 74 75 72 6e  th data.  Return
23510 20 4e 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f 75   NULL if n is ou
23520 74 20 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a 73  t of range. */.s
23530 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
23540 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74 20 6e 29 0a  mbol_Nth(int n).
23550 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
23560 6c 20 2a 64 61 74 61 3b 0a 20 20 69 66 28 20 78  l *data;.  if( x
23570 32 61 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c 3d  2a && n>0 && n<=
23580 78 32 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20 20  x2a->count ){.  
23590 20 20 64 61 74 61 20 3d 20 78 32 61 2d 3e 74 62    data = x2a->tb
235a0 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20 7d  l[n-1].data;.  }
235b0 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d  else{.    data =
235c0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
235d0 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74   data;.}../* Ret
235e0 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
235f0 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e 74  the array */.int
23600 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a   Symbol_count().
23610 7b 0a 20 20 72 65 74 75 72 6e 20 78 32 61 20 3f  {.  return x2a ?
23620 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b   x2a->count : 0;
23630 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e  .}../* Return an
23640 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
23650 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69  rs to all data i
23660 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  n the table..** 
23670 54 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74  The array is obt
23680 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
23690 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  c.  Return NULL 
236a0 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  if memory alloca
236b0 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73  tion.** problems
236c0 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61  , or if the arra
236d0 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73  y is empty. */.s
236e0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53  truct symbol **S
236f0 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 0a  ymbol_arrayof().
23700 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
23710 6c 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74  l **array;.  int
23720 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 69 66   i,arrSize;.  if
23730 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x2a==0 ) retur
23740 6e 20 30 3b 0a 20 20 61 72 72 53 69 7a 65 20 3d  n 0;.  arrSize =
23750 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61   x2a->count;.  a
23760 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20 73  rray = (struct s
23770 79 6d 62 6f 6c 20 2a 2a 29 63 61 6c 6c 6f 63 28  ymbol **)calloc(
23780 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28  arrSize, sizeof(
23790 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29  struct symbol *)
237a0 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29  );.  if( array )
237b0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
237c0 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61  <arrSize; i++) a
237d0 72 72 61 79 5b 69 5d 20 3d 20 78 32 61 2d 3e 74  rray[i] = x2a->t
237e0 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a  bl[i].data;.  }.
237f0 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a    return array;.
23800 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77  }../* Compare tw
23810 6f 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  o configurations
23820 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d   */.int Configcm
23830 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f 61  p(const char *_a
23840 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f 62 29  ,const char *_b)
23850 0a 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  .{.  const struc
23860 74 20 63 6f 6e 66 69 67 20 2a 61 20 3d 20 28 73  t config *a = (s
23870 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20  truct config *) 
23880 5f 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  _a;.  const stru
23890 63 74 20 63 6f 6e 66 69 67 20 2a 62 20 3d 20 28  ct config *b = (
238a0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
238b0 20 5f 62 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20   _b;.  int x;.  
238c0 78 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78  x = a->rp->index
238d0 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b   - b->rp->index;
238e0 0a 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20  .  if( x==0 ) x 
238f0 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f  = a->dot - b->do
23900 74 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d  t;.  return x;.}
23910 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  ../* Compare two
23920 20 73 74 61 74 65 73 20 2a 2f 0a 50 52 49 56 41   states */.PRIVA
23930 54 45 20 69 6e 74 20 73 74 61 74 65 63 6d 70 28  TE int statecmp(
23940 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61  struct config *a
23950 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
23960 2a 62 29 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *b).{.  int rc;.
23970 20 20 66 6f 72 28 72 63 3d 30 3b 20 72 63 3d 3d    for(rc=0; rc==
23980 30 20 26 26 20 61 20 26 26 20 62 3b 20 20 61 3d  0 && a && b;  a=
23990 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e 62 70 29 7b  a->bp, b=b->bp){
239a0 0a 20 20 20 20 72 63 20 3d 20 61 2d 3e 72 70 2d  .    rc = a->rp-
239b0 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e  >index - b->rp->
239c0 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 72  index;.    if( r
239d0 63 3d 3d 30 20 29 20 72 63 20 3d 20 61 2d 3e 64  c==0 ) rc = a->d
239e0 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d  ot - b->dot;.  }
239f0 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
23a00 20 20 20 20 69 66 28 20 61 20 29 20 72 63 20 3d      if( a ) rc =
23a10 20 31 3b 0a 20 20 20 20 69 66 28 20 62 20 29 20   1;.    if( b ) 
23a20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  rc = -1;.  }.  r
23a30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
23a40 48 61 73 68 20 61 20 73 74 61 74 65 20 2a 2f 0a  Hash a state */.
23a50 50 52 49 56 41 54 45 20 75 6e 73 69 67 6e 65 64  PRIVATE unsigned
23a60 20 73 74 61 74 65 68 61 73 68 28 73 74 72 75 63   statehash(struc
23a70 74 20 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20  t config *a).{. 
23a80 20 75 6e 73 69 67 6e 65 64 20 68 3d 30 3b 0a 20   unsigned h=0;. 
23a90 20 77 68 69 6c 65 28 20 61 20 29 7b 0a 20 20 20   while( a ){.   
23aa0 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e   h = h*571 + a->
23ab0 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61  rp->index*37 + a
23ac0 2d 3e 64 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61  ->dot;.    a = a
23ad0 2d 3e 62 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ->bp;.  }.  retu
23ae0 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f  rn h;.}../* Allo
23af0 63 61 74 65 20 61 20 6e 65 77 20 73 74 61 74 65  cate a new state
23b00 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 73 74   structure */.st
23b10 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74  ruct state *Stat
23b20 65 5f 6e 65 77 28 29 0a 7b 0a 20 20 73 74 72 75  e_new().{.  stru
23b30 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73 74 61  ct state *newsta
23b40 74 65 3b 0a 20 20 6e 65 77 73 74 61 74 65 20 3d  te;.  newstate =
23b50 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
23b60 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f  )calloc(1, sizeo
23b70 66 28 73 74 72 75 63 74 20 73 74 61 74 65 29 20  f(struct state) 
23b80 29 3b 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b  );.  MemoryCheck
23b90 28 6e 65 77 73 74 61 74 65 29 3b 0a 20 20 72 65  (newstate);.  re
23ba0 74 75 72 6e 20 6e 65 77 73 74 61 74 65 3b 0a 7d  turn newstate;.}
23bb0 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
23bc0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
23bd0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
23be0 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a  cture for each.*
23bf0 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  * associative ar
23c00 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 33 22  ray of type "x3"
23c10 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 33  ..*/.struct s_x3
23c20 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20   {.  int size;  
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c40 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  The number of av
23c50 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a  ailable slots. *
23c60 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
23c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
23c80 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   Must be a power
23c90 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68   of 2 greater th
23ca0 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  an or */.       
23cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cc0 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f     /*   equal to
23cd0 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e   1 */.  int coun
23ce0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
23cf0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
23d00 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c  rently slots fil
23d10 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  led */.  struct 
23d20 73 5f 78 33 6e 6f 64 65 20 2a 74 62 6c 3b 20 20  s_x3node *tbl;  
23d30 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72  /* The data stor
23d40 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  ed here */.  str
23d50 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 68  uct s_x3node **h
23d60 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c  t;  /* Hash tabl
23d70 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f  e for lookups */
23d80 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  .};../* There is
23d90 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
23da0 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
23db0 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65  for every data e
23dc0 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20  lement.** in an 
23dd0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
23de0 79 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a  y of type "x3"..
23df0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
23e00 74 20 73 5f 78 33 6e 6f 64 65 20 7b 0a 20 20 73  t s_x3node {.  s
23e10 74 72 75 63 74 20 73 74 61 74 65 20 2a 64 61 74  truct state *dat
23e20 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
23e30 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
23e40 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  */.  struct conf
23e50 69 67 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20  ig *key;        
23e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23e70 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63  e key */.  struc
23e80 74 20 73 5f 78 33 6e 6f 64 65 20 2a 6e 65 78 74  t s_x3node *next
23e90 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ;   /* Next entr
23ea0 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
23eb0 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74  hash */.  struct
23ec0 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d   s_x3node **from
23ed0 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c  ;  /* Previous l
23ee0 69 6e 6b 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b  ink */.} x3node;
23ef0 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
23f00 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  ly one instance 
23f10 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68  of the array, wh
23f20 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f  ich is the follo
23f30 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73  wing */.static s
23f40 74 72 75 63 74 20 73 5f 78 33 20 2a 78 33 61 3b  truct s_x3 *x3a;
23f50 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
23f60 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20  new associative 
23f70 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74  array */.void St
23f80 61 74 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66  ate_init(){.  if
23f90 28 20 78 33 61 20 29 20 72 65 74 75 72 6e 3b 0a  ( x3a ) return;.
23fa0 20 20 78 33 61 20 3d 20 28 73 74 72 75 63 74 20    x3a = (struct 
23fb0 73 5f 78 33 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  s_x3*)malloc( si
23fc0 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 33  zeof(struct s_x3
23fd0 29 20 29 3b 0a 20 20 69 66 28 20 78 33 61 20 29  ) );.  if( x3a )
23fe0 7b 0a 20 20 20 20 78 33 61 2d 3e 73 69 7a 65 20  {.    x3a->size 
23ff0 3d 20 31 32 38 3b 0a 20 20 20 20 78 33 61 2d 3e  = 128;.    x3a->
24000 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78  count = 0;.    x
24010 33 61 2d 3e 74 62 6c 20 3d 20 28 78 33 6e 6f 64  3a->tbl = (x3nod
24020 65 2a 29 63 61 6c 6c 6f 63 28 31 32 38 2c 20 73  e*)calloc(128, s
24030 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20  izeof(x3node) + 
24040 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29  sizeof(x3node*))
24050 3b 0a 20 20 20 20 69 66 28 20 78 33 61 2d 3e 74  ;.    if( x3a->t
24060 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  bl==0 ){.      f
24070 72 65 65 28 78 33 61 29 3b 0a 20 20 20 20 20 20  ree(x3a);.      
24080 78 33 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  x3a = 0;.    }el
24090 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
240a0 0a 20 20 20 20 20 20 78 33 61 2d 3e 68 74 20 3d  .      x3a->ht =
240b0 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61   (x3node**)&(x3a
240c0 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20  ->tbl[128]);.   
240d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32     for(i=0; i<12
240e0 38 3b 20 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b  8; i++) x3a->ht[
240f0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
24100 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20  }.}./* Insert a 
24110 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
24120 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75  the array.  Retu
24130 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65  rn TRUE if succe
24140 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20  ssful..** Prior 
24150 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61  data with the sa
24160 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76  me key is NOT ov
24170 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74  erwritten */.int
24180 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74   State_insert(st
24190 72 75 63 74 20 73 74 61 74 65 20 2a 64 61 74 61  ruct state *data
241a0 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
241b0 2a 6b 65 79 29 0a 7b 0a 20 20 78 33 6e 6f 64 65  *key).{.  x3node
241c0 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64   *np;.  unsigned
241d0 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   h;.  unsigned p
241e0 68 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30  h;..  if( x3a==0
241f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
24200 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65  h = statehash(ke
24210 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28  y);.  h = ph & (
24220 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x3a->size-1);.  
24230 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b  np = x3a->ht[h];
24240 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
24250 20 20 20 20 69 66 28 20 73 74 61 74 65 63 6d 70      if( statecmp
24260 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30  (np->key,key)==0
24270 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
24280 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77  existing entry w
24290 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
242a0 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20   is found. */.  
242b0 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61      /* Fail beca
242c0 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73  use overwrite is
242d0 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a   not allows. */.
242e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
242f0 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e      }.    np = n
24300 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  p->next;.  }.  i
24310 66 28 20 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78  f( x3a->count>=x
24320 33 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20  3a->size ){.    
24330 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
24340 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62  the hash table b
24350 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  igger */.    int
24360 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20 20 20   i,arrSize;.    
24370 73 74 72 75 63 74 20 73 5f 78 33 20 61 72 72 61  struct s_x3 arra
24380 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
24390 65 20 3d 20 61 72 72 53 69 7a 65 20 3d 20 78 33  e = arrSize = x3
243a0 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61  a->size*2;.    a
243b0 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 33 61  rray.count = x3a
243c0 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72  ->count;.    arr
243d0 61 79 2e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65  ay.tbl = (x3node
243e0 2a 29 63 61 6c 6c 6f 63 28 61 72 72 53 69 7a 65  *)calloc(arrSize
243f0 2c 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29  , sizeof(x3node)
24400 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65   + sizeof(x3node
24410 2a 29 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72  *));.    if( arr
24420 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75  ay.tbl==0 ) retu
24430 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64  rn 0;  /* Fail d
24440 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69  ue to malloc fai
24450 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61  lure */.    arra
24460 79 2e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a  y.ht = (x3node**
24470 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 61 72 72  )&(array.tbl[arr
24480 53 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  Size]);.    for(
24490 69 3d 30 3b 20 69 3c 61 72 72 53 69 7a 65 3b 20  i=0; i<arrSize; 
244a0 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d  i++) array.ht[i]
244b0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
244c0 30 3b 20 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b  0; i<x3a->count;
244d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e   i++){.      x3n
244e0 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77  ode *oldnp, *new
244f0 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20  np;.      oldnp 
24500 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29  = &(x3a->tbl[i])
24510 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 61 74  ;.      h = stat
24520 65 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79  ehash(oldnp->key
24530 29 20 26 20 28 61 72 72 53 69 7a 65 2d 31 29 3b  ) & (arrSize-1);
24540 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26  .      newnp = &
24550 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a  (array.tbl[i]);.
24560 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e        if( array.
24570 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74  ht[h] ) array.ht
24580 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65  [h]->from = &(ne
24590 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20  wnp->next);.    
245a0 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20    newnp->next = 
245b0 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20  array.ht[h];.   
245c0 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20     newnp->key = 
245d0 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20  oldnp->key;.    
245e0 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20    newnp->data = 
245f0 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20  oldnp->data;.   
24600 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d     newnp->from =
24610 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b   &(array.ht[h]);
24620 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b  .      array.ht[
24630 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20  h] = newnp;.    
24640 7d 0a 20 20 20 20 66 72 65 65 28 78 33 61 2d 3e  }.    free(x3a->
24650 74 62 6c 29 3b 0a 20 20 20 20 2a 78 33 61 20 3d  tbl);.    *x3a =
24660 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a   array;.  }.  /*
24670 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
24680 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68  data */.  h = ph
24690 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29   & (x3a->size-1)
246a0 3b 0a 20 20 6e 70 20 3d 20 26 28 78 33 61 2d 3e  ;.  np = &(x3a->
246b0 74 62 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b  tbl[x3a->count++
246c0 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20  ]);.  np->key = 
246d0 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20  key;.  np->data 
246e0 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 33  = data;.  if( x3
246f0 61 2d 3e 68 74 5b 68 5d 20 29 20 78 33 61 2d 3e  a->ht[h] ) x3a->
24700 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
24710 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d  np->next);.  np-
24720 3e 6e 65 78 74 20 3d 20 78 33 61 2d 3e 68 74 5b  >next = x3a->ht[
24730 68 5d 3b 0a 20 20 78 33 61 2d 3e 68 74 5b 68 5d  h];.  x3a->ht[h]
24740 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f   = np;.  np->fro
24750 6d 20 3d 20 26 28 78 33 61 2d 3e 68 74 5b 68 5d  m = &(x3a->ht[h]
24760 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
24770 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
24780 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73  inter to data as
24790 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69  signed to the gi
247a0 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e  ven key.  Return
247b0 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73   NULL.** if no s
247c0 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75  uch key. */.stru
247d0 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f  ct state *State_
247e0 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66  find(struct conf
247f0 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 75 6e 73  ig *key).{.  uns
24800 69 67 6e 65 64 20 68 3b 0a 20 20 78 33 6e 6f 64  igned h;.  x3nod
24810 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 33  e *np;..  if( x3
24820 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
24830 0a 20 20 68 20 3d 20 73 74 61 74 65 68 61 73 68  .  h = statehash
24840 28 6b 65 79 29 20 26 20 28 78 33 61 2d 3e 73 69  (key) & (x3a->si
24850 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33  ze-1);.  np = x3
24860 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
24870 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
24880 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65   statecmp(np->ke
24890 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61  y,key)==0 ) brea
248a0 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e  k;.    np = np->
248b0 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  next;.  }.  retu
248c0 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61  rn np ? np->data
248d0 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75   : 0;.}../* Retu
248e0 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  rn an array of p
248f0 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64  ointers to all d
24900 61 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ata in the table
24910 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69  ..** The array i
24920 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
24930 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20  malloc.  Return 
24940 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61  NULL if memory a
24950 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f  llocation.** pro
24960 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65  blems, or if the
24970 20 61 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e   array is empty.
24980 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65   */.struct state
24990 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79 6f 66   **State_arrayof
249a0 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74  ().{.  struct st
249b0 61 74 65 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69  ate **array;.  i
249c0 6e 74 20 69 2c 61 72 72 53 69 7a 65 3b 0a 20 20  nt i,arrSize;.  
249d0 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74  if( x3a==0 ) ret
249e0 75 72 6e 20 30 3b 0a 20 20 61 72 72 53 69 7a 65  urn 0;.  arrSize
249f0 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x3a->count;. 
24a00 20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74   array = (struct
24a10 20 73 74 61 74 65 20 2a 2a 29 63 61 6c 6c 6f 63   state **)calloc
24a20 28 61 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66  (arrSize, sizeof
24a30 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29  (struct state *)
24a40 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29  );.  if( array )
24a50 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
24a60 3c 61 72 72 53 69 7a 65 3b 20 69 2b 2b 29 20 61  <arrSize; i++) a
24a70 72 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e 74  rray[i] = x3a->t
24a80 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a  bl[i].data;.  }.
24a90 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a    return array;.
24aa0 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f 6e  }../* Hash a con
24ab0 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52  figuration */.PR
24ac0 49 56 41 54 45 20 75 6e 73 69 67 6e 65 64 20 63  IVATE unsigned c
24ad0 6f 6e 66 69 67 68 61 73 68 28 73 74 72 75 63 74  onfighash(struct
24ae0 20 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20 20   config *a).{.  
24af0 75 6e 73 69 67 6e 65 64 20 68 3d 30 3b 0a 20 20  unsigned h=0;.  
24b00 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72  h = h*571 + a->r
24b10 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d  p->index*37 + a-
24b20 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 68  >dot;.  return h
24b30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  ;.}../* There is
24b40 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
24b50 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
24b60 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63  tructure for eac
24b70 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65  h.** associative
24b80 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
24b90 78 34 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73  x4"..*/.struct s
24ba0 5f 78 34 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65  _x4 {.  int size
24bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24bc0 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
24bd0 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73   available slots
24be0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24c00 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f  *   Must be a po
24c10 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72  wer of 2 greater
24c20 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20   than or */.    
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c        /*   equal
24c50 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63   to 1 */.  int c
24c60 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ount;           
24c70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24c80 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20  currently slots 
24c90 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75  filled */.  stru
24ca0 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 74 62 6c  ct s_x4node *tbl
24cb0 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73  ;  /* The data s
24cc0 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20  tored here */.  
24cd0 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
24ce0 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74  **ht;  /* Hash t
24cf0 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73  able for lookups
24d00 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65   */.};../* There
24d10 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
24d20 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
24d30 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  re for every dat
24d40 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20  a element.** in 
24d50 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  an associative a
24d60 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 34  rray of type "x4
24d70 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  "..*/.typedef st
24d80 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 7b 0a  ruct s_x4node {.
24d90 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
24da0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
24db0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
24dc0 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ata */.  struct 
24dd0 73 5f 78 34 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x4node *next; 
24de0 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
24df0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
24e00 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
24e10 5f 78 34 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x4node **from; 
24e20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
24e30 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a  k */.} x4node;..
24e40 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
24e50 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
24e60 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
24e70 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
24e80 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
24e90 75 63 74 20 73 5f 78 34 20 2a 78 34 61 3b 0a 0a  uct s_x4 *x4a;..
24ea0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
24eb0 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
24ec0 72 61 79 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  ray */.void Conf
24ed0 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 7b 0a  igtable_init(){.
24ee0 20 20 69 66 28 20 78 34 61 20 29 20 72 65 74 75    if( x4a ) retu
24ef0 72 6e 3b 0a 20 20 78 34 61 20 3d 20 28 73 74 72  rn;.  x4a = (str
24f00 75 63 74 20 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63  uct s_x4*)malloc
24f10 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
24f20 73 5f 78 34 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x4) );.  if( x
24f30 34 61 20 29 7b 0a 20 20 20 20 78 34 61 2d 3e 73  4a ){.    x4a->s
24f40 69 7a 65 20 3d 20 36 34 3b 0a 20 20 20 20 78 34  ize = 64;.    x4
24f50 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
24f60 20 20 78 34 61 2d 3e 74 62 6c 20 3d 20 28 78 34    x4a->tbl = (x4
24f70 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 36 34 2c  node*)calloc(64,
24f80 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20   sizeof(x4node) 
24f90 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a  + sizeof(x4node*
24fa0 29 29 3b 0a 20 20 20 20 69 66 28 20 78 34 61 2d  ));.    if( x4a-
24fb0 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >tbl==0 ){.     
24fc0 20 66 72 65 65 28 78 34 61 29 3b 0a 20 20 20 20   free(x4a);.    
24fd0 20 20 78 34 61 20 3d 20 30 3b 0a 20 20 20 20 7d    x4a = 0;.    }
24fe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
24ff0 69 3b 0a 20 20 20 20 20 20 78 34 61 2d 3e 68 74  i;.      x4a->ht
25000 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 78   = (x4node**)&(x
25010 34 61 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20 20  4a->tbl[64]);.  
25020 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 36      for(i=0; i<6
25030 34 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b  4; i++) x4a->ht[
25040 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
25050 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20  }.}./* Insert a 
25060 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
25070 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75  the array.  Retu
25080 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65  rn TRUE if succe
25090 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20  ssful..** Prior 
250a0 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61  data with the sa
250b0 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76  me key is NOT ov
250c0 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74  erwritten */.int
250d0 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73   Configtable_ins
250e0 65 72 74 28 73 74 72 75 63 74 20 63 6f 6e 66 69  ert(struct confi
250f0 67 20 2a 64 61 74 61 29 0a 7b 0a 20 20 78 34 6e  g *data).{.  x4n
25100 6f 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67  ode *np;.  unsig
25110 6e 65 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65  ned h;.  unsigne
25120 64 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 34 61  d ph;..  if( x4a
25130 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
25140 20 20 70 68 20 3d 20 63 6f 6e 66 69 67 68 61 73    ph = confighas
25150 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70  h(data);.  h = p
25160 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31  h & (x4a->size-1
25170 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68  );.  np = x4a->h
25180 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
25190 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e  p ){.    if( Con
251a0 66 69 67 63 6d 70 28 28 63 6f 6e 73 74 20 63 68  figcmp((const ch
251b0 61 72 20 2a 29 20 6e 70 2d 3e 64 61 74 61 2c 28  ar *) np->data,(
251c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 64 61  const char *) da
251d0 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ta)==0 ){.      
251e0 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65  /* An existing e
251f0 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
25200 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e  me key is found.
25210 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   */.      /* Fai
25220 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72  l because overwr
25230 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ite is not allow
25240 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  s. */.      retu
25250 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
25260 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
25270 20 7d 0a 20 20 69 66 28 20 78 34 61 2d 3e 63 6f   }.  if( x4a->co
25280 75 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a 65 20 29  unt>=x4a->size )
25290 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
252a0 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
252b0 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20  able bigger */. 
252c0 20 20 20 69 6e 74 20 69 2c 61 72 72 53 69 7a 65     int i,arrSize
252d0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
252e0 34 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  4 array;.    arr
252f0 61 79 2e 73 69 7a 65 20 3d 20 61 72 72 53 69 7a  ay.size = arrSiz
25300 65 20 3d 20 78 34 61 2d 3e 73 69 7a 65 2a 32 3b  e = x4a->size*2;
25310 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74  .    array.count
25320 20 3d 20 78 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x4a->count;. 
25330 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28     array.tbl = (
25340 78 34 6e 6f 64 65 2a 29 63 61 6c 6c 6f 63 28 61  x4node*)calloc(a
25350 72 72 53 69 7a 65 2c 20 73 69 7a 65 6f 66 28 78  rrSize, sizeof(x
25360 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  4node) + sizeof(
25370 78 34 6e 6f 64 65 2a 29 29 3b 0a 20 20 20 20 69  x4node*));.    i
25380 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20  f( array.tbl==0 
25390 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
253a0 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c  Fail due to mall
253b0 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20  oc failure */.  
253c0 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 34    array.ht = (x4
253d0 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74  node**)&(array.t
253e0 62 6c 5b 61 72 72 53 69 7a 65 5d 29 3b 0a 20 20  bl[arrSize]);.  
253f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72    for(i=0; i<arr
25400 53 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  Size; i++) array
25410 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  .ht[i] = 0;.    
25420 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e  for(i=0; i<x4a->
25430 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  count; i++){.   
25440 20 20 20 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70     x4node *oldnp
25450 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20  , *newnp;.      
25460 6f 6c 64 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74  oldnp = &(x4a->t
25470 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20  bl[i]);.      h 
25480 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6f 6c 64  = confighash(old
25490 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 61 72 72  np->data) & (arr
254a0 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e  Size-1);.      n
254b0 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74  ewnp = &(array.t
254c0 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  bl[i]);.      if
254d0 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20  ( array.ht[h] ) 
254e0 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f  array.ht[h]->fro
254f0 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78  m = &(newnp->nex
25500 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  t);.      newnp-
25510 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74  >next = array.ht
25520 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  [h];.      newnp
25530 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e  ->data = oldnp->
25540 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e  data;.      newn
25550 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61  p->from = &(arra
25560 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20  y.ht[h]);.      
25570 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65  array.ht[h] = ne
25580 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  wnp;.    }.    f
25590 72 65 65 28 78 34 61 2d 3e 74 62 6c 29 3b 0a 20  ree(x4a->tbl);. 
255a0 20 20 20 2a 78 34 61 20 3d 20 61 72 72 61 79 3b     *x4a = array;
255b0 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74  .  }.  /* Insert
255c0 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f   the new data */
255d0 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 34 61  .  h = ph & (x4a
255e0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
255f0 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 78 34 61  = &(x4a->tbl[x4a
25600 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e  ->count++]);.  n
25610 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a  p->data = data;.
25620 20 20 69 66 28 20 78 34 61 2d 3e 68 74 5b 68 5d    if( x4a->ht[h]
25630 20 29 20 78 34 61 2d 3e 68 74 5b 68 5d 2d 3e 66   ) x4a->ht[h]->f
25640 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74  rom = &(np->next
25650 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20  );.  np->next = 
25660 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 34  x4a->ht[h];.  x4
25670 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20  a->ht[h] = np;. 
25680 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 34   np->from = &(x4
25690 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74  a->ht[h]);.  ret
256a0 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  urn 1;.}../* Ret
256b0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
256c0 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74   data assigned t
256d0 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e  o the given key.
256e0 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a    Return NULL.**
256f0 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e   if no such key.
25700 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69   */.struct confi
25710 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66  g *Configtable_f
25720 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69  ind(struct confi
25730 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 69 6e 74 20  g *key).{.  int 
25740 68 3b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b  h;.  x4node *np;
25750 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29  ..  if( x4a==0 )
25760 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
25770 20 63 6f 6e 66 69 67 68 61 73 68 28 6b 65 79 29   confighash(key)
25780 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29   & (x4a->size-1)
25790 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74  ;.  np = x4a->ht
257a0 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
257b0 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66   ){.    if( Conf
257c0 69 67 63 6d 70 28 28 63 6f 6e 73 74 20 63 68 61  igcmp((const cha
257d0 72 20 2a 29 20 6e 70 2d 3e 64 61 74 61 2c 28 63  r *) np->data,(c
257e0 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6b 65 79  onst char *) key
257f0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
25800 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
25810 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
25820 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
25830 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20 61 6c  .}../* Remove al
25840 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  l data from the 
25850 74 61 62 6c 65 2e 20 20 50 61 73 73 20 65 61 63  table.  Pass eac
25860 68 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 75  h data to the fu
25870 6e 63 74 69 6f 6e 20 22 66 22 0a 2a 2a 20 61 73  nction "f".** as
25880 20 69 74 20 69 73 20 72 65 6d 6f 76 65 64 2e 20   it is removed. 
25890 20 28 22 66 22 20 6d 61 79 20 62 65 20 6e 75 6c   ("f" may be nul
258a0 6c 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20  l to avoid this 
258b0 73 74 65 70 2e 29 20 2a 2f 0a 76 6f 69 64 20 43  step.) */.void C
258c0 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72  onfigtable_clear
258d0 28 69 6e 74 28 2a 66 29 28 73 74 72 75 63 74 20  (int(*f)(struct 
258e0 63 6f 6e 66 69 67 20 2a 29 29 0a 7b 0a 20 20 69  config *)).{.  i
258f0 6e 74 20 69 3b 0a 20 20 69 66 28 20 78 34 61 3d  nt i;.  if( x4a=
25900 3d 30 20 7c 7c 20 78 34 61 2d 3e 63 6f 75 6e 74  =0 || x4a->count
25910 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
25920 69 66 28 20 66 20 29 20 66 6f 72 28 69 3d 30 3b  if( f ) for(i=0;
25930 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69   i<x4a->count; i
25940 2b 2b 29 20 28 2a 66 29 28 78 34 61 2d 3e 74 62  ++) (*f)(x4a->tb
25950 6c 5b 69 5d 2e 64 61 74 61 29 3b 0a 20 20 66 6f  l[i].data);.  fo
25960 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 73 69  r(i=0; i<x4a->si
25970 7a 65 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74  ze; i++) x4a->ht
25980 5b 69 5d 20 3d 20 30 3b 0a 20 20 78 34 61 2d 3e  [i] = 0;.  x4a->
25990 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 72 65 74  count = 0;.  ret
259a0 75 72 6e 3b 0a 7d 0a                             urn;.}.