/ Hex Artifact Content
Login

Artifact dcbb38b9dfce3c6a24485a5d4398f8b8b283107b:


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 09 64 65  ined(WIN32).#.de
01e0: 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  fine __WIN32__.#
01f0: 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a     endif.#endif.
0200: 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33 32 5f  .#ifdef __WIN32_
0210: 5f 0a 65 78 74 65 72 6e 20 69 6e 74 20 61 63 63  _.extern int acc
0220: 65 73 73 28 29 3b 0a 23 65 6c 73 65 0a 23 69 6e  ess();.#else.#in
0230: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
0240: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66  .#endif../* #def
0250: 69 6e 65 20 50 52 49 56 41 54 45 20 73 74 61 74  ine PRIVATE stat
0260: 69 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  ic */.#define PR
0270: 49 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54 45  IVATE..#ifdef TE
0280: 53 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48  ST.#define MAXRH
0290: 53 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65 74  S 5       /* Set
02a0: 20 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73 65   low to exercise
02b0: 20 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65 20   exception code 
02c0: 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  */.#else.#define
02d0: 20 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65 6e   MAXRHS 1000.#en
02e0: 64 69 66 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  dif..static cons
02f0: 74 20 63 68 61 72 20 2a 2a 6d 61 64 65 5f 66 69  t char **made_fi
0300: 6c 65 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  les = NULL;.stat
0310: 69 63 20 69 6e 74 20 6d 61 64 65 5f 66 69 6c 65  ic int made_file
0320: 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 73 74 61  s_count = 0;.sta
0330: 74 69 63 20 69 6e 74 20 73 75 63 63 65 73 73 66  tic int successf
0340: 75 6c 5f 65 78 69 74 20 3d 20 30 3b 0a 73 74 61  ul_exit = 0;.sta
0350: 74 69 63 20 76 6f 69 64 20 4c 65 6d 6f 6e 41 74  tic void LemonAt
0360: 45 78 69 74 28 76 6f 69 64 29 0a 7b 0a 20 20 20  Exit(void).{.   
0370: 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64   /* if we failed
0380: 2c 20 64 65 6c 65 74 65 20 28 6d 6f 73 74 29 20  , delete (most) 
0390: 66 69 6c 65 73 20 77 65 20 6d 61 64 65 2c 20 74  files we made, t
03a0: 6f 20 75 6e 63 6f 6e 66 75 73 65 20 62 75 69 6c  o unconfuse buil
03b0: 64 20 74 6f 6f 6c 73 2e 20 2a 2f 0a 20 20 20 20  d tools. */.    
03c0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 20 28  int i;.    for (
03d0: 69 20 3d 20 30 3b 20 69 20 3c 20 6d 61 64 65 5f  i = 0; i < made_
03e0: 66 69 6c 65 73 5f 63 6f 75 6e 74 3b 20 69 2b 2b  files_count; i++
03f0: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ) {.        if (
0400: 21 73 75 63 63 65 73 73 66 75 6c 5f 65 78 69 74  !successful_exit
0410: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0420: 72 65 6d 6f 76 65 28 6d 61 64 65 5f 66 69 6c 65  remove(made_file
0430: 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  s[i]);.        }
0440: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 28 76  .        free((v
0450: 6f 69 64 20 2a 29 20 6d 61 64 65 5f 66 69 6c 65  oid *) made_file
0460: 73 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  s[i]);.    }.   
0470: 20 66 72 65 65 28 6d 61 64 65 5f 66 69 6c 65 73   free(made_files
0480: 29 3b 0a 20 20 20 20 6d 61 64 65 5f 66 69 6c 65  );.    made_file
0490: 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  s_count = 0;.   
04a0: 20 6d 61 64 65 5f 66 69 6c 65 73 20 3d 20 4e 55   made_files = NU
04b0: 4c 4c 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68  LL;.}..static ch
04c0: 61 72 20 2a 6d 73 6f 72 74 28 63 68 61 72 2a 2c  ar *msort(char*,
04d0: 63 68 61 72 2a 2a 2c 69 6e 74 28 2a 29 28 63 6f  char**,int(*)(co
04e0: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
04f0: 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a 0a 2a 2a 20  char*));../*.** 
0500: 43 6f 6d 70 69 6c 65 72 73 20 61 72 65 20 67 65  Compilers are ge
0510: 74 74 69 6e 67 20 69 6e 63 72 65 61 73 69 6e 67  tting increasing
0520: 6c 79 20 70 65 64 61 6e 74 69 63 20 61 62 6f 75  ly pedantic abou
0530: 74 20 74 79 70 65 20 63 6f 6e 76 65 72 73 69 6f  t type conversio
0540: 6e 73 0a 2a 2a 20 61 73 20 43 20 65 76 6f 6c 76  ns.** as C evolv
0550: 65 73 20 65 76 65 72 20 63 6c 6f 73 65 72 20 74  es ever closer t
0560: 6f 20 41 64 61 2e 2e 2e 2e 20 20 54 6f 20 77 6f  o Ada....  To wo
0570: 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 6c 61  rk around the la
0580: 74 65 73 74 20 70 72 6f 62 6c 65 6d 73 0a 2a 2a  test problems.**
0590: 20 77 65 20 68 61 76 65 20 74 6f 20 64 65 66 69   we have to defi
05a0: 6e 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ne the following
05b0: 20 76 61 72 69 61 6e 74 20 6f 66 20 73 74 72 6c   variant of strl
05c0: 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  en()..*/.#define
05d0: 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 58 29 20   lemonStrlen(X) 
05e0: 20 20 28 28 69 6e 74 29 73 74 72 6c 65 6e 28 58    ((int)strlen(X
05f0: 29 29 0a 0a 2f 2a 20 61 20 66 65 77 20 66 6f 72  ))../* a few for
0600: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
0610: 73 2e 2e 2e 20 2a 2f 0a 73 74 72 75 63 74 20 72  s... */.struct r
0620: 75 6c 65 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f  ule;.struct lemo
0630: 6e 3b 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e  n;.struct action
0640: 3b 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  ;..static struct
0650: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
0660: 6e 65 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69  new(void);.stati
0670: 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  c struct action 
0680: 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72  *Action_sort(str
0690: 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a  uct action *);..
06a0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  /********** From
06b0: 20 74 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64   the file "build
06c0: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
06d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
06e0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46  ********/.void F
06f0: 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63  indRulePrecedenc
0700: 65 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46  es();.void FindF
0710: 69 72 73 74 53 65 74 73 28 29 3b 0a 76 6f 69 64  irstSets();.void
0720: 20 46 69 6e 64 53 74 61 74 65 73 28 29 3b 0a 76   FindStates();.v
0730: 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 29 3b  oid FindLinks();
0740: 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77  .void FindFollow
0750: 53 65 74 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e  Sets();.void Fin
0760: 64 41 63 74 69 6f 6e 73 28 29 3b 0a 0a 2f 2a 2a  dActions();../**
0770: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
0780: 20 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73   file "configlis
0790: 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t.h" ***********
07a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
07b0: 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e  ******/.void Con
07c0: 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 76 6f 69  figlist_init(voi
07d0: 64 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  d);.struct confi
07e0: 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  g *Configlist_ad
07f0: 64 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 2c  d(struct rule *,
0800: 20 69 6e 74 29 3b 0a 73 74 72 75 63 74 20 63 6f   int);.struct co
0810: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
0820: 5f 61 64 64 62 61 73 69 73 28 73 74 72 75 63 74  _addbasis(struct
0830: 20 72 75 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 76   rule *, int);.v
0840: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63  oid Configlist_c
0850: 6c 6f 73 75 72 65 28 73 74 72 75 63 74 20 6c 65  losure(struct le
0860: 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e  mon *);.void Con
0870: 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 76 6f 69  figlist_sort(voi
0880: 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  d);.void Configl
0890: 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28 76 6f  ist_sortbasis(vo
08a0: 69 64 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  id);.struct conf
08b0: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72  ig *Configlist_r
08c0: 65 74 75 72 6e 28 76 6f 69 64 29 3b 0a 73 74 72  eturn(void);.str
08d0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
08e0: 69 67 6c 69 73 74 5f 62 61 73 69 73 28 76 6f 69  iglist_basis(voi
08f0: 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  d);.void Configl
0900: 69 73 74 5f 65 61 74 28 73 74 72 75 63 74 20 63  ist_eat(struct c
0910: 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64 20 43  onfig *);.void C
0920: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28  onfiglist_reset(
0930: 76 6f 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  void);../*******
0940: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
0950: 20 22 65 72 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a   "error.h" *****
0960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0980: 2a 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73  **/.void ErrorMs
0990: 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20  g(const char *, 
09a0: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a  int,const char *
09b0: 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  , ...);../******
09c0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
09d0: 6f 70 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a  option.h" ******
09e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a00: 2a 2a 2a 2a 2f 0a 65 6e 75 6d 20 6f 70 74 69 6f  ****/.enum optio
0a10: 6e 5f 74 79 70 65 20 7b 20 4f 50 54 5f 46 4c 41  n_type { OPT_FLA
0a20: 47 3d 31 2c 20 20 4f 50 54 5f 49 4e 54 2c 20 20  G=1,  OPT_INT,  
0a30: 4f 50 54 5f 44 42 4c 2c 20 20 4f 50 54 5f 53 54  OPT_DBL,  OPT_ST
0a40: 52 2c 0a 20 20 20 20 20 20 20 20 20 4f 50 54 5f  R,.         OPT_
0a50: 46 46 4c 41 47 2c 20 4f 50 54 5f 46 49 4e 54 2c  FFLAG, OPT_FINT,
0a60: 20 4f 50 54 5f 46 44 42 4c 2c 20 4f 50 54 5f 46   OPT_FDBL, OPT_F
0a70: 53 54 52 7d 3b 0a 73 74 72 75 63 74 20 73 5f 6f  STR};.struct s_o
0a80: 70 74 69 6f 6e 73 20 7b 0a 20 20 65 6e 75 6d 20  ptions {.  enum 
0a90: 6f 70 74 69 6f 6e 5f 74 79 70 65 20 74 79 70 65  option_type type
0aa0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
0ab0: 6c 61 62 65 6c 3b 0a 20 20 63 68 61 72 20 2a 61  label;.  char *a
0ac0: 72 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rg;.  const char
0ad0: 20 2a 6d 65 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e   *message;.};.in
0ae0: 74 20 20 20 20 4f 70 74 49 6e 69 74 28 63 68 61  t    OptInit(cha
0af0: 72 2a 2a 2c 73 74 72 75 63 74 20 73 5f 6f 70 74  r**,struct s_opt
0b00: 69 6f 6e 73 2a 2c 46 49 4c 45 2a 29 3b 0a 69 6e  ions*,FILE*);.in
0b10: 74 20 20 20 20 4f 70 74 4e 41 72 67 73 28 76 6f  t    OptNArgs(vo
0b20: 69 64 29 3b 0a 63 68 61 72 20 20 2a 4f 70 74 41  id);.char  *OptA
0b30: 72 67 28 69 6e 74 29 3b 0a 76 6f 69 64 20 20 20  rg(int);.void   
0b40: 4f 70 74 45 72 72 28 69 6e 74 29 3b 0a 76 6f 69  OptErr(int);.voi
0b50: 64 20 20 20 4f 70 74 50 72 69 6e 74 28 76 6f 69  d   OptPrint(voi
0b60: 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46  d);../******** F
0b70: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61  rom the file "pa
0b80: 72 73 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  rse.h" *********
0b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0bb0: 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 73 74 72  /.void Parse(str
0bc0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
0bd0: 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ;../********* Fr
0be0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69  om the file "pli
0bf0: 6e 6b 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nk.h" **********
0c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73  *************/.s
0c20: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 50 6c 69  truct plink *Pli
0c30: 6e 6b 5f 6e 65 77 28 76 6f 69 64 29 3b 0a 76 6f  nk_new(void);.vo
0c40: 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 73 74 72  id Plink_add(str
0c50: 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74  uct plink **, st
0c60: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a  ruct config *);.
0c70: 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28  void Plink_copy(
0c80: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c  struct plink **,
0c90: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29   struct plink *)
0ca0: 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c  ;.void Plink_del
0cb0: 65 74 65 28 73 74 72 75 63 74 20 70 6c 69 6e 6b  ete(struct plink
0cc0: 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a   *);../*********
0cd0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
0ce0: 22 72 65 70 6f 72 74 2e 68 22 20 2a 2a 2a 2a 2a  "report.h" *****
0cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d10: 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73  /.void Reprint(s
0d20: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a  truct lemon *);.
0d30: 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75  void ReportOutpu
0d40: 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  t(struct lemon *
0d50: 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61  );.void ReportTa
0d60: 62 6c 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ble(struct lemon
0d70: 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20 52   *, int);.void R
0d80: 65 70 6f 72 74 48 65 61 64 65 72 28 73 74 72 75  eportHeader(stru
0d90: 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69  ct lemon *);.voi
0da0: 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73  d CompressTables
0db0: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29  (struct lemon *)
0dc0: 3b 0a 76 6f 69 64 20 52 65 73 6f 72 74 53 74 61  ;.void ResortSta
0dd0: 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  tes(struct lemon
0de0: 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a   *);../*********
0df0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
0e00: 22 73 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  "set.h" ********
0e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e30: 2f 0a 76 6f 69 64 20 20 53 65 74 53 69 7a 65 28  /.void  SetSize(
0e40: 69 6e 74 29 3b 20 20 20 20 20 20 20 20 20 20 20  int);           
0e50: 20 20 2f 2a 20 41 6c 6c 20 73 65 74 73 20 77 69    /* All sets wi
0e60: 6c 6c 20 62 65 20 6f 66 20 73 69 7a 65 20 4e 20  ll be of size N 
0e70: 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28  */.char *SetNew(
0e80: 76 6f 69 64 29 3b 20 20 20 20 20 20 20 20 20 20  void);          
0e90: 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 65       /* A new se
0ea0: 74 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e  t for element 0.
0eb0: 2e 4e 20 2a 2f 0a 76 6f 69 64 20 20 53 65 74 46  .N */.void  SetF
0ec0: 72 65 65 28 63 68 61 72 2a 29 3b 20 20 20 20 20  ree(char*);     
0ed0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c          /* Deall
0ee0: 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f 0a 0a  ocate a set */..
0ef0: 63 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f 69  char *SetNew(voi
0f00: 64 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d);             
0f10: 20 20 2f 2a 20 41 20 6e 65 77 20 73 65 74 20 66    /* A new set f
0f20: 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e 4e 20  or element 0..N 
0f30: 2a 2f 0a 69 6e 74 20 53 65 74 41 64 64 28 63 68  */.int SetAdd(ch
0f40: 61 72 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20  ar*,int);       
0f50: 20 20 20 20 20 2f 2a 20 41 64 64 20 65 6c 65 6d       /* Add elem
0f60: 65 6e 74 20 74 6f 20 61 20 73 65 74 20 2a 2f 0a  ent to a set */.
0f70: 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28 63 68 61  int SetUnion(cha
0f80: 72 20 2a 2c 63 68 61 72 20 2a 29 3b 20 20 20 20  r *,char *);    
0f90: 2f 2a 20 41 20 3c 2d 20 41 20 55 20 42 2c 20 74  /* A <- A U B, t
0fa0: 68 72 75 20 65 6c 65 6d 65 6e 74 20 4e 20 2a 2f  hru element N */
0fb0: 0a 23 64 65 66 69 6e 65 20 53 65 74 46 69 6e 64  .#define SetFind
0fc0: 28 58 2c 59 29 20 28 58 5b 59 5d 29 20 20 20 20  (X,Y) (X[Y])    
0fd0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 59 20     /* True if Y 
0fe0: 69 73 20 69 6e 20 73 65 74 20 58 20 2a 2f 0a 0a  is in set X */..
0ff0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  /********** From
1000: 20 74 68 65 20 66 69 6c 65 20 22 73 74 72 75 63   the file "struc
1010: 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t.h" ***********
1020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
1040: 2a 20 50 72 69 6e 63 69 70 61 6c 20 64 61 74 61  * Principal data
1050: 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20   structures for 
1060: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
1070: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
1080: 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 4c 45  typedef enum {LE
1090: 4d 4f 4e 5f 46 41 4c 53 45 3d 30 2c 20 4c 45 4d  MON_FALSE=0, LEM
10a0: 4f 4e 5f 54 52 55 45 7d 20 42 6f 6f 6c 65 61 6e  ON_TRUE} Boolean
10b0: 3b 0a 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20 28 74  ;../* Symbols (t
10c0: 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e  erminals and non
10d0: 74 65 72 6d 69 6e 61 6c 73 29 20 6f 66 20 74 68  terminals) of th
10e0: 65 20 67 72 61 6d 6d 61 72 20 61 72 65 20 73 74  e grammar are st
10f0: 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 66  ored.** in the f
1100: 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 65 6e 75  ollowing: */.enu
1110: 6d 20 73 79 6d 62 6f 6c 5f 74 79 70 65 20 7b 0a  m symbol_type {.
1120: 20 20 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 4e 4f    TERMINAL,.  NO
1130: 4e 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 4d 55 4c  NTERMINAL,.  MUL
1140: 54 49 54 45 52 4d 49 4e 41 4c 0a 7d 3b 0a 65 6e  TITERMINAL.};.en
1150: 75 6d 20 65 5f 61 73 73 6f 63 20 7b 0a 20 20 20  um e_assoc {.   
1160: 20 4c 45 46 54 2c 0a 20 20 20 20 52 49 47 48 54   LEFT,.    RIGHT
1170: 2c 0a 20 20 20 20 4e 4f 4e 45 2c 0a 20 20 20 20  ,.    NONE,.    
1180: 55 4e 4b 0a 7d 3b 0a 73 74 72 75 63 74 20 73 79  UNK.};.struct sy
1190: 6d 62 6f 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63  mbol {.  const c
11a0: 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20  har *name;      
11b0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
11c0: 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 6e 74   symbol */.  int
11d0: 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20   index;         
11e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e        /* Index n
11f0: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 73  umber for this s
1200: 79 6d 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20  ymbol */.  enum 
1210: 73 79 6d 62 6f 6c 5f 74 79 70 65 20 74 79 70 65  symbol_type type
1220: 3b 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 73 20 61  ;   /* Symbols a
1230: 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20 54 45  re all either TE
1240: 52 4d 49 4e 41 4c 53 20 6f 72 20 4e 54 73 20 2a  RMINALS or NTs *
1250: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
1260: 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  *rule;       /* 
1270: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 72  Linked list of r
1280: 75 6c 65 73 20 6f 66 20 74 68 69 73 20 28 69 66  ules of this (if
1290: 20 61 6e 20 4e 54 29 20 2a 2f 0a 20 20 73 74 72   an NT) */.  str
12a0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c  uct symbol *fall
12b0: 62 61 63 6b 3b 20 2f 2a 20 66 61 6c 6c 62 61 63  back; /* fallbac
12c0: 6b 20 74 6f 6b 65 6e 20 69 6e 20 63 61 73 65 20  k token in case 
12d0: 74 68 69 73 20 74 6f 6b 65 6e 20 64 6f 65 73 6e  this token doesn
12e0: 27 74 20 70 61 72 73 65 20 2a 2f 0a 20 20 69 6e  't parse */.  in
12f0: 74 20 70 72 65 63 3b 20 20 20 20 20 20 20 20 20  t prec;         
1300: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63 65 64         /* Preced
1310: 65 6e 63 65 20 69 66 20 64 65 66 69 6e 65 64 20  ence if defined 
1320: 28 2d 31 20 6f 74 68 65 72 77 69 73 65 29 20 2a  (-1 otherwise) *
1330: 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63  /.  enum e_assoc
1340: 20 61 73 73 6f 63 3b 20 20 20 20 20 20 2f 2a 20   assoc;      /* 
1350: 41 73 73 6f 63 69 61 74 69 76 69 74 79 20 69 66  Associativity if
1360: 20 70 72 65 63 65 64 65 6e 63 65 20 69 73 20 64   precedence is d
1370: 65 66 69 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72  efined */.  char
1380: 20 2a 66 69 72 73 74 73 65 74 3b 20 20 20 20 20   *firstset;     
1390: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 2d 73 65       /* First-se
13a0: 74 20 66 6f 72 20 61 6c 6c 20 72 75 6c 65 73 20  t for all rules 
13b0: 6f 66 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a  of this symbol *
13c0: 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 6c 61 6d 62  /.  Boolean lamb
13d0: 64 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  da;          /* 
13e0: 54 72 75 65 20 69 66 20 4e 54 20 61 6e 64 20 63  True if NT and c
13f0: 61 6e 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  an generate an e
1400: 6d 70 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20  mpty string */. 
1410: 20 69 6e 74 20 75 73 65 43 6e 74 3b 20 20 20 20   int useCnt;    
1420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1430: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 75 73 65  ber of times use
1440: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 73  d */.  char *des
1450: 74 72 75 63 74 6f 72 3b 20 20 20 20 20 20 20 20  tructor;        
1460: 2f 2a 20 43 6f 64 65 20 77 68 69 63 68 20 65 78  /* Code which ex
1470: 65 63 75 74 65 73 20 77 68 65 6e 65 76 65 72 20  ecutes whenever 
1480: 74 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 0a 20  this symbol is. 
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 70            ** pop
14b0: 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
14c0: 63 6b 20 64 75 72 69 6e 67 20 65 72 72 6f 72 20  ck during error 
14d0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
14e0: 69 6e 74 20 64 65 73 74 4c 69 6e 65 6e 6f 3b 20  int destLineno; 
14f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
1500: 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72   number for star
1510: 74 20 6f 66 20 64 65 73 74 72 75 63 74 6f 72 20  t of destructor 
1520: 2a 2f 0a 20 20 63 68 61 72 20 2a 64 61 74 61 74  */.  char *datat
1530: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ype;          /*
1540: 20 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6f   The data type o
1550: 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65  f information he
1560: 6c 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 20  ld by this.     
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1580: 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e        ** object.
1590: 20 4f 6e 6c 79 20 75 73 65 64 20 69 66 20 74 79   Only used if ty
15a0: 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe==NONTERMINAL 
15b0: 2a 2f 0a 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20  */.  int dtnum; 
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15d0: 20 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6e   The data type n
15e0: 75 6d 62 65 72 2e 20 20 49 6e 20 74 68 65 20 70  umber.  In the p
15f0: 61 72 73 65 72 2c 20 74 68 65 20 76 61 6c 75 65  arser, the value
1600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1610: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1620: 74 61 63 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e  tack is a union.
1630: 20 20 54 68 65 20 2e 79 79 25 64 20 65 6c 65 6d    The .yy%d elem
1640: 65 6e 74 20 6f 66 20 74 68 69 73 0a 20 20 20 20  ent of this.    
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 20 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20         ** union 
1670: 69 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 64  is the correct d
1680: 61 74 61 20 74 79 70 65 20 66 6f 72 20 74 68 69  ata type for thi
1690: 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a  s object */.  /*
16a0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
16b0: 69 65 6c 64 73 20 61 72 65 20 75 73 65 64 20 62  ields are used b
16c0: 79 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73  y MULTITERMINALs
16d0: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e   only */.  int n
16e0: 73 75 62 73 79 6d 3b 20 20 20 20 20 20 20 20 20  subsym;         
16f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1700: 20 63 6f 6e 73 74 69 74 75 65 6e 74 20 73 79 6d   constituent sym
1710: 62 6f 6c 73 20 69 6e 20 74 68 65 20 4d 55 4c 54  bols in the MULT
1720: 49 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  I */.  struct sy
1730: 6d 62 6f 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20  mbol **subsym;  
1740: 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6e 73  /* Array of cons
1750: 74 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20  tituent symbols 
1760: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70  */.};../* Each p
1770: 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 69  roduction rule i
1780: 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 69 73  n the grammar is
1790: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 66   stored in the f
17a0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75  ollowing.** stru
17b0: 63 74 75 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63  cture.  */.struc
17c0: 74 20 72 75 6c 65 20 7b 0a 20 20 73 74 72 75 63  t rule {.  struc
17d0: 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20  t symbol *lhs;  
17e0: 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64      /* Left-hand
17f0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 72 75 6c   side of the rul
1800: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1810: 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20  r *lhsalias;    
1820: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65  /* Alias for the
1830: 20 4c 48 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f   LHS (NULL if no
1840: 6e 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73  ne) */.  int lhs
1850: 53 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  Start;          
1860: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 65 66    /* True if lef
1870: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 74  t-hand side is t
1880: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
1890: 2a 2f 0a 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e  */.  int rulelin
18a0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
18b0: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72   Line number for
18c0: 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69   the rule */.  i
18d0: 6e 74 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20  nt nrhs;        
18e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18f0: 72 20 6f 66 20 52 48 53 20 73 79 6d 62 6f 6c 73  r of RHS symbols
1900: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
1910: 62 6f 6c 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f  bol **rhs;     /
1920: 2a 20 54 68 65 20 52 48 53 20 73 79 6d 62 6f 6c  * The RHS symbol
1930: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
1940: 72 20 2a 2a 72 68 73 61 6c 69 61 73 3b 20 20 20  r **rhsalias;   
1950: 2f 2a 20 41 6e 20 61 6c 69 61 73 20 66 6f 72 20  /* An alias for 
1960: 65 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20  each RHS symbol 
1970: 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a  (NULL if none) *
1980: 2f 0a 20 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20  /.  int line;   
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19a0: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 61 74 20 77  Line number at w
19b0: 68 69 63 68 20 63 6f 64 65 20 62 65 67 69 6e 73  hich code begins
19c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
19d0: 20 2a 63 6f 64 65 3b 20 20 20 20 20 20 20 20 2f   *code;        /
19e0: 2a 20 54 68 65 20 63 6f 64 65 20 65 78 65 63 75  * The code execu
19f0: 74 65 64 20 77 68 65 6e 20 74 68 69 73 20 72 75  ted when this ru
1a00: 6c 65 20 69 73 20 72 65 64 75 63 65 64 20 2a 2f  le is reduced */
1a10: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1a20: 20 2a 70 72 65 63 73 79 6d 3b 20 20 2f 2a 20 50   *precsym;  /* P
1a30: 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c  recedence symbol
1a40: 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a   for this rule *
1a50: 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20 20  /.  int index;  
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a70: 41 6e 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  An index number 
1a80: 66 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f  for this rule */
1a90: 0a 20 20 42 6f 6f 6c 65 61 6e 20 63 61 6e 52 65  .  Boolean canRe
1aa0: 64 75 63 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  duce;       /* T
1ab0: 72 75 65 20 69 66 20 74 68 69 73 20 72 75 6c 65  rue if this rule
1ac0: 20 69 73 20 65 76 65 72 20 72 65 64 75 63 65 64   is ever reduced
1ad0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
1ae0: 65 20 2a 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f  e *nextlhs;    /
1af0: 2a 20 4e 65 78 74 20 72 75 6c 65 20 77 69 74 68  * Next rule with
1b00: 20 74 68 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f   the same LHS */
1b10: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
1b20: 6e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e  next;       /* N
1b30: 65 78 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20  ext rule in the 
1b40: 67 6c 6f 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d  global list */.}
1b50: 3b 0a 0a 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72  ;../* A configur
1b60: 61 74 69 6f 6e 20 69 73 20 61 20 70 72 6f 64 75  ation is a produ
1b70: 63 74 69 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68  ction rule of th
1b80: 65 20 67 72 61 6d 6d 61 72 20 74 6f 67 65 74 68  e grammar togeth
1b90: 65 72 20 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72  er with.** a mar
1ba0: 6b 20 28 64 6f 74 29 20 73 68 6f 77 69 6e 67 20  k (dot) showing 
1bb0: 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 61 74  how much of that
1bc0: 20 72 75 6c 65 20 68 61 73 20 62 65 65 6e 20 70   rule has been p
1bd0: 72 6f 63 65 73 73 65 64 20 73 6f 20 66 61 72 2e  rocessed so far.
1be0: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
1bf0: 6e 73 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ns also contain 
1c00: 61 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69  a follow-set whi
1c10: 63 68 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ch is a list of 
1c20: 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62  terminal.** symb
1c30: 6f 6c 73 20 77 68 69 63 68 20 61 72 65 20 61 6c  ols which are al
1c40: 6c 6f 77 65 64 20 74 6f 20 69 6d 6d 65 64 69 61  lowed to immedia
1c50: 74 65 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20  tely follow the 
1c60: 65 6e 64 20 6f 66 20 74 68 65 20 72 75 6c 65 2e  end of the rule.
1c70: 0a 2a 2a 20 45 76 65 72 79 20 63 6f 6e 66 69 67  .** Every config
1c80: 75 72 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72  uration is recor
1c90: 64 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e  ded as an instan
1ca0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1cb0: 69 6e 67 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67  ing: */.enum cfg
1cc0: 73 74 61 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c  status {.  COMPL
1cd0: 45 54 45 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54  ETE,.  INCOMPLET
1ce0: 45 0a 7d 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  E.};.struct conf
1cf0: 69 67 20 7b 0a 20 20 73 74 72 75 63 74 20 72 75  ig {.  struct ru
1d00: 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20 20 20  le *rp;         
1d10: 2f 2a 20 54 68 65 20 72 75 6c 65 20 75 70 6f 6e  /* The rule upon
1d20: 20 77 68 69 63 68 20 74 68 65 20 63 6f 6e 66 69   which the confi
1d30: 67 75 72 61 74 69 6f 6e 20 69 73 20 62 61 73 65  guration is base
1d40: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20  d */.  int dot; 
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 2f 2a 20 54 68 65 20 70 61 72 73 65 20 70 6f 69  /* The parse poi
1d70: 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77  nt */.  char *fw
1d80: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1d90: 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66   /* Follow-set f
1da0: 6f 72 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72  or this configur
1db0: 61 74 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20  ation only */.  
1dc0: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70  struct plink *fp
1dd0: 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c  lp;      /* Foll
1de0: 6f 77 2d 73 65 74 20 66 6f 72 77 61 72 64 20 70  ow-set forward p
1df0: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
1e00: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69   */.  struct pli
1e10: 6e 6b 20 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f  nk *bplp;      /
1e20: 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63  * Follow-set bac
1e30: 6b 77 61 72 64 73 20 70 72 6f 70 61 67 61 74 69  kwards propagati
1e40: 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74  on links */.  st
1e50: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
1e60: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1e70: 72 20 74 6f 20 73 74 61 74 65 20 77 68 69 63 68  r to state which
1e80: 20 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 2a   contains this *
1e90: 2f 0a 20 20 65 6e 75 6d 20 63 66 67 73 74 61 74  /.  enum cfgstat
1ea0: 75 73 20 73 74 61 74 75 73 3b 20 20 20 2f 2a 20  us status;   /* 
1eb0: 75 73 65 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c  used during foll
1ec0: 6f 77 73 65 74 20 61 6e 64 20 73 68 69 66 74 20  owset and shift 
1ed0: 63 6f 6d 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a  computations */.
1ee0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
1ef0: 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65  *next;     /* Ne
1f00: 78 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  xt configuration
1f10: 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 2a 2f   in the state */
1f20: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
1f30: 20 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *bp;       /* T
1f40: 68 65 20 6e 65 78 74 20 62 61 73 69 73 20 63 6f  he next basis co
1f50: 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d  nfiguration */.}
1f60: 3b 0a 0a 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e  ;..enum e_action
1f70: 20 7b 0a 20 20 53 48 49 46 54 2c 0a 20 20 41 43   {.  SHIFT,.  AC
1f80: 43 45 50 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a  CEPT,.  REDUCE,.
1f90: 20 20 45 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e    ERROR,.  SSCON
1fa0: 46 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20  FLICT,          
1fb0: 20 20 20 20 2f 2a 20 41 20 73 68 69 66 74 2f 73      /* A shift/s
1fc0: 68 69 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  hift conflict */
1fd0: 0a 20 20 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20  .  SRCONFLICT,  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1ff0: 61 73 20 61 20 72 65 64 75 63 65 2c 20 62 75 74  as a reduce, but
2000: 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c   part of a confl
2010: 69 63 74 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c  ict */.  RRCONFL
2020: 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  ICT,            
2030: 20 20 2f 2a 20 57 61 73 20 61 20 72 65 64 75 63    /* Was a reduc
2040: 65 2c 20 62 75 74 20 70 61 72 74 20 6f 66 20 61  e, but part of a
2050: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53   conflict */.  S
2060: 48 5f 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20  H_RESOLVED,     
2070: 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61          /* Was a
2080: 20 73 68 69 66 74 2e 20 20 50 72 65 63 65 64 65   shift.  Precede
2090: 6e 63 65 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e  nce resolved con
20a0: 66 6c 69 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45  flict */.  RD_RE
20b0: 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20  SOLVED,         
20c0: 20 20 20 20 2f 2a 20 57 61 73 20 72 65 64 75 63      /* Was reduc
20d0: 65 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20 72  e.  Precedence r
20e0: 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74  esolved conflict
20f0: 20 2a 2f 0a 20 20 4e 4f 54 5f 55 53 45 44 20 20   */.  NOT_USED  
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2110: 2a 20 44 65 6c 65 74 65 64 20 62 79 20 63 6f 6d  * Deleted by com
2120: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a  pression */.};..
2130: 2f 2a 20 45 76 65 72 79 20 73 68 69 66 74 20 6f  /* Every shift o
2140: 72 20 72 65 64 75 63 65 20 6f 70 65 72 61 74 69  r reduce operati
2150: 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 61 73 20  on is stored as 
2160: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
2170: 77 69 6e 67 20 2a 2f 0a 73 74 72 75 63 74 20 61  wing */.struct a
2180: 63 74 69 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74  ction {.  struct
2190: 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 20   symbol *sp;    
21a0: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 2d 61     /* The look-a
21b0: 68 65 61 64 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20  head symbol */. 
21c0: 20 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74   enum e_action t
21d0: 79 70 65 3b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  ype;.  union {. 
21e0: 20 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20     struct state 
21f0: 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  *stp;     /* The
2200: 20 6e 65 77 20 73 74 61 74 65 2c 20 69 66 20 61   new state, if a
2210: 20 73 68 69 66 74 20 2a 2f 0a 20 20 20 20 73 74   shift */.    st
2220: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 20 20  ruct rule *rp;  
2230: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65       /* The rule
2240: 2c 20 69 66 20 61 20 72 65 64 75 63 65 20 2a 2f  , if a reduce */
2250: 0a 20 20 7d 20 78 3b 0a 20 20 73 74 72 75 63 74  .  } x;.  struct
2260: 20 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20   action *next;  
2270: 20 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f     /* Next actio
2280: 6e 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  n for this state
2290: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74   */.  struct act
22a0: 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f  ion *collide;  /
22b0: 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69  * Next action wi
22c0: 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
22d0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20   */.};../* Each 
22e0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e  state of the gen
22f0: 65 72 61 74 65 64 20 70 61 72 73 65 72 27 73 20  erated parser's 
2300: 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63  finite state mac
2310: 68 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64  hine.** is encod
2320: 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63  ed as an instanc
2330: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2340: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ng structure. */
2350: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a  .struct state {.
2360: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
2370: 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *bp;       /* Th
2380: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
2390: 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20  ations for this 
23a0: 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  state */.  struc
23b0: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20  t config *cfp;  
23c0: 20 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69      /* All confi
23d0: 67 75 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  gurations in thi
23e0: 73 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73  s set */.  int s
23f0: 74 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20  tatenum;        
2400: 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 74 69 61      /* Sequentia
2410: 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  l number for thi
2420: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  s state */.  str
2430: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20  uct action *ap; 
2440: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
2450: 66 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68  f actions for th
2460: 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e  is state */.  in
2470: 74 20 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63  t nTknAct, nNtAc
2480: 74 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  t;     /* Number
2490: 20 6f 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74   of actions on t
24a0: 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e  erminals and non
24b0: 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69  terminals */.  i
24c0: 6e 74 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74  nt iTknOfst, iNt
24d0: 4f 66 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63  Ofst;   /* yy_ac
24e0: 74 69 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f  tion[] offset fo
24f0: 72 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20  r terminals and 
2500: 6e 6f 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  nonterms */.  in
2510: 74 20 69 44 66 6c 74 3b 20 20 20 20 20 20 20 20  t iDflt;        
2520: 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c         /* Defaul
2530: 74 20 61 63 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23  t action */.};.#
2540: 64 65 66 69 6e 65 20 4e 4f 5f 4f 46 46 53 45 54  define NO_OFFSET
2550: 20 28 2d 32 31 34 37 34 38 33 36 34 37 29 0a 0a   (-2147483647)..
2560: 2f 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 70  /* A followset p
2570: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 20  ropagation link 
2580: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
2590: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6f  he contents of o
25a0: 6e 65 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74  ne.** configurat
25b0: 69 6f 6e 20 66 6f 6c 6c 6f 77 73 65 74 20 73 68  ion followset sh
25c0: 6f 75 6c 64 20 62 65 20 70 72 6f 70 61 67 61 74  ould be propagat
25d0: 65 64 20 74 6f 20 61 6e 6f 74 68 65 72 20 77 68  ed to another wh
25e0: 65 6e 65 76 65 72 0a 2a 2a 20 74 68 65 20 66 69  enever.** the fi
25f0: 72 73 74 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a  rst changes. */.
2600: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 7b 0a 20  struct plink {. 
2610: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
2620: 63 66 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  cfp;      /* The
2630: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74   configuration t
2640: 6f 20 77 68 69 63 68 20 6c 69 6e 6b 65 64 20 2a  o which linked *
2650: 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  /.  struct plink
2660: 20 2a 6e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20   *next;      /* 
2670: 54 68 65 20 6e 65 78 74 20 70 72 6f 70 61 67 61  The next propaga
2680: 74 65 20 6c 69 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f  te link */.};../
2690: 2a 20 54 68 65 20 73 74 61 74 65 20 76 65 63 74  * The state vect
26a0: 6f 72 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  or for the entir
26b0: 65 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  e parser generat
26c0: 6f 72 20 69 73 20 72 65 63 6f 72 64 65 64 20 61  or is recorded a
26d0: 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 2e 20 20 28  s.** follows.  (
26e0: 4c 45 4d 4f 4e 20 75 73 65 73 20 6e 6f 20 67 6c  LEMON uses no gl
26f0: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61  obal variables a
2700: 6e 64 20 6d 61 6b 65 73 20 6c 69 74 74 6c 65 20  nd makes little 
2710: 75 73 65 20 6f 66 0a 2a 2a 20 73 74 61 74 69 63  use of.** static
2720: 20 76 61 72 69 61 62 6c 65 73 2e 20 20 46 69 65   variables.  Fie
2730: 6c 64 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  lds in the follo
2740: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 63  wing structure c
2750: 61 6e 20 62 65 20 74 68 6f 75 67 68 74 0a 2a 2a  an be thought.**
2760: 20 6f 66 20 61 73 20 62 65 67 69 6e 20 67 6c 6f   of as begin glo
2770: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 69 6e  bal variables in
2780: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 29 20 2a   the program.) *
2790: 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 7b  /.struct lemon {
27a0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
27b0: 2a 2a 73 6f 72 74 65 64 3b 20 20 20 2f 2a 20 54  **sorted;   /* T
27c0: 61 62 6c 65 20 6f 66 20 73 74 61 74 65 73 20 73  able of states s
27d0: 6f 72 74 65 64 20 62 79 20 73 74 61 74 65 20 6e  orted by state n
27e0: 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63  umber */.  struc
27f0: 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20 20  t rule *rule;   
2800: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
2810: 6c 6c 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e  ll rules */.  in
2820: 74 20 6e 73 74 61 74 65 3b 20 20 20 20 20 20 20  t nstate;       
2830: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2840: 20 6f 66 20 73 74 61 74 65 73 20 2a 2f 0a 20 20   of states */.  
2850: 69 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20 20 20  int nrule;      
2860: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2870: 65 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a 20  er of rules */. 
2880: 20 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20 20   int nsymbol;   
2890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
28a0: 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20  ber of terminal 
28b0: 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20  and nonterminal 
28c0: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74  symbols */.  int
28d0: 20 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20   nterminal;     
28e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
28f0: 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  of terminal symb
2900: 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ols */.  struct 
2910: 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c 73  symbol **symbols
2920: 3b 20 2f 2a 20 53 6f 72 74 65 64 20 61 72 72 61  ; /* Sorted arra
2930: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  y of pointers to
2940: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e   symbols */.  in
2950: 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20  t errorcnt;     
2960: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2970: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
2980: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65  struct symbol *e
2990: 72 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20  rrsym;   /* The 
29a0: 65 72 72 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f 0a  error symbol */.
29b0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
29c0: 2a 77 69 6c 64 63 61 72 64 3b 20 2f 2a 20 54 6f  *wildcard; /* To
29d0: 6b 65 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73  ken that matches
29e0: 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 63   anything */.  c
29f0: 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20  har *name;      
2a00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2a10: 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
2a20: 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61   parser */.  cha
2a30: 72 20 2a 61 72 67 3b 20 20 20 20 20 20 20 20 20  r *arg;         
2a40: 20 20 20 20 20 20 2f 2a 20 44 65 63 6c 61 72 61        /* Declara
2a50: 74 69 6f 6e 20 6f 66 20 74 68 65 20 33 74 68 20  tion of the 3th 
2a60: 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73  argument to pars
2a70: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  er */.  char *to
2a80: 6b 65 6e 74 79 70 65 3b 20 20 20 20 20 20 20 20  kentype;        
2a90: 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 72 6d   /* Type of term
2aa0: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e 20  inal symbols in 
2ab0: 74 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b  the parser stack
2ac0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 74   */.  char *vart
2ad0: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ype;           /
2ae0: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 74 79  * The default ty
2af0: 70 65 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e  pe of non-termin
2b00: 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  al symbols */.  
2b10: 63 68 61 72 20 2a 73 74 61 72 74 3b 20 20 20 20  char *start;    
2b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2b30: 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 73 79   of the start sy
2b40: 6d 62 6f 6c 20 66 6f 72 20 74 68 65 20 67 72 61  mbol for the gra
2b50: 6d 6d 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mmar */.  char *
2b60: 73 74 61 63 6b 73 69 7a 65 3b 20 20 20 20 20 20  stacksize;      
2b70: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
2b80: 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a  e parser stack *
2b90: 2f 0a 20 20 63 68 61 72 20 2a 69 6e 63 6c 75 64  /.  char *includ
2ba0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2bb0: 43 6f 64 65 20 74 6f 20 70 75 74 20 61 74 20 74  Code to put at t
2bc0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
2bd0: 43 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  C file */.  char
2be0: 20 2a 65 72 72 6f 72 3b 20 20 20 20 20 20 20 20   *error;        
2bf0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
2c00: 65 78 65 63 75 74 65 20 77 68 65 6e 20 61 6e 20  execute when an 
2c10: 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f  error is seen */
2c20: 0a 20 20 63 68 61 72 20 2a 6f 76 65 72 66 6c 6f  .  char *overflo
2c30: 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  w;          /* C
2c40: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f  ode to execute o
2c50: 6e 20 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c  n a stack overfl
2c60: 6f 77 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 61  ow */.  char *fa
2c70: 69 6c 75 72 65 3b 20 20 20 20 20 20 20 20 20 20  ilure;          
2c80: 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63   /* Code to exec
2c90: 75 74 65 20 6f 6e 20 70 61 72 73 65 72 20 66 61  ute on parser fa
2ca0: 69 6c 75 72 65 20 2a 2f 0a 20 20 63 68 61 72 20  ilure */.  char 
2cb0: 2a 61 63 63 65 70 74 3b 20 20 20 20 20 20 20 20  *accept;        
2cc0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65      /* Code to e
2cd0: 78 65 63 75 74 65 20 77 68 65 6e 20 74 68 65 20  xecute when the 
2ce0: 70 61 72 73 65 72 20 65 78 63 65 70 74 73 20 2a  parser excepts *
2cf0: 2f 0a 20 20 63 68 61 72 20 2a 65 78 74 72 61 63  /.  char *extrac
2d00: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ode;         /* 
2d10: 43 6f 64 65 20 61 70 70 65 6e 64 65 64 20 74 6f  Code appended to
2d20: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 66   the generated f
2d30: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74  ile */.  char *t
2d40: 6f 6b 65 6e 64 65 73 74 3b 20 20 20 20 20 20 20  okendest;       
2d50: 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65    /* Code to exe
2d60: 63 75 74 65 20 74 6f 20 64 65 73 74 72 6f 79 20  cute to destroy 
2d70: 74 6f 6b 65 6e 20 64 61 74 61 20 2a 2f 0a 20 20  token data */.  
2d80: 63 68 61 72 20 2a 76 61 72 64 65 73 74 3b 20 20  char *vardest;  
2d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
2da0: 20 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74   for the default
2db0: 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64 65   non-terminal de
2dc0: 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63 68  structor */.  ch
2dd0: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20  ar *filename;   
2de0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2df0: 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
2e00: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e   */.  char *outn
2e10: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
2e20: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  * Name of the cu
2e30: 72 72 65 6e 74 20 6f 75 74 70 75 74 20 66 69 6c  rrent output fil
2e40: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  e */.  char *tok
2e50: 65 6e 70 72 65 66 69 78 3b 20 20 20 20 20 20 20  enprefix;       
2e60: 2f 2a 20 41 20 70 72 65 66 69 78 20 61 64 64 65  /* A prefix adde
2e70: 64 20 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73  d to token names
2e80: 20 69 6e 20 74 68 65 20 2e 68 20 66 69 6c 65 20   in the .h file 
2e90: 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69  */.  int nconfli
2ea0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct;           /*
2eb0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 73 69   Number of parsi
2ec0: 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a  ng conflicts */.
2ed0: 20 20 69 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b    int tablesize;
2ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2ef0: 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 20  ze of the parse 
2f00: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20  tables */.  int 
2f10: 62 61 73 69 73 66 6c 61 67 3b 20 20 20 20 20 20  basisflag;      
2f20: 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e       /* Print on
2f30: 6c 79 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  ly basis configu
2f40: 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  rations */.  int
2f50: 20 68 61 73 5f 66 61 6c 6c 62 61 63 6b 3b 20 20   has_fallback;  
2f60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2f70: 20 61 6e 79 20 25 66 61 6c 6c 62 61 63 6b 20 69   any %fallback i
2f80: 73 20 73 65 65 6e 20 69 6e 20 74 68 65 20 67 72  s seen in the gr
2f90: 61 6d 6d 61 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  ammar */.  int n
2fa0: 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 3b 20 20 20  olinenosflag;   
2fb0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 23      /* True if #
2fc0: 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 20  line statements 
2fd0: 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 72  should not be pr
2fe0: 69 6e 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  inted */.  char 
2ff0: 2a 61 72 67 76 30 3b 20 20 20 20 20 20 20 20 20  *argv0;         
3000: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
3010: 68 65 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b  he program */.};
3020: 0a 0a 23 64 65 66 69 6e 65 20 4d 65 6d 6f 72 79  ..#define Memory
3030: 43 68 65 63 6b 28 58 29 20 69 66 28 28 58 29 3d  Check(X) if((X)=
3040: 3d 30 29 7b 20 5c 0a 20 20 65 78 74 65 72 6e 20  =0){ \.  extern 
3050: 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  void memory_erro
3060: 72 28 29 3b 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f  r(); \.  memory_
3070: 65 72 72 6f 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a  error(); \.}../*
3080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
3090: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74  From the file "t
30a0: 61 62 6c 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  able.h" ********
30b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
30d0: 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69   All code in thi
30e0: 73 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  s file has been 
30f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
3100: 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  nerated.** from 
3110: 61 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  a specification 
3120: 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20  in the file.**  
3130: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62              "tab
3140: 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20  le.q".** by the 
3150: 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
3160: 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20  y code building 
3170: 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e  program "aagen".
3180: 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20  .** Do not edit 
3190: 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74  this file!  Inst
31a0: 65 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70  ead, edit the sp
31b0: 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66  ecification.** f
31c0: 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20  ile, then rerun 
31d0: 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  aagen..*/./*.** 
31e0: 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73  Code for process
31f0: 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68  ing tables in th
3200: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
3210: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 2f 2a 20  enerator..*/./* 
3220: 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e  Routines for han
3230: 64 6c 69 6e 67 20 61 20 73 74 72 69 6e 67 73 20  dling a strings 
3240: 2a 2f 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  */..const char *
3250: 53 74 72 73 61 66 65 28 63 6f 6e 73 74 20 63 68  Strsafe(const ch
3260: 61 72 20 2a 29 3b 0a 0a 76 6f 69 64 20 53 74 72  ar *);..void Str
3270: 73 61 66 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b  safe_init(void);
3280: 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73  .int Strsafe_ins
3290: 65 72 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ert(const char *
32a0: 29 3b 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53  );.const char *S
32b0: 74 72 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73  trsafe_find(cons
32c0: 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 20 52  t char *);../* R
32d0: 6f 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64  outines for hand
32e0: 6c 69 6e 67 20 73 79 6d 62 6f 6c 73 20 6f 66 20  ling symbols of 
32f0: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a  the grammar */..
3300: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
3310: 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74 20  ymbol_new(const 
3320: 63 68 61 72 20 2a 29 3b 0a 69 6e 74 20 53 79 6d  char *);.int Sym
3330: 62 6f 6c 63 6d 70 70 28 63 6f 6e 73 74 20 76 6f  bolcmpp(const vo
3340: 69 64 20 2a 2c 20 63 6f 6e 73 74 20 76 6f 69 64  id *, const void
3350: 20 2a 29 3b 0a 76 6f 69 64 20 53 79 6d 62 6f 6c   *);.void Symbol
3360: 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74  _init(void);.int
3370: 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73   Symbol_insert(s
3380: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2c 20  truct symbol *, 
3390: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73  const char *);.s
33a0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
33b0: 6d 62 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20  mbol_find(const 
33c0: 63 68 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20  char *);.struct 
33d0: 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e  symbol *Symbol_N
33e0: 74 68 28 69 6e 74 29 3b 0a 69 6e 74 20 53 79 6d  th(int);.int Sym
33f0: 62 6f 6c 5f 63 6f 75 6e 74 28 76 6f 69 64 29 3b  bol_count(void);
3400: 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
3410: 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28  *Symbol_arrayof(
3420: 76 6f 69 64 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69  void);../* Routi
3430: 6e 65 73 20 74 6f 20 6d 61 6e 61 67 65 20 74 68  nes to manage th
3440: 65 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f  e state table */
3450: 0a 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28  ..int Configcmp(
3460: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 63 6f  const char *, co
3470: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72  nst char *);.str
3480: 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65  uct state *State
3490: 5f 6e 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64  _new(void);.void
34a0: 20 53 74 61 74 65 5f 69 6e 69 74 28 76 6f 69 64   State_init(void
34b0: 29 3b 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73  );.int State_ins
34c0: 65 72 74 28 73 74 72 75 63 74 20 73 74 61 74 65  ert(struct state
34d0: 20 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69   *, struct confi
34e0: 67 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74 61  g *);.struct sta
34f0: 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 73  te *State_find(s
3500: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b  truct config *);
3510: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a  .struct state **
3520: 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28 2f 2a  State_arrayof(/*
3530: 20 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69    */);../* Routi
3540: 6e 65 73 20 75 73 65 64 20 66 6f 72 20 65 66 66  nes used for eff
3550: 69 63 69 65 6e 63 79 20 69 6e 20 43 6f 6e 66 69  iciency in Confi
3560: 67 6c 69 73 74 5f 61 64 64 20 2a 2f 0a 0a 76 6f  glist_add */..vo
3570: 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69  id Configtable_i
3580: 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 43  nit(void);.int C
3590: 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72  onfigtable_inser
35a0: 74 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  t(struct config 
35b0: 2a 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  *);.struct confi
35c0: 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66  g *Configtable_f
35d0: 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69  ind(struct confi
35e0: 67 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  g *);.void Confi
35f0: 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74  gtable_clear(int
3600: 28 2a 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69  (*)(struct confi
3610: 67 20 2a 29 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  g *));../*******
3620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
3630: 20 74 68 65 20 66 69 6c 65 20 22 61 63 74 69 6f   the file "actio
3640: 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.c" ***********
3650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3660: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ****/./*.** Rout
3670: 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20  ines processing 
3680: 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20 69  parser actions i
3690: 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
36a0: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
36b0: 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
36c0: 6e 65 77 20 70 61 72 73 65 72 20 61 63 74 69 6f  new parser actio
36d0: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  n */.static stru
36e0: 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f  ct action *Actio
36f0: 6e 5f 6e 65 77 28 76 6f 69 64 29 7b 0a 20 20 73  n_new(void){.  s
3700: 74 61 74 69 63 20 73 74 72 75 63 74 20 61 63 74  tatic struct act
3710: 69 6f 6e 20 2a 66 72 65 65 6c 69 73 74 20 3d 20  ion *freelist = 
3720: 30 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  0;.  struct acti
3730: 6f 6e 20 2a 6e 65 77 61 63 74 69 6f 6e 3b 0a 0a  on *newaction;..
3740: 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d    if( freelist==
3750: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
3760: 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30      int amt = 10
3770: 30 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20  0;.    freelist 
3780: 3d 20 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  = (struct action
3790: 20 2a 29 63 61 6c 6c 6f 63 28 61 6d 74 2c 20 73   *)calloc(amt, s
37a0: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 61 63 74  izeof(struct act
37b0: 69 6f 6e 29 29 3b 0a 20 20 20 20 69 66 28 20 66  ion));.    if( f
37c0: 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reelist==0 ){.  
37d0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
37e0: 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c  rr,"Unable to al
37f0: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
3800: 72 20 61 20 6e 65 77 20 70 61 72 73 65 72 20 61  r a new parser a
3810: 63 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20  ction.");.      
3820: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20  exit(1);.    }. 
3830: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d     for(i=0; i<am
3840: 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69  t-1; i++) freeli
3850: 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72  st[i].next = &fr
3860: 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20  eelist[i+1];.   
3870: 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d   freelist[amt-1]
3880: 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  .next = 0;.  }. 
3890: 20 6e 65 77 61 63 74 69 6f 6e 20 3d 20 66 72 65   newaction = fre
38a0: 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73  elist;.  freelis
38b0: 74 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65  t = freelist->ne
38c0: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77  xt;.  return new
38d0: 61 63 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f  action;.}../* Co
38e0: 6d 70 61 72 65 20 74 77 6f 20 61 63 74 69 6f 6e  mpare two action
38f0: 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75  s for sorting pu
3900: 72 70 6f 73 65 73 2e 20 20 52 65 74 75 72 6e 20  rposes.  Return 
3910: 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
3920: 6f 72 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 69  or.** positive i
3930: 66 20 74 68 65 20 66 69 72 73 74 20 61 63 74 69  f the first acti
3940: 6f 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  on is less than,
3950: 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
3960: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  eater than.** th
3970: 65 20 66 69 72 73 74 0a 2a 2f 0a 73 74 61 74 69  e first.*/.stati
3980: 63 20 69 6e 74 20 61 63 74 69 6f 6e 63 6d 70 28  c int actioncmp(
3990: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
39a0: 20 2a 61 70 31 2c 0a 20 20 73 74 72 75 63 74 20   *ap1,.  struct 
39b0: 61 63 74 69 6f 6e 20 2a 61 70 32 0a 29 7b 0a 20  action *ap2.){. 
39c0: 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
39d0: 61 70 31 2d 3e 73 70 2d 3e 69 6e 64 65 78 20 2d  ap1->sp->index -
39e0: 20 61 70 32 2d 3e 73 70 2d 3e 69 6e 64 65 78 3b   ap2->sp->index;
39f0: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
3a00: 20 20 20 20 72 63 20 3d 20 28 69 6e 74 29 61 70      rc = (int)ap
3a10: 31 2d 3e 74 79 70 65 20 2d 20 28 69 6e 74 29 61  1->type - (int)a
3a20: 70 32 2d 3e 74 79 70 65 3b 0a 20 20 7d 0a 20 20  p2->type;.  }.  
3a30: 69 66 28 20 72 63 3d 3d 30 20 26 26 20 61 70 31  if( rc==0 && ap1
3a40: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29  ->type==REDUCE )
3a50: 7b 0a 20 20 20 20 72 63 20 3d 20 61 70 31 2d 3e  {.    rc = ap1->
3a60: 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70  x.rp->index - ap
3a70: 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 3b 0a  2->x.rp->index;.
3a80: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20    }.  if( rc==0 
3a90: 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 70 32 20  ){.    rc = ap2 
3aa0: 2d 20 61 70 31 3b 0a 20 20 7d 0a 20 20 72 65 74  - ap1;.  }.  ret
3ab0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f  urn rc;.}../* So
3ac0: 72 74 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e  rt parser action
3ad0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  s */.static stru
3ae0: 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f  ct action *Actio
3af0: 6e 5f 73 6f 72 74 28 0a 20 20 73 74 72 75 63 74  n_sort(.  struct
3b00: 20 61 63 74 69 6f 6e 20 2a 61 70 0a 29 7b 0a 20   action *ap.){. 
3b10: 20 61 70 20 3d 20 28 73 74 72 75 63 74 20 61 63   ap = (struct ac
3b20: 74 69 6f 6e 20 2a 29 6d 73 6f 72 74 28 28 63 68  tion *)msort((ch
3b30: 61 72 20 2a 29 61 70 2c 28 63 68 61 72 20 2a 2a  ar *)ap,(char **
3b40: 29 26 61 70 2d 3e 6e 65 78 74 2c 0a 20 20 20 20  )&ap->next,.    
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 28 2a            (int(*
3b70: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
3b80: 6e 73 74 20 63 68 61 72 2a 29 29 61 63 74 69 6f  nst char*))actio
3b90: 6e 63 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ncmp);.  return 
3ba0: 61 70 3b 0a 7d 0a 0a 76 6f 69 64 20 41 63 74 69  ap;.}..void Acti
3bb0: 6f 6e 5f 61 64 64 28 0a 20 20 73 74 72 75 63 74  on_add(.  struct
3bc0: 20 61 63 74 69 6f 6e 20 2a 2a 61 70 70 2c 0a 20   action **app,. 
3bd0: 20 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74   enum e_action t
3be0: 79 70 65 2c 0a 20 20 73 74 72 75 63 74 20 73 79  ype,.  struct sy
3bf0: 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20 63 68 61 72  mbol *sp,.  char
3c00: 20 2a 61 72 67 0a 29 7b 0a 20 20 73 74 72 75 63   *arg.){.  struc
3c10: 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 61 63 74  t action *newact
3c20: 69 6f 6e 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e  ion;.  newaction
3c30: 20 3d 20 41 63 74 69 6f 6e 5f 6e 65 77 28 29 3b   = Action_new();
3c40: 0a 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 6e 65  .  newaction->ne
3c50: 78 74 20 3d 20 2a 61 70 70 3b 0a 20 20 2a 61 70  xt = *app;.  *ap
3c60: 70 20 3d 20 6e 65 77 61 63 74 69 6f 6e 3b 0a 20  p = newaction;. 
3c70: 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 74 79 70 65   newaction->type
3c80: 20 3d 20 74 79 70 65 3b 0a 20 20 6e 65 77 61 63   = type;.  newac
3c90: 74 69 6f 6e 2d 3e 73 70 20 3d 20 73 70 3b 0a 20  tion->sp = sp;. 
3ca0: 20 69 66 28 20 74 79 70 65 3d 3d 53 48 49 46 54   if( type==SHIFT
3cb0: 20 29 7b 0a 20 20 20 20 6e 65 77 61 63 74 69 6f   ){.    newactio
3cc0: 6e 2d 3e 78 2e 73 74 70 20 3d 20 28 73 74 72 75  n->x.stp = (stru
3cd0: 63 74 20 73 74 61 74 65 20 2a 29 61 72 67 3b 0a  ct state *)arg;.
3ce0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 65 77    }else{.    new
3cf0: 61 63 74 69 6f 6e 2d 3e 78 2e 72 70 20 3d 20 28  action->x.rp = (
3d00: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29 61 72  struct rule *)ar
3d10: 67 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  g;.  }.}./******
3d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d30: 20 4e 65 77 20 63 6f 64 65 20 74 6f 20 69 6d 70   New code to imp
3d40: 6c 65 6d 65 6e 74 20 74 68 65 20 22 61 63 74 74  lement the "actt
3d50: 61 62 22 20 6d 6f 64 75 6c 65 20 2a 2a 2a 2a 2a  ab" module *****
3d60: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  ******/./*.** Th
3d70: 69 73 20 6d 6f 64 75 6c 65 20 69 6d 70 6c 65 6d  is module implem
3d80: 65 6e 74 73 20 72 6f 75 74 69 6e 65 73 20 75 73  ents routines us
3d90: 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  e to construct t
3da0: 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74  he yy_action[] t
3db0: 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  able..*/../*.** 
3dc0: 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  The state of the
3dd0: 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65   yy_action table
3de0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
3df0: 69 6f 6e 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  ion is an instan
3e00: 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c  ce of.** the fol
3e10: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
3e20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 79 79 5f 61  ..**.** The yy_a
3e30: 63 74 69 6f 6e 20 74 61 62 6c 65 20 6d 61 70 73  ction table maps
3e40: 20 74 68 65 20 70 61 69 72 20 28 73 74 61 74 65   the pair (state
3e50: 5f 6e 75 6d 62 65 72 2c 20 6c 6f 6f 6b 61 68 65  _number, lookahe
3e60: 61 64 29 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 61  ad) into an.** a
3e70: 63 74 69 6f 6e 5f 6e 75 6d 62 65 72 2e 20 20 54  ction_number.  T
3e80: 68 65 20 74 61 62 6c 65 20 69 73 20 61 6e 20 61  he table is an a
3e90: 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73  rray of integers
3ea0: 20 70 61 69 72 73 2e 20 20 54 68 65 20 73 74 61   pairs.  The sta
3eb0: 74 65 5f 6e 75 6d 62 65 72 0a 2a 2a 20 64 65 74  te_number.** det
3ec0: 65 72 6d 69 6e 65 73 20 61 6e 20 69 6e 69 74 69  ermines an initi
3ed0: 61 6c 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74  al offset into t
3ee0: 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 61 72 72  he yy_action arr
3ef0: 61 79 2e 20 20 54 68 65 20 6c 6f 6f 6b 61 68 65  ay.  The lookahe
3f00: 61 64 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 74  ad.** value is t
3f10: 68 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68 69  hen added to thi
3f20: 73 20 69 6e 69 74 69 61 6c 20 6f 66 66 73 65 74  s initial offset
3f30: 20 74 6f 20 67 65 74 20 61 6e 20 69 6e 64 65 78   to get an index
3f40: 20 58 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 79   X into the.** y
3f50: 79 5f 61 63 74 69 6f 6e 20 61 72 72 61 79 2e 20  y_action array. 
3f60: 49 66 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 58  If the aAction[X
3f70: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 65 71 75 61  ].lookahead equa
3f80: 6c 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ls the value of 
3f90: 74 68 65 0a 2a 2a 20 6f 66 20 74 68 65 20 6c 6f  the.** of the lo
3fa0: 6f 6b 61 68 65 61 64 20 69 6e 70 75 74 2c 20 74  okahead input, t
3fb0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
3fc0: 20 74 68 65 20 61 63 74 69 6f 6e 5f 6e 75 6d 62   the action_numb
3fd0: 65 72 20 6f 75 74 70 75 74 20 69 73 0a 2a 2a 20  er output is.** 
3fe0: 61 41 63 74 69 6f 6e 5b 58 5d 2e 61 63 74 69 6f  aAction[X].actio
3ff0: 6e 2e 20 20 49 66 20 74 68 65 20 6c 6f 6f 6b 61  n.  If the looka
4000: 68 65 61 64 73 20 64 6f 20 6e 6f 74 20 6d 61 74  heads do not mat
4010: 63 68 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 64  ch then the.** d
4020: 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 66 6f  efault action fo
4030: 72 20 74 68 65 20 73 74 61 74 65 5f 6e 75 6d 62  r the state_numb
4040: 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  er is returned..
4050: 2a 2a 0a 2a 2a 20 41 6c 6c 20 61 63 74 69 6f 6e  **.** All action
4060: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
4070: 68 20 61 20 73 69 6e 67 6c 65 20 73 74 61 74 65  h a single state
4080: 5f 6e 75 6d 62 65 72 20 61 72 65 20 66 69 72 73  _number are firs
4090: 74 20 65 6e 74 65 72 65 64 0a 2a 2a 20 69 6e 74  t entered.** int
40a0: 6f 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 75  o aLookahead[] u
40b0: 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 63 61  sing multiple ca
40c0: 6c 6c 73 20 74 6f 20 61 63 74 74 61 62 5f 61 63  lls to acttab_ac
40d0: 74 69 6f 6e 28 29 2e 20 20 54 68 65 6e 20 74 68  tion().  Then th
40e0: 65 20 0a 2a 2a 20 61 63 74 69 6f 6e 73 20 66 6f  e .** actions fo
40f0: 72 20 74 68 61 74 20 73 69 6e 67 6c 65 20 73 74  r that single st
4100: 61 74 65 5f 6e 75 6d 62 65 72 20 61 72 65 20 70  ate_number are p
4110: 6c 61 63 65 64 20 69 6e 74 6f 20 74 68 65 20 61  laced into the a
4120: 41 63 74 69 6f 6e 5b 5d 20 0a 2a 2a 20 61 72 72  Action[] .** arr
4130: 61 79 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ay with a single
4140: 20 63 61 6c 6c 20 74 6f 20 61 63 74 74 61 62 5f   call to acttab_
4150: 69 6e 73 65 72 74 28 29 2e 20 20 54 68 65 20 61  insert().  The a
4160: 63 74 74 61 62 5f 69 6e 73 65 72 74 28 29 20 63  cttab_insert() c
4170: 61 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 72 65 73 65  all.** also rese
4180: 74 73 20 74 68 65 20 61 4c 6f 6f 6b 61 68 65 61  ts the aLookahea
4190: 64 5b 5d 20 61 72 72 61 79 20 69 6e 20 70 72 65  d[] array in pre
41a0: 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  paration for the
41b0: 20 6e 65 78 74 0a 2a 2a 20 73 74 61 74 65 20 6e   next.** state n
41c0: 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 72 75 63 74  umber..*/.struct
41d0: 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74 69 6f   lookahead_actio
41e0: 6e 20 7b 0a 20 20 69 6e 74 20 6c 6f 6f 6b 61 68  n {.  int lookah
41f0: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
4200: 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65   /* Value of the
4210: 20 6c 6f 6f 6b 61 68 65 61 64 20 74 6f 6b 65 6e   lookahead token
4220: 20 2a 2f 0a 20 20 69 6e 74 20 61 63 74 69 6f 6e   */.  int action
4230: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4240: 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20 74 61   /* Action to ta
4250: 6b 65 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ke on the given 
4260: 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 7d 3b 0a  lookahead */.};.
4270: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61  typedef struct a
4280: 63 74 74 61 62 20 61 63 74 74 61 62 3b 0a 73 74  cttab acttab;.st
4290: 72 75 63 74 20 61 63 74 74 61 62 20 7b 0a 20 20  ruct acttab {.  
42a0: 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20 20 20  int nAction;    
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
42c0: 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 64 20 73  Number of used s
42d0: 6c 6f 74 73 20 69 6e 20 61 41 63 74 69 6f 6e 5b  lots in aAction[
42e0: 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69  ] */.  int nActi
42f0: 6f 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  onAlloc;        
4300: 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c      /* Slots all
4310: 6f 63 61 74 65 64 20 66 6f 72 20 61 41 63 74 69  ocated for aActi
4320: 6f 6e 5b 5d 20 2a 2f 0a 20 20 73 74 72 75 63 74  on[] */.  struct
4330: 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74 69 6f   lookahead_actio
4340: 6e 0a 20 20 20 20 2a 61 41 63 74 69 6f 6e 2c 20  n.    *aAction, 
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4360: 20 2f 2a 20 54 68 65 20 79 79 5f 61 63 74 69 6f   /* The yy_actio
4370: 6e 5b 5d 20 74 61 62 6c 65 20 75 6e 64 65 72 20  n[] table under 
4380: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
4390: 20 20 20 20 2a 61 4c 6f 6f 6b 61 68 65 61 64 3b      *aLookahead;
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43b0: 2a 20 41 20 73 69 6e 67 6c 65 20 6e 65 77 20 74  * A single new t
43c0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 2a  ransaction set *
43d0: 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f 6f 6b 61 68  /.  int mnLookah
43e0: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
43f0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 4c 6f 6f   /* Minimum aLoo
4400: 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65  kahead[].lookahe
4410: 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 41 63  ad */.  int mnAc
4420: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tion;           
4430: 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20 61       /* Action a
4440: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6d  ssociated with m
4450: 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20  nLookahead */.  
4460: 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b  int mxLookahead;
4470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4480: 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65  Maximum aLookahe
4490: 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a  ad[].lookahead *
44a0: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65  /.  int nLookahe
44b0: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
44c0: 20 2f 2a 20 55 73 65 64 20 73 6c 6f 74 73 20 69   /* Used slots i
44d0: 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a  n aLookahead[] *
44e0: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65  /.  int nLookahe
44f0: 61 64 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  adAlloc;        
4500: 20 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61   /* Slots alloca
4510: 74 65 64 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61  ted in aLookahea
4520: 64 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65  d[] */.};../* Re
4530: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
4540: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
4550: 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c  e yy_action tabl
4560: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74  e */.#define act
4570: 74 61 62 5f 73 69 7a 65 28 58 29 20 28 28 58 29  tab_size(X) ((X)
4580: 2d 3e 6e 41 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54  ->nAction)../* T
4590: 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  he value for the
45a0: 20 4e 2d 74 68 20 65 6e 74 72 79 20 69 6e 20 79   N-th entry in y
45b0: 79 5f 61 63 74 69 6f 6e 20 2a 2f 0a 23 64 65 66  y_action */.#def
45c0: 69 6e 65 20 61 63 74 74 61 62 5f 79 79 61 63 74  ine acttab_yyact
45d0: 69 6f 6e 28 58 2c 4e 29 20 20 28 28 58 29 2d 3e  ion(X,N)  ((X)->
45e0: 61 41 63 74 69 6f 6e 5b 4e 5d 2e 61 63 74 69 6f  aAction[N].actio
45f0: 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75 65  n)../* The value
4600: 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 65 6e   for the N-th en
4610: 74 72 79 20 69 6e 20 79 79 5f 6c 6f 6f 6b 61 68  try in yy_lookah
4620: 65 61 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61  ead */.#define a
4630: 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61  cttab_yylookahea
4640: 64 28 58 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41  d(X,N)  ((X)->aA
4650: 63 74 69 6f 6e 5b 4e 5d 2e 6c 6f 6f 6b 61 68 65  ction[N].lookahe
4660: 61 64 29 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c  ad)../* Free all
4670: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
4680: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
4690: 6e 20 61 63 74 74 61 62 20 2a 2f 0a 76 6f 69 64  n acttab */.void
46a0: 20 61 63 74 74 61 62 5f 66 72 65 65 28 61 63 74   acttab_free(act
46b0: 74 61 62 20 2a 70 29 7b 0a 20 20 66 72 65 65 28  tab *p){.  free(
46c0: 20 70 2d 3e 61 41 63 74 69 6f 6e 20 29 3b 0a 20   p->aAction );. 
46d0: 20 66 72 65 65 28 20 70 2d 3e 61 4c 6f 6f 6b 61   free( p->aLooka
46e0: 68 65 61 64 20 29 3b 0a 20 20 66 72 65 65 28 20  head );.  free( 
46f0: 70 20 29 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63  p );.}../* Alloc
4700: 61 74 65 20 61 20 6e 65 77 20 61 63 74 74 61 62  ate a new acttab
4710: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 61 63   structure */.ac
4720: 74 74 61 62 20 2a 61 63 74 74 61 62 5f 61 6c 6c  ttab *acttab_all
4730: 6f 63 28 76 6f 69 64 29 7b 0a 20 20 61 63 74 74  oc(void){.  actt
4740: 61 62 20 2a 70 20 3d 20 28 61 63 74 74 61 62 20  ab *p = (acttab 
4750: 2a 29 20 63 61 6c 6c 6f 63 28 20 31 2c 20 73 69  *) calloc( 1, si
4760: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
4770: 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  ( p==0 ){.    fp
4780: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e  rintf(stderr,"Un
4790: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
47a0: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65   memory for a ne
47b0: 77 20 61 63 74 74 61 62 2e 22 29 3b 0a 20 20 20  w acttab.");.   
47c0: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
47d0: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
47e0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 72 65 74 75  eof(*p));.  retu
47f0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20  rn p;.}../* Add 
4800: 61 20 6e 65 77 20 61 63 74 69 6f 6e 20 74 6f 20  a new action to 
4810: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
4820: 73 61 63 74 69 6f 6e 20 73 65 74 2e 20 20 0a 2a  saction set.  .*
4830: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4840: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
4850: 20 66 6f 72 20 65 61 63 68 20 6c 6f 6f 6b 61 68   for each lookah
4860: 65 61 64 20 66 6f 72 20 61 20 70 61 72 74 69 63  ead for a partic
4870: 75 6c 61 72 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a  ular.** state..*
4880: 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 61 63  /.void acttab_ac
4890: 74 69 6f 6e 28 61 63 74 74 61 62 20 2a 70 2c 20  tion(acttab *p, 
48a0: 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 2c 20 69  int lookahead, i
48b0: 6e 74 20 61 63 74 69 6f 6e 29 7b 0a 20 20 69 66  nt action){.  if
48c0: 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e  ( p->nLookahead>
48d0: 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c  =p->nLookaheadAl
48e0: 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c  loc ){.    p->nL
48f0: 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 2b 3d  ookaheadAlloc +=
4900: 20 32 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 6f 6f   25;.    p->aLoo
4910: 6b 61 68 65 61 64 20 3d 20 28 73 74 72 75 63 74  kahead = (struct
4920: 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74 69 6f   lookahead_actio
4930: 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28 20 70 2d  n *) realloc( p-
4940: 3e 61 4c 6f 6f 6b 61 68 65 61 64 2c 0a 20 20 20  >aLookahead,.   
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4960: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
4970: 28 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 30  (p->aLookahead[0
4980: 5d 29 2a 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  ])*p->nLookahead
4990: 41 6c 6c 6f 63 20 29 3b 0a 20 20 20 20 69 66 28  Alloc );.    if(
49a0: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 3d 3d   p->aLookahead==
49b0: 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
49c0: 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f  tf(stderr,"mallo
49d0: 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20  c failed\n");.  
49e0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
49f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
4a00: 6e 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29 7b  nLookahead==0 ){
4a10: 0a 20 20 20 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68  .    p->mxLookah
4a20: 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b  ead = lookahead;
4a30: 0a 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68  .    p->mnLookah
4a40: 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b  ead = lookahead;
4a50: 0a 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e  .    p->mnAction
4a60: 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 7d 65 6c   = action;.  }el
4a70: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d  se{.    if( p->m
4a80: 78 4c 6f 6f 6b 61 68 65 61 64 3c 6c 6f 6f 6b 61  xLookahead<looka
4a90: 68 65 61 64 20 29 20 70 2d 3e 6d 78 4c 6f 6f 6b  head ) p->mxLook
4aa0: 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61  ahead = lookahea
4ab0: 64 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 6e  d;.    if( p->mn
4ac0: 4c 6f 6f 6b 61 68 65 61 64 3e 6c 6f 6f 6b 61 68  Lookahead>lookah
4ad0: 65 61 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ead ){.      p->
4ae0: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f  mnLookahead = lo
4af0: 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 20 20 70  okahead;.      p
4b00: 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63 74  ->mnAction = act
4b10: 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ion;.    }.  }. 
4b20: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 70   p->aLookahead[p
4b30: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 6c 6f  ->nLookahead].lo
4b40: 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68  okahead = lookah
4b50: 65 61 64 3b 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61  ead;.  p->aLooka
4b60: 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  head[p->nLookahe
4b70: 61 64 5d 2e 61 63 74 69 6f 6e 20 3d 20 61 63 74  ad].action = act
4b80: 69 6f 6e 3b 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61  ion;.  p->nLooka
4b90: 68 65 61 64 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  head++;.}../*.**
4ba0: 20 41 64 64 20 74 68 65 20 74 72 61 6e 73 61 63   Add the transac
4bb0: 74 69 6f 6e 20 73 65 74 20 62 75 69 6c 74 20 75  tion set built u
4bc0: 70 20 77 69 74 68 20 70 72 69 6f 72 20 63 61 6c  p with prior cal
4bd0: 6c 73 20 74 6f 20 61 63 74 74 61 62 5f 61 63 74  ls to acttab_act
4be0: 69 6f 6e 28 29 0a 2a 2a 20 69 6e 74 6f 20 74 68  ion().** into th
4bf0: 65 20 63 75 72 72 65 6e 74 20 61 63 74 69 6f 6e  e current action
4c00: 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 72 65   table.  Then re
4c10: 73 65 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  set the transact
4c20: 69 6f 6e 20 73 65 74 20 62 61 63 6b 0a 2a 2a 20  ion set back.** 
4c30: 74 6f 20 61 6e 20 65 6d 70 74 79 20 73 65 74 20  to an empty set 
4c40: 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66  in preparation f
4c50: 6f 72 20 61 20 6e 65 77 20 72 6f 75 6e 64 20 6f  or a new round o
4c60: 66 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28  f acttab_action(
4c70: 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 52  ) calls..**.** R
4c80: 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
4c90: 20 69 6e 74 6f 20 74 68 65 20 61 63 74 69 6f 6e   into the action
4ca0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6e 65   table of the ne
4cb0: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
4cc0: 2f 0a 69 6e 74 20 61 63 74 74 61 62 5f 69 6e 73  /.int acttab_ins
4cd0: 65 72 74 28 61 63 74 74 61 62 20 2a 70 29 7b 0a  ert(acttab *p){.
4ce0: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e    int i, j, k, n
4cf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
4d00: 4c 6f 6f 6b 61 68 65 61 64 3e 30 20 29 3b 0a 0a  Lookahead>0 );..
4d10: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
4d20: 65 20 68 61 76 65 20 65 6e 6f 75 67 68 20 73 70  e have enough sp
4d30: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
4d40: 65 78 70 61 6e 64 65 64 20 61 63 74 69 6f 6e 20  expanded action 
4d50: 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74 68  table.  ** in th
4d60: 65 20 77 6f 72 73 74 20 63 61 73 65 2e 20 20 54  e worst case.  T
4d70: 68 65 20 77 6f 72 73 74 20 63 61 73 65 20 6f 63  he worst case oc
4d80: 63 75 72 73 20 69 66 20 74 68 65 20 74 72 61 6e  curs if the tran
4d90: 73 61 63 74 69 6f 6e 20 73 65 74 0a 20 20 2a 2a  saction set.  **
4da0: 20 6d 75 73 74 20 62 65 20 61 70 70 65 6e 64 65   must be appende
4db0: 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  d to the current
4dc0: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20   action table.  
4dd0: 2a 2f 0a 20 20 6e 20 3d 20 70 2d 3e 6d 78 4c 6f  */.  n = p->mxLo
4de0: 6f 6b 61 68 65 61 64 20 2b 20 31 3b 0a 20 20 69  okahead + 1;.  i
4df0: 66 28 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20  f( p->nAction + 
4e00: 6e 20 3e 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41  n >= p->nActionA
4e10: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  lloc ){.    int 
4e20: 6f 6c 64 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41  oldAlloc = p->nA
4e30: 63 74 69 6f 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20  ctionAlloc;.    
4e40: 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20  p->nActionAlloc 
4e50: 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e  = p->nAction + n
4e60: 20 2b 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c   + p->nActionAll
4e70: 6f 63 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e  oc + 20;.    p->
4e80: 61 41 63 74 69 6f 6e 20 3d 20 28 73 74 72 75 63  aAction = (struc
4e90: 74 20 6c 6f 6f 6b 61 68 65 61 64 5f 61 63 74 69  t lookahead_acti
4ea0: 6f 6e 20 2a 29 20 72 65 61 6c 6c 6f 63 28 20 70  on *) realloc( p
4eb0: 2d 3e 61 41 63 74 69 6f 6e 2c 0a 20 20 20 20 20  ->aAction,.     
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61       sizeof(p->a
4ee0: 41 63 74 69 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e 41  Action[0])*p->nA
4ef0: 63 74 69 6f 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20  ctionAlloc);.   
4f00: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 3d   if( p->aAction=
4f10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
4f20: 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c  ntf(stderr,"mall
4f30: 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20  oc failed\n");. 
4f40: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
4f50: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6f 6c    }.    for(i=ol
4f60: 64 41 6c 6c 6f 63 3b 20 69 3c 70 2d 3e 6e 41 63  dAlloc; i<p->nAc
4f70: 74 69 6f 6e 41 6c 6c 6f 63 3b 20 69 2b 2b 29 7b  tionAlloc; i++){
4f80: 0a 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f  .      p->aActio
4f90: 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d  n[i].lookahead =
4fa0: 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 61 41   -1;.      p->aA
4fb0: 63 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e 20  ction[i].action 
4fc0: 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = -1;.    }.  }.
4fd0: 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 65  .  /* Scan the e
4fe0: 78 69 73 74 69 6e 67 20 61 63 74 69 6f 6e 20 74  xisting action t
4ff0: 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  able looking for
5000: 20 61 6e 20 6f 66 66 73 65 74 20 74 68 61 74 20   an offset that 
5010: 69 73 20 61 20 0a 20 20 2a 2a 20 64 75 70 6c 69  is a .  ** dupli
5020: 63 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 72  cate of the curr
5030: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
5040: 73 65 74 2e 20 20 46 61 6c 6c 20 6f 75 74 20 6f  set.  Fall out o
5050: 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2a 20  f the loop.  ** 
5060: 69 66 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20  if and when the 
5070: 64 75 70 6c 69 63 61 74 65 20 69 73 20 66 6f 75  duplicate is fou
5080: 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 20  nd..  **.  ** i 
5090: 69 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  is the index in 
50a0: 70 2d 3e 61 41 63 74 69 6f 6e 5b 5d 20 77 68 65  p->aAction[] whe
50b0: 72 65 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61  re p->mnLookahea
50c0: 64 20 69 73 20 69 6e 73 65 72 74 65 64 2e 0a 20  d is inserted.. 
50d0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e   */.  for(i=p->n
50e0: 41 63 74 69 6f 6e 2d 31 3b 20 69 3e 3d 30 3b 20  Action-1; i>=0; 
50f0: 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  i--){.    if( p-
5100: 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b  >aAction[i].look
5110: 61 68 65 61 64 3d 3d 70 2d 3e 6d 6e 4c 6f 6f 6b  ahead==p->mnLook
5120: 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 2f  ahead ){.      /
5130: 2a 20 41 6c 6c 20 6c 6f 6f 6b 61 68 65 61 64 73  * All lookaheads
5140: 20 61 6e 64 20 61 63 74 69 6f 6e 73 20 69 6e 20   and actions in 
5150: 74 68 65 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d  the aLookahead[]
5160: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
5170: 20 20 20 2a 2a 20 6d 75 73 74 20 6d 61 74 63 68     ** must match
5180: 20 61 67 61 69 6e 73 74 20 74 68 65 20 63 61 6e   against the can
5190: 64 69 64 61 74 65 20 61 41 63 74 69 6f 6e 5b 69  didate aAction[i
51a0: 5d 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 20 20  ] entry. */.    
51b0: 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e    if( p->aAction
51c0: 5b 69 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 6d  [i].action!=p->m
51d0: 6e 41 63 74 69 6f 6e 20 29 20 63 6f 6e 74 69 6e  nAction ) contin
51e0: 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ue;.      for(j=
51f0: 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  0; j<p->nLookahe
5200: 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ad; j++){.      
5210: 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68    k = p->aLookah
5220: 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ead[j].lookahead
5230: 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61   - p->mnLookahea
5240: 64 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 69  d + i;.        i
5250: 66 28 20 6b 3c 30 20 7c 7c 20 6b 3e 3d 70 2d 3e  f( k<0 || k>=p->
5260: 6e 41 63 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b  nAction ) break;
5270: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
5280: 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f  aLookahead[j].lo
5290: 6f 6b 61 68 65 61 64 21 3d 70 2d 3e 61 41 63 74  okahead!=p->aAct
52a0: 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[k].lookahead
52b0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
52c0: 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68    if( p->aLookah
52d0: 65 61 64 5b 6a 5d 2e 61 63 74 69 6f 6e 21 3d 70  ead[j].action!=p
52e0: 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 61 63 74  ->aAction[k].act
52f0: 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ion ) break;.   
5300: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
5310: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  <p->nLookahead )
5320: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
5330: 20 20 2f 2a 20 4e 6f 20 70 6f 73 73 69 62 6c 65    /* No possible
5340: 20 6c 6f 6f 6b 61 68 65 61 64 20 76 61 6c 75 65   lookahead value
5350: 20 74 68 61 74 20 69 73 20 6e 6f 74 20 69 6e 20   that is not in 
5360: 74 68 65 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d  the aLookahead[]
5370: 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
5380: 63 74 69 6f 6e 20 69 73 20 61 6c 6c 6f 77 65 64  ction is allowed
5390: 20 74 6f 20 6d 61 74 63 68 20 61 41 63 74 69 6f   to match aActio
53a0: 6e 5b 69 5d 20 2a 2f 0a 20 20 20 20 20 20 6e 20  n[i] */.      n 
53b0: 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  = 0;.      for(j
53c0: 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e  =0; j<p->nAction
53d0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
53e0: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a  if( p->aAction[j
53f0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 20  ].lookahead<0 ) 
5400: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
5410: 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e    if( p->aAction
5420: 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a  [j].lookahead==j
5430: 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d  +p->mnLookahead-
5440: 69 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d  i ) n++;.      }
5450: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 70 2d  .      if( n==p-
5460: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20  >nLookahead ){. 
5470: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 2f         break;  /
5480: 2a 20 41 6e 20 65 78 61 63 74 20 6d 61 74 63 68  * An exact match
5490: 20 69 73 20 66 6f 75 6e 64 20 61 74 20 6f 66 66   is found at off
54a0: 73 65 74 20 69 20 2a 2f 0a 20 20 20 20 20 20 7d  set i */.      }
54b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
54c0: 20 49 66 20 6e 6f 20 65 78 69 73 74 69 6e 67 20   If no existing 
54d0: 6f 66 66 73 65 74 73 20 65 78 61 63 74 6c 79 20  offsets exactly 
54e0: 6d 61 74 63 68 20 74 68 65 20 63 75 72 72 65 6e  match the curren
54f0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  t transaction, f
5500: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 61 6e 20 65  ind an.  ** an e
5510: 6d 70 74 79 20 6f 66 66 73 65 74 20 69 6e 20 74  mpty offset in t
5520: 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 74 61 62  he aAction[] tab
5530: 6c 65 20 69 6e 20 77 68 69 63 68 20 77 65 20 63  le in which we c
5540: 61 6e 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20  an add the.  ** 
5550: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61  aLookahead[] tra
5560: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
5570: 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
5580: 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 68 6f 6c 65  /* Look for hole
5590: 73 20 69 6e 20 74 68 65 20 61 41 63 74 69 6f 6e  s in the aAction
55a0: 5b 5d 20 74 61 62 6c 65 20 74 68 61 74 20 66 69  [] table that fi
55b0: 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  t the current.  
55c0: 20 20 2a 2a 20 61 4c 6f 6f 6b 61 68 65 61 64 5b    ** aLookahead[
55d0: 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  ] transaction.  
55e0: 4c 65 61 76 65 20 69 20 73 65 74 20 74 6f 20 74  Leave i set to t
55f0: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  he offset of the
5600: 20 68 6f 6c 65 2e 0a 20 20 20 20 2a 2a 20 49 66   hole..    ** If
5610: 20 6e 6f 20 68 6f 6c 65 73 20 61 72 65 20 66 6f   no holes are fo
5620: 75 6e 64 2c 20 69 20 69 73 20 6c 65 66 74 20 61  und, i is left a
5630: 74 20 70 2d 3e 6e 41 63 74 69 6f 6e 2c 20 77 68  t p->nAction, wh
5640: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  ich means the.  
5650: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
5660: 20 77 69 6c 6c 20 62 65 20 61 70 70 65 6e 64 65   will be appende
5670: 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  d. */.    for(i=
5680: 30 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41  0; i<p->nActionA
5690: 6c 6c 6f 63 20 2d 20 70 2d 3e 6d 78 4c 6f 6f 6b  lloc - p->mxLook
56a0: 61 68 65 61 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ahead; i++){.   
56b0: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
56c0: 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30  n[i].lookahead<0
56d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
56e0: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61  j=0; j<p->nLooka
56f0: 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  head; j++){.    
5700: 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f        k = p->aLo
5710: 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61  okahead[j].looka
5720: 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b  head - p->mnLook
5730: 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20 20  ahead + i;.     
5740: 20 20 20 20 20 69 66 28 20 6b 3c 30 20 29 20 62       if( k<0 ) b
5750: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
5760: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b  if( p->aAction[k
5770: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e 3d 30 20 29  ].lookahead>=0 )
5780: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5790: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  }.        if( j<
57a0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20  p->nLookahead ) 
57b0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
57c0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
57d0: 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20  nAction; j++){. 
57e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
57f0: 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61  aAction[j].looka
5800: 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f  head==j+p->mnLoo
5810: 6b 61 68 65 61 64 2d 69 20 29 20 62 72 65 61 6b  kahead-i ) break
5820: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5830: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 41      if( j==p->nA
5840: 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
5850: 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 46 69     break;  /* Fi
5860: 74 73 20 69 6e 20 65 6d 70 74 79 20 73 6c 6f 74  ts in empty slot
5870: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  s */.        }. 
5880: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5890: 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 72 61  .  /* Insert tra
58a0: 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 61 74 20  nsaction set at 
58b0: 69 6e 64 65 78 20 69 2e 20 2a 2f 0a 20 20 66 6f  index i. */.  fo
58c0: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f  r(j=0; j<p->nLoo
58d0: 6b 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20  kahead; j++){.  
58e0: 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68    k = p->aLookah
58f0: 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ead[j].lookahead
5900: 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61   - p->mnLookahea
5910: 64 20 2b 20 69 3b 0a 20 20 20 20 70 2d 3e 61 41  d + i;.    p->aA
5920: 63 74 69 6f 6e 5b 6b 5d 20 3d 20 70 2d 3e 61 4c  ction[k] = p->aL
5930: 6f 6f 6b 61 68 65 61 64 5b 6a 5d 3b 0a 20 20 20  ookahead[j];.   
5940: 20 69 66 28 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69   if( k>=p->nActi
5950: 6f 6e 20 29 20 70 2d 3e 6e 41 63 74 69 6f 6e 20  on ) p->nAction 
5960: 3d 20 6b 2b 31 3b 0a 20 20 7d 0a 20 20 70 2d 3e  = k+1;.  }.  p->
5970: 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 30 3b 0a  nLookahead = 0;.
5980: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  .  /* Return the
5990: 20 6f 66 66 73 65 74 20 74 68 61 74 20 69 73 20   offset that is 
59a0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 6f  added to the loo
59b0: 6b 61 68 65 61 64 20 69 6e 20 6f 72 64 65 72 20  kahead in order 
59c0: 74 6f 20 67 65 74 20 74 68 65 0a 20 20 2a 2a 20  to get the.  ** 
59d0: 69 6e 64 65 78 20 69 6e 74 6f 20 79 79 5f 61 63  index into yy_ac
59e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 61 63 74 69  tion of the acti
59f0: 6f 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 69  on */.  return i
5a00: 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61   - p->mnLookahea
5a10: 64 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  d;.}../*********
5a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
5a30: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 62 75 69  om the file "bui
5a40: 6c 64 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ld.c" **********
5a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a60: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ***/./*.** Routi
5a70: 6e 65 73 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  nes to construct
5a80: 69 6f 6e 20 74 68 65 20 66 69 6e 69 74 65 20 73  ion the finite s
5a90: 74 61 74 65 20 6d 61 63 68 69 6e 65 20 66 6f 72  tate machine for
5aa0: 20 74 68 65 20 4c 45 4d 4f 4e 0a 2a 2a 20 70 61   the LEMON.** pa
5ab0: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
5ac0: 2a 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61 20 70 72  */../* Find a pr
5ad0: 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20  ecedence symbol 
5ae0: 6f 66 20 65 76 65 72 79 20 72 75 6c 65 20 69 6e  of every rule in
5af0: 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 0a 2a 2a   the grammar..**
5b00: 20 0a 2a 2a 20 54 68 6f 73 65 20 72 75 6c 65 73   .** Those rules
5b10: 20 77 68 69 63 68 20 68 61 76 65 20 61 20 70 72   which have a pr
5b20: 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20  ecedence symbol 
5b30: 63 6f 64 65 64 20 69 6e 20 74 68 65 20 69 6e 70  coded in the inp
5b40: 75 74 0a 2a 2a 20 67 72 61 6d 6d 61 72 20 75 73  ut.** grammar us
5b50: 69 6e 67 20 74 68 65 20 22 5b 73 79 6d 62 6f 6c  ing the "[symbol
5b60: 5d 22 20 63 6f 6e 73 74 72 75 63 74 20 77 69 6c  ]" construct wil
5b70: 6c 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 74  l already have t
5b80: 68 65 0a 2a 2a 20 72 70 2d 3e 70 72 65 63 73 79  he.** rp->precsy
5b90: 6d 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 2e 20  m field filled. 
5ba0: 20 4f 74 68 65 72 20 72 75 6c 65 73 20 74 61 6b   Other rules tak
5bb0: 65 20 61 73 20 74 68 65 69 72 20 70 72 65 63 65  e as their prece
5bc0: 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20  dence.** symbol 
5bd0: 74 68 65 20 66 69 72 73 74 20 52 48 53 20 73 79  the first RHS sy
5be0: 6d 62 6f 6c 20 77 69 74 68 20 61 20 64 65 66 69  mbol with a defi
5bf0: 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65 2e 20  ned precedence. 
5c00: 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
5c10: 20 6e 6f 74 20 52 48 53 20 73 79 6d 62 6f 6c 73   not RHS symbols
5c20: 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20   with a defined 
5c30: 70 72 65 63 65 64 65 6e 63 65 2c 20 74 68 65 20  precedence, the 
5c40: 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79  precedence.** sy
5c50: 6d 62 6f 6c 20 66 69 65 6c 64 20 69 73 20 6c 65  mbol field is le
5c60: 66 74 20 62 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69  ft blank..*/.voi
5c70: 64 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64  d FindRulePreced
5c80: 65 6e 63 65 73 28 73 74 72 75 63 74 20 6c 65 6d  ences(struct lem
5c90: 6f 6e 20 2a 78 70 29 0a 7b 0a 20 20 73 74 72 75  on *xp).{.  stru
5ca0: 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 66  ct rule *rp;.  f
5cb0: 6f 72 28 72 70 3d 78 70 2d 3e 72 75 6c 65 3b 20  or(rp=xp->rule; 
5cc0: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
5cd0: 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72  {.    if( rp->pr
5ce0: 65 63 73 79 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  ecsym==0 ){.    
5cf0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
5d00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
5d10: 3e 6e 72 68 73 20 26 26 20 72 70 2d 3e 70 72 65  >nrhs && rp->pre
5d20: 63 73 79 6d 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20  csym==0; i++){. 
5d30: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
5d40: 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72  mbol *sp = rp->r
5d50: 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hs[i];.        i
5d60: 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c  f( sp->type==MUL
5d70: 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
5d80: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
5d90: 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20   j<sp->nsubsym; 
5da0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
5db0: 20 20 69 66 28 20 73 70 2d 3e 73 75 62 73 79 6d    if( sp->subsym
5dc0: 5b 6a 5d 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a  [j]->prec>=0 ){.
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 70                rp
5de0: 2d 3e 70 72 65 63 73 79 6d 20 3d 20 73 70 2d 3e  ->precsym = sp->
5df0: 73 75 62 73 79 6d 5b 6a 5d 3b 0a 20 20 20 20 20  subsym[j];.     
5e00: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5e10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5e20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5e30: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e    }else if( sp->
5e40: 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  prec>=0 ){.     
5e50: 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d       rp->precsym
5e60: 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 09   = rp->rhs[i];..
5e70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
5e80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a    }.  return;.}.
5e90: 0a 2f 2a 20 46 69 6e 64 20 61 6c 6c 20 6e 6f 6e  ./* Find all non
5ea0: 74 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68 20  terminals which 
5eb0: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 74 68  will generate th
5ec0: 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a  e empty string..
5ed0: 2a 2a 20 54 68 65 6e 20 67 6f 20 62 61 63 6b 20  ** Then go back 
5ee0: 61 6e 64 20 63 6f 6d 70 75 74 65 20 74 68 65 20  and compute the 
5ef0: 66 69 72 73 74 20 73 65 74 73 20 6f 66 20 65 76  first sets of ev
5f00: 65 72 79 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e  ery nonterminal.
5f10: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 73 65  .** The first se
5f20: 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66 20  t is the set of 
5f30: 61 6c 6c 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d  all terminal sym
5f40: 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20 62  bols which can b
5f50: 65 67 69 6e 0a 2a 2a 20 61 20 73 74 72 69 6e 67  egin.** a string
5f60: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
5f70: 61 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a  at nonterminal..
5f80: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73  */.void FindFirs
5f90: 74 53 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d  tSets(struct lem
5fa0: 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e  on *lemp).{.  in
5fb0: 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74  t i, j;.  struct
5fc0: 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74   rule *rp;.  int
5fd0: 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20 66 6f   progress;..  fo
5fe0: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
5ff0: 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
6000: 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b    lemp->symbols[
6010: 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d  i]->lambda = LEM
6020: 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20  ON_FALSE;.  }.  
6030: 66 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72  for(i=lemp->nter
6040: 6d 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  minal; i<lemp->n
6050: 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
6060: 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b    lemp->symbols[
6070: 69 5d 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 53  i]->firstset = S
6080: 65 74 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a 20 20  etNew();.  }..  
6090: 2f 2a 20 46 69 72 73 74 20 63 6f 6d 70 75 74 65  /* First compute
60a0: 20 61 6c 6c 20 6c 61 6d 62 64 61 73 20 2a 2f 0a   all lambdas */.
60b0: 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65    do{.    progre
60c0: 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ss = 0;.    for(
60d0: 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
60e0: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
60f0: 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c  .      if( rp->l
6100: 68 73 2d 3e 6c 61 6d 62 64 61 20 29 20 63 6f 6e  hs->lambda ) con
6110: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
6120: 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
6130: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6140: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
6150: 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
6160: 0a 20 20 20 20 20 20 20 20 20 69 66 28 20 73 70  .         if( sp
6170: 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c  ->type!=TERMINAL
6180: 20 7c 7c 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d   || sp->lambda==
6190: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72  LEMON_FALSE ) br
61a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
61b0: 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72     if( i==rp->nr
61c0: 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 70  hs ){.        rp
61d0: 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 3d 20  ->lhs->lambda = 
61e0: 4c 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20  LEMON_TRUE;.    
61f0: 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31      progress = 1
6200: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6210: 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65    }while( progre
6220: 73 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ss );..  /* Now 
6230: 63 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69 72 73  compute all firs
6240: 74 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a  t sets */.  do{.
6250: 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
6260: 6c 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20  l *s1, *s2;.    
6270: 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
6280: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
6290: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
62a0: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 73 31 20  next){.      s1 
62b0: 3d 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20  = rp->lhs;.     
62c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
62d0: 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
62e0: 20 20 20 20 73 32 20 3d 20 72 70 2d 3e 72 68 73      s2 = rp->rhs
62f0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
6300: 20 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   s2->type==TERMI
6310: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
6320: 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74   progress += Set
6330: 41 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74  Add(s1->firstset
6340: 2c 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  ,s2->index);.   
6350: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6360: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6370: 73 32 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54  s2->type==MULTIT
6380: 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
6390: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
63a0: 73 32 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b  s2->nsubsym; j++
63b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
63c0: 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64  rogress += SetAd
63d0: 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73  d(s1->firstset,s
63e0: 32 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 69 6e  2->subsym[j]->in
63f0: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dex);.          
6400: 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
6410: 6b 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 31  k;..}else if( s1
6420: 3d 3d 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ==s2 ){.        
6430: 20 20 69 66 28 20 73 31 2d 3e 6c 61 6d 62 64 61    if( s1->lambda
6440: 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20  ==LEMON_FALSE ) 
6450: 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 7b 0a 20  break;..}else{. 
6460: 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73           progres
6470: 73 20 2b 3d 20 53 65 74 55 6e 69 6f 6e 28 73 31  s += SetUnion(s1
6480: 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 66  ->firstset,s2->f
6490: 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20 20  irstset);.      
64a0: 20 20 20 20 69 66 28 20 73 32 2d 3e 6c 61 6d 62      if( s2->lamb
64b0: 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20  da==LEMON_FALSE 
64c0: 29 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20  ) break;..}.    
64d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69    }.    }.  }whi
64e0: 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a  le( progress );.
64f0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
6500: 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30  Compute all LR(0
6510: 29 20 73 74 61 74 65 73 20 66 6f 72 20 74 68 65  ) states for the
6520: 20 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e 6b 73   grammar.  Links
6530: 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20 74 6f  .** are added to
6540: 20 62 65 74 77 65 65 6e 20 73 6f 6d 65 20 73 74   between some st
6550: 61 74 65 73 20 73 6f 20 74 68 61 74 20 74 68 65  ates so that the
6560: 20 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20 73 65   LR(1) follow se
6570: 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 6f 6d  ts.** can be com
6580: 70 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a 2f 0a  puted later..*/.
6590: 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20 73  PRIVATE struct s
65a0: 74 61 74 65 20 2a 67 65 74 73 74 61 74 65 28 73  tate *getstate(s
65b0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 20  truct lemon *); 
65c0: 20 2f 2a 20 66 6f 72 77 61 72 64 20 72 65 66 65   /* forward refe
65d0: 72 65 6e 63 65 20 2a 2f 0a 76 6f 69 64 20 46 69  rence */.void Fi
65e0: 6e 64 53 74 61 74 65 73 28 73 74 72 75 63 74 20  ndStates(struct 
65f0: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
6600: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
6610: 73 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  sp;.  struct rul
6620: 65 20 2a 72 70 3b 0a 0a 20 20 43 6f 6e 66 69 67  e *rp;..  Config
6630: 6c 69 73 74 5f 69 6e 69 74 28 29 3b 0a 0a 20 20  list_init();..  
6640: 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 74 61 72  /* Find the star
6650: 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 66  t symbol */.  if
6660: 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b  ( lemp->start ){
6670: 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c  .    sp = Symbol
6680: 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72  _find(lemp->star
6690: 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d  t);.    if( sp==
66a0: 30 20 29 7b 0a 20 20 20 20 20 20 45 72 72 6f 72  0 ){.      Error
66b0: 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
66c0: 6d 65 2c 30 2c 0a 22 54 68 65 20 73 70 65 63 69  me,0,."The speci
66d0: 66 69 65 64 20 73 74 61 72 74 20 73 79 6d 62 6f  fied start symbo
66e0: 6c 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20  l \"%s\" is not 
66f0: 5c 0a 69 6e 20 61 20 6e 6f 6e 74 65 72 6d 69 6e  \.in a nontermin
6700: 61 6c 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  al of the gramma
6710: 72 2e 20 20 5c 22 25 73 5c 22 20 77 69 6c 6c 20  r.  \"%s\" will 
6720: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 73  be used as the s
6730: 74 61 72 74 20 5c 0a 73 79 6d 62 6f 6c 20 69 6e  tart \.symbol in
6740: 73 74 65 61 64 2e 22 2c 6c 65 6d 70 2d 3e 73 74  stead.",lemp->st
6750: 61 72 74 2c 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e  art,lemp->rule->
6760: 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  lhs->name);.    
6770: 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
6780: 2b 2b 3b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c  ++;.      sp = l
6790: 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a  emp->rule->lhs;.
67a0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
67b0: 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75     sp = lemp->ru
67c0: 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 0a 20 20  le->lhs;.  }..  
67d0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
67e0: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 64 6f   start symbol do
67f0: 65 73 6e 27 74 20 6f 63 63 75 72 20 6f 6e 20 74  esn't occur on t
6800: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
6810: 64 65 20 6f 66 0a 20 20 2a 2a 20 61 6e 79 20 72  de of.  ** any r
6820: 75 6c 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20  ule.  Report an 
6830: 65 72 72 6f 72 20 69 66 20 69 74 20 64 6f 65 73  error if it does
6840: 2e 20 20 28 59 41 43 43 20 77 6f 75 6c 64 20 67  .  (YACC would g
6850: 65 6e 65 72 61 74 65 20 61 20 6e 65 77 0a 20 20  enerate a new.  
6860: 2a 2a 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  ** start symbol 
6870: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 29 20 2a  in this case.) *
6880: 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  /.  for(rp=lemp-
6890: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
68a0: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74  ->next){.    int
68b0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
68c0: 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
68d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d  ){.      if( rp-
68e0: 3e 72 68 73 5b 69 5d 3d 3d 73 70 20 29 7b 20 20  >rhs[i]==sp ){  
68f0: 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 44 65 61   /* FIX ME:  Dea
6900: 6c 20 77 69 74 68 20 6d 75 6c 74 69 74 65 72 6d  l with multiterm
6910: 69 6e 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20  inals */.       
6920: 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
6930: 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65  filename,0,."The
6940: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22   start symbol \"
6950: 25 73 5c 22 20 6f 63 63 75 72 73 20 6f 6e 20 74  %s\" occurs on t
6960: 68 65 20 5c 0a 72 69 67 68 74 2d 68 61 6e 64 20  he \.right-hand 
6970: 73 69 64 65 20 6f 66 20 61 20 72 75 6c 65 2e 20  side of a rule. 
6980: 54 68 69 73 20 77 69 6c 6c 20 72 65 73 75 6c 74  This will result
6990: 20 69 6e 20 61 20 70 61 72 73 65 72 20 77 68 69   in a parser whi
69a0: 63 68 20 5c 0a 64 6f 65 73 20 6e 6f 74 20 77 6f  ch \.does not wo
69b0: 72 6b 20 70 72 6f 70 65 72 6c 79 2e 22 2c 73 70  rk properly.",sp
69c0: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
69d0: 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
69e0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
69f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62  .  }..  /* The b
6a00: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
6a10: 6f 6e 20 73 65 74 20 66 6f 72 20 74 68 65 20 66  on set for the f
6a20: 69 72 73 74 20 73 74 61 74 65 0a 20 20 2a 2a 20  irst state.  ** 
6a30: 69 73 20 61 6c 6c 20 72 75 6c 65 73 20 77 68 69  is all rules whi
6a40: 63 68 20 68 61 76 65 20 74 68 65 20 73 74 61 72  ch have the star
6a50: 74 20 73 79 6d 62 6f 6c 20 61 73 20 74 68 65 69  t symbol as thei
6a60: 72 0a 20 20 2a 2a 20 6c 65 66 74 2d 68 61 6e 64  r.  ** left-hand
6a70: 20 73 69 64 65 20 2a 2f 0a 20 20 66 6f 72 28 72   side */.  for(r
6a80: 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  p=sp->rule; rp; 
6a90: 72 70 3d 72 70 2d 3e 6e 65 78 74 6c 68 73 29 7b  rp=rp->nextlhs){
6aa0: 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .    struct conf
6ab0: 69 67 20 2a 6e 65 77 63 66 70 3b 0a 20 20 20 20  ig *newcfp;.    
6ac0: 72 70 2d 3e 6c 68 73 53 74 61 72 74 20 3d 20 31  rp->lhsStart = 1
6ad0: 3b 0a 20 20 20 20 6e 65 77 63 66 70 20 3d 20 43  ;.    newcfp = C
6ae0: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
6af0: 69 73 28 72 70 2c 30 29 3b 0a 20 20 20 20 53 65  is(rp,0);.    Se
6b00: 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73  tAdd(newcfp->fws
6b10: 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ,0);.  }..  /* C
6b20: 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72 73 74  ompute the first
6b30: 20 73 74 61 74 65 2e 20 20 41 6c 6c 20 6f 74 68   state.  All oth
6b40: 65 72 20 73 74 61 74 65 73 20 77 69 6c 6c 20 62  er states will b
6b50: 65 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20  e.  ** computed 
6b60: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 75  automatically du
6b70: 72 69 6e 67 20 74 68 65 20 63 6f 6d 70 75 74 61  ring the computa
6b80: 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73  tion of the firs
6b90: 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54 68 65 20  t one..  ** The 
6ba0: 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72  returned pointer
6bb0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 73 74   to the first st
6bc0: 61 74 65 20 69 73 20 6e 6f 74 20 75 73 65 64 2e  ate is not used.
6bd0: 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 73   */.  (void)gets
6be0: 74 61 74 65 28 6c 65 6d 70 29 3b 0a 20 20 72 65  tate(lemp);.  re
6bf0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  turn;.}../* Retu
6c00: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
6c10: 61 20 73 74 61 74 65 20 77 68 69 63 68 20 69 73  a state which is
6c20: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74 68   described by th
6c30: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a  e configuration.
6c40: 2a 2a 20 6c 69 73 74 20 77 68 69 63 68 20 68 61  ** list which ha
6c50: 73 20 62 65 65 6e 20 62 75 69 6c 74 20 66 72 6f  s been built fro
6c60: 6d 20 63 61 6c 6c 73 20 74 6f 20 43 6f 6e 66 69  m calls to Confi
6c70: 67 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f 0a 50 52  glist_add..*/.PR
6c80: 49 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64  IVATE void build
6c90: 73 68 69 66 74 73 28 73 74 72 75 63 74 20 6c 65  shifts(struct le
6ca0: 6d 6f 6e 20 2a 2c 20 73 74 72 75 63 74 20 73 74  mon *, struct st
6cb0: 61 74 65 20 2a 29 3b 20 2f 2a 20 46 6f 72 77 64  ate *); /* Forwd
6cc0: 20 72 65 66 20 2a 2f 0a 50 52 49 56 41 54 45 20   ref */.PRIVATE 
6cd0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 67 65  struct state *ge
6ce0: 74 73 74 61 74 65 28 73 74 72 75 63 74 20 6c 65  tstate(struct le
6cf0: 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73  mon *lemp).{.  s
6d00: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
6d10: 70 2c 20 2a 62 70 3b 0a 20 20 73 74 72 75 63 74  p, *bp;.  struct
6d20: 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 0a 20 20   state *stp;..  
6d30: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 73  /* Extract the s
6d40: 6f 72 74 65 64 20 62 61 73 69 73 20 6f 66 20 74  orted basis of t
6d50: 68 65 20 6e 65 77 20 73 74 61 74 65 2e 20 20 54  he new state.  T
6d60: 68 65 20 62 61 73 69 73 20 77 61 73 20 63 6f 6e  he basis was con
6d70: 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 62 79  structed.  ** by
6d80: 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20   prior calls to 
6d90: 22 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62  "Configlist_addb
6da0: 61 73 69 73 28 29 22 2e 20 2a 2f 0a 20 20 43 6f  asis()". */.  Co
6db0: 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73  nfiglist_sortbas
6dc0: 69 73 28 29 3b 0a 20 20 62 70 20 3d 20 43 6f 6e  is();.  bp = Con
6dd0: 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29 3b  figlist_basis();
6de0: 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 73 74 61  ..  /* Get a sta
6df0: 74 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  te with the same
6e00: 20 62 61 73 69 73 20 2a 2f 0a 20 20 73 74 70 20   basis */.  stp 
6e10: 3d 20 53 74 61 74 65 5f 66 69 6e 64 28 62 70 29  = State_find(bp)
6e20: 3b 0a 20 20 69 66 28 20 73 74 70 20 29 7b 0a 20  ;.  if( stp ){. 
6e30: 20 20 20 2f 2a 20 41 20 73 74 61 74 65 20 77 69     /* A state wi
6e40: 74 68 20 74 68 65 20 73 61 6d 65 20 62 61 73 69  th the same basi
6e50: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  s already exists
6e60: 21 20 20 43 6f 70 79 20 61 6c 6c 20 74 68 65 20  !  Copy all the 
6e70: 66 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20 20 20 2a  follow-set.    *
6e80: 2a 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69  * propagation li
6e90: 6e 6b 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  nks from the sta
6ea0: 74 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  te under constru
6eb0: 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 0a 20  ction into the. 
6ec0: 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e     ** preexistin
6ed0: 67 20 73 74 61 74 65 2c 20 74 68 65 6e 20 72 65  g state, then re
6ee0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6ef0: 6f 20 74 68 65 20 70 72 65 65 78 69 73 74 69 6e  o the preexistin
6f00: 67 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73  g state */.    s
6f10: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 78 2c  truct config *x,
6f20: 20 2a 79 3b 0a 20 20 20 20 66 6f 72 28 78 3d 62   *y;.    for(x=b
6f30: 70 2c 20 79 3d 73 74 70 2d 3e 62 70 3b 20 78 20  p, y=stp->bp; x 
6f40: 26 26 20 79 3b 20 78 3d 78 2d 3e 62 70 2c 20 79  && y; x=x->bp, y
6f50: 3d 79 2d 3e 62 70 29 7b 0a 20 20 20 20 20 20 50  =y->bp){.      P
6f60: 6c 69 6e 6b 5f 63 6f 70 79 28 26 79 2d 3e 62 70  link_copy(&y->bp
6f70: 6c 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a 20 20 20  lp,x->bplp);.   
6f80: 20 20 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28     Plink_delete(
6f90: 78 2d 3e 66 70 6c 70 29 3b 0a 20 20 20 20 20 20  x->fplp);.      
6fa0: 78 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e 62 70 6c  x->fplp = x->bpl
6fb0: 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  p = 0;.    }.   
6fc0: 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73   cfp = Configlis
6fd0: 74 5f 72 65 74 75 72 6e 28 29 3b 0a 20 20 20 20  t_return();.    
6fe0: 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 63  Configlist_eat(c
6ff0: 66 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fp);.  }else{.  
7000: 20 20 2f 2a 20 54 68 69 73 20 72 65 61 6c 6c 79    /* This really
7010: 20 69 73 20 61 20 6e 65 77 20 73 74 61 74 65 2e   is a new state.
7020: 20 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20    Construct all 
7030: 74 68 65 20 64 65 74 61 69 6c 73 20 2a 2f 0a 20  the details */. 
7040: 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c     Configlist_cl
7050: 6f 73 75 72 65 28 6c 65 6d 70 29 3b 20 20 20 20  osure(lemp);    
7060: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
7070: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f  onfiguration clo
7080: 73 75 72 65 20 2a 2f 0a 20 20 20 20 43 6f 6e 66  sure */.    Conf
7090: 69 67 6c 69 73 74 5f 73 6f 72 74 28 29 3b 20 20  iglist_sort();  
70a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74           /* Sort
70b0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
70c0: 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20  on closure */.  
70d0: 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69    cfp = Configli
70e0: 73 74 5f 72 65 74 75 72 6e 28 29 3b 20 20 20 2f  st_return();   /
70f0: 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20  * Get a pointer 
7100: 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 20 6c 69  to the config li
7110: 73 74 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20  st */.    stp = 
7120: 53 74 61 74 65 5f 6e 65 77 28 29 3b 20 20 20 20  State_new();    
7130: 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20         /* A new 
7140: 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20  state structure 
7150: 2a 2f 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65  */.    MemoryChe
7160: 63 6b 28 73 74 70 29 3b 0a 20 20 20 20 73 74 70  ck(stp);.    stp
7170: 2d 3e 62 70 20 3d 20 62 70 3b 20 20 20 20 20 20  ->bp = bp;      
7180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d            /* Rem
7190: 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67  ember the config
71a0: 75 72 61 74 69 6f 6e 20 62 61 73 69 73 20 2a 2f  uration basis */
71b0: 0a 20 20 20 20 73 74 70 2d 3e 63 66 70 20 3d 20  .    stp->cfp = 
71c0: 63 66 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  cfp;            
71d0: 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68    /* Remember th
71e0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
71f0: 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 73  closure */.    s
7200: 74 70 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20 6c  tp->statenum = l
7210: 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b 20 2f  emp->nstate++; /
7220: 2a 20 45 76 65 72 79 20 73 74 61 74 65 20 67 65  * Every state ge
7230: 74 73 20 61 20 73 65 71 75 65 6e 63 65 20 6e 75  ts a sequence nu
7240: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 73 74 70 2d  mber */.    stp-
7250: 3e 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  >ap = 0;        
7260: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61           /* No a
7270: 63 74 69 6f 6e 73 2c 20 79 65 74 2e 20 2a 2f 0a  ctions, yet. */.
7280: 20 20 20 20 53 74 61 74 65 5f 69 6e 73 65 72 74      State_insert
7290: 28 73 74 70 2c 73 74 70 2d 3e 62 70 29 3b 20 20  (stp,stp->bp);  
72a0: 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20 73   /* Add to the s
72b0: 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tate table */.  
72c0: 20 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c 65    buildshifts(le
72d0: 6d 70 2c 73 74 70 29 3b 20 20 20 20 20 20 20 2f  mp,stp);       /
72e0: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 6f  * Recursively co
72f0: 6d 70 75 74 65 20 73 75 63 63 65 73 73 6f 72 20  mpute successor 
7300: 73 74 61 74 65 73 20 2a 2f 0a 20 20 7d 0a 20 20  states */.  }.  
7310: 72 65 74 75 72 6e 20 73 74 70 3b 0a 7d 0a 0a 2f  return stp;.}../
7320: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
7330: 20 69 66 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20   if two symbols 
7340: 61 72 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f  are the same..*/
7350: 0a 69 6e 74 20 73 61 6d 65 5f 73 79 6d 62 6f 6c  .int same_symbol
7360: 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
7370: 61 2c 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  a, struct symbol
7380: 20 2a 62 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a   *b).{.  int i;.
7390: 20 20 69 66 28 20 61 3d 3d 62 20 29 20 72 65 74    if( a==b ) ret
73a0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 61 2d 3e  urn 1;.  if( a->
73b0: 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49  type!=MULTITERMI
73c0: 4e 41 4c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  NAL ) return 0;.
73d0: 20 20 69 66 28 20 62 2d 3e 74 79 70 65 21 3d 4d    if( b->type!=M
73e0: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 20 72  ULTITERMINAL ) r
73f0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 61  eturn 0;.  if( a
7400: 2d 3e 6e 73 75 62 73 79 6d 21 3d 62 2d 3e 6e 73  ->nsubsym!=b->ns
7410: 75 62 73 79 6d 20 29 20 72 65 74 75 72 6e 20 30  ubsym ) return 0
7420: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61  ;.  for(i=0; i<a
7430: 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b 29 7b  ->nsubsym; i++){
7440: 0a 20 20 20 20 69 66 28 20 61 2d 3e 73 75 62 73  .    if( a->subs
7450: 79 6d 5b 69 5d 21 3d 62 2d 3e 73 75 62 73 79 6d  ym[i]!=b->subsym
7460: 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  [i] ) return 0;.
7470: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
7480: 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  }../* Construct 
7490: 61 6c 6c 20 73 75 63 63 65 73 73 6f 72 20 73 74  all successor st
74a0: 61 74 65 73 20 74 6f 20 74 68 65 20 67 69 76 65  ates to the give
74b0: 6e 20 73 74 61 74 65 2e 20 20 41 20 22 73 75 63  n state.  A "suc
74c0: 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74 61 74 65  cessor".** state
74d0: 20 69 73 20 61 6e 79 20 73 74 61 74 65 20 77 68   is any state wh
74e0: 69 63 68 20 63 61 6e 20 62 65 20 72 65 61 63 68  ich can be reach
74f0: 65 64 20 62 79 20 61 20 73 68 69 66 74 20 61 63  ed by a shift ac
7500: 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  tion..*/.PRIVATE
7510: 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74   void buildshift
7520: 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
7530: 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 73 74 61  lemp, struct sta
7540: 74 65 20 2a 73 74 70 29 0a 7b 0a 20 20 73 74 72  te *stp).{.  str
7550: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
7560: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
7570: 20 74 68 72 75 20 74 68 65 20 63 6f 6e 66 69 67   thru the config
7580: 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70   closure of "stp
7590: 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f  " */.  struct co
75a0: 6e 66 69 67 20 2a 62 63 66 70 3b 20 2f 2a 20 46  nfig *bcfp; /* F
75b0: 6f 72 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  or the inner loo
75c0: 70 20 6f 6e 20 63 6f 6e 66 69 67 20 63 6c 6f 73  p on config clos
75d0: 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a  ure of "stp" */.
75e0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
75f0: 2a 6e 65 77 63 66 67 3b 20 20 2f 2a 20 2a 2f 0a  *newcfg;  /* */.
7600: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
7610: 2a 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62 6f 6c  *sp;   /* Symbol
7620: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64   following the d
7630: 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74  ot in configurat
7640: 69 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20 20 73  ion "cfp" */.  s
7650: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 73  truct symbol *bs
7660: 70 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f  p;  /* Symbol fo
7670: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74 20  llowing the dot 
7680: 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  in configuration
7690: 20 22 62 63 66 70 22 20 2a 2f 0a 20 20 73 74 72   "bcfp" */.  str
76a0: 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73 74  uct state *newst
76b0: 70 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20  p; /* A pointer 
76c0: 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72 20 73  to a successor s
76d0: 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 61  tate */..  /* Ea
76e0: 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ch configuration
76f0: 20 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c 65 74   becomes complet
7700: 65 20 61 66 74 65 72 20 69 74 20 63 6f 6e 74 69  e after it conti
7710: 62 75 74 65 73 20 74 6f 20 61 20 73 75 63 63 65  butes to a succe
7720: 73 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 2e  ssor.  ** state.
7730: 20 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61 6c 6c    Initially, all
7740: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
7750: 61 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65 20 2a  are incomplete *
7760: 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d  /.  for(cfp=stp-
7770: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
7780: 66 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d 3e 73  fp->next) cfp->s
7790: 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45  tatus = INCOMPLE
77a0: 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74  TE;..  /* Loop t
77b0: 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e 66 69  hrough all confi
77c0: 67 75 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  gurations of the
77d0: 20 73 74 61 74 65 20 22 73 74 70 22 20 2a 2f 0a   state "stp" */.
77e0: 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63    for(cfp=stp->c
77f0: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
7800: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  ->next){.    if(
7810: 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f   cfp->status==CO
7820: 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75  MPLETE ) continu
7830: 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79  e;    /* Already
7840: 20 75 73 65 64 20 62 79 20 69 6e 6e 65 72 20 6c   used by inner l
7850: 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 63  oop */.    if( c
7860: 66 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72 70  fp->dot>=cfp->rp
7870: 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75  ->nrhs ) continu
7880: 65 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73 68 69  e;  /* Can't shi
7890: 66 74 20 74 68 69 73 20 63 6f 6e 66 69 67 20 2a  ft this config *
78a0: 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74  /.    Configlist
78b0: 5f 72 65 73 65 74 28 29 3b 20 20 20 20 20 20 20  _reset();       
78c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
78d0: 2a 20 52 65 73 65 74 20 74 68 65 20 6e 65 77 20  * Reset the new 
78e0: 63 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a 20 20  config set */.  
78f0: 20 20 73 70 20 3d 20 63 66 70 2d 3e 72 70 2d 3e    sp = cfp->rp->
7900: 72 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20 20  rhs[cfp->dot];  
7910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
7920: 6d 62 6f 6c 20 61 66 74 65 72 20 74 68 65 20 64  mbol after the d
7930: 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 6f  ot */..    /* Fo
7940: 72 20 65 76 65 72 79 20 63 6f 6e 66 69 67 75 72  r every configur
7950: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 61  ation in the sta
7960: 74 65 20 22 73 74 70 22 20 77 68 69 63 68 20 68  te "stp" which h
7970: 61 73 20 74 68 65 20 73 79 6d 62 6f 6c 20 22 73  as the symbol "s
7980: 70 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  p".    ** follow
7990: 69 6e 67 20 69 74 73 20 64 6f 74 2c 20 61 64 64  ing its dot, add
79a0: 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 66 69 67   the same config
79b0: 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 62  uration to the b
79c0: 61 73 69 73 20 73 65 74 20 75 6e 64 65 72 0a 20  asis set under. 
79d0: 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69     ** constructi
79e0: 6f 6e 20 62 75 74 20 77 69 74 68 20 74 68 65 20  on but with the 
79f0: 64 6f 74 20 73 68 69 66 74 65 64 20 6f 6e 65 20  dot shifted one 
7a00: 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20 72 69  symbol to the ri
7a10: 67 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ght. */.    for(
7a20: 62 63 66 70 3d 63 66 70 3b 20 62 63 66 70 3b 20  bcfp=cfp; bcfp; 
7a30: 62 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78 74 29  bcfp=bcfp->next)
7a40: 7b 0a 20 20 20 20 20 20 69 66 28 20 62 63 66 70  {.      if( bcfp
7a50: 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45  ->status==COMPLE
7a60: 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  TE ) continue;  
7a70: 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73 65    /* Already use
7a80: 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62  d */.      if( b
7a90: 63 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d 3e  cfp->dot>=bcfp->
7aa0: 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69  rp->nrhs ) conti
7ab0: 6e 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20 73 68  nue; /* Can't sh
7ac0: 69 66 74 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a  ift this one */.
7ad0: 20 20 20 20 20 20 62 73 70 20 3d 20 62 63 66 70        bsp = bcfp
7ae0: 2d 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70 2d 3e  ->rp->rhs[bcfp->
7af0: 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20 20  dot];           
7b00: 2f 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20 61 66  /* Get symbol af
7b10: 74 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20 20 20  ter dot */.     
7b20: 20 69 66 28 20 21 73 61 6d 65 5f 73 79 6d 62 6f   if( !same_symbo
7b30: 6c 28 62 73 70 2c 73 70 29 20 29 20 63 6f 6e 74  l(bsp,sp) ) cont
7b40: 69 6e 75 65 3b 20 20 20 20 20 20 2f 2a 20 4d 75  inue;      /* Mu
7b50: 73 74 20 62 65 20 73 61 6d 65 20 61 73 20 66 6f  st be same as fo
7b60: 72 20 22 63 66 70 22 20 2a 2f 0a 20 20 20 20 20  r "cfp" */.     
7b70: 20 62 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20   bcfp->status = 
7b80: 43 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20 20 20  COMPLETE;       
7b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7ba0: 72 6b 20 74 68 69 73 20 63 6f 6e 66 69 67 20 61  rk this config a
7bb0: 73 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20  s used */.      
7bc0: 6e 65 77 63 66 67 20 3d 20 43 6f 6e 66 69 67 6c  newcfg = Configl
7bd0: 69 73 74 5f 61 64 64 62 61 73 69 73 28 62 63 66  ist_addbasis(bcf
7be0: 70 2d 3e 72 70 2c 62 63 66 70 2d 3e 64 6f 74 2b  p->rp,bcfp->dot+
7bf0: 31 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f  1);.      Plink_
7c00: 61 64 64 28 26 6e 65 77 63 66 67 2d 3e 62 70 6c  add(&newcfg->bpl
7c10: 70 2c 62 63 66 70 29 3b 0a 20 20 20 20 7d 0a 0a  p,bcfp);.    }..
7c20: 20 20 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69      /* Get a poi
7c30: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 61 74  nter to the stat
7c40: 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74  e described by t
7c50: 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  he basis configu
7c60: 72 61 74 69 6f 6e 20 73 65 74 0a 20 20 20 20 2a  ration set.    *
7c70: 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  * constructed in
7c80: 20 74 68 65 20 70 72 65 63 65 64 69 6e 67 20 6c   the preceding l
7c90: 6f 6f 70 20 2a 2f 0a 20 20 20 20 6e 65 77 73 74  oop */.    newst
7ca0: 70 20 3d 20 67 65 74 73 74 61 74 65 28 6c 65 6d  p = getstate(lem
7cb0: 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  p);..    /* The 
7cc0: 73 74 61 74 65 20 22 6e 65 77 73 74 70 22 20 69  state "newstp" i
7cd0: 73 20 72 65 61 63 68 65 64 20 66 72 6f 6d 20 74  s reached from t
7ce0: 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20 62  he state "stp" b
7cf0: 79 20 61 20 73 68 69 66 74 20 61 63 74 69 6f 6e  y a shift action
7d00: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73  .    ** on the s
7d10: 79 6d 62 6f 6c 20 22 73 70 22 20 2a 2f 0a 20 20  ymbol "sp" */.  
7d20: 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
7d30: 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
7d40: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
7d50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
7d60: 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b 29  p->nsubsym; i++)
7d70: 7b 0a 20 20 20 20 20 20 20 20 41 63 74 69 6f 6e  {.        Action
7d80: 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 53 48  _add(&stp->ap,SH
7d90: 49 46 54 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 69  IFT,sp->subsym[i
7da0: 5d 2c 28 63 68 61 72 2a 29 6e 65 77 73 74 70 29  ],(char*)newstp)
7db0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
7dc0: 6c 73 65 7b 0a 20 20 20 20 20 20 41 63 74 69 6f  lse{.      Actio
7dd0: 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 53  n_add(&stp->ap,S
7de0: 48 49 46 54 2c 73 70 2c 28 63 68 61 72 20 2a 29  HIFT,sp,(char *)
7df0: 6e 65 77 73 74 70 29 3b 0a 20 20 20 20 7d 0a 20  newstp);.    }. 
7e00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
7e10: 74 72 75 63 74 20 74 68 65 20 70 72 6f 70 61 67  truct the propag
7e20: 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a 76  ation links.*/.v
7e30: 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 73 74  oid FindLinks(st
7e40: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
7e50: 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  ).{.  int i;.  s
7e60: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
7e70: 70 2c 20 2a 6f 74 68 65 72 3b 0a 20 20 73 74 72  p, *other;.  str
7e80: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
7e90: 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
7ea0: 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f 75 73 65  plp;..  /* House
7eb0: 6b 65 65 70 69 6e 67 20 64 65 74 61 69 6c 3a 0a  keeping detail:.
7ec0: 20 20 2a 2a 20 41 64 64 20 74 6f 20 65 76 65 72    ** Add to ever
7ed0: 79 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e 6b  y propagate link
7ee0: 20 61 20 70 6f 69 6e 74 65 72 20 62 61 63 6b 20   a pointer back 
7ef0: 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 6f 0a  to the state to.
7f00: 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65 20 6c    ** which the l
7f10: 69 6e 6b 20 69 73 20 61 74 74 61 63 68 65 64 2e  ink is attached.
7f20: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
7f30: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
7f40: 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
7f50: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
7f60: 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d      for(cfp=stp-
7f70: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
7f80: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
7f90: 20 63 66 70 2d 3e 73 74 70 20 3d 20 73 74 70 3b   cfp->stp = stp;
7fa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
7fb0: 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 62 61 63   Convert all bac
7fc0: 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20 66 6f 72 77  klinks into forw
7fd0: 61 72 64 20 6c 69 6e 6b 73 2e 20 20 4f 6e 6c 79  ard links.  Only
7fe0: 20 74 68 65 20 66 6f 72 77 61 72 64 0a 20 20 2a   the forward.  *
7ff0: 2a 20 6c 69 6e 6b 73 20 61 72 65 20 75 73 65 64  * links are used
8000: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73   in the follow-s
8010: 65 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 20  et computation. 
8020: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
8030: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
8040: 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  +){.    stp = le
8050: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
8060: 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e     for(cfp=stp->
8070: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
8080: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
8090: 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 62 70 6c  for(plp=cfp->bpl
80a0: 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d  p; plp; plp=plp-
80b0: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
80c0: 6f 74 68 65 72 20 3d 20 70 6c 70 2d 3e 63 66 70  other = plp->cfp
80d0: 3b 0a 20 20 20 20 20 20 20 20 50 6c 69 6e 6b 5f  ;.        Plink_
80e0: 61 64 64 28 26 6f 74 68 65 72 2d 3e 66 70 6c 70  add(&other->fplp
80f0: 2c 63 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ,cfp);.      }. 
8100: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43     }.  }.}../* C
8110: 6f 6d 70 75 74 65 20 61 6c 6c 20 66 6f 6c 6c 6f  ompute all follo
8120: 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 66  wsets..**.** A f
8130: 6f 6c 6c 6f 77 73 65 74 20 69 73 20 74 68 65 20  ollowset is the 
8140: 73 65 74 20 6f 66 20 61 6c 6c 20 73 79 6d 62 6f  set of all symbo
8150: 6c 73 20 77 68 69 63 68 20 63 61 6e 20 63 6f 6d  ls which can com
8160: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  e immediately.**
8170: 20 61 66 74 65 72 20 61 20 63 6f 6e 66 69 67 75   after a configu
8180: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ration..*/.void 
8190: 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 73  FindFollowSets(s
81a0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
81b0: 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p).{.  int i;.  
81c0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
81d0: 66 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  fp;.  struct pli
81e0: 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e 74 20 70  nk *plp;.  int p
81f0: 72 6f 67 72 65 73 73 3b 0a 20 20 69 6e 74 20 63  rogress;.  int c
8200: 68 61 6e 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  hange;..  for(i=
8210: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
8220: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  e; i++){.    for
8230: 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65  (cfp=lemp->sorte
8240: 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20  d[i]->cfp; cfp; 
8250: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
8260: 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74 75        cfp->statu
8270: 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a  s = INCOMPLETE;.
8280: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 64      }.  }.  .  d
8290: 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20  o{.    progress 
82a0: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
82b0: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
82c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; i++){.      fo
82d0: 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74  r(cfp=lemp->sort
82e0: 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b  ed[i]->cfp; cfp;
82f0: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
8300: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 66 70  .        if( cfp
8310: 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45  ->status==COMPLE
8320: 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  TE ) continue;. 
8330: 20 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63         for(plp=c
8340: 66 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b 20 70  fp->fplp; plp; p
8350: 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20  lp=plp->next){. 
8360: 20 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 20           change 
8370: 3d 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70 2d 3e  = SetUnion(plp->
8380: 63 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e 66 77  cfp->fws,cfp->fw
8390: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
83a0: 28 20 63 68 61 6e 67 65 20 29 7b 0a 20 20 20 20  ( change ){.    
83b0: 20 20 20 20 20 20 20 20 70 6c 70 2d 3e 63 66 70          plp->cfp
83c0: 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d  ->status = INCOM
83d0: 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20 20  PLETE;.         
83e0: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
83f0: 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 20  ..  }..}.       
8400: 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43   cfp->status = C
8410: 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  OMPLETE;.      }
8420: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
8430: 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a   progress );.}..
8440: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
8450: 76 65 5f 63 6f 6e 66 6c 69 63 74 28 73 74 72 75  ve_conflict(stru
8460: 63 74 20 61 63 74 69 6f 6e 20 2a 2c 73 74 72 75  ct action *,stru
8470: 63 74 20 61 63 74 69 6f 6e 20 2a 2c 20 73 74 72  ct action *, str
8480: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 3b 0a 0a  uct symbol *);..
8490: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72  /* Compute the r
84a0: 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c 20 61  educe actions, a
84b0: 6e 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66 6c  nd resolve confl
84c0: 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  icts..*/.void Fi
84d0: 6e 64 41 63 74 69 6f 6e 73 28 73 74 72 75 63 74  ndActions(struct
84e0: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
84f0: 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74 72    int i,j;.  str
8500: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
8510: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
8520: 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 73  *stp;.  struct s
8530: 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72  ymbol *sp;.  str
8540: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20  uct rule *rp;.. 
8550: 20 2f 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20 74   /* Add all of t
8560: 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e  he reduce action
8570: 73 20 0a 20 20 2a 2a 20 41 20 72 65 64 75 63 65  s .  ** A reduce
8580: 20 61 63 74 69 6f 6e 20 69 73 20 61 64 64 65 64   action is added
8590: 20 66 6f 72 20 65 61 63 68 20 65 6c 65 6d 65 6e   for each elemen
85a0: 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 73  t of the follows
85b0: 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f 6e  et of.  ** a con
85c0: 66 69 67 75 72 61 74 69 6f 6e 20 77 68 69 63 68  figuration which
85d0: 20 68 61 73 20 69 74 73 20 64 6f 74 20 61 74 20   has its dot at 
85e0: 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68  the extreme righ
85f0: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  t..  */.  for(i=
8600: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
8610: 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f  e; i++){   /* Lo
8620: 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 74 61 74  op over all stat
8630: 65 73 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20  es */.    stp = 
8640: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
8650: 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70  .    for(cfp=stp
8660: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
8670: 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a 20  cfp->next){  /* 
8680: 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63 6f  Loop over all co
8690: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a  nfigurations */.
86a0: 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e 72        if( cfp->r
86b0: 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64 6f  p->nrhs==cfp->do
86c0: 74 20 29 7b 20 20 20 20 20 20 20 20 2f 2a 20 49  t ){        /* I
86d0: 73 20 64 6f 74 20 61 74 20 65 78 74 72 65 6d 65  s dot at extreme
86e0: 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20 20   right? */.     
86f0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65     for(j=0; j<le
8700: 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a  mp->nterminal; j
8710: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
8720: 66 28 20 53 65 74 46 69 6e 64 28 63 66 70 2d 3e  f( SetFind(cfp->
8730: 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20 20  fws,j) ){.      
8740: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 72        /* Add a r
8750: 65 64 75 63 65 20 61 63 74 69 6f 6e 20 74 6f 20  educe action to 
8760: 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20  the state "stp" 
8770: 77 68 69 63 68 20 77 69 6c 6c 20 72 65 64 75 63  which will reduc
8780: 65 20 62 79 20 74 68 65 0a 20 20 20 20 20 20 20  e by the.       
8790: 20 20 20 20 20 2a 2a 20 72 75 6c 65 20 22 63 66       ** rule "cf
87a0: 70 2d 3e 72 70 22 20 69 66 20 74 68 65 20 6c 6f  p->rp" if the lo
87b0: 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 69  okahead symbol i
87c0: 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  s "lemp->symbols
87d0: 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  [j]" */.        
87e0: 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26      Action_add(&
87f0: 73 74 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c 6c  stp->ap,REDUCE,l
8800: 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c  emp->symbols[j],
8810: 28 63 68 61 72 20 2a 29 63 66 70 2d 3e 72 70 29  (char *)cfp->rp)
8820: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 09 7d  ;.          }..}
8830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8840: 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
8850: 20 61 63 63 65 70 74 69 6e 67 20 74 6f 6b 65 6e   accepting token
8860: 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
8870: 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20  start ){.    sp 
8880: 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65  = Symbol_find(le
8890: 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20  mp->start);.    
88a0: 69 66 28 20 73 70 3d 3d 30 20 29 20 73 70 20 3d  if( sp==0 ) sp =
88b0: 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73   lemp->rule->lhs
88c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
88d0: 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e  p = lemp->rule->
88e0: 6c 68 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 64  lhs;.  }.  /* Ad
88f0: 64 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 73  d to the first s
8900: 74 61 74 65 20 28 77 68 69 63 68 20 69 73 20 61  tate (which is a
8910: 6c 77 61 79 73 20 74 68 65 20 73 74 61 72 74 69  lways the starti
8920: 6e 67 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  ng state of the.
8930: 20 20 2a 2a 20 66 69 6e 69 74 65 20 73 74 61 74    ** finite stat
8940: 65 20 6d 61 63 68 69 6e 65 29 20 61 6e 20 61 63  e machine) an ac
8950: 74 69 6f 6e 20 74 6f 20 41 43 43 45 50 54 20 69  tion to ACCEPT i
8960: 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  f the lookahead 
8970: 69 73 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72  is the.  ** star
8980: 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 20  t nonterminal.  
8990: 2a 2f 0a 20 20 41 63 74 69 6f 6e 5f 61 64 64 28  */.  Action_add(
89a0: 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d  &lemp->sorted[0]
89b0: 2d 3e 61 70 2c 41 43 43 45 50 54 2c 73 70 2c 30  ->ap,ACCEPT,sp,0
89c0: 29 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  );..  /* Resolve
89d0: 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20   conflicts */.  
89e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
89f0: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
8a00: 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e     struct action
8a10: 20 2a 61 70 2c 20 2a 6e 61 70 3b 0a 20 20 20 20   *ap, *nap;.    
8a20: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
8a30: 70 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  p;.    stp = lem
8a40: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
8a50: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 73 74 70    /* assert( stp
8a60: 2d 3e 61 70 20 29 3b 20 2a 2f 0a 20 20 20 20 73  ->ap ); */.    s
8a70: 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f  tp->ap = Action_
8a80: 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20  sort(stp->ap);. 
8a90: 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
8aa0: 70 3b 20 61 70 20 26 26 20 61 70 2d 3e 6e 65 78  p; ap && ap->nex
8ab0: 74 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  t; ap=ap->next){
8ac0: 0a 20 20 20 20 20 20 66 6f 72 28 6e 61 70 3d 61  .      for(nap=a
8ad0: 70 2d 3e 6e 65 78 74 3b 20 6e 61 70 20 26 26 20  p->next; nap && 
8ae0: 6e 61 70 2d 3e 73 70 3d 3d 61 70 2d 3e 73 70 3b  nap->sp==ap->sp;
8af0: 20 6e 61 70 3d 6e 61 70 2d 3e 6e 65 78 74 29 7b   nap=nap->next){
8b00: 0a 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  .         /* The
8b10: 20 74 77 6f 20 61 63 74 69 6f 6e 73 20 22 61 70   two actions "ap
8b20: 22 20 61 6e 64 20 22 6e 61 70 22 20 68 61 76 65  " and "nap" have
8b30: 20 74 68 65 20 73 61 6d 65 20 6c 6f 6f 6b 61 68   the same lookah
8b40: 65 61 64 2e 0a 20 20 20 20 20 20 20 20 20 2a 2a  ead..         **
8b50: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
8b60: 68 20 6f 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  h one should be 
8b70: 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  used */.        
8b80: 20 6c 65 6d 70 2d 3e 6e 63 6f 6e 66 6c 69 63 74   lemp->nconflict
8b90: 20 2b 3d 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66   += resolve_conf
8ba0: 6c 69 63 74 28 61 70 2c 6e 61 70 2c 6c 65 6d 70  lict(ap,nap,lemp
8bb0: 2d 3e 65 72 72 73 79 6d 29 3b 0a 20 20 20 20 20  ->errsym);.     
8bc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
8bd0: 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  /* Report an err
8be0: 6f 72 20 66 6f 72 20 65 61 63 68 20 72 75 6c 65  or for each rule
8bf0: 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72 20   that can never 
8c00: 62 65 20 72 65 64 75 63 65 64 2e 20 2a 2f 0a 20  be reduced. */. 
8c10: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
8c20: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
8c30: 65 78 74 29 20 72 70 2d 3e 63 61 6e 52 65 64 75  ext) rp->canRedu
8c40: 63 65 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45  ce = LEMON_FALSE
8c50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
8c60: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
8c70: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 61 63  ){.    struct ac
8c80: 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 20 20 66 6f  tion *ap;.    fo
8c90: 72 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65  r(ap=lemp->sorte
8ca0: 64 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70  d[i]->ap; ap; ap
8cb0: 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
8cc0: 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
8cd0: 52 45 44 55 43 45 20 29 20 61 70 2d 3e 78 2e 72  REDUCE ) ap->x.r
8ce0: 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 4c  p->canReduce = L
8cf0: 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 7d  EMON_TRUE;.    }
8d00: 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65  .  }.  for(rp=le
8d10: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
8d20: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
8d30: 69 66 28 20 72 70 2d 3e 63 61 6e 52 65 64 75 63  if( rp->canReduc
8d40: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
8d50: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
8d60: 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
8d70: 6c 65 6c 69 6e 65 2c 22 54 68 69 73 20 72 75 6c  leline,"This rul
8d80: 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 72 65 64  e can not be red
8d90: 75 63 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c  uced.\n");.    l
8da0: 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
8db0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c  .  }.}../* Resol
8dc0: 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 20 62 65  ve a conflict be
8dd0: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
8de0: 76 65 6e 20 61 63 74 69 6f 6e 73 2e 20 20 49 66  ven actions.  If
8df0: 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74   the.** conflict
8e00: 20 63 61 6e 27 74 20 62 65 20 72 65 73 6f 6c 76   can't be resolv
8e10: 65 64 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ed, return non-z
8e20: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f  ero..**.** NO LO
8e30: 4e 47 45 52 20 54 52 55 45 3a 0a 2a 2a 20 20 20  NGER TRUE:.**   
8e40: 54 6f 20 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e  To resolve a con
8e50: 66 6c 69 63 74 2c 20 66 69 72 73 74 20 6c 6f 6f  flict, first loo
8e60: 6b 20 74 6f 20 73 65 65 20 69 66 20 65 69 74 68  k to see if eith
8e70: 65 72 20 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 69  er action.**   i
8e80: 73 20 6f 6e 20 61 6e 20 65 72 72 6f 72 20 72 75  s on an error ru
8e90: 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  le.  In that cas
8ea0: 65 2c 20 74 61 6b 65 20 74 68 65 20 61 63 74 69  e, take the acti
8eb0: 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20 69 73  on which.**   is
8ec0: 20 6e 6f 74 20 61 73 73 6f 63 69 61 74 65 64 20   not associated 
8ed0: 77 69 74 68 20 74 68 65 20 65 72 72 6f 72 20 72  with the error r
8ee0: 75 6c 65 2e 20 20 49 66 20 6e 65 69 74 68 65 72  ule.  If neither
8ef0: 20 6f 72 20 62 6f 74 68 0a 2a 2a 20 20 20 61 63   or both.**   ac
8f00: 74 69 6f 6e 73 20 61 72 65 20 61 73 73 6f 63 69  tions are associ
8f10: 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72  ated with an err
8f20: 6f 72 20 72 75 6c 65 2c 20 74 68 65 6e 20 74 72  or rule, then tr
8f30: 79 20 74 6f 0a 2a 2a 20 20 20 75 73 65 20 70 72  y to.**   use pr
8f40: 65 63 65 64 65 6e 63 65 20 74 6f 20 72 65 73 6f  ecedence to reso
8f50: 6c 76 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  lve the conflict
8f60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  ..**.** If eithe
8f70: 72 20 61 63 74 69 6f 6e 20 69 73 20 61 20 53 48  r action is a SH
8f80: 49 46 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  IFT, then it mus
8f90: 74 20 62 65 20 61 70 78 2e 20 20 54 68 69 73 0a  t be apx.  This.
8fa0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 6e 27  ** function won'
8fb0: 74 20 77 6f 72 6b 20 69 66 20 61 70 78 2d 3e 74  t work if apx->t
8fc0: 79 70 65 3d 3d 52 45 44 55 43 45 20 61 6e 64 20  ype==REDUCE and 
8fd0: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54  apy->type==SHIFT
8fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8ff0: 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74  resolve_conflict
9000: 28 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  (.  struct actio
9010: 6e 20 2a 61 70 78 2c 0a 20 20 73 74 72 75 63 74  n *apx,.  struct
9020: 20 61 63 74 69 6f 6e 20 2a 61 70 79 2c 0a 20 20   action *apy,.  
9030: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65  struct symbol *e
9040: 72 72 73 79 6d 20 20 20 2f 2a 20 54 68 65 20 65  rrsym   /* The e
9050: 72 72 6f 72 20 73 79 6d 62 6f 6c 20 28 69 66 20  rror symbol (if 
9060: 64 65 66 69 6e 65 64 2e 20 20 4e 55 4c 4c 20 6f  defined.  NULL o
9070: 74 68 65 72 77 69 73 65 29 20 2a 2f 0a 29 7b 0a  therwise) */.){.
9080: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
9090: 2a 73 70 78 2c 20 2a 73 70 79 3b 0a 20 20 69 6e  *spx, *spy;.  in
90a0: 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20  t errcnt = 0;.  
90b0: 61 73 73 65 72 74 28 20 61 70 78 2d 3e 73 70 3d  assert( apx->sp=
90c0: 3d 61 70 79 2d 3e 73 70 20 29 3b 20 20 2f 2a 20  =apy->sp );  /* 
90d0: 4f 74 68 65 72 77 69 73 65 20 74 68 65 72 65 20  Otherwise there 
90e0: 77 6f 75 6c 64 20 62 65 20 6e 6f 20 63 6f 6e 66  would be no conf
90f0: 6c 69 63 74 20 2a 2f 0a 20 20 69 66 28 20 61 70  lict */.  if( ap
9100: 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26  x->type==SHIFT &
9110: 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49  & apy->type==SHI
9120: 46 54 20 29 7b 0a 20 20 20 20 61 70 79 2d 3e 74  FT ){.    apy->t
9130: 79 70 65 20 3d 20 53 53 43 4f 4e 46 4c 49 43 54  ype = SSCONFLICT
9140: 3b 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a  ;.    errcnt++;.
9150: 20 20 7d 0a 20 20 69 66 28 20 61 70 78 2d 3e 74    }.  if( apx->t
9160: 79 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70  ype==SHIFT && ap
9170: 79 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  y->type==REDUCE 
9180: 29 7b 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78  ){.    spx = apx
9190: 2d 3e 73 70 3b 0a 20 20 20 20 73 70 79 20 3d 20  ->sp;.    spy = 
91a0: 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73  apy->x.rp->precs
91b0: 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 79 3d  ym;.    if( spy=
91c0: 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c  =0 || spx->prec<
91d0: 30 20 7c 7c 20 73 70 79 2d 3e 70 72 65 63 3c 30  0 || spy->prec<0
91e0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74   ){.      /* Not
91f0: 20 65 6e 6f 75 67 68 20 70 72 65 63 65 64 65 6e   enough preceden
9200: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ce information. 
9210: 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  */.      apy->ty
9220: 70 65 20 3d 20 53 52 43 4f 4e 46 4c 49 43 54 3b  pe = SRCONFLICT;
9230: 0a 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b  .      errcnt++;
9240: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
9250: 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72  px->prec>spy->pr
9260: 65 63 20 29 7b 20 20 20 20 2f 2a 20 4c 6f 77 65  ec ){    /* Lowe
9270: 72 20 70 72 65 63 65 64 65 6e 63 65 20 77 69 6e  r precedence win
9280: 73 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e  s */.      apy->
9290: 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56  type = RD_RESOLV
92a0: 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ED;.    }else if
92b0: 28 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d  ( spx->prec<spy-
92c0: 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61  >prec ){.      a
92d0: 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52 45  px->type = SH_RE
92e0: 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73  SOLVED;.    }els
92f0: 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3d  e if( spx->prec=
9300: 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70  =spy->prec && sp
9310: 78 2d 3e 61 73 73 6f 63 3d 3d 52 49 47 48 54 20  x->assoc==RIGHT 
9320: 29 7b 20 2f 2a 20 55 73 65 20 6f 70 65 72 61 74  ){ /* Use operat
9330: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d  or */.      apy-
9340: 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c  >type = RD_RESOL
9350: 56 45 44 3b 20 20 20 20 20 20 20 20 20 20 20 20  VED;            
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 20 2f 2a 20 61 73 73 6f 63 69 61 74 69 76 69 74   /* associativit
9380: 79 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69  y */.    }else i
9390: 66 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70  f( spx->prec==sp
93a0: 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e  y->prec && spx->
93b0: 61 73 73 6f 63 3d 3d 4c 45 46 54 20 29 7b 20 20  assoc==LEFT ){  
93c0: 2f 2a 20 74 6f 20 62 72 65 61 6b 20 74 69 65 20  /* to break tie 
93d0: 2a 2f 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  */.      apx->ty
93e0: 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44  pe = SH_RESOLVED
93f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9400: 20 20 20 61 73 73 65 72 74 28 20 73 70 78 2d 3e     assert( spx->
9410: 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20  prec==spy->prec 
9420: 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4e  && spx->assoc==N
9430: 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 61 70 79  ONE );.      apy
9440: 2d 3e 74 79 70 65 20 3d 20 53 52 43 4f 4e 46 4c  ->type = SRCONFL
9450: 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e  ICT;.      errcn
9460: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  t++;.    }.  }el
9470: 73 65 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65  se if( apx->type
9480: 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 79 2d  ==REDUCE && apy-
9490: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b  >type==REDUCE ){
94a0: 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e  .    spx = apx->
94b0: 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20  x.rp->precsym;. 
94c0: 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e     spy = apy->x.
94d0: 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20  rp->precsym;.   
94e0: 20 69 66 28 20 73 70 78 3d 3d 30 20 7c 7c 20 73   if( spx==0 || s
94f0: 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72  py==0 || spx->pr
9500: 65 63 3c 30 20 7c 7c 0a 20 20 20 20 73 70 79 2d  ec<0 ||.    spy-
9510: 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70 78 2d 3e  >prec<0 || spx->
9520: 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20  prec==spy->prec 
9530: 29 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  ){.      apy->ty
9540: 70 65 20 3d 20 52 52 43 4f 4e 46 4c 49 43 54 3b  pe = RRCONFLICT;
9550: 0a 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b  .      errcnt++;
9560: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
9570: 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72  px->prec>spy->pr
9580: 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70 79 2d  ec ){.      apy-
9590: 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c  >type = RD_RESOL
95a0: 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  VED;.    }else i
95b0: 66 28 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79  f( spx->prec<spy
95c0: 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20  ->prec ){.      
95d0: 61 70 78 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52  apx->type = RD_R
95e0: 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 0a 20  ESOLVED;.    }. 
95f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
9600: 72 74 28 20 0a 20 20 20 20 20 20 61 70 78 2d 3e  rt( .      apx->
9610: 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45  type==SH_RESOLVE
9620: 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e  D ||.      apx->
9630: 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45  type==RD_RESOLVE
9640: 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e  D ||.      apx->
9650: 74 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49 43 54  type==SSCONFLICT
9660: 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ||.      apx->t
9670: 79 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43 54 20  ype==SRCONFLICT 
9680: 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  ||.      apx->ty
9690: 70 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54 20 7c  pe==RRCONFLICT |
96a0: 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  |.      apy->typ
96b0: 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c  e==SH_RESOLVED |
96c0: 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  |.      apy->typ
96d0: 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c  e==RD_RESOLVED |
96e0: 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  |.      apy->typ
96f0: 65 3d 3d 53 53 43 4f 4e 46 4c 49 43 54 20 7c 7c  e==SSCONFLICT ||
9700: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
9710: 3d 3d 53 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a  ==SRCONFLICT ||.
9720: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d        apy->type=
9730: 3d 52 52 43 4f 4e 46 4c 49 43 54 0a 20 20 20 20  =RRCONFLICT.    
9740: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 52 45  );.    /* The RE
9750: 44 55 43 45 2f 53 48 49 46 54 20 63 61 73 65 20  DUCE/SHIFT case 
9760: 63 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20 62 65  cannot happen be
9770: 63 61 75 73 65 20 53 48 49 46 54 73 20 63 6f 6d  cause SHIFTs com
9780: 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  e before.    ** 
9790: 52 45 44 55 43 45 73 20 6f 6e 20 74 68 65 20 6c  REDUCEs on the l
97a0: 69 73 74 2e 20 20 49 66 20 77 65 20 72 65 61 63  ist.  If we reac
97b0: 68 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  h this point it 
97c0: 6d 75 73 74 20 62 65 20 62 65 63 61 75 73 65 0a  must be because.
97d0: 20 20 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65      ** the parse
97e0: 72 20 63 6f 6e 66 6c 69 63 74 20 68 61 64 20 61  r conflict had a
97f0: 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 73 6f  lready been reso
9800: 6c 76 65 64 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72  lved. */.  }.  r
9810: 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a  eturn errcnt;.}.
9820: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
9830: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
9840: 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74  file "configlist
9850: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
9860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
9870: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  *.** Routines to
9880: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 63 6f   processing a co
9890: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
98a0: 20 61 6e 64 20 62 75 69 6c 64 69 6e 67 20 61 20   and building a 
98b0: 73 74 61 74 65 0a 2a 2a 20 69 6e 20 74 68 65 20  state.** in the 
98c0: 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
98d0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74  erator..*/..stat
98e0: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
98f0: 20 2a 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 20   *freelist = 0; 
9900: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
9910: 66 72 65 65 20 63 6f 6e 66 69 67 75 72 61 74 69  free configurati
9920: 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ons */.static st
9930: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 75 72  ruct config *cur
9940: 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  rent = 0;       
9950: 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f  /* Top of list o
9960: 66 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  f configurations
9970: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
9980: 74 20 63 6f 6e 66 69 67 20 2a 2a 63 75 72 72 65  t config **curre
9990: 6e 74 65 6e 64 20 3d 20 30 3b 20 20 20 2f 2a 20  ntend = 0;   /* 
99a0: 4c 61 73 74 20 6f 6e 20 6c 69 73 74 20 6f 66 20  Last on list of 
99b0: 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74 69  configs */.stati
99c0: 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  c struct config 
99d0: 2a 62 61 73 69 73 20 3d 20 30 3b 20 20 20 20 20  *basis = 0;     
99e0: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69      /* Top of li
99f0: 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e 66  st of basis conf
9a00: 69 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  igs */.static st
9a10: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a 62 61  ruct config **ba
9a20: 73 69 73 65 6e 64 20 3d 20 30 3b 20 20 20 20 20  sisend = 0;     
9a30: 2f 2a 20 45 6e 64 20 6f 66 20 6c 69 73 74 20 6f  /* End of list o
9a40: 66 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73 20  f basis configs 
9a50: 2a 2f 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  */../* Return a 
9a60: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77  pointer to a new
9a70: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a   configuration *
9a80: 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74  /.PRIVATE struct
9a90: 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 6f 6e 66   config *newconf
9aa0: 69 67 28 29 7b 0a 20 20 73 74 72 75 63 74 20 63  ig(){.  struct c
9ab0: 6f 6e 66 69 67 20 2a 6e 65 77 63 66 67 3b 0a 20  onfig *newcfg;. 
9ac0: 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30   if( freelist==0
9ad0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
9ae0: 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 33 3b 0a     int amt = 3;.
9af0: 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20 28      freelist = (
9b00: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
9b10: 63 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a  calloc( amt, siz
9b20: 65 6f 66 28 73 74 72 75 63 74 20 63 6f 6e 66 69  eof(struct confi
9b30: 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20 66 72  g) );.    if( fr
9b40: 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
9b50: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
9b60: 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  r,"Unable to all
9b70: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
9b80: 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61   a new configura
9b90: 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65  tion.");.      e
9ba0: 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
9bb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74    for(i=0; i<amt
9bc0: 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69 73  -1; i++) freelis
9bd0: 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65  t[i].next = &fre
9be0: 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20  elist[i+1];.    
9bf0: 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e  freelist[amt-1].
9c00: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  next = 0;.  }.  
9c10: 6e 65 77 63 66 67 20 3d 20 66 72 65 65 6c 69 73  newcfg = freelis
9c20: 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20  t;.  freelist = 
9c30: 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a  freelist->next;.
9c40: 20 20 72 65 74 75 72 6e 20 6e 65 77 63 66 67 3b    return newcfg;
9c50: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 66 69  .}../* The confi
9c60: 67 75 72 61 74 69 6f 6e 20 22 6f 6c 64 22 20 69  guration "old" i
9c70: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 64  s no longer used
9c80: 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64   */.PRIVATE void
9c90: 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 73 74   deleteconfig(st
9ca0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64  ruct config *old
9cb0: 29 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74 20  ).{.  old->next 
9cc0: 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72  = freelist;.  fr
9cd0: 65 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d 0a  eelist = old;.}.
9ce0: 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20  ./* Initialized 
9cf0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
9d00: 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20 2a  n list builder *
9d10: 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  /.void Configlis
9d20: 74 5f 69 6e 69 74 28 29 7b 0a 20 20 63 75 72 72  t_init(){.  curr
9d30: 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65  ent = 0;.  curre
9d40: 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74  ntend = &current
9d50: 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20  ;.  basis = 0;. 
9d60: 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73   basisend = &bas
9d70: 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c  is;.  Configtabl
9d80: 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72 65 74 75  e_init();.  retu
9d90: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61  rn;.}../* Initia
9da0: 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69 67  lized the config
9db0: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75 69  uration list bui
9dc0: 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  lder */.void Con
9dd0: 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 29 7b  figlist_reset(){
9de0: 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a  .  current = 0;.
9df0: 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26    currentend = &
9e00: 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73  current;.  basis
9e10: 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64   = 0;.  basisend
9e20: 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e   = &basis;.  Con
9e30: 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 30  figtable_clear(0
9e40: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
9e50: 2f 2a 20 41 64 64 20 61 6e 6f 74 68 65 72 20 63  /* Add another c
9e60: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20  onfiguration to 
9e70: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
9e80: 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74  n list */.struct
9e90: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
9ea0: 69 73 74 5f 61 64 64 28 0a 20 20 73 74 72 75 63  ist_add(.  struc
9eb0: 74 20 72 75 6c 65 20 2a 72 70 2c 20 20 20 20 2f  t rule *rp,    /
9ec0: 2a 20 54 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20  * The rule */.  
9ed0: 69 6e 74 20 64 6f 74 20 20 20 20 20 20 20 20 20  int dot         
9ee0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74      /* Index int
9ef0: 6f 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65  o the RHS of the
9f00: 20 72 75 6c 65 20 77 68 65 72 65 20 74 68 65 20   rule where the 
9f10: 64 6f 74 20 67 6f 65 73 20 2a 2f 0a 29 7b 0a 20  dot goes */.){. 
9f20: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
9f30: 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61  cfp, model;..  a
9f40: 73 73 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e  ssert( currenten
9f50: 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e  d!=0 );.  model.
9f60: 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c  rp = rp;.  model
9f70: 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66  .dot = dot;.  cf
9f80: 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  p = Configtable_
9f90: 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20  find(&model);.  
9fa0: 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20  if( cfp==0 ){.  
9fb0: 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69    cfp = newconfi
9fc0: 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70  g();.    cfp->rp
9fd0: 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e   = rp;.    cfp->
9fe0: 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63  dot = dot;.    c
9ff0: 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65 77  fp->fws = SetNew
a000: 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74 70  ();.    cfp->stp
a010: 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66   = 0;.    cfp->f
a020: 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20  plp = cfp->bplp 
a030: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65  = 0;.    cfp->ne
a040: 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d  xt = 0;.    cfp-
a050: 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75  >bp = 0;.    *cu
a060: 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a  rrentend = cfp;.
a070: 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d      currentend =
a080: 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20   &cfp->next;.   
a090: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73   Configtable_ins
a0a0: 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20  ert(cfp);.  }.  
a0b0: 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f  return cfp;.}../
a0c0: 2a 20 41 64 64 20 61 20 62 61 73 69 73 20 63 6f  * Add a basis co
a0d0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74  nfiguration to t
a0e0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
a0f0: 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20   list */.struct 
a100: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
a110: 73 74 5f 61 64 64 62 61 73 69 73 28 73 74 72 75  st_addbasis(stru
a120: 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 69 6e 74  ct rule *rp, int
a130: 20 64 6f 74 29 0a 7b 0a 20 20 73 74 72 75 63 74   dot).{.  struct
a140: 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f   config *cfp, mo
a150: 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  del;..  assert( 
a160: 62 61 73 69 73 65 6e 64 21 3d 30 20 29 3b 0a 20  basisend!=0 );. 
a170: 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e 74   assert( current
a180: 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65  end!=0 );.  mode
a190: 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64  l.rp = rp;.  mod
a1a0: 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20  el.dot = dot;.  
a1b0: 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c  cfp = Configtabl
a1c0: 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a  e_find(&model);.
a1d0: 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a    if( cfp==0 ){.
a1e0: 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e      cfp = newcon
a1f0: 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e  fig();.    cfp->
a200: 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70  rp = rp;.    cfp
a210: 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20  ->dot = dot;.   
a220: 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e   cfp->fws = SetN
a230: 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73  ew();.    cfp->s
a240: 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d  tp = 0;.    cfp-
a250: 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c  >fplp = cfp->bpl
a260: 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  p = 0;.    cfp->
a270: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66  next = 0;.    cf
a280: 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a  p->bp = 0;.    *
a290: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70  currentend = cfp
a2a0: 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64  ;.    currentend
a2b0: 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20   = &cfp->next;. 
a2c0: 20 20 20 2a 62 61 73 69 73 65 6e 64 20 3d 20 63     *basisend = c
a2d0: 66 70 3b 0a 20 20 20 20 62 61 73 69 73 65 6e 64  fp;.    basisend
a2e0: 20 3d 20 26 63 66 70 2d 3e 62 70 3b 0a 20 20 20   = &cfp->bp;.   
a2f0: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73   Configtable_ins
a300: 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20  ert(cfp);.  }.  
a310: 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f  return cfp;.}../
a320: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6c  * Compute the cl
a330: 6f 73 75 72 65 20 6f 66 20 74 68 65 20 63 6f 6e  osure of the con
a340: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
a350: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
a360: 73 74 5f 63 6c 6f 73 75 72 65 28 73 74 72 75 63  st_closure(struc
a370: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
a380: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
a390: 20 2a 63 66 70 2c 20 2a 6e 65 77 63 66 70 3b 0a   *cfp, *newcfp;.
a3a0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
a3b0: 70 2c 20 2a 6e 65 77 72 70 3b 0a 20 20 73 74 72  p, *newrp;.  str
a3c0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 20  uct symbol *sp, 
a3d0: 2a 78 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 64  *xsp;.  int i, d
a3e0: 6f 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ot;..  assert( c
a3f0: 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a  urrentend!=0 );.
a400: 20 20 66 6f 72 28 63 66 70 3d 63 75 72 72 65 6e    for(cfp=curren
a410: 74 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  t; cfp; cfp=cfp-
a420: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72 70 20 3d  >next){.    rp =
a430: 20 63 66 70 2d 3e 72 70 3b 0a 20 20 20 20 64 6f   cfp->rp;.    do
a440: 74 20 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a 20 20  t = cfp->dot;.  
a450: 20 20 69 66 28 20 64 6f 74 3e 3d 72 70 2d 3e 6e    if( dot>=rp->n
a460: 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  rhs ) continue;.
a470: 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73      sp = rp->rhs
a480: 5b 64 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20 73  [dot];.    if( s
a490: 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d  p->type==NONTERM
a4a0: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  INAL ){.      if
a4b0: 28 20 73 70 2d 3e 72 75 6c 65 3d 3d 30 20 26 26  ( sp->rule==0 &&
a4c0: 20 73 70 21 3d 6c 65 6d 70 2d 3e 65 72 72 73 79   sp!=lemp->errsy
a4d0: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  m ){.        Err
a4e0: 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
a4f0: 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c 22 4e  name,rp->line,"N
a500: 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c 22 25 73 5c  onterminal \"%s\
a510: 22 20 68 61 73 20 6e 6f 20 72 75 6c 65 73 2e 22  " has no rules."
a520: 2c 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  ,.          sp->
a530: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6c  name);.        l
a540: 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
a550: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
a560: 6f 72 28 6e 65 77 72 70 3d 73 70 2d 3e 72 75 6c  or(newrp=sp->rul
a570: 65 3b 20 6e 65 77 72 70 3b 20 6e 65 77 72 70 3d  e; newrp; newrp=
a580: 6e 65 77 72 70 2d 3e 6e 65 78 74 6c 68 73 29 7b  newrp->nextlhs){
a590: 0a 20 20 20 20 20 20 20 20 6e 65 77 63 66 70 20  .        newcfp 
a5a0: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64  = Configlist_add
a5b0: 28 6e 65 77 72 70 2c 30 29 3b 0a 20 20 20 20 20  (newrp,0);.     
a5c0: 20 20 20 66 6f 72 28 69 3d 64 6f 74 2b 31 3b 20     for(i=dot+1; 
a5d0: 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
a5e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 73 70 20  {.          xsp 
a5f0: 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20  = rp->rhs[i];.  
a600: 20 20 20 20 20 20 20 20 69 66 28 20 78 73 70 2d          if( xsp-
a610: 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20  >type==TERMINAL 
a620: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
a630: 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77  etAdd(newcfp->fw
a640: 73 2c 78 73 70 2d 3e 69 6e 64 65 78 29 3b 0a 20  s,xsp->index);. 
a650: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a660: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
a670: 65 20 69 66 28 20 78 73 70 2d 3e 74 79 70 65 3d  e if( xsp->type=
a680: 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
a690: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
a6a0: 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
a6b0: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 78 73 70 2d   for(k=0; k<xsp-
a6c0: 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a  >nsubsym; k++){.
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65                Se
a6e0: 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73  tAdd(newcfp->fws
a6f0: 2c 20 78 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d  , xsp->subsym[k]
a700: 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
a710: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a720: 20 20 20 20 62 72 65 61 6b 3b 0a 09 20 20 7d 65      break;..  }e
a730: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
a740: 20 53 65 74 55 6e 69 6f 6e 28 6e 65 77 63 66 70   SetUnion(newcfp
a750: 2d 3e 66 77 73 2c 78 73 70 2d 3e 66 69 72 73 74  ->fws,xsp->first
a760: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  set);.          
a770: 20 20 69 66 28 20 78 73 70 2d 3e 6c 61 6d 62 64    if( xsp->lambd
a780: 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29  a==LEMON_FALSE )
a790: 20 62 72 65 61 6b 3b 0a 09 20 20 7d 0a 09 7d 0a   break;..  }..}.
a7a0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72          if( i==r
a7b0: 70 2d 3e 6e 72 68 73 20 29 20 50 6c 69 6e 6b 5f  p->nrhs ) Plink_
a7c0: 61 64 64 28 26 63 66 70 2d 3e 66 70 6c 70 2c 6e  add(&cfp->fplp,n
a7d0: 65 77 63 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a  ewcfp);.      }.
a7e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
a7f0: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74  rn;.}../* Sort t
a800: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
a810: 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f   list */.void Co
a820: 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29 7b  nfiglist_sort(){
a830: 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 28 73 74  .  current = (st
a840: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73  ruct config *)ms
a850: 6f 72 74 28 28 63 68 61 72 20 2a 29 63 75 72 72  ort((char *)curr
a860: 65 6e 74 2c 28 63 68 61 72 20 2a 2a 29 26 28 63  ent,(char **)&(c
a870: 75 72 72 65 6e 74 2d 3e 6e 65 78 74 29 2c 43 6f  urrent->next),Co
a880: 6e 66 69 67 63 6d 70 29 3b 0a 20 20 63 75 72 72  nfigcmp);.  curr
a890: 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65  entend = 0;.  re
a8a0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74  turn;.}../* Sort
a8b0: 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69   the basis confi
a8c0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  guration list */
a8d0: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
a8e0: 5f 73 6f 72 74 62 61 73 69 73 28 29 7b 0a 20 20  _sortbasis(){.  
a8f0: 62 61 73 69 73 20 3d 20 28 73 74 72 75 63 74 20  basis = (struct 
a900: 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74 28 28  config *)msort((
a910: 63 68 61 72 20 2a 29 63 75 72 72 65 6e 74 2c 28  char *)current,(
a920: 63 68 61 72 20 2a 2a 29 26 28 63 75 72 72 65 6e  char **)&(curren
a930: 74 2d 3e 62 70 29 2c 43 6f 6e 66 69 67 63 6d 70  t->bp),Configcmp
a940: 29 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20  );.  basisend = 
a950: 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  0;.  return;.}..
a960: 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
a970: 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
a980: 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  of the configura
a990: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  tion list and.**
a9a0: 20 72 65 73 65 74 20 74 68 65 20 6c 69 73 74 20   reset the list 
a9b0: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
a9c0: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74   *Configlist_ret
a9d0: 75 72 6e 28 29 7b 0a 20 20 73 74 72 75 63 74 20  urn(){.  struct 
a9e0: 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f  config *old;.  o
a9f0: 6c 64 20 3d 20 63 75 72 72 65 6e 74 3b 0a 20 20  ld = current;.  
aa00: 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63  current = 0;.  c
aa10: 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20  urrentend = 0;. 
aa20: 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a   return old;.}..
aa30: 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
aa40: 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
aa50: 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  of the configura
aa60: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  tion list and.**
aa70: 20 72 65 73 65 74 20 74 68 65 20 6c 69 73 74 20   reset the list 
aa80: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
aa90: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73   *Configlist_bas
aaa0: 69 73 28 29 7b 0a 20 20 73 74 72 75 63 74 20 63  is(){.  struct c
aab0: 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c  onfig *old;.  ol
aac0: 64 20 3d 20 62 61 73 69 73 3b 0a 20 20 62 61 73  d = basis;.  bas
aad0: 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65  is = 0;.  basise
aae0: 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  nd = 0;.  return
aaf0: 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 46 72 65 65   old;.}../* Free
ab00: 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66   all elements of
ab10: 20 74 68 65 20 67 69 76 65 6e 20 63 6f 6e 66 69   the given confi
ab20: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  guration list */
ab30: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
ab40: 5f 65 61 74 28 73 74 72 75 63 74 20 63 6f 6e 66  _eat(struct conf
ab50: 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73 74 72  ig *cfp).{.  str
ab60: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 78 74  uct config *next
ab70: 63 66 70 3b 0a 20 20 66 6f 72 28 3b 20 63 66 70  cfp;.  for(; cfp
ab80: 3b 20 63 66 70 3d 6e 65 78 74 63 66 70 29 7b 0a  ; cfp=nextcfp){.
ab90: 20 20 20 20 6e 65 78 74 63 66 70 20 3d 20 63 66      nextcfp = cf
aba0: 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 61 73 73  p->next;.    ass
abb0: 65 72 74 28 20 63 66 70 2d 3e 66 70 6c 70 3d 3d  ert( cfp->fplp==
abc0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
abd0: 20 63 66 70 2d 3e 62 70 6c 70 3d 3d 30 20 29 3b   cfp->bplp==0 );
abe0: 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 66 77  .    if( cfp->fw
abf0: 73 20 29 20 53 65 74 46 72 65 65 28 63 66 70 2d  s ) SetFree(cfp-
ac00: 3e 66 77 73 29 3b 0a 20 20 20 20 64 65 6c 65 74  >fws);.    delet
ac10: 65 63 6f 6e 66 69 67 28 63 66 70 29 3b 0a 20 20  econfig(cfp);.  
ac20: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 2f 2a  }.  return;.}./*
ac30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac40: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
ac50: 65 72 72 6f 72 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  error.c" *******
ac60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
ac80: 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 69 6e 74  * Code for print
ac90: 69 6e 67 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ing error messag
aca0: 65 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 45 72 72 6f  e..*/..void Erro
acb0: 72 4d 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20  rMsg(const char 
acc0: 2a 66 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 6c  *filename, int l
acd0: 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61  ineno, const cha
ace0: 72 20 2a 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b  r *format, ...){
acf0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
ad00: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
ad10: 20 22 25 73 3a 25 64 3a 20 22 2c 20 66 69 6c 65   "%s:%d: ", file
ad20: 6e 61 6d 65 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20  name, lineno);. 
ad30: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 66 6f   va_start(ap, fo
ad40: 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69 6e 74  rmat);.  vfprint
ad50: 66 28 73 74 64 65 72 72 2c 66 6f 72 6d 61 74 2c  f(stderr,format,
ad60: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
ad70: 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  );.  fprintf(std
ad80: 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 7d 0a 2f 2a  err, "\n");.}./*
ad90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
ada0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6d  From the file "m
adb0: 61 69 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ain.c" *********
adc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
add0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
ade0: 2a 2a 20 4d 61 69 6e 20 70 72 6f 67 72 61 6d 20  ** Main program 
adf0: 66 69 6c 65 20 66 6f 72 20 74 68 65 20 4c 45 4d  file for the LEM
ae00: 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
ae10: 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 65 70 6f  tor..*/../* Repo
ae20: 72 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  rt an out-of-mem
ae30: 6f 72 79 20 63 6f 6e 64 69 74 69 6f 6e 20 61 6e  ory condition an
ae40: 64 20 61 62 6f 72 74 2e 20 20 54 68 69 73 20 66  d abort.  This f
ae50: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73  unction.** is us
ae60: 65 64 20 6d 6f 73 74 6c 79 20 62 79 20 74 68 65  ed mostly by the
ae70: 20 22 4d 65 6d 6f 72 79 43 68 65 63 6b 22 20 6d   "MemoryCheck" m
ae80: 61 63 72 6f 20 69 6e 20 73 74 72 75 63 74 2e 68  acro in struct.h
ae90: 0a 2a 2f 0a 76 6f 69 64 20 6d 65 6d 6f 72 79 5f  .*/.void memory_
aea0: 65 72 72 6f 72 28 29 7b 0a 20 20 66 70 72 69 6e  error(){.  fprin
aeb0: 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f  tf(stderr,"Out o
aec0: 66 20 6d 65 6d 6f 72 79 2e 20 20 41 62 6f 72 74  f memory.  Abort
aed0: 69 6e 67 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78  ing...\n");.  ex
aee0: 69 74 28 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  it(1);.}..static
aef0: 20 69 6e 74 20 6e 44 65 66 69 6e 65 20 3d 20 30   int nDefine = 0
af00: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
af10: 20 6f 66 20 2d 44 20 6f 70 74 69 6f 6e 73 20 6f   of -D options o
af20: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
af30: 6e 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ne */.static cha
af40: 72 20 2a 2a 61 7a 44 65 66 69 6e 65 20 3d 20 30  r **azDefine = 0
af50: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ;  /* Name of th
af60: 65 20 2d 44 20 6d 61 63 72 6f 73 20 2a 2f 0a 0a  e -D macros */..
af70: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
af80: 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  is called with t
af90: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 65  he argument to e
afa0: 61 63 68 20 2d 44 20 63 6f 6d 6d 61 6e 64 2d 6c  ach -D command-l
afb0: 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 2a 2a 20 41  ine option..** A
afc0: 64 64 20 74 68 65 20 6d 61 63 72 6f 20 64 65 66  dd the macro def
afd0: 69 6e 65 64 20 74 6f 20 74 68 65 20 61 7a 44 65  ined to the azDe
afe0: 66 69 6e 65 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  fine array..*/.s
aff0: 74 61 74 69 63 20 76 6f 69 64 20 68 61 6e 64 6c  tatic void handl
b000: 65 5f 44 5f 6f 70 74 69 6f 6e 28 63 68 61 72 20  e_D_option(char 
b010: 2a 7a 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 61  *z){.  char **pa
b020: 7a 3b 0a 20 20 6e 44 65 66 69 6e 65 2b 2b 3b 0a  z;.  nDefine++;.
b030: 20 20 61 7a 44 65 66 69 6e 65 20 3d 20 28 63 68    azDefine = (ch
b040: 61 72 20 2a 2a 29 20 72 65 61 6c 6c 6f 63 28 61  ar **) realloc(a
b050: 7a 44 65 66 69 6e 65 2c 20 73 69 7a 65 6f 66 28  zDefine, sizeof(
b060: 61 7a 44 65 66 69 6e 65 5b 30 5d 29 2a 6e 44 65  azDefine[0])*nDe
b070: 66 69 6e 65 29 3b 0a 20 20 69 66 28 20 61 7a 44  fine);.  if( azD
b080: 65 66 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20  efine==0 ){.    
b090: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
b0a0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
b0b0: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
b0c0: 20 20 7d 0a 20 20 70 61 7a 20 3d 20 26 61 7a 44    }.  paz = &azD
b0d0: 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31 5d  efine[nDefine-1]
b0e0: 3b 0a 20 20 2a 70 61 7a 20 3d 20 28 63 68 61 72  ;.  *paz = (char
b0f0: 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f   *) malloc( lemo
b100: 6e 53 74 72 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a  nStrlen(z)+1 );.
b110: 20 20 69 66 28 20 2a 70 61 7a 3d 3d 30 20 29 7b    if( *paz==0 ){
b120: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
b130: 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  err,"out of memo
b140: 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ry\n");.    exit
b150: 28 31 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70  (1);.  }.  strcp
b160: 79 28 2a 70 61 7a 2c 20 7a 29 3b 0a 20 20 66 6f  y(*paz, z);.  fo
b170: 72 28 7a 3d 2a 70 61 7a 3b 20 2a 7a 20 26 26 20  r(z=*paz; *z && 
b180: 2a 7a 21 3d 27 3d 27 3b 20 7a 2b 2b 29 7b 7d 0a  *z!='='; z++){}.
b190: 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61    *z = 0;.}..sta
b1a0: 74 69 63 20 63 68 61 72 20 2a 75 73 65 72 5f 74  tic char *user_t
b1b0: 65 6d 70 6c 61 74 65 6e 61 6d 65 20 3d 20 4e 55  emplatename = NU
b1c0: 4c 4c 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  LL;.static void 
b1d0: 68 61 6e 64 6c 65 5f 54 5f 6f 70 74 69 6f 6e 28  handle_T_option(
b1e0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 73 65 72  char *z){.  user
b1f0: 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20 3d 20  _templatename = 
b200: 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28  (char *) malloc(
b210: 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b   lemonStrlen(z)+
b220: 31 20 29 3b 0a 20 20 69 66 28 20 75 73 65 72 5f  1 );.  if( user_
b230: 74 65 6d 70 6c 61 74 65 6e 61 6d 65 3d 3d 30 20  templatename==0 
b240: 29 7b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72  ){.    memory_er
b250: 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 73 74 72  ror();.  }.  str
b260: 63 70 79 28 75 73 65 72 5f 74 65 6d 70 6c 61 74  cpy(user_templat
b270: 65 6e 61 6d 65 2c 20 7a 29 3b 0a 7d 0a 0a 2f 2a  ename, z);.}../*
b280: 20 54 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   The main progra
b290: 6d 2e 20 20 50 61 72 73 65 20 74 68 65 20 63 6f  m.  Parse the co
b2a0: 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e 64 20 64  mmand line and d
b2b0: 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69 6e 74 20 6d  o it... */.int m
b2c0: 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  ain(int argc, ch
b2d0: 61 72 20 2a 2a 61 72 67 76 29 0a 7b 0a 20 20 73  ar **argv).{.  s
b2e0: 74 61 74 69 63 20 69 6e 74 20 76 65 72 73 69 6f  tatic int versio
b2f0: 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  n = 0;.  static 
b300: 69 6e 74 20 72 70 66 6c 61 67 20 3d 20 30 3b 0a  int rpflag = 0;.
b310: 20 20 73 74 61 74 69 63 20 69 6e 74 20 62 61 73    static int bas
b320: 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74  isflag = 0;.  st
b330: 61 74 69 63 20 69 6e 74 20 63 6f 6d 70 72 65 73  atic int compres
b340: 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  s = 0;.  static 
b350: 69 6e 74 20 71 75 69 65 74 20 3d 20 30 3b 0a 20  int quiet = 0;. 
b360: 20 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74   static int stat
b370: 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 73 74  istics = 0;.  st
b380: 61 74 69 63 20 69 6e 74 20 6d 68 66 6c 61 67 20  atic int mhflag 
b390: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
b3a0: 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20  t nolinenosflag 
b3b0: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74  = 0;.  static st
b3c0: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f  ruct s_options o
b3d0: 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20  ptions[] = {.   
b3e0: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c   {OPT_FLAG, "b",
b3f0: 20 28 63 68 61 72 2a 29 26 62 61 73 69 73 66 6c   (char*)&basisfl
b400: 61 67 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20  ag, "Print only 
b410: 74 68 65 20 62 61 73 69 73 20 69 6e 20 72 65 70  the basis in rep
b420: 6f 72 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ort."},.    {OPT
b430: 5f 46 4c 41 47 2c 20 22 63 22 2c 20 28 63 68 61  _FLAG, "c", (cha
b440: 72 2a 29 26 63 6f 6d 70 72 65 73 73 2c 20 22 44  r*)&compress, "D
b450: 6f 6e 27 74 20 63 6f 6d 70 72 65 73 73 20 74 68  on't compress th
b460: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22  e action table."
b470: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52  },.    {OPT_FSTR
b480: 2c 20 22 44 22 2c 20 28 63 68 61 72 2a 29 68 61  , "D", (char*)ha
b490: 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22  ndle_D_option, "
b4a0: 44 65 66 69 6e 65 20 61 6e 20 25 69 66 64 65 66  Define an %ifdef
b4b0: 20 6d 61 63 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b   macro."},.    {
b4c0: 4f 50 54 5f 46 53 54 52 2c 20 22 54 22 2c 20 28  OPT_FSTR, "T", (
b4d0: 63 68 61 72 2a 29 68 61 6e 64 6c 65 5f 54 5f 6f  char*)handle_T_o
b4e0: 70 74 69 6f 6e 2c 20 22 53 70 65 63 69 66 79 20  ption, "Specify 
b4f0: 61 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 2e  a template file.
b500: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
b510: 47 2c 20 22 67 22 2c 20 28 63 68 61 72 2a 29 26  G, "g", (char*)&
b520: 72 70 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 67  rpflag, "Print g
b530: 72 61 6d 6d 61 72 20 77 69 74 68 6f 75 74 20 61  rammar without a
b540: 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b  ctions."},.    {
b550: 4f 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28  OPT_FLAG, "m", (
b560: 63 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22  char*)&mhflag, "
b570: 4f 75 74 70 75 74 20 61 20 6d 61 6b 65 68 65 61  Output a makehea
b580: 64 65 72 73 20 63 6f 6d 70 61 74 69 62 6c 65 20  ders compatible 
b590: 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  file."},.    {OP
b5a0: 54 5f 46 4c 41 47 2c 20 22 6c 22 2c 20 28 63 68  T_FLAG, "l", (ch
b5b0: 61 72 2a 29 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c  ar*)&nolinenosfl
b5c0: 61 67 2c 20 22 44 6f 20 6e 6f 74 20 70 72 69 6e  ag, "Do not prin
b5d0: 74 20 23 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e  t #line statemen
b5e0: 74 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ts."},.    {OPT_
b5f0: 46 4c 41 47 2c 20 22 71 22 2c 20 28 63 68 61 72  FLAG, "q", (char
b600: 2a 29 26 71 75 69 65 74 2c 20 22 28 51 75 69 65  *)&quiet, "(Quie
b610: 74 29 20 44 6f 6e 27 74 20 70 72 69 6e 74 20 74  t) Don't print t
b620: 68 65 20 72 65 70 6f 72 74 20 66 69 6c 65 2e 22  he report file."
b630: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
b640: 2c 20 22 73 22 2c 20 28 63 68 61 72 2a 29 26 73  , "s", (char*)&s
b650: 74 61 74 69 73 74 69 63 73 2c 0a 20 20 20 20 20  tatistics,.     
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 50                "P
b680: 72 69 6e 74 20 70 61 72 73 65 72 20 73 74 61 74  rint parser stat
b690: 73 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75  s to standard ou
b6a0: 74 70 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  tput."},.    {OP
b6b0: 54 5f 46 4c 41 47 2c 20 22 78 22 2c 20 28 63 68  T_FLAG, "x", (ch
b6c0: 61 72 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22 50  ar*)&version, "P
b6d0: 72 69 6e 74 20 74 68 65 20 76 65 72 73 69 6f 6e  rint the version
b6e0: 20 6e 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20   number."},.    
b6f0: 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c 30 2c 30 7d  {OPT_FLAG,0,0,0}
b700: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
b710: 20 69 6e 74 20 65 78 69 74 63 6f 64 65 3b 0a 20   int exitcode;. 
b720: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 6c 65   struct lemon le
b730: 6d 3b 0a 0a 20 20 61 74 65 78 69 74 28 4c 65 6d  m;..  atexit(Lem
b740: 6f 6e 41 74 45 78 69 74 29 3b 0a 0a 20 20 4f 70  onAtExit);..  Op
b750: 74 49 6e 69 74 28 61 72 67 76 2c 6f 70 74 69 6f  tInit(argv,optio
b760: 6e 73 2c 73 74 64 65 72 72 29 3b 0a 20 20 69 66  ns,stderr);.  if
b770: 28 20 76 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20  ( version ){.   
b780: 20 20 70 72 69 6e 74 66 28 22 4c 65 6d 6f 6e 20    printf("Lemon 
b790: 76 65 72 73 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b  version 1.0\n");
b7a0: 0a 20 20 20 20 20 65 78 69 74 28 30 29 3b 20 0a  .     exit(0); .
b7b0: 20 20 7d 0a 20 20 69 66 28 20 4f 70 74 4e 41 72    }.  if( OptNAr
b7c0: 67 73 28 29 21 3d 31 20 29 7b 0a 20 20 20 20 66  gs()!=1 ){.    f
b7d0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
b7e0: 78 61 63 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e  xactly one filen
b7f0: 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
b800: 72 65 71 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20  required.\n");. 
b810: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
b820: 20 20 6d 65 6d 73 65 74 28 26 6c 65 6d 2c 20 30    memset(&lem, 0
b830: 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a  , sizeof(lem));.
b840: 20 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d    lem.errorcnt =
b850: 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61   0;..  /* Initia
b860: 6c 69 7a 65 20 74 68 65 20 6d 61 63 68 69 6e 65  lize the machine
b870: 20 2a 2f 0a 20 20 53 74 72 73 61 66 65 5f 69 6e   */.  Strsafe_in
b880: 69 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69  it();.  Symbol_i
b890: 6e 69 74 28 29 3b 0a 20 20 53 74 61 74 65 5f 69  nit();.  State_i
b8a0: 6e 69 74 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67  nit();.  lem.arg
b8b0: 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20  v0 = argv[0];.  
b8c0: 6c 65 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f  lem.filename = O
b8d0: 70 74 41 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e  ptArg(0);.  lem.
b8e0: 62 61 73 69 73 66 6c 61 67 20 3d 20 62 61 73 69  basisflag = basi
b8f0: 73 66 6c 61 67 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c  sflag;.  lem.nol
b900: 69 6e 65 6e 6f 73 66 6c 61 67 20 3d 20 6e 6f 6c  inenosflag = nol
b910: 69 6e 65 6e 6f 73 66 6c 61 67 3b 0a 20 20 53 79  inenosflag;.  Sy
b920: 6d 62 6f 6c 5f 6e 65 77 28 22 24 22 29 3b 0a 20  mbol_new("$");. 
b930: 20 6c 65 6d 2e 65 72 72 73 79 6d 20 3d 20 53 79   lem.errsym = Sy
b940: 6d 62 6f 6c 5f 6e 65 77 28 22 65 72 72 6f 72 22  mbol_new("error"
b950: 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 2d  );.  lem.errsym-
b960: 3e 75 73 65 43 6e 74 20 3d 20 30 3b 0a 0a 20 20  >useCnt = 0;..  
b970: 2f 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70  /* Parse the inp
b980: 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72  ut file */.  Par
b990: 73 65 28 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20  se(&lem);.  if( 
b9a0: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 29 20 65  lem.errorcnt ) e
b9b0: 78 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74  xit(lem.errorcnt
b9c0: 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 72 75  );.  if( lem.nru
b9d0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  le==0 ){.    fpr
b9e0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 6d 70  intf(stderr,"Emp
b9f0: 74 79 20 67 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b  ty grammar.\n");
ba00: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
ba10: 7d 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 61 6e  }..  /* Count an
ba20: 64 20 69 6e 64 65 78 20 74 68 65 20 73 79 6d 62  d index the symb
ba30: 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61 6d 6d  ols of the gramm
ba40: 61 72 20 2a 2f 0a 20 20 6c 65 6d 2e 6e 73 79 6d  ar */.  lem.nsym
ba50: 62 6f 6c 20 3d 20 53 79 6d 62 6f 6c 5f 63 6f 75  bol = Symbol_cou
ba60: 6e 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e  nt();.  Symbol_n
ba70: 65 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b  ew("{default}");
ba80: 0a 20 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d  .  lem.symbols =
ba90: 20 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28   Symbol_arrayof(
baa0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
bab0: 3d 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  =lem.nsymbol; i+
bac0: 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69  +) lem.symbols[i
bad0: 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20  ]->index = i;.  
bae0: 71 73 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c  qsort(lem.symbol
baf0: 73 2c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2b 31 2c  s,lem.nsymbol+1,
bb00: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79  sizeof(struct sy
bb10: 6d 62 6f 6c 2a 29 2c 20 53 79 6d 62 6f 6c 63 6d  mbol*), Symbolcm
bb20: 70 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  pp);.  for(i=0; 
bb30: 69 3c 3d 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20  i<=lem.nsymbol; 
bb40: 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73  i++) lem.symbols
bb50: 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a  [i]->index = i;.
bb60: 20 20 66 6f 72 28 69 3d 31 3b 20 69 73 75 70 70    for(i=1; isupp
bb70: 65 72 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69  er(lem.symbols[i
bb80: 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b  ]->name[0]); i++
bb90: 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e  );.  lem.ntermin
bba0: 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 47 65  al = i;..  /* Ge
bbb0: 6e 65 72 61 74 65 20 61 20 72 65 70 72 69 6e 74  nerate a reprint
bbc0: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2c   of the grammar,
bbd0: 20 69 66 20 72 65 71 75 65 73 74 65 64 20 6f 6e   if requested on
bbe0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
bbf0: 65 20 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c 61  e */.  if( rpfla
bc00: 67 20 29 7b 0a 20 20 20 20 52 65 70 72 69 6e 74  g ){.    Reprint
bc10: 28 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b  (&lem);.  }else{
bc20: 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
bc30: 7a 65 20 74 68 65 20 73 69 7a 65 20 66 6f 72 20  ze the size for 
bc40: 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 66  all follow and f
bc50: 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 20  irst sets */.   
bc60: 20 53 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74 65   SetSize(lem.nte
bc70: 72 6d 69 6e 61 6c 2b 31 29 3b 0a 0a 20 20 20 20  rminal+1);..    
bc80: 2f 2a 20 46 69 6e 64 20 74 68 65 20 70 72 65 63  /* Find the prec
bc90: 65 64 65 6e 63 65 20 66 6f 72 20 65 76 65 72 79  edence for every
bca0: 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65   production rule
bcb0: 20 28 74 68 61 74 20 68 61 73 20 6f 6e 65 29 20   (that has one) 
bcc0: 2a 2f 0a 20 20 20 20 46 69 6e 64 52 75 6c 65 50  */.    FindRuleP
bcd0: 72 65 63 65 64 65 6e 63 65 73 28 26 6c 65 6d 29  recedences(&lem)
bce0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  ;..    /* Comput
bcf0: 65 20 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e  e the lambda-non
bd00: 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74 68  terminals and th
bd10: 65 20 66 69 72 73 74 2d 73 65 74 73 20 66 6f 72  e first-sets for
bd20: 20 65 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e 6f   every.    ** no
bd30: 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20  nterminal */.   
bd40: 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28 26   FindFirstSets(&
bd50: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
bd60: 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20  mpute all LR(0) 
bd70: 73 74 61 74 65 73 2e 20 20 41 6c 73 6f 20 72 65  states.  Also re
bd80: 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74 20  cord follow-set 
bd90: 70 72 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20 20  propagation.    
bda0: 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61 74  ** links so that
bdb0: 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20   the follow-set 
bdc0: 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20  can be computed 
bdd0: 6c 61 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6d  later */.    lem
bde0: 2e 6e 73 74 61 74 65 20 3d 20 30 3b 0a 20 20 20  .nstate = 0;.   
bdf0: 20 46 69 6e 64 53 74 61 74 65 73 28 26 6c 65 6d   FindStates(&lem
be00: 29 3b 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74 65  );.    lem.sorte
be10: 64 20 3d 20 53 74 61 74 65 5f 61 72 72 61 79 6f  d = State_arrayo
be20: 66 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69 65  f();..    /* Tie
be30: 20 75 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20 6f   up loose ends o
be40: 6e 20 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f  n the propagatio
be50: 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20 46  n links */.    F
be60: 69 6e 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a  indLinks(&lem);.
be70: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
be80: 74 68 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20 6f  the follow set o
be90: 66 20 65 76 65 72 79 20 72 65 64 75 63 69 62 6c  f every reducibl
bea0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
beb0: 2a 2f 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c 6f  */.    FindFollo
bec0: 77 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  wSets(&lem);..  
bed0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
bee0: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a   action tables *
bef0: 2f 0a 20 20 20 20 46 69 6e 64 41 63 74 69 6f 6e  /.    FindAction
bf00: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
bf10: 20 43 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63   Compress the ac
bf20: 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20  tion tables */. 
bf30: 20 20 20 69 66 28 20 63 6f 6d 70 72 65 73 73 3d     if( compress=
bf40: 3d 30 20 29 20 43 6f 6d 70 72 65 73 73 54 61 62  =0 ) CompressTab
bf50: 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  les(&lem);..    
bf60: 2f 2a 20 52 65 6f 72 64 65 72 20 61 6e 64 20 72  /* Reorder and r
bf70: 65 6e 75 6d 62 65 72 20 74 68 65 20 73 74 61 74  enumber the stat
bf80: 65 73 20 73 6f 20 74 68 61 74 20 73 74 61 74 65  es so that state
bf90: 73 20 77 69 74 68 20 66 65 77 65 72 20 63 68 6f  s with fewer cho
bfa0: 69 63 65 73 0a 20 20 20 20 2a 2a 20 6f 63 63 75  ices.    ** occu
bfb0: 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20 2a 2f  r at the end. */
bfc0: 0a 20 20 20 20 52 65 73 6f 72 74 53 74 61 74 65  .    ResortState
bfd0: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
bfe0: 20 47 65 6e 65 72 61 74 65 20 61 20 72 65 70 6f   Generate a repo
bff0: 72 74 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  rt of the parser
c000: 20 67 65 6e 65 72 61 74 65 64 2e 20 20 28 74 68   generated.  (th
c010: 65 20 22 79 2e 6f 75 74 70 75 74 22 20 66 69 6c  e "y.output" fil
c020: 65 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 71  e) */.    if( !q
c030: 75 69 65 74 20 29 20 52 65 70 6f 72 74 4f 75 74  uiet ) ReportOut
c040: 70 75 74 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  put(&lem);..    
c050: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
c060: 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20  source code for 
c070: 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20 20  the parser */.  
c080: 20 20 52 65 70 6f 72 74 54 61 62 6c 65 28 26 6c    ReportTable(&l
c090: 65 6d 2c 20 6d 68 66 6c 61 67 29 3b 0a 0a 20 20  em, mhflag);..  
c0a0: 20 20 2f 2a 20 50 72 6f 64 75 63 65 20 61 20 68    /* Produce a h
c0b0: 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20 75  eader file for u
c0c0: 73 65 20 62 79 20 74 68 65 20 73 63 61 6e 6e 65  se by the scanne
c0d0: 72 2e 20 20 28 54 68 69 73 20 73 74 65 70 20 69  r.  (This step i
c0e0: 73 0a 20 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64  s.    ** omitted
c0f0: 20 69 66 20 74 68 65 20 22 2d 6d 22 20 6f 70 74   if the "-m" opt
c100: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 65 63 61  ion is used beca
c110: 75 73 65 20 6d 61 6b 65 68 65 61 64 65 72 73 20  use makeheaders 
c120: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65  will.    ** gene
c130: 72 61 74 65 20 74 68 65 20 66 69 6c 65 20 66 6f  rate the file fo
c140: 72 20 75 73 2e 29 20 2a 2f 0a 20 20 20 20 69 66  r us.) */.    if
c150: 28 20 21 6d 68 66 6c 61 67 20 29 20 52 65 70 6f  ( !mhflag ) Repo
c160: 72 74 48 65 61 64 65 72 28 26 6c 65 6d 29 3b 0a  rtHeader(&lem);.
c170: 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 69 73    }.  if( statis
c180: 74 69 63 73 20 29 7b 0a 20 20 20 20 70 72 69 6e  tics ){.    prin
c190: 74 66 28 22 50 61 72 73 65 72 20 73 74 61 74 69  tf("Parser stati
c1a0: 73 74 69 63 73 3a 20 25 64 20 74 65 72 6d 69 6e  stics: %d termin
c1b0: 61 6c 73 2c 20 25 64 20 6e 6f 6e 74 65 72 6d 69  als, %d nontermi
c1c0: 6e 61 6c 73 2c 20 25 64 20 72 75 6c 65 73 5c 6e  nals, %d rules\n
c1d0: 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 74 65  ",.      lem.nte
c1e0: 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 73 79 6d  rminal, lem.nsym
c1f0: 62 6f 6c 20 2d 20 6c 65 6d 2e 6e 74 65 72 6d 69  bol - lem.ntermi
c200: 6e 61 6c 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b  nal, lem.nrule);
c210: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 20  .    printf("   
c220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c230: 25 64 20 73 74 61 74 65 73 2c 20 25 64 20 70 61  %d states, %d pa
c240: 72 73 65 72 20 74 61 62 6c 65 20 65 6e 74 72 69  rser table entri
c250: 65 73 2c 20 25 64 20 63 6f 6e 66 6c 69 63 74 73  es, %d conflicts
c260: 5c 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e  \n",.      lem.n
c270: 73 74 61 74 65 2c 20 6c 65 6d 2e 74 61 62 6c 65  state, lem.table
c280: 73 69 7a 65 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c  size, lem.nconfl
c290: 69 63 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ict);.  }.  if( 
c2a0: 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e 20  lem.nconflict > 
c2b0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
c2c0: 28 73 74 64 65 72 72 2c 22 25 64 20 70 61 72 73  (stderr,"%d pars
c2d0: 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e  ing conflicts.\n
c2e0: 22 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29  ",lem.nconflict)
c2f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 72 65 74 75  ;.  }..  /* retu
c300: 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c  rn 0 on success,
c310: 20 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 2a   1 on failure. *
c320: 2f 0a 20 20 65 78 69 74 63 6f 64 65 20 3d 20 28  /.  exitcode = (
c330: 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3e 20  (lem.errorcnt > 
c340: 30 29 20 7c 7c 20 28 6c 65 6d 2e 6e 63 6f 6e 66  0) || (lem.nconf
c350: 6c 69 63 74 20 3e 20 30 29 29 20 3f 20 31 20 3a  lict > 0)) ? 1 :
c360: 20 30 3b 0a 20 20 73 75 63 63 65 73 73 66 75 6c   0;.  successful
c370: 5f 65 78 69 74 20 3d 20 28 65 78 69 74 63 6f 64  _exit = (exitcod
c380: 65 20 3d 3d 20 30 29 3b 0a 20 20 65 78 69 74 28  e == 0);.  exit(
c390: 65 78 69 74 63 6f 64 65 29 3b 0a 20 20 72 65 74  exitcode);.  ret
c3a0: 75 72 6e 20 28 65 78 69 74 63 6f 64 65 29 3b 0a  urn (exitcode);.
c3b0: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
c3c0: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
c3d0: 20 66 69 6c 65 20 22 6d 73 6f 72 74 2e 63 22 20   file "msort.c" 
c3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
c400: 0a 2f 2a 0a 2a 2a 20 41 20 67 65 6e 65 72 69 63  ./*.** A generic
c410: 20 6d 65 72 67 65 2d 73 6f 72 74 20 70 72 6f 67   merge-sort prog
c420: 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 55 53 41 47 45  ram..**.** USAGE
c430: 3a 0a 2a 2a 20 4c 65 74 20 22 70 74 72 22 20 62  :.** Let "ptr" b
c440: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 73  e a pointer to s
c450: 6f 6d 65 20 73 74 72 75 63 74 75 72 65 20 77 68  ome structure wh
c460: 69 63 68 20 69 73 20 61 74 20 74 68 65 20 68 65  ich is at the he
c470: 61 64 20 6f 66 0a 2a 2a 20 61 20 6e 75 6c 6c 2d  ad of.** a null-
c480: 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 73 74 2e  terminated list.
c490: 20 20 54 68 65 6e 20 74 6f 20 73 6f 72 74 20 74    Then to sort t
c4a0: 68 65 20 6c 69 73 74 20 63 61 6c 6c 3a 0a 2a 2a  he list call:.**
c4b0: 0a 2a 2a 20 20 20 20 20 70 74 72 20 3d 20 6d 73  .**     ptr = ms
c4c0: 6f 72 74 28 70 74 72 2c 26 28 70 74 72 2d 3e 6e  ort(ptr,&(ptr->n
c4d0: 65 78 74 29 2c 63 6d 70 66 6e 63 29 3b 0a 2a 2a  ext),cmpfnc);.**
c4e0: 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 6f 76 65  .** In the above
c4f0: 2c 20 22 63 6d 70 66 6e 63 22 20 69 73 20 61 20  , "cmpfnc" is a 
c500: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
c510: 63 74 69 6f 6e 20 77 68 69 63 68 20 63 6f 6d 70  ction which comp
c520: 61 72 65 73 0a 2a 2a 20 74 77 6f 20 69 6e 73 74  ares.** two inst
c530: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 73 74 72  ances of the str
c540: 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72  ucture and retur
c550: 6e 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61  ns an integer, a
c560: 73 20 69 6e 0a 2a 2a 20 73 74 72 63 6d 70 2e 20  s in.** strcmp. 
c570: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
c580: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
c590: 72 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  r to the pointer
c5a0: 20 74 6f 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e   to the.** secon
c5b0: 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  d element of the
c5c0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 54   linked list.  T
c5d0: 68 69 73 20 61 64 64 72 65 73 73 20 69 73 20 75  his address is u
c5e0: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a  sed to compute.*
c5f0: 2a 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  * the offset to 
c600: 74 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64  the "next" field
c610: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 72 75   within the stru
c620: 63 74 75 72 65 2e 20 20 54 68 65 20 6f 66 66 73  cture.  The offs
c630: 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 22 6e 65  et to.** the "ne
c640: 78 74 22 20 66 69 65 6c 64 20 6d 75 73 74 20 62  xt" field must b
c650: 65 20 63 6f 6e 73 74 61 6e 74 20 66 6f 72 20 61  e constant for a
c660: 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
c670: 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   the list..**.**
c680: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65   The function re
c690: 74 75 72 6e 73 20 61 20 6e 65 77 20 70 6f 69 6e  turns a new poin
c6a0: 74 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ter which is the
c6b0: 20 68 65 61 64 20 6f 66 20 74 68 65 20 6c 69 73   head of the lis
c6c0: 74 0a 2a 2a 20 61 66 74 65 72 20 73 6f 72 74 69  t.** after sorti
c6d0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49  ng..**.** ALGORI
c6e0: 54 48 4d 3a 0a 2a 2a 20 4d 65 72 67 65 2d 73 6f  THM:.** Merge-so
c6f0: 72 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  rt..*/../*.** Re
c700: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
c710: 6f 20 74 68 65 20 6e 65 78 74 20 73 74 72 75 63  o the next struc
c720: 74 75 72 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  ture in the link
c730: 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 23 64 65 66  ed list..*/.#def
c740: 69 6e 65 20 4e 45 58 54 28 41 29 20 28 2a 28 63  ine NEXT(A) (*(c
c750: 68 61 72 2a 2a 29 28 28 28 75 6e 73 69 67 6e 65  har**)(((unsigne
c760: 64 20 6c 6f 6e 67 29 41 29 2b 6f 66 66 73 65 74  d long)A)+offset
c770: 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73  ))../*.** Inputs
c780: 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20 20 20  :.**   a:       
c790: 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74  A sorted, null-t
c7a0: 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64  erminated linked
c7b0: 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20   list.  (May be 
c7c0: 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a 20 20  null)..**   b:  
c7d0: 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e       A sorted, n
c7e0: 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c  ull-terminated l
c7f0: 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61  inked list.  (Ma
c800: 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20  y be null)..**  
c810: 20 63 6d 70 3a 20 20 20 20 20 41 20 70 6f 69 6e   cmp:     A poin
c820: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6d 70 61  ter to the compa
c830: 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a  rison function..
c840: 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20 20 4f 66  **   offset:  Of
c850: 66 73 65 74 20 69 6e 20 74 68 65 20 73 74 72 75  fset in the stru
c860: 63 74 75 72 65 20 74 6f 20 74 68 65 20 22 6e 65  cture to the "ne
c870: 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  xt" field..**.**
c880: 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a   Return Value:.*
c890: 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  *   A pointer to
c8a0: 20 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 73   the head of a s
c8b0: 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61  orted list conta
c8c0: 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e  ining the elemen
c8d0: 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74 68 20  ts.**   of both 
c8e0: 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53  a and b..**.** S
c8f0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20  ide effects:.** 
c900: 20 20 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69    The "next" poi
c910: 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e  nters for elemen
c920: 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74 73 20  ts in the lists 
c930: 61 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a 20 20  a and b are.**  
c940: 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61   changed..*/.sta
c950: 74 69 63 20 63 68 61 72 20 2a 6d 65 72 67 65 28  tic char *merge(
c960: 0a 20 20 63 68 61 72 20 2a 61 2c 0a 20 20 63 68  .  char *a,.  ch
c970: 61 72 20 2a 62 2c 0a 20 20 69 6e 74 20 28 2a 63  ar *b,.  int (*c
c980: 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  mp)(const char*,
c990: 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 0a 20 20  const char*),.  
c9a0: 69 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  int offset.){.  
c9b0: 63 68 61 72 20 2a 70 74 72 2c 20 2a 68 65 61 64  char *ptr, *head
c9c0: 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b  ;..  if( a==0 ){
c9d0: 0a 20 20 20 20 68 65 61 64 20 3d 20 62 3b 0a 20  .    head = b;. 
c9e0: 20 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d 30 20   }else if( b==0 
c9f0: 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 61 3b  ){.    head = a;
ca00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
ca10: 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c 3d 30  ( (*cmp)(a,b)<=0
ca20: 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20   ){.      ptr = 
ca30: 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e 45 58  a;.      a = NEX
ca40: 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  T(a);.    }else{
ca50: 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a  .      ptr = b;.
ca60: 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62        b = NEXT(b
ca70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 65 61  );.    }.    hea
ca80: 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77 68 69  d = ptr;.    whi
ca90: 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a 20 20  le( a && b ){.  
caa0: 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29 28 61      if( (*cmp)(a
cab0: 2c 62 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,b)<=0 ){.      
cac0: 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b    NEXT(ptr) = a;
cad0: 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d 20 61  .        ptr = a
cae0: 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 4e 45  ;.        a = NE
caf0: 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  XT(a);.      }el
cb00: 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45 58 54  se{.        NEXT
cb10: 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20 20 20  (ptr) = b;.     
cb20: 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20     ptr = b;.    
cb30: 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b      b = NEXT(b);
cb40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
cb50: 20 20 20 69 66 28 20 61 20 29 20 4e 45 58 54 28     if( a ) NEXT(
cb60: 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 65 6c  ptr) = a;.    el
cb70: 73 65 20 20 20 20 4e 45 58 54 28 70 74 72 29 20  se    NEXT(ptr) 
cb80: 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = b;.  }.  retur
cb90: 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n head;.}../*.**
cba0: 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c 69   Inputs:.**   li
cbb0: 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72  st:      Pointer
cbc0: 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69 6e   to a singly-lin
cbd0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74 72 75  ked list of stru
cbe0: 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65 78  ctures..**   nex
cbf0: 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20  t:      Pointer 
cc00: 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  to pointer to th
cc10: 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  e second element
cc20: 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a   of the list..**
cc30: 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20 41 20     cmp:       A 
cc40: 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
cc50: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ion..**.** Retur
cc60: 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20  n Value:.**   A 
cc70: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
cc80: 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20  ead of a sorted 
cc90: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
cca0: 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20  the elements.** 
ccb0: 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20 6c    orginally in l
ccc0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20  ist..**.** Side 
ccd0: 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68  effects:.**   Th
cce0: 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72  e "next" pointer
ccf0: 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69  s for elements i
cd00: 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61 6e 67  n list are chang
cd10: 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c  ed..*/.#define L
cd20: 49 53 54 53 49 5a 45 20 33 30 0a 73 74 61 74 69  ISTSIZE 30.stati
cd30: 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 0a 20  c char *msort(. 
cd40: 20 63 68 61 72 20 2a 6c 69 73 74 2c 0a 20 20 63   char *list,.  c
cd50: 68 61 72 20 2a 2a 6e 65 78 74 2c 0a 20 20 69 6e  har **next,.  in
cd60: 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63  t (*cmp)(const c
cd70: 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  har*,const char*
cd80: 29 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ).){.  unsigned 
cd90: 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20 20 63  long offset;.  c
cda0: 68 61 72 20 2a 65 70 3b 0a 20 20 63 68 61 72 20  har *ep;.  char 
cdb0: 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a  *set[LISTSIZE];.
cdc0: 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66 73 65    int i;.  offse
cdd0: 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  t = (unsigned lo
cde0: 6e 67 29 6e 65 78 74 20 2d 20 28 75 6e 73 69 67  ng)next - (unsig
cdf0: 6e 65 64 20 6c 6f 6e 67 29 6c 69 73 74 3b 0a 20  ned long)list;. 
ce00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54   for(i=0; i<LIST
ce10: 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65 74 5b 69  SIZE; i++) set[i
ce20: 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  ] = 0;.  while( 
ce30: 6c 69 73 74 20 29 7b 0a 20 20 20 20 65 70 20 3d  list ){.    ep =
ce40: 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69 73 74 20   list;.    list 
ce50: 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b 0a 20 20  = NEXT(list);.  
ce60: 20 20 4e 45 58 54 28 65 70 29 20 3d 20 30 3b 0a    NEXT(ep) = 0;.
ce70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c      for(i=0; i<L
ce80: 49 53 54 53 49 5a 45 2d 31 20 26 26 20 73 65 74  ISTSIZE-1 && set
ce90: 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  [i]!=0; i++){.  
cea0: 20 20 20 20 65 70 20 3d 20 6d 65 72 67 65 28 65      ep = merge(e
ceb0: 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66  p,set[i],cmp,off
cec0: 73 65 74 29 3b 0a 20 20 20 20 20 20 73 65 74 5b  set);.      set[
ced0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
cee0: 20 20 73 65 74 5b 69 5d 20 3d 20 65 70 3b 0a 20    set[i] = ep;. 
cef0: 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a 20 20 66   }.  ep = 0;.  f
cf00: 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49  or(i=0; i<LISTSI
cf10: 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20 73 65 74  ZE; i++) if( set
cf20: 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65 72 67 65  [i] ) ep = merge
cf30: 28 73 65 74 5b 69 5d 2c 65 70 2c 63 6d 70 2c 6f  (set[i],ep,cmp,o
cf40: 66 66 73 65 74 29 3b 0a 20 20 72 65 74 75 72 6e  ffset);.  return
cf50: 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   ep;.}./********
cf60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf70: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
cf80: 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a  option.c" ******
cf90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cfa0: 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ****/.static cha
cfb0: 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61 74 69 63  r **argv;.static
cfc0: 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e   struct s_option
cfd0: 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63 20 46 49  s *op;.static FI
cfe0: 4c 45 20 2a 65 72 72 73 74 72 65 61 6d 3b 0a 0a  LE *errstream;..
cff0: 23 64 65 66 69 6e 65 20 49 53 4f 50 54 28 58 29  #define ISOPT(X)
d000: 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28   ((X)[0]=='-'||(
d010: 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63  X)[0]=='+'||strc
d020: 68 72 28 28 58 29 2c 27 3d 27 29 21 3d 30 29 0a  hr((X),'=')!=0).
d030: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
d040: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 69   command line wi
d050: 74 68 20 61 20 63 61 72 72 6f 74 20 70 6f 69 6e  th a carrot poin
d060: 74 69 6e 67 20 74 6f 20 74 68 65 20 6b 2d 74 68  ting to the k-th
d070: 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66   character.** of
d080: 20 74 68 65 20 6e 2d 74 68 20 66 69 65 6c 64 2e   the n-th field.
d090: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d0a0: 65 72 72 6c 69 6e 65 28 69 6e 74 20 6e 2c 20 69  errline(int n, i
d0b0: 6e 74 20 6b 2c 20 46 49 4c 45 20 2a 65 72 72 29  nt k, FILE *err)
d0c0: 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e 74 2c 20  .{.  int spcnt, 
d0d0: 69 3b 0a 20 20 69 66 28 20 61 72 67 76 5b 30 5d  i;.  if( argv[0]
d0e0: 20 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22   ) fprintf(err,"
d0f0: 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20 20  %s",argv[0]);.  
d100: 73 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e 53 74 72  spcnt = lemonStr
d110: 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20 31  len(argv[0]) + 1
d120: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e  ;.  for(i=1; i<n
d130: 20 26 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b   && argv[i]; i++
d140: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65  ){.    fprintf(e
d150: 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d  rr," %s",argv[i]
d160: 29 3b 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d 20  );.    spcnt += 
d170: 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76  lemonStrlen(argv
d180: 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20 73 70  [i])+1;.  }.  sp
d190: 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28  cnt += k;.  for(
d1a0: 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 20  ; argv[i]; i++) 
d1b0: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73  fprintf(err," %s
d1c0: 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 69 66  ",argv[i]);.  if
d1d0: 28 20 73 70 63 6e 74 3c 32 30 20 29 7b 0a 20 20  ( spcnt<20 ){.  
d1e0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c    fprintf(err,"\
d1f0: 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c  n%*s^-- here\n",
d200: 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20 7d 65 6c  spcnt,"");.  }el
d210: 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
d220: 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72 65 20 2d  err,"\n%*shere -
d230: 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c 22 22  -^\n",spcnt-7,""
d240: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
d250: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
d260: 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 6e 6f 6e   of the N-th non
d270: 2d 73 77 69 74 63 68 20 61 72 67 75 6d 65 6e 74  -switch argument
d280: 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20  .  Return -1.** 
d290: 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72  if N is out of r
d2a0: 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ange..*/.static 
d2b0: 69 6e 74 20 61 72 67 69 6e 64 65 78 28 69 6e 74  int argindex(int
d2c0: 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   n).{.  int i;. 
d2d0: 20 69 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20   int dashdash = 
d2e0: 30 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30  0;.  if( argv!=0
d2f0: 20 26 26 20 2a 61 72 67 76 21 3d 30 20 29 7b 0a   && *argv!=0 ){.
d300: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67      for(i=1; arg
d310: 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  v[i]; i++){.    
d320: 20 20 69 66 28 20 64 61 73 68 64 61 73 68 20 7c    if( dashdash |
d330: 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d  | !ISOPT(argv[i]
d340: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
d350: 20 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69   n==0 ) return i
d360: 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20  ;.        n--;. 
d370: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d380: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c   strcmp(argv[i],
d390: 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64  "--")==0 ) dashd
d3a0: 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ash = 1;.    }. 
d3b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
d3c0: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 65  }..static char e
d3d0: 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64  msg[] = "Command
d3e0: 20 6c 69 6e 65 20 73 79 6e 74 61 78 20 65 72 72   line syntax err
d3f0: 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72  or: ";../*.** Pr
d400: 6f 63 65 73 73 20 61 20 66 6c 61 67 20 63 6f 6d  ocess a flag com
d410: 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65  mand line argume
d420: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
d430: 74 20 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 6e  t handleflags(in
d440: 74 20 69 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a  t i, FILE *err).
d450: 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e 74  {.  int v;.  int
d460: 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 69   errcnt = 0;.  i
d470: 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  nt j;.  for(j=0;
d480: 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b   op[j].label; j+
d490: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e  +){.    if( strn
d4a0: 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b 31 5d 2c  cmp(&argv[i][1],
d4b0: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c 65 6d 6f  op[j].label,lemo
d4c0: 6e 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d 2e 6c 61  nStrlen(op[j].la
d4d0: 62 65 6c 29 29 3d 3d 30 20 29 20 62 72 65 61 6b  bel))==0 ) break
d4e0: 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61 72 67 76  ;.  }.  v = argv
d4f0: 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31 20  [i][0]=='-' ? 1 
d500: 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d  : 0;.  if( op[j]
d510: 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20  .label==0 ){.   
d520: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
d530: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
d540: 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f  sundefined optio
d550: 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20  n.\n",emsg);.   
d560: 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65     errline(i,1,e
d570: 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  rr);.    }.    e
d580: 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rrcnt++;.  }else
d590: 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d   if( op[j].type=
d5a0: 3d 4f 50 54 5f 46 4c 41 47 20 29 7b 0a 20 20 20  =OPT_FLAG ){.   
d5b0: 20 2a 28 28 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61   *((int*)op[j].a
d5c0: 72 67 29 20 3d 20 76 3b 0a 20 20 7d 65 6c 73 65  rg) = v;.  }else
d5d0: 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d   if( op[j].type=
d5e0: 3d 4f 50 54 5f 46 46 4c 41 47 20 29 7b 0a 20 20  =OPT_FFLAG ){.  
d5f0: 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 69 6e 74    (*(void(*)(int
d600: 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 76  ))(op[j].arg))(v
d610: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  );.  }else if( o
d620: 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46  p[j].type==OPT_F
d630: 53 54 52 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f  STR ){.    (*(vo
d640: 69 64 28 2a 29 28 63 68 61 72 20 2a 29 29 28 6f  id(*)(char *))(o
d650: 70 5b 6a 5d 2e 61 72 67 29 29 28 26 61 72 67 76  p[j].arg))(&argv
d660: 5b 69 5d 5b 32 5d 29 3b 0a 20 20 7d 65 6c 73 65  [i][2]);.  }else
d670: 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20 29 7b  {.    if( err ){
d680: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65  .      fprintf(e
d690: 72 72 2c 22 25 73 6d 69 73 73 69 6e 67 20 61 72  rr,"%smissing ar
d6a0: 67 75 6d 65 6e 74 20 6f 6e 20 73 77 69 74 63 68  gument on switch
d6b0: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
d6c0: 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72    errline(i,1,er
d6d0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72  r);.    }.    er
d6e0: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  rcnt++;.  }.  re
d6f0: 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a  turn errcnt;.}..
d700: 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20  /*.** Process a 
d710: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 77 69  command line swi
d720: 74 63 68 20 77 68 69 63 68 20 68 61 73 20 61 6e  tch which has an
d730: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
d740: 61 74 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 73  atic int handles
d750: 77 69 74 63 68 28 69 6e 74 20 69 2c 20 46 49 4c  witch(int i, FIL
d760: 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74 20  E *err).{.  int 
d770: 6c 76 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65  lv = 0;.  double
d780: 20 64 76 20 3d 20 30 2e 30 3b 0a 20 20 63 68 61   dv = 0.0;.  cha
d790: 72 20 2a 73 76 20 3d 20 30 2c 20 2a 65 6e 64 3b  r *sv = 0, *end;
d7a0: 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 69  .  char *cp;.  i
d7b0: 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 65 72 72 63  nt j;.  int errc
d7c0: 6e 74 20 3d 20 30 3b 0a 20 20 63 70 20 3d 20 73  nt = 0;.  cp = s
d7d0: 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d  trchr(argv[i],'=
d7e0: 27 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 70  ');.  assert( cp
d7f0: 21 3d 30 20 29 3b 0a 20 20 2a 63 70 20 3d 20 30  !=0 );.  *cp = 0
d800: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b  ;.  for(j=0; op[
d810: 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a  j].label; j++){.
d820: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
d830: 72 67 76 5b 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62  rgv[i],op[j].lab
d840: 65 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  el)==0 ) break;.
d850: 20 20 7d 0a 20 20 2a 63 70 20 3d 20 27 3d 27 3b    }.  *cp = '=';
d860: 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62  .  if( op[j].lab
d870: 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  el==0 ){.    if(
d880: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70   err ){.      fp
d890: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75 6e 64  rintf(err,"%sund
d8a0: 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e  efined option.\n
d8b0: 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65  ",emsg);.      e
d8c0: 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b  rrline(i,0,err);
d8d0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e  .    }.    errcn
d8e0: 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t++;.  }else{.  
d8f0: 20 20 63 70 2b 2b 3b 0a 20 20 20 20 73 77 69 74    cp++;.    swit
d900: 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 20 29  ch( op[j].type )
d910: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  {.      case OPT
d920: 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73  _FLAG:.      cas
d930: 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20  e OPT_FFLAG:.   
d940: 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a       if( err ){.
d950: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
d960: 66 28 65 72 72 2c 22 25 73 6f 70 74 69 6f 6e 20  f(err,"%soption 
d970: 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
d980: 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  ment.\n",emsg);.
d990: 20 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e            errlin
d9a0: 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20  e(i,0,err);.    
d9b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 72      }.        er
d9c0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
d9d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
d9e0: 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20  e OPT_DBL:.     
d9f0: 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a   case OPT_FDBL:.
da00: 20 20 20 20 20 20 20 20 64 76 20 3d 20 73 74 72          dv = str
da10: 74 6f 64 28 63 70 2c 26 65 6e 64 29 3b 0a 20 20  tod(cp,&end);.  
da20: 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64 20 29        if( *end )
da30: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
da40: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  err ){.         
da50: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
da60: 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72 61 63  %sillegal charac
da70: 74 65 72 20 69 6e 20 66 6c 6f 61 74 69 6e 67 2d  ter in floating-
da80: 70 6f 69 6e 74 20 61 72 67 75 6d 65 6e 74 2e 5c  point argument.\
da90: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
daa0: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
dab0: 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
dac0: 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64 20 6c  end)-(unsigned l
dad0: 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72 72 29  ong)argv[i],err)
dae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
daf0: 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b          errcnt++
db00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
db10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
db20: 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
db30: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
db40: 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 76 20 3d  NT:.        lv =
db50: 20 73 74 72 74 6f 6c 28 63 70 2c 26 65 6e 64 2c   strtol(cp,&end,
db60: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
db70: 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  *end ){.        
db80: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
db90: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
dba0: 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20  (err,"%sillegal 
dbb0: 63 68 61 72 61 63 74 65 72 20 69 6e 20 69 6e 74  character in int
dbc0: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 5c 6e  eger argument.\n
dbd0: 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  ",emsg);.       
dbe0: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 28       errline(i,(
dbf0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 65  (unsigned long)e
dc00: 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64 20 6c 6f  nd)-(unsigned lo
dc10: 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72 72 29 3b  ng)argv[i],err);
dc20: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
dc30: 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b         errcnt++;
dc40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
dc50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
dc60: 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20  case OPT_STR:.  
dc70: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54      case OPT_FST
dc80: 52 3a 0a 20 20 20 20 20 20 20 20 73 76 20 3d 20  R:.        sv = 
dc90: 63 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  cp;.        brea
dca0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69  k;.    }.    swi
dcb0: 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 20  tch( op[j].type 
dcc0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
dcd0: 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61  T_FLAG:.      ca
dce0: 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20  se OPT_FFLAG:.  
dcf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dd00: 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a     case OPT_DBL:
dd10: 0a 20 20 20 20 20 20 20 20 2a 28 64 6f 75 62 6c  .        *(doubl
dd20: 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d  e*)(op[j].arg) =
dd30: 20 64 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65   dv;.        bre
dd40: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
dd50: 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20  PT_FDBL:.       
dd60: 20 28 2a 28 76 6f 69 64 28 2a 29 28 64 6f 75 62   (*(void(*)(doub
dd70: 6c 65 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29  le))(op[j].arg))
dd80: 28 64 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (dv);.        br
dd90: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
dda0: 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 20  OPT_INT:.       
ddb0: 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61   *(int*)(op[j].a
ddc0: 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20 20  rg) = lv;.      
ddd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
dde0: 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20  ase OPT_FINT:.  
ddf0: 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29        (*(void(*)
de00: 28 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e 61 72 67  (int))(op[j].arg
de10: 29 29 28 28 69 6e 74 29 6c 76 29 3b 0a 20 20 20  ))((int)lv);.   
de20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
de30: 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
de40: 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
de50: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 73  )(op[j].arg) = s
de60: 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  v;.        break
de70: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
de80: 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 28  _FSTR:.        (
de90: 2a 28 76 6f 69 64 28 2a 29 28 63 68 61 72 20 2a  *(void(*)(char *
dea0: 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 73  ))(op[j].arg))(s
deb0: 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  v);.        brea
dec0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
ded0: 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a  eturn errcnt;.}.
dee0: 0a 69 6e 74 20 4f 70 74 49 6e 69 74 28 63 68 61  .int OptInit(cha
def0: 72 20 2a 2a 61 2c 20 73 74 72 75 63 74 20 73 5f  r **a, struct s_
df00: 6f 70 74 69 6f 6e 73 20 2a 6f 2c 20 46 49 4c 45  options *o, FILE
df10: 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74 20 65   *err).{.  int e
df20: 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72 67  rrcnt = 0;.  arg
df30: 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b  v = a;.  op = o;
df40: 0a 20 20 65 72 72 73 74 72 65 61 6d 20 3d 20 65  .  errstream = e
df50: 72 72 3b 0a 20 20 69 66 28 20 61 72 67 76 20 26  rr;.  if( argv &
df60: 26 20 2a 61 72 67 76 20 26 26 20 6f 70 20 29 7b  & *argv && op ){
df70: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
df80: 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d  for(i=1; argv[i]
df90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
dfa0: 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b  ( argv[i][0]=='+
dfb0: 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d 3d  ' || argv[i][0]=
dfc0: 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
dfd0: 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65  errcnt += handle
dfe0: 66 6c 61 67 73 28 69 2c 65 72 72 29 3b 0a 20 20  flags(i,err);.  
dff0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
e000: 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27  rchr(argv[i],'='
e010: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72  ) ){.        err
e020: 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77 69  cnt += handleswi
e030: 74 63 68 28 69 2c 65 72 72 29 3b 0a 20 20 20 20  tch(i,err);.    
e040: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
e050: 69 66 28 20 65 72 72 63 6e 74 3e 30 20 29 7b 0a  if( errcnt>0 ){.
e060: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
e070: 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6c  "Valid command l
e080: 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20  ine options for 
e090: 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a  \"%s\" are:\n",*
e0a0: 61 29 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e 74  a);.    OptPrint
e0b0: 28 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ();.    exit(1);
e0c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
e0d0: 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67 73  .}..int OptNArgs
e0e0: 28 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  (){.  int cnt = 
e0f0: 30 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73  0;.  int dashdas
e100: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
e110: 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26 26    if( argv!=0 &&
e120: 20 61 72 67 76 5b 30 5d 21 3d 30 20 29 7b 0a 20   argv[0]!=0 ){. 
e130: 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76     for(i=1; argv
e140: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
e150: 20 69 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c   if( dashdash ||
e160: 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29   !ISOPT(argv[i])
e170: 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20   ) cnt++;.      
e180: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
e190: 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61  i],"--")==0 ) da
e1a0: 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20  shdash = 1;.    
e1b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  }.  }.  return c
e1c0: 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70 74  nt;.}..char *Opt
e1d0: 41 72 67 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 69  Arg(int n).{.  i
e1e0: 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67 69  nt i;.  i = argi
e1f0: 6e 64 65 78 28 6e 29 3b 0a 20 20 72 65 74 75 72  ndex(n);.  retur
e200: 6e 20 69 3e 3d 30 20 3f 20 61 72 67 76 5b 69 5d  n i>=0 ? argv[i]
e210: 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70   : 0;.}..void Op
e220: 74 45 72 72 28 69 6e 74 20 6e 29 0a 7b 0a 20 20  tErr(int n).{.  
e230: 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67  int i;.  i = arg
e240: 69 6e 64 65 78 28 6e 29 3b 0a 20 20 69 66 28 20  index(n);.  if( 
e250: 69 3e 3d 30 20 29 20 65 72 72 6c 69 6e 65 28 69  i>=0 ) errline(i
e260: 2c 30 2c 65 72 72 73 74 72 65 61 6d 29 3b 0a 7d  ,0,errstream);.}
e270: 0a 0a 76 6f 69 64 20 4f 70 74 50 72 69 6e 74 28  ..void OptPrint(
e280: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
e290: 74 20 6d 61 78 2c 20 6c 65 6e 3b 0a 20 20 6d 61  t max, len;.  ma
e2a0: 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  x = 0;.  for(i=0
e2b0: 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69  ; op[i].label; i
e2c0: 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c  ++){.    len = l
e2d0: 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d  emonStrlen(op[i]
e2e0: 2e 6c 61 62 65 6c 29 20 2b 20 31 3b 0a 20 20 20  .label) + 1;.   
e2f0: 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74   switch( op[i].t
e300: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
e310: 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20  e OPT_FLAG:.    
e320: 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47    case OPT_FFLAG
e330: 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  :.        break;
e340: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
e350: 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  INT:.      case 
e360: 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20  OPT_FINT:.      
e370: 20 20 6c 65 6e 20 2b 3d 20 39 3b 20 20 20 20 20    len += 9;     
e380: 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22    /* length of "
e390: 3c 69 6e 74 65 67 65 72 3e 22 20 2a 2f 0a 20 20  <integer>" */.  
e3a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e3b0: 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a     case OPT_DBL:
e3c0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
e3d0: 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 6c 65  FDBL:.        le
e3e0: 6e 20 2b 3d 20 36 3b 20 20 20 20 20 20 20 2f 2a  n += 6;       /*
e3f0: 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 72 65 61   length of "<rea
e400: 6c 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  l>" */.        b
e410: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
e420: 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20   OPT_STR:.      
e430: 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20  case OPT_FSTR:. 
e440: 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 38 3b         len += 8;
e450: 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68         /* length
e460: 20 6f 66 20 22 3c 73 74 72 69 6e 67 3e 22 20 2a   of "<string>" *
e470: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
e480: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c  .    }.    if( l
e490: 65 6e 3e 6d 61 78 20 29 20 6d 61 78 20 3d 20 6c  en>max ) max = l
e4a0: 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  en;.  }.  for(i=
e4b0: 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20  0; op[i].label; 
e4c0: 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68  i++){.    switch
e4d0: 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a  ( op[i].type ){.
e4e0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
e4f0: 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20  LAG:.      case 
e500: 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20  OPT_FFLAG:.     
e510: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74     fprintf(errst
e520: 72 65 61 6d 2c 22 20 20 2d 25 2d 2a 73 20 20 25  ream,"  -%-*s  %
e530: 73 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c  s\n",max,op[i].l
e540: 61 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61  abel,op[i].messa
e550: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
e560: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
e570: 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61  PT_INT:.      ca
e580: 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20  se OPT_FINT:.   
e590: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
e5a0: 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 69 6e  stream,"  %s=<in
e5b0: 74 65 67 65 72 3e 25 2a 73 20 20 25 73 5c 6e 22  teger>%*s  %s\n"
e5c0: 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20  ,op[i].label,.  
e5d0: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61          (int)(ma
e5e0: 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70  x-lemonStrlen(op
e5f0: 5b 69 5d 2e 6c 61 62 65 6c 29 2d 39 29 2c 22 22  [i].label)-9),""
e600: 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b  ,op[i].message);
e610: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e620: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44        case OPT_D
e630: 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  BL:.      case O
e640: 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20  PT_FDBL:.       
e650: 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65   fprintf(errstre
e660: 61 6d 2c 22 20 20 25 73 3d 3c 72 65 61 6c 3e 25  am,"  %s=<real>%
e670: 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e  *s  %s\n",op[i].
e680: 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  label,.         
e690: 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e   (int)(max-lemon
e6a0: 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62  Strlen(op[i].lab
e6b0: 65 6c 29 2d 36 29 2c 22 22 2c 6f 70 5b 69 5d 2e  el)-6),"",op[i].
e6c0: 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20  message);.      
e6d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
e6e0: 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20  ase OPT_STR:.   
e6f0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52     case OPT_FSTR
e700: 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  :.        fprint
e710: 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25  f(errstream,"  %
e720: 73 3d 3c 73 74 72 69 6e 67 3e 25 2a 73 20 20 25  s=<string>%*s  %
e730: 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c  s\n",op[i].label
e740: 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e 74  ,.          (int
e750: 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65  )(max-lemonStrle
e760: 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38  n(op[i].label)-8
e770: 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61  ),"",op[i].messa
e780: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
e790: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
e7a0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
e7b0: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
e7c0: 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e 63 22  e file "parse.c"
e7d0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
e7e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
e7f0: 2a 0a 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65 20  *.** Input file 
e800: 70 61 72 73 65 72 20 66 6f 72 20 74 68 65 20 4c  parser for the L
e810: 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
e820: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68  rator..*/../* Th
e830: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
e840: 61 72 73 65 72 20 2a 2f 0a 65 6e 75 6d 20 65 5f  arser */.enum e_
e850: 73 74 61 74 65 20 7b 0a 20 20 49 4e 49 54 49 41  state {.  INITIA
e860: 4c 49 5a 45 2c 0a 20 20 57 41 49 54 49 4e 47 5f  LIZE,.  WAITING_
e870: 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
e880: 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ,.  WAITING_FOR_
e890: 44 45 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20 20  DECL_KEYWORD,.  
e8a0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
e8b0: 5f 41 52 47 2c 0a 20 20 57 41 49 54 49 4e 47 5f  _ARG,.  WAITING_
e8c0: 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53  FOR_PRECEDENCE_S
e8d0: 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47  YMBOL,.  WAITING
e8e0: 5f 46 4f 52 5f 41 52 52 4f 57 2c 0a 20 20 49 4e  _FOR_ARROW,.  IN
e8f0: 5f 52 48 53 2c 0a 20 20 4c 48 53 5f 41 4c 49 41  _RHS,.  LHS_ALIA
e900: 53 5f 31 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53  S_1,.  LHS_ALIAS
e910: 5f 32 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f  _2,.  LHS_ALIAS_
e920: 33 2c 0a 20 20 52 48 53 5f 41 4c 49 41 53 5f 31  3,.  RHS_ALIAS_1
e930: 2c 0a 20 20 52 48 53 5f 41 4c 49 41 53 5f 32 2c  ,.  RHS_ALIAS_2,
e940: 0a 20 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41  .  PRECEDENCE_MA
e950: 52 4b 5f 31 2c 0a 20 20 50 52 45 43 45 44 45 4e  RK_1,.  PRECEDEN
e960: 43 45 5f 4d 41 52 4b 5f 32 2c 0a 20 20 52 45 53  CE_MARK_2,.  RES
e970: 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
e980: 52 52 4f 52 2c 0a 20 20 52 45 53 59 4e 43 5f 41  RROR,.  RESYNC_A
e990: 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 2c  FTER_DECL_ERROR,
e9a0: 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44  .  WAITING_FOR_D
e9b0: 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c  ESTRUCTOR_SYMBOL
e9c0: 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ,.  WAITING_FOR_
e9d0: 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 2c  DATATYPE_SYMBOL,
e9e0: 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46  .  WAITING_FOR_F
e9f0: 41 4c 4c 42 41 43 4b 5f 49 44 2c 0a 20 20 57 41  ALLBACK_ID,.  WA
ea00: 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41  ITING_FOR_WILDCA
ea10: 52 44 5f 49 44 0a 7d 3b 0a 73 74 72 75 63 74 20  RD_ID.};.struct 
ea20: 70 73 74 61 74 65 20 7b 0a 20 20 63 68 61 72 20  pstate {.  char 
ea30: 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  *filename;      
ea40: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
ea50: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
ea60: 69 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b  int tokenlineno;
ea70: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d        /* Linenum
ea80: 62 65 72 20 61 74 20 77 68 69 63 68 20 63 75 72  ber at which cur
ea90: 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74 61 72 74  rent token start
eaa0: 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f 72  s */.  int error
eab0: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  cnt;         /* 
eac0: 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
ead0: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68 61   so far */.  cha
eae0: 72 20 2a 74 6f 6b 65 6e 73 74 61 72 74 3b 20 20  r *tokenstart;  
eaf0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 63 75     /* Text of cu
eb00: 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20  rrent token */. 
eb10: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67   struct lemon *g
eb20: 70 3b 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c  p;     /* Global
eb30: 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 2a 2f   state vector */
eb40: 0a 20 20 65 6e 75 6d 20 65 5f 73 74 61 74 65 20  .  enum e_state 
eb50: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  state;        /*
eb60: 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   The state of th
eb70: 65 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 73 74  e parser */.  st
eb80: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c  ruct symbol *fal
eb90: 6c 62 61 63 6b 3b 20 20 20 2f 2a 20 54 68 65 20  lback;   /* The 
eba0: 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20 2a  fallback token *
ebb0: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
ebc0: 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 20 20 2f  l *lhs;        /
ebd0: 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  * Left-hand side
ebe0: 20 6f 66 20 63 75 72 72 65 6e 74 20 72 75 6c 65   of current rule
ebf0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
ec00: 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 20   *lhsalias;     
ec10: 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68   /* Alias for th
ec20: 65 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 6e  e LHS */.  int n
ec30: 72 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  rhs;            
ec40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ec50: 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  of right-hand si
ec60: 64 65 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e 20  de symbols seen 
ec70: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
ec80: 6f 6c 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d 3b  ol *rhs[MAXRHS];
ec90: 20 20 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c 73    /* RHS symbols
eca0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
ecb0: 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d 3b   *alias[MAXRHS];
ecc0: 20 2f 2a 20 41 6c 69 61 73 65 73 20 66 6f 72 20   /* Aliases for 
ecd0: 65 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20  each RHS symbol 
ece0: 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73  (or NULL) */.  s
ecf0: 74 72 75 63 74 20 72 75 6c 65 20 2a 70 72 65 76  truct rule *prev
ed00: 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72 65  rule;     /* Pre
ed10: 76 69 6f 75 73 20 72 75 6c 65 20 70 61 72 73 65  vious rule parse
ed20: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
ed30: 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b 20  r *declkeyword; 
ed40: 20 20 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66 20    /* Keyword of 
ed50: 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  a declaration */
ed60: 0a 20 20 63 68 61 72 20 2a 2a 64 65 63 6c 61 72  .  char **declar
ed70: 67 73 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f 2a  gslot;        /*
ed80: 20 57 68 65 72 65 20 74 68 65 20 64 65 63 6c 61   Where the decla
ed90: 72 61 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20  ration argument 
eda0: 73 68 6f 75 6c 64 20 62 65 20 70 75 74 20 2a 2f  should be put */
edb0: 0a 20 20 69 6e 74 20 69 6e 73 65 72 74 4c 69 6e  .  int insertLin
edc0: 65 4d 61 63 72 6f 3b 20 20 20 20 20 20 20 2f 2a  eMacro;       /*
edd0: 20 41 64 64 20 23 6c 69 6e 65 20 62 65 66 6f 72   Add #line befor
ede0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e  e declaration in
edf0: 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64  sert */.  int *d
ee00: 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20 20  ecllinenoslot;  
ee10: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
ee20: 20 77 72 69 74 65 20 64 65 63 6c 61 72 61 74 69   write declarati
ee30: 6f 6e 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a  on line number *
ee40: 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63  /.  enum e_assoc
ee50: 20 64 65 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f   declassoc;    /
ee60: 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20 61 73  * Assign this as
ee70: 73 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64 65 63  sociation to dec
ee80: 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  l arguments */. 
ee90: 20 69 6e 74 20 70 72 65 63 63 6f 75 6e 74 65 72   int preccounter
eea0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
eeb0: 73 73 69 67 6e 20 74 68 69 73 20 70 72 65 63 65  ssign this prece
eec0: 64 65 6e 63 65 20 74 6f 20 64 65 63 6c 20 61 72  dence to decl ar
eed0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72  guments */.  str
eee0: 75 63 74 20 72 75 6c 65 20 2a 66 69 72 73 74 72  uct rule *firstr
eef0: 75 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ule;    /* Point
ef00: 65 72 20 74 6f 20 66 69 72 73 74 20 72 75 6c 65  er to first rule
ef10: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
ef20: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
ef30: 20 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20 20 20   *lastrule;     
ef40: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
ef50: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
ef60: 70 61 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d  parsed rule */.}
ef70: 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20 73 69  ;../* Parse a si
ef80: 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74  ngle token */.st
ef90: 61 74 69 63 20 76 6f 69 64 20 70 61 72 73 65 6f  atic void parseo
efa0: 6e 65 74 6f 6b 65 6e 28 73 74 72 75 63 74 20 70  netoken(struct p
efb0: 73 74 61 74 65 20 2a 70 73 70 29 0a 7b 0a 20 20  state *psp).{.  
efc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 3b 0a 20  const char *x;. 
efd0: 20 78 20 3d 20 53 74 72 73 61 66 65 28 70 73 70   x = Strsafe(psp
efe0: 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20  ->tokenstart);  
eff0: 20 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 74     /* Save the t
f000: 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79  oken permanently
f010: 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72 69 6e   */.#if 0.  prin
f020: 74 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e  tf("%s:%d: Token
f030: 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e  =[%s] state=%d\n
f040: 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  ",psp->filename,
f050: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
f060: 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73 74 61  ,.    x,psp->sta
f070: 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77  te);.#endif.  sw
f080: 69 74 63 68 28 20 70 73 70 2d 3e 73 74 61 74 65  itch( psp->state
f090: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 49 4e 49   ){.    case INI
f0a0: 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70  TIALIZE:.      p
f0b0: 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30  sp->prevrule = 0
f0c0: 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65  ;.      psp->pre
f0d0: 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20  ccounter = 0;.  
f0e0: 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75      psp->firstru
f0f0: 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75  le = psp->lastru
f100: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73  le = 0;.      ps
f110: 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30  p->gp->nrule = 0
f120: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
f130: 74 68 72 75 20 74 6f 20 6e 65 78 74 20 63 61 73  thru to next cas
f140: 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 57 41  e */.    case WA
f150: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
f160: 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20 69 66  R_RULE:.      if
f170: 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20  ( x[0]=='%' ){. 
f180: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f190: 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
f1a0: 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20  DECL_KEYWORD;.  
f1b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
f1c0: 6c 6f 77 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20  lower(x[0]) ){. 
f1d0: 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 20         psp->lhs 
f1e0: 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
f1f0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72  .        psp->nr
f200: 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  hs = 0;.        
f210: 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20  psp->lhsalias = 
f220: 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
f230: 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
f240: 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20  FOR_ARROW;.     
f250: 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d   }else if( x[0]=
f260: 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='{' ){.        
f270: 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c  if( psp->prevrul
f280: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
f290: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
f2a0: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
f2b0: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72  kenlineno,."Ther
f2c0: 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75  e is no prior ru
f2d0: 6c 65 20 6f 70 6f 6e 20 77 68 69 63 68 20 74 6f  le opon which to
f2e0: 20 61 74 74 61 63 68 20 74 68 65 20 63 6f 64 65   attach the code
f2f0: 20 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68 69 63   \.fragment whic
f300: 68 20 62 65 67 69 6e 73 20 6f 6e 20 74 68 69 73  h begins on this
f310: 20 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20   line.");.      
f320: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
f330: 74 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  t++;..}else if( 
f340: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63  psp->prevrule->c
f350: 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode!=0 ){.      
f360: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
f370: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
f380: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 6f  tokenlineno,."Co
f390: 64 65 20 66 72 61 67 6d 65 6e 74 20 62 65 67 69  de fragment begi
f3a0: 6e 6e 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69  nning on this li
f3b0: 6e 65 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69  ne is not the fi
f3c0: 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20  rst \.to follow 
f3d0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 75 6c  the previous rul
f3e0: 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e.");.          
f3f0: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
f400: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
f410: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
f420: 72 65 76 72 75 6c 65 2d 3e 6c 69 6e 65 20 3d 20  revrule->line = 
f430: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
f440: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
f450: 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65 20  >prevrule->code 
f460: 3d 20 26 78 5b 31 5d 3b 0a 09 7d 0a 20 20 20 20  = &x[1];..}.    
f470: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
f480: 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='[' ){.       
f490: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52   psp->state = PR
f4a0: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b  ECEDENCE_MARK_1;
f4b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f4c0: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
f4d0: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
f4e0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
f4f0: 20 20 20 20 20 20 20 20 20 22 54 6f 6b 65 6e 20           "Token 
f500: 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65  \"%s\" should be
f510: 20 65 69 74 68 65 72 20 5c 22 25 25 5c 22 20 6f   either \"%%\" o
f520: 72 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20  r a nonterminal 
f530: 6e 61 6d 65 2e 22 2c 0a 20 20 20 20 20 20 20 20  name.",.        
f540: 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73    x);.        ps
f550: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f560: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
f570: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45  ak;.    case PRE
f580: 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a  CEDENCE_MARK_1:.
f590: 20 20 20 20 20 20 69 66 28 20 21 69 73 75 70 70        if( !isupp
f5a0: 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  er(x[0]) ){.    
f5b0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
f5c0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
f5d0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
f5e0: 20 20 20 20 20 20 20 22 54 68 65 20 70 72 65 63         "The prec
f5f0: 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6d 75  edence symbol mu
f600: 73 74 20 62 65 20 61 20 74 65 72 6d 69 6e 61 6c  st be a terminal
f610: 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  .");.        psp
f620: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
f630: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73      }else if( ps
f640: 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20 29  p->prevrule==0 )
f650: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
f660: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
f670: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f680: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54 68  o,.          "Th
f690: 65 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20  ere is no prior 
f6a0: 72 75 6c 65 20 74 6f 20 61 73 73 69 67 6e 20 70  rule to assign p
f6b0: 72 65 63 65 64 65 6e 63 65 20 5c 22 5b 25 73 5d  recedence \"[%s]
f6c0: 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
f6d0: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f6e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f6f0: 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d  ( psp->prevrule-
f700: 3e 70 72 65 63 73 79 6d 21 3d 30 20 29 7b 0a 20  >precsym!=0 ){. 
f710: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f720: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f730: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f740: 22 50 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b  "Precedence mark
f750: 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73   on this line is
f760: 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 20 5c   not the first \
f770: 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70  .to follow the p
f780: 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b  revious rule.");
f790: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
f7a0: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
f7b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
f7c0: 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72  sp->prevrule->pr
f7d0: 65 63 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e  ecsym = Symbol_n
f7e0: 65 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ew(x);.      }. 
f7f0: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
f800: 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52  = PRECEDENCE_MAR
f810: 4b 5f 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  K_2;.      break
f820: 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45 43 45  ;.    case PRECE
f830: 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20  DENCE_MARK_2:.  
f840: 20 20 20 20 69 66 28 20 78 5b 30 5d 21 3d 27 5d      if( x[0]!=']
f850: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ' ){.        Err
f860: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
f870: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
f880: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
f890: 22 4d 69 73 73 69 6e 67 20 5c 22 5d 5c 22 20 6f  "Missing \"]\" o
f8a0: 6e 20 70 72 65 63 65 64 65 6e 63 65 20 6d 61 72  n precedence mar
f8b0: 6b 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  k.");.        ps
f8c0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f8d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 73 70       }.      psp
f8e0: 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
f8f0: 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
f900: 4c 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  LE;.      break;
f910: 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
f920: 47 5f 46 4f 52 5f 41 52 52 4f 57 3a 0a 20 20 20  G_FOR_ARROW:.   
f930: 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27     if( x[0]==':'
f940: 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26   && x[1]==':' &&
f950: 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20   x[2]=='=' ){.  
f960: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
f970: 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20   = IN_RHS;.     
f980: 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d   }else if( x[0]=
f990: 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='(' ){.        
f9a0: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53  psp->state = LHS
f9b0: 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20 20  _ALIAS_1;.      
f9c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
f9d0: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
f9e0: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
f9f0: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
fa00: 20 20 22 45 78 70 65 63 74 65 64 20 74 6f 20 73    "Expected to s
fa10: 65 65 20 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f  ee a \":\" follo
fa20: 77 69 6e 67 20 74 68 65 20 4c 48 53 20 73 79 6d  wing the LHS sym
fa30: 62 6f 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20  bol \"%s\".",.  
fa40: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
fa50: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
fa60: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
fa70: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
fa80: 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
fa90: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
faa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
fab0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48  eak;.    case LH
fac0: 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20  S_ALIAS_1:.     
fad0: 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30   if( isalpha(x[0
fae0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  ]) ){.        ps
faf0: 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 78 3b  p->lhsalias = x;
fb00: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
fb10: 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f  ate = LHS_ALIAS_
fb20: 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
fb30: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
fb40: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
fb50: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
fb60: 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 25 73  .          "\"%s
fb70: 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69  \" is not a vali
fb80: 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  d alias for the 
fb90: 4c 48 53 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20  LHS \"%s\"\n",. 
fba0: 20 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d 3e           x,psp->
fbb0: 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  lhs->name);.    
fbc0: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
fbd0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
fbe0: 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
fbf0: 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
fc00: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
fc10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
fc20: 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20   LHS_ALIAS_2:.  
fc30: 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29      if( x[0]==')
fc40: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
fc50: 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c  ->state = LHS_AL
fc60: 49 41 53 5f 33 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_3;.      }el
fc70: 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
fc80: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
fc90: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
fca0: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
fcb0: 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f  Missing \")\" fo
fcc0: 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61  llowing LHS alia
fcd0: 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c  s name \"%s\".",
fce0: 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a  psp->lhsalias);.
fcf0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
fd00: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
fd10: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
fd20: 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
fd30: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
fd40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fd50: 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 33  case LHS_ALIAS_3
fd60: 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
fd70: 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27  ==':' && x[1]=='
fd80: 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20  :' && x[2]=='=' 
fd90: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
fda0: 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a  state = IN_RHS;.
fdb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fdc0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
fdd0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
fde0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
fdf0: 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67          "Missing
fe00: 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e   \"->\" followin
fe10: 67 3a 20 5c 22 25 73 28 25 73 29 5c 22 2e 22 2c  g: \"%s(%s)\".",
fe20: 0a 20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  .           psp-
fe30: 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e  >lhs->name,psp->
fe40: 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20  lhsalias);.     
fe50: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
fe60: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
fe70: 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
fe80: 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
fe90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fea0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
feb0: 49 4e 5f 52 48 53 3a 0a 20 20 20 20 20 20 69 66  IN_RHS:.      if
fec0: 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
fed0: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 72 75         struct ru
fee0: 6c 65 20 2a 72 70 3b 0a 20 20 20 20 20 20 20 20  le *rp;.        
fef0: 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c  rp = (struct rul
ff00: 65 20 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65  e *)calloc( size
ff10: 6f 66 28 73 74 72 75 63 74 20 72 75 6c 65 29 20  of(struct rule) 
ff20: 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  + .             
ff30: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79  sizeof(struct sy
ff40: 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68 73  mbol*)*psp->nrhs
ff50: 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29   + sizeof(char*)
ff60: 2a 70 73 70 2d 3e 6e 72 68 73 2c 20 31 29 3b 0a  *psp->nrhs, 1);.
ff70: 20 20 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d          if( rp==
ff80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
ff90: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
ffa0: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
ffb0: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
ffc0: 20 20 20 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63      "Can't alloc
ffd0: 61 74 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72  ate enough memor
ffe0: 79 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65 2e  y for this rule.
fff0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ");.          ps
10000 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
10010 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
10020 65 76 72 75 6c 65 20 3d 20 30 3b 0a 09 7d 65 6c  evrule = 0;..}el
10030 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
10040 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 72  t i;.          r
10050 70 2d 3e 72 75 6c 65 6c 69 6e 65 20 3d 20 70 73  p->ruleline = ps
10060 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a  p->tokenlineno;.
10070 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
10080 73 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  s = (struct symb
10090 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b 0a 20 20 20  ol**)&rp[1];.   
100a0 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c         rp->rhsal
100b0 69 61 73 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ias = (const cha
100c0 72 2a 2a 29 26 28 72 70 2d 3e 72 68 73 5b 70 73  r**)&(rp->rhs[ps
100d0 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20 20 20 20 20  p->nrhs]);.     
100e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
100f0 70 73 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  psp->nrhs; i++){
10100 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d  .            rp-
10110 3e 72 68 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 72  >rhs[i] = psp->r
10120 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  hs[i];.         
10130 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b     rp->rhsalias[
10140 69 5d 20 3d 20 70 73 70 2d 3e 61 6c 69 61 73 5b  i] = psp->alias[
10150 69 5d 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20 20  i];..  }.       
10160 20 20 20 72 70 2d 3e 6c 68 73 20 3d 20 70 73 70     rp->lhs = psp
10170 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 20 20 20  ->lhs;.         
10180 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20   rp->lhsalias = 
10190 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a 20  psp->lhsalias;. 
101a0 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 72 68           rp->nrh
101b0 73 20 3d 20 70 73 70 2d 3e 6e 72 68 73 3b 0a 20  s = psp->nrhs;. 
101c0 20 20 20 20 20 20 20 20 20 72 70 2d 3e 63 6f 64           rp->cod
101d0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
101e0 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 30   rp->precsym = 0
101f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
10200 69 6e 64 65 78 20 3d 20 70 73 70 2d 3e 67 70 2d  index = psp->gp-
10210 3e 6e 72 75 6c 65 2b 2b 3b 0a 20 20 20 20 20 20  >nrule++;.      
10220 20 20 20 20 72 70 2d 3e 6e 65 78 74 6c 68 73 20      rp->nextlhs 
10230 3d 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 3b  = rp->lhs->rule;
10240 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c  .          rp->l
10250 68 73 2d 3e 72 75 6c 65 20 3d 20 72 70 3b 0a 20  hs->rule = rp;. 
10260 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 65 78           rp->nex
10270 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
10280 20 69 66 28 20 70 73 70 2d 3e 66 69 72 73 74 72   if( psp->firstr
10290 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ule==0 ){.      
102a0 20 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74        psp->first
102b0 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74  rule = psp->last
102c0 72 75 6c 65 20 3d 20 72 70 3b 0a 09 20 20 7d 65  rule = rp;..  }e
102d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
102e0 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 2d 3e   psp->lastrule->
102f0 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20 20 20 20  next = rp;.     
10300 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73 74         psp->last
10310 72 75 6c 65 20 3d 20 72 70 3b 0a 09 20 20 7d 0a  rule = rp;..  }.
10320 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
10330 72 65 76 72 75 6c 65 20 3d 20 72 70 3b 0a 09 7d  revrule = rp;..}
10340 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10350 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
10360 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
10370 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10380 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b  isalpha(x[0]) ){
10390 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70  .        if( psp
103a0 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20 29  ->nrhs>=MAXRHS )
103b0 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
103c0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
103d0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
103e0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
103f0 20 22 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62 6f   "Too many symbo
10400 6c 73 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c  ls on RHS of rul
10410 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 5c  e beginning at \
10420 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20  "%s\".",.       
10430 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20       x);.       
10440 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
10450 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
10460 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
10470 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
10480 4f 52 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20  OR;..}else{.    
10490 20 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b 70        psp->rhs[p
104a0 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 53 79 6d 62  sp->nrhs] = Symb
104b0 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
104c0 20 20 20 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b       psp->alias[
104d0 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 30 3b 0a  psp->nrhs] = 0;.
104e0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e            psp->n
104f0 72 68 73 2b 2b 3b 0a 09 7d 0a 20 20 20 20 20 20  rhs++;..}.      
10500 7d 65 6c 73 65 20 69 66 28 20 28 78 5b 30 5d 3d  }else if( (x[0]=
10510 3d 27 7c 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f  ='|' || x[0]=='/
10520 27 29 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e  ') && psp->nrhs>
10530 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  0 ){.        str
10540 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20  uct symbol *msp 
10550 3d 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e  = psp->rhs[psp->
10560 6e 72 68 73 2d 31 5d 3b 0a 20 20 20 20 20 20 20  nrhs-1];.       
10570 20 69 66 28 20 6d 73 70 2d 3e 74 79 70 65 21 3d   if( msp->type!=
10580 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
10590 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
105a0 74 20 73 79 6d 62 6f 6c 20 2a 6f 72 69 67 73 70  t symbol *origsp
105b0 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20   = msp;.        
105c0 20 20 6d 73 70 20 3d 20 28 73 74 72 75 63 74 20    msp = (struct 
105d0 73 79 6d 62 6f 6c 20 2a 29 20 63 61 6c 6c 6f 63  symbol *) calloc
105e0 28 31 2c 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29  (1,sizeof(*msp))
105f0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  ;.          mems
10600 65 74 28 6d 73 70 2c 20 30 2c 20 73 69 7a 65 6f  et(msp, 0, sizeo
10610 66 28 2a 6d 73 70 29 29 3b 0a 20 20 20 20 20 20  f(*msp));.      
10620 20 20 20 20 6d 73 70 2d 3e 74 79 70 65 20 3d 20      msp->type = 
10630 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 3b 0a 20  MULTITERMINAL;. 
10640 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73           msp->ns
10650 75 62 73 79 6d 20 3d 20 31 3b 0a 20 20 20 20 20  ubsym = 1;.     
10660 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d       msp->subsym
10670 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f   = (struct symbo
10680 6c 20 2a 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73  l **) calloc(1,s
10690 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
106a0 62 6f 6c 2a 29 29 3b 0a 20 20 20 20 20 20 20 20  bol*));.        
106b0 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d    msp->subsym[0]
106c0 20 3d 20 6f 72 69 67 73 70 3b 0a 20 20 20 20 20   = origsp;.     
106d0 20 20 20 20 20 6d 73 70 2d 3e 6e 61 6d 65 20 3d       msp->name =
106e0 20 6f 72 69 67 73 70 2d 3e 6e 61 6d 65 3b 0a 20   origsp->name;. 
106f0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68           psp->rh
10700 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d  s[psp->nrhs-1] =
10710 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   msp;.        }.
10720 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75          msp->nsu
10730 62 73 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  bsym++;.        
10740 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73  msp->subsym = (s
10750 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29  truct symbol **)
10760 20 72 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75   realloc(msp->su
10770 62 73 79 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  bsym,.          
10780 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79  sizeof(struct sy
10790 6d 62 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62  mbol*)*msp->nsub
107a0 73 79 6d 29 3b 0a 20 20 20 20 20 20 20 20 6d 73  sym);.        ms
107b0 70 2d 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e  p->subsym[msp->n
107c0 73 75 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62  subsym-1] = Symb
107d0 6f 6c 5f 6e 65 77 28 26 78 5b 31 5d 29 3b 0a 20  ol_new(&x[1]);. 
107e0 20 20 20 20 20 20 20 69 66 28 20 69 73 6c 6f 77         if( islow
107f0 65 72 28 78 5b 31 5d 29 20 7c 7c 20 69 73 6c 6f  er(x[1]) || islo
10800 77 65 72 28 6d 73 70 2d 3e 73 75 62 73 79 6d 5b  wer(msp->subsym[
10810 30 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a  0]->name[0]) ){.
10820 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
10830 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
10840 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
10850 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  o,.            "
10860 43 61 6e 6e 6f 74 20 66 6f 72 6d 20 61 20 63 6f  Cannot form a co
10870 6d 70 6f 75 6e 64 20 63 6f 6e 74 61 69 6e 69 6e  mpound containin
10880 67 20 61 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  g a non-terminal
10890 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ");.          ps
108a0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
108b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
108c0 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
108d0 28 27 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e  (' && psp->nrhs>
108e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  0 ){.        psp
108f0 2d 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c  ->state = RHS_AL
10900 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_1;.      }el
10910 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
10920 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
10930 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
10940 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
10950 49 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65  Illegal characte
10960 72 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65  r on RHS of rule
10970 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  : \"%s\".",x);. 
10980 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
10990 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
109a0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
109b0 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
109c0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
109d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
109e0 61 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 31 3a  ase RHS_ALIAS_1:
109f0 0a 20 20 20 20 20 20 69 66 28 20 69 73 61 6c 70  .      if( isalp
10a00 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ha(x[0]) ){.    
10a10 20 20 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70      psp->alias[p
10a20 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 78 3b  sp->nrhs-1] = x;
10a30 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10a40 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f  ate = RHS_ALIAS_
10a50 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  2;.      }else{.
10a60 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
10a70 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
10a80 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
10a90 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 25 73  .          "\"%s
10aa0 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69  \" is not a vali
10ab0 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  d alias for the 
10ac0 52 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c  RHS symbol \"%s\
10ad0 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "\n",.          
10ae0 78 2c 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e  x,psp->rhs[psp->
10af0 6e 72 68 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a  nrhs-1]->name);.
10b00 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
10b10 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
10b20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
10b30 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
10b40 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
10b50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10b60 63 61 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 32  case RHS_ALIAS_2
10b70 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
10b80 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20  ==')' ){.       
10b90 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e   psp->state = IN
10ba0 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _RHS;.      }els
10bb0 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
10bc0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
10bd0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
10be0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d  no,.          "M
10bf0 69 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c  issing \")\" fol
10c00 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73  lowing LHS alias
10c10 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70   name \"%s\".",p
10c20 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20  sp->lhsalias);. 
10c30 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
10c40 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
10c50 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
10c60 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
10c70 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
10c80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
10c90 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
10ca0 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20 20  DECL_KEYWORD:.  
10cb0 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28      if( isalpha(
10cc0 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
10cd0 20 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72   psp->declkeywor
10ce0 64 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70  d = x;.        p
10cf0 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
10d00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 0;.        psp
10d10 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74  ->decllinenoslot
10d20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
10d30 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
10d40 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ro = 1;.        
10d50 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
10d60 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52  TING_FOR_DECL_AR
10d70 47 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  G;.        if( s
10d80 74 72 63 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d  trcmp(x,"name")=
10d90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10da0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
10db0 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61   = &(psp->gp->na
10dc0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  me);.          p
10dd0 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
10de0 63 72 6f 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 20  cro = 0;..}else 
10df0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 69 6e  if( strcmp(x,"in
10e00 63 6c 75 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20  clude")==0 ){.  
10e10 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
10e20 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
10e30 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 29 3b 0a  ->gp->include);.
10e40 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
10e50 70 28 78 2c 22 63 6f 64 65 22 29 3d 3d 30 20 29  p(x,"code")==0 )
10e60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
10e70 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
10e80 28 70 73 70 2d 3e 67 70 2d 3e 65 78 74 72 61 63  (psp->gp->extrac
10e90 6f 64 65 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28  ode);..}else if(
10ea0 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e   strcmp(x,"token
10eb0 5f 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30  _destructor")==0
10ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
10ed0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
10ee0 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e   &psp->gp->token
10ef0 64 65 73 74 3b 0a 09 7d 65 6c 73 65 20 69 66 28  dest;..}else if(
10f00 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61 75   strcmp(x,"defau
10f10 6c 74 5f 64 65 73 74 72 75 63 74 6f 72 22 29 3d  lt_destructor")=
10f20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10f30 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
10f40 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 76 61 72   = &psp->gp->var
10f50 64 65 73 74 3b 0a 09 7d 65 6c 73 65 20 69 66 28  dest;..}else if(
10f60 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e   strcmp(x,"token
10f70 5f 70 72 65 66 69 78 22 29 3d 3d 30 20 29 7b 0a  _prefix")==0 ){.
10f80 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
10f90 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73  eclargslot = &ps
10fa0 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65 66  p->gp->tokenpref
10fb0 69 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ix;.          ps
10fc0 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
10fd0 72 6f 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 20 69  ro = 0;..}else i
10fe0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 79 6e  f( strcmp(x,"syn
10ff0 74 61 78 5f 65 72 72 6f 72 22 29 3d 3d 30 20 29  tax_error")==0 )
11000 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
11010 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
11020 28 70 73 70 2d 3e 67 70 2d 3e 65 72 72 6f 72 29  (psp->gp->error)
11030 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
11040 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 61 63 63  cmp(x,"parse_acc
11050 65 70 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ept")==0 ){.    
11060 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
11070 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
11080 67 70 2d 3e 61 63 63 65 70 74 29 3b 0a 09 7d 65  gp->accept);..}e
11090 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
110a0 2c 22 70 61 72 73 65 5f 66 61 69 6c 75 72 65 22  ,"parse_failure"
110b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
110c0 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
110d0 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
110e0 66 61 69 6c 75 72 65 29 3b 0a 09 7d 65 6c 73 65  failure);..}else
110f0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73   if( strcmp(x,"s
11100 74 61 63 6b 5f 6f 76 65 72 66 6c 6f 77 22 29 3d  tack_overflow")=
11110 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11120 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
11130 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6f 76   = &(psp->gp->ov
11140 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20  erflow);.       
11150 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11160 70 28 78 2c 22 65 78 74 72 61 5f 61 72 67 75 6d  p(x,"extra_argum
11170 65 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ent")==0 ){.    
11180 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
11190 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
111a0 67 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 20 20  gp->arg);.      
111b0 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
111c0 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20  ineMacro = 0;.  
111d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
111e0 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f  strcmp(x,"token_
111f0 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  type")==0 ){.   
11200 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
11210 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
11220 3e 67 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b  >gp->tokentype);
11230 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11240 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
11250 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
11260 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
11270 22 64 65 66 61 75 6c 74 5f 74 79 70 65 22 29 3d  "default_type")=
11280 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11290 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
112a0 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61   = &(psp->gp->va
112b0 72 74 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20  rtype);.        
112c0 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e    psp->insertLin
112d0 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20  eMacro = 0;.    
112e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
112f0 72 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f 73 69  rcmp(x,"stack_si
11300 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ze")==0 ){.     
11310 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
11320 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
11330 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20  p->stacksize);. 
11340 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
11350 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
11360 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
11370 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73   if( strcmp(x,"s
11380 74 61 72 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30  tart_symbol")==0
11390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
113a0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
113b0 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61 72   &(psp->gp->star
113c0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  t);.          ps
113d0 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
113e0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
113f0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
11400 28 78 2c 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b  (x,"left")==0 ){
11410 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11420 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  preccounter++;. 
11430 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
11440 63 6c 61 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a  classoc = LEFT;.
11450 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
11460 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
11470 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59  OR_PRECEDENCE_SY
11480 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65  MBOL;.        }e
11490 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
114a0 2c 22 72 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a  ,"right")==0 ){.
114b0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
114c0 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  reccounter++;.  
114d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
114e0 6c 61 73 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a  lassoc = RIGHT;.
114f0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
11500 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
11510 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59  OR_PRECEDENCE_SY
11520 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65  MBOL;.        }e
11530 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11540 2c 22 6e 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20  ,"nonassoc")==0 
11550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
11560 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b  ->preccounter++;
11570 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11580 64 65 63 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45  declassoc = NONE
11590 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
115a0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
115b0 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f  _FOR_PRECEDENCE_
115c0 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69  SYMBOL;..}else i
115d0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 73  f( strcmp(x,"des
115e0 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a  tructor")==0 ){.
115f0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
11600 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
11610 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59  OR_DESTRUCTOR_SY
11620 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69 66 28  MBOL;..}else if(
11630 20 73 74 72 63 6d 70 28 78 2c 22 74 79 70 65 22   strcmp(x,"type"
11640 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11650 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
11660 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54  AITING_FOR_DATAT
11670 59 50 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20  YPE_SYMBOL;.    
11680 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
11690 72 63 6d 70 28 78 2c 22 66 61 6c 6c 62 61 63 6b  rcmp(x,"fallback
116a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
116b0 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b     psp->fallback
116c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
116d0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
116e0 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43  TING_FOR_FALLBAC
116f0 4b 5f 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65  K_ID;.        }e
11700 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11710 2c 22 77 69 6c 64 63 61 72 64 22 29 3d 3d 30 20  ,"wildcard")==0 
11720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
11730 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
11740 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49  G_FOR_WILDCARD_I
11750 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  D;.        }else
11760 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
11770 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
11780 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
11790 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
117a0 20 22 55 6e 6b 6e 6f 77 6e 20 64 65 63 6c 61 72   "Unknown declar
117b0 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c  ation keyword: \
117c0 22 25 25 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20  "%%%s\".",x);.  
117d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
117e0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
117f0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
11800 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
11810 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
11820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11830 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
11840 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
11850 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
11860 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 64 65 63      "Illegal dec
11870 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64  laration keyword
11880 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  : \"%s\".",x);. 
11890 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
118a0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
118b0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
118c0 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
118d0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
118e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
118f0 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
11900 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f  DESTRUCTOR_SYMBO
11910 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  L:.      if( !is
11920 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
11930 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11940 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
11950 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
11960 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f            "Symbo
11970 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61  l name missing a
11980 66 74 65 72 20 25 64 65 73 74 72 75 63 74 6f 72  fter %destructor
11990 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20   keyword");.    
119a0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
119b0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
119c0 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
119d0 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
119e0 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
119f0 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
11a00 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62  ymbol *sp = Symb
11a10 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
11a20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
11a30 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 72  lot = &sp->destr
11a40 75 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  uctor;.        p
11a50 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
11a60 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 4c 69  ot = &sp->destLi
11a70 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70 73  neno;.        ps
11a80 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
11a90 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ro = 1;.        
11aa0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
11ab0 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52  TING_FOR_DECL_AR
11ac0 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  G;.      }.     
11ad0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
11ae0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54   WAITING_FOR_DAT
11af0 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20  ATYPE_SYMBOL:.  
11b00 20 20 20 20 69 66 28 20 21 69 73 61 6c 70 68 61      if( !isalpha
11b10 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
11b20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11b30 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11b40 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11b50 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d       "Symbol nam
11b60 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20  e missing after 
11b70 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79 77  %destructor keyw
11b80 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ord");.        p
11b90 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11ba0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11bb0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
11bc0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
11bd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11be0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
11bf0 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65   *sp = Symbol_ne
11c00 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  w(x);.        ps
11c10 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
11c20 20 26 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a   &sp->datatype;.
11c30 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
11c40 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30  ertLineMacro = 0
11c50 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
11c60 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
11c70 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20  OR_DECL_ARG;.   
11c80 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
11c90 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
11ca0 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43  NG_FOR_PRECEDENC
11cb0 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20  E_SYMBOL:.      
11cc0 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b  if( x[0]=='.' ){
11cd0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
11ce0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
11cf0 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
11d00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11d10 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b  isupper(x[0]) ){
11d20 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
11d30 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 20 20  symbol *sp;.    
11d40 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f      sp = Symbol_
11d50 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
11d60 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20  if( sp->prec>=0 
11d70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
11d80 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11d90 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
11da0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
11db0 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c 22    "Symbol \"%s\"
11dc0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 20   has already be 
11dd0 67 69 76 65 6e 20 61 20 70 72 65 63 65 64 65 6e  given a preceden
11de0 63 65 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  ce.",x);.       
11df0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
11e00 2b 2b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20  ++;..}else{.    
11e10 20 20 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d        sp->prec =
11e20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65   psp->preccounte
11e30 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d  r;.          sp-
11e40 3e 61 73 73 6f 63 20 3d 20 70 73 70 2d 3e 64 65  >assoc = psp->de
11e50 63 6c 61 73 73 6f 63 3b 0a 09 7d 0a 20 20 20 20  classoc;..}.    
11e60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11e70 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
11e80 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
11e90 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
11ea0 20 20 20 20 22 43 61 6e 27 74 20 61 73 73 69 67      "Can't assig
11eb0 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 74  n a precedence t
11ec0 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  o \"%s\".",x);. 
11ed0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
11ee0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
11ef0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11f00 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
11f10 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20 20 20  R_DECL_ARG:.    
11f20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20    if( x[0]=='{' 
11f30 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c  || x[0]=='\"' ||
11f40 20 69 73 61 6c 6e 75 6d 28 78 5b 30 5d 29 20 29   isalnum(x[0]) )
11f50 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
11f60 63 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e 65  char *zOld, *zNe
11f70 77 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  w;.        char 
11f80 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20 20 20 20  *zBuf, *z;.     
11f90 20 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e 2c 20     int nOld, n, 
11fa0 6e 4c 69 6e 65 2c 20 6e 4e 65 77 2c 20 6e 42 61  nLine, nNew, nBa
11fb0 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ck;.        int 
11fc0 61 64 64 4c 69 6e 65 4d 61 63 72 6f 3b 0a 20 20  addLineMacro;.  
11fd0 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65        char zLine
11fe0 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4e  [50];.        zN
11ff0 65 77 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  ew = x;.        
12000 69 66 28 20 7a 4e 65 77 5b 30 5d 3d 3d 27 22 27  if( zNew[0]=='"'
12010 20 7c 7c 20 7a 4e 65 77 5b 30 5d 3d 3d 27 7b 27   || zNew[0]=='{'
12020 20 29 20 7a 4e 65 77 2b 2b 3b 0a 20 20 20 20 20   ) zNew++;.     
12030 20 20 20 6e 4e 65 77 20 3d 20 6c 65 6d 6f 6e 53     nNew = lemonS
12040 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a 20 20 20  trlen(zNew);.   
12050 20 20 20 20 20 69 66 28 20 2a 70 73 70 2d 3e 64       if( *psp->d
12060 65 63 6c 61 72 67 73 6c 6f 74 20 29 7b 0a 20 20  eclargslot ){.  
12070 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20 2a          zOld = *
12080 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
12090 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
120a0 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20  .          zOld 
120b0 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = "";.        }.
120c0 20 20 20 20 20 20 20 20 6e 4f 6c 64 20 3d 20 6c          nOld = l
120d0 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f 6c 64 29  emonStrlen(zOld)
120e0 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 4f  ;.        n = nO
120f0 6c 64 20 2b 20 6e 4e 65 77 20 2b 20 32 30 3b 0a  ld + nNew + 20;.
12100 20 20 20 20 20 20 20 20 61 64 64 4c 69 6e 65 4d          addLineM
12110 61 63 72 6f 20 3d 20 21 70 73 70 2d 3e 67 70 2d  acro = !psp->gp-
12120 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 26  >nolinenosflag &
12130 26 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e  & psp->insertLin
12140 65 4d 61 63 72 6f 20 26 26 0a 20 20 20 20 20 20  eMacro &&.      
12150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12160 20 20 28 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65    (psp->declline
12170 6e 6f 73 6c 6f 74 3d 3d 30 20 7c 7c 20 70 73 70  noslot==0 || psp
12180 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74  ->decllinenoslot
12190 5b 30 5d 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  [0]!=0);.       
121a0 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61 63 72   if( addLineMacr
121b0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  o ){.          f
121c0 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e 61  or(z=psp->filena
121d0 6d 65 2c 20 6e 42 61 63 6b 3d 30 3b 20 2a 7a 3b  me, nBack=0; *z;
121e0 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   z++){.         
121f0 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20     if( *z=='\\' 
12200 29 20 6e 42 61 63 6b 2b 2b 3b 0a 20 20 20 20 20  ) nBack++;.     
12210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12220 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20   sprintf(zLine, 
12230 22 23 6c 69 6e 65 20 25 64 20 22 2c 20 70 73 70  "#line %d ", psp
12240 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 29 3b 0a  ->tokenlineno);.
12250 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65 20            nLine 
12260 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4c  = lemonStrlen(zL
12270 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ine);.          
12280 6e 20 2b 3d 20 6e 4c 69 6e 65 20 2b 20 6c 65 6d  n += nLine + lem
12290 6f 6e 53 74 72 6c 65 6e 28 70 73 70 2d 3e 66 69  onStrlen(psp->fi
122a0 6c 65 6e 61 6d 65 29 20 2b 20 6e 42 61 63 6b 3b  lename) + nBack;
122b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
122c0 20 20 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67     *psp->declarg
122d0 73 6c 6f 74 20 3d 20 28 63 68 61 72 20 2a 29 20  slot = (char *) 
122e0 72 65 61 6c 6c 6f 63 28 2a 70 73 70 2d 3e 64 65  realloc(*psp->de
122f0 63 6c 61 72 67 73 6c 6f 74 2c 20 6e 29 3b 0a 20  clargslot, n);. 
12300 20 20 20 20 20 20 20 7a 42 75 66 20 3d 20 2a 70         zBuf = *p
12310 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
12320 2b 20 6e 4f 6c 64 3b 0a 20 20 20 20 20 20 20 20  + nOld;.        
12330 69 66 28 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f  if( addLineMacro
12340 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
12350 28 20 6e 4f 6c 64 20 26 26 20 7a 42 75 66 5b 2d  ( nOld && zBuf[-
12360 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]!='\n' ){.    
12370 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b          *(zBuf++
12380 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20  ) = '\n';.      
12390 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
123a0 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69  memcpy(zBuf, zLi
123b0 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20  ne, nLine);.    
123c0 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4c        zBuf += nL
123d0 69 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  ine;.          *
123e0 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a  (zBuf++) = '"';.
123f0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 7a 3d            for(z=
12400 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b 20 2a  psp->filename; *
12410 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; z++){.       
12420 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c       if( *z=='\\
12430 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
12440 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27     *(zBuf++) = '
12450 5c 5c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  \\';.           
12460 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a   }.            *
12470 28 7a 42 75 66 2b 2b 29 20 3d 20 2a 7a 3b 0a 20  (zBuf++) = *z;. 
12480 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12490 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
124a0 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '"';.          
124b0 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27  *(zBuf++) = '\n'
124c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
124d0 20 20 20 20 69 66 28 20 70 73 70 2d 3e 64 65 63      if( psp->dec
124e0 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 26 26 20 70  llinenoslot && p
124f0 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
12500 6f 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ot[0]==0 ){.    
12510 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c        psp->decll
12520 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 20 3d 20 70  inenoslot[0] = p
12530 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b  sp->tokenlineno;
12540 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12550 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
12560 7a 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  zNew, nNew);.   
12570 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4e 65       zBuf += nNe
12580 77 3b 0a 20 20 20 20 20 20 20 20 2a 7a 42 75 66  w;.        *zBuf
12590 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
125a0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
125b0 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
125c0 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
125d0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
125e0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
125f0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
12600 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c  o,.          "Il
12610 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e 74 20 74  legal argument t
12620 6f 20 25 25 25 73 3a 20 25 73 22 2c 70 73 70 2d  o %%%s: %s",psp-
12630 3e 64 65 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b  >declkeyword,x);
12640 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
12650 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
12660 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
12670 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
12680 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
12690 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
126a0 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
126b0 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20  R_FALLBACK_ID:. 
126c0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
126d0 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  .' ){.        ps
126e0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
126f0 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
12700 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
12710 20 69 66 28 20 21 69 73 75 70 70 65 72 28 78 5b   if( !isupper(x[
12720 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
12730 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
12740 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65  ename, psp->toke
12750 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
12760 20 20 20 22 25 25 66 61 6c 6c 62 61 63 6b 20 61     "%%fallback a
12770 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73  rgument \"%s\" s
12780 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e  hould be a token
12790 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ", x);.        p
127a0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
127b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
127c0 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
127d0 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ol *sp = Symbol_
127e0 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
127f0 69 66 28 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63  if( psp->fallbac
12800 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
12810 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20    psp->fallback 
12820 3d 20 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 65  = sp;.        }e
12830 6c 73 65 20 69 66 28 20 73 70 2d 3e 66 61 6c 6c  lse if( sp->fall
12840 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
12850 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
12860 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74  filename, psp->t
12870 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
12880 20 20 20 20 20 20 20 20 22 4d 6f 72 65 20 74 68          "More th
12890 61 6e 20 6f 6e 65 20 66 61 6c 6c 62 61 63 6b 20  an one fallback 
128a0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 6f 6b 65  assigned to toke
128b0 6e 20 25 73 22 2c 20 78 29 3b 0a 20 20 20 20 20  n %s", x);.     
128c0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
128d0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  nt++;.        }e
128e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
128f0 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 70 73  p->fallback = ps
12900 70 2d 3e 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20  p->fallback;.   
12910 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e         psp->gp->
12920 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 3d 20 31  has_fallback = 1
12930 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12940 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
12950 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
12960 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49  G_FOR_WILDCARD_I
12970 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  D:.      if( x[0
12980 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
12990 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
129a0 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
129b0 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d  OR_RULE;.      }
129c0 65 6c 73 65 20 69 66 28 20 21 69 73 75 70 70 65  else if( !isuppe
129d0 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  r(x[0]) ){.     
129e0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
129f0 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e  >filename, psp->
12a00 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
12a10 20 20 20 20 20 20 20 22 25 25 77 69 6c 64 63 61         "%%wildca
12a20 72 64 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73  rd argument \"%s
12a30 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74  \" should be a t
12a40 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20  oken", x);.     
12a50 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
12a60 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
12a70 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
12a80 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d  symbol *sp = Sym
12a90 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
12aa0 20 20 20 20 69 66 28 20 70 73 70 2d 3e 67 70 2d      if( psp->gp-
12ab0 3e 77 69 6c 64 63 61 72 64 3d 3d 30 20 29 7b 0a  >wildcard==0 ){.
12ac0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67            psp->g
12ad0 70 2d 3e 77 69 6c 64 63 61 72 64 20 3d 20 73 70  p->wildcard = sp
12ae0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
12af0 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
12b00 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
12b10 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
12b20 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
12b30 20 22 45 78 74 72 61 20 77 69 6c 64 63 61 72 64   "Extra wildcard
12b40 20 74 6f 20 74 6f 6b 65 6e 3a 20 25 73 22 2c 20   to token: %s", 
12b50 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
12b60 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
12b70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12b80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12b90 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46    case RESYNC_AF
12ba0 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3a 0a  TER_RULE_ERROR:.
12bb0 2f 2a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  /*      if( x[0]
12bc0 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74 61  =='.' ) psp->sta
12bd0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
12be0 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 2a  _DECL_OR_RULE;.*
12bf0 2a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2a 2f  *      break; */
12c00 0a 20 20 20 20 63 61 73 65 20 52 45 53 59 4e 43  .    case RESYNC
12c10 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
12c20 52 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  R:.      if( x[0
12c30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74  ]=='.' ) psp->st
12c40 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
12c50 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
12c60 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
12c70 27 25 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65  '%' ) psp->state
12c80 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
12c90 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20  ECL_KEYWORD;.   
12ca0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a     break;.  }.}.
12cb0 0a 2f 2a 20 52 75 6e 20 74 68 65 20 70 72 65 70  ./* Run the prep
12cc0 72 6f 63 65 73 73 6f 72 20 6f 76 65 72 20 74 68  rocessor over th
12cd0 65 20 69 6e 70 75 74 20 66 69 6c 65 20 74 65 78  e input file tex
12ce0 74 2e 20 20 54 68 65 20 67 6c 6f 62 61 6c 20 76  t.  The global v
12cf0 61 72 69 61 62 6c 65 73 0a 2a 2a 20 61 7a 44 65  ariables.** azDe
12d00 66 69 6e 65 5b 30 5d 20 74 68 72 6f 75 67 68 20  fine[0] through 
12d10 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65  azDefine[nDefine
12d20 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  -1] contains the
12d30 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 64 65   names of all de
12d40 66 69 6e 65 64 0a 2a 2a 20 6d 61 63 72 6f 73 2e  fined.** macros.
12d50 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c    This routine l
12d60 6f 6f 6b 73 20 66 6f 72 20 22 25 69 66 64 65 66  ooks for "%ifdef
12d70 22 20 61 6e 64 20 22 25 69 66 6e 64 65 66 22 20  " and "%ifndef" 
12d80 61 6e 64 20 22 25 65 6e 64 69 66 22 20 61 6e 64  and "%endif" and
12d90 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73 20 74 68 65  .** comments the
12da0 6d 20 6f 75 74 2e 20 20 54 65 78 74 20 69 6e 20  m out.  Text in 
12db0 62 65 74 77 65 65 6e 20 69 73 20 61 6c 73 6f 20  between is also 
12dc0 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 20 61 73  commented out as
12dd0 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
12de0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 65  .static void pre
12df0 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 63 68  process_input(ch
12e00 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c  ar *z){.  int i,
12e10 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20   j, k, n;.  int 
12e20 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 69  exclude = 0;.  i
12e30 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  nt start = 0;.  
12e40 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a  int lineno = 1;.
12e50 20 20 69 6e 74 20 73 74 61 72 74 5f 6c 69 6e 65    int start_line
12e60 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  no = 1;.  for(i=
12e70 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
12e80 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e     if( z[i]=='\n
12e90 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
12ea0 20 20 69 66 28 20 7a 5b 69 5d 21 3d 27 25 27 20    if( z[i]!='%' 
12eb0 7c 7c 20 28 69 3e 30 20 26 26 20 7a 5b 69 2d 31  || (i>0 && z[i-1
12ec0 5d 21 3d 27 5c 6e 27 29 20 29 20 63 6f 6e 74 69  ]!='\n') ) conti
12ed0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 72  nue;.    if( str
12ee0 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 65 6e 64  ncmp(&z[i],"%end
12ef0 69 66 22 2c 36 29 3d 3d 30 20 26 26 20 69 73 73  if",6)==0 && iss
12f00 70 61 63 65 28 7a 5b 69 2b 36 5d 29 20 29 7b 0a  pace(z[i+6]) ){.
12f10 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64        if( exclud
12f20 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78 63  e ){.        exc
12f30 6c 75 64 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20  lude--;.        
12f40 69 66 28 20 65 78 63 6c 75 64 65 3d 3d 30 20 29  if( exclude==0 )
12f50 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
12f60 6a 3d 73 74 61 72 74 3b 20 6a 3c 69 3b 20 6a 2b  j=start; j<i; j+
12f70 2b 29 20 69 66 28 20 7a 5b 6a 5d 21 3d 27 5c 6e  +) if( z[j]!='\n
12f80 27 20 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a  ' ) z[j] = ' ';.
12f90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12fa0 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b  }.      for(j=i;
12fb0 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27   z[j] && z[j]!='
12fc0 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d  \n'; j++) z[j] =
12fd0 20 27 20 27 3b 0a 20 20 20 20 7d 65 6c 73 65 20   ' ';.    }else 
12fe0 69 66 28 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b  if( (strncmp(&z[
12ff0 69 5d 2c 22 25 69 66 64 65 66 22 2c 36 29 3d 3d  i],"%ifdef",6)==
13000 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69  0 && isspace(z[i
13010 2b 36 5d 29 29 0a 20 20 20 20 20 20 20 20 20 20  +6])).          
13020 7c 7c 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b 69  || (strncmp(&z[i
13030 5d 2c 22 25 69 66 6e 64 65 66 22 2c 37 29 3d 3d  ],"%ifndef",7)==
13040 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69  0 && isspace(z[i
13050 2b 37 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 69  +7])) ){.      i
13060 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20  f( exclude ){.  
13070 20 20 20 20 20 20 65 78 63 6c 75 64 65 2b 2b 3b        exclude++;
13080 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13090 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 37 3b        for(j=i+7;
130a0 20 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29 3b 20   isspace(z[j]); 
130b0 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 66  j++){}.        f
130c0 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b 6e 5d 20 26  or(n=0; z[j+n] &
130d0 26 20 21 69 73 73 70 61 63 65 28 7a 5b 6a 2b 6e  & !isspace(z[j+n
130e0 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); n++){}.     
130f0 20 20 20 65 78 63 6c 75 64 65 20 3d 20 31 3b 0a     exclude = 1;.
13100 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
13110 20 6b 3c 6e 44 65 66 69 6e 65 3b 20 6b 2b 2b 29   k<nDefine; k++)
13120 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
13130 73 74 72 6e 63 6d 70 28 61 7a 44 65 66 69 6e 65  strncmp(azDefine
13140 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29 3d 3d 30 20  [k],&z[j],n)==0 
13150 26 26 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61  && lemonStrlen(a
13160 7a 44 65 66 69 6e 65 5b 6b 5d 29 3d 3d 6e 20 29  zDefine[k])==n )
13170 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  {.            ex
13180 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  clude = 0;.     
13190 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
131a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
131b0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
131c0 7a 5b 69 2b 33 5d 3d 3d 27 6e 27 20 29 20 65 78  z[i+3]=='n' ) ex
131d0 63 6c 75 64 65 20 3d 20 21 65 78 63 6c 75 64 65  clude = !exclude
131e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78  ;.        if( ex
131f0 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20  clude ){.       
13200 20 20 20 73 74 61 72 74 20 3d 20 69 3b 0a 20 20     start = i;.  
13210 20 20 20 20 20 20 20 20 73 74 61 72 74 5f 6c 69          start_li
13220 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20  neno = lineno;. 
13230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13240 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20  .      for(j=i; 
13250 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27 5c  z[j] && z[j]!='\
13260 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d 20  n'; j++) z[j] = 
13270 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ' ';.    }.  }. 
13280 20 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a   if( exclude ){.
13290 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
132a0 72 72 2c 22 75 6e 74 65 72 6d 69 6e 61 74 65 64  rr,"unterminated
132b0 20 25 25 69 66 64 65 66 20 73 74 61 72 74 69 6e   %%ifdef startin
132c0 67 20 6f 6e 20 6c 69 6e 65 20 25 64 5c 6e 22 2c  g on line %d\n",
132d0 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 29 3b 0a   start_lineno);.
132e0 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
132f0 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70 69 74 65 20  .}../* In spite 
13300 6f 66 20 69 74 73 20 6e 61 6d 65 2c 20 74 68 69  of its name, thi
13310 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
13320 61 6c 6c 79 20 61 20 73 63 61 6e 6e 65 72 2e 20  ally a scanner. 
13330 20 49 74 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74   It read.** in t
13340 68 65 20 65 6e 74 69 72 65 20 69 6e 70 75 74 20  he entire input 
13350 66 69 6c 65 20 28 61 6c 6c 20 61 74 20 6f 6e 63  file (all at onc
13360 65 29 20 74 68 65 6e 20 74 6f 6b 65 6e 69 7a 65  e) then tokenize
13370 73 20 69 74 2e 20 20 45 61 63 68 0a 2a 2a 20 74  s it.  Each.** t
13380 6f 6b 65 6e 20 69 73 20 70 61 73 73 65 64 20 74  oken is passed t
13390 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 22  o the function "
133a0 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 22 20 77  parseonetoken" w
133b0 68 69 63 68 20 62 75 69 6c 64 73 20 61 6c 6c 0a  hich builds all.
133c0 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ** the appropria
133d0 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  te data structur
133e0 65 73 20 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c  es in the global
133f0 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 22 67   state vector "g
13400 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20 50 61 72 73  p"..*/.void Pars
13410 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  e(struct lemon *
13420 67 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 70  gp).{.  struct p
13430 73 74 61 74 65 20 70 73 3b 0a 20 20 46 49 4c 45  state ps;.  FILE
13440 20 2a 66 70 3b 0a 20 20 63 68 61 72 20 2a 66 69   *fp;.  char *fi
13450 6c 65 62 75 66 3b 0a 20 20 69 6e 74 20 66 69 6c  lebuf;.  int fil
13460 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e  esize;.  int lin
13470 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  eno;.  int c;.  
13480 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63  char *cp, *nextc
13490 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69  p;.  int startli
134a0 6e 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65  ne = 0;..  memse
134b0 74 28 26 70 73 2c 20 27 5c 30 27 2c 20 73 69 7a  t(&ps, '\0', siz
134c0 65 6f 66 28 70 73 29 29 3b 0a 20 20 70 73 2e 67  eof(ps));.  ps.g
134d0 70 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c  p = gp;.  ps.fil
134e0 65 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65  ename = gp->file
134f0 6e 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72  name;.  ps.error
13500 63 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74  cnt = 0;.  ps.st
13510 61 74 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45  ate = INITIALIZE
13520 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
13530 20 72 65 61 64 69 6e 67 20 74 68 65 20 69 6e 70   reading the inp
13540 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20  ut file */.  fp 
13550 3d 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e  = fopen(ps.filen
13560 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28  ame,"rb");.  if(
13570 20 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72   fp==0 ){.    Er
13580 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
13590 6d 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e  me,0,"Can't open
135a0 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 72   this file for r
135b0 65 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67  eading.");.    g
135c0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
135d0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
135e0 20 66 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a   fseek(fp,0,2);.
135f0 20 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74 65    filesize = fte
13600 6c 6c 28 66 70 29 3b 0a 20 20 72 65 77 69 6e 64  ll(fp);.  rewind
13610 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 20  (fp);.  filebuf 
13620 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63  = (char *)malloc
13630 28 20 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a  ( filesize+1 );.
13640 20 20 69 66 28 20 66 69 6c 65 62 75 66 3d 3d 30    if( filebuf==0
13650 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67   ){.    ErrorMsg
13660 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22  (ps.filename,0,"
13670 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 25  Can't allocate %
13680 64 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 68  d of memory to h
13690 6f 6c 64 20 74 68 69 73 20 66 69 6c 65 2e 22 2c  old this file.",
136a0 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65 2b  .      filesize+
136b0 31 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f  1);.    gp->erro
136c0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
136d0 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72  rn;.  }.  if( fr
136e0 65 61 64 28 66 69 6c 65 62 75 66 2c 31 2c 66 69  ead(filebuf,1,fi
136f0 6c 65 73 69 7a 65 2c 66 70 29 21 3d 66 69 6c 65  lesize,fp)!=file
13700 73 69 7a 65 20 29 7b 0a 20 20 20 20 45 72 72 6f  size ){.    Erro
13710 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65  rMsg(ps.filename
13720 2c 30 2c 22 43 61 6e 27 74 20 72 65 61 64 20 69  ,0,"Can't read i
13730 6e 20 61 6c 6c 20 25 64 20 62 79 74 65 73 20 6f  n all %d bytes o
13740 66 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20  f this file.",. 
13750 20 20 20 20 20 66 69 6c 65 73 69 7a 65 29 3b 0a       filesize);.
13760 20 20 20 20 66 72 65 65 28 66 69 6c 65 62 75 66      free(filebuf
13770 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72  );.    gp->error
13780 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
13790 6e 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  n;.  }.  fclose(
137a0 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 5b 66  fp);.  filebuf[f
137b0 69 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20  ilesize] = 0;.. 
137c0 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 69 6e 69 74   /* Make an init
137d0 69 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67 68  ial pass through
137e0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 68 61 6e   the file to han
137f0 64 6c 65 20 25 69 66 64 65 66 20 61 6e 64 20 25  dle %ifdef and %
13800 69 66 6e 64 65 66 20 2a 2f 0a 20 20 70 72 65 70  ifndef */.  prep
13810 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 66 69 6c  rocess_input(fil
13820 65 62 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77  ebuf);..  /* Now
13830 20 73 63 61 6e 20 74 68 65 20 74 65 78 74 20 6f   scan the text o
13840 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
13850 20 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31   */.  lineno = 1
13860 3b 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c 65 62  ;.  for(cp=fileb
13870 75 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 3b  uf; (c= *cp)!=0;
13880 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   ){.    if( c=='
13890 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n' ) lineno++; 
138a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
138b0 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
138c0 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f  e line number */
138d0 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65  .    if( isspace
138e0 28 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63 6f 6e  (c) ){ cp++; con
138f0 74 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53 6b 69  tinue; }  /* Ski
13900 70 20 61 6c 6c 20 77 68 69 74 65 20 73 70 61 63  p all white spac
13910 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d  e */.    if( c==
13920 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f  '/' && cp[1]=='/
13930 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a  ' ){          /*
13940 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20   Skip C++ style 
13950 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  comments */.    
13960 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77    cp+=2;.      w
13970 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
13980 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63  0 && c!='\n' ) c
13990 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  p++;.      conti
139a0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
139b0 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b  f( c=='/' && cp[
139c0 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20 20 20  1]=='*' ){      
139d0 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 20 73 74      /* Skip C st
139e0 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a  yle comments */.
139f0 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20        cp+=2;.   
13a00 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63     while( (c= *c
13a10 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f 27  p)!=0 && (c!='/'
13a20 20 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a 27 29   || cp[-1]!='*')
13a30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
13a40 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  c=='\n' ) lineno
13a50 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b 2b  ++;.        cp++
13a60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13a70 69 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a 20 20  if( c ) cp++;.  
13a80 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
13a90 20 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e    }.    ps.token
13aa0 73 74 61 72 74 20 3d 20 63 70 3b 20 20 20 20 20  start = cp;     
13ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
13ac0 72 6b 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  rk the beginning
13ad0 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f   of the token */
13ae0 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c 69 6e  .    ps.tokenlin
13af0 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20 20  eno = lineno;   
13b00 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e          /* Linen
13b10 75 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 20 74  umber on which t
13b20 6f 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f 0a 20  oken begins */. 
13b30 20 20 20 69 66 28 20 63 3d 3d 27 5c 22 27 20 29     if( c=='\"' )
13b40 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
13b50 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20        /* String 
13b60 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20  literals */.    
13b70 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68    cp++;.      wh
13b80 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
13b90 20 26 26 20 63 21 3d 27 5c 22 27 20 29 7b 0a 20   && c!='\"' ){. 
13ba0 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
13bb0 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n' ) lineno++;. 
13bc0 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20         cp++;.   
13bd0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
13be0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
13bf0 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e  rrorMsg(ps.filen
13c00 61 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c 0a 22  ame,startline,."
13c10 53 74 72 69 6e 67 20 73 74 61 72 74 69 6e 67 20  String starting 
13c20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20  on this line is 
13c30 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62  not terminated b
13c40 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66  efore the end of
13c50 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20   the file.");.  
13c60 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e        ps.errorcn
13c70 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78  t++;.        nex
13c80 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20  tcp = cp;.      
13c90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
13ca0 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20  extcp = cp+1;.  
13cb0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
13cc0 69 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20 20 20  if( c=='{' ){   
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
13ce0 20 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f 64 65   block of C code
13cf0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 65   */.      int le
13d00 76 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b 2b 3b  vel;.      cp++;
13d10 0a 20 20 20 20 20 20 66 6f 72 28 6c 65 76 65 6c  .      for(level
13d20 3d 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  =1; (c= *cp)!=0 
13d30 26 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c 20 63  && (level>1 || c
13d40 21 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a 20  !='}'); cp++){. 
13d50 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
13d60 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n' ) lineno++;. 
13d70 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20         else if( 
13d80 63 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c 2b 2b  c=='{' ) level++
13d90 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69  ;.        else i
13da0 66 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65 76 65  f( c=='}' ) leve
13db0 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65 6c 73  l--;.        els
13dc0 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20  e if( c=='/' && 
13dd0 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 2f  cp[1]=='*' ){  /
13de0 2a 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74 73 20  * Skip comments 
13df0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  */.          int
13e00 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20   prevc;.        
13e10 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20    cp = &cp[2];. 
13e20 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d           prevc =
13e30 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68   0;.          wh
13e40 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
13e50 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 70   && (c!='/' || p
13e60 72 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a 20 20  revc!='*') ){.  
13e70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
13e80 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
13e90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ;.            pr
13ea0 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  evc = c;.       
13eb0 20 20 20 20 20 63 70 2b 2b 3b 0a 09 20 20 7d 0a       cp++;..  }.
13ec0 09 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f  .}else if( c=='/
13ed0 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20  ' && cp[1]=='/' 
13ee0 29 7b 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20  ){  /* Skip C++ 
13ef0 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 74  style comments t
13f00 6f 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  oo */.          
13f10 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20  cp = &cp[2];.   
13f20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
13f30 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d  = *cp)!=0 && c!=
13f40 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20  '\n' ) cp++;.   
13f50 20 20 20 20 20 20 20 69 66 28 20 63 20 29 20 6c         if( c ) l
13f60 69 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65 6c 73 65 20  ineno++;..}else 
13f70 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63  if( c=='\'' || c
13f80 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20  =='\"' ){    /* 
13f90 53 74 72 69 6e 67 20 61 20 63 68 61 72 61 63 74  String a charact
13fa0 65 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20  er literals */. 
13fb0 20 20 20 20 20 20 20 20 20 69 6e 74 20 73 74 61           int sta
13fc0 72 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a 20  rtchar, prevc;. 
13fd0 20 20 20 20 20 20 20 20 20 73 74 61 72 74 63 68           startch
13fe0 61 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  ar = c;.        
13ff0 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20    prevc = 0;.   
14000 20 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b         for(cp++;
14010 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
14020 28 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c 7c  (c!=startchar ||
14030 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63   prevc=='\\'); c
14040 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  p++){.          
14050 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
14060 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
14070 20 20 20 20 20 20 69 66 28 20 70 72 65 76 63 3d        if( prevc=
14080 3d 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d 20  ='\\' ) prevc = 
14090 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  0;.            e
140a0 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
140b0 20 70 72 65 76 63 20 3d 20 63 3b 0a 09 20 20 7d   prevc = c;..  }
140c0 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ..}.      }.    
140d0 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
140e0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
140f0 73 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74 6f  s.filename,ps.to
14100 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63 6f  kenlineno,."C co
14110 64 65 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74  de starting on t
14120 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20  his line is not 
14130 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72  terminated befor
14140 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
14150 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20   file.");.      
14160 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b    ps.errorcnt++;
14170 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20  .        nextcp 
14180 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = cp;.      }els
14190 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63  e{.        nextc
141a0 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20  p = cp+1;.      
141b0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
141c0 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 20 20 20  isalnum(c) ){   
141d0 20 20 20 20 20 20 20 2f 2a 20 49 64 65 6e 74 69         /* Identi
141e0 66 69 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 77  fiers */.      w
141f0 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
14200 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 63 29  0 && (isalnum(c)
14210 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70   || c=='_') ) cp
14220 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70  ++;.      nextcp
14230 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65   = cp;.    }else
14240 20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20 63   if( c==':' && c
14250 70 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70 5b  p[1]==':' && cp[
14260 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54 68  2]=='=' ){ /* Th
14270 65 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d 22  e operator "::="
14280 20 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d 20   */.      cp += 
14290 33 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20  3;.      nextcp 
142a0 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = cp;.    }else 
142b0 69 66 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20 63  if( (c=='/' || c
142c0 3d 3d 27 7c 27 29 20 26 26 20 69 73 61 6c 70 68  =='|') && isalph
142d0 61 28 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20 20  a(cp[1]) ){.    
142e0 20 20 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20 20    cp += 2;.     
142f0 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 63 70   while( (c = *cp
14300 29 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d  )!=0 && (isalnum
14310 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29  (c) || c=='_') )
14320 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78   cp++;.      nex
14330 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65  tcp = cp;.    }e
14340 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14360 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20   All other (one 
14370 63 68 61 72 61 63 74 65 72 29 20 6f 70 65 72 61  character) opera
14380 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70  tors */.      cp
14390 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70  ++;.      nextcp
143a0 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20   = cp;.    }.   
143b0 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63   c = *cp;.    *c
143c0 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
143d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
143e0 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   Null terminate 
143f0 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20  the token */.   
14400 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26   parseonetoken(&
14410 70 73 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ps);            
14420 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f   /* Parse the to
14430 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d  ken */.    *cp =
14440 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   c;             
14450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
14460 73 74 6f 72 65 20 74 68 65 20 62 75 66 66 65 72  store the buffer
14470 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78   */.    cp = nex
14480 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28  tcp;.  }.  free(
14490 66 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20  filebuf);       
144a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
144b0 52 65 6c 65 61 73 65 20 74 68 65 20 62 75 66 66  Release the buff
144c0 65 72 20 61 66 74 65 72 20 70 61 72 73 69 6e 67  er after parsing
144d0 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d   */.  gp->rule =
144e0 20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20   ps.firstrule;. 
144f0 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20   gp->errorcnt = 
14500 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f  ps.errorcnt;.}./
14510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
14530 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b   the file "plink
14540 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
14550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
14560 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73   Routines proces
14570 73 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69  sing configurati
14580 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72  on follow-set pr
14590 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a  opagation links.
145a0 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20  ** in the LEMON 
145b0 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
145c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
145d0 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f  ct plink *plink_
145e0 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f  freelist = 0;../
145f0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
14600 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74   plink */.struct
14610 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65   plink *Plink_ne
14620 77 28 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  w(){.  struct pl
14630 69 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 0a 20  ink *newlink;.. 
14640 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c   if( plink_freel
14650 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ist==0 ){.    in
14660 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74  t i;.    int amt
14670 20 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e   = 100;.    plin
14680 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74  k_freelist = (st
14690 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 63 61 6c  ruct plink *)cal
146a0 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66  loc( amt, sizeof
146b0 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 29 20 29  (struct plink) )
146c0 3b 0a 20 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f  ;.    if( plink_
146d0 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
146e0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
146f0 65 72 72 2c 0a 20 20 20 20 20 20 22 55 6e 61 62  err,.      "Unab
14700 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
14710 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20  emory for a new 
14720 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61  follow-set propa
14730 67 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29  gation link.\n")
14740 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
14750 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
14760 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b  =0; i<amt-1; i++
14770 29 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  ) plink_freelist
14780 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e  [i].next = &plin
14790 6b 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b  k_freelist[i+1];
147a0 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  .    plink_freel
147b0 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20  ist[amt-1].next 
147c0 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 6c 69  = 0;.  }.  newli
147d0 6e 6b 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  nk = plink_freel
147e0 69 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66 72 65  ist;.  plink_fre
147f0 65 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f 66 72  elist = plink_fr
14800 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20  eelist->next;.  
14810 72 65 74 75 72 6e 20 6e 65 77 6c 69 6e 6b 3b 0a  return newlink;.
14820 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c 69 6e  }../* Add a plin
14830 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c 69 73  k to a plink lis
14840 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  t */.void Plink_
14850 61 64 64 28 73 74 72 75 63 74 20 70 6c 69 6e 6b  add(struct plink
14860 20 2a 2a 70 6c 70 70 2c 20 73 74 72 75 63 74 20   **plpp, struct 
14870 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20  config *cfp).{. 
14880 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e   struct plink *n
14890 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e  ewlink;.  newlin
148a0 6b 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b  k = Plink_new();
148b0 0a 20 20 6e 65 77 6c 69 6e 6b 2d 3e 6e 65 78 74  .  newlink->next
148c0 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70   = *plpp;.  *plp
148d0 70 20 3d 20 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e  p = newlink;.  n
148e0 65 77 6c 69 6e 6b 2d 3e 63 66 70 20 3d 20 63 66  ewlink->cfp = cf
148f0 70 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66 65  p;.}../* Transfe
14900 72 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e  r every plink on
14910 20 74 68 65 20 6c 69 73 74 20 22 66 72 6f 6d 22   the list "from"
14920 20 74 6f 20 74 68 65 20 6c 69 73 74 20 22 74 6f   to the list "to
14930 22 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  " */.void Plink_
14940 63 6f 70 79 28 73 74 72 75 63 74 20 70 6c 69 6e  copy(struct plin
14950 6b 20 2a 2a 74 6f 2c 20 73 74 72 75 63 74 20 70  k **to, struct p
14960 6c 69 6e 6b 20 2a 66 72 6f 6d 29 0a 7b 0a 20 20  link *from).{.  
14970 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
14980 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66  xtpl;.  while( f
14990 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74 70  rom ){.    nextp
149a0 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a  l = from->next;.
149b0 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d      from->next =
149c0 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20   *to;.    *to = 
149d0 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d  from;.    from =
149e0 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a   nextpl;.  }.}..
149f0 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 20  /* Delete every 
14a00 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73  plink on the lis
14a10 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  t */.void Plink_
14a20 64 65 6c 65 74 65 28 73 74 72 75 63 74 20 70 6c  delete(struct pl
14a30 69 6e 6b 20 2a 70 6c 70 29 0a 7b 0a 20 20 73 74  ink *plp).{.  st
14a40 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74  ruct plink *next
14a50 70 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 6c  pl;..  while( pl
14a60 70 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20  p ){.    nextpl 
14a70 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 20  = plp->next;.   
14a80 20 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70 6c 69   plp->next = pli
14a90 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 20  nk_freelist;.   
14aa0 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20   plink_freelist 
14ab0 3d 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70 20 3d  = plp;.    plp =
14ac0 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f   nextpl;.  }.}./
14ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ae0 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
14af0 20 66 69 6c 65 20 22 72 65 70 6f 72 74 2e 63 22   file "report.c"
14b00 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
14b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
14b20 2a 2a 20 50 72 6f 63 65 64 75 72 65 73 20 66 6f  ** Procedures fo
14b30 72 20 67 65 6e 65 72 61 74 69 6e 67 20 72 65 70  r generating rep
14b40 6f 72 74 73 20 61 6e 64 20 74 61 62 6c 65 73 20  orts and tables 
14b50 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  in the LEMON par
14b60 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
14b70 2f 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  /../* Generate a
14b80 20 66 69 6c 65 6e 61 6d 65 20 77 69 74 68 20 74   filename with t
14b90 68 65 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e  he given suffix.
14ba0 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
14bb0 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65  the.** name come
14bc0 73 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  s from malloc() 
14bd0 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
14be0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
14bf0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  .** function..*/
14c00 0a 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 66  .PRIVATE char *f
14c10 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 73 74 72  ile_makename(str
14c20 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
14c30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66   const char *suf
14c40 66 69 78 29 0a 7b 0a 20 20 63 68 61 72 20 2a 6e  fix).{.  char *n
14c50 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b  ame;.  char *cp;
14c60 0a 0a 20 20 6e 61 6d 65 20 3d 20 28 63 68 61 72  ..  name = (char
14c70 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53  *)malloc( lemonS
14c80 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69 6c 65  trlen(lemp->file
14c90 6e 61 6d 65 29 20 2b 20 6c 65 6d 6f 6e 53 74 72  name) + lemonStr
14ca0 6c 65 6e 28 73 75 66 66 69 78 29 20 2b 20 35 20  len(suffix) + 5 
14cb0 29 3b 0a 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30  );.  if( name==0
14cc0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
14cd0 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 61 6c  stderr,"Can't al
14ce0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
14cf0 20 61 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29   a filename.\n")
14d00 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
14d10 20 7d 0a 20 20 73 74 72 63 70 79 28 6e 61 6d 65   }.  strcpy(name
14d20 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
14d30 3b 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72  ;.  cp = strrchr
14d40 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66  (name,'.');.  if
14d50 28 20 63 70 20 29 20 2a 63 70 20 3d 20 30 3b 0a  ( cp ) *cp = 0;.
14d60 20 20 73 74 72 63 61 74 28 6e 61 6d 65 2c 73 75    strcat(name,su
14d70 66 66 69 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  ffix);.  return 
14d80 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e  name;.}../* Open
14d90 20 61 20 66 69 6c 65 20 77 69 74 68 20 61 20 6e   a file with a n
14da0 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ame based on the
14db0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70   name of the inp
14dc0 75 74 20 66 69 6c 65 2c 0a 2a 2a 20 62 75 74 20  ut file,.** but 
14dd0 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
14de0 20 28 73 70 65 63 69 66 69 65 64 29 20 73 75 66   (specified) suf
14df0 66 69 78 2c 20 61 6e 64 20 72 65 74 75 72 6e 20  fix, and return 
14e00 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
14e10 74 68 65 20 73 74 72 65 61 6d 20 2a 2f 0a 50 52  the stream */.PR
14e20 49 56 41 54 45 20 46 49 4c 45 20 2a 66 69 6c 65  IVATE FILE *file
14e30 5f 6f 70 65 6e 28 0a 20 20 73 74 72 75 63 74 20  _open(.  struct 
14e40 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 63  lemon *lemp,.  c
14e50 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66 66 69  onst char *suffi
14e60 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x,.  const char 
14e70 2a 6d 6f 64 65 0a 29 7b 0a 20 20 46 49 4c 45 20  *mode.){.  FILE 
14e80 2a 66 70 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70  *fp;..  if( lemp
14e90 2d 3e 6f 75 74 6e 61 6d 65 20 29 20 66 72 65 65  ->outname ) free
14ea0 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b  (lemp->outname);
14eb0 0a 20 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  .  lemp->outname
14ec0 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65   = file_makename
14ed0 28 6c 65 6d 70 2c 20 73 75 66 66 69 78 29 3b 0a  (lemp, suffix);.
14ee0 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 6c 65 6d    fp = fopen(lem
14ef0 70 2d 3e 6f 75 74 6e 61 6d 65 2c 6d 6f 64 65 29  p->outname,mode)
14f00 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 26 26  ;.  if( fp==0 &&
14f10 20 2a 6d 6f 64 65 3d 3d 27 77 27 20 29 7b 0a 20   *mode=='w' ){. 
14f20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
14f30 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 66 69  r,"Can't open fi
14f40 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 6c 65  le \"%s\".\n",le
14f50 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20  mp->outname);.  
14f60 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
14f70 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ++;.    return 0
14f80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
14f90 66 69 6c 65 73 20 77 65 20 63 72 65 61 74 65 20  files we create 
14fa0 74 6f 20 61 20 6c 69 73 74 2c 20 73 6f 20 77 65  to a list, so we
14fb0 20 63 61 6e 20 64 65 6c 65 74 65 20 74 68 65 6d   can delete them
14fc0 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 69   if we fail. Thi
14fd0 73 0a 20 20 2a 2a 20 69 73 20 74 6f 20 6b 65 65  s.  ** is to kee
14fe0 70 20 6d 61 6b 65 66 69 6c 65 73 20 66 72 6f 6d  p makefiles from
14ff0 20 67 65 74 74 69 6e 67 20 63 6f 6e 66 75 73 65   getting confuse
15000 64 2e 20 57 65 20 64 6f 6e 27 74 20 69 6e 63 6c  d. We don't incl
15010 75 64 65 20 2e 6f 75 74 20 66 69 6c 65 73 2c 0a  ude .out files,.
15020 20 20 2a 2a 20 74 68 6f 75 67 68 3a 20 74 68 69    ** though: thi
15030 73 20 69 73 20 64 65 62 75 67 20 69 6e 66 6f 72  s is debug infor
15040 6d 61 74 69 6f 6e 2c 20 61 6e 64 20 79 6f 75 20  mation, and you 
15050 64 6f 6e 27 74 20 77 61 6e 74 20 69 74 20 64 65  don't want it de
15060 6c 65 74 65 64 20 69 66 20 74 68 65 72 65 0a 20  leted if there. 
15070 20 2a 2a 20 77 61 73 20 61 6e 20 65 72 72 6f 72   ** was an error
15080 20 79 6f 75 20 6e 65 65 64 20 74 6f 20 74 72 61   you need to tra
15090 63 6b 20 64 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  ck down..  */.  
150a0 69 66 28 28 20 2a 6d 6f 64 65 3d 3d 27 77 27 20  if(( *mode=='w' 
150b0 29 20 26 26 20 28 73 74 72 63 6d 70 28 73 75 66  ) && (strcmp(suf
150c0 66 69 78 2c 20 22 2e 6f 75 74 22 29 20 21 3d 20  fix, ".out") != 
150d0 30 29 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0)){.    const c
150e0 68 61 72 20 2a 2a 70 74 72 20 3d 20 28 63 6f 6e  har **ptr = (con
150f0 73 74 20 63 68 61 72 20 2a 2a 29 0a 20 20 20 20  st char **).    
15100 20 20 20 20 72 65 61 6c 6c 6f 63 28 6d 61 64 65      realloc(made
15110 5f 66 69 6c 65 73 2c 20 73 69 7a 65 6f 66 20 28  _files, sizeof (
15120 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 20 2a  const char **) *
15130 20 28 6d 61 64 65 5f 66 69 6c 65 73 5f 63 6f 75   (made_files_cou
15140 6e 74 20 2b 20 31 29 29 3b 0a 20 20 20 20 63 68  nt + 1));.    ch
15150 61 72 20 2a 66 6e 61 6d 65 20 3d 20 73 74 72 64  ar *fname = strd
15160 75 70 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  up(lemp->outname
15170 29 3b 0a 20 20 20 20 69 66 20 28 28 70 74 72 20  );.    if ((ptr 
15180 3d 3d 20 4e 55 4c 4c 29 20 7c 7c 20 28 66 6e 61  == NULL) || (fna
15190 6d 65 20 3d 3d 20 4e 55 4c 4c 29 29 20 7b 0a 20  me == NULL)) {. 
151a0 20 20 20 20 20 20 20 66 72 65 65 28 70 74 72 29         free(ptr)
151b0 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 66  ;.        free(f
151c0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6d  name);.        m
151d0 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20  emory_error();. 
151e0 20 20 20 7d 0a 20 20 20 20 6d 61 64 65 5f 66 69     }.    made_fi
151f0 6c 65 73 20 3d 20 70 74 72 3b 0a 20 20 20 20 6d  les = ptr;.    m
15200 61 64 65 5f 66 69 6c 65 73 5b 6d 61 64 65 5f 66  ade_files[made_f
15210 69 6c 65 73 5f 63 6f 75 6e 74 2b 2b 5d 20 3d 20  iles_count++] = 
15220 66 6e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74  fname;.  }.  ret
15230 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a 20 44 75  urn fp;.}../* Du
15240 70 6c 69 63 61 74 65 20 74 68 65 20 69 6e 70 75  plicate the inpu
15250 74 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 63  t file without c
15260 6f 6d 6d 65 6e 74 73 20 61 6e 64 20 77 69 74 68  omments and with
15270 6f 75 74 20 61 63 74 69 6f 6e 73 20 0a 2a 2a 20  out actions .** 
15280 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a 76 6f 69 64  on rules */.void
15290 20 52 65 70 72 69 6e 74 28 73 74 72 75 63 74 20   Reprint(struct 
152a0 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
152b0 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
152c0 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  ;.  struct symbo
152d0 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20  l *sp;.  int i, 
152e0 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c 65 6e 2c 20  j, maxlen, len, 
152f0 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b 69 70 3b 0a  ncolumns, skip;.
15300 20 20 70 72 69 6e 74 66 28 22 2f 2f 20 52 65 70    printf("// Rep
15310 72 69 6e 74 20 6f 66 20 69 6e 70 75 74 20 66 69  rint of input fi
15320 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 2f 2f 20 53  le \"%s\".\n// S
15330 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d 70 2d  ymbols:\n",lemp-
15340 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 6d 61  >filename);.  ma
15350 78 6c 65 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72  xlen = 10;.  for
15360 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
15370 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
15380 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   sp = lemp->symb
15390 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 6c 65 6e 20  ols[i];.    len 
153a0 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 70  = lemonStrlen(sp
153b0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  ->name);.    if(
153c0 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d 61   len>maxlen ) ma
153d0 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a  xlen = len;.  }.
153e0 20 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 37 36 2f    ncolumns = 76/
153f0 28 6d 61 78 6c 65 6e 2b 35 29 3b 0a 20 20 69 66  (maxlen+5);.  if
15400 28 20 6e 63 6f 6c 75 6d 6e 73 3c 31 20 29 20 6e  ( ncolumns<1 ) n
15410 63 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 73  columns = 1;.  s
15420 6b 69 70 20 3d 20 28 6c 65 6d 70 2d 3e 6e 73 79  kip = (lemp->nsy
15430 6d 62 6f 6c 20 2b 20 6e 63 6f 6c 75 6d 6e 73 20  mbol + ncolumns 
15440 2d 20 31 29 2f 6e 63 6f 6c 75 6d 6e 73 3b 0a 20  - 1)/ncolumns;. 
15450 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 6b 69 70   for(i=0; i<skip
15460 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 72 69 6e  ; i++){.    prin
15470 74 66 28 22 2f 2f 22 29 3b 0a 20 20 20 20 66 6f  tf("//");.    fo
15480 72 28 6a 3d 69 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e  r(j=i; j<lemp->n
15490 73 79 6d 62 6f 6c 3b 20 6a 2b 3d 73 6b 69 70 29  symbol; j+=skip)
154a0 7b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c 65 6d  {.      sp = lem
154b0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20  p->symbols[j];. 
154c0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 70 2d       assert( sp-
154d0 3e 69 6e 64 65 78 3d 3d 6a 20 29 3b 0a 20 20 20  >index==j );.   
154e0 20 20 20 70 72 69 6e 74 66 28 22 20 25 33 64 20     printf(" %3d 
154f0 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61 78 6c 65 6e  %-*.*s",j,maxlen
15500 2c 6d 61 78 6c 65 6e 2c 73 70 2d 3e 6e 61 6d 65  ,maxlen,sp->name
15510 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  );.    }.    pri
15520 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
15530 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
15540 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
15550 65 78 74 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ext){.    printf
15560 28 22 25 73 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e  ("%s",rp->lhs->n
15570 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20 20 20 20  ame);.    /*    
15580 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
15590 20 29 20 70 72 69 6e 74 66 28 22 28 25 73 29 22   ) printf("(%s)"
155a0 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 20  ,rp->lhsalias); 
155b0 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20  */.    printf(" 
155c0 3a 3a 3d 22 29 3b 0a 20 20 20 20 66 6f 72 28 69  ::=");.    for(i
155d0 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
155e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 70 20 3d  i++){.      sp =
155f0 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
15600 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c     printf(" %s",
15610 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
15620 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
15630 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
15640 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 31  .        for(j=1
15650 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; j<sp->nsubsym;
15660 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
15670 20 70 72 69 6e 74 66 28 22 7c 25 73 22 2c 20 73   printf("|%s", s
15680 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61  p->subsym[j]->na
15690 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
156a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
156b0 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
156c0 5b 69 5d 20 29 20 70 72 69 6e 74 66 28 22 28 25  [i] ) printf("(%
156d0 73 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  s)",rp->rhsalias
156e0 5b 69 5d 29 3b 20 2a 2f 0a 20 20 20 20 7d 0a 20  [i]); */.    }. 
156f0 20 20 20 70 72 69 6e 74 66 28 22 2e 22 29 3b 0a     printf(".");.
15700 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63      if( rp->prec
15710 73 79 6d 20 29 20 70 72 69 6e 74 66 28 22 20 5b  sym ) printf(" [
15720 25 73 5d 22 2c 72 70 2d 3e 70 72 65 63 73 79 6d  %s]",rp->precsym
15730 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20  ->name);.    /* 
15740 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 20 70  if( rp->code ) p
15750 72 69 6e 74 66 28 22 5c 6e 20 20 20 20 25 73 22  rintf("\n    %s"
15760 2c 72 70 2d 3e 63 6f 64 65 29 3b 20 2a 2f 0a 20  ,rp->code); */. 
15770 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
15780 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 43 6f 6e  .  }.}..void Con
15790 66 69 67 50 72 69 6e 74 28 46 49 4c 45 20 2a 66  figPrint(FILE *f
157a0 70 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  p, struct config
157b0 20 2a 63 66 70 29 0a 7b 0a 20 20 73 74 72 75 63   *cfp).{.  struc
157c0 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74  t rule *rp;.  st
157d0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
157e0 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 72  .  int i, j;.  r
157f0 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 66  p = cfp->rp;.  f
15800 70 72 69 6e 74 66 28 66 70 2c 22 25 73 20 3a 3a  printf(fp,"%s ::
15810 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65  =",rp->lhs->name
15820 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
15830 3d 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  =rp->nrhs; i++){
15840 0a 20 20 20 20 69 66 28 20 69 3d 3d 63 66 70 2d  .    if( i==cfp-
15850 3e 64 6f 74 20 29 20 66 70 72 69 6e 74 66 28 66  >dot ) fprintf(f
15860 70 2c 22 20 2a 22 29 3b 0a 20 20 20 20 69 66 28  p," *");.    if(
15870 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 62   i==rp->nrhs ) b
15880 72 65 61 6b 3b 0a 20 20 20 20 73 70 20 3d 20 72  reak;.    sp = r
15890 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 66  p->rhs[i];.    f
158a0 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22 2c  printf(fp," %s",
158b0 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
158c0 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55  if( sp->type==MU
158d0 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
158e0 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c       for(j=1; j<
158f0 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b  sp->nsubsym; j++
15900 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
15910 74 66 28 66 70 2c 22 7c 25 73 22 2c 73 70 2d 3e  tf(fp,"|%s",sp->
15920 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29  subsym[j]->name)
15930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15940 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64 65 66 69 6e    }.}../* #defin
15950 65 20 54 45 53 54 20 2a 2f 0a 23 69 66 20 30 0a  e TEST */.#if 0.
15960 2f 2a 20 50 72 69 6e 74 20 61 20 73 65 74 20 2a  /* Print a set *
15970 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 53  /.PRIVATE void S
15980 65 74 50 72 69 6e 74 28 6f 75 74 2c 73 65 74 2c  etPrint(out,set,
15990 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75 74 3b  lemp).FILE *out;
159a0 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73 74 72 75  .char *set;.stru
159b0 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
159c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
159d0 72 20 2a 73 70 61 63 65 72 3b 0a 20 20 73 70 61  r *spacer;.  spa
159e0 63 65 72 20 3d 20 22 22 3b 0a 20 20 66 70 72 69  cer = "";.  fpri
159f0 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 5b 22 2c  ntf(out,"%12s[",
15a00 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  "");.  for(i=0; 
15a10 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i<lemp->ntermina
15a20 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
15a30 20 53 65 74 46 69 6e 64 28 73 65 74 2c 69 29 20   SetFind(set,i) 
15a40 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
15a50 28 6f 75 74 2c 22 25 73 25 73 22 2c 73 70 61 63  (out,"%s%s",spac
15a60 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  er,lemp->symbols
15a70 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [i]->name);.    
15a80 20 20 73 70 61 63 65 72 20 3d 20 22 20 22 3b 0a    spacer = " ";.
15a90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69      }.  }.  fpri
15aa0 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b 0a  ntf(out,"]\n");.
15ab0 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 70 6c  }../* Print a pl
15ac0 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50 52 49  ink chain */.PRI
15ad0 56 41 54 45 20 76 6f 69 64 20 50 6c 69 6e 6b 50  VATE void PlinkP
15ae0 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74 61 67  rint(out,plp,tag
15af0 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72  ).FILE *out;.str
15b00 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a  uct plink *plp;.
15b10 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20 20 77  char *tag;.{.  w
15b20 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20  hile( plp ){.   
15b30 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31   fprintf(out,"%1
15b40 32 73 25 73 20 28 73 74 61 74 65 20 25 32 64 29  2s%s (state %2d)
15b50 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d 3e 63   ","",tag,plp->c
15b60 66 70 2d 3e 73 74 70 2d 3e 73 74 61 74 65 6e 75  fp->stp->statenu
15b70 6d 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 50 72  m);.    ConfigPr
15b80 69 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e 63 66 70  int(out,plp->cfp
15b90 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
15ba0 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 70 6c  ut,"\n");.    pl
15bb0 70 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20  p = plp->next;. 
15bc0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20   }.}.#endif../* 
15bd0 50 72 69 6e 74 20 61 6e 20 61 63 74 69 6f 6e 20  Print an action 
15be0 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
15bf0 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
15c00 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 2a  eturn FALSE if.*
15c10 2a 20 6e 6f 74 68 69 6e 67 20 77 61 73 20 61 63  * nothing was ac
15c20 74 75 61 6c 6c 79 20 70 72 69 6e 74 65 64 2e 0a  tually printed..
15c30 2a 2f 0a 69 6e 74 20 50 72 69 6e 74 41 63 74 69  */.int PrintActi
15c40 6f 6e 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  on(struct action
15c50 20 2a 61 70 2c 20 46 49 4c 45 20 2a 66 70 2c 20   *ap, FILE *fp, 
15c60 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 69  int indent){.  i
15c70 6e 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20  nt result = 1;. 
15c80 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70   switch( ap->typ
15c90 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48  e ){.    case SH
15ca0 49 46 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  IFT:.      fprin
15cb0 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74  tf(fp,"%*s shift
15cc0 20 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d    %d",indent,ap-
15cd0 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e  >sp->name,ap->x.
15ce0 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a  stp->statenum);.
15cf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15d00 20 63 61 73 65 20 52 45 44 55 43 45 3a 0a 20 20   case REDUCE:.  
15d10 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
15d20 25 2a 73 20 72 65 64 75 63 65 20 25 64 22 2c 69  %*s reduce %d",i
15d30 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
15d40 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64  me,ap->x.rp->ind
15d50 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
15d60 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43 45 50  ;.    case ACCEP
15d70 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  T:.      fprintf
15d80 28 66 70 2c 22 25 2a 73 20 61 63 63 65 70 74 22  (fp,"%*s accept"
15d90 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
15da0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  name);.      bre
15db0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52  ak;.    case ERR
15dc0 4f 52 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74  OR:.      fprint
15dd0 66 28 66 70 2c 22 25 2a 73 20 65 72 72 6f 72 22  f(fp,"%*s error"
15de0 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
15df0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  name);.      bre
15e00 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 52 43  ak;.    case SRC
15e10 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 63 61 73  ONFLICT:.    cas
15e20 65 20 52 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20  e RRCONFLICT:.  
15e30 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
15e40 25 2a 73 20 72 65 64 75 63 65 20 25 2d 33 64 20  %*s reduce %-3d 
15e50 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c  ** Parsing confl
15e60 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20  ict **",.       
15e70 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
15e80 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69  name,ap->x.rp->i
15e90 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  ndex);.      bre
15ea0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 43  ak;.    case SSC
15eb0 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20 66  ONFLICT:.      f
15ec0 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73  printf(fp,"%*s s
15ed0 68 69 66 74 20 20 25 64 20 2a 2a 20 50 61 72 73  hift  %d ** Pars
15ee0 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a 22  ing conflict **"
15ef0 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e  , .        inden
15f00 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61  t,ap->sp->name,a
15f10 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e  p->x.stp->staten
15f20 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  um);.      break
15f30 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52 45  ;.    case SH_RE
15f40 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73 65  SOLVED:.    case
15f50 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20   RD_RESOLVED:.  
15f60 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44 3a    case NOT_USED:
15f70 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20  .      result = 
15f80 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
15f90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
15fa0 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72  ult;.}../* Gener
15fb0 61 74 65 20 74 68 65 20 22 79 2e 6f 75 74 70 75  ate the "y.outpu
15fc0 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76  t" log file */.v
15fd0 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74  oid ReportOutput
15fe0 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
15ff0 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp).{.  int i;.
16000 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
16010 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 63 6f  stp;.  struct co
16020 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72  nfig *cfp;.  str
16030 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
16040 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 66    FILE *fp;..  f
16050 70 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  p = file_open(le
16060 6d 70 2c 22 2e 6f 75 74 22 2c 22 77 62 22 29 3b  mp,".out","wb");
16070 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 29 20 72  .  if( fp==0 ) r
16080 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
16090 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
160a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
160b0 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
160c0 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66  ];.    fprintf(f
160d0 70 2c 22 53 74 61 74 65 20 25 64 3a 5c 6e 22 2c  p,"State %d:\n",
160e0 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a  stp->statenum);.
160f0 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61      if( lemp->ba
16100 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d 73 74  sisflag ) cfp=st
16110 70 2d 3e 62 70 3b 0a 20 20 20 20 65 6c 73 65 20  p->bp;.    else 
16120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16130 20 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 0a 20   cfp=stp->cfp;. 
16140 20 20 20 77 68 69 6c 65 28 20 63 66 70 20 29 7b     while( cfp ){
16150 0a 20 20 20 20 20 20 63 68 61 72 20 62 75 66 5b  .      char buf[
16160 32 30 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63  20];.      if( c
16170 66 70 2d 3e 64 6f 74 3d 3d 63 66 70 2d 3e 72 70  fp->dot==cfp->rp
16180 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  ->nrhs ){.      
16190 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c 22 28    sprintf(buf,"(
161a0 25 64 29 22 2c 63 66 70 2d 3e 72 70 2d 3e 69 6e  %d)",cfp->rp->in
161b0 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 66 70  dex);.        fp
161c0 72 69 6e 74 66 28 66 70 2c 22 20 20 20 20 25 35  rintf(fp,"    %5
161d0 73 20 22 2c 62 75 66 29 3b 0a 20 20 20 20 20 20  s ",buf);.      
161e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
161f0 70 72 69 6e 74 66 28 66 70 2c 22 20 20 20 20 20  printf(fp,"     
16200 20 20 20 20 20 22 29 3b 0a 20 20 20 20 20 20 7d       ");.      }
16210 0a 20 20 20 20 20 20 43 6f 6e 66 69 67 50 72 69  .      ConfigPri
16220 6e 74 28 66 70 2c 63 66 70 29 3b 0a 20 20 20 20  nt(fp,cfp);.    
16230 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e    fprintf(fp,"\n
16240 22 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20  ");.#if 0.      
16250 53 65 74 50 72 69 6e 74 28 66 70 2c 63 66 70 2d  SetPrint(fp,cfp-
16260 3e 66 77 73 2c 6c 65 6d 70 29 3b 0a 20 20 20 20  >fws,lemp);.    
16270 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c    PlinkPrint(fp,
16280 63 66 70 2d 3e 66 70 6c 70 2c 22 54 6f 20 20 22  cfp->fplp,"To  "
16290 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72  );.      PlinkPr
162a0 69 6e 74 28 66 70 2c 63 66 70 2d 3e 62 70 6c 70  int(fp,cfp->bplp
162b0 2c 22 46 72 6f 6d 22 29 3b 0a 23 65 6e 64 69 66  ,"From");.#endif
162c0 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6d 70 2d  .      if( lemp-
162d0 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63 66 70  >basisflag ) cfp
162e0 3d 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 20 20  =cfp->bp;.      
162f0 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
16300 20 20 20 20 20 20 63 66 70 3d 63 66 70 2d 3e 6e        cfp=cfp->n
16310 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ext;.    }.    f
16320 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b  printf(fp,"\n");
16330 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
16340 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
16350 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
16360 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 61 70 2c   PrintAction(ap,
16370 66 70 2c 33 30 29 20 29 20 66 70 72 69 6e 74 66  fp,30) ) fprintf
16380 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 7d  (fp,"\n");.    }
16390 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
163a0 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 70 72  "\n");.  }.  fpr
163b0 69 6e 74 66 28 66 70 2c 20 22 2d 2d 2d 2d 2d 2d  intf(fp, "------
163c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
163f0 22 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70  ");.  fprintf(fp
16400 2c 20 22 53 79 6d 62 6f 6c 73 3a 5c 6e 22 29 3b  , "Symbols:\n");
16410 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
16420 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
16430 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  ){.    int j;.  
16440 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
16450 2a 73 70 3b 0a 0a 20 20 20 20 73 70 20 3d 20 6c  *sp;..    sp = l
16460 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
16470 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
16480 20 22 20 20 25 33 64 3a 20 25 73 22 2c 20 69 2c   "  %3d: %s", i,
16490 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
164a0 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f  if( sp->type==NO
164b0 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  NTERMINAL ){.   
164c0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
164d0 3a 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  :");.      if( s
164e0 70 2d 3e 6c 61 6d 62 64 61 20 29 7b 0a 20 20 20  p->lambda ){.   
164f0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
16500 20 22 20 3c 6c 61 6d 62 64 61 3e 22 29 3b 0a 20   " <lambda>");. 
16510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
16520 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74  (j=0; j<lemp->nt
16530 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20  erminal; j++){. 
16540 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 66         if( sp->f
16550 69 72 73 74 73 65 74 20 26 26 20 53 65 74 46 69  irstset && SetFi
16560 6e 64 28 73 70 2d 3e 66 69 72 73 74 73 65 74 2c  nd(sp->firstset,
16570 20 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   j) ){.         
16580 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 20 25   fprintf(fp, " %
16590 73 22 2c 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  s", lemp->symbol
165a0 73 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  s[j]->name);.   
165b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
165c0 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
165d0 28 66 70 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a  (fp, "\n");.  }.
165e0 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20    fclose(fp);.  
165f0 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65  return;.}../* Se
16600 61 72 63 68 20 66 6f 72 20 74 68 65 20 66 69 6c  arch for the fil
16610 65 20 22 6e 61 6d 65 22 20 77 68 69 63 68 20 69  e "name" which i
16620 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  s in the same di
16630 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68  rectory as.** th
16640 65 20 65 78 61 63 75 74 61 62 6c 65 20 2a 2f 0a  e exacutable */.
16650 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 70 61  PRIVATE char *pa
16660 74 68 73 65 61 72 63 68 28 63 68 61 72 20 2a 61  thsearch(char *a
16670 72 67 76 30 2c 20 63 68 61 72 20 2a 6e 61 6d 65  rgv0, char *name
16680 2c 20 69 6e 74 20 6d 6f 64 65 6d 61 73 6b 29 0a  , int modemask).
16690 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
166a0 70 61 74 68 6c 69 73 74 3b 0a 20 20 63 68 61 72  pathlist;.  char
166b0 20 2a 70 61 74 68 62 75 66 70 74 72 3b 0a 20 20   *pathbufptr;.  
166c0 63 68 61 72 20 2a 70 61 74 68 62 75 66 3b 0a 20  char *pathbuf;. 
166d0 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63 70 3b   char *path,*cp;
166e0 0a 20 20 63 68 61 72 20 63 3b 0a 0a 23 69 66 64  .  char c;..#ifd
166f0 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20 63  ef __WIN32__.  c
16700 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67 76  p = strrchr(argv
16710 30 2c 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a 20  0,'\\');.#else. 
16720 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 61 72   cp = strrchr(ar
16730 67 76 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69 66  gv0,'/');.#endif
16740 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20  .  if( cp ){.   
16750 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63   c = *cp;.    *c
16760 70 20 3d 20 30 3b 0a 20 20 20 20 70 61 74 68 20  p = 0;.    path 
16770 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63  = (char *)malloc
16780 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72  ( lemonStrlen(ar
16790 67 76 30 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c  gv0) + lemonStrl
167a0 65 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a  en(name) + 2 );.
167b0 20 20 20 20 69 66 28 20 70 61 74 68 20 29 20 73      if( path ) s
167c0 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f  printf(path,"%s/
167d0 25 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b  %s",argv0,name);
167e0 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20  .    *cp = c;.  
167f0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61 74 68 6c  }else{.    pathl
16800 69 73 74 20 3d 20 67 65 74 65 6e 76 28 22 50 41  ist = getenv("PA
16810 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20 70 61  TH");.    if( pa
16820 74 68 6c 69 73 74 3d 3d 30 20 29 20 70 61 74 68  thlist==0 ) path
16830 6c 69 73 74 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f  list = ".:/bin:/
16840 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20 70 61  usr/bin";.    pa
16850 74 68 62 75 66 20 3d 20 28 63 68 61 72 20 2a 29  thbuf = (char *)
16860 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74   malloc( lemonSt
16870 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 20 2b  rlen(pathlist) +
16880 20 31 20 29 3b 0a 20 20 20 20 70 61 74 68 20 3d   1 );.    path =
16890 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
168a0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74   lemonStrlen(pat
168b0 68 6c 69 73 74 29 2b 6c 65 6d 6f 6e 53 74 72 6c  hlist)+lemonStrl
168c0 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b 0a 20 20  en(name)+2 );.  
168d0 20 20 69 66 28 20 28 70 61 74 68 62 75 66 20 21    if( (pathbuf !
168e0 3d 20 30 29 20 26 26 20 28 70 61 74 68 21 3d 30  = 0) && (path!=0
168f0 29 20 29 7b 0a 20 20 20 20 20 20 70 61 74 68 62  ) ){.      pathb
16900 75 66 70 74 72 20 3d 20 70 61 74 68 62 75 66 3b  ufptr = pathbuf;
16910 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 70 61  .      strcpy(pa
16920 74 68 62 75 66 2c 20 70 61 74 68 6c 69 73 74 29  thbuf, pathlist)
16930 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a  ;.      while( *
16940 70 61 74 68 62 75 66 20 29 7b 0a 20 20 20 20 20  pathbuf ){.     
16950 20 20 20 63 70 20 3d 20 73 74 72 63 68 72 28 70     cp = strchr(p
16960 61 74 68 62 75 66 2c 27 3a 27 29 3b 0a 20 20 20  athbuf,':');.   
16970 20 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29       if( cp==0 )
16980 20 63 70 20 3d 20 26 70 61 74 68 62 75 66 5b 6c   cp = &pathbuf[l
16990 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 62  emonStrlen(pathb
169a0 75 66 29 5d 3b 0a 20 20 20 20 20 20 20 20 63 20  uf)];.        c 
169b0 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20 20 20 2a  = *cp;.        *
169c0 63 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  cp = 0;.        
169d0 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73  sprintf(path,"%s
169e0 2f 25 73 22 2c 70 61 74 68 62 75 66 2c 6e 61 6d  /%s",pathbuf,nam
169f0 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 63 70 20  e);.        *cp 
16a00 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = c;.        if(
16a10 20 63 3d 3d 30 20 29 20 70 61 74 68 62 75 66 5b   c==0 ) pathbuf[
16a20 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  0] = 0;.        
16a30 65 6c 73 65 20 70 61 74 68 62 75 66 20 3d 20 26  else pathbuf = &
16a40 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  cp[1];.        i
16a50 66 28 20 61 63 63 65 73 73 28 70 61 74 68 2c 6d  f( access(path,m
16a60 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29 20 62 72  odemask)==0 ) br
16a70 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
16a80 20 20 20 66 72 65 65 28 70 61 74 68 62 75 66 70     free(pathbufp
16a90 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  tr);.    }.  }. 
16aa0 20 72 65 74 75 72 6e 20 70 61 74 68 3b 0a 7d 0a   return path;.}.
16ab0 0a 2f 2a 20 47 69 76 65 6e 20 61 6e 20 61 63 74  ./* Given an act
16ac0 69 6f 6e 2c 20 63 6f 6d 70 75 74 65 20 74 68 65  ion, compute the
16ad0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
16ae0 6f 72 20 74 68 61 74 20 61 63 74 69 6f 6e 0a 2a  or that action.*
16af0 2a 20 77 68 69 63 68 20 69 73 20 74 6f 20 62 65  * which is to be
16b00 20 70 75 74 20 69 6e 20 74 68 65 20 61 63 74 69   put in the acti
16b10 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  on table of the 
16b20 67 65 6e 65 72 61 74 65 64 20 6d 61 63 68 69 6e  generated machin
16b30 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67  e..** Return neg
16b40 61 74 69 76 65 20 69 66 20 6e 6f 20 61 63 74 69  ative if no acti
16b50 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 67 65 6e  on should be gen
16b60 65 72 61 74 65 64 2e 0a 2a 2f 0a 50 52 49 56 41  erated..*/.PRIVA
16b70 54 45 20 69 6e 74 20 63 6f 6d 70 75 74 65 5f 61  TE int compute_a
16b80 63 74 69 6f 6e 28 73 74 72 75 63 74 20 6c 65 6d  ction(struct lem
16b90 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74  on *lemp, struct
16ba0 20 61 63 74 69 6f 6e 20 2a 61 70 29 0a 7b 0a 20   action *ap).{. 
16bb0 20 69 6e 74 20 61 63 74 3b 0a 20 20 73 77 69 74   int act;.  swit
16bc0 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a  ch( ap->type ){.
16bd0 20 20 20 20 63 61 73 65 20 53 48 49 46 54 3a 20      case SHIFT: 
16be0 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 73 74 70   act = ap->x.stp
16bf0 2d 3e 73 74 61 74 65 6e 75 6d 3b 20 20 20 20 20  ->statenum;     
16c00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
16c10 20 20 63 61 73 65 20 52 45 44 55 43 45 3a 20 61    case REDUCE: a
16c20 63 74 20 3d 20 61 70 2d 3e 78 2e 72 70 2d 3e 69  ct = ap->x.rp->i
16c30 6e 64 65 78 20 2b 20 6c 65 6d 70 2d 3e 6e 73 74  ndex + lemp->nst
16c40 61 74 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ate; break;.    
16c50 63 61 73 65 20 45 52 52 4f 52 3a 20 20 61 63 74  case ERROR:  act
16c60 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20   = lemp->nstate 
16c70 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 20 20  + lemp->nrule;  
16c80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
16c90 73 65 20 41 43 43 45 50 54 3a 20 61 63 74 20 3d  se ACCEPT: act =
16ca0 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20   lemp->nstate + 
16cb0 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 31 3b  lemp->nrule + 1;
16cc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
16cd0 75 6c 74 3a 20 20 20 20 20 61 63 74 20 3d 20 2d  ult:     act = -
16ce0 31 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  1; break;.  }.  
16cf0 72 65 74 75 72 6e 20 61 63 74 3b 0a 7d 0a 0a 23  return act;.}..#
16d00 64 65 66 69 6e 65 20 4c 49 4e 45 53 49 5a 45 20  define LINESIZE 
16d10 31 30 30 30 0a 2f 2a 20 54 68 65 20 6e 65 78 74  1000./* The next
16d20 20 63 6c 75 73 74 65 72 20 6f 66 20 72 6f 75 74   cluster of rout
16d30 69 6e 65 73 20 61 72 65 20 66 6f 72 20 72 65 61  ines are for rea
16d40 64 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74  ding the templat
16d50 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 77 72  e file.** and wr
16d60 69 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  iting the result
16d70 73 20 74 6f 20 74 68 65 20 67 65 6e 65 72 61 74  s to the generat
16d80 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 2f 2a 20  ed parser */./* 
16d90 54 68 65 20 66 69 72 73 74 20 66 75 6e 63 74 69  The first functi
16da0 6f 6e 20 74 72 61 6e 73 66 65 72 73 20 64 61 74  on transfers dat
16db0 61 20 66 72 6f 6d 20 22 69 6e 22 20 74 6f 20 22  a from "in" to "
16dc0 6f 75 74 22 20 75 6e 74 69 6c 0a 2a 2a 20 61 20  out" until.** a 
16dd0 6c 69 6e 65 20 69 73 20 73 65 65 6e 20 77 68 69  line is seen whi
16de0 63 68 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  ch begins with "
16df0 25 25 22 2e 20 20 54 68 65 20 6c 69 6e 65 20 6e  %%".  The line n
16e00 75 6d 62 65 72 20 69 73 0a 2a 2a 20 74 72 61 63  umber is.** trac
16e10 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6e 61  ked..**.** if na
16e20 6d 65 21 3d 30 2c 20 74 68 65 6e 20 61 6e 79 20  me!=0, then any 
16e30 77 6f 72 64 20 74 68 61 74 20 62 65 67 69 6e 20  word that begin 
16e40 77 69 74 68 20 22 50 61 72 73 65 22 20 69 73 20  with "Parse" is 
16e50 63 68 61 6e 67 65 64 20 74 6f 0a 2a 2a 20 62 65  changed to.** be
16e60 67 69 6e 20 77 69 74 68 20 2a 6e 61 6d 65 20 69  gin with *name i
16e70 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50 52 49 56 41  nstead..*/.PRIVA
16e80 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 78 66 65  TE void tplt_xfe
16e90 72 28 63 68 61 72 20 2a 6e 61 6d 65 2c 20 46 49  r(char *name, FI
16ea0 4c 45 20 2a 69 6e 2c 20 46 49 4c 45 20 2a 6f 75  LE *in, FILE *ou
16eb0 74 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29 0a  t, int *lineno).
16ec0 7b 0a 20 20 69 6e 74 20 69 2c 20 69 53 74 61 72  {.  int i, iStar
16ed0 74 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c  t;.  char line[L
16ee0 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 77 68 69 6c  INESIZE];.  whil
16ef0 65 28 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49  e( fgets(line,LI
16f00 4e 45 53 49 5a 45 2c 69 6e 29 20 26 26 20 28 6c  NESIZE,in) && (l
16f10 69 6e 65 5b 30 5d 21 3d 27 25 27 20 7c 7c 20 6c  ine[0]!='%' || l
16f20 69 6e 65 5b 31 5d 21 3d 27 25 27 29 20 29 7b 0a  ine[1]!='%') ){.
16f30 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b      (*lineno)++;
16f40 0a 20 20 20 20 69 53 74 61 72 74 20 3d 20 30 3b  .    iStart = 0;
16f50 0a 20 20 20 20 69 66 28 20 6e 61 6d 65 20 29 7b  .    if( name ){
16f60 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
16f70 6c 69 6e 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  line[i]; i++){. 
16f80 20 20 20 20 20 20 20 69 66 28 20 6c 69 6e 65 5b         if( line[
16f90 69 5d 3d 3d 27 50 27 20 26 26 20 73 74 72 6e 63  i]=='P' && strnc
16fa0 6d 70 28 26 6c 69 6e 65 5b 69 5d 2c 22 50 61 72  mp(&line[i],"Par
16fb0 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20 20 20  se",5)==0.      
16fc0 20 20 20 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20      && (i==0 || 
16fd0 21 69 73 61 6c 70 68 61 28 6c 69 6e 65 5b 69 2d  !isalpha(line[i-
16fe0 31 5d 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  1])).        ){.
16ff0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
17000 69 53 74 61 72 74 20 29 20 66 70 72 69 6e 74 66  iStart ) fprintf
17010 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2d 69 53  (out,"%.*s",i-iS
17020 74 61 72 74 2c 26 6c 69 6e 65 5b 69 53 74 61 72  tart,&line[iStar
17030 74 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  t]);.          f
17040 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c  printf(out,"%s",
17050 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
17060 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20   i += 4;.       
17070 20 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b     iStart = i+1;
17080 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17090 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72   }.    }.    fpr
170a0 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 26 6c  intf(out,"%s",&l
170b0 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20  ine[iStart]);.  
170c0 7d 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6e 65 78 74  }.}../* The next
170d0 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
170e0 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  the template fil
170f0 65 20 61 6e 64 20 6f 70 65 6e 73 20 69 74 2c 20  e and opens it, 
17100 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 20 70  returning.** a p
17110 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 70  ointer to the op
17120 65 6e 65 64 20 66 69 6c 65 2e 20 2a 2f 0a 50 52  ened file. */.PR
17130 49 56 41 54 45 20 46 49 4c 45 20 2a 74 70 6c 74  IVATE FILE *tplt
17140 5f 6f 70 65 6e 28 73 74 72 75 63 74 20 6c 65 6d  _open(struct lem
17150 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74  on *lemp).{.  st
17160 61 74 69 63 20 63 68 61 72 20 74 65 6d 70 6c 61  atic char templa
17170 74 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70  tename[] = "lemp
17180 61 72 2e 63 22 3b 0a 20 20 63 68 61 72 20 62 75  ar.c";.  char bu
17190 66 5b 31 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20  f[1000];.  FILE 
171a0 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c  *in;.  char *tpl
171b0 74 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63  tname;.  char *c
171c0 70 3b 0a 0a 20 20 2f 2a 20 66 69 72 73 74 2c 20  p;..  /* first, 
171d0 73 65 65 20 69 66 20 75 73 65 72 20 73 70 65 63  see if user spec
171e0 69 66 69 65 64 20 61 20 74 65 6d 70 6c 61 74 65  ified a template
171f0 20 66 69 6c 65 6e 61 6d 65 20 6f 6e 20 74 68 65   filename on the
17200 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 2a   command line. *
17210 2f 0a 20 20 69 66 20 28 75 73 65 72 5f 74 65 6d  /.  if (user_tem
17220 70 6c 61 74 65 6e 61 6d 65 20 21 3d 20 30 29 20  platename != 0) 
17230 7b 0a 20 20 20 20 69 66 28 20 61 63 63 65 73 73  {.    if( access
17240 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61  (user_templatena
17250 6d 65 2c 30 30 34 29 3d 3d 2d 31 20 29 7b 0a 20  me,004)==-1 ){. 
17260 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
17270 65 72 72 2c 22 43 61 6e 27 74 20 66 69 6e 64 20  err,"Can't find 
17280 74 68 65 20 70 61 72 73 65 72 20 64 72 69 76 65  the parser drive
17290 72 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20  r template file 
172a0 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20  \"%s\".\n",.    
172b0 20 20 20 20 75 73 65 72 5f 74 65 6d 70 6c 61 74      user_templat
172c0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65  ename);.      le
172d0 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
172e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
172f0 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66      }.    in = f
17300 6f 70 65 6e 28 75 73 65 72 5f 74 65 6d 70 6c 61  open(user_templa
17310 74 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20  tename,"rb");.  
17320 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
17330 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
17340 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20  err,"Can't open 
17350 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  the template fil
17360 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 75 73 65  e \"%s\".\n",use
17370 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b  r_templatename);
17380 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  .      lemp->err
17390 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72  orcnt++;.      r
173a0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
173b0 20 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 20 20     return in;.  
173c0 7d 0a 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  }..  cp = strrch
173d0 72 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  r(lemp->filename
173e0 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20  ,'.');.  if( cp 
173f0 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62  ){.    sprintf(b
17400 75 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e  uf,"%.*s.lt",(in
17410 74 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65  t)(cp-lemp->file
17420 6e 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65  name),lemp->file
17430 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  name);.  }else{.
17440 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c      sprintf(buf,
17450 22 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69  "%s.lt",lemp->fi
17460 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69  lename);.  }.  i
17470 66 28 20 61 63 63 65 73 73 28 62 75 66 2c 30 30  f( access(buf,00
17480 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c  4)==0 ){.    tpl
17490 74 6e 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d  tname = buf;.  }
174a0 65 6c 73 65 20 69 66 28 20 61 63 63 65 73 73 28  else if( access(
174b0 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34  templatename,004
174c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74  )==0 ){.    tplt
174d0 6e 61 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e  name = templaten
174e0 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
174f0 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74    tpltname = pat
17500 68 73 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72  hsearch(lemp->ar
17510 67 76 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65  gv0,templatename
17520 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  ,0);.  }.  if( t
17530 70 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  pltname==0 ){.  
17540 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
17550 2c 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65  ,"Can't find the
17560 20 70 61 72 73 65 72 20 64 72 69 76 65 72 20 74   parser driver t
17570 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25  emplate file \"%
17580 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d  s\".\n",.    tem
17590 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20  platename);.    
175a0 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
175b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
175c0 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e    }.  in = fopen
175d0 28 74 70 6c 74 6e 61 6d 65 2c 22 72 62 22 29 3b  (tpltname,"rb");
175e0 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
175f0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
17600 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74  rr,"Can't open t
17610 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
17620 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70   \"%s\".\n",temp
17630 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c  latename);.    l
17640 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
17650 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
17660 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a   }.  return in;.
17670 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 23 6c  }../* Print a #l
17680 69 6e 65 20 64 69 72 65 63 74 69 76 65 20 6c 69  ine directive li
17690 6e 65 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ne to the output
176a0 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54   file. */.PRIVAT
176b0 45 20 76 6f 69 64 20 74 70 6c 74 5f 6c 69 6e 65  E void tplt_line
176c0 64 69 72 28 46 49 4c 45 20 2a 6f 75 74 2c 20 69  dir(FILE *out, i
176d0 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 68 61 72 20  nt lineno, char 
176e0 2a 66 69 6c 65 6e 61 6d 65 29 0a 7b 0a 20 20 66  *filename).{.  f
176f0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e  printf(out,"#lin
17700 65 20 25 64 20 5c 22 22 2c 6c 69 6e 65 6e 6f 29  e %d \"",lineno)
17710 3b 0a 20 20 77 68 69 6c 65 28 20 2a 66 69 6c 65  ;.  while( *file
17720 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69 66 28 20  name ){.    if( 
17730 2a 66 69 6c 65 6e 61 6d 65 20 3d 3d 20 27 5c 5c  *filename == '\\
17740 27 20 29 20 70 75 74 63 28 27 5c 5c 27 2c 6f 75  ' ) putc('\\',ou
17750 74 29 3b 0a 20 20 20 20 70 75 74 63 28 2a 66 69  t);.    putc(*fi
17760 6c 65 6e 61 6d 65 2c 6f 75 74 29 3b 0a 20 20 20  lename,out);.   
17770 20 66 69 6c 65 6e 61 6d 65 2b 2b 3b 0a 20 20 7d   filename++;.  }
17780 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
17790 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72  \"\n");.}../* Pr
177a0 69 6e 74 20 61 20 73 74 72 69 6e 67 20 74 6f 20  int a string to 
177b0 74 68 65 20 66 69 6c 65 20 61 6e 64 20 6b 65 65  the file and kee
177c0 70 20 74 68 65 20 6c 69 6e 65 6e 75 6d 62 65 72  p the linenumber
177d0 20 75 70 20 74 6f 20 64 61 74 65 20 2a 2f 0a 50   up to date */.P
177e0 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74  RIVATE void tplt
177f0 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74  _print(FILE *out
17800 2c 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  , struct lemon *
17810 6c 65 6d 70 2c 20 63 68 61 72 20 2a 73 74 72 2c  lemp, char *str,
17820 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a   int *lineno).{.
17830 20 20 69 66 28 20 73 74 72 3d 3d 30 20 29 20 72    if( str==0 ) r
17840 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20  eturn;.  while( 
17850 2a 73 74 72 20 29 7b 0a 20 20 20 20 70 75 74 63  *str ){.    putc
17860 28 2a 73 74 72 2c 6f 75 74 29 3b 0a 20 20 20 20  (*str,out);.    
17870 69 66 28 20 2a 73 74 72 3d 3d 27 5c 6e 27 20 29  if( *str=='\n' )
17880 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
17890 20 20 73 74 72 2b 2b 3b 0a 20 20 7d 0a 20 20 69    str++;.  }.  i
178a0 66 28 20 73 74 72 5b 2d 31 5d 21 3d 27 5c 6e 27  f( str[-1]!='\n'
178b0 20 29 7b 0a 20 20 20 20 70 75 74 63 28 27 5c 6e   ){.    putc('\n
178c0 27 2c 6f 75 74 29 3b 0a 20 20 20 20 28 2a 6c 69  ',out);.    (*li
178d0 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 7d 0a 20 20 69  neno)++;.  }.  i
178e0 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65  f (!lemp->noline
178f0 6e 6f 73 66 6c 61 67 29 20 7b 0a 20 20 20 20 28  nosflag) {.    (
17900 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74  *lineno)++; tplt
17910 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69  _linedir(out,*li
17920 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  neno,lemp->outna
17930 6d 65 29 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  me); .  }.  retu
17940 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rn;.}../*.** The
17950 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
17960 6e 65 20 65 6d 69 74 73 20 63 6f 64 65 20 66 6f  ne emits code fo
17970 72 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  r the destructor
17980 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 79 6d 62   for the.** symb
17990 6f 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64 20 65 6d  ol sp.*/.void em
179a0 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
179b0 64 65 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c  de(.  FILE *out,
179c0 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
179d0 20 2a 73 70 2c 0a 20 20 73 74 72 75 63 74 20 6c   *sp,.  struct l
179e0 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e  emon *lemp,.  in
179f0 74 20 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a 20 63 68  t *lineno.){. ch
17a00 61 72 20 2a 63 70 20 3d 20 30 3b 0a 0a 20 69 66  ar *cp = 0;.. if
17a10 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  ( sp->type==TERM
17a20 49 4e 41 4c 20 29 7b 0a 20 20 20 63 70 20 3d 20  INAL ){.   cp = 
17a30 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b  lemp->tokendest;
17a40 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20  .   if( cp==0 ) 
17a50 72 65 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e  return;.   fprin
17a60 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28  tf(out,"{\n"); (
17a70 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c  *lineno)++;. }el
17a80 73 65 20 69 66 28 20 73 70 2d 3e 64 65 73 74 72  se if( sp->destr
17a90 75 63 74 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d  uctor ){.   cp =
17aa0 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b   sp->destructor;
17ab0 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
17ac0 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f  "{\n"); (*lineno
17ad0 29 2b 2b 3b 0a 20 20 20 69 66 20 28 21 6c 65 6d  )++;.   if (!lem
17ae0 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
17af0 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ) { (*lineno)++;
17b00 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75   tplt_linedir(ou
17b10 74 2c 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f  t,sp->destLineno
17b20 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
17b30 3b 20 7d 0a 20 7d 65 6c 73 65 20 69 66 28 20 6c  ; }. }else if( l
17b40 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a  emp->vardest ){.
17b50 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61     cp = lemp->va
17b60 72 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70  rdest;.   if( cp
17b70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
17b80 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c   fprintf(out,"{\
17b90 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n"); (*lineno)++
17ba0 3b 0a 20 7d 65 6c 73 65 7b 0a 20 20 20 61 73 73  ;. }else{.   ass
17bb0 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61  ert( 0 );  /* Ca
17bc0 6e 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20  nnot happen */. 
17bd0 7d 0a 20 66 6f 72 28 3b 20 2a 63 70 3b 20 63 70  }. for(; *cp; cp
17be0 2b 2b 29 7b 0a 20 20 20 69 66 28 20 2a 63 70 3d  ++){.   if( *cp=
17bf0 3d 27 24 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='$' && cp[1]=='
17c00 24 27 20 29 7b 0a 20 20 20 20 20 66 70 72 69 6e  $' ){.     fprin
17c10 74 66 28 6f 75 74 2c 22 28 79 79 70 6d 69 6e 6f  tf(out,"(yypmino
17c20 72 2d 3e 79 79 25 64 29 22 2c 73 70 2d 3e 64 74  r->yy%d)",sp->dt
17c30 6e 75 6d 29 3b 0a 20 20 20 20 20 63 70 2b 2b 3b  num);.     cp++;
17c40 0a 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a  .     continue;.
17c50 20 20 20 7d 0a 20 20 20 69 66 28 20 2a 63 70 3d     }.   if( *cp=
17c60 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f  ='\n' ) (*lineno
17c70 29 2b 2b 3b 0a 20 20 20 66 70 75 74 63 28 2a 63  )++;.   fputc(*c
17c80 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20 66 70 72 69  p,out);. }. fpri
17c90 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 28  ntf(out,"\n"); (
17ca0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 69 66 20  *lineno)++;. if 
17cb0 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f  (!lemp->nolineno
17cc0 73 66 6c 61 67 29 20 7b 20 0a 20 20 20 28 2a 6c  sflag) { .   (*l
17cd0 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c  ineno)++; tplt_l
17ce0 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65  inedir(out,*line
17cf0 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  no,lemp->outname
17d00 29 3b 20 0a 20 7d 0a 20 66 70 72 69 6e 74 66 28  ); . }. fprintf(
17d10 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69  out,"}\n"); (*li
17d20 6e 65 6e 6f 29 2b 2b 3b 0a 20 72 65 74 75 72 6e  neno)++;. return
17d30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17d40 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f  n TRUE (non-zero
17d50 29 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  ) if the given s
17d60 79 6d 62 6f 6c 20 68 61 73 20 61 20 64 65 73 74  ymbol has a dest
17d70 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 68  ructor..*/.int h
17d80 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28 73 74  as_destructor(st
17d90 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c  ruct symbol *sp,
17da0 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c   struct lemon *l
17db0 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 72 65 74  emp).{.  int ret
17dc0 3b 0a 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65  ;.  if( sp->type
17dd0 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ==TERMINAL ){.  
17de0 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 74 6f    ret = lemp->to
17df0 6b 65 6e 64 65 73 74 21 3d 30 3b 0a 20 20 7d 65  kendest!=0;.  }e
17e00 6c 73 65 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c  lse{.    ret = l
17e10 65 6d 70 2d 3e 76 61 72 64 65 73 74 21 3d 30 20  emp->vardest!=0 
17e20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  || sp->destructo
17e30 72 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  r!=0;.  }.  retu
17e40 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
17e50 20 41 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20   Append text to 
17e60 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
17e70 6c 6f 63 61 74 65 64 20 73 74 72 69 6e 67 2e 20  located string. 
17e80 20 49 66 20 7a 54 65 78 74 20 69 73 20 30 20 74   If zText is 0 t
17e90 68 65 6e 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  hen.** reset the
17ea0 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20 65 6d   string to be em
17eb0 70 74 79 20 61 67 61 69 6e 2e 20 20 41 6c 77 61  pty again.  Alwa
17ec0 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f  ys return the co
17ed0 6d 70 6c 65 74 65 20 74 65 78 74 0a 2a 2a 20 6f  mplete text.** o
17ee0 66 20 74 68 65 20 73 74 72 69 6e 67 20 28 77 68  f the string (wh
17ef0 69 63 68 20 69 73 20 6f 76 65 72 77 72 69 74 74  ich is overwritt
17f00 65 6e 20 77 69 74 68 20 65 61 63 68 20 63 61 6c  en with each cal
17f10 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79 74 65  l)..**.** n byte
17f20 73 20 6f 66 20 7a 54 65 78 74 20 61 72 65 20 73  s of zText are s
17f30 74 6f 72 65 64 2e 20 20 49 66 20 6e 3d 3d 30 20  tored.  If n==0 
17f40 74 68 65 6e 20 61 6c 6c 20 6f 66 20 7a 54 65 78  then all of zTex
17f50 74 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  t up to the firs
17f60 74 0a 2a 2a 20 5c 30 30 30 20 74 65 72 6d 69 6e  t.** \000 termin
17f70 61 74 6f 72 20 69 73 20 73 74 6f 72 65 64 2e 20  ator is stored. 
17f80 20 7a 54 65 78 74 20 63 61 6e 20 63 6f 6e 74 61   zText can conta
17f90 69 6e 20 75 70 20 74 6f 20 74 77 6f 20 69 6e 73  in up to two ins
17fa0 74 61 6e 63 65 73 20 6f 66 0a 2a 2a 20 25 64 2e  tances of.** %d.
17fb0 20 20 54 68 65 20 76 61 6c 75 65 73 20 6f 66 20    The values of 
17fc0 70 31 20 61 6e 64 20 70 32 20 61 72 65 20 77 72  p1 and p2 are wr
17fd0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 66  itten into the f
17fe0 69 72 73 74 20 61 6e 64 20 73 65 63 6f 6e 64 0a  irst and second.
17ff0 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ** %d..**.** If 
18000 6e 3d 3d 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  n==-1, then the 
18010 70 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74  previous charact
18020 65 72 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  er is overwritte
18030 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63 68  n..*/.PRIVATE ch
18040 61 72 20 2a 61 70 70 65 6e 64 5f 73 74 72 28 63  ar *append_str(c
18050 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
18060 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 70 31 2c  , int n, int p1,
18070 20 69 6e 74 20 70 32 29 7b 0a 20 20 73 74 61 74   int p2){.  stat
18080 69 63 20 63 68 61 72 20 65 6d 70 74 79 5b 31 5d  ic char empty[1]
18090 20 3d 20 7b 20 30 20 7d 3b 0a 20 20 73 74 61 74   = { 0 };.  stat
180a0 69 63 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  ic char *z = 0;.
180b0 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c    static int all
180c0 6f 63 65 64 20 3d 20 30 3b 0a 20 20 73 74 61 74  oced = 0;.  stat
180d0 69 63 20 69 6e 74 20 75 73 65 64 20 3d 20 30 3b  ic int used = 0;
180e0 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61 72  .  int c;.  char
180f0 20 7a 49 6e 74 5b 34 30 5d 3b 0a 20 20 69 66 28   zInt[40];.  if(
18100 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20   zText==0 ){.   
18110 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 72   used = 0;.    r
18120 65 74 75 72 6e 20 7a 3b 0a 20 20 7d 0a 20 20 69  eturn z;.  }.  i
18130 66 28 20 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 69  f( n<=0 ){.    i
18140 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( n<0 ){.      
18150 75 73 65 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  used += n;.     
18160 20 61 73 73 65 72 74 28 20 75 73 65 64 3e 3d 30   assert( used>=0
18170 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   );.    }.    n 
18180 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 54  = lemonStrlen(zT
18190 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ext);.  }.  if( 
181a0 6e 2b 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32  n+sizeof(zInt)*2
181b0 2b 75 73 65 64 20 3e 3d 20 61 6c 6c 6f 63 65 64  +used >= alloced
181c0 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 65 64 20   ){.    alloced 
181d0 3d 20 6e 20 2b 20 73 69 7a 65 6f 66 28 7a 49 6e  = n + sizeof(zIn
181e0 74 29 2a 32 20 2b 20 75 73 65 64 20 2b 20 32 30  t)*2 + used + 20
181f0 30 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72  0;.    z = (char
18200 20 2a 29 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20   *) realloc(z,  
18210 61 6c 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20  alloced);.  }.  
18220 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
18230 6e 20 65 6d 70 74 79 3b 0a 20 20 77 68 69 6c 65  n empty;.  while
18240 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
18250 20 63 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b   c = *(zText++);
18260 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20  .    if( c=='%' 
18270 26 26 20 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b  && n>0 && zText[
18280 30 5d 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20  0]=='d' ){.     
18290 20 73 70 72 69 6e 74 66 28 7a 49 6e 74 2c 20 22   sprintf(zInt, "
182a0 25 64 22 2c 20 70 31 29 3b 0a 20 20 20 20 20 20  %d", p1);.      
182b0 70 31 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 73  p1 = p2;.      s
182c0 74 72 63 70 79 28 26 7a 5b 75 73 65 64 5d 2c 20  trcpy(&z[used], 
182d0 7a 49 6e 74 29 3b 0a 20 20 20 20 20 20 75 73 65  zInt);.      use
182e0 64 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  d += lemonStrlen
182f0 28 26 7a 5b 75 73 65 64 5d 29 3b 0a 20 20 20 20  (&z[used]);.    
18300 20 20 7a 54 65 78 74 2b 2b 3b 0a 20 20 20 20 20    zText++;.     
18310 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   n--;.    }else{
18320 0a 20 20 20 20 20 20 7a 5b 75 73 65 64 2b 2b 5d  .      z[used++]
18330 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = c;.    }.  }.
18340 20 20 7a 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20    z[used] = 0;. 
18350 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
18360 0a 2a 2a 20 7a 43 6f 64 65 20 69 73 20 61 20 73  .** zCode is a s
18370 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 74 68  tring that is th
18380 65 20 61 63 74 69 6f 6e 20 61 73 73 6f 63 69 61  e action associa
18390 74 65 64 20 77 69 74 68 20 61 20 72 75 6c 65 2e  ted with a rule.
183a0 20 20 45 78 70 61 6e 64 0a 2a 2a 20 74 68 65 20    Expand.** the 
183b0 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 69 73 20  symbols in this 
183c0 73 74 72 69 6e 67 20 73 6f 20 74 68 61 74 20 74  string so that t
183d0 68 65 20 72 65 66 65 72 20 74 6f 20 65 6c 65 6d  he refer to elem
183e0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 72 73  ents of the pars
183f0 65 72 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a  er.** stack..*/.
18400 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 72 61  PRIVATE void tra
18410 6e 73 6c 61 74 65 5f 63 6f 64 65 28 73 74 72 75  nslate_code(stru
18420 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20  ct lemon *lemp, 
18430 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29  struct rule *rp)
18440 7b 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 78  {.  char *cp, *x
18450 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
18460 61 72 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 20  ar lhsused = 0; 
18470 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
18480 65 20 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68 61  e LHS element ha
18490 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20  s been used */. 
184a0 20 63 68 61 72 20 75 73 65 64 5b 4d 41 58 52 48   char used[MAXRH
184b0 53 5d 3b 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  S];   /* True fo
184c0 72 20 65 61 63 68 20 52 48 53 20 65 6c 65 6d 65  r each RHS eleme
184d0 6e 74 20 77 68 69 63 68 20 69 73 20 75 73 65 64  nt which is used
184e0 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */..  for(i=0; 
184f0 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
18500 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20   used[i] = 0;.  
18510 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  lhsused = 0;..  
18520 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20  if( rp->code==0 
18530 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68  ){.    static ch
18540 61 72 20 6e 65 77 6c 69 6e 65 73 74 72 5b 32 5d  ar newlinestr[2]
18550 20 3d 20 7b 20 27 5c 6e 27 2c 20 27 5c 30 27 20   = { '\n', '\0' 
18560 7d 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20  };.    rp->code 
18570 3d 20 6e 65 77 6c 69 6e 65 73 74 72 3b 0a 20 20  = newlinestr;.  
18580 20 20 72 70 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d    rp->line = rp-
18590 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20 20 7d 0a 0a  >ruleline;.  }..
185a0 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30    append_str(0,0
185b0 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ,0,0);..  /* Thi
185c0 73 20 63 6f 6e 73 74 20 63 61 73 74 20 69 73 20  s const cast is 
185d0 77 72 6f 6e 67 20 62 75 74 20 68 61 72 6d 6c 65  wrong but harmle
185e0 73 73 2c 20 69 66 20 77 65 27 72 65 20 63 61 72  ss, if we're car
185f0 65 66 75 6c 2e 20 2a 2f 0a 20 20 66 6f 72 28 63  eful. */.  for(c
18600 70 3d 28 63 68 61 72 20 2a 29 72 70 2d 3e 63 6f  p=(char *)rp->co
18610 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a  de; *cp; cp++){.
18620 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28      if( isalpha(
18630 2a 63 70 29 20 26 26 20 28 63 70 3d 3d 72 70 2d  *cp) && (cp==rp-
18640 3e 63 6f 64 65 20 7c 7c 20 28 21 69 73 61 6c 6e  >code || (!isaln
18650 75 6d 28 63 70 5b 2d 31 5d 29 20 26 26 20 63 70  um(cp[-1]) && cp
18660 5b 2d 31 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20  [-1]!='_')) ){. 
18670 20 20 20 20 20 63 68 61 72 20 73 61 76 65 64 3b       char saved;
18680 0a 20 20 20 20 20 20 66 6f 72 28 78 70 3d 20 26  .      for(xp= &
18690 63 70 5b 31 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a  cp[1]; isalnum(*
186a0 78 70 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b  xp) || *xp=='_';
186b0 20 78 70 2b 2b 29 3b 0a 20 20 20 20 20 20 73 61   xp++);.      sa
186c0 76 65 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20  ved = *xp;.     
186d0 20 2a 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20   *xp = 0;.      
186e0 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
186f0 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70   && strcmp(cp,rp
18700 2d 3e 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20 29  ->lhsalias)==0 )
18710 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
18720 5f 73 74 72 28 22 79 79 67 6f 74 6f 6d 69 6e 6f  _str("yygotomino
18730 72 2e 79 79 25 64 22 2c 30 2c 72 70 2d 3e 6c 68  r.yy%d",0,rp->lh
18740 73 2d 3e 64 74 6e 75 6d 2c 30 29 3b 0a 20 20 20  s->dtnum,0);.   
18750 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20       cp = xp;.  
18760 20 20 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20        lhsused = 
18770 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
18780 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
18790 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
187a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
187b0 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
187c0 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70   && strcmp(cp,rp
187d0 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d  ->rhsalias[i])==
187e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
187f0 20 69 66 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64   if( cp!=rp->cod
18800 65 20 26 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27  e && cp[-1]=='@'
18810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18820 20 20 2f 2a 20 49 66 20 74 68 65 20 61 72 67 75    /* If the argu
18830 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
18840 6f 72 6d 20 40 58 20 74 68 65 6e 20 73 75 62 73  orm @X then subs
18850 74 69 74 75 74 65 64 0a 20 20 20 20 20 20 20 20  tituted.        
18860 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b        ** the tok
18870 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20  en number of X, 
18880 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  not the value of
18890 20 58 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   X */.          
188a0 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
188b0 79 79 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22  yymsp[%d].major"
188c0 2c 2d 31 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  ,-1,i-rp->nrhs+1
188d0 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,0);.           
188e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
188f0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
18900 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68  bol *sp = rp->rh
18910 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  s[i];.          
18920 20 20 20 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20      int dtnum;. 
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
18940 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
18950 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
18960 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e 75              dtnu
18970 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30  m = sp->subsym[0
18980 5d 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20  ]->dtnum;.      
18990 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
189a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
189b0 74 6e 75 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d  tnum = sp->dtnum
189c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
189d0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
189e0 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73  append_str("yyms
189f0 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64  p[%d].minor.yy%d
18a00 22 2c 30 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  ",0,i-rp->nrhs+1
18a10 2c 20 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  , dtnum);.      
18a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18a30 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20      cp = xp;.   
18a40 20 20 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d           used[i]
18a50 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
18a60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
18a70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
18a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 78 70       }.      *xp
18a90 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a   = saved;.    }.
18aa0 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 63      append_str(c
18ab0 70 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  p, 1, 0, 0);.  }
18ac0 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a   /* End loop */.
18ad0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  /* Check to m
18ae0 61 6b 65 20 73 75 72 65 20 74 68 65 20 4c 48 53  ake sure the LHS
18af0 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a   has been used *
18b00 2f 0a 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61  /.  if( rp->lhsa
18b10 6c 69 61 73 20 26 26 20 21 6c 68 73 75 73 65 64  lias && !lhsused
18b20 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67   ){.    ErrorMsg
18b30 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
18b40 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20  rp->ruleline,.  
18b50 20 20 20 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c      "Label \"%s\
18b60 22 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22  " for \"%s(%s)\"
18b70 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22   is never used."
18b80 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68  ,.        rp->lh
18b90 73 61 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e  salias,rp->lhs->
18ba0 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  name,rp->lhsalia
18bb0 73 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72  s);.    lemp->er
18bc0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20  rorcnt++;.  }.. 
18bd0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 64 65 73   /* Generate des
18be0 74 72 75 63 74 6f 72 20 63 6f 64 65 20 66 6f 72  tructor code for
18bf0 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 68 69   RHS symbols whi
18c00 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ch are not used 
18c10 69 6e 20 74 68 65 0a 20 20 2a 2a 20 72 65 64 75  in the.  ** redu
18c20 63 65 20 63 6f 64 65 20 2a 2f 0a 20 20 66 6f 72  ce code */.  for
18c30 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
18c40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
18c50 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20  rp->rhsalias[i] 
18c60 26 26 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20  && !used[i] ){. 
18c70 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
18c80 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
18c90 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20  >ruleline,.     
18ca0 20 20 20 22 4c 61 62 65 6c 20 25 73 20 66 6f 72     "Label %s for
18cb0 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e   \"%s(%s)\" is n
18cc0 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20  ever used.",.   
18cd0 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61       rp->rhsalia
18ce0 73 5b 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d  s[i],rp->rhs[i]-
18cf0 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69  >name,rp->rhsali
18d00 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 6c 65  as[i]);.      le
18d10 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
18d20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70      }else if( rp
18d30 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 3d 3d 30  ->rhsalias[i]==0
18d40 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61   ){.      if( ha
18d50 73 5f 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d  s_destructor(rp-
18d60 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b  >rhs[i],lemp) ){
18d70 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f  .        append_
18d80 73 74 72 28 22 20 20 79 79 5f 64 65 73 74 72 75  str("  yy_destru
18d90 63 74 6f 72 28 79 79 70 50 61 72 73 65 72 2c 25  ctor(yypParser,%
18da0 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e  d,&yymsp[%d].min
18db0 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20  or);\n", 0,.    
18dc0 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69         rp->rhs[i
18dd0 5d 2d 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e  ]->index,i-rp->n
18de0 72 68 73 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  rhs+1);.      }e
18df0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
18e00 4e 6f 20 64 65 73 74 72 75 63 74 6f 72 20 64 65  No destructor de
18e10 66 69 6e 65 64 20 66 6f 72 20 74 68 69 73 20 74  fined for this t
18e20 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  erm */.      }. 
18e30 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
18e40 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20 63  p->code ){.    c
18e50 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72 28 30  p = append_str(0
18e60 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 72 70 2d  ,0,0,0);.    rp-
18e70 3e 63 6f 64 65 20 3d 20 53 74 72 73 61 66 65 28  >code = Strsafe(
18e80 63 70 3f 63 70 3a 22 22 29 3b 0a 20 20 7d 0a 7d  cp?cp:"");.  }.}
18e90 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74  ../* .** Generat
18ea0 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
18eb0 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 72  cutes when the r
18ec0 75 6c 65 20 22 72 70 22 20 69 73 20 72 65 64 75  ule "rp" is redu
18ed0 63 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74  ced.  Write.** t
18ee0 68 65 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22  he code to "out"
18ef0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e  .  Make sure lin
18f00 65 6e 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d  eno stays up-to-
18f10 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  date..*/.PRIVATE
18f20 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28   void emit_code(
18f30 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20 20  .  FILE *out,.  
18f40 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
18f50 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
18f60 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c 69  *lemp,.  int *li
18f70 6e 65 6e 6f 0a 29 7b 0a 20 63 6f 6e 73 74 20 63  neno.){. const c
18f80 68 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a 20 47 65  har *cp;.. /* Ge
18f90 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64  nerate code to d
18fa0 6f 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74  o the reduce act
18fb0 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e  ion */. if( rp->
18fc0 63 6f 64 65 20 29 7b 0a 20 20 20 69 66 20 28 21  code ){.   if (!
18fd0 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66  lemp->nolinenosf
18fe0 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29  lag) { (*lineno)
18ff0 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  ++; tplt_linedir
19000 28 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65  (out,rp->line,le
19010 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 20 7d  mp->filename); }
19020 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
19030 22 7b 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b  "{%s",rp->code);
19040 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63  .   for(cp=rp->c
19050 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b  ode; *cp; cp++){
19060 0a 20 20 20 20 20 69 66 28 20 2a 63 70 3d 3d 27  .     if( *cp=='
19070 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n' ) (*lineno)+
19080 2b 3b 0a 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c  +;.   } /* End l
19090 6f 6f 70 20 2a 2f 0a 20 20 20 66 70 72 69 6e 74  oop */.   fprint
190a0 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a  f(out,"}\n"); (*
190b0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66  lineno)++;.   if
190c0 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e   (!lemp->nolinen
190d0 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65  osflag) { (*line
190e0 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65  no)++; tplt_line
190f0 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c  dir(out,*lineno,
19100 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20  lemp->outname); 
19110 7d 0a 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20  }. } /* End if( 
19120 72 70 2d 3e 63 6f 64 65 20 29 20 2a 2f 0a 0a 20  rp->code ) */.. 
19130 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
19140 20 50 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e   Print the defin
19150 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69  ition of the uni
19160 6f 6e 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  on used for the 
19170 70 61 72 73 65 72 27 73 20 64 61 74 61 20 73 74  parser's data st
19180 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69  ack..** This uni
19190 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c  on contains fiel
191a0 64 73 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73  ds for every pos
191b0 73 69 62 6c 65 20 64 61 74 61 20 74 79 70 65 20  sible data type 
191c0 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e  for tokens.** an
191d0 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20  d nonterminals. 
191e0 20 49 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20   In the process 
191f0 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64  of computing and
19200 20 70 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a   printing this.*
19210 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65  * union, also se
19220 74 20 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66  t the ".dtnum" f
19230 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65  ield of every te
19240 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65  rminal and nonte
19250 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c  rminal.** symbol
19260 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f  ..*/.void print_
19270 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 0a 20 20 46  stack_union(.  F
19280 49 4c 45 20 2a 6f 75 74 2c 20 20 20 20 20 20 20  ILE *out,       
19290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
192a0 65 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20  e output stream 
192b0 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  */.  struct lemo
192c0 6e 20 2a 6c 65 6d 70 2c 20 20 20 20 20 20 20 20  n *lemp,        
192d0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66   /* The main inf
192e0 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  o structure for 
192f0 74 68 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 20  this parser */. 
19300 20 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 2c 20 20   int *plineno,  
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19320 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c  Pointer to the l
19330 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ine number */.  
19340 69 6e 74 20 6d 68 66 6c 61 67 20 20 20 20 20 20  int mhflag      
19350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19360 72 75 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e  rue if generatin
19370 67 20 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75  g makeheaders ou
19380 74 70 75 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tput */.){.  int
19390 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65   lineno = *pline
193a0 6e 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69  no;    /* The li
193b0 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ne number of the
193c0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61   output */.  cha
193d0 72 20 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20  r **types;      
193e0 20 20 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68         /* A hash
193f0 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79   table of dataty
19400 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72  pes */.  int arr
19410 61 79 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  aysize;         
19420 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
19430 65 20 22 74 79 70 65 73 22 20 61 72 72 61 79 20  e "types" array 
19440 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65  */.  int maxdtle
19450 6e 67 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f  ngth;          /
19460 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68  * Maximum length
19470 20 6f 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79   of any ".dataty
19480 70 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  pe" field. */.  
19490 63 68 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20  char *stddt;    
194a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
194b0 6e 64 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66  ndardized name f
194c0 6f 72 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f  or a datatype */
194d0 0a 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20  .  int i,j;     
194e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
194f0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
19500 0a 20 20 69 6e 74 20 68 61 73 68 3b 20 20 20 20  .  int hash;    
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19520 46 6f 72 20 68 61 73 68 69 6e 67 20 74 68 65 20  For hashing the 
19530 6e 61 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a  name of a type *
19540 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
19550 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  name;         /*
19560 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72   Name of the par
19570 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ser */..  /* All
19580 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
19590 6c 69 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64  lize types[] and
195a0 20 61 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b   allocate stddt[
195b0 5d 20 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65  ] */.  arraysize
195c0 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   = lemp->nsymbol
195d0 20 2a 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20   * 2;.  types = 
195e0 28 63 68 61 72 2a 2a 29 63 61 6c 6c 6f 63 28 20  (char**)calloc( 
195f0 61 72 72 61 79 73 69 7a 65 2c 20 73 69 7a 65 6f  arraysize, sizeo
19600 66 28 63 68 61 72 2a 29 20 29 3b 0a 20 20 66 6f  f(char*) );.  fo
19610 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69  r(i=0; i<arraysi
19620 7a 65 3b 20 69 2b 2b 29 20 74 79 70 65 73 5b 69  ze; i++) types[i
19630 5d 20 3d 20 30 3b 0a 20 20 6d 61 78 64 74 6c 65  ] = 0;.  maxdtle
19640 6e 67 74 68 20 3d 20 30 3b 0a 20 20 69 66 28 20  ngth = 0;.  if( 
19650 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 20 29 7b  lemp->vartype ){
19660 0a 20 20 20 20 6d 61 78 64 74 6c 65 6e 67 74 68  .    maxdtlength
19670 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c   = lemonStrlen(l
19680 65 6d 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20  emp->vartype);. 
19690 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
196a0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
196b0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e  ++){.    int len
196c0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  ;.    struct sym
196d0 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e  bol *sp = lemp->
196e0 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
196f0 69 66 28 20 73 70 2d 3e 64 61 74 61 74 79 70 65  if( sp->datatype
19700 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
19710 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53      len = lemonS
19720 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74 61 74 79  trlen(sp->dataty
19730 70 65 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e  pe);.    if( len
19740 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20 29 20 6d  >maxdtlength ) m
19750 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6e  axdtlength = len
19760 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74 20 3d 20  ;.  }.  stddt = 
19770 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6d  (char*)malloc( m
19780 61 78 64 74 6c 65 6e 67 74 68 2a 32 20 2b 20 31  axdtlength*2 + 1
19790 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65 73 3d   );.  if( types=
197a0 3d 30 20 7c 7c 20 73 74 64 64 74 3d 3d 30 20 29  =0 || stddt==0 )
197b0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
197c0 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d  derr,"Out of mem
197d0 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78  ory.\n");.    ex
197e0 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  it(1);.  }..  /*
197f0 20 42 75 69 6c 64 20 61 20 68 61 73 68 20 74 61   Build a hash ta
19800 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65 73  ble of datatypes
19810 2e 20 54 68 65 20 22 2e 64 74 6e 75 6d 22 20 66  . The ".dtnum" f
19820 69 65 6c 64 20 6f 66 20 65 61 63 68 20 73 79 6d  ield of each sym
19830 62 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c  bol.  ** is fill
19840 65 64 20 69 6e 20 77 69 74 68 20 74 68 65 20 68  ed in with the h
19850 61 73 68 20 69 6e 64 65 78 20 70 6c 75 73 20 31  ash index plus 1
19860 2e 20 20 41 20 22 2e 64 74 6e 75 6d 22 20 76 61  .  A ".dtnum" va
19870 6c 75 65 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a  lue of 0 is.  **
19880 20 75 73 65 64 20 66 6f 72 20 74 65 72 6d 69 6e   used for termin
19890 61 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66 20  al symbols.  If 
198a0 74 68 65 72 65 20 69 73 20 6e 6f 20 25 64 65 66  there is no %def
198b0 61 75 6c 74 5f 74 79 70 65 20 64 65 66 69 6e 65  ault_type define
198c0 64 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69 73  d then.  ** 0 is
198d0 20 61 6c 73 6f 20 75 73 65 64 20 61 73 20 74 68   also used as th
198e0 65 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20 66  e .dtnum value f
198f0 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20  or nonterminals 
19900 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 73 70 65  which do not spe
19910 63 69 66 79 0a 20 20 2a 2a 20 61 20 64 61 74 61  cify.  ** a data
19920 74 79 70 65 20 75 73 69 6e 67 20 74 68 65 20 25  type using the %
19930 74 79 70 65 20 64 69 72 65 63 74 69 76 65 2e 0a  type directive..
19940 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
19950 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
19960 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
19970 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
19980 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
19990 0a 20 20 20 20 63 68 61 72 20 2a 63 70 3b 0a 20  .    char *cp;. 
199a0 20 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70 2d     if( sp==lemp-
199b0 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20  >errsym ){.     
199c0 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72 72   sp->dtnum = arr
199d0 61 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20 20  aysize+1;.      
199e0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
199f0 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
19a00 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c  !=NONTERMINAL ||
19a10 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d   (sp->datatype==
19a20 30 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74 79  0 && lemp->varty
19a30 70 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  pe==0) ){.      
19a40 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20  sp->dtnum = 0;. 
19a50 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
19a60 20 20 20 7d 0a 20 20 20 20 63 70 20 3d 20 73 70     }.    cp = sp
19a70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20  ->datatype;.    
19a80 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d  if( cp==0 ) cp =
19a90 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b 0a   lemp->vartype;.
19aa0 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77      j = 0;.    w
19ab0 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 63  hile( isspace(*c
19ac0 70 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77  p) ) cp++;.    w
19ad0 68 69 6c 65 28 20 2a 63 70 20 29 20 73 74 64 64  hile( *cp ) stdd
19ae0 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a  t[j++] = *cp++;.
19af0 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
19b00 26 20 69 73 73 70 61 63 65 28 73 74 64 64 74 5b  & isspace(stddt[
19b10 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20  j-1]) ) j--;.   
19b20 20 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20   stddt[j] = 0;. 
19b30 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b     if( lemp->tok
19b40 65 6e 74 79 70 65 20 26 26 20 73 74 72 63 6d 70  entype && strcmp
19b50 28 73 74 64 64 74 2c 20 6c 65 6d 70 2d 3e 74 6f  (stddt, lemp->to
19b60 6b 65 6e 74 79 70 65 29 3d 3d 30 20 29 7b 0a 20  kentype)==0 ){. 
19b70 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d       sp->dtnum =
19b80 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
19b90 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61  ue;.    }.    ha
19ba0 73 68 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  sh = 0;.    for(
19bb0 6a 3d 30 3b 20 73 74 64 64 74 5b 6a 5d 3b 20 6a  j=0; stddt[j]; j
19bc0 2b 2b 29 7b 0a 20 20 20 20 20 20 68 61 73 68 20  ++){.      hash 
19bd0 3d 20 68 61 73 68 2a 35 33 20 2b 20 73 74 64 64  = hash*53 + stdd
19be0 74 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t[j];.    }.    
19bf0 68 61 73 68 20 3d 20 28 68 61 73 68 20 26 20 30  hash = (hash & 0
19c00 78 37 66 66 66 66 66 66 66 29 25 61 72 72 61 79  x7fffffff)%array
19c10 73 69 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65 28  size;.    while(
19c20 20 74 79 70 65 73 5b 68 61 73 68 5d 20 29 7b 0a   types[hash] ){.
19c30 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
19c40 28 74 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64  (types[hash],std
19c50 64 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dt)==0 ){.      
19c60 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61    sp->dtnum = ha
19c70 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  sh + 1;.        
19c80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
19c90 20 20 20 20 20 68 61 73 68 2b 2b 3b 0a 20 20 20       hash++;.   
19ca0 20 20 20 69 66 28 20 68 61 73 68 3e 3d 61 72 72     if( hash>=arr
19cb0 61 79 73 69 7a 65 20 29 20 68 61 73 68 20 3d 20  aysize ) hash = 
19cc0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
19cd0 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20   types[hash]==0 
19ce0 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e  ){.      sp->dtn
19cf0 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20  um = hash + 1;. 
19d00 20 20 20 20 20 74 79 70 65 73 5b 68 61 73 68 5d       types[hash]
19d10 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63   = (char*)malloc
19d20 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 74  ( lemonStrlen(st
19d30 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20 20  ddt)+1 );.      
19d40 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d  if( types[hash]=
19d50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  =0 ){.        fp
19d60 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75  rintf(stderr,"Ou
19d70 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29  t of memory.\n")
19d80 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31  ;.        exit(1
19d90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19da0 20 73 74 72 63 70 79 28 74 79 70 65 73 5b 68 61   strcpy(types[ha
19db0 73 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20 20  sh],stddt);.    
19dc0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e  }.  }..  /* Prin
19dd0 74 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e 69  t out the defini
19de0 74 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54  tion of YYTOKENT
19df0 59 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54  YPE and YYMINORT
19e00 59 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20  YPE */.  name = 
19e10 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d  lemp->name ? lem
19e20 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65  p->name : "Parse
19e30 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70  ";.  lineno = *p
19e40 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68  lineno;.  if( mh
19e50 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28  flag ){ fprintf(
19e60 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41  out,"#if INTERFA
19e70 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  CE\n"); lineno++
19e80 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ; }.  fprintf(ou
19e90 74 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f 4b  t,"#define %sTOK
19ea0 45 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d  ENTYPE %s\n",nam
19eb0 65 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b  e,.    lemp->tok
19ec0 65 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b  entype?lemp->tok
19ed0 65 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b  entype:"void*");
19ee0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66    lineno++;.  if
19ef0 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69  ( mhflag ){ fpri
19f00 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c  ntf(out,"#endif\
19f10 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d  n"); lineno++; }
19f20 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
19f30 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c  typedef union {\
19f40 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
19f50 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
19f60 69 6e 74 20 79 79 69 6e 69 74 3b 5c 6e 22 29 3b  int yyinit;\n");
19f70 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
19f80 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 54 4f  intf(out,"  %sTO
19f90 4b 45 4e 54 59 50 45 20 79 79 30 3b 5c 6e 22 2c  KENTYPE yy0;\n",
19fa0 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
19fb0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
19fc0 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20  raysize; i++){. 
19fd0 20 20 20 69 66 28 20 74 79 70 65 73 5b 69 5d 3d     if( types[i]=
19fe0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
19ff0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1a000 20 20 25 73 20 79 79 25 64 3b 5c 6e 22 2c 74 79    %s yy%d;\n",ty
1a010 70 65 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e  pes[i],i+1); lin
1a020 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28  eno++;.    free(
1a030 74 79 70 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20  types[i]);.  }. 
1a040 20 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79   if( lemp->errsy
1a050 6d 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20  m->useCnt ){.   
1a060 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1a070 69 6e 74 20 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d  int yy%d;\n",lem
1a080 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d  p->errsym->dtnum
1a090 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1a0a0 0a 20 20 66 72 65 65 28 73 74 64 64 74 29 3b 0a  .  free(stddt);.
1a0b0 20 20 66 72 65 65 28 74 79 70 65 73 29 3b 0a 20    free(types);. 
1a0c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20   fprintf(out,"} 
1a0d0 59 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29  YYMINORTYPE;\n")
1a0e0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70  ; lineno++;.  *p
1a0f0 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b  lineno = lineno;
1a100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1a110 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 43   the name of a C
1a120 20 64 61 74 61 74 79 70 65 20 61 62 6c 65 20 74   datatype able t
1a130 6f 20 72 65 70 72 65 73 65 6e 74 20 76 61 6c 75  o represent valu
1a140 65 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c 77  es between.** lw
1a150 72 20 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c 75  r and upr, inclu
1a160 73 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sive..*/.static 
1a170 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69  const char *mini
1a180 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e  mum_size_type(in
1a190 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 29 7b  t lwr, int upr){
1a1a0 0a 20 20 69 66 28 20 6c 77 72 3e 3d 30 20 29 7b  .  if( lwr>=0 ){
1a1b0 0a 20 20 20 20 69 66 28 20 75 70 72 3c 3d 32 35  .    if( upr<=25
1a1c0 35 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  5 ){.      retur
1a1d0 6e 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n "unsigned char
1a1e0 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
1a1f0 20 75 70 72 3c 36 35 35 33 35 20 29 7b 0a 20 20   upr<65535 ){.  
1a200 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69      return "unsi
1a210 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 22 3b  gned short int";
1a220 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a230 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e    return "unsign
1a240 65 64 20 69 6e 74 22 3b 0a 20 20 20 20 7d 0a 20  ed int";.    }. 
1a250 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
1a260 2d 31 32 37 20 26 26 20 75 70 72 3c 3d 31 32 37  -127 && upr<=127
1a270 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22   ){.    return "
1a280 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20  signed char";.  
1a290 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d  }else if( lwr>=-
1a2a0 33 32 37 36 37 20 26 26 20 75 70 72 3c 33 32 37  32767 && upr<327
1a2b0 36 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  67 ){.    return
1a2c0 20 22 73 68 6f 72 74 22 3b 0a 20 20 7d 65 6c 73   "short";.  }els
1a2d0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 69  e{.    return "i
1a2e0 6e 74 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nt";.  }.}../*.*
1a2f0 2a 20 45 61 63 68 20 73 74 61 74 65 20 63 6f 6e  * Each state con
1a300 74 61 69 6e 73 20 61 20 73 65 74 20 6f 66 20 74  tains a set of t
1a310 6f 6b 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  oken transaction
1a320 20 61 6e 64 20 61 20 73 65 74 20 6f 66 0a 2a 2a   and a set of.**
1a330 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74 72 61   nonterminal tra
1a340 6e 73 61 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  nsactions.  Each
1a350 20 6f 66 20 74 68 65 73 65 20 73 65 74 73 20 6d   of these sets m
1a360 61 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  akes an instance
1a370 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
1a380 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  wing structure. 
1a390 20 41 6e 20 61 72 72 61 79 20 6f 66 20 74 68 65   An array of the
1a3a0 73 65 20 73 74 72 75 63 74 75 72 65 73 20 69 73  se structures is
1a3b0 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72 64 65   used.** to orde
1a3c0 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  r the creation o
1a3d0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
1a3e0 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62   yy_action[] tab
1a3f0 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 61 78  le..*/.struct ax
1a400 73 65 74 20 7b 0a 20 20 73 74 72 75 63 74 20 73  set {.  struct s
1a410 74 61 74 65 20 2a 73 74 70 3b 20 20 20 2f 2a 20  tate *stp;   /* 
1a420 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  A pointer to a s
1a430 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tate */.  int is
1a440 54 6b 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Tkn;           /
1a450 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 74 6f  * True to use to
1a460 6b 65 6e 73 2e 20 20 46 61 6c 73 65 20 66 6f 72  kens.  False for
1a470 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 2a   non-terminals *
1a480 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b  /.  int nAction;
1a490 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1a4a0 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 2a 2f  er of actions */
1a4b0 0a 20 20 69 6e 74 20 69 4f 72 64 65 72 3b 20 20  .  int iOrder;  
1a4c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
1a4d0 6e 61 6c 20 6f 72 64 65 72 20 6f 66 20 61 63 74  nal order of act
1a4e0 69 6f 6e 20 73 65 74 73 20 2a 2f 0a 7d 3b 0a 0a  ion sets */.};..
1a4f0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 6f  /*.** Compare to
1a500 20 61 78 73 65 74 20 73 74 72 75 63 74 75 72 65   axset structure
1a510 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75  s for sorting pu
1a520 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63  rposes.*/.static
1a530 20 69 6e 74 20 61 78 73 65 74 5f 63 6f 6d 70 61   int axset_compa
1a540 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61  re(const void *a
1a550 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29  , const void *b)
1a560 7b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74  {.  struct axset
1a570 20 2a 70 31 20 3d 20 28 73 74 72 75 63 74 20 61   *p1 = (struct a
1a580 78 73 65 74 2a 29 61 3b 0a 20 20 73 74 72 75 63  xset*)a;.  struc
1a590 74 20 61 78 73 65 74 20 2a 70 32 20 3d 20 28 73  t axset *p2 = (s
1a5a0 74 72 75 63 74 20 61 78 73 65 74 2a 29 62 3b 0a  truct axset*)b;.
1a5b0 20 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 70    int c;.  c = p
1a5c0 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31 2d  2->nAction - p1-
1a5d0 3e 6e 41 63 74 69 6f 6e 3b 0a 20 20 69 66 28 20  >nAction;.  if( 
1a5e0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20  c==0 ){.    c = 
1a5f0 70 32 2d 3e 69 4f 72 64 65 72 20 2d 20 70 31 2d  p2->iOrder - p1-
1a600 3e 69 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 61  >iOrder;.  }.  a
1a610 73 73 65 72 74 28 20 63 21 3d 30 20 7c 7c 20 70  ssert( c!=0 || p
1a620 31 3d 3d 70 32 20 29 3b 0a 20 20 72 65 74 75 72  1==p2 );.  retur
1a630 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  n c;.}../*.** Wr
1a640 69 74 65 20 74 65 78 74 20 6f 6e 20 22 6f 75 74  ite text on "out
1a650 22 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  " that describes
1a660 20 74 68 65 20 72 75 6c 65 20 22 72 70 22 2e 0a   the rule "rp"..
1a670 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1a680 72 69 74 65 52 75 6c 65 54 65 78 74 28 46 49 4c  riteRuleText(FIL
1a690 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 72  E *out, struct r
1a6a0 75 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e 74 20  ule *rp){.  int 
1a6b0 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  j;.  fprintf(out
1a6c0 2c 22 25 73 20 3a 3a 3d 22 2c 20 72 70 2d 3e 6c  ,"%s ::=", rp->l
1a6d0 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  hs->name);.  for
1a6e0 28 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73  (j=0; j<rp->nrhs
1a6f0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; j++){.    stru
1a700 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
1a710 72 70 2d 3e 72 68 73 5b 6a 5d 3b 0a 20 20 20 20  rp->rhs[j];.    
1a720 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73  fprintf(out," %s
1a730 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ", sp->name);.  
1a740 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
1a750 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
1a760 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  .      int k;.  
1a770 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 73      for(k=1; k<s
1a780 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29  p->nsubsym; k++)
1a790 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1a7a0 66 28 6f 75 74 2c 22 7c 25 73 22 2c 73 70 2d 3e  f(out,"|%s",sp->
1a7b0 73 75 62 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65 29  subsym[k]->name)
1a7c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a7d0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72    }.}.../* Gener
1a7e0 61 74 65 20 43 20 73 6f 75 72 63 65 20 63 6f 64  ate C source cod
1a7f0 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72  e for the parser
1a800 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 54   */.void ReportT
1a810 61 62 6c 65 28 0a 20 20 73 74 72 75 63 74 20 6c  able(.  struct l
1a820 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e  emon *lemp,.  in
1a830 74 20 6d 68 66 6c 61 67 20 20 20 20 20 2f 2a 20  t mhflag     /* 
1a840 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b 65 68 65  Output in makehe
1a850 61 64 65 72 73 20 66 6f 72 6d 61 74 20 69 66 20  aders format if 
1a860 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 46 49 4c  true */.){.  FIL
1a870 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63  E *out, *in;.  c
1a880 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a  har line[LINESIZ
1a890 45 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e  E];.  int  linen
1a8a0 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  o;.  struct stat
1a8b0 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
1a8c0 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73   action *ap;.  s
1a8d0 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
1a8e0 20 20 73 74 72 75 63 74 20 61 63 74 74 61 62 20    struct acttab 
1a8f0 2a 70 41 63 74 74 61 62 3b 0a 20 20 69 6e 74 20  *pActtab;.  int 
1a900 69 2c 20 6a 2c 20 6e 3b 0a 20 20 63 6f 6e 73 74  i, j, n;.  const
1a910 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 69   char *name;.  i
1a920 6e 74 20 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6d 78  nt mnTknOfst, mx
1a930 54 6b 6e 4f 66 73 74 3b 0a 20 20 69 6e 74 20 6d  TknOfst;.  int m
1a940 6e 4e 74 4f 66 73 74 2c 20 6d 78 4e 74 4f 66 73  nNtOfst, mxNtOfs
1a950 74 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65  t;.  struct axse
1a960 74 20 2a 61 78 3b 0a 0a 20 20 69 6e 20 3d 20 74  t *ax;..  in = t
1a970 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a  plt_open(lemp);.
1a980 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65    if( in==0 ) re
1a990 74 75 72 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 69  turn;.  out = fi
1a9a0 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 63  le_open(lemp,".c
1a9b0 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f  ","wb");.  if( o
1a9c0 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 63 6c  ut==0 ){.    fcl
1a9d0 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 72 65 74  ose(in);.    ret
1a9e0 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c 69 6e 65 6e  urn;.  }.  linen
1a9f0 6f 20 3d 20 31 3b 0a 20 20 74 70 6c 74 5f 78 66  o = 1;.  tplt_xf
1aa00 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1aa10 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1aa20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
1aa30 65 20 69 6e 63 6c 75 64 65 20 63 6f 64 65 2c 20  e include code, 
1aa40 69 66 20 61 6e 79 20 2a 2f 0a 20 20 74 70 6c 74  if any */.  tplt
1aa50 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
1aa60 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64 65 2c 26 6c  lemp->include,&l
1aa70 69 6e 65 6e 6f 29 3b 0a 20 20 69 66 28 20 6d 68  ineno);.  if( mh
1aa80 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 68 61 72  flag ){.    char
1aa90 20 2a 6e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61   *name = file_ma
1aaa0 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 22 2e 68  kename(lemp, ".h
1aab0 22 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ");.    fprintf(
1aac0 6f 75 74 2c 22 23 69 6e 63 6c 75 64 65 20 5c 22  out,"#include \"
1aad0 25 73 5c 22 5c 6e 22 2c 20 6e 61 6d 65 29 3b 20  %s\"\n", name); 
1aae0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72  lineno++;.    fr
1aaf0 65 65 28 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ee(name);.  }.  
1ab00 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1ab10 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1ab20 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1ab30 72 61 74 65 20 23 64 65 66 69 6e 65 73 20 66 6f  rate #defines fo
1ab40 72 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 2a 2f 0a  r all tokens */.
1ab50 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a    if( mhflag ){.
1ab60 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1ab70 70 72 65 66 69 78 3b 0a 20 20 20 20 66 70 72 69  prefix;.    fpri
1ab80 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54  ntf(out,"#if INT
1ab90 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65  ERFACE\n"); line
1aba0 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6c 65  no++;.    if( le
1abb0 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20  mp->tokenprefix 
1abc0 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d  ) prefix = lemp-
1abd0 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20  >tokenprefix;.  
1abe0 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
1abf0 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
1ac00 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69   = "";.    for(i
1ac10 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =1; i<lemp->nter
1ac20 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  minal; i++){.   
1ac30 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1ac40 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20  #define %s%-30s 
1ac50 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65  %2d\n",prefix,le
1ac60 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
1ac70 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 6c  name,i);.      l
1ac80 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ineno++;.    }. 
1ac90 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1aca0 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65  #endif\n"); line
1acb0 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  no++;.  }.  tplt
1acc0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1acd0 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1ace0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1acf0 20 74 68 65 20 64 65 66 69 6e 65 73 20 2a 2f 0a   the defines */.
1ad00 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1ad10 64 65 66 69 6e 65 20 59 59 43 4f 44 45 54 59 50  define YYCODETYP
1ad20 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e  E %s\n",.    min
1ad30 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30  imum_size_type(0
1ad40 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b  , lemp->nsymbol+
1ad50 31 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  1)); lineno++;. 
1ad60 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1ad70 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20 25  efine YYNOCODE %
1ad80 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  d\n",lemp->nsymb
1ad90 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  ol+1);  lineno++
1ada0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1adb0 22 23 64 65 66 69 6e 65 20 59 59 41 43 54 49 4f  "#define YYACTIO
1adc0 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20  NTYPE %s\n",.   
1add0 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79   minimum_size_ty
1ade0 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61  pe(0, lemp->nsta
1adf0 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2b 35  te+lemp->nrule+5
1ae00 29 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ));  lineno++;. 
1ae10 20 69 66 28 20 6c 65 6d 70 2d 3e 77 69 6c 64 63   if( lemp->wildc
1ae20 61 72 64 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ard ){.    fprin
1ae30 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1ae40 59 59 57 49 4c 44 43 41 52 44 20 25 64 5c 6e 22  YYWILDCARD %d\n"
1ae50 2c 0a 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 77  ,.       lemp->w
1ae60 69 6c 64 63 61 72 64 2d 3e 69 6e 64 65 78 29 3b  ildcard->index);
1ae70 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1ae80 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69   print_stack_uni
1ae90 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e  on(out,lemp,&lin
1aea0 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20 66  eno,mhflag);.  f
1aeb0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 69 66  printf(out, "#if
1aec0 6e 64 65 66 20 59 59 53 54 41 43 4b 44 45 50 54  ndef YYSTACKDEPT
1aed0 48 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  H\n"); lineno++;
1aee0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61  .  if( lemp->sta
1aef0 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20 66 70  cksize ){.    fp
1af00 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1af10 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48 20  ne YYSTACKDEPTH 
1af20 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61 63  %s\n",lemp->stac
1af30 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ksize);  lineno+
1af40 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1af50 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1af60 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54  fine YYSTACKDEPT
1af70 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65  H 100\n");  line
1af80 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69  no++;.  }.  fpri
1af90 6e 74 66 28 6f 75 74 2c 20 22 23 65 6e 64 69 66  ntf(out, "#endif
1afa0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1afb0 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a    if( mhflag ){.
1afc0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1afd0 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e  "#if INTERFACE\n
1afe0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1aff0 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d  }.  name = lemp-
1b000 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61  >name ? lemp->na
1b010 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20  me : "Parse";.  
1b020 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26 26  if( lemp->arg &&
1b030 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29 7b   lemp->arg[0] ){
1b040 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1b050 69 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  i = lemonStrlen(
1b060 6c 65 6d 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20  lemp->arg);.    
1b070 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 69  while( i>=1 && i
1b080 73 73 70 61 63 65 28 6c 65 6d 70 2d 3e 61 72 67  sspace(lemp->arg
1b090 5b 69 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20 20  [i-1]) ) i--;.  
1b0a0 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26    while( i>=1 &&
1b0b0 20 28 69 73 61 6c 6e 75 6d 28 6c 65 6d 70 2d 3e   (isalnum(lemp->
1b0c0 61 72 67 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d  arg[i-1]) || lem
1b0d0 70 2d 3e 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27  p->arg[i-1]=='_'
1b0e0 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70 72  ) ) i--;.    fpr
1b0f0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1b100 65 20 25 73 41 52 47 5f 53 44 45 43 4c 20 25 73  e %sARG_SDECL %s
1b110 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e  ;\n",name,lemp->
1b120 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  arg);  lineno++;
1b130 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1b140 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1b150 50 44 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d  PDECL ,%s\n",nam
1b160 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c  e,lemp->arg);  l
1b170 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
1b180 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1b190 65 20 25 73 41 52 47 5f 46 45 54 43 48 20 25 73  e %sARG_FETCH %s
1b1a0 20 3d 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73   = yypParser->%s
1b1b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1b1c0 20 20 20 20 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d        name,lemp-
1b1d0 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b  >arg,&lemp->arg[
1b1e0 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i]);  lineno++;.
1b1f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b200 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53  "#define %sARG_S
1b210 54 4f 52 45 20 79 79 70 50 61 72 73 65 72 2d 3e  TORE yypParser->
1b220 25 73 20 3d 20 25 73 5c 6e 22 2c 0a 20 20 20 20  %s = %s\n",.    
1b230 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d               nam
1b240 65 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c  e,&lemp->arg[i],
1b250 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20  &lemp->arg[i]); 
1b260 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c   lineno++;.  }el
1b270 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
1b280 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1b290 52 47 5f 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65  RG_SDECL\n",name
1b2a0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1b2b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1b2c0 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45  define %sARG_PDE
1b2d0 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69  CL\n",name);  li
1b2e0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1b2f0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1b300 20 25 73 41 52 47 5f 46 45 54 43 48 5c 6e 22 2c   %sARG_FETCH\n",
1b310 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
1b320 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1b330 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1b340 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20  STORE\n",name); 
1b350 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1b360 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20  if( mhflag ){.  
1b370 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1b380 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e  endif\n"); linen
1b390 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  o++;.  }.  fprin
1b3a0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1b3b0 59 59 4e 53 54 41 54 45 20 25 64 5c 6e 22 2c 6c  YYNSTATE %d\n",l
1b3c0 65 6d 70 2d 3e 6e 73 74 61 74 65 29 3b 20 20 6c  emp->nstate);  l
1b3d0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1b3e0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1b3f0 59 59 4e 52 55 4c 45 20 25 64 5c 6e 22 2c 6c 65  YYNRULE %d\n",le
1b400 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e  mp->nrule);  lin
1b410 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d  eno++;.  if( lem
1b420 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e  p->errsym->useCn
1b430 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  t ){.    fprintf
1b440 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1b450 45 52 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c 6e  ERRORSYMBOL %d\n
1b460 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e  ",lemp->errsym->
1b470 69 6e 64 65 78 29 3b 20 20 6c 69 6e 65 6e 6f 2b  index);  lineno+
1b480 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
1b490 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52  ut,"#define YYER
1b4a0 52 53 59 4d 44 54 20 79 79 25 64 5c 6e 22 2c 6c  RSYMDT yy%d\n",l
1b4b0 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e  emp->errsym->dtn
1b4c0 75 6d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  um);  lineno++;.
1b4d0 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e    }.  if( lemp->
1b4e0 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a  has_fallback ){.
1b4f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b500 22 23 64 65 66 69 6e 65 20 59 59 46 41 4c 4c 42  "#define YYFALLB
1b510 41 43 4b 20 31 5c 6e 22 29 3b 20 20 6c 69 6e 65  ACK 1\n");  line
1b520 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  no++;.  }.  tplt
1b530 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1b540 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1b550 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1b560 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
1b570 65 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63 69  e and its associ
1b580 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ates:.  **.  ** 
1b590 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20 20 20   yy_action[]    
1b5a0 20 20 20 20 41 20 73 69 6e 67 6c 65 20 74 61 62      A single tab
1b5b0 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c  le containing al
1b5c0 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20  l actions..  ** 
1b5d0 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20   yy_lookahead[] 
1b5e0 20 20 20 20 41 20 74 61 62 6c 65 20 63 6f 6e 74      A table cont
1b5f0 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 6b 61  aining the looka
1b600 68 65 61 64 20 66 6f 72 20 65 61 63 68 20 65 6e  head for each en
1b610 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20 20 20 20  try in.  **     
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b630 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73 65 64  yy_action.  Used
1b640 20 74 6f 20 64 65 74 65 63 74 20 68 61 73 68 20   to detect hash 
1b650 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2a  collisions..  **
1b660 20 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b    yy_shift_ofst[
1b670 5d 20 20 20 20 46 6f 72 20 65 61 63 68 20 73 74  ]    For each st
1b680 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74 20  ate, the offset 
1b690 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66  into yy_action f
1b6a0 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  or.  **         
1b6b0 20 20 20 20 20 20 20 20 20 20 20 20 73 68 69 66              shif
1b6c0 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c 73 2e 0a  ting terminals..
1b6d0 20 20 2a 2a 20 20 79 79 5f 72 65 64 75 63 65 5f    **  yy_reduce_
1b6e0 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20 65 61 63  ofst[]   For eac
1b6f0 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66  h state, the off
1b700 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69  set into yy_acti
1b710 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20  on for.  **     
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b730 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d 74 65 72  shifting non-ter
1b740 6d 69 6e 61 6c 73 20 61 66 74 65 72 20 61 20 72  minals after a r
1b750 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20 79 79 5f  educe..  **  yy_
1b760 64 65 66 61 75 6c 74 5b 5d 20 20 20 20 20 20 20  default[]       
1b770 44 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 66  Default action f
1b780 6f 72 20 65 61 63 68 20 73 74 61 74 65 2e 0a 20  or each state.. 
1b790 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74   */..  /* Comput
1b7a0 65 20 74 68 65 20 61 63 74 69 6f 6e 73 20 6f 6e  e the actions on
1b7b0 20 61 6c 6c 20 73 74 61 74 65 73 20 61 6e 64 20   all states and 
1b7c0 63 6f 75 6e 74 20 74 68 65 6d 20 75 70 20 2a 2f  count them up */
1b7d0 0a 20 20 61 78 20 3d 20 28 73 74 72 75 63 74 20  .  ax = (struct 
1b7e0 61 78 73 65 74 20 2a 29 20 63 61 6c 6c 6f 63 28  axset *) calloc(
1b7f0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20  lemp->nstate*2, 
1b800 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 29 3b 0a  sizeof(ax[0]));.
1b810 20 20 69 66 28 20 61 78 3d 3d 30 20 29 7b 0a 20    if( ax==0 ){. 
1b820 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1b830 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  r,"malloc failed
1b840 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
1b850 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1b860 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
1b870 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
1b880 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
1b890 5d 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 73  ];.    ax[i*2].s
1b8a0 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78  tp = stp;.    ax
1b8b0 5b 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d 20 31 3b  [i*2].isTkn = 1;
1b8c0 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 6e 41 63  .    ax[i*2].nAc
1b8d0 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 54 6b 6e  tion = stp->nTkn
1b8e0 41 63 74 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b  Act;.    ax[i*2+
1b8f0 31 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20  1].stp = stp;.  
1b900 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 69 73 54 6b    ax[i*2+1].isTk
1b910 6e 20 3d 20 30 3b 0a 20 20 20 20 61 78 5b 69 2a  n = 0;.    ax[i*
1b920 32 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73  2+1].nAction = s
1b930 74 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 7d 0a  tp->nNtAct;.  }.
1b940 20 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 6d 6e    mxTknOfst = mn
1b950 54 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a 20 20 6d  TknOfst = 0;.  m
1b960 78 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66  xNtOfst = mnNtOf
1b970 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  st = 0;..  /* Co
1b980 6d 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e  mpute the action
1b990 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 72 64 65   table.  In orde
1b9a0 72 20 74 6f 20 74 72 79 20 74 6f 20 6b 65 65 70  r to try to keep
1b9b0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1b9c0 0a 20 20 2a 2a 20 61 63 74 69 6f 6e 20 74 61 62  .  ** action tab
1b9d0 6c 65 20 74 6f 20 61 20 6d 69 6e 69 6d 75 6d 2c  le to a minimum,
1b9e0 20 74 68 65 20 68 65 75 72 69 73 74 69 63 20 6f   the heuristic o
1b9f0 66 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6c 61  f placing the la
1ba00 72 67 65 73 74 20 61 63 74 69 6f 6e 0a 20 20 2a  rgest action.  *
1ba10 2a 20 73 65 74 73 20 66 69 72 73 74 20 69 73 20  * sets first is 
1ba20 75 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  used..  */.  for
1ba30 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1ba40 74 61 74 65 2a 32 3b 20 69 2b 2b 29 20 61 78 5b  tate*2; i++) ax[
1ba50 69 5d 2e 69 4f 72 64 65 72 20 3d 20 69 3b 0a 20  i].iOrder = i;. 
1ba60 20 71 73 6f 72 74 28 61 78 2c 20 6c 65 6d 70 2d   qsort(ax, lemp-
1ba70 3e 6e 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f  >nstate*2, sizeo
1ba80 66 28 61 78 5b 30 5d 29 2c 20 61 78 73 65 74 5f  f(ax[0]), axset_
1ba90 63 6f 6d 70 61 72 65 29 3b 0a 20 20 70 41 63 74  compare);.  pAct
1baa0 74 61 62 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c  tab = acttab_all
1bab0 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  oc();.  for(i=0;
1bac0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a   i<lemp->nstate*
1bad0 32 20 26 26 20 61 78 5b 69 5d 2e 6e 41 63 74 69  2 && ax[i].nActi
1bae0 6f 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  on>0; i++){.    
1baf0 73 74 70 20 3d 20 61 78 5b 69 5d 2e 73 74 70 3b  stp = ax[i].stp;
1bb00 0a 20 20 20 20 69 66 28 20 61 78 5b 69 5d 2e 69  .    if( ax[i].i
1bb10 73 54 6b 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f  sTkn ){.      fo
1bb20 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1bb30 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1bb40 20 20 20 20 20 20 20 20 69 6e 74 20 61 63 74 69          int acti
1bb50 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  on;.        if( 
1bb60 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c  ap->sp->index>=l
1bb70 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29  emp->nterminal )
1bb80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1bb90 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70     action = comp
1bba0 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c  ute_action(lemp,
1bbb0 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66   ap);.        if
1bbc0 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e  ( action<0 ) con
1bbd0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
1bbe0 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63  cttab_action(pAc
1bbf0 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e  ttab, ap->sp->in
1bc00 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20  dex, action);.  
1bc10 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d      }.      stp-
1bc20 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 61 63 74 74  >iTknOfst = actt
1bc30 61 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61  ab_insert(pActta
1bc40 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  b);.      if( st
1bc50 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b  p->iTknOfst<mnTk
1bc60 6e 4f 66 73 74 20 29 20 6d 6e 54 6b 6e 4f 66 73  nOfst ) mnTknOfs
1bc70 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73  t = stp->iTknOfs
1bc80 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  t;.      if( stp
1bc90 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78 54 6b 6e  ->iTknOfst>mxTkn
1bca0 4f 66 73 74 20 29 20 6d 78 54 6b 6e 4f 66 73 74  Ofst ) mxTknOfst
1bcb0 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74   = stp->iTknOfst
1bcc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bcd0 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
1bce0 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
1bcf0 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  xt){.        int
1bd00 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20   action;.       
1bd10 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
1bd20 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  ex<lemp->ntermin
1bd30 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  al ) continue;. 
1bd40 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73         if( ap->s
1bd50 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e  p->index==lemp->
1bd60 6e 73 79 6d 62 6f 6c 20 29 20 63 6f 6e 74 69 6e  nsymbol ) contin
1bd70 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69  ue;.        acti
1bd80 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74  on = compute_act
1bd90 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20  ion(lemp, ap);. 
1bda0 20 20 20 20 20 20 20 69 66 28 20 61 63 74 69 6f         if( actio
1bdb0 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  n<0 ) continue;.
1bdc0 20 20 20 20 20 20 20 20 61 63 74 74 61 62 5f 61          acttab_a
1bdd0 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61  ction(pActtab, a
1bde0 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63  p->sp->index, ac
1bdf0 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tion);.      }. 
1be00 20 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73       stp->iNtOfs
1be10 74 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72  t = acttab_inser
1be20 74 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20  t(pActtab);.    
1be30 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66    if( stp->iNtOf
1be40 73 74 3c 6d 6e 4e 74 4f 66 73 74 20 29 20 6d 6e  st<mnNtOfst ) mn
1be50 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e  NtOfst = stp->iN
1be60 74 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28  tOfst;.      if(
1be70 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3e 6d 78   stp->iNtOfst>mx
1be80 4e 74 4f 66 73 74 20 29 20 6d 78 4e 74 4f 66 73  NtOfst ) mxNtOfs
1be90 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  t = stp->iNtOfst
1bea0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 72  ;.    }.  }.  fr
1beb0 65 65 28 61 78 29 3b 0a 0a 20 20 2f 2a 20 4f 75  ee(ax);..  /* Ou
1bec0 74 70 75 74 20 74 68 65 20 79 79 5f 61 63 74 69  tput the yy_acti
1bed0 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6e 20  on table */.  n 
1bee0 3d 20 61 63 74 74 61 62 5f 73 69 7a 65 28 70 41  = acttab_size(pA
1bef0 63 74 74 61 62 29 3b 0a 20 20 66 70 72 69 6e 74  cttab);.  fprint
1bf00 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1bf10 59 5f 41 43 54 54 41 42 5f 43 4f 55 4e 54 20 28  Y_ACTTAB_COUNT (
1bf20 25 64 29 5c 6e 22 2c 20 6e 29 3b 20 6c 69 6e 65  %d)\n", n); line
1bf30 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1bf40 6f 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73  out,"static cons
1bf50 74 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79  t YYACTIONTYPE y
1bf60 79 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e  y_action[] = {\n
1bf70 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1bf80 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1bf90 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 63  i++){.    int ac
1bfa0 74 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79 79  tion = acttab_yy
1bfb0 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20  action(pActtab, 
1bfc0 69 29 3b 0a 20 20 20 20 69 66 28 20 61 63 74 69  i);.    if( acti
1bfd0 6f 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d 20  on<0 ) action = 
1bfe0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c  lemp->nstate + l
1bff0 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b 0a  emp->nrule + 2;.
1c000 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
1c010 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
1c020 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
1c030 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1c040 20 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b   %4d,", action);
1c050 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
1c060 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
1c070 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
1c080 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1c090 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
1c0a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
1c0b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
1c0c0 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
1c0d0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
1c0e0 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79   /* Output the y
1c0f0 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c  y_lookahead tabl
1c100 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  e */.  fprintf(o
1c110 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74  ut,"static const
1c120 20 59 59 43 4f 44 45 54 59 50 45 20 79 79 5f 6c   YYCODETYPE yy_l
1c130 6f 6f 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e  ookahead[] = {\n
1c140 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1c150 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1c160 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61  i++){.    int la
1c170 20 3d 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b   = acttab_yylook
1c180 61 68 65 61 64 28 70 41 63 74 74 61 62 2c 20 69  ahead(pActtab, i
1c190 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 3c 30 20  );.    if( la<0 
1c1a0 29 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79  ) la = lemp->nsy
1c1b0 6d 62 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d  mbol;.    if( j=
1c1c0 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
1c1d0 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
1c1e0 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
1c1f0 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61  out, " %4d,", la
1c200 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
1c210 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
1c220 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1c230 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1c240 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
1c250 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
1c260 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1c270 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
1c280 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1c290 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
1c2a0 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d   yy_shift_ofst[]
1c2b0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69   table */.  fpri
1c2c0 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1c2d0 65 20 59 59 5f 53 48 49 46 54 5f 55 53 45 5f 44  e YY_SHIFT_USE_D
1c2e0 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54  FLT (%d)\n", mnT
1c2f0 6b 6e 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e  knOfst-1); linen
1c300 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d  o++;.  n = lemp-
1c310 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65  >nstate;.  while
1c320 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73  ( n>0 && lemp->s
1c330 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e  orted[n-1]->iTkn
1c340 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  Ofst==NO_OFFSET 
1c350 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66  ) n--;.  fprintf
1c360 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
1c370 59 5f 53 48 49 46 54 5f 43 4f 55 4e 54 20 28 25  Y_SHIFT_COUNT (%
1c380 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e  d)\n", n-1); lin
1c390 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1c3a0 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
1c3b0 59 5f 53 48 49 46 54 5f 4d 49 4e 20 20 20 28 25  Y_SHIFT_MIN   (%
1c3c0 64 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74  d)\n", mnTknOfst
1c3d0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1c3e0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65  printf(out, "#de
1c3f0 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 41  fine YY_SHIFT_MA
1c400 58 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 78 54  X   (%d)\n", mxT
1c410 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b  knOfst); lineno+
1c420 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1c430 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20  , "static const 
1c440 25 73 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74  %s yy_shift_ofst
1c450 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20  [] = {\n", .    
1c460 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69        minimum_si
1c470 7a 65 5f 74 79 70 65 28 6d 6e 54 6b 6e 4f 66 73  ze_type(mnTknOfs
1c480 74 2d 31 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 29  t-1, mxTknOfst))
1c490 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
1c4a0 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
1c4b0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74  +){.    int ofst
1c4c0 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  ;.    stp = lemp
1c4d0 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
1c4e0 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b   ofst = stp->iTk
1c4f0 6e 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f  nOfst;.    if( o
1c500 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
1c510 20 6f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73   ofst = mnTknOfs
1c520 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a  t - 1;.    if( j
1c530 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75  ==0 ) fprintf(ou
1c540 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c  t," /* %5d */ ",
1c550 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   i);.    fprintf
1c560 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f  (out, " %4d,", o
1c570 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  fst);.    if( j=
1c580 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
1c590 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1c5a0 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
1c5b0 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
1c5c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c5d0 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1c5e0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1c5f0 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
1c600 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  +;..  /* Output 
1c610 74 68 65 20 79 79 5f 72 65 64 75 63 65 5f 6f 66  the yy_reduce_of
1c620 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20  st[] table */.  
1c630 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
1c640 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f  efine YY_REDUCE_
1c650 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22  USE_DFLT (%d)\n"
1c660 2c 20 6d 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c  , mnNtOfst-1); l
1c670 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c  ineno++;.  n = l
1c680 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77  emp->nstate;.  w
1c690 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d  hile( n>0 && lem
1c6a0 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e  p->sorted[n-1]->
1c6b0 69 4e 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53  iNtOfst==NO_OFFS
1c6c0 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69  ET ) n--;.  fpri
1c6d0 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1c6e0 65 20 59 59 5f 52 45 44 55 43 45 5f 43 4f 55 4e  e YY_REDUCE_COUN
1c6f0 54 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b  T (%d)\n", n-1);
1c700 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1c710 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
1c720 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 49 4e  ne YY_REDUCE_MIN
1c730 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74     (%d)\n", mnNt
1c740 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  Ofst); lineno++;
1c750 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1c760 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55  "#define YY_REDU
1c770 43 45 5f 4d 41 58 20 20 20 28 25 64 29 5c 6e 22  CE_MAX   (%d)\n"
1c780 2c 20 6d 78 4e 74 4f 66 73 74 29 3b 20 6c 69 6e  , mxNtOfst); lin
1c790 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1c7a0 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f  (out, "static co
1c7b0 6e 73 74 20 25 73 20 79 79 5f 72 65 64 75 63 65  nst %s yy_reduce
1c7c0 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20  _ofst[] = {\n", 
1c7d0 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d  .          minim
1c7e0 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e  um_size_type(mnN
1c7f0 74 4f 66 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73  tOfst-1, mxNtOfs
1c800 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  t)); lineno++;. 
1c810 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
1c820 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f   i++){.    int o
1c830 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c  fst;.    stp = l
1c840 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
1c850 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e      ofst = stp->
1c860 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 69 66 28  iNtOfst;.    if(
1c870 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54   ofst==NO_OFFSET
1c880 20 29 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66   ) ofst = mnNtOf
1c890 73 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20  st - 1;.    if( 
1c8a0 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
1c8b0 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
1c8c0 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
1c8d0 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
1c8e0 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a  ofst);.    if( j
1c8f0 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b  ==9 || i==n-1 ){
1c900 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1c910 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ut, "\n"); linen
1c920 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  o++;.      j = 0
1c930 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c940 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
1c950 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1c960 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   "};\n"); lineno
1c970 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  ++;..  /* Output
1c980 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 63 74   the default act
1c990 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ion table */.  f
1c9a0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61  printf(out, "sta
1c9b0 74 69 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49  tic const YYACTI
1c9c0 4f 4e 54 59 50 45 20 79 79 5f 64 65 66 61 75 6c  ONTYPE yy_defaul
1c9d0 74 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e  t[] = {\n"); lin
1c9e0 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d  eno++;.  n = lem
1c9f0 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 66 6f 72  p->nstate;.  for
1ca00 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
1ca10 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
1ca20 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
1ca30 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
1ca40 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
1ca50 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
1ca60 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
1ca70 34 64 2c 22 2c 20 73 74 70 2d 3e 69 44 66 6c 74  4d,", stp->iDflt
1ca80 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
1ca90 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
1caa0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1cab0 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1cac0 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
1cad0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
1cae0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1caf0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
1cb00 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1cb10 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1cb20 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1cb30 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1cb40 6e 65 72 61 74 65 20 74 68 65 20 74 61 62 6c 65  nerate the table
1cb50 20 6f 66 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b   of fallback tok
1cb60 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ens..  */.  if( 
1cb70 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61  lemp->has_fallba
1cb80 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 78  ck ){.    int mx
1cb90 20 3d 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   = lemp->ntermin
1cba0 61 6c 20 2d 20 31 3b 0a 20 20 20 20 77 68 69 6c  al - 1;.    whil
1cbb0 65 28 20 6d 78 3e 30 20 26 26 20 6c 65 6d 70 2d  e( mx>0 && lemp-
1cbc0 3e 73 79 6d 62 6f 6c 73 5b 6d 78 5d 2d 3e 66 61  >symbols[mx]->fa
1cbd0 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 20 6d 78 2d  llback==0 ){ mx-
1cbe0 2d 3b 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30  -; }.    for(i=0
1cbf0 3b 20 69 3c 3d 6d 78 3b 20 69 2b 2b 29 7b 0a 20  ; i<=mx; i++){. 
1cc00 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
1cc10 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  ol *p = lemp->sy
1cc20 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20  mbols[i];.      
1cc30 69 66 28 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d  if( p->fallback=
1cc40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  =0 ){.        fp
1cc50 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20  rintf(out, "    
1cc60 30 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e  0,  /* %10s => n
1cc70 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d  othing */\n", p-
1cc80 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  >name);.      }e
1cc90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72  lse{.        fpr
1cca0 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 25 33 64  intf(out, "  %3d
1ccb0 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73  ,  /* %10s => %s
1ccc0 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62   */\n", p->fallb
1ccd0 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20  ack->index,.    
1cce0 20 20 20 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70        p->name, p
1ccf0 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65  ->fallback->name
1cd00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1cd10 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
1cd20 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1cd30 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c  (lemp->name, in,
1cd40 20 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a   out, &lineno);.
1cd50 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1cd60 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1cd70 67 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e  g the symbolic n
1cd80 61 6d 65 20 6f 66 20 65 76 65 72 79 20 73 79 6d  ame of every sym
1cd90 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  bol.  */.  for(i
1cda0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
1cdb0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bol; i++){.    s
1cdc0 70 72 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25  printf(line,"\"%
1cdd0 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62  s\",",lemp->symb
1cde0 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  ols[i]->name);. 
1cdf0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1ce00 20 20 25 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a    %-15s",line);.
1ce10 20 20 20 20 69 66 28 20 28 69 26 33 29 3d 3d 33      if( (i&3)==3
1ce20 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   ){ fprintf(out,
1ce30 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1ce40 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 26   }.  }.  if( (i&
1ce50 33 29 21 3d 30 20 29 7b 20 66 70 72 69 6e 74 66  3)!=0 ){ fprintf
1ce60 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65  (out,"\n"); line
1ce70 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78  no++; }.  tplt_x
1ce80 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1ce90 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1cea0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1ceb0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1cec0 67 20 61 20 74 65 78 74 20 73 74 72 69 6e 67 20  g a text string 
1ced0 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 65  that describes e
1cee0 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69  very.  ** rule i
1cef0 6e 20 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f  n the rule set o
1cf00 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20  f the grammar.  
1cf10 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
1cf20 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68   is used.  ** wh
1cf30 65 6e 20 74 72 61 63 69 6e 67 20 52 45 44 55 43  en tracing REDUC
1cf40 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  E actions..  */.
1cf50 20 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65    for(i=0, rp=le
1cf60 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
1cf70 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b  =rp->next, i++){
1cf80 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d  .    assert( rp-
1cf90 3e 69 6e 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20  >index==i );.   
1cfa0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
1cfb0 2a 20 25 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29  * %3d */ \"", i)
1cfc0 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54  ;.    writeRuleT
1cfd0 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20  ext(out, rp);.  
1cfe0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c    fprintf(out,"\
1cff0 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ",\n"); lineno++
1d000 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
1d010 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1d020 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1d030 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1d040 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1d050 20 65 76 65 72 79 20 74 69 6d 65 20 61 20 73 79   every time a sy
1d060 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66  mbol is popped f
1d070 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  rom.  ** the sta
1d080 63 6b 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  ck while process
1d090 69 6e 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68  ing errors or wh
1d0a0 69 6c 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74  ile destroying t
1d0b0 68 65 20 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a  he parser. .  **
1d0c0 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
1d0d0 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 25  , generate the %
1d0e0 64 65 73 74 72 75 63 74 6f 72 20 61 63 74 69 6f  destructor actio
1d0f0 6e 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ns).  */.  if( l
1d100 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29  emp->tokendest )
1d110 7b 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d  {.    int once =
1d120 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   1;.    for(i=0;
1d130 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1d140 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
1d150 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
1d160 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
1d170 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70  i];.      if( sp
1d180 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21  ==0 || sp->type!
1d190 3d 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74  =TERMINAL ) cont
1d1a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
1d1b0 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  once ){.        
1d1c0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20  fprintf(out, "  
1d1d0 20 20 20 20 2f 2a 20 54 45 52 4d 49 4e 41 4c 20      /* TERMINAL 
1d1e0 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22  Destructor */\n"
1d1f0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1d200 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
1d210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
1d220 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61  intf(out,"    ca
1d230 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c  se %d: /* %s */\
1d240 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73  n", sp->index, s
1d250 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  p->name); lineno
1d260 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ++;.    }.    fo
1d270 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1d280 73 79 6d 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e  symbol && lemp->
1d290 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65  symbols[i]->type
1d2a0 21 3d 54 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29  !=TERMINAL; i++)
1d2b0 3b 0a 20 20 20 20 69 66 28 20 69 3c 6c 65 6d 70  ;.    if( i<lemp
1d2c0 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20  ->nsymbol ){.   
1d2d0 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74     emit_destruct
1d2e0 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70  or_code(out,lemp
1d2f0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d  ->symbols[i],lem
1d300 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  p,&lineno);.    
1d310 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1d320 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b       break;\n");
1d330 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
1d340 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d  .  }.  if( lemp-
1d350 3e 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20  >vardest ){.    
1d360 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
1d370 66 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20  flt_sp = 0;.    
1d380 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20  int once = 1;.  
1d390 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1d3a0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
1d3b0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
1d3c0 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
1d3d0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
1d3e0 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c      if( sp==0 ||
1d3f0 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   sp->type==TERMI
1d400 4e 41 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  NAL ||.         
1d410 20 73 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c   sp->index<=0 ||
1d420 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21   sp->destructor!
1d430 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1d440 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29 7b       if( once ){
1d450 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1d460 28 6f 75 74 2c 20 22 20 20 20 20 20 20 2f 2a 20  (out, "      /* 
1d470 44 65 66 61 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d  Default NON-TERM
1d480 49 4e 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20  INAL Destructor 
1d490 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  */\n"); lineno++
1d4a0 3b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d  ;.        once =
1d4b0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1d4c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1d4d0 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25     case %d: /* %
1d4e0 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64  s */\n", sp->ind
1d4f0 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c  ex, sp->name); l
1d500 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64  ineno++;.      d
1d510 66 6c 74 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20  flt_sp = sp;.   
1d520 20 7d 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5f   }.    if( dflt_
1d530 73 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 65  sp!=0 ){.      e
1d540 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  mit_destructor_c
1d550 6f 64 65 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c  ode(out,dflt_sp,
1d560 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lemp,&lineno);. 
1d570 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
1d580 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61  (out,"      brea
1d590 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  k;\n"); lineno++
1d5a0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1d5b0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1d5c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
1d5d0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
1d5e0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1d5f0 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20  ;.    if( sp==0 
1d600 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52  || sp->type==TER
1d610 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73  MINAL || sp->des
1d620 74 72 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e  tructor==0 ) con
1d630 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e  tinue;.    fprin
1d640 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65  tf(out,"    case
1d650 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22   %d: /* %s */\n"
1d660 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d  , sp->index, sp-
1d670 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >name); lineno++
1d680 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e  ;..    /* Combin
1d690 65 20 64 75 70 6c 69 63 61 74 65 20 64 65 73 74  e duplicate dest
1d6a0 72 75 63 74 6f 72 73 20 69 6e 74 6f 20 61 20 73  ructors into a s
1d6b0 69 6e 67 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20  ingle case */.  
1d6c0 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c    for(j=i+1; j<l
1d6d0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b  emp->nsymbol; j+
1d6e0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1d6f0 20 73 79 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c   symbol *sp2 = l
1d700 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b  emp->symbols[j];
1d710 0a 20 20 20 20 20 20 69 66 28 20 73 70 32 20 26  .      if( sp2 &
1d720 26 20 73 70 32 2d 3e 74 79 70 65 21 3d 54 45 52  & sp2->type!=TER
1d730 4d 49 4e 41 4c 20 26 26 20 73 70 32 2d 3e 64 65  MINAL && sp2->de
1d740 73 74 72 75 63 74 6f 72 0a 20 20 20 20 20 20 20  structor.       
1d750 20 20 20 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d     && sp2->dtnum
1d760 3d 3d 73 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20  ==sp->dtnum.    
1d770 20 20 20 20 20 20 26 26 20 73 74 72 63 6d 70 28        && strcmp(
1d780 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 2c 73  sp->destructor,s
1d790 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 29 3d  p2->destructor)=
1d7a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 66  =0 ){.         f
1d7b0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1d7c0 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a  case %d: /* %s *
1d7d0 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  /\n",.          
1d7e0 20 20 20 20 20 20 20 73 70 32 2d 3e 69 6e 64 65         sp2->inde
1d7f0 78 2c 20 73 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c  x, sp2->name); l
1d800 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
1d810 20 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f    sp2->destructo
1d820 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  r = 0;.      }. 
1d830 20 20 20 7d 0a 0a 20 20 20 20 65 6d 69 74 5f 64     }..    emit_d
1d840 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f  estructor_code(o
1d850 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ut,lemp->symbols
1d860 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f  [i],lemp,&lineno
1d870 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1d880 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b  ut,"      break;
1d890 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1d8a0 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1d8b0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1d8c0 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1d8d0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1d8e0 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
1d8f0 68 65 6e 65 76 65 72 20 74 68 65 20 70 61 72 73  henever the pars
1d900 65 72 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f  er stack overflo
1d910 77 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ws */.  tplt_pri
1d920 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1d930 2d 3e 6f 76 65 72 66 6c 6f 77 2c 26 6c 69 6e 65  ->overflow,&line
1d940 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  no);.  tplt_xfer
1d950 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1d960 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1d970 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
1d980 74 61 62 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e  table of rule in
1d990 66 6f 72 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a  formation .  **.
1d9a0 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20    ** Note: This 
1d9b0 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
1d9c0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 72 75  the fact that ru
1d9d0 6c 65 73 20 61 72 65 20 6e 75 6d 62 65 72 0a 20  les are number. 
1d9e0 20 2a 2a 20 73 65 71 75 65 6e 74 75 61 6c 6c 79   ** sequentually
1d9f0 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
1da00 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70  0..  */.  for(rp
1da10 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
1da20 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
1da30 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1da40 20 20 7b 20 25 64 2c 20 25 64 20 7d 2c 5c 6e 22    { %d, %d },\n"
1da50 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c  ,rp->lhs->index,
1da60 72 70 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e 65 6e  rp->nrhs); linen
1da70 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
1da80 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1da90 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1daa0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1dab0 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
1dac0 74 69 6f 6e 20 64 75 72 69 6e 67 20 65 61 63 68  tion during each
1dad0 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 2a   REDUCE action *
1dae0 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  /.  for(rp=lemp-
1daf0 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1db00 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 74 72 61  ->next){.    tra
1db10 6e 73 6c 61 74 65 5f 63 6f 64 65 28 6c 65 6d 70  nslate_code(lemp
1db20 2c 20 72 70 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  , rp);.  }.  /* 
1db30 46 69 72 73 74 20 6f 75 74 70 75 74 20 72 75 6c  First output rul
1db40 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  es other than th
1db50 65 20 64 65 66 61 75 6c 74 3a 20 72 75 6c 65 20  e default: rule 
1db60 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
1db70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
1db80 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 73 74  p->next){.    st
1db90 72 75 63 74 20 72 75 6c 65 20 2a 72 70 32 3b 20  ruct rule *rp2; 
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dbb0 20 4f 74 68 65 72 20 72 75 6c 65 73 20 77 69 74   Other rules wit
1dbc0 68 20 74 68 65 20 73 61 6d 65 20 61 63 74 69 6f  h the same actio
1dbd0 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 70 2d  n */.    if( rp-
1dbe0 3e 63 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69  >code==0 ) conti
1dbf0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 72 70 2d  nue;.    if( rp-
1dc00 3e 63 6f 64 65 5b 30 5d 3d 3d 27 5c 6e 27 20 26  >code[0]=='\n' &
1dc10 26 20 72 70 2d 3e 63 6f 64 65 5b 31 5d 3d 3d 30  & rp->code[1]==0
1dc20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20   ) continue; /* 
1dc30 57 69 6c 6c 20 62 65 20 64 65 66 61 75 6c 74 3a  Will be default:
1dc40 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28   */.    fprintf(
1dc50 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73 65 20  out,"      case 
1dc60 25 64 3a 20 2f 2a 20 22 2c 20 72 70 2d 3e 69 6e  %d: /* ", rp->in
1dc70 64 65 78 29 3b 0a 20 20 20 20 77 72 69 74 65 52  dex);.    writeR
1dc80 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29  uleText(out, rp)
1dc90 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1dca0 74 2c 20 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e  t, " */\n"); lin
1dcb0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 72  eno++;.    for(r
1dcc0 70 32 3d 72 70 2d 3e 6e 65 78 74 3b 20 72 70 32  p2=rp->next; rp2
1dcd0 3b 20 72 70 32 3d 72 70 32 2d 3e 6e 65 78 74 29  ; rp2=rp2->next)
1dce0 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70 32 2d  {.      if( rp2-
1dcf0 3e 63 6f 64 65 3d 3d 72 70 2d 3e 63 6f 64 65 20  >code==rp->code 
1dd00 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1dd10 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61  tf(out,"      ca
1dd20 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70 32  se %d: /* ", rp2
1dd30 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
1dd40 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28    writeRuleText(
1dd50 6f 75 74 2c 20 72 70 32 29 3b 0a 20 20 20 20 20  out, rp2);.     
1dd60 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1dd70 20 2a 2f 20 79 79 74 65 73 74 63 61 73 65 28 79   */ yytestcase(y
1dd80 79 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22  yruleno==%d);\n"
1dd90 2c 20 72 70 32 2d 3e 69 6e 64 65 78 29 3b 20 6c  , rp2->index); l
1dda0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
1ddb0 20 72 70 32 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a   rp2->code = 0;.
1ddc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ddd0 20 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c    emit_code(out,
1dde0 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  rp,lemp,&lineno)
1ddf0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1de00 74 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b  t,"        break
1de10 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1de20 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20  .    rp->code = 
1de30 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 6e 61  0;.  }.  /* Fina
1de40 6c 6c 79 2c 20 6f 75 74 70 75 74 20 74 68 65 20  lly, output the 
1de50 64 65 66 61 75 6c 74 3a 20 72 75 6c 65 2e 20 20  default: rule.  
1de60 57 65 20 63 68 6f 6f 73 65 20 61 73 20 74 68 65  We choose as the
1de70 20 64 65 66 61 75 6c 74 3a 20 61 6c 6c 0a 20 20   default: all.  
1de80 2a 2a 20 65 6d 70 74 79 20 61 63 74 69 6f 6e 73  ** empty actions
1de90 2e 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  . */.  fprintf(o
1dea0 75 74 2c 22 20 20 20 20 20 20 64 65 66 61 75 6c  ut,"      defaul
1deb0 74 3a 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  t:\n"); lineno++
1dec0 3b 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  ;.  for(rp=lemp-
1ded0 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1dee0 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  ->next){.    if(
1def0 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 20 63   rp->code==0 ) c
1df00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
1df10 65 72 74 28 20 72 70 2d 3e 63 6f 64 65 5b 30 5d  ert( rp->code[0]
1df20 3d 3d 27 5c 6e 27 20 26 26 20 72 70 2d 3e 63 6f  =='\n' && rp->co
1df30 64 65 5b 31 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  de[1]==0 );.    
1df40 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1df50 20 20 20 2f 2a 20 28 25 64 29 20 22 2c 20 72 70     /* (%d) ", rp
1df60 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 77 72  ->index);.    wr
1df70 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c  iteRuleText(out,
1df80 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74   rp);.    fprint
1df90 66 28 6f 75 74 2c 20 22 20 2a 2f 20 79 79 74 65  f(out, " */ yyte
1dfa0 73 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d  stcase(yyruleno=
1dfb0 3d 25 64 29 3b 5c 6e 22 2c 20 72 70 2d 3e 69 6e  =%d);\n", rp->in
1dfc0 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
1dfd0 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
1dfe0 74 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b  t,"        break
1dff0 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1e000 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1e010 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1e020 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1e030 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
1e040 63 68 20 65 78 65 63 75 74 65 73 20 69 66 20 61  ch executes if a
1e050 20 70 61 72 73 65 20 66 61 69 6c 73 20 2a 2f 0a   parse fails */.
1e060 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
1e070 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c  ,lemp,lemp->fail
1e080 75 72 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  ure,&lineno);.  
1e090 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1e0a0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1e0b0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1e0c0 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
1e0d0 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 61 20  executes when a 
1e0e0 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6f 63 63  syntax error occ
1e0f0 75 72 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  urs */.  tplt_pr
1e100 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
1e110 70 2d 3e 65 72 72 6f 72 2c 26 6c 69 6e 65 6e 6f  p->error,&lineno
1e120 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
1e130 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1e140 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1e150 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
1e160 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
1e170 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 63  en the parser ac
1e180 63 65 70 74 73 20 69 74 73 20 69 6e 70 75 74 20  cepts its input 
1e190 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
1e1a0 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61  out,lemp,lemp->a
1e1b0 63 63 65 70 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  ccept,&lineno);.
1e1c0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1e1d0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1e1e0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41 70  ineno);..  /* Ap
1e1f0 70 65 6e 64 20 61 6e 79 20 61 64 64 69 74 69 6f  pend any additio
1e200 6e 20 63 6f 64 65 20 74 68 65 20 75 73 65 72 20  n code the user 
1e210 64 65 73 69 72 65 73 20 2a 2f 0a 20 20 74 70 6c  desires */.  tpl
1e220 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
1e230 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65  ,lemp->extracode
1e240 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63  ,&lineno);..  fc
1e250 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f  lose(in);.  fclo
1e260 73 65 28 6f 75 74 29 3b 0a 20 20 72 65 74 75 72  se(out);.  retur
1e270 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  n;.}../* Generat
1e280 65 20 61 20 68 65 61 64 65 72 20 66 69 6c 65 20  e a header file 
1e290 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a  for the parser *
1e2a0 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65 61  /.void ReportHea
1e2b0 64 65 72 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  der(struct lemon
1e2c0 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 46 49 4c 45   *lemp).{.  FILE
1e2d0 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 6f   *out, *in;.  co
1e2e0 6e 73 74 20 63 68 61 72 20 2a 70 72 65 66 69 78  nst char *prefix
1e2f0 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49  ;.  char line[LI
1e300 4e 45 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20  NESIZE];.  char 
1e310 70 61 74 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45  pattern[LINESIZE
1e320 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  ];.  int i;..  i
1e330 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72  f( lemp->tokenpr
1e340 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20  efix ) prefix = 
1e350 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
1e360 78 3b 0a 20 20 65 6c 73 65 20 20 20 20 20 20 20  x;.  else       
1e370 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
1e380 66 69 78 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d  fix = "";.  in =
1e390 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c   file_open(lemp,
1e3a0 22 2e 68 22 2c 22 72 62 22 29 3b 0a 20 20 69 66  ".h","rb");.  if
1e3b0 28 20 69 6e 20 29 7b 0a 20 20 20 20 66 6f 72 28  ( in ){.    for(
1e3c0 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=1; i<lemp->nte
1e3d0 72 6d 69 6e 61 6c 20 26 26 20 66 67 65 74 73 28  rminal && fgets(
1e3e0 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e  line,LINESIZE,in
1e3f0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  ); i++){.      s
1e400 70 72 69 6e 74 66 28 70 61 74 74 65 72 6e 2c 22  printf(pattern,"
1e410 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20  #define %s%-30s 
1e420 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65  %2d\n",prefix,le
1e430 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
1e440 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 69  name,i);.      i
1e450 66 28 20 73 74 72 63 6d 70 28 6c 69 6e 65 2c 70  f( strcmp(line,p
1e460 61 74 74 65 72 6e 29 20 29 20 62 72 65 61 6b 3b  attern) ) break;
1e470 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73  .    }.    fclos
1e480 65 28 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 69  e(in);.    if( i
1e490 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  ==lemp->ntermina
1e4a0 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  l ){.      /* No
1e4b0 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20 66   change in the f
1e4c0 69 6c 65 2e 20 20 44 6f 6e 27 74 20 72 65 77 72  ile.  Don't rewr
1e4d0 69 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20  ite it. */.     
1e4e0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1e4f0 20 7d 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f   }.  out = file_
1e500 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22  open(lemp,".h","
1e510 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 20  wb");.  if( out 
1e520 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
1e530 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i<lemp->ntermina
1e540 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  l; i++){.      f
1e550 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1e560 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c  ine %s%-30s %2d\
1e570 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e  n",prefix,lemp->
1e580 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65  symbols[i]->name
1e590 2c 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ,i);.    }.    f
1e5a0 63 6c 6f 73 65 28 6f 75 74 29 3b 20 20 0a 20 20  close(out);  .  
1e5b0 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
1e5c0 2a 20 52 65 64 75 63 65 20 74 68 65 20 73 69 7a  * Reduce the siz
1e5d0 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20  e of the action 
1e5e0 74 61 62 6c 65 73 2c 20 69 66 20 70 6f 73 73 69  tables, if possi
1e5f0 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e 67 20 75  ble, by making u
1e600 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61 75 6c 74  se.** of default
1e610 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  s..**.** In this
1e620 20 76 65 72 73 69 6f 6e 2c 20 77 65 20 74 61 6b   version, we tak
1e630 65 20 74 68 65 20 6d 6f 73 74 20 66 72 65 71 75  e the most frequ
1e640 65 6e 74 20 52 45 44 55 43 45 20 61 63 74 69 6f  ent REDUCE actio
1e650 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69 74  n and make.** it
1e660 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 45   the default.  E
1e670 78 63 65 70 74 2c 20 74 68 65 72 65 20 69 73 20  xcept, there is 
1e680 6e 6f 20 64 65 66 61 75 6c 74 20 69 66 20 74 68  no default if th
1e690 65 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e  e wildcard token
1e6a0 0a 2a 2a 20 69 73 20 61 20 70 6f 73 73 69 62 6c  .** is a possibl
1e6b0 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 2e 0a 2a 2f  e look-ahead..*/
1e6c0 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73 54 61  .void CompressTa
1e6d0 62 6c 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f  bles(struct lemo
1e6e0 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72  n *lemp).{.  str
1e6f0 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
1e700 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
1e710 2a 61 70 2c 20 2a 61 70 32 3b 0a 20 20 73 74 72  *ap, *ap2;.  str
1e720 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 72  uct rule *rp, *r
1e730 70 32 2c 20 2a 72 62 65 73 74 3b 0a 20 20 69 6e  p2, *rbest;.  in
1e740 74 20 6e 62 65 73 74 2c 20 6e 3b 0a 20 20 69 6e  t nbest, n;.  in
1e750 74 20 69 3b 0a 20 20 69 6e 74 20 75 73 65 73 57  t i;.  int usesW
1e760 69 6c 64 63 61 72 64 3b 0a 0a 20 20 66 6f 72 28  ildcard;..  for(
1e770 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
1e780 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
1e790 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
1e7a0 64 5b 69 5d 3b 0a 20 20 20 20 6e 62 65 73 74 20  d[i];.    nbest 
1e7b0 3d 20 30 3b 0a 20 20 20 20 72 62 65 73 74 20 3d  = 0;.    rbest =
1e7c0 20 30 3b 0a 20 20 20 20 75 73 65 73 57 69 6c 64   0;.    usesWild
1e7d0 63 61 72 64 20 3d 20 30 3b 0a 0a 20 20 20 20 66  card = 0;..    f
1e7e0 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
1e7f0 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
1e800 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
1e810 79 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70  ype==SHIFT && ap
1e820 2d 3e 73 70 3d 3d 6c 65 6d 70 2d 3e 77 69 6c 64  ->sp==lemp->wild
1e830 63 61 72 64 20 29 7b 0a 20 20 20 20 20 20 20 20  card ){.        
1e840 75 73 65 73 57 69 6c 64 63 61 72 64 20 3d 20 31  usesWildcard = 1
1e850 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e860 69 66 28 20 61 70 2d 3e 74 79 70 65 21 3d 52 45  if( ap->type!=RE
1e870 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DUCE ) continue;
1e880 0a 20 20 20 20 20 20 72 70 20 3d 20 61 70 2d 3e  .      rp = ap->
1e890 78 2e 72 70 3b 0a 20 20 20 20 20 20 69 66 28 20  x.rp;.      if( 
1e8a0 72 70 2d 3e 6c 68 73 53 74 61 72 74 20 29 20 63  rp->lhsStart ) c
1e8b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
1e8c0 66 28 20 72 70 3d 3d 72 62 65 73 74 20 29 20 63  f( rp==rbest ) c
1e8d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e  ontinue;.      n
1e8e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 1;.      for(
1e8f0 61 70 32 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70  ap2=ap->next; ap
1e900 32 3b 20 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74  2; ap2=ap2->next
1e910 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
1e920 70 32 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45  p2->type!=REDUCE
1e930 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e940 20 20 20 20 20 72 70 32 20 3d 20 61 70 32 2d 3e       rp2 = ap2->
1e950 78 2e 72 70 3b 0a 20 20 20 20 20 20 20 20 69 66  x.rp;.        if
1e960 28 20 72 70 32 3d 3d 72 62 65 73 74 20 29 20 63  ( rp2==rbest ) c
1e970 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1e980 20 69 66 28 20 72 70 32 3d 3d 72 70 20 29 20 6e   if( rp2==rp ) n
1e990 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1e9a0 20 20 69 66 28 20 6e 3e 6e 62 65 73 74 20 29 7b    if( n>nbest ){
1e9b0 0a 20 20 20 20 20 20 20 20 6e 62 65 73 74 20 3d  .        nbest =
1e9c0 20 6e 3b 0a 20 20 20 20 20 20 20 20 72 62 65 73   n;.        rbes
1e9d0 74 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 7d 0a  t = rp;.      }.
1e9e0 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 44      }. .    /* D
1e9f0 6f 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 65 66  o not make a def
1ea00 61 75 6c 74 20 69 66 20 74 68 65 20 6e 75 6d 62  ault if the numb
1ea10 65 72 20 6f 66 20 72 75 6c 65 73 20 74 6f 20 64  er of rules to d
1ea20 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 69 73  efault.    ** is
1ea30 20 6e 6f 74 20 61 74 20 6c 65 61 73 74 20 31 20   not at least 1 
1ea40 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64 63 61  or if the wildca
1ea50 72 64 20 74 6f 6b 65 6e 20 69 73 20 61 20 70 6f  rd token is a po
1ea60 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 6c 6f  ssible.    ** lo
1ea70 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 2a 2f 0a  okahead..    */.
1ea80 20 20 20 20 69 66 28 20 6e 62 65 73 74 3c 31 20      if( nbest<1 
1ea90 7c 7c 20 75 73 65 73 57 69 6c 64 63 61 72 64 20  || usesWildcard 
1eaa0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20  ) continue;...  
1eab0 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 6d 61 74    /* Combine mat
1eac0 63 68 69 6e 67 20 52 45 44 55 43 45 20 61 63 74  ching REDUCE act
1ead0 69 6f 6e 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ions into a sing
1eae0 6c 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20  le default */.  
1eaf0 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1eb00 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1eb10 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  t){.      if( ap
1eb20 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26  ->type==REDUCE &
1eb30 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73  & ap->x.rp==rbes
1eb40 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t ) break;.    }
1eb50 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70 20  .    assert( ap 
1eb60 29 3b 0a 20 20 20 20 61 70 2d 3e 73 70 20 3d 20  );.    ap->sp = 
1eb70 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66  Symbol_new("{def
1eb80 61 75 6c 74 7d 22 29 3b 0a 20 20 20 20 66 6f 72  ault}");.    for
1eb90 28 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70  (ap=ap->next; ap
1eba0 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1ebb0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
1ebc0 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70  pe==REDUCE && ap
1ebd0 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20  ->x.rp==rbest ) 
1ebe0 61 70 2d 3e 74 79 70 65 20 3d 20 4e 4f 54 5f 55  ap->type = NOT_U
1ebf0 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  SED;.    }.    s
1ec00 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f  tp->ap = Action_
1ec10 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20  sort(stp->ap);. 
1ec20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   }.}.../*.** Com
1ec30 70 61 72 65 20 74 77 6f 20 73 74 61 74 65 73 20  pare two states 
1ec40 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70  for sorting purp
1ec50 6f 73 65 73 2e 20 20 54 68 65 20 73 6d 61 6c 6c  oses.  The small
1ec60 65 72 20 73 74 61 74 65 20 69 73 20 74 68 65 0a  er state is the.
1ec70 2a 2a 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  ** one with the 
1ec80 6d 6f 73 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  most non-termina
1ec90 6c 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74  l actions.  If t
1eca0 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d  hey have the sam
1ecb0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e  e number.** of n
1ecc0 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74 69  on-terminal acti
1ecd0 6f 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 73 6d  ons, then the sm
1ece0 61 6c 6c 65 72 20 69 73 20 74 68 65 20 6f 6e 65  aller is the one
1ecf0 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74 0a 2a   with the most.*
1ed00 2a 20 74 6f 6b 65 6e 20 61 63 74 69 6f 6e 73 2e  * token actions.
1ed10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1ed20 74 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72  tateResortCompar
1ed30 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c  e(const void *a,
1ed40 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b   const void *b){
1ed50 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
1ed60 73 74 61 74 65 20 2a 70 41 20 3d 20 2a 28 63 6f  state *pA = *(co
1ed70 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65  nst struct state
1ed80 2a 2a 29 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74  **)a;.  const st
1ed90 72 75 63 74 20 73 74 61 74 65 20 2a 70 42 20 3d  ruct state *pB =
1eda0 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20   *(const struct 
1edb0 73 74 61 74 65 2a 2a 29 62 3b 0a 20 20 69 6e 74  state**)b;.  int
1edc0 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e   n;..  n = pB->n
1edd0 4e 74 41 63 74 20 2d 20 70 41 2d 3e 6e 4e 74 41  NtAct - pA->nNtA
1ede0 63 74 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29  ct;.  if( n==0 )
1edf0 7b 0a 20 20 20 20 6e 20 3d 20 70 42 2d 3e 6e 54  {.    n = pB->nT
1ee00 6b 6e 41 63 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e  knAct - pA->nTkn
1ee10 41 63 74 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  Act;.    if( n==
1ee20 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70  0 ){.      n = p
1ee30 42 2d 3e 73 74 61 74 65 6e 75 6d 20 2d 20 70 41  B->statenum - pA
1ee40 2d 3e 73 74 61 74 65 6e 75 6d 3b 0a 20 20 20 20  ->statenum;.    
1ee50 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
1ee60 6e 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  n!=0 );.  return
1ee70 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65   n;.}.../*.** Re
1ee80 6e 75 6d 62 65 72 20 61 6e 64 20 72 65 73 6f 72  number and resor
1ee90 74 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74  t states so that
1eea0 20 73 74 61 74 65 73 20 77 69 74 68 20 66 65 77   states with few
1eeb0 65 72 20 63 68 6f 69 63 65 73 0a 2a 2a 20 6f 63  er choices.** oc
1eec0 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20  cur at the end. 
1eed0 20 45 78 63 65 70 74 2c 20 6b 65 65 70 20 73 74   Except, keep st
1eee0 61 74 65 20 30 20 61 73 20 74 68 65 20 66 69 72  ate 0 as the fir
1eef0 73 74 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69  st state..*/.voi
1ef00 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28 73  d ResortStates(s
1ef10 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
1ef20 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p).{.  int i;.  
1ef30 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
1ef40 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p;.  struct acti
1ef50 6f 6e 20 2a 61 70 3b 0a 0a 20 20 66 6f 72 28 69  on *ap;..  for(i
1ef60 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
1ef70 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
1ef80 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
1ef90 5b 69 5d 3b 0a 20 20 20 20 73 74 70 2d 3e 6e 54  [i];.    stp->nT
1efa0 6b 6e 41 63 74 20 3d 20 73 74 70 2d 3e 6e 4e 74  knAct = stp->nNt
1efb0 41 63 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 70  Act = 0;.    stp
1efc0 2d 3e 69 44 66 6c 74 20 3d 20 6c 65 6d 70 2d 3e  ->iDflt = lemp->
1efd0 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e  nstate + lemp->n
1efe0 72 75 6c 65 3b 0a 20 20 20 20 73 74 70 2d 3e 69  rule;.    stp->i
1eff0 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46  TknOfst = NO_OFF
1f000 53 45 54 3b 0a 20 20 20 20 73 74 70 2d 3e 69 4e  SET;.    stp->iN
1f010 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45  tOfst = NO_OFFSE
1f020 54 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  T;.    for(ap=st
1f030 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
1f040 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
1f050 66 28 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f  f( compute_actio
1f060 6e 28 6c 65 6d 70 2c 61 70 29 3e 3d 30 20 29 7b  n(lemp,ap)>=0 ){
1f070 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d  .        if( ap-
1f080 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d  >sp->index<lemp-
1f090 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20  >nterminal ){.  
1f0a0 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 54 6b          stp->nTk
1f0b0 6e 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nAct++;.        
1f0c0 7d 65 6c 73 65 20 69 66 28 20 61 70 2d 3e 73 70  }else if( ap->sp
1f0d0 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73  ->index<lemp->ns
1f0e0 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  ymbol ){.       
1f0f0 20 20 20 73 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b     stp->nNtAct++
1f100 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1f110 0a 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e  .          stp->
1f120 69 44 66 6c 74 20 3d 20 63 6f 6d 70 75 74 65 5f  iDflt = compute_
1f130 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29  action(lemp, ap)
1f140 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f150 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1f160 71 73 6f 72 74 28 26 6c 65 6d 70 2d 3e 73 6f 72  qsort(&lemp->sor
1f170 74 65 64 5b 31 5d 2c 20 6c 65 6d 70 2d 3e 6e 73  ted[1], lemp->ns
1f180 74 61 74 65 2d 31 2c 20 73 69 7a 65 6f 66 28 6c  tate-1, sizeof(l
1f190 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 29 2c  emp->sorted[0]),
1f1a0 0a 20 20 20 20 20 20 20 20 73 74 61 74 65 52 65  .        stateRe
1f1b0 73 6f 72 74 43 6f 6d 70 61 72 65 29 3b 0a 20 20  sortCompare);.  
1f1c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1f1d0 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
1f1e0 20 20 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b     lemp->sorted[
1f1f0 69 5d 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20 69  i]->statenum = i
1f200 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a  ;.  }.}.../*****
1f210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
1f220 6d 20 74 68 65 20 66 69 6c 65 20 22 73 65 74 2e  m the file "set.
1f230 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
1f240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f250 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53  *******/./*.** S
1f260 65 74 20 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 20  et manipulation 
1f270 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 68 65  routines for the
1f280 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
1f290 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61  nerator..*/..sta
1f2a0 74 69 63 20 69 6e 74 20 73 69 7a 65 20 3d 20 30  tic int size = 0
1f2b0 3b 0a 0a 2f 2a 20 53 65 74 20 74 68 65 20 73 65  ;../* Set the se
1f2c0 74 20 73 69 7a 65 20 2a 2f 0a 76 6f 69 64 20 53  t size */.void S
1f2d0 65 74 53 69 7a 65 28 69 6e 74 20 6e 29 0a 7b 0a  etSize(int n).{.
1f2e0 20 20 73 69 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a    size = n+1;.}.
1f2f0 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
1f300 65 77 20 73 65 74 20 2a 2f 0a 63 68 61 72 20 2a  ew set */.char *
1f310 53 65 74 4e 65 77 28 29 7b 0a 20 20 63 68 61 72  SetNew(){.  char
1f320 20 2a 73 3b 0a 20 20 73 20 3d 20 28 63 68 61 72   *s;.  s = (char
1f330 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 2c 20  *)calloc( size, 
1f340 31 29 3b 0a 20 20 69 66 28 20 73 3d 3d 30 20 29  1);.  if( s==0 )
1f350 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69  {.    extern voi
1f360 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29  d memory_error()
1f370 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72  ;.    memory_err
1f380 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  or();.  }.  retu
1f390 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c  rn s;.}../* Deal
1f3a0 6c 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f 0a  locate a set */.
1f3b0 76 6f 69 64 20 53 65 74 46 72 65 65 28 63 68 61  void SetFree(cha
1f3c0 72 20 2a 73 29 0a 7b 0a 20 20 66 72 65 65 28 73  r *s).{.  free(s
1f3d0 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e  );.}../* Add a n
1f3e0 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
1f3f0 65 20 73 65 74 2e 20 20 52 65 74 75 72 6e 20 54  e set.  Return T
1f400 52 55 45 20 69 66 20 74 68 65 20 65 6c 65 6d 65  RUE if the eleme
1f410 6e 74 20 77 61 73 20 61 64 64 65 64 0a 2a 2a 20  nt was added.** 
1f420 61 6e 64 20 46 41 4c 53 45 20 69 66 20 69 74 20  and FALSE if it 
1f430 77 61 73 20 61 6c 72 65 61 64 79 20 74 68 65 72  was already ther
1f440 65 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 41 64 64  e. */.int SetAdd
1f450 28 63 68 61 72 20 2a 73 2c 20 69 6e 74 20 65 29  (char *s, int e)
1f460 0a 7b 0a 20 20 69 6e 74 20 72 76 3b 0a 20 20 61  .{.  int rv;.  a
1f470 73 73 65 72 74 28 20 65 3e 3d 30 20 26 26 20 65  ssert( e>=0 && e
1f480 3c 73 69 7a 65 20 29 3b 0a 20 20 72 76 20 3d 20  <size );.  rv = 
1f490 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20 31  s[e];.  s[e] = 1
1f4a0 3b 0a 20 20 72 65 74 75 72 6e 20 21 72 76 3b 0a  ;.  return !rv;.
1f4b0 7d 0a 0a 2f 2a 20 41 64 64 20 65 76 65 72 79 20  }../* Add every 
1f4c0 65 6c 65 6d 65 6e 74 20 6f 66 20 73 32 20 74 6f  element of s2 to
1f4d0 20 73 31 2e 20 20 52 65 74 75 72 6e 20 54 52 55   s1.  Return TRU
1f4e0 45 20 69 66 20 73 31 20 63 68 61 6e 67 65 73 2e  E if s1 changes.
1f4f0 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e   */.int SetUnion
1f500 28 63 68 61 72 20 2a 73 31 2c 20 63 68 61 72 20  (char *s1, char 
1f510 2a 73 32 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20  *s2).{.  int i, 
1f520 70 72 6f 67 72 65 73 73 3b 0a 20 20 70 72 6f 67  progress;.  prog
1f530 72 65 73 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  ress = 0;.  for(
1f540 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
1f550 29 7b 0a 20 20 20 20 69 66 28 20 73 32 5b 69 5d  ){.    if( s2[i]
1f560 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1f570 20 20 20 20 69 66 28 20 73 31 5b 69 5d 3d 3d 30      if( s1[i]==0
1f580 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 67 72 65   ){.      progre
1f590 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 31  ss = 1;.      s1
1f5a0 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  [i] = 1;.    }. 
1f5b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 6f 67   }.  return prog
1f5c0 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ress;.}./*******
1f5d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1f5e0 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74  From the file "t
1f5f0 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  able.c" ********
1f600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f610 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20  ****/./*.** All 
1f620 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c  code in this fil
1f630 65 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d  e has been autom
1f640 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
1f650 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65  ed.** from a spe
1f660 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68  cification in th
1f670 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  e file.**       
1f680 20 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22         "table.q"
1f690 0a 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63  .** by the assoc
1f6a0 69 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64  iative array cod
1f6b0 65 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72  e building progr
1f6c0 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44  am "aagen"..** D
1f6d0 6f 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20  o not edit this 
1f6e0 66 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20  file!  Instead, 
1f6f0 65 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69  edit the specifi
1f700 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20  cation.** file, 
1f710 74 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e  then rerun aagen
1f720 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ..*/./*.** Code 
1f730 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74  for processing t
1f740 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d  ables in the LEM
1f750 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
1f760 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56 41 54 45  tor..*/..PRIVATE
1f770 20 69 6e 74 20 73 74 72 68 61 73 68 28 63 6f 6e   int strhash(con
1f780 73 74 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20  st char *x).{.  
1f790 69 6e 74 20 68 20 3d 20 30 3b 0a 20 20 77 68 69  int h = 0;.  whi
1f7a0 6c 65 28 20 2a 78 29 20 68 20 3d 20 68 2a 31 33  le( *x) h = h*13
1f7b0 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20 72 65 74   + *(x++);.  ret
1f7c0 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72  urn h;.}../* Wor
1f7d0 6b 73 20 6c 69 6b 65 20 73 74 72 64 75 70 2c 20  ks like strdup, 
1f7e0 73 6f 72 74 20 6f 66 2e 20 20 53 61 76 65 20 61  sort of.  Save a
1f7f0 20 73 74 72 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f   string in mallo
1f800 63 65 64 20 6d 65 6d 6f 72 79 2c 20 62 75 74 0a  ced memory, but.
1f810 2a 2a 20 6b 65 65 70 20 73 74 72 69 6e 67 73 20  ** keep strings 
1f820 69 6e 20 61 20 74 61 62 6c 65 20 73 6f 20 74 68  in a table so th
1f830 61 74 20 74 68 65 20 73 61 6d 65 20 73 74 72 69  at the same stri
1f840 6e 67 20 69 73 20 6e 6f 74 20 69 6e 20 6d 6f 72  ng is not in mor
1f850 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 70 6c  e.** than one pl
1f860 61 63 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ace..*/.const ch
1f870 61 72 20 2a 53 74 72 73 61 66 65 28 63 6f 6e 73  ar *Strsafe(cons
1f880 74 20 63 68 61 72 20 2a 79 29 0a 7b 0a 20 20 63  t char *y).{.  c
1f890 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
1f8a0 63 68 61 72 20 2a 63 70 79 3b 0a 0a 20 20 69 66  char *cpy;..  if
1f8b0 28 20 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( y==0 ) return 
1f8c0 30 3b 0a 20 20 7a 20 3d 20 53 74 72 73 61 66 65  0;.  z = Strsafe
1f8d0 5f 66 69 6e 64 28 79 29 3b 0a 20 20 69 66 28 20  _find(y);.  if( 
1f8e0 7a 3d 3d 30 20 26 26 20 28 63 70 79 3d 28 63 68  z==0 && (cpy=(ch
1f8f0 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d  ar *)malloc( lem
1f900 6f 6e 53 74 72 6c 65 6e 28 79 29 2b 31 20 29 29  onStrlen(y)+1 ))
1f910 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 63 70  !=0 ){.    strcp
1f920 79 28 63 70 79 2c 79 29 3b 0a 20 20 20 20 7a 20  y(cpy,y);.    z 
1f930 3d 20 63 70 79 3b 0a 20 20 20 20 53 74 72 73 61  = cpy;.    Strsa
1f940 66 65 5f 69 6e 73 65 72 74 28 7a 29 3b 0a 20 20  fe_insert(z);.  
1f950 7d 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28  }.  MemoryCheck(
1f960 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  z);.  return z;.
1f970 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  }../* There is o
1f980 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
1f990 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1f9a0 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a  ucture for each.
1f9b0 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ** associative a
1f9c0 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 31  rray of type "x1
1f9d0 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78  "..*/.struct s_x
1f9e0 31 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20  1 {.  int size; 
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fa00 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   The number of a
1fa10 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20  vailable slots. 
1fa20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fa40 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65    Must be a powe
1fa50 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
1fa60 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20  han or */.      
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa80 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74      /*   equal t
1fa90 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  o 1 */.  int cou
1faa0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
1fab0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
1fac0 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69  rrently slots fi
1fad0 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  lled */.  struct
1fae0 20 73 5f 78 31 6e 6f 64 65 20 2a 74 62 6c 3b 20   s_x1node *tbl; 
1faf0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f   /* The data sto
1fb00 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  red here */.  st
1fb10 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a  ruct s_x1node **
1fb20 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ht;  /* Hash tab
1fb30 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a  le for lookups *
1fb40 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  /.};../* There i
1fb50 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
1fb60 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1fb70 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20   for every data 
1fb80 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e  element.** in an
1fb90 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
1fba0 61 79 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e  ay of type "x1".
1fbb0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1fbc0 63 74 20 73 5f 78 31 6e 6f 64 65 20 7b 0a 20 20  ct s_x1node {.  
1fbd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 61 74 61  const char *data
1fbe0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
1fbf0 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74  data */.  struct
1fc00 20 73 5f 78 31 6e 6f 64 65 20 2a 6e 65 78 74 3b   s_x1node *next;
1fc10 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79     /* Next entry
1fc20 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68   with the same h
1fc30 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ash */.  struct 
1fc40 73 5f 78 31 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b  s_x1node **from;
1fc50 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69    /* Previous li
1fc60 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a  nk */.} x1node;.
1fc70 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c  ./* There is onl
1fc80 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  y one instance o
1fc90 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69  f the array, whi
1fca0 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ch is the follow
1fcb0 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ing */.static st
1fcc0 72 75 63 74 20 73 5f 78 31 20 2a 78 31 61 3b 0a  ruct s_x1 *x1a;.
1fcd0 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
1fce0 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ew associative a
1fcf0 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 72  rray */.void Str
1fd00 73 61 66 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69  safe_init(){.  i
1fd10 66 28 20 78 31 61 20 29 20 72 65 74 75 72 6e 3b  f( x1a ) return;
1fd20 0a 20 20 78 31 61 20 3d 20 28 73 74 72 75 63 74  .  x1a = (struct
1fd30 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63 28 20 73   s_x1*)malloc( s
1fd40 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78  izeof(struct s_x
1fd50 31 29 20 29 3b 0a 20 20 69 66 28 20 78 31 61 20  1) );.  if( x1a 
1fd60 29 7b 0a 20 20 20 20 78 31 61 2d 3e 73 69 7a 65  ){.    x1a->size
1fd70 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 78 31 61   = 1024;.    x1a
1fd80 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ->count = 0;.   
1fd90 20 78 31 61 2d 3e 74 62 6c 20 3d 20 28 78 31 6e   x1a->tbl = (x1n
1fda0 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20  ode*)malloc( .  
1fdb0 20 20 20 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f      (sizeof(x1no
1fdc0 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e  de) + sizeof(x1n
1fdd0 6f 64 65 2a 29 29 2a 31 30 32 34 20 29 3b 0a 20  ode*))*1024 );. 
1fde0 20 20 20 69 66 28 20 78 31 61 2d 3e 74 62 6c 3d     if( x1a->tbl=
1fdf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  =0 ){.      free
1fe00 28 78 31 61 29 3b 0a 20 20 20 20 20 20 78 31 61  (x1a);.      x1a
1fe10 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1fe20 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1fe30 20 20 20 20 78 31 61 2d 3e 68 74 20 3d 20 28 78      x1a->ht = (x
1fe40 31 6e 6f 64 65 2a 2a 29 26 28 78 31 61 2d 3e 74  1node**)&(x1a->t
1fe50 62 6c 5b 31 30 32 34 5d 29 3b 0a 20 20 20 20 20  bl[1024]);.     
1fe60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30 32 34   for(i=0; i<1024
1fe70 3b 20 69 2b 2b 29 20 78 31 61 2d 3e 68 74 5b 69  ; i++) x1a->ht[i
1fe80 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
1fe90 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e  .}./* Insert a n
1fea0 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
1feb0 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  he array.  Retur
1fec0 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73  n TRUE if succes
1fed0 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64  sful..** Prior d
1fee0 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d  ata with the sam
1fef0 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65  e key is NOT ove
1ff00 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20  rwritten */.int 
1ff10 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 63  Strsafe_insert(c
1ff20 6f 6e 73 74 20 63 68 61 72 20 2a 64 61 74 61 29  onst char *data)
1ff30 0a 7b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b  .{.  x1node *np;
1ff40 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20  .  int h;.  int 
1ff50 70 68 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d  ph;..  if( x1a==
1ff60 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1ff70 70 68 20 3d 20 73 74 72 68 61 73 68 28 64 61 74  ph = strhash(dat
1ff80 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28  a);.  h = ph & (
1ff90 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x1a->size-1);.  
1ffa0 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b  np = x1a->ht[h];
1ffb0 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
1ffc0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e      if( strcmp(n
1ffd0 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d 30  p->data,data)==0
1ffe0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
1fff0 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77  existing entry w
20000 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
20010 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20   is found. */.  
20020 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61      /* Fail beca
20030 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73  use overwrite is
20040 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a   not allows. */.
20050 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
20060 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e      }.    np = n
20070 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  p->next;.  }.  i
20080 66 28 20 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d 78  f( x1a->count>=x
20090 31 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20  1a->size ){.    
200a0 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
200b0 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62  the hash table b
200c0 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  igger */.    int
200d0 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72   i,size;.    str
200e0 75 63 74 20 73 5f 78 31 20 61 72 72 61 79 3b 0a  uct s_x1 array;.
200f0 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d      array.size =
20100 20 73 69 7a 65 20 3d 20 78 31 61 2d 3e 73 69 7a   size = x1a->siz
20110 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63  e*2;.    array.c
20120 6f 75 6e 74 20 3d 20 78 31 61 2d 3e 63 6f 75 6e  ount = x1a->coun
20130 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c  t;.    array.tbl
20140 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x1node*)mall
20150 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f  oc(.      (sizeo
20160 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x1node) + size
20170 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a 73 69 7a  of(x1node*))*siz
20180 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72  e );.    if( arr
20190 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75  ay.tbl==0 ) retu
201a0 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64  rn 0;  /* Fail d
201b0 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69  ue to malloc fai
201c0 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61  lure */.    arra
201d0 79 2e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a  y.ht = (x1node**
201e0 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a  )&(array.tbl[siz
201f0 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e]);.    for(i=0
20200 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61  ; i<size; i++) a
20210 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a  rray.ht[i] = 0;.
20220 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78      for(i=0; i<x
20230 31 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b  1a->count; i++){
20240 0a 20 20 20 20 20 20 78 31 6e 6f 64 65 20 2a 6f  .      x1node *o
20250 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20  ldnp, *newnp;.  
20260 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 31      oldnp = &(x1
20270 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  a->tbl[i]);.    
20280 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c    h = strhash(ol
20290 64 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 73 69  dnp->data) & (si
202a0 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77  ze-1);.      new
202b0 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c  np = &(array.tbl
202c0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
202d0 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72  array.ht[h] ) ar
202e0 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  ray.ht[h]->from 
202f0 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29  = &(newnp->next)
20300 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e  ;.      newnp->n
20310 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68  ext = array.ht[h
20320 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  ];.      newnp->
20330 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61  data = oldnp->da
20340 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  ta;.      newnp-
20350 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e  >from = &(array.
20360 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72  ht[h]);.      ar
20370 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e  ray.ht[h] = newn
20380 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65  p;.    }.    fre
20390 65 28 78 31 61 2d 3e 74 62 6c 29 3b 0a 20 20 20  e(x1a->tbl);.   
203a0 20 2a 78 31 61 20 3d 20 61 72 72 61 79 3b 0a 20   *x1a = array;. 
203b0 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74   }.  /* Insert t
203c0 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20  he new data */. 
203d0 20 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e   h = ph & (x1a->
203e0 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
203f0 26 28 78 31 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e  &(x1a->tbl[x1a->
20400 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d  count++]);.  np-
20410 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20  >data = data;.  
20420 69 66 28 20 78 31 61 2d 3e 68 74 5b 68 5d 20 29  if( x1a->ht[h] )
20430 20 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f   x1a->ht[h]->fro
20440 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b  m = &(np->next);
20450 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 31  .  np->next = x1
20460 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 31 61 2d  a->ht[h];.  x1a-
20470 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e  >ht[h] = np;.  n
20480 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 31 61 2d  p->from = &(x1a-
20490 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72  >ht[h]);.  retur
204a0 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  n 1;.}../* Retur
204b0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  n a pointer to d
204c0 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ata assigned to 
204d0 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20  the given key.  
204e0 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69  Return NULL.** i
204f0 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a  f no such key. *
20500 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74  /.const char *St
20510 72 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74  rsafe_find(const
20520 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20   char *key).{.  
20530 69 6e 74 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20  int h;.  x1node 
20540 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d  *np;..  if( x1a=
20550 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
20560 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79   h = strhash(key
20570 29 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31  ) & (x1a->size-1
20580 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68  );.  np = x1a->h
20590 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
205a0 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
205b0 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79  cmp(np->data,key
205c0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
205d0 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
205e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
205f0 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
20600 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
20610 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 28  pointer to the (
20620 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74  terminal or nont
20630 65 72 6d 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20  erminal) symbol 
20640 22 78 22 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61  "x"..** Create a
20650 20 6e 65 77 20 73 79 6d 62 6f 6c 20 69 66 20 74   new symbol if t
20660 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
20670 20 74 69 6d 65 20 22 78 22 20 68 61 73 20 62 65   time "x" has be
20680 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75  en seen..*/.stru
20690 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
206a0 6c 5f 6e 65 77 28 63 6f 6e 73 74 20 63 68 61 72  l_new(const char
206b0 20 2a 78 29 0a 7b 0a 20 20 73 74 72 75 63 74 20   *x).{.  struct 
206c0 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73  symbol *sp;..  s
206d0 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  p = Symbol_find(
206e0 78 29 3b 0a 20 20 69 66 28 20 73 70 3d 3d 30 20  x);.  if( sp==0 
206f0 29 7b 0a 20 20 20 20 73 70 20 3d 20 28 73 74 72  ){.    sp = (str
20700 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 63 61 6c  uct symbol *)cal
20710 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73 74  loc(1, sizeof(st
20720 72 75 63 74 20 73 79 6d 62 6f 6c 29 20 29 3b 0a  ruct symbol) );.
20730 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28      MemoryCheck(
20740 73 70 29 3b 0a 20 20 20 20 73 70 2d 3e 6e 61 6d  sp);.    sp->nam
20750 65 20 3d 20 53 74 72 73 61 66 65 28 78 29 3b 0a  e = Strsafe(x);.
20760 20 20 20 20 73 70 2d 3e 74 79 70 65 20 3d 20 69      sp->type = i
20770 73 75 70 70 65 72 28 2a 78 29 20 3f 20 54 45 52  supper(*x) ? TER
20780 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49  MINAL : NONTERMI
20790 4e 41 4c 3b 0a 20 20 20 20 73 70 2d 3e 72 75 6c  NAL;.    sp->rul
207a0 65 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 66  e = 0;.    sp->f
207b0 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  allback = 0;.   
207c0 20 73 70 2d 3e 70 72 65 63 20 3d 20 2d 31 3b 0a   sp->prec = -1;.
207d0 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20      sp->assoc = 
207e0 55 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e 66 69 72  UNK;.    sp->fir
207f0 73 74 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 73  stset = 0;.    s
20800 70 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f  p->lambda = LEMO
20810 4e 5f 46 41 4c 53 45 3b 0a 20 20 20 20 73 70 2d  N_FALSE;.    sp-
20820 3e 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30 3b  >destructor = 0;
20830 0a 20 20 20 20 73 70 2d 3e 64 65 73 74 4c 69 6e  .    sp->destLin
20840 65 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d  eno = 0;.    sp-
20850 3e 64 61 74 61 74 79 70 65 20 3d 20 30 3b 0a 20  >datatype = 0;. 
20860 20 20 20 73 70 2d 3e 75 73 65 43 6e 74 20 3d 20     sp->useCnt = 
20870 30 3b 0a 20 20 20 20 53 79 6d 62 6f 6c 5f 69 6e  0;.    Symbol_in
20880 73 65 72 74 28 73 70 2c 73 70 2d 3e 6e 61 6d 65  sert(sp,sp->name
20890 29 3b 0a 20 20 7d 0a 20 20 73 70 2d 3e 75 73 65  );.  }.  sp->use
208a0 43 6e 74 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  Cnt++;.  return 
208b0 73 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72  sp;.}../* Compar
208c0 65 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 66 6f  e two symbols fo
208d0 72 20 77 6f 72 6b 69 6e 67 20 70 75 72 70 6f 73  r working purpos
208e0 65 73 0a 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 73  es.**.** Symbols
208f0 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
20900 20 75 70 70 65 72 20 63 61 73 65 20 6c 65 74 74   upper case lett
20910 65 72 73 20 28 74 65 72 6d 69 6e 61 6c 73 20 6f  ers (terminals o
20920 72 20 74 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75 73  r tokens).** mus
20930 74 20 73 6f 72 74 20 62 65 66 6f 72 65 20 73 79  t sort before sy
20940 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69 6e  mbols that begin
20950 20 77 69 74 68 20 6c 6f 77 65 72 20 63 61 73 65   with lower case
20960 20 6c 65 74 74 65 72 73 0a 2a 2a 20 28 6e 6f 6e   letters.** (non
20970 2d 74 65 72 6d 69 6e 61 6c 73 29 2e 20 20 4f 74  -terminals).  Ot
20980 68 65 72 20 74 68 61 6e 20 74 68 61 74 2c 20 74  her than that, t
20990 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6e 6f  he order does no
209a0 74 20 6d 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  t matter..**.** 
209b0 57 65 20 66 69 6e 64 20 65 78 70 65 72 69 6d 65  We find experime
209c0 6e 74 61 6c 6c 79 20 74 68 61 74 20 6c 65 61 76  ntally that leav
209d0 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 73 20  ing the symbols 
209e0 69 6e 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  in their origina
209f0 6c 0a 2a 2a 20 6f 72 64 65 72 20 28 74 68 65 20  l.** order (the 
20a00 6f 72 64 65 72 20 74 68 65 79 20 61 70 70 65 61  order they appea
20a10 72 65 64 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  red in the gramm
20a20 61 72 20 66 69 6c 65 29 20 67 69 76 65 73 20 74  ar file) gives t
20a30 68 65 0a 2a 2a 20 73 6d 61 6c 6c 65 73 74 20 70  he.** smallest p
20a40 61 72 73 65 72 20 74 61 62 6c 65 73 20 69 6e 20  arser tables in 
20a50 53 51 4c 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20 53  SQLite..*/.int S
20a60 79 6d 62 6f 6c 63 6d 70 70 28 63 6f 6e 73 74 20  ymbolcmpp(const 
20a70 76 6f 69 64 20 2a 5f 61 2c 20 63 6f 6e 73 74 20  void *_a, const 
20a80 76 6f 69 64 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f  void *_b).{.  co
20a90 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f  nst struct symbo
20aa0 6c 20 2a 2a 61 20 3d 20 28 63 6f 6e 73 74 20 73  l **a = (const s
20ab0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29  truct symbol **)
20ac0 20 5f 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72   _a;.  const str
20ad0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 62 20 3d  uct symbol **b =
20ae0 20 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73   (const struct s
20af0 79 6d 62 6f 6c 20 2a 2a 29 20 5f 62 3b 0a 20 20  ymbol **) _b;.  
20b00 69 6e 74 20 69 31 20 3d 20 28 2a 2a 61 29 2e 69  int i1 = (**a).i
20b10 6e 64 65 78 20 2b 20 31 30 30 30 30 30 30 30 2a  ndex + 10000000*
20b20 28 28 2a 2a 61 29 2e 6e 61 6d 65 5b 30 5d 3e 27  ((**a).name[0]>'
20b30 5a 27 29 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20  Z');.  int i2 = 
20b40 28 2a 2a 62 29 2e 69 6e 64 65 78 20 2b 20 31 30  (**b).index + 10
20b50 30 30 30 30 30 30 2a 28 28 2a 2a 62 29 2e 6e 61  000000*((**b).na
20b60 6d 65 5b 30 5d 3e 27 5a 27 29 3b 0a 20 20 61 73  me[0]>'Z');.  as
20b70 73 65 72 74 28 20 69 31 21 3d 69 32 20 7c 7c 20  sert( i1!=i2 || 
20b80 73 74 72 63 6d 70 28 28 2a 2a 61 29 2e 6e 61 6d  strcmp((**a).nam
20b90 65 2c 28 2a 2a 62 29 2e 6e 61 6d 65 29 3d 3d 30  e,(**b).name)==0
20ba0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 31 2d   );.  return i1-
20bb0 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20  i2;.}../* There 
20bc0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
20bd0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
20be0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
20bf0 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
20c00 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
20c10 20 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x2"..*/.struct
20c20 20 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20 73 69   s_x2 {.  int si
20c30 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
20c40 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
20c50 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
20c60 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
20c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c80 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
20c90 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
20ca0 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cc0 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
20cd0 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
20ce0 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
20cf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20d00 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
20d10 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
20d20 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 74  ruct s_x2node *t
20d30 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
20d40 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
20d50 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
20d60 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
20d70 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
20d80 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
20d90 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
20da0 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
20db0 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
20dc0 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
20dd0 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
20de0 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
20df0 78 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x2"..*/.typedef 
20e00 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20  struct s_x2node 
20e10 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
20e20 6c 20 2a 64 61 74 61 3b 20 20 20 20 20 2f 2a 20  l *data;     /* 
20e30 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 63 6f  The data */.  co
20e40 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 3b 20 20  nst char *key;  
20e50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65         /* The ke
20e60 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  y */.  struct s_
20e70 78 32 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x2node *next;   
20e80 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
20e90 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
20ea0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
20eb0 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  2node **from;  /
20ec0 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
20ed0 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x2node;../*
20ee0 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
20ef0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
20f00 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
20f10 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
20f20 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
20f30 74 20 73 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a  t s_x2 *x2a;../*
20f40 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
20f50 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
20f60 79 20 2a 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c  y */.void Symbol
20f70 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78  _init(){.  if( x
20f80 32 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  2a ) return;.  x
20f90 32 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78  2a = (struct s_x
20fa0 32 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  2*)malloc( sizeo
20fb0 66 28 73 74 72 75 63 74 20 73 5f 78 32 29 20 29  f(struct s_x2) )
20fc0 3b 0a 20 20 69 66 28 20 78 32 61 20 29 7b 0a 20  ;.  if( x2a ){. 
20fd0 20 20 20 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31     x2a->size = 1
20fe0 32 38 3b 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75  28;.    x2a->cou
20ff0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d  nt = 0;.    x2a-
21000 3e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29  >tbl = (x2node*)
21010 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28  malloc( .      (
21020 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b  sizeof(x2node) +
21030 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29   sizeof(x2node*)
21040 29 2a 31 32 38 20 29 3b 0a 20 20 20 20 69 66 28  )*128 );.    if(
21050 20 78 32 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a   x2a->tbl==0 ){.
21060 20 20 20 20 20 20 66 72 65 65 28 78 32 61 29 3b        free(x2a);
21070 0a 20 20 20 20 20 20 78 32 61 20 3d 20 30 3b 0a  .      x2a = 0;.
21080 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21090 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 32   int i;.      x2
210a0 61 2d 3e 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a  a->ht = (x2node*
210b0 2a 29 26 28 78 32 61 2d 3e 74 62 6c 5b 31 32 38  *)&(x2a->tbl[128
210c0 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ]);.      for(i=
210d0 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78  0; i<128; i++) x
210e0 32 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  2a->ht[i] = 0;. 
210f0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e     }.  }.}./* In
21100 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
21110 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79  d into the array
21120 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
21130 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a  f successful..**
21140 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68   Prior data with
21150 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
21160 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e   NOT overwritten
21170 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69   */.int Symbol_i
21180 6e 73 65 72 74 28 73 74 72 75 63 74 20 73 79 6d  nsert(struct sym
21190 62 6f 6c 20 2a 64 61 74 61 2c 20 63 6f 6e 73 74  bol *data, const
211a0 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20   char *key).{.  
211b0 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e  x2node *np;.  in
211c0 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a  t h;.  int ph;..
211d0 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72    if( x2a==0 ) r
211e0 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20  eturn 0;.  ph = 
211f0 73 74 72 68 61 73 68 28 6b 65 79 29 3b 0a 20 20  strhash(key);.  
21200 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73  h = ph & (x2a->s
21210 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
21220 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  2a->ht[h];.  whi
21230 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
21240 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79  ( strcmp(np->key
21250 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ,key)==0 ){.    
21260 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
21270 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
21280 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e  same key is foun
21290 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46  d. */.      /* F
212a0 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72  ail because over
212b0 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c  write is not all
212c0 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ows. */.      re
212d0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
212e0 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
212f0 0a 20 20 7d 0a 20 20 69 66 28 20 78 32 61 2d 3e  .  }.  if( x2a->
21300 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a 65  count>=x2a->size
21310 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20   ){.    /* Need 
21320 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68  to make the hash
21330 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f   table bigger */
21340 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b  .    int i,size;
21350 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 32  .    struct s_x2
21360 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61   array;.    arra
21370 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20  y.size = size = 
21380 78 32 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20  x2a->size*2;.   
21390 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78   array.count = x
213a0 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61  2a->count;.    a
213b0 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 32 6e 6f  rray.tbl = (x2no
213c0 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20  de*)malloc(.    
213d0 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65    (sizeof(x2node
213e0 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64  ) + sizeof(x2nod
213f0 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20  e*))*size );.   
21400 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d   if( array.tbl==
21410 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
21420 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61  * Fail due to ma
21430 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a  lloc failure */.
21440 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28      array.ht = (
21450 78 32 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79  x2node**)&(array
21460 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20  .tbl[size]);.   
21470 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
21480 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b  ; i++) array.ht[
21490 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  i] = 0;.    for(
214a0 69 3d 30 3b 20 69 3c 78 32 61 2d 3e 63 6f 75 6e  i=0; i<x2a->coun
214b0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78  t; i++){.      x
214c0 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e  2node *oldnp, *n
214d0 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e  ewnp;.      oldn
214e0 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b 69  p = &(x2a->tbl[i
214f0 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74  ]);.      h = st
21500 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79  rhash(oldnp->key
21510 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20  ) & (size-1);.  
21520 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
21530 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
21540 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
21550 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
21560 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
21570 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
21580 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
21590 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
215a0 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64  newnp->key = old
215b0 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e  np->key;.      n
215c0 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64  ewnp->data = old
215d0 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20  np->data;.      
215e0 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  newnp->from = &(
215f0 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20  array.ht[h]);.  
21600 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20      array.ht[h] 
21610 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20  = newnp;.    }. 
21620 20 20 20 66 72 65 65 28 78 32 61 2d 3e 74 62 6c     free(x2a->tbl
21630 29 3b 0a 20 20 20 20 2a 78 32 61 20 3d 20 61 72  );.    *x2a = ar
21640 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e  ray;.  }.  /* In
21650 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74  sert the new dat
21660 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20  a */.  h = ph & 
21670 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x2a->size-1);. 
21680 20 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c   np = &(x2a->tbl
21690 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b  [x2a->count++]);
216a0 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79  .  np->key = key
216b0 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
216c0 61 74 61 3b 0a 20 20 69 66 28 20 78 32 61 2d 3e  ata;.  if( x2a->
216d0 68 74 5b 68 5d 20 29 20 78 32 61 2d 3e 68 74 5b  ht[h] ) x2a->ht[
216e0 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
216f0 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
21700 78 74 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b  xt = x2a->ht[h];
21710 0a 20 20 78 32 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x2a->ht[h] = 
21720 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
21730 20 26 28 78 32 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x2a->ht[h]);.
21740 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
21750 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
21760 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
21770 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
21780 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
21790 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
217a0 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20   key. */.struct 
217b0 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66  symbol *Symbol_f
217c0 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ind(const char *
217d0 6b 65 79 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a  key).{.  int h;.
217e0 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20    x2node *np;.. 
217f0 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65   if( x2a==0 ) re
21800 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74  turn 0;.  h = st
21810 72 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 32  rhash(key) & (x2
21820 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
21830 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x2a->ht[h];. 
21840 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
21850 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d    if( strcmp(np-
21860 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62  >key,key)==0 ) b
21870 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e  reak;.    np = n
21880 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  p->next;.  }.  r
21890 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64  eturn np ? np->d
218a0 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52  ata : 0;.}../* R
218b0 65 74 75 72 6e 20 74 68 65 20 6e 2d 74 68 20 64  eturn the n-th d
218c0 61 74 61 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ata.  Return NUL
218d0 4c 20 69 66 20 6e 20 69 73 20 6f 75 74 20 6f 66  L if n is out of
218e0 20 72 61 6e 67 65 2e 20 2a 2f 0a 73 74 72 75 63   range. */.struc
218f0 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c  t symbol *Symbol
21900 5f 4e 74 68 28 69 6e 74 20 6e 29 0a 7b 0a 20 20  _Nth(int n).{.  
21910 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
21920 61 74 61 3b 0a 20 20 69 66 28 20 78 32 61 20 26  ata;.  if( x2a &
21930 26 20 6e 3e 30 20 26 26 20 6e 3c 3d 78 32 61 2d  & n>0 && n<=x2a-
21940 3e 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20 64 61  >count ){.    da
21950 74 61 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d  ta = x2a->tbl[n-
21960 31 5d 2e 64 61 74 61 3b 0a 20 20 7d 65 6c 73 65  1].data;.  }else
21970 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 30 3b 0a  {.    data = 0;.
21980 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 61 74    }.  return dat
21990 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  a;.}../* Return 
219a0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
219b0 61 72 72 61 79 20 2a 2f 0a 69 6e 74 20 53 79 6d  array */.int Sym
219c0 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b 0a 20 20  bol_count().{.  
219d0 72 65 74 75 72 6e 20 78 32 61 20 3f 20 78 32 61  return x2a ? x2a
219e0 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a  ->count : 0;.}..
219f0 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72  /* Return an arr
21a00 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  ay of pointers t
21a10 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68  o all data in th
21a20 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20  e table..** The 
21a30 61 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65  array is obtaine
21a40 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20  d from malloc.  
21a50 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d  Return NULL if m
21a60 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
21a70 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72  .** problems, or
21a80 20 69 66 20 74 68 65 20 61 72 72 61 79 20 69 73   if the array is
21a90 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63   empty. */.struc
21aa0 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f  t symbol **Symbo
21ab0 6c 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20  l_arrayof().{.  
21ac0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
21ad0 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73  array;.  int i,s
21ae0 69 7a 65 3b 0a 20 20 69 66 28 20 78 32 61 3d 3d  ize;.  if( x2a==
21af0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
21b00 73 69 7a 65 20 3d 20 78 32 61 2d 3e 63 6f 75 6e  size = x2a->coun
21b10 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74  t;.  array = (st
21b20 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 63  ruct symbol **)c
21b30 61 6c 6c 6f 63 28 73 69 7a 65 2c 20 73 69 7a 65  alloc(size, size
21b40 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
21b50 20 2a 29 29 3b 0a 20 20 69 66 28 20 61 72 72 61   *));.  if( arra
21b60 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
21b70 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61  ; i<size; i++) a
21b80 72 72 61 79 5b 69 5d 20 3d 20 78 32 61 2d 3e 74  rray[i] = x2a->t
21b90 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a  bl[i].data;.  }.
21ba0 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a    return array;.
21bb0 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77  }../* Compare tw
21bc0 6f 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  o configurations
21bd0 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d   */.int Configcm
21be0 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f 61  p(const char *_a
21bf0 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f 62 29  ,const char *_b)
21c00 0a 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  .{.  const struc
21c10 74 20 63 6f 6e 66 69 67 20 2a 61 20 3d 20 28 73  t config *a = (s
21c20 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20  truct config *) 
21c30 5f 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  _a;.  const stru
21c40 63 74 20 63 6f 6e 66 69 67 20 2a 62 20 3d 20 28  ct config *b = (
21c50 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
21c60 20 5f 62 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20   _b;.  int x;.  
21c70 78 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78  x = a->rp->index
21c80 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b   - b->rp->index;
21c90 0a 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20  .  if( x==0 ) x 
21ca0 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f  = a->dot - b->do
21cb0 74 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d  t;.  return x;.}
21cc0 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  ../* Compare two
21cd0 20 73 74 61 74 65 73 20 2a 2f 0a 50 52 49 56 41   states */.PRIVA
21ce0 54 45 20 69 6e 74 20 73 74 61 74 65 63 6d 70 28  TE int statecmp(
21cf0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61  struct config *a
21d00 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
21d10 2a 62 29 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *b).{.  int rc;.
21d20 20 20 66 6f 72 28 72 63 3d 30 3b 20 72 63 3d 3d    for(rc=0; rc==
21d30 30 20 26 26 20 61 20 26 26 20 62 3b 20 20 61 3d  0 && a && b;  a=
21d40 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e 62 70 29 7b  a->bp, b=b->bp){
21d50 0a 20 20 20 20 72 63 20 3d 20 61 2d 3e 72 70 2d  .    rc = a->rp-
21d60 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e  >index - b->rp->
21d70 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 72  index;.    if( r
21d80 63 3d 3d 30 20 29 20 72 63 20 3d 20 61 2d 3e 64  c==0 ) rc = a->d
21d90 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d  ot - b->dot;.  }
21da0 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
21db0 20 20 20 20 69 66 28 20 61 20 29 20 72 63 20 3d      if( a ) rc =
21dc0 20 31 3b 0a 20 20 20 20 69 66 28 20 62 20 29 20   1;.    if( b ) 
21dd0 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  rc = -1;.  }.  r
21de0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
21df0 48 61 73 68 20 61 20 73 74 61 74 65 20 2a 2f 0a  Hash a state */.
21e00 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 61 74  PRIVATE int stat
21e10 65 68 61 73 68 28 73 74 72 75 63 74 20 63 6f 6e  ehash(struct con
21e20 66 69 67 20 2a 61 29 0a 7b 0a 20 20 69 6e 74 20  fig *a).{.  int 
21e30 68 3d 30 3b 0a 20 20 77 68 69 6c 65 28 20 61 20  h=0;.  while( a 
21e40 29 7b 0a 20 20 20 20 68 20 3d 20 68 2a 35 37 31  ){.    h = h*571
21e50 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a   + a->rp->index*
21e60 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 20  37 + a->dot;.   
21e70 20 61 20 3d 20 61 2d 3e 62 70 3b 0a 20 20 7d 0a   a = a->bp;.  }.
21e80 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f    return h;.}../
21e90 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
21ea0 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65   state structure
21eb0 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65   */.struct state
21ec0 20 2a 53 74 61 74 65 5f 6e 65 77 28 29 0a 7b 0a   *State_new().{.
21ed0 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
21ee0 6e 65 77 73 74 61 74 65 3b 0a 20 20 6e 65 77 73  newstate;.  news
21ef0 74 61 74 65 20 3d 20 28 73 74 72 75 63 74 20 73  tate = (struct s
21f00 74 61 74 65 20 2a 29 63 61 6c 6c 6f 63 28 31 2c  tate *)calloc(1,
21f10 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
21f20 74 61 74 65 29 20 29 3b 0a 20 20 4d 65 6d 6f 72  tate) );.  Memor
21f30 79 43 68 65 63 6b 28 6e 65 77 73 74 61 74 65 29  yCheck(newstate)
21f40 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 73 74  ;.  return newst
21f50 61 74 65 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65  ate;.}../* There
21f60 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
21f70 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
21f80 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  g structure for 
21f90 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74  each.** associat
21fa0 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
21fb0 65 20 22 78 33 22 2e 0a 2a 2f 0a 73 74 72 75 63  e "x3"..*/.struc
21fc0 74 20 73 5f 78 33 20 7b 0a 20 20 69 6e 74 20 73  t s_x3 {.  int s
21fd0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
21fe0 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
21ff0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c   of available sl
22000 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ots. */.        
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22020 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61    /*   Must be a
22030 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61   power of 2 grea
22040 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20  ter than or */. 
22050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22060 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71           /*   eq
22070 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e  ual to 1 */.  in
22080 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  t count;        
22090 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
220a0 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f  of currently slo
220b0 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73  ts filled */.  s
220c0 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a  truct s_x3node *
220d0 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  tbl;  /* The dat
220e0 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f  a stored here */
220f0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  .  struct s_x3no
22100 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73  de **ht;  /* Has
22110 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b  h table for look
22120 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  ups */.};../* Th
22130 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
22140 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
22150 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20  cture for every 
22160 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  data element.** 
22170 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76  in an associativ
22180 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
22190 22 78 33 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  "x3"..*/.typedef
221a0 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65   struct s_x3node
221b0 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74   {.  struct stat
221c0 65 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  e *data;        
221d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
221e0 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63   data */.  struc
221f0 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 20 20  t config *key;  
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22210 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
22220 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65   struct s_x3node
22230 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78   *next;   /* Nex
22240 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  t entry with the
22250 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20   same hash */.  
22260 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
22270 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76  **from;  /* Prev
22280 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78  ious link */.} x
22290 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65  3node;../* There
222a0 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73   is only one ins
222b0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72  tance of the arr
222c0 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  ay, which is the
222d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74   following */.st
222e0 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 33  atic struct s_x3
222f0 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63   *x3a;../* Alloc
22300 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69  ate a new associ
22310 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76  ative array */.v
22320 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28 29  oid State_init()
22330 7b 0a 20 20 69 66 28 20 78 33 61 20 29 20 72 65  {.  if( x3a ) re
22340 74 75 72 6e 3b 0a 20 20 78 33 61 20 3d 20 28 73  turn;.  x3a = (s
22350 74 72 75 63 74 20 73 5f 78 33 2a 29 6d 61 6c 6c  truct s_x3*)mall
22360 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
22370 74 20 73 5f 78 33 29 20 29 3b 0a 20 20 69 66 28  t s_x3) );.  if(
22380 20 78 33 61 20 29 7b 0a 20 20 20 20 78 33 61 2d   x3a ){.    x3a-
22390 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20  >size = 128;.   
223a0 20 78 33 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b   x3a->count = 0;
223b0 0a 20 20 20 20 78 33 61 2d 3e 74 62 6c 20 3d 20  .    x3a->tbl = 
223c0 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x3node*)malloc(
223d0 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28   .      (sizeof(
223e0 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x3node) + sizeof
223f0 28 78 33 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29  (x3node*))*128 )
22400 3b 0a 20 20 20 20 69 66 28 20 78 33 61 2d 3e 74  ;.    if( x3a->t
22410 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  bl==0 ){.      f
22420 72 65 65 28 78 33 61 29 3b 0a 20 20 20 20 20 20  ree(x3a);.      
22430 78 33 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  x3a = 0;.    }el
22440 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
22450 0a 20 20 20 20 20 20 78 33 61 2d 3e 68 74 20 3d  .      x3a->ht =
22460 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61   (x3node**)&(x3a
22470 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20  ->tbl[128]);.   
22480 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32     for(i=0; i<12
22490 38 3b 20 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b  8; i++) x3a->ht[
224a0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
224b0 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20  }.}./* Insert a 
224c0 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
224d0 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75  the array.  Retu
224e0 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65  rn TRUE if succe
224f0 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20  ssful..** Prior 
22500 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61  data with the sa
22510 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76  me key is NOT ov
22520 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74  erwritten */.int
22530 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74   State_insert(st
22540 72 75 63 74 20 73 74 61 74 65 20 2a 64 61 74 61  ruct state *data
22550 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
22560 2a 6b 65 79 29 0a 7b 0a 20 20 78 33 6e 6f 64 65  *key).{.  x3node
22570 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20   *np;.  int h;. 
22580 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20   int ph;..  if( 
22590 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x3a==0 ) return 
225a0 30 3b 0a 20 20 70 68 20 3d 20 73 74 61 74 65 68  0;.  ph = stateh
225b0 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20  ash(key);.  h = 
225c0 70 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d  ph & (x3a->size-
225d0 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e  1);.  np = x3a->
225e0 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
225f0 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
22600 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b  atecmp(np->key,k
22610 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ey)==0 ){.      
22620 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65  /* An existing e
22630 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
22640 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e  me key is found.
22650 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   */.      /* Fai
22660 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72  l because overwr
22670 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ite is not allow
22680 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  s. */.      retu
22690 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
226a0 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
226b0 20 7d 0a 20 20 69 66 28 20 78 33 61 2d 3e 63 6f   }.  if( x3a->co
226c0 75 6e 74 3e 3d 78 33 61 2d 3e 73 69 7a 65 20 29  unt>=x3a->size )
226d0 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
226e0 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
226f0 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20  able bigger */. 
22700 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20     int i,size;. 
22710 20 20 20 73 74 72 75 63 74 20 73 5f 78 33 20 61     struct s_x3 a
22720 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e  rray;.    array.
22730 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 33  size = size = x3
22740 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61  a->size*2;.    a
22750 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 33 61  rray.count = x3a
22760 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72  ->count;.    arr
22770 61 79 2e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65  ay.tbl = (x3node
22780 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  *)malloc(.      
22790 28 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20  (sizeof(x3node) 
227a0 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a  + sizeof(x3node*
227b0 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69  ))*size );.    i
227c0 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20  f( array.tbl==0 
227d0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
227e0 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c  Fail due to mall
227f0 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20  oc failure */.  
22800 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 33    array.ht = (x3
22810 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74  node**)&(array.t
22820 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66  bl[size]);.    f
22830 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20  or(i=0; i<size; 
22840 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d  i++) array.ht[i]
22850 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
22860 30 3b 20 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b  0; i<x3a->count;
22870 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e   i++){.      x3n
22880 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77  ode *oldnp, *new
22890 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20  np;.      oldnp 
228a0 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29  = &(x3a->tbl[i])
228b0 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 61 74  ;.      h = stat
228c0 65 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79  ehash(oldnp->key
228d0 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20  ) & (size-1);.  
228e0 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
228f0 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
22900 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
22910 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
22920 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
22930 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
22940 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
22950 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
22960 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64  newnp->key = old
22970 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e  np->key;.      n
22980 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64  ewnp->data = old
22990 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20  np->data;.      
229a0 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  newnp->from = &(
229b0 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20  array.ht[h]);.  
229c0 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20      array.ht[h] 
229d0 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20  = newnp;.    }. 
229e0 20 20 20 66 72 65 65 28 78 33 61 2d 3e 74 62 6c     free(x3a->tbl
229f0 29 3b 0a 20 20 20 20 2a 78 33 61 20 3d 20 61 72  );.    *x3a = ar
22a00 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e  ray;.  }.  /* In
22a10 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74  sert the new dat
22a20 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20  a */.  h = ph & 
22a30 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x3a->size-1);. 
22a40 20 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c   np = &(x3a->tbl
22a50 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b  [x3a->count++]);
22a60 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79  .  np->key = key
22a70 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
22a80 61 74 61 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e  ata;.  if( x3a->
22a90 68 74 5b 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b  ht[h] ) x3a->ht[
22aa0 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
22ab0 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
22ac0 78 74 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b  xt = x3a->ht[h];
22ad0 0a 20 20 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x3a->ht[h] = 
22ae0 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
22af0 20 26 28 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x3a->ht[h]);.
22b00 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
22b10 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
22b20 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
22b30 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
22b40 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
22b50 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
22b60 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20   key. */.struct 
22b70 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69 6e  state *State_fin
22b80 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  d(struct config 
22b90 2a 6b 65 79 29 0a 7b 0a 20 20 69 6e 74 20 68 3b  *key).{.  int h;
22ba0 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a  .  x3node *np;..
22bb0 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72    if( x3a==0 ) r
22bc0 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73  eturn 0;.  h = s
22bd0 74 61 74 65 68 61 73 68 28 6b 65 79 29 20 26 20  tatehash(key) & 
22be0 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x3a->size-1);. 
22bf0 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d   np = x3a->ht[h]
22c00 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
22c10 0a 20 20 20 20 69 66 28 20 73 74 61 74 65 63 6d  .    if( statecm
22c20 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d  p(np->key,key)==
22c30 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e  0 ) break;.    n
22c40 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
22c50 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20  }.  return np ? 
22c60 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a  np->data : 0;.}.
22c70 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72  ./* Return an ar
22c80 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ray of pointers 
22c90 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74  to all data in t
22ca0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65  he table..** The
22cb0 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e   array is obtain
22cc0 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  ed from malloc. 
22cd0 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
22ce0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
22cf0 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f  n.** problems, o
22d00 72 20 69 66 20 74 68 65 20 61 72 72 61 79 20 69  r if the array i
22d10 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75  s empty. */.stru
22d20 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65  ct state **State
22d30 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73  _arrayof().{.  s
22d40 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 61 72  truct state **ar
22d50 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a  ray;.  int i,siz
22d60 65 3b 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20  e;.  if( x3a==0 
22d70 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69  ) return 0;.  si
22d80 7a 65 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b  ze = x3a->count;
22d90 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74 72 75  .  array = (stru
22da0 63 74 20 73 74 61 74 65 20 2a 2a 29 6d 61 6c 6c  ct state **)mall
22db0 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
22dc0 74 20 73 74 61 74 65 20 2a 29 2a 73 69 7a 65 20  t state *)*size 
22dd0 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29  );.  if( array )
22de0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
22df0 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
22e00 79 5b 69 5d 20 3d 20 78 33 61 2d 3e 74 62 6c 5b  y[i] = x3a->tbl[
22e10 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72  i].data;.  }.  r
22e20 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a  eturn array;.}..
22e30 2f 2a 20 48 61 73 68 20 61 20 63 6f 6e 66 69 67  /* Hash a config
22e40 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41  uration */.PRIVA
22e50 54 45 20 69 6e 74 20 63 6f 6e 66 69 67 68 61 73  TE int confighas
22e60 68 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  h(struct config 
22e70 2a 61 29 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b  *a).{.  int h=0;
22e80 0a 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61  .  h = h*571 + a
22e90 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b  ->rp->index*37 +
22ea0 20 61 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72   a->dot;.  retur
22eb0 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65  n h;.}../* There
22ec0 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
22ed0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
22ee0 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  g structure for 
22ef0 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74  each.** associat
22f00 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
22f10 65 20 22 78 34 22 2e 0a 2a 2f 0a 73 74 72 75 63  e "x4"..*/.struc
22f20 74 20 73 5f 78 34 20 7b 0a 20 20 69 6e 74 20 73  t s_x4 {.  int s
22f30 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
22f40 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
22f50 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c   of available sl
22f60 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ots. */.        
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61    /*   Must be a
22f90 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61   power of 2 grea
22fa0 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20  ter than or */. 
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71           /*   eq
22fd0 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e  ual to 1 */.  in
22fe0 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  t count;        
22ff0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23000 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f  of currently slo
23010 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73  ts filled */.  s
23020 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a  truct s_x4node *
23030 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  tbl;  /* The dat
23040 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f  a stored here */
23050 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f  .  struct s_x4no
23060 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73  de **ht;  /* Has
23070 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b  h table for look
23080 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  ups */.};../* Th
23090 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
230a0 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
230b0 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20  cture for every 
230c0 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  data element.** 
230d0 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76  in an associativ
230e0 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
230f0 22 78 34 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  "x4"..*/.typedef
23100 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65   struct s_x4node
23110 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66   {.  struct conf
23120 69 67 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ig *data;       
23130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23140 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75  e data */.  stru
23150 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 6e 65 78  ct s_x4node *nex
23160 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  t;   /* Next ent
23170 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
23180 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63   hash */.  struc
23190 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 66 72 6f  t s_x4node **fro
231a0 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  m;  /* Previous 
231b0 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65  link */.} x4node
231c0 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
231d0 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  nly one instance
231e0 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77   of the array, w
231f0 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c  hich is the foll
23200 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  owing */.static 
23210 73 74 72 75 63 74 20 73 5f 78 34 20 2a 78 34 61  struct s_x4 *x4a
23220 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  ;../* Allocate a
23230 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65   new associative
23240 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 43   array */.void C
23250 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28  onfigtable_init(
23260 29 7b 0a 20 20 69 66 28 20 78 34 61 20 29 20 72  ){.  if( x4a ) r
23270 65 74 75 72 6e 3b 0a 20 20 78 34 61 20 3d 20 28  eturn;.  x4a = (
23280 73 74 72 75 63 74 20 73 5f 78 34 2a 29 6d 61 6c  struct s_x4*)mal
23290 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
232a0 63 74 20 73 5f 78 34 29 20 29 3b 0a 20 20 69 66  ct s_x4) );.  if
232b0 28 20 78 34 61 20 29 7b 0a 20 20 20 20 78 34 61  ( x4a ){.    x4a
232c0 2d 3e 73 69 7a 65 20 3d 20 36 34 3b 0a 20 20 20  ->size = 64;.   
232d0 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b   x4a->count = 0;
232e0 0a 20 20 20 20 78 34 61 2d 3e 74 62 6c 20 3d 20  .    x4a->tbl = 
232f0 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x4node*)malloc(
23300 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28   .      (sizeof(
23310 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x4node) + sizeof
23320 28 78 34 6e 6f 64 65 2a 29 29 2a 36 34 20 29 3b  (x4node*))*64 );
23330 0a 20 20 20 20 69 66 28 20 78 34 61 2d 3e 74 62  .    if( x4a->tb
23340 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  l==0 ){.      fr
23350 65 65 28 78 34 61 29 3b 0a 20 20 20 20 20 20 78  ee(x4a);.      x
23360 34 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  4a = 0;.    }els
23370 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
23380 20 20 20 20 20 20 78 34 61 2d 3e 68 74 20 3d 20        x4a->ht = 
23390 28 78 34 6e 6f 64 65 2a 2a 29 26 28 78 34 61 2d  (x4node**)&(x4a-
233a0 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20 20 20 20 20  >tbl[64]);.     
233b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 36 34 3b 20   for(i=0; i<64; 
233c0 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20  i++) x4a->ht[i] 
233d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
233e0 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  ./* Insert a new
233f0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
23400 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
23410 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66  TRUE if successf
23420 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74  ul..** Prior dat
23430 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  a with the same 
23440 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77  key is NOT overw
23450 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f  ritten */.int Co
23460 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74  nfigtable_insert
23470 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
23480 64 61 74 61 29 0a 7b 0a 20 20 78 34 6e 6f 64 65  data).{.  x4node
23490 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20   *np;.  int h;. 
234a0 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20   int ph;..  if( 
234b0 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x4a==0 ) return 
234c0 30 3b 0a 20 20 70 68 20 3d 20 63 6f 6e 66 69 67  0;.  ph = config
234d0 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20  hash(data);.  h 
234e0 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a  = ph & (x4a->siz
234f0 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61  e-1);.  np = x4a
23500 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
23510 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
23520 43 6f 6e 66 69 67 63 6d 70 28 28 63 6f 6e 73 74  Configcmp((const
23530 20 63 68 61 72 20 2a 29 20 6e 70 2d 3e 64 61 74   char *) np->dat
23540 61 2c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  a,(const char *)
23550 20 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20   data)==0 ){.   
23560 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
23570 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  g entry with the
23580 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75   same key is fou
23590 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  nd. */.      /* 
235a0 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65  Fail because ove
235b0 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c  rwrite is not al
235c0 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lows. */.      r
235d0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
235e0 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
235f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 34 61 2d  ;.  }.  if( x4a-
23600 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a  >count>=x4a->siz
23610 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  e ){.    /* Need
23620 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
23630 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a  h table bigger *
23640 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65  /.    int i,size
23650 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
23660 34 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  4 array;.    arr
23670 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d  ay.size = size =
23680 20 78 34 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20   x4a->size*2;.  
23690 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20    array.count = 
236a0 78 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20  x4a->count;.    
236b0 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 34 6e  array.tbl = (x4n
236c0 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20  ode*)malloc(.   
236d0 20 20 20 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64     (sizeof(x4nod
236e0 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f  e) + sizeof(x4no
236f0 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20  de*))*size );.  
23700 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d    if( array.tbl=
23710 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
23720 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d  /* Fail due to m
23730 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f  alloc failure */
23740 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20  .    array.ht = 
23750 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61  (x4node**)&(arra
23760 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20  y.tbl[size]);.  
23770 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
23780 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74  e; i++) array.ht
23790 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  [i] = 0;.    for
237a0 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75  (i=0; i<x4a->cou
237b0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
237c0 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a  x4node *oldnp, *
237d0 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64  newnp;.      old
237e0 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b  np = &(x4a->tbl[
237f0 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 63  i]);.      h = c
23800 6f 6e 66 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d  onfighash(oldnp-
23810 3e 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d 31  >data) & (size-1
23820 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
23830 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
23840 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
23850 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
23860 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
23870 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
23880 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
23890 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
238a0 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61       newnp->data
238b0 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a   = oldnp->data;.
238c0 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f        newnp->fro
238d0 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68  m = &(array.ht[h
238e0 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e  ]);.      array.
238f0 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20  ht[h] = newnp;. 
23900 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 34     }.    free(x4
23910 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34  a->tbl);.    *x4
23920 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20  a = array;.  }. 
23930 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
23940 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d  ew data */.  h =
23950 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65   ph & (x4a->size
23960 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34  -1);.  np = &(x4
23970 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e  a->tbl[x4a->coun
23980 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74  t++]);.  np->dat
23990 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
239a0 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61  x4a->ht[h] ) x4a
239b0 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
239c0 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
239d0 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68  p->next = x4a->h
239e0 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b  t[h];.  x4a->ht[
239f0 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
23a00 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b  rom = &(x4a->ht[
23a10 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
23a20 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
23a30 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
23a40 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
23a50 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
23a60 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
23a70 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
23a80 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
23a90 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74  figtable_find(st
23aa0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
23ab0 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78  ).{.  int h;.  x
23ac0 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  4node *np;..  if
23ad0 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x4a==0 ) retur
23ae0 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69  n 0;.  h = confi
23af0 67 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 34  ghash(key) & (x4
23b00 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
23b10 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x4a->ht[h];. 
23b20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
23b30 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28    if( Configcmp(
23b40 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6e  (const char *) n
23b50 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20 63  p->data,(const c
23b60 68 61 72 20 2a 29 20 6b 65 79 29 3d 3d 30 20 29  har *) key)==0 )
23b70 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
23b80 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
23b90 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
23ba0 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
23bb0 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61   Remove all data
23bc0 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e   from the table.
23bd0 20 20 50 61 73 73 20 65 61 63 68 20 64 61 74 61    Pass each data
23be0 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
23bf0 20 22 66 22 0a 2a 2a 20 61 73 20 69 74 20 69 73   "f".** as it is
23c00 20 72 65 6d 6f 76 65 64 2e 20 20 28 22 66 22 20   removed.  ("f" 
23c10 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61  may be null to a
23c20 76 6f 69 64 20 74 68 69 73 20 73 74 65 70 2e 29  void this step.)
23c30 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74   */.void Configt
23c40 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74 28 2a  able_clear(int(*
23c50 66 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  f)(struct config
23c60 20 2a 29 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a   *)).{.  int i;.
23c70 20 20 69 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20    if( x4a==0 || 
23c80 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20  x4a->count==0 ) 
23c90 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 66 20  return;.  if( f 
23ca0 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61  ) for(i=0; i<x4a
23cb0 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a  ->count; i++) (*
23cc0 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64  f)(x4a->tbl[i].d
23cd0 61 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ata);.  for(i=0;
23ce0 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b   i<x4a->size; i+
23cf0 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x4a->ht[i] = 
23d00 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20  0;.  x4a->count 
23d10 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
23d20 0a                                               .