/ Hex Artifact Content
Login

Artifact 949328f67cac94969d3112b105b8457edf27f44e:


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 23 69 66 64 65 66 20 5f 5f 63 70 6c 75 73  _.#ifdef __cplus
0220: 70 6c 75 73 0a 65 78 74 65 72 6e 20 22 43 22 20  plus.extern "C" 
0230: 7b 0a 23 65 6e 64 69 66 0a 65 78 74 65 72 6e 20  {.#endif.extern 
0240: 69 6e 74 20 61 63 63 65 73 73 28 63 6f 6e 73 74  int access(const
0250: 20 63 68 61 72 20 2a 70 61 74 68 2c 20 69 6e 74   char *path, int
0260: 20 6d 6f 64 65 29 3b 0a 23 69 66 64 65 66 20 5f   mode);.#ifdef _
0270: 5f 63 70 6c 75 73 70 6c 75 73 0a 7d 0a 23 65 6e  _cplusplus.}.#en
0280: 64 69 66 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75  dif.#else.#inclu
0290: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 65  de <unistd.h>.#e
02a0: 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66 69 6e 65  ndif../* #define
02b0: 20 50 52 49 56 41 54 45 20 73 74 61 74 69 63 20   PRIVATE static 
02c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 49 56 41  */.#define PRIVA
02d0: 54 45 0a 0a 23 69 66 64 65 66 20 54 45 53 54 0a  TE..#ifdef TEST.
02e0: 23 64 65 66 69 6e 65 20 4d 41 58 52 48 53 20 35  #define MAXRHS 5
02f0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6c 6f         /* Set lo
0300: 77 20 74 6f 20 65 78 65 72 63 69 73 65 20 65 78  w to exercise ex
0310: 63 65 70 74 69 6f 6e 20 63 6f 64 65 20 2a 2f 0a  ception code */.
0320: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 41  #else.#define MA
0330: 58 52 48 53 20 31 30 30 30 0a 23 65 6e 64 69 66  XRHS 1000.#endif
0340: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 6f  ..static int sho
0350: 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e 66 6c  wPrecedenceConfl
0360: 69 63 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ict = 0;.static 
0370: 63 68 61 72 20 2a 6d 73 6f 72 74 28 63 68 61 72  char *msort(char
0380: 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 28 2a 29 28  *,char**,int(*)(
0390: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
03a0: 74 20 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a 0a 2a  t char*));../*.*
03b0: 2a 20 43 6f 6d 70 69 6c 65 72 73 20 61 72 65 20  * Compilers are 
03c0: 67 65 74 74 69 6e 67 20 69 6e 63 72 65 61 73 69  getting increasi
03d0: 6e 67 6c 79 20 70 65 64 61 6e 74 69 63 20 61 62  ngly pedantic ab
03e0: 6f 75 74 20 74 79 70 65 20 63 6f 6e 76 65 72 73  out type convers
03f0: 69 6f 6e 73 0a 2a 2a 20 61 73 20 43 20 65 76 6f  ions.** as C evo
0400: 6c 76 65 73 20 65 76 65 72 20 63 6c 6f 73 65 72  lves ever closer
0410: 20 74 6f 20 41 64 61 2e 2e 2e 2e 20 20 54 6f 20   to Ada....  To 
0420: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
0430: 6c 61 74 65 73 74 20 70 72 6f 62 6c 65 6d 73 0a  latest problems.
0440: 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64 65  ** we have to de
0450: 66 69 6e 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  fine the followi
0460: 6e 67 20 76 61 72 69 61 6e 74 20 6f 66 20 73 74  ng variant of st
0470: 72 6c 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  rlen()..*/.#defi
0480: 6e 65 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 58  ne lemonStrlen(X
0490: 29 20 20 20 28 28 69 6e 74 29 73 74 72 6c 65 6e  )   ((int)strlen
04a0: 28 58 29 29 0a 0a 2f 2a 20 61 20 66 65 77 20 66  (X))../* a few f
04b0: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
04c0: 6f 6e 73 2e 2e 2e 20 2a 2f 0a 73 74 72 75 63 74  ons... */.struct
04d0: 20 72 75 6c 65 3b 0a 73 74 72 75 63 74 20 6c 65   rule;.struct le
04e0: 6d 6f 6e 3b 0a 73 74 72 75 63 74 20 61 63 74 69  mon;.struct acti
04f0: 6f 6e 3b 0a 0a 73 74 61 74 69 63 20 73 74 72 75  on;..static stru
0500: 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f  ct action *Actio
0510: 6e 5f 6e 65 77 28 76 6f 69 64 29 3b 0a 73 74 61  n_new(void);.sta
0520: 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f  tic struct actio
0530: 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73  n *Action_sort(s
0540: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b  truct action *);
0550: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
0560: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 62 75 69  om the file "bui
0570: 6c 64 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ld.h" **********
0580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64  **********/.void
05a0: 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65   FindRulePrecede
05b0: 6e 63 65 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e  nces();.void Fin
05c0: 64 46 69 72 73 74 53 65 74 73 28 29 3b 0a 76 6f  dFirstSets();.vo
05d0: 69 64 20 46 69 6e 64 53 74 61 74 65 73 28 29 3b  id FindStates();
05e0: 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28  .void FindLinks(
05f0: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c  );.void FindFoll
0600: 6f 77 53 65 74 73 28 29 3b 0a 76 6f 69 64 20 46  owSets();.void F
0610: 69 6e 64 41 63 74 69 6f 6e 73 28 29 3b 0a 0a 2f  indActions();../
0620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
0630: 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c  he file "configl
0640: 69 73 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ist.h" *********
0650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0660: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 43  ********/.void C
0670: 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 76  onfiglist_init(v
0680: 6f 69 64 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e  oid);.struct con
0690: 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f  fig *Configlist_
06a0: 61 64 64 28 73 74 72 75 63 74 20 72 75 6c 65 20  add(struct rule 
06b0: 2a 2c 20 69 6e 74 29 3b 0a 73 74 72 75 63 74 20  *, int);.struct 
06c0: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
06d0: 73 74 5f 61 64 64 62 61 73 69 73 28 73 74 72 75  st_addbasis(stru
06e0: 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74 29 3b  ct rule *, int);
06f0: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
0700: 5f 63 6c 6f 73 75 72 65 28 73 74 72 75 63 74 20  _closure(struct 
0710: 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 43  lemon *);.void C
0720: 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 76  onfiglist_sort(v
0730: 6f 69 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  oid);.void Confi
0740: 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28  glist_sortbasis(
0750: 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20 63 6f  void);.struct co
0760: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
0770: 5f 72 65 74 75 72 6e 28 76 6f 69 64 29 3b 0a 73  _return(void);.s
0780: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
0790: 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 76  nfiglist_basis(v
07a0: 6f 69 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69  oid);.void Confi
07b0: 67 6c 69 73 74 5f 65 61 74 28 73 74 72 75 63 74  glist_eat(struct
07c0: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64   config *);.void
07d0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65   Configlist_rese
07e0: 74 28 76 6f 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  t(void);../*****
07f0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
0800: 6c 65 20 22 65 72 72 6f 72 2e 68 22 20 2a 2a 2a  le "error.h" ***
0810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0830: 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72  ****/.void Error
0840: 4d 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Msg(const char *
0850: 2c 20 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  , int,const char
0860: 20 2a 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a   *, ...);../****
0870: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
0880: 20 22 6f 70 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a   "option.h" ****
0890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
08a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
08b0: 2a 2a 2a 2a 2a 2a 2f 0a 65 6e 75 6d 20 6f 70 74  ******/.enum opt
08c0: 69 6f 6e 5f 74 79 70 65 20 7b 20 4f 50 54 5f 46  ion_type { OPT_F
08d0: 4c 41 47 3d 31 2c 20 20 4f 50 54 5f 49 4e 54 2c  LAG=1,  OPT_INT,
08e0: 20 20 4f 50 54 5f 44 42 4c 2c 20 20 4f 50 54 5f    OPT_DBL,  OPT_
08f0: 53 54 52 2c 0a 20 20 20 20 20 20 20 20 20 4f 50  STR,.         OP
0900: 54 5f 46 46 4c 41 47 2c 20 4f 50 54 5f 46 49 4e  T_FFLAG, OPT_FIN
0910: 54 2c 20 4f 50 54 5f 46 44 42 4c 2c 20 4f 50 54  T, OPT_FDBL, OPT
0920: 5f 46 53 54 52 7d 3b 0a 73 74 72 75 63 74 20 73  _FSTR};.struct s
0930: 5f 6f 70 74 69 6f 6e 73 20 7b 0a 20 20 65 6e 75  _options {.  enu
0940: 6d 20 6f 70 74 69 6f 6e 5f 74 79 70 65 20 74 79  m option_type ty
0950: 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pe;.  const char
0960: 20 2a 6c 61 62 65 6c 3b 0a 20 20 63 68 61 72 20   *label;.  char 
0970: 2a 61 72 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68  *arg;.  const ch
0980: 61 72 20 2a 6d 65 73 73 61 67 65 3b 0a 7d 3b 0a  ar *message;.};.
0990: 69 6e 74 20 20 20 20 4f 70 74 49 6e 69 74 28 63  int    OptInit(c
09a0: 68 61 72 2a 2a 2c 73 74 72 75 63 74 20 73 5f 6f  har**,struct s_o
09b0: 70 74 69 6f 6e 73 2a 2c 46 49 4c 45 2a 29 3b 0a  ptions*,FILE*);.
09c0: 69 6e 74 20 20 20 20 4f 70 74 4e 41 72 67 73 28  int    OptNArgs(
09d0: 76 6f 69 64 29 3b 0a 63 68 61 72 20 20 2a 4f 70  void);.char  *Op
09e0: 74 41 72 67 28 69 6e 74 29 3b 0a 76 6f 69 64 20  tArg(int);.void 
09f0: 20 20 4f 70 74 45 72 72 28 69 6e 74 29 3b 0a 76    OptErr(int);.v
0a00: 6f 69 64 20 20 20 4f 70 74 50 72 69 6e 74 28 76  oid   OptPrint(v
0a10: 6f 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  oid);../********
0a20: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
0a30: 70 61 72 73 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  parse.h" *******
0a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a60: 2a 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 73  **/.void Parse(s
0a70: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
0a80: 70 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  p);../********* 
0a90: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70  From the file "p
0aa0: 6c 69 6e 6b 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  link.h" ********
0ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
0ad0: 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 50  .struct plink *P
0ae0: 6c 69 6e 6b 5f 6e 65 77 28 76 6f 69 64 29 3b 0a  link_new(void);.
0af0: 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 73  void Plink_add(s
0b00: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20  truct plink **, 
0b10: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
0b20: 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70  ;.void Plink_cop
0b30: 79 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  y(struct plink *
0b40: 2a 2c 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  *, struct plink 
0b50: 2a 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64  *);.void Plink_d
0b60: 65 6c 65 74 65 28 73 74 72 75 63 74 20 70 6c 69  elete(struct pli
0b70: 6e 6b 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  nk *);../*******
0b80: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0b90: 65 20 22 72 65 70 6f 72 74 2e 68 22 20 2a 2a 2a  e "report.h" ***
0ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0bc0: 2a 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74  **/.void Reprint
0bd0: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29  (struct lemon *)
0be0: 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74  ;.void ReportOut
0bf0: 70 75 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  put(struct lemon
0c00: 20 2a 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74   *);.void Report
0c10: 54 61 62 6c 65 28 73 74 72 75 63 74 20 6c 65 6d  Table(struct lem
0c20: 6f 6e 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64  on *, int);.void
0c30: 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 73 74   ReportHeader(st
0c40: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76  ruct lemon *);.v
0c50: 6f 69 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c  oid CompressTabl
0c60: 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  es(struct lemon 
0c70: 2a 29 3b 0a 76 6f 69 64 20 52 65 73 6f 72 74 53  *);.void ResortS
0c80: 74 61 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d  tates(struct lem
0c90: 6f 6e 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  on *);../*******
0ca0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0cb0: 65 20 22 73 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a  e "set.h" ******
0cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ce0: 2a 2a 2f 0a 76 6f 69 64 20 20 53 65 74 53 69 7a  **/.void  SetSiz
0cf0: 65 28 69 6e 74 29 3b 20 20 20 20 20 20 20 20 20  e(int);         
0d00: 20 20 20 20 2f 2a 20 41 6c 6c 20 73 65 74 73 20      /* All sets 
0d10: 77 69 6c 6c 20 62 65 20 6f 66 20 73 69 7a 65 20  will be of size 
0d20: 4e 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65  N */.char *SetNe
0d30: 77 28 76 6f 69 64 29 3b 20 20 20 20 20 20 20 20  w(void);        
0d40: 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20         /* A new 
0d50: 73 65 74 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20  set for element 
0d60: 30 2e 2e 4e 20 2a 2f 0a 76 6f 69 64 20 20 53 65  0..N */.void  Se
0d70: 74 46 72 65 65 28 63 68 61 72 2a 29 3b 20 20 20  tFree(char*);   
0d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 61            /* Dea
0d90: 6c 6c 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f  llocate a set */
0da0: 0a 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 76  ..char *SetNew(v
0db0: 6f 69 64 29 3b 20 20 20 20 20 20 20 20 20 20 20  oid);           
0dc0: 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 65 74      /* A new set
0dd0: 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e   for element 0..
0de0: 4e 20 2a 2f 0a 69 6e 74 20 53 65 74 41 64 64 28  N */.int SetAdd(
0df0: 63 68 61 72 2a 2c 69 6e 74 29 3b 20 20 20 20 20  char*,int);     
0e00: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 65 6c         /* Add el
0e10: 65 6d 65 6e 74 20 74 6f 20 61 20 73 65 74 20 2a  ement to a set *
0e20: 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28 63  /.int SetUnion(c
0e30: 68 61 72 20 2a 2c 63 68 61 72 20 2a 29 3b 20 20  har *,char *);  
0e40: 20 20 2f 2a 20 41 20 3c 2d 20 41 20 55 20 42 2c    /* A <- A U B,
0e50: 20 74 68 72 75 20 65 6c 65 6d 65 6e 74 20 4e 20   thru element N 
0e60: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 65 74 46 69  */.#define SetFi
0e70: 6e 64 28 58 2c 59 29 20 28 58 5b 59 5d 29 20 20  nd(X,Y) (X[Y])  
0e80: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0e90: 59 20 69 73 20 69 6e 20 73 65 74 20 58 20 2a 2f  Y is in set X */
0ea0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
0eb0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 74 72  om the file "str
0ec0: 75 63 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  uct.h" *********
0ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
0ef0: 0a 2a 2a 20 50 72 69 6e 63 69 70 61 6c 20 64 61  .** Principal da
0f00: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  ta structures fo
0f10: 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
0f20: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
0f30: 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  ..typedef enum {
0f40: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3d 30 2c 20 4c  LEMON_FALSE=0, L
0f50: 45 4d 4f 4e 5f 54 52 55 45 7d 20 42 6f 6f 6c 65  EMON_TRUE} Boole
0f60: 61 6e 3b 0a 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20  an;../* Symbols 
0f70: 28 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e  (terminals and n
0f80: 6f 6e 74 65 72 6d 69 6e 61 6c 73 29 20 6f 66 20  onterminals) of 
0f90: 74 68 65 20 67 72 61 6d 6d 61 72 20 61 72 65 20  the grammar are 
0fa0: 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
0fb0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 65   following: */.e
0fc0: 6e 75 6d 20 73 79 6d 62 6f 6c 5f 74 79 70 65 20  num symbol_type 
0fd0: 7b 0a 20 20 54 45 52 4d 49 4e 41 4c 2c 0a 20 20  {.  TERMINAL,.  
0fe0: 4e 4f 4e 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 4d  NONTERMINAL,.  M
0ff0: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 0a 7d 3b 0a  ULTITERMINAL.};.
1000: 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 7b 0a 20  enum e_assoc {. 
1010: 20 20 20 4c 45 46 54 2c 0a 20 20 20 20 52 49 47     LEFT,.    RIG
1020: 48 54 2c 0a 20 20 20 20 4e 4f 4e 45 2c 0a 20 20  HT,.    NONE,.  
1030: 20 20 55 4e 4b 0a 7d 3b 0a 73 74 72 75 63 74 20    UNK.};.struct 
1040: 73 79 6d 62 6f 6c 20 7b 0a 20 20 63 6f 6e 73 74  symbol {.  const
1050: 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20   char *name;    
1060: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1070: 68 65 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69  he symbol */.  i
1080: 6e 74 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20  nt index;       
1090: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
10a0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
10b0: 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75   symbol */.  enu
10c0: 6d 20 73 79 6d 62 6f 6c 5f 74 79 70 65 20 74 79  m symbol_type ty
10d0: 70 65 3b 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 73  pe;   /* Symbols
10e0: 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20   are all either 
10f0: 54 45 52 4d 49 4e 41 4c 53 20 6f 72 20 4e 54 73  TERMINALS or NTs
1100: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
1110: 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f  e *rule;       /
1120: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
1130: 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73 20 28   rules of this (
1140: 69 66 20 61 6e 20 4e 54 29 20 2a 2f 0a 20 20 73  if an NT) */.  s
1150: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61  truct symbol *fa
1160: 6c 6c 62 61 63 6b 3b 20 2f 2a 20 66 61 6c 6c 62  llback; /* fallb
1170: 61 63 6b 20 74 6f 6b 65 6e 20 69 6e 20 63 61 73  ack token in cas
1180: 65 20 74 68 69 73 20 74 6f 6b 65 6e 20 64 6f 65  e this token doe
1190: 73 6e 27 74 20 70 61 72 73 65 20 2a 2f 0a 20 20  sn't parse */.  
11a0: 69 6e 74 20 70 72 65 63 3b 20 20 20 20 20 20 20  int prec;       
11b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63           /* Prec
11c0: 65 64 65 6e 63 65 20 69 66 20 64 65 66 69 6e 65  edence if define
11d0: 64 20 28 2d 31 20 6f 74 68 65 72 77 69 73 65 29  d (-1 otherwise)
11e0: 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73   */.  enum e_ass
11f0: 6f 63 20 61 73 73 6f 63 3b 20 20 20 20 20 20 2f  oc assoc;      /
1200: 2a 20 41 73 73 6f 63 69 61 74 69 76 69 74 79 20  * Associativity 
1210: 69 66 20 70 72 65 63 65 64 65 6e 63 65 20 69 73  if precedence is
1220: 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20 63 68   defined */.  ch
1230: 61 72 20 2a 66 69 72 73 74 73 65 74 3b 20 20 20  ar *firstset;   
1240: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 2d         /* First-
1250: 73 65 74 20 66 6f 72 20 61 6c 6c 20 72 75 6c 65  set for all rule
1260: 73 20 6f 66 20 74 68 69 73 20 73 79 6d 62 6f 6c  s of this symbol
1270: 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 6c 61   */.  Boolean la
1280: 6d 62 64 61 3b 20 20 20 20 20 20 20 20 20 20 2f  mbda;          /
1290: 2a 20 54 72 75 65 20 69 66 20 4e 54 20 61 6e 64  * True if NT and
12a0: 20 63 61 6e 20 67 65 6e 65 72 61 74 65 20 61 6e   can generate an
12b0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 2a 2f   empty string */
12c0: 0a 20 20 69 6e 74 20 75 73 65 43 6e 74 3b 20 20  .  int useCnt;  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12e0: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 75  umber of times u
12f0: 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64  sed */.  char *d
1300: 65 73 74 72 75 63 74 6f 72 3b 20 20 20 20 20 20  estructor;      
1310: 20 20 2f 2a 20 43 6f 64 65 20 77 68 69 63 68 20    /* Code which 
1320: 65 78 65 63 75 74 65 73 20 77 68 65 6e 65 76 65  executes wheneve
1330: 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 69 73  r this symbol is
1340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1350: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
1360: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73  opped from the s
1370: 74 61 63 6b 20 64 75 72 69 6e 67 20 65 72 72 6f  tack during erro
1380: 72 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a  r processing */.
1390: 20 20 69 6e 74 20 64 65 73 74 4c 69 6e 65 6e 6f    int destLineno
13a0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  ;          /* Li
13b0: 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74  ne number for st
13c0: 61 72 74 20 6f 66 20 64 65 73 74 72 75 63 74 6f  art of destructo
13d0: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 61 74  r */.  char *dat
13e0: 61 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  atype;          
13f0: 2f 2a 20 54 68 65 20 64 61 74 61 20 74 79 70 65  /* The data type
1400: 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   of information 
1410: 68 65 6c 64 20 62 79 20 74 68 69 73 0a 20 20 20  held by this.   
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63          ** objec
1440: 74 2e 20 4f 6e 6c 79 20 75 73 65 64 20 69 66 20  t. Only used if 
1450: 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41  type==NONTERMINA
1460: 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 74 6e 75 6d  L */.  int dtnum
1470: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1480: 2f 2a 20 54 68 65 20 64 61 74 61 20 74 79 70 65  /* The data type
1490: 20 6e 75 6d 62 65 72 2e 20 20 49 6e 20 74 68 65   number.  In the
14a0: 20 70 61 72 73 65 72 2c 20 74 68 65 20 76 61 6c   parser, the val
14b0: 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ue.             
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
14d0: 20 73 74 61 63 6b 20 69 73 20 61 20 75 6e 69 6f   stack is a unio
14e0: 6e 2e 20 20 54 68 65 20 2e 79 79 25 64 20 65 6c  n.  The .yy%d el
14f0: 65 6d 65 6e 74 20 6f 66 20 74 68 69 73 0a 20 20  ement of this.  
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1510: 20 20 20 20 20 20 20 20 20 2a 2a 20 75 6e 69 6f           ** unio
1520: 6e 20 69 73 20 74 68 65 20 63 6f 72 72 65 63 74  n is the correct
1530: 20 64 61 74 61 20 74 79 70 65 20 66 6f 72 20 74   data type for t
1540: 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
1550: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1560: 20 66 69 65 6c 64 73 20 61 72 65 20 75 73 65 64   fields are used
1570: 20 62 79 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41   by MULTITERMINA
1580: 4c 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74  Ls only */.  int
1590: 20 6e 73 75 62 73 79 6d 3b 20 20 20 20 20 20 20   nsubsym;       
15a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15b0: 6f 66 20 63 6f 6e 73 74 69 74 75 65 6e 74 20 73  of constituent s
15c0: 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 4d 55  ymbols in the MU
15d0: 4c 54 49 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  LTI */.  struct 
15e0: 73 79 6d 62 6f 6c 20 2a 2a 73 75 62 73 79 6d 3b  symbol **subsym;
15f0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f    /* Array of co
1600: 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c  nstituent symbol
1610: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68  s */.};../* Each
1620: 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65   production rule
1630: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
1640: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
1650: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
1660: 72 75 63 74 75 72 65 2e 20 20 2a 2f 0a 73 74 72  ructure.  */.str
1670: 75 63 74 20 72 75 6c 65 20 7b 0a 20 20 73 74 72  uct rule {.  str
1680: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b  uct symbol *lhs;
1690: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61        /* Left-ha
16a0: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 72  nd side of the r
16b0: 75 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ule */.  const c
16c0: 68 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20  har *lhsalias;  
16d0: 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74    /* Alias for t
16e0: 68 65 20 4c 48 53 20 28 4e 55 4c 4c 20 69 66 20  he LHS (NULL if 
16f0: 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6c  none) */.  int l
1700: 68 73 53 74 61 72 74 3b 20 20 20 20 20 20 20 20  hsStart;        
1710: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c      /* True if l
1720: 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73  eft-hand side is
1730: 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f   the start symbo
1740: 6c 20 2a 2f 0a 20 20 69 6e 74 20 72 75 6c 65 6c  l */.  int rulel
1750: 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ine;            
1760: 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66  /* Line number f
1770: 6f 72 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20  or the rule */. 
1780: 20 69 6e 74 20 6e 72 68 73 3b 20 20 20 20 20 20   int nrhs;      
1790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
17a0: 62 65 72 20 6f 66 20 52 48 53 20 73 79 6d 62 6f  ber of RHS symbo
17b0: 6c 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ls */.  struct s
17c0: 79 6d 62 6f 6c 20 2a 2a 72 68 73 3b 20 20 20 20  ymbol **rhs;    
17d0: 20 2f 2a 20 54 68 65 20 52 48 53 20 73 79 6d 62   /* The RHS symb
17e0: 6f 6c 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ols */.  const c
17f0: 68 61 72 20 2a 2a 72 68 73 61 6c 69 61 73 3b 20  har **rhsalias; 
1800: 20 20 2f 2a 20 41 6e 20 61 6c 69 61 73 20 66 6f    /* An alias fo
1810: 72 20 65 61 63 68 20 52 48 53 20 73 79 6d 62 6f  r each RHS symbo
1820: 6c 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29  l (NULL if none)
1830: 20 2a 2f 0a 20 20 69 6e 74 20 6c 69 6e 65 3b 20   */.  int line; 
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1850: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 61 74  * Line number at
1860: 20 77 68 69 63 68 20 63 6f 64 65 20 62 65 67 69   which code begi
1870: 6e 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ns */.  const ch
1880: 61 72 20 2a 63 6f 64 65 3b 20 20 20 20 20 20 20  ar *code;       
1890: 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 65 78 65   /* The code exe
18a0: 63 75 74 65 64 20 77 68 65 6e 20 74 68 69 73 20  cuted when this 
18b0: 72 75 6c 65 20 69 73 20 72 65 64 75 63 65 64 20  rule is reduced 
18c0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
18d0: 6f 6c 20 2a 70 72 65 63 73 79 6d 3b 20 20 2f 2a  ol *precsym;  /*
18e0: 20 50 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62   Precedence symb
18f0: 6f 6c 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65  ol for this rule
1900: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b   */.  int index;
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1920: 2a 20 41 6e 20 69 6e 64 65 78 20 6e 75 6d 62 65  * An index numbe
1930: 72 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65 20  r for this rule 
1940: 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 63 61 6e  */.  Boolean can
1950: 52 65 64 75 63 65 3b 20 20 20 20 20 20 20 2f 2a  Reduce;       /*
1960: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 72 75   True if this ru
1970: 6c 65 20 69 73 20 65 76 65 72 20 72 65 64 75 63  le is ever reduc
1980: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72  ed */.  struct r
1990: 75 6c 65 20 2a 6e 65 78 74 6c 68 73 3b 20 20 20  ule *nextlhs;   
19a0: 20 2f 2a 20 4e 65 78 74 20 72 75 6c 65 20 77 69   /* Next rule wi
19b0: 74 68 20 74 68 65 20 73 61 6d 65 20 4c 48 53 20  th the same LHS 
19c0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
19d0: 20 2a 6e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a   *next;       /*
19e0: 20 4e 65 78 74 20 72 75 6c 65 20 69 6e 20 74 68   Next rule in th
19f0: 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 2a 2f  e global list */
1a00: 0a 7d 3b 0a 0a 2f 2a 20 41 20 63 6f 6e 66 69 67  .};../* A config
1a10: 75 72 61 74 69 6f 6e 20 69 73 20 61 20 70 72 6f  uration is a pro
1a20: 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 6f 66 20  duction rule of 
1a30: 74 68 65 20 67 72 61 6d 6d 61 72 20 74 6f 67 65  the grammar toge
1a40: 74 68 65 72 20 77 69 74 68 0a 2a 2a 20 61 20 6d  ther with.** a m
1a50: 61 72 6b 20 28 64 6f 74 29 20 73 68 6f 77 69 6e  ark (dot) showin
1a60: 67 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68  g how much of th
1a70: 61 74 20 72 75 6c 65 20 68 61 73 20 62 65 65 6e  at rule has been
1a80: 20 70 72 6f 63 65 73 73 65 64 20 73 6f 20 66 61   processed so fa
1a90: 72 2e 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74  r..** Configurat
1aa0: 69 6f 6e 73 20 61 6c 73 6f 20 63 6f 6e 74 61 69  ions also contai
1ab0: 6e 20 61 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 77  n a follow-set w
1ac0: 68 69 63 68 20 69 73 20 61 20 6c 69 73 74 20 6f  hich is a list o
1ad0: 66 20 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79  f terminal.** sy
1ae0: 6d 62 6f 6c 73 20 77 68 69 63 68 20 61 72 65 20  mbols which are 
1af0: 61 6c 6c 6f 77 65 64 20 74 6f 20 69 6d 6d 65 64  allowed to immed
1b00: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 20 74 68  iately follow th
1b10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 75 6c  e end of the rul
1b20: 65 2e 0a 2a 2a 20 45 76 65 72 79 20 63 6f 6e 66  e..** Every conf
1b30: 69 67 75 72 61 74 69 6f 6e 20 69 73 20 72 65 63  iguration is rec
1b40: 6f 72 64 65 64 20 61 73 20 61 6e 20 69 6e 73 74  orded as an inst
1b50: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1b60: 6f 77 69 6e 67 3a 20 2a 2f 0a 65 6e 75 6d 20 63  owing: */.enum c
1b70: 66 67 73 74 61 74 75 73 20 7b 0a 20 20 43 4f 4d  fgstatus {.  COM
1b80: 50 4c 45 54 45 2c 0a 20 20 49 4e 43 4f 4d 50 4c  PLETE,.  INCOMPL
1b90: 45 54 45 0a 7d 3b 0a 73 74 72 75 63 74 20 63 6f  ETE.};.struct co
1ba0: 6e 66 69 67 20 7b 0a 20 20 73 74 72 75 63 74 20  nfig {.  struct 
1bb0: 72 75 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20  rule *rp;       
1bc0: 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 20 75 70    /* The rule up
1bd0: 6f 6e 20 77 68 69 63 68 20 74 68 65 20 63 6f 6e  on which the con
1be0: 66 69 67 75 72 61 74 69 6f 6e 20 69 73 20 62 61  figuration is ba
1bf0: 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74  sed */.  int dot
1c00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c10: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20 70    /* The parse p
1c20: 6f 69 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  oint */.  char *
1c30: 66 77 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  fws;            
1c40: 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74     /* Follow-set
1c50: 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 66 69 67   for this config
1c60: 75 72 61 74 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a  uration only */.
1c70: 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
1c80: 66 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f  fplp;      /* Fo
1c90: 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 77 61 72 64  llow-set forward
1ca0: 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
1cb0: 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70  ks */.  struct p
1cc0: 6c 69 6e 6b 20 2a 62 70 6c 70 3b 20 20 20 20 20  link *bplp;     
1cd0: 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 62   /* Follow-set b
1ce0: 61 63 6b 77 61 72 64 73 20 70 72 6f 70 61 67 61  ackwards propaga
1cf0: 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20  tion links */.  
1d00: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
1d10: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
1d20: 74 65 72 20 74 6f 20 73 74 61 74 65 20 77 68 69  ter to state whi
1d30: 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 69 73  ch contains this
1d40: 20 2a 2f 0a 20 20 65 6e 75 6d 20 63 66 67 73 74   */.  enum cfgst
1d50: 61 74 75 73 20 73 74 61 74 75 73 3b 20 20 20 2f  atus status;   /
1d60: 2a 20 75 73 65 64 20 64 75 72 69 6e 67 20 66 6f  * used during fo
1d70: 6c 6c 6f 77 73 65 74 20 61 6e 64 20 73 68 69 66  llowset and shif
1d80: 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 73 20 2a  t computations *
1d90: 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  /.  struct confi
1da0: 67 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20  g *next;     /* 
1db0: 4e 65 78 74 20 63 6f 6e 66 69 67 75 72 61 74 69  Next configurati
1dc0: 6f 6e 20 69 6e 20 74 68 65 20 73 74 61 74 65 20  on in the state 
1dd0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  */.  struct conf
1de0: 69 67 20 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a  ig *bp;       /*
1df0: 20 54 68 65 20 6e 65 78 74 20 62 61 73 69 73 20   The next basis 
1e00: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f  configuration */
1e10: 0a 7d 3b 0a 0a 65 6e 75 6d 20 65 5f 61 63 74 69  .};..enum e_acti
1e20: 6f 6e 20 7b 0a 20 20 53 48 49 46 54 2c 0a 20 20  on {.  SHIFT,.  
1e30: 41 43 43 45 50 54 2c 0a 20 20 52 45 44 55 43 45  ACCEPT,.  REDUCE
1e40: 2c 0a 20 20 45 52 52 4f 52 2c 0a 20 20 53 53 43  ,.  ERROR,.  SSC
1e50: 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20 20 20 20  ONFLICT,        
1e60: 20 20 20 20 20 20 2f 2a 20 41 20 73 68 69 66 74        /* A shift
1e70: 2f 73 68 69 66 74 20 63 6f 6e 66 6c 69 63 74 20  /shift conflict 
1e80: 2a 2f 0a 20 20 53 52 43 4f 4e 46 4c 49 43 54 2c  */.  SRCONFLICT,
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ea0: 20 57 61 73 20 61 20 72 65 64 75 63 65 2c 20 62   Was a reduce, b
1eb0: 75 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6e  ut part of a con
1ec0: 66 6c 69 63 74 20 2a 2f 0a 20 20 52 52 43 4f 4e  flict */.  RRCON
1ed0: 46 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20  FLICT,          
1ee0: 20 20 20 20 2f 2a 20 57 61 73 20 61 20 72 65 64      /* Was a red
1ef0: 75 63 65 2c 20 62 75 74 20 70 61 72 74 20 6f 66  uce, but part of
1f00: 20 61 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20   a conflict */. 
1f10: 20 53 48 5f 52 45 53 4f 4c 56 45 44 2c 20 20 20   SH_RESOLVED,   
1f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73            /* Was
1f30: 20 61 20 73 68 69 66 74 2e 20 20 50 72 65 63 65   a shift.  Prece
1f40: 64 65 6e 63 65 20 72 65 73 6f 6c 76 65 64 20 63  dence resolved c
1f50: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 52 44 5f  onflict */.  RD_
1f60: 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20  RESOLVED,       
1f70: 20 20 20 20 20 20 2f 2a 20 57 61 73 20 72 65 64        /* Was red
1f80: 75 63 65 2e 20 20 50 72 65 63 65 64 65 6e 63 65  uce.  Precedence
1f90: 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69   resolved confli
1fa0: 63 74 20 2a 2f 0a 20 20 4e 4f 54 5f 55 53 45 44  ct */.  NOT_USED
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc0: 20 2f 2a 20 44 65 6c 65 74 65 64 20 62 79 20 63   /* Deleted by c
1fd0: 6f 6d 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b  ompression */.};
1fe0: 0a 0a 2f 2a 20 45 76 65 72 79 20 73 68 69 66 74  ../* Every shift
1ff0: 20 6f 72 20 72 65 64 75 63 65 20 6f 70 65 72 61   or reduce opera
2000: 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 61  tion is stored a
2010: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  s one of the fol
2020: 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 72 75 63 74  lowing */.struct
2030: 20 61 63 74 69 6f 6e 20 7b 0a 20 20 73 74 72 75   action {.  stru
2040: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20  ct symbol *sp;  
2050: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b       /* The look
2060: 2d 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 2a 2f  -ahead symbol */
2070: 0a 20 20 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e  .  enum e_action
2080: 20 74 79 70 65 3b 0a 20 20 75 6e 69 6f 6e 20 7b   type;.  union {
2090: 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
20a0: 65 20 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20 54  e *stp;     /* T
20b0: 68 65 20 6e 65 77 20 73 74 61 74 65 2c 20 69 66  he new state, if
20c0: 20 61 20 73 68 69 66 74 20 2a 2f 0a 20 20 20 20   a shift */.    
20d0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
20e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 75         /* The ru
20f0: 6c 65 2c 20 69 66 20 61 20 72 65 64 75 63 65 20  le, if a reduce 
2100: 2a 2f 0a 20 20 7d 20 78 3b 0a 20 20 73 74 72 75  */.  } x;.  stru
2110: 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b  ct action *next;
2120: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 63 74       /* Next act
2130: 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 73 74 61  ion for this sta
2140: 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61  te */.  struct a
2150: 63 74 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20  ction *collide; 
2160: 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20   /* Next action 
2170: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
2180: 73 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63  sh */.};../* Eac
2190: 68 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 67  h state of the g
21a0: 65 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 27  enerated parser'
21b0: 73 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d  s finite state m
21c0: 61 63 68 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63  achine.** is enc
21d0: 6f 64 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61  oded as an insta
21e0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
21f0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  wing structure. 
2200: 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  */.struct state 
2210: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
2220: 67 20 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20  g *bp;       /* 
2230: 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67  The basis config
2240: 75 72 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 69  urations for thi
2250: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  s state */.  str
2260: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
2270: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e        /* All con
2280: 66 69 67 75 72 61 74 69 6f 6e 73 20 69 6e 20 74  figurations in t
2290: 68 69 73 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  his set */.  int
22a0: 20 73 74 61 74 65 6e 75 6d 3b 20 20 20 20 20 20   statenum;      
22b0: 20 20 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 74        /* Sequent
22c0: 69 61 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ial number for t
22d0: 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73  his state */.  s
22e0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
22f0: 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ;       /* Array
2300: 20 6f 66 20 61 63 74 69 6f 6e 73 20 66 6f 72 20   of actions for 
2310: 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20  this state */.  
2320: 69 6e 74 20 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74  int nTknAct, nNt
2330: 41 63 74 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  Act;     /* Numb
2340: 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 6f 6e  er of actions on
2350: 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e   terminals and n
2360: 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20  onterminals */. 
2370: 20 69 6e 74 20 69 54 6b 6e 4f 66 73 74 2c 20 69   int iTknOfst, i
2380: 4e 74 4f 66 73 74 3b 20 20 20 2f 2a 20 79 79 5f  NtOfst;   /* yy_
2390: 61 63 74 69 6f 6e 5b 5d 20 6f 66 66 73 65 74 20  action[] offset 
23a0: 66 6f 72 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e  for terminals an
23b0: 64 20 6e 6f 6e 74 65 72 6d 73 20 2a 2f 0a 20 20  d nonterms */.  
23c0: 69 6e 74 20 69 44 66 6c 74 3b 20 20 20 20 20 20  int iDflt;      
23d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61           /* Defa
23e0: 75 6c 74 20 61 63 74 69 6f 6e 20 2a 2f 0a 7d 3b  ult action */.};
23f0: 0a 23 64 65 66 69 6e 65 20 4e 4f 5f 4f 46 46 53  .#define NO_OFFS
2400: 45 54 20 28 2d 32 31 34 37 34 38 33 36 34 37 29  ET (-2147483647)
2410: 0a 0a 2f 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74  ../* A followset
2420: 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
2430: 6b 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  k indicates that
2440: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2450: 20 6f 6e 65 0a 2a 2a 20 63 6f 6e 66 69 67 75 72   one.** configur
2460: 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 73 65 74 20  ation followset 
2470: 73 68 6f 75 6c 64 20 62 65 20 70 72 6f 70 61 67  should be propag
2480: 61 74 65 64 20 74 6f 20 61 6e 6f 74 68 65 72 20  ated to another 
2490: 77 68 65 6e 65 76 65 72 0a 2a 2a 20 74 68 65 20  whenever.** the 
24a0: 66 69 72 73 74 20 63 68 61 6e 67 65 73 2e 20 2a  first changes. *
24b0: 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 7b  /.struct plink {
24c0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
24d0: 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a 20 54   *cfp;      /* T
24e0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
24f0: 20 74 6f 20 77 68 69 63 68 20 6c 69 6e 6b 65 64   to which linked
2500: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69   */.  struct pli
2510: 6e 6b 20 2a 6e 65 78 74 3b 20 20 20 20 20 20 2f  nk *next;      /
2520: 2a 20 54 68 65 20 6e 65 78 74 20 70 72 6f 70 61  * The next propa
2530: 67 61 74 65 20 6c 69 6e 6b 20 2a 2f 0a 7d 3b 0a  gate link */.};.
2540: 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20 76 65  ./* The state ve
2550: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 65 6e 74  ctor for the ent
2560: 69 72 65 20 70 61 72 73 65 72 20 67 65 6e 65 72  ire parser gener
2570: 61 74 6f 72 20 69 73 20 72 65 63 6f 72 64 65 64  ator is recorded
2580: 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 2e 20   as.** follows. 
2590: 20 28 4c 45 4d 4f 4e 20 75 73 65 73 20 6e 6f 20   (LEMON uses no 
25a0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
25b0: 20 61 6e 64 20 6d 61 6b 65 73 20 6c 69 74 74 6c   and makes littl
25c0: 65 20 75 73 65 20 6f 66 0a 2a 2a 20 73 74 61 74  e use of.** stat
25d0: 69 63 20 76 61 72 69 61 62 6c 65 73 2e 20 20 46  ic variables.  F
25e0: 69 65 6c 64 73 20 69 6e 20 74 68 65 20 66 6f 6c  ields in the fol
25f0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2600: 20 63 61 6e 20 62 65 20 74 68 6f 75 67 68 74 0a   can be thought.
2610: 2a 2a 20 6f 66 20 61 73 20 62 65 67 69 6e 20 67  ** of as begin g
2620: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
2630: 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 29  in the program.)
2640: 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e   */.struct lemon
2650: 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74   {.  struct stat
2660: 65 20 2a 2a 73 6f 72 74 65 64 3b 20 20 20 2f 2a  e **sorted;   /*
2670: 20 54 61 62 6c 65 20 6f 66 20 73 74 61 74 65 73   Table of states
2680: 20 73 6f 72 74 65 64 20 62 79 20 73 74 61 74 65   sorted by state
2690: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72   number */.  str
26a0: 75 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20  uct rule *rule; 
26b0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
26c0: 20 61 6c 6c 20 72 75 6c 65 73 20 2a 2f 0a 20 20   all rules */.  
26d0: 69 6e 74 20 6e 73 74 61 74 65 3b 20 20 20 20 20  int nstate;     
26e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
26f0: 65 72 20 6f 66 20 73 74 61 74 65 73 20 2a 2f 0a  er of states */.
2700: 20 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20    int nrule;    
2710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2720: 6d 62 65 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f  mber of rules */
2730: 0a 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20  .  int nsymbol; 
2740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2750: 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61  umber of termina
2760: 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61  l and nontermina
2770: 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69  l symbols */.  i
2780: 6e 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20  nt nterminal;   
2790: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
27a0: 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79  r of terminal sy
27b0: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75 63  mbols */.  struc
27c0: 74 20 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d 62 6f  t symbol **symbo
27d0: 6c 73 3b 20 2f 2a 20 53 6f 72 74 65 64 20 61 72  ls; /* Sorted ar
27e0: 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ray of pointers 
27f0: 74 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  to symbols */.  
2800: 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20  int errorcnt;   
2810: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2820: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a  er of errors */.
2830: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
2840: 2a 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68  *errsym;   /* Th
2850: 65 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c 20 2a  e error symbol *
2860: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
2870: 6c 20 2a 77 69 6c 64 63 61 72 64 3b 20 2f 2a 20  l *wildcard; /* 
2880: 54 6f 6b 65 6e 20 74 68 61 74 20 6d 61 74 63 68  Token that match
2890: 65 73 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20  es anything */. 
28a0: 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20   char *name;    
28b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
28c0: 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74  e of the generat
28d0: 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 63  ed parser */.  c
28e0: 68 61 72 20 2a 61 72 67 3b 20 20 20 20 20 20 20  har *arg;       
28f0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6c 61          /* Decla
2900: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 33 74  ration of the 3t
2910: 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61  h argument to pa
2920: 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  rser */.  char *
2930: 74 6f 6b 65 6e 74 79 70 65 3b 20 20 20 20 20 20  tokentype;      
2940: 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65     /* Type of te
2950: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 69  rminal symbols i
2960: 6e 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61  n the parser sta
2970: 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 76 61  ck */.  char *va
2980: 72 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  rtype;          
2990: 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   /* The default 
29a0: 74 79 70 65 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d  type of non-term
29b0: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  inal symbols */.
29c0: 20 20 63 68 61 72 20 2a 73 74 61 72 74 3b 20 20    char *start;  
29d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
29e0: 6d 65 20 6f 66 20 74 68 65 20 73 74 61 72 74 20  me of the start 
29f0: 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 65 20 67  symbol for the g
2a00: 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 63 68 61 72  rammar */.  char
2a10: 20 2a 73 74 61 63 6b 73 69 7a 65 3b 20 20 20 20   *stacksize;    
2a20: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2a30: 74 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b  the parser stack
2a40: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 69 6e 63 6c   */.  char *incl
2a50: 75 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ude;           /
2a60: 2a 20 43 6f 64 65 20 74 6f 20 70 75 74 20 61 74  * Code to put at
2a70: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2a80: 65 20 43 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  e C file */.  ch
2a90: 61 72 20 2a 65 72 72 6f 72 3b 20 20 20 20 20 20  ar *error;      
2aa0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
2ab0: 6f 20 65 78 65 63 75 74 65 20 77 68 65 6e 20 61  o execute when a
2ac0: 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20  n error is seen 
2ad0: 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 76 65 72 66  */.  char *overf
2ae0: 6c 6f 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  low;          /*
2af0: 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65   Code to execute
2b00: 20 6f 6e 20 61 20 73 74 61 63 6b 20 6f 76 65 72   on a stack over
2b10: 66 6c 6f 77 20 2a 2f 0a 20 20 63 68 61 72 20 2a  flow */.  char *
2b20: 66 61 69 6c 75 72 65 3b 20 20 20 20 20 20 20 20  failure;        
2b30: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
2b40: 65 63 75 74 65 20 6f 6e 20 70 61 72 73 65 72 20  ecute on parser 
2b50: 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 63 68 61  failure */.  cha
2b60: 72 20 2a 61 63 63 65 70 74 3b 20 20 20 20 20 20  r *accept;      
2b70: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
2b80: 20 65 78 65 63 75 74 65 20 77 68 65 6e 20 74 68   execute when th
2b90: 65 20 70 61 72 73 65 72 20 65 78 63 65 70 74 73  e parser excepts
2ba0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 78 74 72   */.  char *extr
2bb0: 61 63 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f  acode;         /
2bc0: 2a 20 43 6f 64 65 20 61 70 70 65 6e 64 65 64 20  * Code appended 
2bd0: 74 6f 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  to the generated
2be0: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
2bf0: 2a 74 6f 6b 65 6e 64 65 73 74 3b 20 20 20 20 20  *tokendest;     
2c00: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65      /* Code to e
2c10: 78 65 63 75 74 65 20 74 6f 20 64 65 73 74 72 6f  xecute to destro
2c20: 79 20 74 6f 6b 65 6e 20 64 61 74 61 20 2a 2f 0a  y token data */.
2c30: 20 20 63 68 61 72 20 2a 76 61 72 64 65 73 74 3b    char *vardest;
2c40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2c50: 64 65 20 66 6f 72 20 74 68 65 20 64 65 66 61 75  de for the defau
2c60: 6c 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  lt non-terminal 
2c70: 64 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20  destructor */.  
2c80: 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20  char *filename; 
2c90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2ca0: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69   of the input fi
2cb0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 75  le */.  char *ou
2cc0: 74 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  tname;          
2cd0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2ce0: 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 66  current output f
2cf0: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74  ile */.  char *t
2d00: 6f 6b 65 6e 70 72 65 66 69 78 3b 20 20 20 20 20  okenprefix;     
2d10: 20 20 2f 2a 20 41 20 70 72 65 66 69 78 20 61 64    /* A prefix ad
2d20: 64 65 64 20 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d  ded to token nam
2d30: 65 73 20 69 6e 20 74 68 65 20 2e 68 20 66 69 6c  es in the .h fil
2d40: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e 66  e */.  int nconf
2d50: 6c 69 63 74 3b 20 20 20 20 20 20 20 20 20 20 20  lict;           
2d60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72  /* Number of par
2d70: 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a  sing conflicts *
2d80: 2f 0a 20 20 69 6e 74 20 74 61 62 6c 65 73 69 7a  /.  int tablesiz
2d90: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2da0: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73  Size of the pars
2db0: 65 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e  e tables */.  in
2dc0: 74 20 62 61 73 69 73 66 6c 61 67 3b 20 20 20 20  t basisflag;    
2dd0: 20 20 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 20         /* Print 
2de0: 6f 6e 6c 79 20 62 61 73 69 73 20 63 6f 6e 66 69  only basis confi
2df0: 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  gurations */.  i
2e00: 6e 74 20 68 61 73 5f 66 61 6c 6c 62 61 63 6b 3b  nt has_fallback;
2e10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e20: 69 66 20 61 6e 79 20 25 66 61 6c 6c 62 61 63 6b  if any %fallback
2e30: 20 69 73 20 73 65 65 6e 20 69 6e 20 74 68 65 20   is seen in the 
2e40: 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 69 6e 74  grammar */.  int
2e50: 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 3b 20   nolinenosflag; 
2e60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e70: 20 23 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e 74   #line statement
2e80: 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  s should not be 
2e90: 70 72 69 6e 74 65 64 20 2a 2f 0a 20 20 63 68 61  printed */.  cha
2ea0: 72 20 2a 61 72 67 76 30 3b 20 20 20 20 20 20 20  r *argv0;       
2eb0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2ec0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 2a 2f 0a   the program */.
2ed0: 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 4d 65 6d 6f  };..#define Memo
2ee0: 72 79 43 68 65 63 6b 28 58 29 20 69 66 28 28 58  ryCheck(X) if((X
2ef0: 29 3d 3d 30 29 7b 20 5c 0a 20 20 65 78 74 65 72  )==0){ \.  exter
2f00: 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72  n void memory_er
2f10: 72 6f 72 28 29 3b 20 5c 0a 20 20 6d 65 6d 6f 72  ror(); \.  memor
2f20: 79 5f 65 72 72 6f 72 28 29 3b 20 5c 0a 7d 0a 0a  y_error(); \.}..
2f30: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2f40: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
2f50: 22 74 61 62 6c 65 2e 68 22 20 2a 2a 2a 2a 2a 2a  "table.h" ******
2f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
2f80: 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74  ** All code in t
2f90: 68 69 73 20 66 69 6c 65 20 68 61 73 20 62 65 65  his file has bee
2fa0: 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  n automatically 
2fb0: 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f  generated.** fro
2fc0: 6d 20 61 20 73 70 65 63 69 66 69 63 61 74 69 6f  m a specificatio
2fd0: 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  n in the file.**
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
2ff0: 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68  able.q".** by th
3000: 65 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  e associative ar
3010: 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e  ray code buildin
3020: 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e  g program "aagen
3030: 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69  "..** Do not edi
3040: 74 20 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e  t this file!  In
3050: 73 74 65 61 64 2c 20 65 64 69 74 20 74 68 65 20  stead, edit the 
3060: 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a  specification.**
3070: 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75   file, then reru
3080: 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a  n aagen..*/./*.*
3090: 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65  * Code for proce
30a0: 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20  ssing tables in 
30b0: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
30c0: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 2f   generator..*/./
30d0: 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 68  * Routines for h
30e0: 61 6e 64 6c 69 6e 67 20 61 20 73 74 72 69 6e 67  andling a string
30f0: 73 20 2a 2f 0a 0a 63 6f 6e 73 74 20 63 68 61 72  s */..const char
3100: 20 2a 53 74 72 73 61 66 65 28 63 6f 6e 73 74 20   *Strsafe(const 
3110: 63 68 61 72 20 2a 29 3b 0a 0a 76 6f 69 64 20 53  char *);..void S
3120: 74 72 73 61 66 65 5f 69 6e 69 74 28 76 6f 69 64  trsafe_init(void
3130: 29 3b 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69  );.int Strsafe_i
3140: 6e 73 65 72 74 28 63 6f 6e 73 74 20 63 68 61 72  nsert(const char
3150: 20 2a 29 3b 0a 63 6f 6e 73 74 20 63 68 61 72 20   *);.const char 
3160: 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28 63 6f  *Strsafe_find(co
3170: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a  nst char *);../*
3180: 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 68 61   Routines for ha
3190: 6e 64 6c 69 6e 67 20 73 79 6d 62 6f 6c 73 20 6f  ndling symbols o
31a0: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f  f the grammar */
31b0: 0a 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  ..struct symbol 
31c0: 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73  *Symbol_new(cons
31d0: 74 20 63 68 61 72 20 2a 29 3b 0a 69 6e 74 20 53  t char *);.int S
31e0: 79 6d 62 6f 6c 63 6d 70 70 28 63 6f 6e 73 74 20  ymbolcmpp(const 
31f0: 76 6f 69 64 20 2a 2c 20 63 6f 6e 73 74 20 76 6f  void *, const vo
3200: 69 64 20 2a 29 3b 0a 76 6f 69 64 20 53 79 6d 62  id *);.void Symb
3210: 6f 6c 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69  ol_init(void);.i
3220: 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74  nt Symbol_insert
3230: 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
3240: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  , const char *);
3250: 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
3260: 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73  Symbol_find(cons
3270: 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72 75 63  t char *);.struc
3280: 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c  t symbol *Symbol
3290: 5f 4e 74 68 28 69 6e 74 29 3b 0a 69 6e 74 20 53  _Nth(int);.int S
32a0: 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 76 6f 69 64  ymbol_count(void
32b0: 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  );.struct symbol
32c0: 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f   **Symbol_arrayo
32d0: 66 28 76 6f 69 64 29 3b 0a 0a 2f 2a 20 52 6f 75  f(void);../* Rou
32e0: 74 69 6e 65 73 20 74 6f 20 6d 61 6e 61 67 65 20  tines to manage 
32f0: 74 68 65 20 73 74 61 74 65 20 74 61 62 6c 65 20  the state table 
3300: 2a 2f 0a 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d  */..int Configcm
3310: 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20  p(const char *, 
3320: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73  const char *);.s
3330: 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61  truct state *Sta
3340: 74 65 5f 6e 65 77 28 76 6f 69 64 29 3b 0a 76 6f  te_new(void);.vo
3350: 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28 76 6f  id State_init(vo
3360: 69 64 29 3b 0a 69 6e 74 20 53 74 61 74 65 5f 69  id);.int State_i
3370: 6e 73 65 72 74 28 73 74 72 75 63 74 20 73 74 61  nsert(struct sta
3380: 74 65 20 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e  te *, struct con
3390: 66 69 67 20 2a 29 3b 0a 73 74 72 75 63 74 20 73  fig *);.struct s
33a0: 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64  tate *State_find
33b0: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
33c0: 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  );.struct state 
33d0: 2a 2a 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28  **State_arrayof(
33e0: 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75  /*  */);../* Rou
33f0: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 65  tines used for e
3400: 66 66 69 63 69 65 6e 63 79 20 69 6e 20 43 6f 6e  fficiency in Con
3410: 66 69 67 6c 69 73 74 5f 61 64 64 20 2a 2f 0a 0a  figlist_add */..
3420: 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65  void Configtable
3430: 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74  _init(void);.int
3440: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73   Configtable_ins
3450: 65 72 74 28 73 74 72 75 63 74 20 63 6f 6e 66 69  ert(struct confi
3460: 67 20 2a 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e  g *);.struct con
3470: 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65  fig *Configtable
3480: 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e  _find(struct con
3490: 66 69 67 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e  fig *);.void Con
34a0: 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 69  figtable_clear(i
34b0: 6e 74 28 2a 29 28 73 74 72 75 63 74 20 63 6f 6e  nt(*)(struct con
34c0: 66 69 67 20 2a 29 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  fig *));../*****
34d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
34e0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 61 63 74  om the file "act
34f0: 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion.c" *********
3500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3510: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
3520: 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e  utines processin
3530: 67 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73  g parser actions
3540: 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
3550: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
3560: 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  */../* Allocate 
3570: 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63 74  a new parser act
3580: 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ion */.static st
3590: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74  ruct action *Act
35a0: 69 6f 6e 5f 6e 65 77 28 76 6f 69 64 29 7b 0a 20  ion_new(void){. 
35b0: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61   static struct a
35c0: 63 74 69 6f 6e 20 2a 66 72 65 65 6c 69 73 74 20  ction *freelist 
35d0: 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 61 63  = 0;.  struct ac
35e0: 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f 6e 3b  tion *newaction;
35f0: 0a 0a 20 20 69 66 28 20 66 72 65 65 6c 69 73 74  ..  if( freelist
3600: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
3610: 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20  ;.    int amt = 
3620: 31 30 30 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  100;.    freelis
3630: 74 20 3d 20 28 73 74 72 75 63 74 20 61 63 74 69  t = (struct acti
3640: 6f 6e 20 2a 29 63 61 6c 6c 6f 63 28 61 6d 74 2c  on *)calloc(amt,
3650: 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 61   sizeof(struct a
3660: 63 74 69 6f 6e 29 29 3b 0a 20 20 20 20 69 66 28  ction));.    if(
3670: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
3680: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
3690: 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20  derr,"Unable to 
36a0: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  allocate memory 
36b0: 66 6f 72 20 61 20 6e 65 77 20 70 61 72 73 65 72  for a new parser
36c0: 20 61 63 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20   action.");.    
36d0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
36e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
36f0: 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65  amt-1; i++) free
3700: 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26  list[i].next = &
3710: 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20  freelist[i+1];. 
3720: 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d     freelist[amt-
3730: 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  1].next = 0;.  }
3740: 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d 20 66  .  newaction = f
3750: 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c  reelist;.  freel
3760: 69 73 74 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e  ist = freelist->
3770: 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e  next;.  return n
3780: 65 77 61 63 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 20  ewaction;.}../* 
3790: 43 6f 6d 70 61 72 65 20 74 77 6f 20 61 63 74 69  Compare two acti
37a0: 6f 6e 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20  ons for sorting 
37b0: 70 75 72 70 6f 73 65 73 2e 20 20 52 65 74 75 72  purposes.  Retur
37c0: 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  n negative, zero
37d0: 2c 20 6f 72 0a 2a 2a 20 70 6f 73 69 74 69 76 65  , or.** positive
37e0: 20 69 66 20 74 68 65 20 66 69 72 73 74 20 61 63   if the first ac
37f0: 74 69 6f 6e 20 69 73 20 6c 65 73 73 20 74 68 61  tion is less tha
3800: 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  n, equal to, or 
3810: 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20  greater than.** 
3820: 74 68 65 20 66 69 72 73 74 0a 2a 2f 0a 73 74 61  the first.*/.sta
3830: 74 69 63 20 69 6e 74 20 61 63 74 69 6f 6e 63 6d  tic int actioncm
3840: 70 28 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p(.  struct acti
3850: 6f 6e 20 2a 61 70 31 2c 0a 20 20 73 74 72 75 63  on *ap1,.  struc
3860: 74 20 61 63 74 69 6f 6e 20 2a 61 70 32 0a 29 7b  t action *ap2.){
3870: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
3880: 3d 20 61 70 31 2d 3e 73 70 2d 3e 69 6e 64 65 78  = ap1->sp->index
3890: 20 2d 20 61 70 32 2d 3e 73 70 2d 3e 69 6e 64 65   - ap2->sp->inde
38a0: 78 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  x;.  if( rc==0 )
38b0: 7b 0a 20 20 20 20 72 63 20 3d 20 28 69 6e 74 29  {.    rc = (int)
38c0: 61 70 31 2d 3e 74 79 70 65 20 2d 20 28 69 6e 74  ap1->type - (int
38d0: 29 61 70 32 2d 3e 74 79 70 65 3b 0a 20 20 7d 0a  )ap2->type;.  }.
38e0: 20 20 69 66 28 20 72 63 3d 3d 30 20 26 26 20 61    if( rc==0 && a
38f0: 70 31 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  p1->type==REDUCE
3900: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 70 31   ){.    rc = ap1
3910: 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2d 20  ->x.rp->index - 
3920: 61 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78  ap2->x.rp->index
3930: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
3940: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 28 69  0 ){.    rc = (i
3950: 6e 74 29 20 28 61 70 32 20 2d 20 61 70 31 29 3b  nt) (ap2 - ap1);
3960: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3970: 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 70 61 72  ;.}../* Sort par
3980: 73 65 72 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 73  ser actions */.s
3990: 74 61 74 69 63 20 73 74 72 75 63 74 20 61 63 74  tatic struct act
39a0: 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74  ion *Action_sort
39b0: 28 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  (.  struct actio
39c0: 6e 20 2a 61 70 0a 29 7b 0a 20 20 61 70 20 3d 20  n *ap.){.  ap = 
39d0: 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  (struct action *
39e0: 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a 29 61  )msort((char *)a
39f0: 70 2c 28 63 68 61 72 20 2a 2a 29 26 61 70 2d 3e  p,(char **)&ap->
3a00: 6e 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20  next,.          
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 20 20 20 20 28 69 6e 74 28 2a 29 28 63 6f 6e 73      (int(*)(cons
3a30: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
3a40: 61 72 2a 29 29 61 63 74 69 6f 6e 63 6d 70 29 3b  ar*))actioncmp);
3a50: 0a 20 20 72 65 74 75 72 6e 20 61 70 3b 0a 7d 0a  .  return ap;.}.
3a60: 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61 64 64  .void Action_add
3a70: 28 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  (.  struct actio
3a80: 6e 20 2a 2a 61 70 70 2c 0a 20 20 65 6e 75 6d 20  n **app,.  enum 
3a90: 65 5f 61 63 74 69 6f 6e 20 74 79 70 65 2c 0a 20  e_action type,. 
3aa0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
3ab0: 73 70 2c 0a 20 20 63 68 61 72 20 2a 61 72 67 0a  sp,.  char *arg.
3ac0: 29 7b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  ){.  struct acti
3ad0: 6f 6e 20 2a 6e 65 77 61 63 74 69 6f 6e 3b 0a 20  on *newaction;. 
3ae0: 20 6e 65 77 61 63 74 69 6f 6e 20 3d 20 41 63 74   newaction = Act
3af0: 69 6f 6e 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77  ion_new();.  new
3b00: 61 63 74 69 6f 6e 2d 3e 6e 65 78 74 20 3d 20 2a  action->next = *
3b10: 61 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20 6e 65  app;.  *app = ne
3b20: 77 61 63 74 69 6f 6e 3b 0a 20 20 6e 65 77 61 63  waction;.  newac
3b30: 74 69 6f 6e 2d 3e 74 79 70 65 20 3d 20 74 79 70  tion->type = typ
3b40: 65 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e  e;.  newaction->
3b50: 73 70 20 3d 20 73 70 3b 0a 20 20 69 66 28 20 74  sp = sp;.  if( t
3b60: 79 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20  ype==SHIFT ){.  
3b70: 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78 2e 73    newaction->x.s
3b80: 74 70 20 3d 20 28 73 74 72 75 63 74 20 73 74 61  tp = (struct sta
3b90: 74 65 20 2a 29 61 72 67 3b 0a 20 20 7d 65 6c 73  te *)arg;.  }els
3ba0: 65 7b 0a 20 20 20 20 6e 65 77 61 63 74 69 6f 6e  e{.    newaction
3bb0: 2d 3e 78 2e 72 70 20 3d 20 28 73 74 72 75 63 74  ->x.rp = (struct
3bc0: 20 72 75 6c 65 20 2a 29 61 72 67 3b 0a 20 20 7d   rule *)arg;.  }
3bd0: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
3be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 65 77 20 63  ********** New c
3bf0: 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
3c00: 20 74 68 65 20 22 61 63 74 74 61 62 22 20 6d 6f   the "acttab" mo
3c10: 64 75 6c 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  dule ***********
3c20: 2f 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f 64  /./*.** This mod
3c30: 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72  ule implements r
3c40: 6f 75 74 69 6e 65 73 20 75 73 65 20 74 6f 20 63  outines use to c
3c50: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 79 79 5f  onstruct the yy_
3c60: 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a  action[] table..
3c70: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74  */../*.** The st
3c80: 61 74 65 20 6f 66 20 74 68 65 20 79 79 5f 61 63  ate of the yy_ac
3c90: 74 69 6f 6e 20 74 61 62 6c 65 20 75 6e 64 65 72  tion table under
3ca0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 73   construction is
3cb0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a   an instance of.
3cc0: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
3cd0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
3ce0: 2a 20 54 68 65 20 79 79 5f 61 63 74 69 6f 6e 20  * The yy_action 
3cf0: 74 61 62 6c 65 20 6d 61 70 73 20 74 68 65 20 70  table maps the p
3d00: 61 69 72 20 28 73 74 61 74 65 5f 6e 75 6d 62 65  air (state_numbe
3d10: 72 2c 20 6c 6f 6f 6b 61 68 65 61 64 29 20 69 6e  r, lookahead) in
3d20: 74 6f 20 61 6e 0a 2a 2a 20 61 63 74 69 6f 6e 5f  to an.** action_
3d30: 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 74 61 62  number.  The tab
3d40: 6c 65 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  le is an array o
3d50: 66 20 69 6e 74 65 67 65 72 73 20 70 61 69 72 73  f integers pairs
3d60: 2e 20 20 54 68 65 20 73 74 61 74 65 5f 6e 75 6d  .  The state_num
3d70: 62 65 72 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  ber.** determine
3d80: 73 20 61 6e 20 69 6e 69 74 69 61 6c 20 6f 66 66  s an initial off
3d90: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 79 79 5f  set into the yy_
3da0: 61 63 74 69 6f 6e 20 61 72 72 61 79 2e 20 20 54  action array.  T
3db0: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 0a 2a 2a 20  he lookahead.** 
3dc0: 76 61 6c 75 65 20 69 73 20 74 68 65 6e 20 61 64  value is then ad
3dd0: 64 65 64 20 74 6f 20 74 68 69 73 20 69 6e 69 74  ded to this init
3de0: 69 61 6c 20 6f 66 66 73 65 74 20 74 6f 20 67 65  ial offset to ge
3df0: 74 20 61 6e 20 69 6e 64 65 78 20 58 20 69 6e 74  t an index X int
3e00: 6f 20 74 68 65 0a 2a 2a 20 79 79 5f 61 63 74 69  o the.** yy_acti
3e10: 6f 6e 20 61 72 72 61 79 2e 20 49 66 20 74 68 65  on array. If the
3e20: 20 61 41 63 74 69 6f 6e 5b 58 5d 2e 6c 6f 6f 6b   aAction[X].look
3e30: 61 68 65 61 64 20 65 71 75 61 6c 73 20 74 68 65  ahead equals the
3e40: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
3e50: 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   of the lookahea
3e60: 64 20 69 6e 70 75 74 2c 20 74 68 65 6e 20 74 68  d input, then th
3e70: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61  e value of the a
3e80: 63 74 69 6f 6e 5f 6e 75 6d 62 65 72 20 6f 75 74  ction_number out
3e90: 70 75 74 20 69 73 0a 2a 2a 20 61 41 63 74 69 6f  put is.** aActio
3ea0: 6e 5b 58 5d 2e 61 63 74 69 6f 6e 2e 20 20 49 66  n[X].action.  If
3eb0: 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 73 20   the lookaheads 
3ec0: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  do not match the
3ed0: 6e 20 74 68 65 0a 2a 2a 20 64 65 66 61 75 6c 74  n the.** default
3ee0: 20 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   action for the 
3ef0: 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 69 73 20  state_number is 
3f00: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
3f10: 41 6c 6c 20 61 63 74 69 6f 6e 73 20 61 73 73 6f  All actions asso
3f20: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 73 69  ciated with a si
3f30: 6e 67 6c 65 20 73 74 61 74 65 5f 6e 75 6d 62 65  ngle state_numbe
3f40: 72 20 61 72 65 20 66 69 72 73 74 20 65 6e 74 65  r are first ente
3f50: 72 65 64 0a 2a 2a 20 69 6e 74 6f 20 61 4c 6f 6f  red.** into aLoo
3f60: 6b 61 68 65 61 64 5b 5d 20 75 73 69 6e 67 20 6d  kahead[] using m
3f70: 75 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20 74 6f  ultiple calls to
3f80: 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29   acttab_action()
3f90: 2e 20 20 54 68 65 6e 20 74 68 65 20 0a 2a 2a 20  .  Then the .** 
3fa0: 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 61 74  actions for that
3fb0: 20 73 69 6e 67 6c 65 20 73 74 61 74 65 5f 6e 75   single state_nu
3fc0: 6d 62 65 72 20 61 72 65 20 70 6c 61 63 65 64 20  mber are placed 
3fd0: 69 6e 74 6f 20 74 68 65 20 61 41 63 74 69 6f 6e  into the aAction
3fe0: 5b 5d 20 0a 2a 2a 20 61 72 72 61 79 20 77 69 74  [] .** array wit
3ff0: 68 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20  h a single call 
4000: 74 6f 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74  to acttab_insert
4010: 28 29 2e 20 20 54 68 65 20 61 63 74 74 61 62 5f  ().  The acttab_
4020: 69 6e 73 65 72 74 28 29 20 63 61 6c 6c 0a 2a 2a  insert() call.**
4030: 20 61 6c 73 6f 20 72 65 73 65 74 73 20 74 68 65   also resets the
4040: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 61 72   aLookahead[] ar
4050: 72 61 79 20 69 6e 20 70 72 65 70 61 72 61 74 69  ray in preparati
4060: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a  on for the next.
4070: 2a 2a 20 73 74 61 74 65 20 6e 75 6d 62 65 72 2e  ** state number.
4080: 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 6f 6b 61  .*/.struct looka
4090: 68 65 61 64 5f 61 63 74 69 6f 6e 20 7b 0a 20 20  head_action {.  
40a0: 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 3b 20 20  int lookahead;  
40b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
40c0: 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61  lue of the looka
40d0: 68 65 61 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  head token */.  
40e0: 69 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20 20 20  int action;     
40f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
4100: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 6f 6e 20  tion to take on 
4110: 74 68 65 20 67 69 76 65 6e 20 6c 6f 6f 6b 61 68  the given lookah
4120: 65 61 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65  ead */.};.typede
4130: 66 20 73 74 72 75 63 74 20 61 63 74 74 61 62 20  f struct acttab 
4140: 61 63 74 74 61 62 3b 0a 73 74 72 75 63 74 20 61  acttab;.struct a
4150: 63 74 74 61 62 20 7b 0a 20 20 69 6e 74 20 6e 41  cttab {.  int nA
4160: 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
4170: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4180: 20 6f 66 20 75 73 65 64 20 73 6c 6f 74 73 20 69   of used slots i
4190: 6e 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20  n aAction[] */. 
41a0: 20 69 6e 74 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f   int nActionAllo
41b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
41c0: 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64   Slots allocated
41d0: 20 66 6f 72 20 61 41 63 74 69 6f 6e 5b 5d 20 2a   for aAction[] *
41e0: 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 6f 6b 61  /.  struct looka
41f0: 68 65 61 64 5f 61 63 74 69 6f 6e 0a 20 20 20 20  head_action.    
4200: 2a 61 41 63 74 69 6f 6e 2c 20 20 20 20 20 20 20  *aAction,       
4210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4220: 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61  e yy_action[] ta
4230: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
4240: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 2a 61  uction */.    *a
4250: 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  Lookahead;      
4260: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
4270: 6e 67 6c 65 20 6e 65 77 20 74 72 61 6e 73 61 63  ngle new transac
4280: 74 69 6f 6e 20 73 65 74 20 2a 2f 0a 20 20 69 6e  tion set */.  in
4290: 74 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 20  t mnLookahead;  
42a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69             /* Mi
42b0: 6e 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64  nimum aLookahead
42c0: 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a  [].lookahead */.
42d0: 20 20 69 6e 74 20 6d 6e 41 63 74 69 6f 6e 3b 20    int mnAction; 
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
42f0: 2a 20 41 63 74 69 6f 6e 20 61 73 73 6f 63 69 61  * Action associa
4300: 74 65 64 20 77 69 74 68 20 6d 6e 4c 6f 6f 6b 61  ted with mnLooka
4310: 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  head */.  int mx
4320: 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  Lookahead;      
4330: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
4340: 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c  m aLookahead[].l
4350: 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e  ookahead */.  in
4360: 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20  t nLookahead;   
4370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
4380: 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 4c 6f 6f  ed slots in aLoo
4390: 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e  kahead[] */.  in
43a0: 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f  t nLookaheadAllo
43b0: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c  c;         /* Sl
43c0: 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  ots allocated in
43d0: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f   aLookahead[] */
43e0: 0a 7d 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  .};../* Return t
43f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
4400: 72 69 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61  ries in the yy_a
4410: 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 23  ction table */.#
4420: 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 73 69  define acttab_si
4430: 7a 65 28 58 29 20 28 28 58 29 2d 3e 6e 41 63 74  ze(X) ((X)->nAct
4440: 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61 6c  ion)../* The val
4450: 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  ue for the N-th 
4460: 65 6e 74 72 79 20 69 6e 20 79 79 5f 61 63 74 69  entry in yy_acti
4470: 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63  on */.#define ac
4480: 74 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 58 2c  ttab_yyaction(X,
4490: 4e 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69 6f  N)  ((X)->aActio
44a0: 6e 5b 4e 5d 2e 61 63 74 69 6f 6e 29 0a 0a 2f 2a  n[N].action)../*
44b0: 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   The value for t
44c0: 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20 69 6e  he N-th entry in
44d0: 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f   yy_lookahead */
44e0: 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f  .#define acttab_
44f0: 79 79 6c 6f 6f 6b 61 68 65 61 64 28 58 2c 4e 29  yylookahead(X,N)
4500: 20 20 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b    ((X)->aAction[
4510: 4e 5d 2e 6c 6f 6f 6b 61 68 65 61 64 29 0a 0a 2f  N].lookahead)../
4520: 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  * Free all memor
4530: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
4540: 68 20 74 68 65 20 67 69 76 65 6e 20 61 63 74 74  h the given actt
4550: 61 62 20 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61  ab */.void actta
4560: 62 5f 66 72 65 65 28 61 63 74 74 61 62 20 2a 70  b_free(acttab *p
4570: 29 7b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 41  ){.  free( p->aA
4580: 63 74 69 6f 6e 20 29 3b 0a 20 20 66 72 65 65 28  ction );.  free(
4590: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 29   p->aLookahead )
45a0: 3b 0a 20 20 66 72 65 65 28 20 70 20 29 3b 0a 7d  ;.  free( p );.}
45b0: 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
45c0: 6e 65 77 20 61 63 74 74 61 62 20 73 74 72 75 63  new acttab struc
45d0: 74 75 72 65 20 2a 2f 0a 61 63 74 74 61 62 20 2a  ture */.acttab *
45e0: 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28 76 6f 69  acttab_alloc(voi
45f0: 64 29 7b 0a 20 20 61 63 74 74 61 62 20 2a 70 20  d){.  acttab *p 
4600: 3d 20 28 61 63 74 74 61 62 20 2a 29 20 63 61 6c  = (acttab *) cal
4610: 6c 6f 63 28 20 31 2c 20 73 69 7a 65 6f 66 28 2a  loc( 1, sizeof(*
4620: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
4630: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
4640: 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74  stderr,"Unable t
4650: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
4660: 79 20 66 6f 72 20 61 20 6e 65 77 20 61 63 74 74  y for a new actt
4670: 61 62 2e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  ab.");.    exit(
4680: 31 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  1);.  }.  memset
4690: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
46a0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ));.  return p;.
46b0: 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20  }../* Add a new 
46c0: 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 75  action to the cu
46d0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
46e0: 6e 20 73 65 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  n set.  .**.** T
46f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
4700: 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
4710: 61 63 68 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f  ach lookahead fo
4720: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 0a 2a  r a particular.*
4730: 2a 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64  * state..*/.void
4740: 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 61   acttab_action(a
4750: 63 74 74 61 62 20 2a 70 2c 20 69 6e 74 20 6c 6f  cttab *p, int lo
4760: 6f 6b 61 68 65 61 64 2c 20 69 6e 74 20 61 63 74  okahead, int act
4770: 69 6f 6e 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e  ion){.  if( p->n
4780: 4c 6f 6f 6b 61 68 65 61 64 3e 3d 70 2d 3e 6e 4c  Lookahead>=p->nL
4790: 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29 7b  ookaheadAlloc ){
47a0: 0a 20 20 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  .    p->nLookahe
47b0: 61 64 41 6c 6c 6f 63 20 2b 3d 20 32 35 3b 0a 20  adAlloc += 25;. 
47c0: 20 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64     p->aLookahead
47d0: 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 6f 6b 61   = (struct looka
47e0: 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a 29 20 72  head_action *) r
47f0: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b  ealloc( p->aLook
4800: 61 68 65 61 64 2c 0a 20 20 20 20 20 20 20 20 20  ahead,.         
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c      sizeof(p->aL
4830: 6f 6f 6b 61 68 65 61 64 5b 30 5d 29 2a 70 2d 3e  ookahead[0])*p->
4840: 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20  nLookaheadAlloc 
4850: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4c  );.    if( p->aL
4860: 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20  ookahead==0 ){. 
4870: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
4880: 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  err,"malloc fail
4890: 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78  ed\n");.      ex
48a0: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  it(1);.    }.  }
48b0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61  .  if( p->nLooka
48c0: 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70  head==0 ){.    p
48d0: 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20  ->mxLookahead = 
48e0: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70  lookahead;.    p
48f0: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20  ->mnLookahead = 
4900: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70  lookahead;.    p
4910: 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63 74  ->mnAction = act
4920: 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ion;.  }else{.  
4930: 20 20 69 66 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61    if( p->mxLooka
4940: 68 65 61 64 3c 6c 6f 6f 6b 61 68 65 61 64 20 29  head<lookahead )
4950: 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20   p->mxLookahead 
4960: 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20  = lookahead;.   
4970: 20 69 66 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68   if( p->mnLookah
4980: 65 61 64 3e 6c 6f 6f 6b 61 68 65 61 64 20 29 7b  ead>lookahead ){
4990: 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b  .      p->mnLook
49a0: 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61  ahead = lookahea
49b0: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 41 63  d;.      p->mnAc
49c0: 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20  tion = action;. 
49d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c     }.  }.  p->aL
49e0: 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f  ookahead[p->nLoo
49f0: 6b 61 68 65 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61  kahead].lookahea
4a00: 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20  d = lookahead;. 
4a10: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 70   p->aLookahead[p
4a20: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 61 63  ->nLookahead].ac
4a30: 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20  tion = action;. 
4a40: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b   p->nLookahead++
4a50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
4a60: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
4a70: 65 74 20 62 75 69 6c 74 20 75 70 20 77 69 74 68  et built up with
4a80: 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20   prior calls to 
4a90: 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 0a  acttab_action().
4aa0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  ** into the curr
4ab0: 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ent action table
4ac0: 2e 20 20 54 68 65 6e 20 72 65 73 65 74 20 74 68  .  Then reset th
4ad0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  e transaction se
4ae0: 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20  t back.** to an 
4af0: 65 6d 70 74 79 20 73 65 74 20 69 6e 20 70 72 65  empty set in pre
4b00: 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 61 20 6e  paration for a n
4b10: 65 77 20 72 6f 75 6e 64 20 6f 66 20 61 63 74 74  ew round of actt
4b20: 61 62 5f 61 63 74 69 6f 6e 28 29 20 63 61 6c 6c  ab_action() call
4b30: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
4b40: 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
4b50: 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
4b60: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 72 61 6e   of the new tran
4b70: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
4b80: 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 61 63  acttab_insert(ac
4b90: 74 74 61 62 20 2a 70 29 7b 0a 20 20 69 6e 74 20  ttab *p){.  int 
4ba0: 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73  i, j, k, n;.  as
4bb0: 73 65 72 74 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68  sert( p->nLookah
4bc0: 65 61 64 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ead>0 );..  /* M
4bd0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
4be0: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
4bf0: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 61 6e 64   hold the expand
4c00: 65 64 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a  ed action table.
4c10: 20 20 2a 2a 20 69 6e 20 74 68 65 20 77 6f 72 73    ** in the wors
4c20: 74 20 63 61 73 65 2e 20 20 54 68 65 20 77 6f 72  t case.  The wor
4c30: 73 74 20 63 61 73 65 20 6f 63 63 75 72 73 20 69  st case occurs i
4c40: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
4c50: 6e 20 73 65 74 0a 20 20 2a 2a 20 6d 75 73 74 20  n set.  ** must 
4c60: 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
4c70: 68 65 20 63 75 72 72 65 6e 74 20 61 63 74 69 6f  he current actio
4c80: 6e 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e  n table.  */.  n
4c90: 20 3d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61   = p->mxLookahea
4ca0: 64 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e  d + 1;.  if( p->
4cb0: 6e 41 63 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70  nAction + n >= p
4cc0: 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29  ->nActionAlloc )
4cd0: 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64 41 6c 6c  {.    int oldAll
4ce0: 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41  oc = p->nActionA
4cf0: 6c 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e 41 63  lloc;.    p->nAc
4d00: 74 69 6f 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  tionAlloc = p->n
4d10: 41 63 74 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e  Action + n + p->
4d20: 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32  nActionAlloc + 2
4d30: 30 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f  0;.    p->aActio
4d40: 6e 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 6f 6b  n = (struct look
4d50: 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a 29 20  ahead_action *) 
4d60: 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 41 63 74  realloc( p->aAct
4d70: 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4d90: 69 7a 65 6f 66 28 70 2d 3e 61 41 63 74 69 6f 6e  izeof(p->aAction
4da0: 5b 30 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41  [0])*p->nActionA
4db0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70  lloc);.    if( p
4dc0: 2d 3e 61 41 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a  ->aAction==0 ){.
4dd0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
4de0: 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69  derr,"malloc fai
4df0: 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65  led\n");.      e
4e00: 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
4e10: 20 20 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63    for(i=oldAlloc
4e20: 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c  ; i<p->nActionAl
4e30: 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  loc; i++){.     
4e40: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c   p->aAction[i].l
4e50: 6f 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b 0a 20  ookahead = -1;. 
4e60: 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b       p->aAction[
4e70: 69 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a  i].action = -1;.
4e80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
4e90: 53 63 61 6e 20 74 68 65 20 65 78 69 73 74 69 6e  Scan the existin
4ea0: 67 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6c  g action table l
4eb0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20 6f 66  ooking for an of
4ec0: 66 73 65 74 20 74 68 61 74 20 69 73 20 61 20 0a  fset that is a .
4ed0: 20 20 2a 2a 20 64 75 70 6c 69 63 61 74 65 20 6f    ** duplicate o
4ee0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
4ef0: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 20 20  ansaction set.  
4f00: 46 61 6c 6c 20 6f 75 74 20 6f 66 20 74 68 65 20  Fall out of the 
4f10: 6c 6f 6f 70 0a 20 20 2a 2a 20 69 66 20 61 6e 64  loop.  ** if and
4f20: 20 77 68 65 6e 20 74 68 65 20 64 75 70 6c 69 63   when the duplic
4f30: 61 74 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20  ate is found..  
4f40: 2a 2a 0a 20 20 2a 2a 20 69 20 69 73 20 74 68 65  **.  ** i is the
4f50: 20 69 6e 64 65 78 20 69 6e 20 70 2d 3e 61 41 63   index in p->aAc
4f60: 74 69 6f 6e 5b 5d 20 77 68 65 72 65 20 70 2d 3e  tion[] where p->
4f70: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 69 73 20 69  mnLookahead is i
4f80: 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  nserted..  */.  
4f90: 66 6f 72 28 69 3d 70 2d 3e 6e 41 63 74 69 6f 6e  for(i=p->nAction
4fa0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
4fb0: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
4fc0: 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d  on[i].lookahead=
4fd0: 3d 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20  =p->mnLookahead 
4fe0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20  ){.      /* All 
4ff0: 6c 6f 6f 6b 61 68 65 61 64 73 20 61 6e 64 20 61  lookaheads and a
5000: 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 61 4c  ctions in the aL
5010: 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e 73  ookahead[] trans
5020: 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
5030: 6d 75 73 74 20 6d 61 74 63 68 20 61 67 61 69 6e  must match again
5040: 73 74 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  st the candidate
5050: 20 61 41 63 74 69 6f 6e 5b 69 5d 20 65 6e 74 72   aAction[i] entr
5060: 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  y. */.      if( 
5070: 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 61 63  p->aAction[i].ac
5080: 74 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63 74 69 6f  tion!=p->mnActio
5090: 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  n ) continue;.  
50a0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
50b0: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b  ->nLookahead; j+
50c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  +){.        k = 
50d0: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
50e0: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
50f0: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
5100: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3c 30  .        if( k<0
5110: 20 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f   || k>=p->nActio
5120: 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  n ) break;.     
5130: 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61     if( p->aLooka
5140: 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  head[j].lookahea
5150: 64 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d  d!=p->aAction[k]
5160: 2e 6c 6f 6f 6b 61 68 65 61 64 20 29 20 62 72 65  .lookahead ) bre
5170: 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
5180: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
5190: 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 61 41 63 74  .action!=p->aAct
51a0: 69 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e 20 29 20  ion[k].action ) 
51b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
51c0: 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c       if( j<p->nL
51d0: 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74 69  ookahead ) conti
51e0: 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4e  nue;..      /* N
51f0: 6f 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 61  o possible looka
5200: 68 65 61 64 20 76 61 6c 75 65 20 74 68 61 74 20  head value that 
5210: 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 61 4c  is not in the aL
5220: 6f 6f 6b 61 68 65 61 64 5b 5d 0a 20 20 20 20 20  ookahead[].     
5230: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
5240: 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d 61  is allowed to ma
5250: 74 63 68 20 61 41 63 74 69 6f 6e 5b 69 5d 20 2a  tch aAction[i] *
5260: 2f 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20  /.      n = 0;. 
5270: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
5280: 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29  p->nAction; j++)
5290: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
52a0: 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b  >aAction[j].look
52b0: 61 68 65 61 64 3c 30 20 29 20 63 6f 6e 74 69 6e  ahead<0 ) contin
52c0: 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
52d0: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f  p->aAction[j].lo
52e0: 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e  okahead==j+p->mn
52f0: 4c 6f 6f 6b 61 68 65 61 64 2d 69 20 29 20 6e 2b  Lookahead-i ) n+
5300: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
5310: 20 69 66 28 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b   if( n==p->nLook
5320: 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 20  ahead ){.       
5330: 20 62 72 65 61 6b 3b 20 20 2f 2a 20 41 6e 20 65   break;  /* An e
5340: 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 66 6f  xact match is fo
5350: 75 6e 64 20 61 74 20 6f 66 66 73 65 74 20 69 20  und at offset i 
5360: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
5370: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
5380: 20 65 78 69 73 74 69 6e 67 20 6f 66 66 73 65 74   existing offset
5390: 73 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 20  s exactly match 
53a0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
53b0: 73 61 63 74 69 6f 6e 2c 20 66 69 6e 64 20 61 6e  saction, find an
53c0: 0a 20 20 2a 2a 20 61 6e 20 65 6d 70 74 79 20 6f  .  ** an empty o
53d0: 66 66 73 65 74 20 69 6e 20 74 68 65 20 61 41 63  ffset in the aAc
53e0: 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 69 6e 20  tion[] table in 
53f0: 77 68 69 63 68 20 77 65 20 63 61 6e 20 61 64 64  which we can add
5400: 20 74 68 65 0a 20 20 2a 2a 20 61 4c 6f 6f 6b 61   the.  ** aLooka
5410: 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74 69  head[] transacti
5420: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  on..  */.  if( i
5430: 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f  <0 ){.    /* Loo
5440: 6b 20 66 6f 72 20 68 6f 6c 65 73 20 69 6e 20 74  k for holes in t
5450: 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 74 61 62  he aAction[] tab
5460: 6c 65 20 74 68 61 74 20 66 69 74 20 74 68 65 20  le that fit the 
5470: 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 61  current.    ** a
5480: 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e  Lookahead[] tran
5490: 73 61 63 74 69 6f 6e 2e 20 20 4c 65 61 76 65 20  saction.  Leave 
54a0: 69 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  i set to the off
54b0: 73 65 74 20 6f 66 20 74 68 65 20 68 6f 6c 65 2e  set of the hole.
54c0: 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 20 68 6f  .    ** If no ho
54d0: 6c 65 73 20 61 72 65 20 66 6f 75 6e 64 2c 20 69  les are found, i
54e0: 20 69 73 20 6c 65 66 74 20 61 74 20 70 2d 3e 6e   is left at p->n
54f0: 41 63 74 69 6f 6e 2c 20 77 68 69 63 68 20 6d 65  Action, which me
5500: 61 6e 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  ans the.    ** t
5510: 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
5520: 62 65 20 61 70 70 65 6e 64 65 64 2e 20 2a 2f 0a  be appended. */.
5530: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
5540: 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2d  ->nActionAlloc -
5550: 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b   p->mxLookahead;
5560: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
5570: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c   p->aAction[i].l
5580: 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b 0a 20 20  ookahead<0 ){.  
5590: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
55a0: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  <p->nLookahead; 
55b0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
55c0: 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  k = p->aLookahea
55d0: 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d  d[j].lookahead -
55e0: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
55f0: 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  + i;.          i
5600: 66 28 20 6b 3c 30 20 29 20 62 72 65 61 6b 3b 0a  f( k<0 ) break;.
5610: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
5620: 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b  >aAction[k].look
5630: 61 68 65 61 64 3e 3d 30 20 29 20 62 72 65 61 6b  ahead>=0 ) break
5640: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5650: 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f      if( j<p->nLo
5660: 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74 69 6e  okahead ) contin
5670: 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ue;.        for(
5680: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f  j=0; j<p->nActio
5690: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
56a0: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
56b0: 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d  n[j].lookahead==
56c0: 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  j+p->mnLookahead
56d0: 2d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  -i ) break;.    
56e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
56f0: 28 20 6a 3d 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20  ( j==p->nAction 
5700: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
5710: 61 6b 3b 20 20 2f 2a 20 46 69 74 73 20 69 6e 20  ak;  /* Fits in 
5720: 65 6d 70 74 79 20 73 6c 6f 74 73 20 2a 2f 0a 20  empty slots */. 
5730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5740: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
5750: 49 6e 73 65 72 74 20 74 72 61 6e 73 61 63 74 69  Insert transacti
5760: 6f 6e 20 73 65 74 20 61 74 20 69 6e 64 65 78 20  on set at index 
5770: 69 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b  i. */.  for(j=0;
5780: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
5790: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d 20  ; j++){.    k = 
57a0: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
57b0: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
57c0: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
57d0: 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b  .    p->aAction[
57e0: 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65  k] = p->aLookahe
57f0: 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b  ad[j];.    if( k
5800: 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 70  >=p->nAction ) p
5810: 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b  ->nAction = k+1;
5820: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61  .  }.  p->nLooka
5830: 68 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  head = 0;..  /* 
5840: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
5850: 74 20 74 68 61 74 20 69 73 20 61 64 64 65 64 20  t that is added 
5860: 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  to the lookahead
5870: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
5880: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
5890: 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 6f  into yy_action o
58a0: 66 20 74 68 65 20 61 63 74 69 6f 6e 20 2a 2f 0a  f the action */.
58b0: 20 20 72 65 74 75 72 6e 20 69 20 2d 20 70 2d 3e    return i - p->
58c0: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a  mnLookahead;.}..
58d0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
58e0: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
58f0: 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 63 22 20   file "build.c" 
5900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
5920: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  *.** Routines to
5930: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 68   construction th
5940: 65 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d  e finite state m
5950: 61 63 68 69 6e 65 20 66 6f 72 20 74 68 65 20 4c  achine for the L
5960: 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65 72 20 67  EMON.** parser g
5970: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
5980: 20 46 69 6e 64 20 61 20 70 72 65 63 65 64 65 6e   Find a preceden
5990: 63 65 20 73 79 6d 62 6f 6c 20 6f 66 20 65 76 65  ce symbol of eve
59a0: 72 79 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67  ry rule in the g
59b0: 72 61 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54  rammar..** .** T
59c0: 68 6f 73 65 20 72 75 6c 65 73 20 77 68 69 63 68  hose rules which
59d0: 20 68 61 76 65 20 61 20 70 72 65 63 65 64 65 6e   have a preceden
59e0: 63 65 20 73 79 6d 62 6f 6c 20 63 6f 64 65 64 20  ce symbol coded 
59f0: 69 6e 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20  in the input.** 
5a00: 67 72 61 6d 6d 61 72 20 75 73 69 6e 67 20 74 68  grammar using th
5a10: 65 20 22 5b 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e  e "[symbol]" con
5a20: 73 74 72 75 63 74 20 77 69 6c 6c 20 61 6c 72 65  struct will alre
5a30: 61 64 79 20 68 61 76 65 20 74 68 65 0a 2a 2a 20  ady have the.** 
5a40: 72 70 2d 3e 70 72 65 63 73 79 6d 20 66 69 65 6c  rp->precsym fiel
5a50: 64 20 66 69 6c 6c 65 64 2e 20 20 4f 74 68 65 72  d filled.  Other
5a60: 20 72 75 6c 65 73 20 74 61 6b 65 20 61 73 20 74   rules take as t
5a70: 68 65 69 72 20 70 72 65 63 65 64 65 6e 63 65 0a  heir precedence.
5a80: 2a 2a 20 73 79 6d 62 6f 6c 20 74 68 65 20 66 69  ** symbol the fi
5a90: 72 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 77  rst RHS symbol w
5aa0: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 70 72  ith a defined pr
5ab0: 65 63 65 64 65 6e 63 65 2e 20 20 49 66 20 74 68  ecedence.  If th
5ac0: 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 52  ere.** are not R
5ad0: 48 53 20 73 79 6d 62 6f 6c 73 20 77 69 74 68 20  HS symbols with 
5ae0: 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64  a defined preced
5af0: 65 6e 63 65 2c 20 74 68 65 20 70 72 65 63 65 64  ence, the preced
5b00: 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66  ence.** symbol f
5b10: 69 65 6c 64 20 69 73 20 6c 65 66 74 20 62 6c 61  ield is left bla
5b20: 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  nk..*/.void Find
5b30: 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28  RulePrecedences(
5b40: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 78 70  struct lemon *xp
5b50: 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ).{.  struct rul
5b60: 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72 70 3d  e *rp;.  for(rp=
5b70: 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  xp->rule; rp; rp
5b80: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
5b90: 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d  if( rp->precsym=
5ba0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
5bb0: 69 2c 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  i, j;.      for(
5bc0: 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 20  i=0; i<rp->nrhs 
5bd0: 26 26 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d  && rp->precsym==
5be0: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  0; i++){.       
5bf0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
5c00: 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
5c10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d  .        if( sp-
5c20: 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
5c30: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
5c40: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 70 2d    for(j=0; j<sp-
5c50: 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a  >nsubsym; j++){.
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
5c70: 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 70  sp->subsym[j]->p
5c80: 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rec>=0 ){.      
5c90: 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
5ca0: 73 79 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d  sym = sp->subsym
5cb0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [j];.           
5cc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5ce0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
5cf0: 65 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d  e if( sp->prec>=
5d00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
5d10: 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 72 70 2d  p->precsym = rp-
5d20: 3e 72 68 73 5b 69 5d 3b 0a 09 7d 0a 20 20 20 20  >rhs[i];..}.    
5d30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5d40: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69  return;.}../* Fi
5d50: 6e 64 20 61 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e  nd all nontermin
5d60: 61 6c 73 20 77 68 69 63 68 20 77 69 6c 6c 20 67  als which will g
5d70: 65 6e 65 72 61 74 65 20 74 68 65 20 65 6d 70 74  enerate the empt
5d80: 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 54 68 65  y string..** The
5d90: 6e 20 67 6f 20 62 61 63 6b 20 61 6e 64 20 63 6f  n go back and co
5da0: 6d 70 75 74 65 20 74 68 65 20 66 69 72 73 74 20  mpute the first 
5db0: 73 65 74 73 20 6f 66 20 65 76 65 72 79 20 6e 6f  sets of every no
5dc0: 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68  nterminal..** Th
5dd0: 65 20 66 69 72 73 74 20 73 65 74 20 69 73 20 74  e first set is t
5de0: 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 74 65  he set of all te
5df0: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 77  rminal symbols w
5e00: 68 69 63 68 20 63 61 6e 20 62 65 67 69 6e 0a 2a  hich can begin.*
5e10: 2a 20 61 20 73 74 72 69 6e 67 20 67 65 6e 65 72  * a string gener
5e20: 61 74 65 64 20 62 79 20 74 68 61 74 20 6e 6f 6e  ated by that non
5e30: 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69  terminal..*/.voi
5e40: 64 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28  d FindFirstSets(
5e50: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
5e60: 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  mp).{.  int i, j
5e70: 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
5e80: 2a 72 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72  *rp;.  int progr
5e90: 65 73 73 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ess;..  for(i=0;
5ea0: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
5eb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70  ; i++){.    lemp
5ec0: 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61  ->symbols[i]->la
5ed0: 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c  mbda = LEMON_FAL
5ee0: 53 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  SE;.  }.  for(i=
5ef0: 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
5f00: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
5f10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70  ; i++){.    lemp
5f20: 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69  ->symbols[i]->fi
5f30: 72 73 74 73 65 74 20 3d 20 53 65 74 4e 65 77 28  rstset = SetNew(
5f40: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72  );.  }..  /* Fir
5f50: 73 74 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20 6c  st compute all l
5f60: 61 6d 62 64 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a  ambdas */.  do{.
5f70: 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30      progress = 0
5f80: 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d  ;.    for(rp=lem
5f90: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
5fa0: 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  rp->next){.     
5fb0: 20 69 66 28 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61   if( rp->lhs->la
5fc0: 6d 62 64 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b  mbda ) continue;
5fd0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
5fe0: 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
5ff0: 7b 0a 20 20 20 20 20 20 20 20 20 73 74 72 75 63  {.         struc
6000: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72  t symbol *sp = r
6010: 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
6020: 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
6030: 21 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70  !=TERMINAL || sp
6040: 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f  ->lambda==LEMON_
6050: 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 20  FALSE ) break;. 
6060: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6070: 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 7b 0a   i==rp->nrhs ){.
6080: 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d          rp->lhs-
6090: 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f  >lambda = LEMON_
60a0: 54 52 55 45 3b 0a 20 20 20 20 20 20 20 20 70 72  TRUE;.        pr
60b0: 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20  ogress = 1;.    
60c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69    }.    }.  }whi
60d0: 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a  le( progress );.
60e0: 0a 20 20 2f 2a 20 4e 6f 77 20 63 6f 6d 70 75 74  .  /* Now comput
60f0: 65 20 61 6c 6c 20 66 69 72 73 74 20 73 65 74 73  e all first sets
6100: 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 73 74   */.  do{.    st
6110: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 31 2c  ruct symbol *s1,
6120: 20 2a 73 32 3b 0a 20 20 20 20 70 72 6f 67 72 65   *s2;.    progre
6130: 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ss = 0;.    for(
6140: 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
6150: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
6160: 0a 20 20 20 20 20 20 73 31 20 3d 20 72 70 2d 3e  .      s1 = rp->
6170: 6c 68 73 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  lhs;.      for(i
6180: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
6190: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 32  i++){.        s2
61a0: 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
61b0: 20 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e 74         if( s2->t
61c0: 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b  ype==TERMINAL ){
61d0: 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72  .          progr
61e0: 65 73 73 20 2b 3d 20 53 65 74 41 64 64 28 73 31  ess += SetAdd(s1
61f0: 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 69  ->firstset,s2->i
6200: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  ndex);.         
6210: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
6220: 7d 65 6c 73 65 20 69 66 28 20 73 32 2d 3e 74 79  }else if( s2->ty
6230: 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
6240: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  L ){.          f
6250: 6f 72 28 6a 3d 30 3b 20 6a 3c 73 32 2d 3e 6e 73  or(j=0; j<s2->ns
6260: 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ubsym; j++){.   
6270: 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73           progres
6280: 73 20 2b 3d 20 53 65 74 41 64 64 28 73 31 2d 3e  s += SetAdd(s1->
6290: 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 73 75 62  firstset,s2->sub
62a0: 73 79 6d 5b 6a 5d 2d 3e 69 6e 64 65 78 29 3b 0a  sym[j]->index);.
62b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
62c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 65        break;..}e
62d0: 6c 73 65 20 69 66 28 20 73 31 3d 3d 73 32 20 29  lse if( s1==s2 )
62e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
62f0: 73 31 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f  s1->lambda==LEMO
6300: 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b  N_FALSE ) break;
6310: 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20  ..}else{.       
6320: 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53     progress += S
6330: 65 74 55 6e 69 6f 6e 28 73 31 2d 3e 66 69 72 73  etUnion(s1->firs
6340: 74 73 65 74 2c 73 32 2d 3e 66 69 72 73 74 73 65  tset,s2->firstse
6350: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
6360: 28 20 73 32 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45  ( s2->lambda==LE
6370: 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61  MON_FALSE ) brea
6380: 6b 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20  k;..}.      }.  
6390: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72    }.  }while( pr
63a0: 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 65 74 75  ogress );.  retu
63b0: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74  rn;.}../* Comput
63c0: 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61 74  e all LR(0) stat
63d0: 65 73 20 66 6f 72 20 74 68 65 20 67 72 61 6d 6d  es for the gramm
63e0: 61 72 2e 20 20 4c 69 6e 6b 73 0a 2a 2a 20 61 72  ar.  Links.** ar
63f0: 65 20 61 64 64 65 64 20 74 6f 20 62 65 74 77 65  e added to betwe
6400: 65 6e 20 73 6f 6d 65 20 73 74 61 74 65 73 20 73  en some states s
6410: 6f 20 74 68 61 74 20 74 68 65 20 4c 52 28 31 29  o that the LR(1)
6420: 20 66 6f 6c 6c 6f 77 20 73 65 74 73 0a 2a 2a 20   follow sets.** 
6430: 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20  can be computed 
6440: 6c 61 74 65 72 2e 0a 2a 2f 0a 50 52 49 56 41 54  later..*/.PRIVAT
6450: 45 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  E struct state *
6460: 67 65 74 73 74 61 74 65 28 73 74 72 75 63 74 20  getstate(struct 
6470: 6c 65 6d 6f 6e 20 2a 29 3b 20 20 2f 2a 20 66 6f  lemon *);  /* fo
6480: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
6490: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 53 74 61 74  */.void FindStat
64a0: 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  es(struct lemon 
64b0: 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63  *lemp).{.  struc
64c0: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20  t symbol *sp;.  
64d0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
64e0: 0a 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69  ..  Configlist_i
64f0: 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  nit();..  /* Fin
6500: 64 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62  d the start symb
6510: 6f 6c 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70  ol */.  if( lemp
6520: 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73  ->start ){.    s
6530: 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  p = Symbol_find(
6540: 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20  lemp->start);.  
6550: 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20    if( sp==0 ){. 
6560: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
6570: 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a  mp->filename,0,.
6580: 22 54 68 65 20 73 70 65 63 69 66 69 65 64 20 73  "The specified s
6590: 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73  tart symbol \"%s
65a0: 5c 22 20 69 73 20 6e 6f 74 20 5c 0a 69 6e 20 61  \" is not \.in a
65b0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f 66 20   nonterminal of 
65c0: 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 5c 22  the grammar.  \"
65d0: 25 73 5c 22 20 77 69 6c 6c 20 62 65 20 75 73 65  %s\" will be use
65e0: 64 20 61 73 20 74 68 65 20 73 74 61 72 74 20 5c  d as the start \
65f0: 0a 73 79 6d 62 6f 6c 20 69 6e 73 74 65 61 64 2e  .symbol instead.
6600: 22 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 2c 6c 65  ",lemp->start,le
6610: 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 2d 3e 6e  mp->rule->lhs->n
6620: 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70  ame);.      lemp
6630: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
6640: 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72      sp = lemp->r
6650: 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 20 20 7d 0a  ule->lhs;.    }.
6660: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20    }else{.    sp 
6670: 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68  = lemp->rule->lh
6680: 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  s;.  }..  /* Mak
6690: 65 20 73 75 72 65 20 74 68 65 20 73 74 61 72 74  e sure the start
66a0: 20 73 79 6d 62 6f 6c 20 64 6f 65 73 6e 27 74 20   symbol doesn't 
66b0: 6f 63 63 75 72 20 6f 6e 20 74 68 65 20 72 69 67  occur on the rig
66c0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 0a  ht-hand side of.
66d0: 20 20 2a 2a 20 61 6e 79 20 72 75 6c 65 2e 20 20    ** any rule.  
66e0: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
66f0: 69 66 20 69 74 20 64 6f 65 73 2e 20 20 28 59 41  if it does.  (YA
6700: 43 43 20 77 6f 75 6c 64 20 67 65 6e 65 72 61 74  CC would generat
6710: 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 73 74 61  e a new.  ** sta
6720: 72 74 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69  rt symbol in thi
6730: 73 20 63 61 73 65 2e 29 20 2a 2f 0a 20 20 66 6f  s case.) */.  fo
6740: 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
6750: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
6760: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
6770: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
6780: 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
6790: 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b 69     if( rp->rhs[i
67a0: 5d 3d 3d 73 70 20 29 7b 20 20 20 2f 2a 20 46 49  ]==sp ){   /* FI
67b0: 58 20 4d 45 3a 20 20 44 65 61 6c 20 77 69 74 68  X ME:  Deal with
67c0: 20 6d 75 6c 74 69 74 65 72 6d 69 6e 61 6c 73 20   multiterminals 
67d0: 2a 2f 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  */.        Error
67e0: 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
67f0: 6d 65 2c 30 2c 0a 22 54 68 65 20 73 74 61 72 74  me,0,."The start
6800: 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 6f   symbol \"%s\" o
6810: 63 63 75 72 73 20 6f 6e 20 74 68 65 20 5c 0a 72  ccurs on the \.r
6820: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
6830: 66 20 61 20 72 75 6c 65 2e 20 54 68 69 73 20 77  f a rule. This w
6840: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 20  ill result in a 
6850: 70 61 72 73 65 72 20 77 68 69 63 68 20 5c 0a 64  parser which \.d
6860: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 70 72 6f  oes not work pro
6870: 70 65 72 6c 79 2e 22 2c 73 70 2d 3e 6e 61 6d 65  perly.",sp->name
6880: 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d  );.        lemp-
6890: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
68a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
68b0: 20 20 2f 2a 20 54 68 65 20 62 61 73 69 73 20 63    /* The basis c
68c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74  onfiguration set
68d0: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 73   for the first s
68e0: 74 61 74 65 0a 20 20 2a 2a 20 69 73 20 61 6c 6c  tate.  ** is all
68f0: 20 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76   rules which hav
6900: 65 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62  e the start symb
6910: 6f 6c 20 61 73 20 74 68 65 69 72 0a 20 20 2a 2a  ol as their.  **
6920: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
6930: 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 73 70 2d 3e  */.  for(rp=sp->
6940: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
6950: 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20 73  >nextlhs){.    s
6960: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
6970: 77 63 66 70 3b 0a 20 20 20 20 72 70 2d 3e 6c 68  wcfp;.    rp->lh
6980: 73 53 74 61 72 74 20 3d 20 31 3b 0a 20 20 20 20  sStart = 1;.    
6990: 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c  newcfp = Configl
69a0: 69 73 74 5f 61 64 64 62 61 73 69 73 28 72 70 2c  ist_addbasis(rp,
69b0: 30 29 3b 0a 20 20 20 20 53 65 74 41 64 64 28 6e  0);.    SetAdd(n
69c0: 65 77 63 66 70 2d 3e 66 77 73 2c 30 29 3b 0a 20  ewcfp->fws,0);. 
69d0: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
69e0: 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65   the first state
69f0: 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 73 74 61  .  All other sta
6a00: 74 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  tes will be.  **
6a10: 20 63 6f 6d 70 75 74 65 64 20 61 75 74 6f 6d 61   computed automa
6a20: 74 69 63 61 6c 6c 79 20 64 75 72 69 6e 67 20 74  tically during t
6a30: 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f  he computation o
6a40: 66 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e  f the first one.
6a50: 0a 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  .  ** The return
6a60: 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ed pointer to th
6a70: 65 20 66 69 72 73 74 20 73 74 61 74 65 20 69 73  e first state is
6a80: 20 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20   not used. */.  
6a90: 28 76 6f 69 64 29 67 65 74 73 74 61 74 65 28 6c  (void)getstate(l
6aa0: 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  emp);.  return;.
6ab0: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
6ac0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74  ointer to a stat
6ad0: 65 20 77 68 69 63 68 20 69 73 20 64 65 73 63 72  e which is descr
6ae0: 69 62 65 64 20 62 79 20 74 68 65 20 63 6f 6e 66  ibed by the conf
6af0: 69 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6c 69 73  iguration.** lis
6b00: 74 20 77 68 69 63 68 20 68 61 73 20 62 65 65 6e  t which has been
6b10: 20 62 75 69 6c 74 20 66 72 6f 6d 20 63 61 6c 6c   built from call
6b20: 73 20 74 6f 20 43 6f 6e 66 69 67 6c 69 73 74 5f  s to Configlist_
6b30: 61 64 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  add..*/.PRIVATE 
6b40: 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74 73  void buildshifts
6b50: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c  (struct lemon *,
6b60: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29   struct state *)
6b70: 3b 20 2f 2a 20 46 6f 72 77 64 20 72 65 66 20 2a  ; /* Forwd ref *
6b80: 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74  /.PRIVATE struct
6b90: 20 73 74 61 74 65 20 2a 67 65 74 73 74 61 74 65   state *getstate
6ba0: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
6bb0: 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp).{.  struct 
6bc0: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 62 70  config *cfp, *bp
6bd0: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
6be0: 20 2a 73 74 70 3b 0a 0a 20 20 2f 2a 20 45 78 74   *stp;..  /* Ext
6bf0: 72 61 63 74 20 74 68 65 20 73 6f 72 74 65 64 20  ract the sorted 
6c00: 62 61 73 69 73 20 6f 66 20 74 68 65 20 6e 65 77  basis of the new
6c10: 20 73 74 61 74 65 2e 20 20 54 68 65 20 62 61 73   state.  The bas
6c20: 69 73 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74  is was construct
6c30: 65 64 0a 20 20 2a 2a 20 62 79 20 70 72 69 6f 72  ed.  ** by prior
6c40: 20 63 61 6c 6c 73 20 74 6f 20 22 43 6f 6e 66 69   calls to "Confi
6c50: 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 29  glist_addbasis()
6c60: 22 2e 20 2a 2f 0a 20 20 43 6f 6e 66 69 67 6c 69  ". */.  Configli
6c70: 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29 3b 0a  st_sortbasis();.
6c80: 20 20 62 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73    bp = Configlis
6c90: 74 5f 62 61 73 69 73 28 29 3b 0a 0a 20 20 2f 2a  t_basis();..  /*
6ca0: 20 47 65 74 20 61 20 73 74 61 74 65 20 77 69 74   Get a state wit
6cb0: 68 20 74 68 65 20 73 61 6d 65 20 62 61 73 69 73  h the same basis
6cc0: 20 2a 2f 0a 20 20 73 74 70 20 3d 20 53 74 61 74   */.  stp = Stat
6cd0: 65 5f 66 69 6e 64 28 62 70 29 3b 0a 20 20 69 66  e_find(bp);.  if
6ce0: 28 20 73 74 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( stp ){.    /* 
6cf0: 41 20 73 74 61 74 65 20 77 69 74 68 20 74 68 65  A state with the
6d00: 20 73 61 6d 65 20 62 61 73 69 73 20 61 6c 72 65   same basis alre
6d10: 61 64 79 20 65 78 69 73 74 73 21 20 20 43 6f 70  ady exists!  Cop
6d20: 79 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77  y all the follow
6d30: 2d 73 65 74 0a 20 20 20 20 2a 2a 20 70 72 6f 70  -set.    ** prop
6d40: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 66 72  agation links fr
6d50: 6f 6d 20 74 68 65 20 73 74 61 74 65 20 75 6e 64  om the state und
6d60: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
6d70: 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
6d80: 70 72 65 65 78 69 73 74 69 6e 67 20 73 74 61 74  preexisting stat
6d90: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  e, then return a
6da0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6db0: 70 72 65 65 78 69 73 74 69 6e 67 20 73 74 61 74  preexisting stat
6dc0: 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
6dd0: 63 6f 6e 66 69 67 20 2a 78 2c 20 2a 79 3b 0a 20  config *x, *y;. 
6de0: 20 20 20 66 6f 72 28 78 3d 62 70 2c 20 79 3d 73     for(x=bp, y=s
6df0: 74 70 2d 3e 62 70 3b 20 78 20 26 26 20 79 3b 20  tp->bp; x && y; 
6e00: 78 3d 78 2d 3e 62 70 2c 20 79 3d 79 2d 3e 62 70  x=x->bp, y=y->bp
6e10: 29 7b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 63  ){.      Plink_c
6e20: 6f 70 79 28 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e  opy(&y->bplp,x->
6e30: 62 70 6c 70 29 3b 0a 20 20 20 20 20 20 50 6c 69  bplp);.      Pli
6e40: 6e 6b 5f 64 65 6c 65 74 65 28 78 2d 3e 66 70 6c  nk_delete(x->fpl
6e50: 70 29 3b 0a 20 20 20 20 20 20 78 2d 3e 66 70 6c  p);.      x->fpl
6e60: 70 20 3d 20 78 2d 3e 62 70 6c 70 20 3d 20 30 3b  p = x->bplp = 0;
6e70: 0a 20 20 20 20 7d 0a 20 20 20 20 63 66 70 20 3d  .    }.    cfp =
6e80: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75   Configlist_retu
6e90: 72 6e 28 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67  rn();.    Config
6ea0: 6c 69 73 74 5f 65 61 74 28 63 66 70 29 3b 0a 20  list_eat(cfp);. 
6eb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
6ec0: 68 69 73 20 72 65 61 6c 6c 79 20 69 73 20 61 20  his really is a 
6ed0: 6e 65 77 20 73 74 61 74 65 2e 20 20 43 6f 6e 73  new state.  Cons
6ee0: 74 72 75 63 74 20 61 6c 6c 20 74 68 65 20 64 65  truct all the de
6ef0: 74 61 69 6c 73 20 2a 2f 0a 20 20 20 20 43 6f 6e  tails */.    Con
6f00: 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28  figlist_closure(
6f10: 6c 65 6d 70 29 3b 20 20 20 20 2f 2a 20 43 6f 6d  lemp);    /* Com
6f20: 70 75 74 65 20 74 68 65 20 63 6f 6e 66 69 67 75  pute the configu
6f30: 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a  ration closure *
6f40: 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74  /.    Configlist
6f50: 5f 73 6f 72 74 28 29 3b 20 20 20 20 20 20 20 20  _sort();        
6f60: 20 20 20 2f 2a 20 53 6f 72 74 20 74 68 65 20 63     /* Sort the c
6f70: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f  onfiguration clo
6f80: 73 75 72 65 20 2a 2f 0a 20 20 20 20 63 66 70 20  sure */.    cfp 
6f90: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74  = Configlist_ret
6fa0: 75 72 6e 28 29 3b 20 20 20 2f 2a 20 47 65 74 20  urn();   /* Get 
6fb0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
6fc0: 20 63 6f 6e 66 69 67 20 6c 69 73 74 20 2a 2f 0a   config list */.
6fd0: 20 20 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f      stp = State_
6fe0: 6e 65 77 28 29 3b 20 20 20 20 20 20 20 20 20 20  new();          
6ff0: 20 2f 2a 20 41 20 6e 65 77 20 73 74 61 74 65 20   /* A new state 
7000: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
7010: 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 74 70   MemoryCheck(stp
7020: 29 3b 0a 20 20 20 20 73 74 70 2d 3e 62 70 20 3d  );.    stp->bp =
7030: 20 62 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   bp;            
7040: 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20      /* Remember 
7050: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
7060: 6e 20 62 61 73 69 73 20 2a 2f 0a 20 20 20 20 73  n basis */.    s
7070: 74 70 2d 3e 63 66 70 20 3d 20 63 66 70 3b 20 20  tp->cfp = cfp;  
7080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
7090: 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66  emember the conf
70a0: 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72  iguration closur
70b0: 65 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 73 74  e */.    stp->st
70c0: 61 74 65 6e 75 6d 20 3d 20 6c 65 6d 70 2d 3e 6e  atenum = lemp->n
70d0: 73 74 61 74 65 2b 2b 3b 20 2f 2a 20 45 76 65 72  state++; /* Ever
70e0: 79 20 73 74 61 74 65 20 67 65 74 73 20 61 20 73  y state gets a s
70f0: 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 2a  equence number *
7100: 2f 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20  /.    stp->ap = 
7110: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
7120: 20 20 20 2f 2a 20 4e 6f 20 61 63 74 69 6f 6e 73     /* No actions
7130: 2c 20 79 65 74 2e 20 2a 2f 0a 20 20 20 20 53 74  , yet. */.    St
7140: 61 74 65 5f 69 6e 73 65 72 74 28 73 74 70 2c 73  ate_insert(stp,s
7150: 74 70 2d 3e 62 70 29 3b 20 20 20 2f 2a 20 41 64  tp->bp);   /* Ad
7160: 64 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74  d to the state t
7170: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 62 75 69 6c  able */.    buil
7180: 64 73 68 69 66 74 73 28 6c 65 6d 70 2c 73 74 70  dshifts(lemp,stp
7190: 29 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 63 75  );       /* Recu
71a0: 72 73 69 76 65 6c 79 20 63 6f 6d 70 75 74 65 20  rsively compute 
71b0: 73 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 73  successor states
71c0: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
71d0: 20 73 74 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   stp;.}../*.** R
71e0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 77  eturn true if tw
71f0: 6f 20 73 79 6d 62 6f 6c 73 20 61 72 65 20 74 68  o symbols are th
7200: 65 20 73 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73  e same..*/.int s
7210: 61 6d 65 5f 73 79 6d 62 6f 6c 28 73 74 72 75 63  ame_symbol(struc
7220: 74 20 73 79 6d 62 6f 6c 20 2a 61 2c 20 73 74 72  t symbol *a, str
7230: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 29 0a 7b  uct symbol *b).{
7240: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
7250: 61 3d 3d 62 20 29 20 72 65 74 75 72 6e 20 31 3b  a==b ) return 1;
7260: 0a 20 20 69 66 28 20 61 2d 3e 74 79 70 65 21 3d  .  if( a->type!=
7270: 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 20  MULTITERMINAL ) 
7280: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
7290: 62 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45  b->type!=MULTITE
72a0: 52 4d 49 4e 41 4c 20 29 20 72 65 74 75 72 6e 20  RMINAL ) return 
72b0: 30 3b 0a 20 20 69 66 28 20 61 2d 3e 6e 73 75 62  0;.  if( a->nsub
72c0: 73 79 6d 21 3d 62 2d 3e 6e 73 75 62 73 79 6d 20  sym!=b->nsubsym 
72d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
72e0: 72 28 69 3d 30 3b 20 69 3c 61 2d 3e 6e 73 75 62  r(i=0; i<a->nsub
72f0: 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  sym; i++){.    i
7300: 66 28 20 61 2d 3e 73 75 62 73 79 6d 5b 69 5d 21  f( a->subsym[i]!
7310: 3d 62 2d 3e 73 75 62 73 79 6d 5b 69 5d 20 29 20  =b->subsym[i] ) 
7320: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
7330: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20  return 1;.}../* 
7340: 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20 73 75  Construct all su
7350: 63 63 65 73 73 6f 72 20 73 74 61 74 65 73 20 74  ccessor states t
7360: 6f 20 74 68 65 20 67 69 76 65 6e 20 73 74 61 74  o the given stat
7370: 65 2e 20 20 41 20 22 73 75 63 63 65 73 73 6f 72  e.  A "successor
7380: 22 0a 2a 2a 20 73 74 61 74 65 20 69 73 20 61 6e  ".** state is an
7390: 79 20 73 74 61 74 65 20 77 68 69 63 68 20 63 61  y state which ca
73a0: 6e 20 62 65 20 72 65 61 63 68 65 64 20 62 79 20  n be reached by 
73b0: 61 20 73 68 69 66 74 20 61 63 74 69 6f 6e 2e 0a  a shift action..
73c0: 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
73d0: 62 75 69 6c 64 73 68 69 66 74 73 28 73 74 72 75  buildshifts(stru
73e0: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20  ct lemon *lemp, 
73f0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
7400: 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  p).{.  struct co
7410: 6e 66 69 67 20 2a 63 66 70 3b 20 20 2f 2a 20 46  nfig *cfp;  /* F
7420: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 75 20  or looping thru 
7430: 74 68 65 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75  the config closu
7440: 72 65 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20  re of "stp" */. 
7450: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
7460: 62 63 66 70 3b 20 2f 2a 20 46 6f 72 20 74 68 65  bcfp; /* For the
7470: 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 6f 6e 20 63   inner loop on c
7480: 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66  onfig closure of
7490: 20 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75   "stp" */.  stru
74a0: 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66  ct config *newcf
74b0: 67 3b 20 20 2f 2a 20 2a 2f 0a 20 20 73 74 72 75  g;  /* */.  stru
74c0: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20  ct symbol *sp;  
74d0: 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f   /* Symbol follo
74e0: 77 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e 20  wing the dot in 
74f0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 63  configuration "c
7500: 66 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  fp" */.  struct 
7510: 73 79 6d 62 6f 6c 20 2a 62 73 70 3b 20 20 2f 2a  symbol *bsp;  /*
7520: 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e   Symbol followin
7530: 67 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e  g the dot in con
7540: 66 69 67 75 72 61 74 69 6f 6e 20 22 62 63 66 70  figuration "bcfp
7550: 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  " */.  struct st
7560: 61 74 65 20 2a 6e 65 77 73 74 70 3b 20 2f 2a 20  ate *newstp; /* 
7570: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  A pointer to a s
7580: 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 20 2a  uccessor state *
7590: 2f 0a 0a 20 20 2f 2a 20 45 61 63 68 20 63 6f 6e  /..  /* Each con
75a0: 66 69 67 75 72 61 74 69 6f 6e 20 62 65 63 6f 6d  figuration becom
75b0: 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 66 74 65  es complete afte
75c0: 72 20 69 74 20 63 6f 6e 74 69 62 75 74 65 73 20  r it contibutes 
75d0: 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72 0a 20  to a successor. 
75e0: 20 2a 2a 20 73 74 61 74 65 2e 20 20 49 6e 69 74   ** state.  Init
75f0: 69 61 6c 6c 79 2c 20 61 6c 6c 20 63 6f 6e 66 69  ially, all confi
7600: 67 75 72 61 74 69 6f 6e 73 20 61 72 65 20 69 6e  gurations are in
7610: 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 66 6f  complete */.  fo
7620: 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20  r(cfp=stp->cfp; 
7630: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
7640: 78 74 29 20 63 66 70 2d 3e 73 74 61 74 75 73 20  xt) cfp->status 
7650: 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 0a 20  = INCOMPLETE;.. 
7660: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
7670: 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   all configurati
7680: 6f 6e 73 20 6f 66 20 74 68 65 20 73 74 61 74 65  ons of the state
7690: 20 22 73 74 70 22 20 2a 2f 0a 20 20 66 6f 72 28   "stp" */.  for(
76a0: 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66  cfp=stp->cfp; cf
76b0: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
76c0: 29 7b 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e  ){.    if( cfp->
76d0: 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45  status==COMPLETE
76e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20   ) continue;    
76f0: 2f 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64 20  /* Already used 
7700: 62 79 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  by inner loop */
7710: 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f  .    if( cfp->do
7720: 74 3e 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73  t>=cfp->rp->nrhs
7730: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a   ) continue;  /*
7740: 20 43 61 6e 27 74 20 73 68 69 66 74 20 74 68 69   Can't shift thi
7750: 73 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20  s config */.    
7760: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74  Configlist_reset
7770: 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ();             
7780: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 65           /* Rese
7790: 74 20 74 68 65 20 6e 65 77 20 63 6f 6e 66 69 67  t the new config
77a0: 20 73 65 74 20 2a 2f 0a 20 20 20 20 73 70 20 3d   set */.    sp =
77b0: 20 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 63 66   cfp->rp->rhs[cf
77c0: 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20  p->dot];        
77d0: 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 61       /* Symbol a
77e0: 66 74 65 72 20 74 68 65 20 64 6f 74 20 2a 2f 0a  fter the dot */.
77f0: 0a 20 20 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  .    /* For ever
7800: 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  y configuration 
7810: 69 6e 20 74 68 65 20 73 74 61 74 65 20 22 73 74  in the state "st
7820: 70 22 20 77 68 69 63 68 20 68 61 73 20 74 68 65  p" which has the
7830: 20 73 79 6d 62 6f 6c 20 22 73 70 22 0a 20 20 20   symbol "sp".   
7840: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74   ** following it
7850: 73 20 64 6f 74 2c 20 61 64 64 20 74 68 65 20 73  s dot, add the s
7860: 61 6d 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ame configuratio
7870: 6e 20 74 6f 20 74 68 65 20 62 61 73 69 73 20 73  n to the basis s
7880: 65 74 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20  et under.    ** 
7890: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 62 75 74  construction but
78a0: 20 77 69 74 68 20 74 68 65 20 64 6f 74 20 73 68   with the dot sh
78b0: 69 66 74 65 64 20 6f 6e 65 20 73 79 6d 62 6f 6c  ifted one symbol
78c0: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 2a   to the right. *
78d0: 2f 0a 20 20 20 20 66 6f 72 28 62 63 66 70 3d 63  /.    for(bcfp=c
78e0: 66 70 3b 20 62 63 66 70 3b 20 62 63 66 70 3d 62  fp; bcfp; bcfp=b
78f0: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
7900: 20 20 69 66 28 20 62 63 66 70 2d 3e 73 74 61 74    if( bcfp->stat
7910: 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63  us==COMPLETE ) c
7920: 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41  ontinue;    /* A
7930: 6c 72 65 61 64 79 20 75 73 65 64 20 2a 2f 0a 20  lready used */. 
7940: 20 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e 64       if( bcfp->d
7950: 6f 74 3e 3d 62 63 66 70 2d 3e 72 70 2d 3e 6e 72  ot>=bcfp->rp->nr
7960: 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f  hs ) continue; /
7970: 2a 20 43 61 6e 27 74 20 73 68 69 66 74 20 74 68  * Can't shift th
7980: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  is one */.      
7990: 62 73 70 20 3d 20 62 63 66 70 2d 3e 72 70 2d 3e  bsp = bcfp->rp->
79a0: 72 68 73 5b 62 63 66 70 2d 3e 64 6f 74 5d 3b 20  rhs[bcfp->dot]; 
79b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74            /* Get
79c0: 20 73 79 6d 62 6f 6c 20 61 66 74 65 72 20 64 6f   symbol after do
79d0: 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21  t */.      if( !
79e0: 73 61 6d 65 5f 73 79 6d 62 6f 6c 28 62 73 70 2c  same_symbol(bsp,
79f0: 73 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  sp) ) continue; 
7a00: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
7a10: 73 61 6d 65 20 61 73 20 66 6f 72 20 22 63 66 70  same as for "cfp
7a20: 22 20 2a 2f 0a 20 20 20 20 20 20 62 63 66 70 2d  " */.      bcfp-
7a30: 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45  >status = COMPLE
7a40: 54 45 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  TE;             
7a50: 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 69       /* Mark thi
7a60: 73 20 63 6f 6e 66 69 67 20 61 73 20 75 73 65 64  s config as used
7a70: 20 2a 2f 0a 20 20 20 20 20 20 6e 65 77 63 66 67   */.      newcfg
7a80: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64   = Configlist_ad
7a90: 64 62 61 73 69 73 28 62 63 66 70 2d 3e 72 70 2c  dbasis(bcfp->rp,
7aa0: 62 63 66 70 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20  bcfp->dot+1);.  
7ab0: 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6e      Plink_add(&n
7ac0: 65 77 63 66 67 2d 3e 62 70 6c 70 2c 62 63 66 70  ewcfg->bplp,bcfp
7ad0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
7ae0: 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74   Get a pointer t
7af0: 6f 20 74 68 65 20 73 74 61 74 65 20 64 65 73 63  o the state desc
7b00: 72 69 62 65 64 20 62 79 20 74 68 65 20 62 61 73  ribed by the bas
7b10: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
7b20: 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 73   set.    ** cons
7b30: 74 72 75 63 74 65 64 20 69 6e 20 74 68 65 20 70  tructed in the p
7b40: 72 65 63 65 64 69 6e 67 20 6c 6f 6f 70 20 2a 2f  receding loop */
7b50: 0a 20 20 20 20 6e 65 77 73 74 70 20 3d 20 67 65  .    newstp = ge
7b60: 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 0a 20  tstate(lemp);.. 
7b70: 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20     /* The state 
7b80: 22 6e 65 77 73 74 70 22 20 69 73 20 72 65 61 63  "newstp" is reac
7b90: 68 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  hed from the sta
7ba0: 74 65 20 22 73 74 70 22 20 62 79 20 61 20 73 68  te "stp" by a sh
7bb0: 69 66 74 20 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ift action.    *
7bc0: 2a 20 6f 6e 20 74 68 65 20 73 79 6d 62 6f 6c 20  * on the symbol 
7bd0: 22 73 70 22 20 2a 2f 0a 20 20 20 20 69 66 28 20  "sp" */.    if( 
7be0: 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54  sp->type==MULTIT
7bf0: 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
7c00: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
7c10: 72 28 69 3d 30 3b 20 69 3c 73 70 2d 3e 6e 73 75  r(i=0; i<sp->nsu
7c20: 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bsym; i++){.    
7c30: 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26      Action_add(&
7c40: 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70  stp->ap,SHIFT,sp
7c50: 2d 3e 73 75 62 73 79 6d 5b 69 5d 2c 28 63 68 61  ->subsym[i],(cha
7c60: 72 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20 20  r*)newstp);.    
7c70: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
7c80: 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28       Action_add(
7c90: 26 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73  &stp->ap,SHIFT,s
7ca0: 70 2c 28 63 68 61 72 20 2a 29 6e 65 77 73 74 70  p,(char *)newstp
7cb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
7cc0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
7cd0: 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  the propagation 
7ce0: 6c 69 6e 6b 73 0a 2a 2f 0a 76 6f 69 64 20 46 69  links.*/.void Fi
7cf0: 6e 64 4c 69 6e 6b 73 28 73 74 72 75 63 74 20 6c  ndLinks(struct l
7d00: 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
7d10: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
7d20: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6f 74  config *cfp, *ot
7d30: 68 65 72 3b 0a 20 20 73 74 72 75 63 74 20 73 74  her;.  struct st
7d40: 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
7d50: 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a  ct plink *plp;..
7d60: 20 20 2f 2a 20 48 6f 75 73 65 6b 65 65 70 69 6e    /* Housekeepin
7d70: 67 20 64 65 74 61 69 6c 3a 0a 20 20 2a 2a 20 41  g detail:.  ** A
7d80: 64 64 20 74 6f 20 65 76 65 72 79 20 70 72 6f 70  dd to every prop
7d90: 61 67 61 74 65 20 6c 69 6e 6b 20 61 20 70 6f 69  agate link a poi
7da0: 6e 74 65 72 20 62 61 63 6b 20 74 6f 20 74 68 65  nter back to the
7db0: 20 73 74 61 74 65 20 74 6f 0a 20 20 2a 2a 20 77   state to.  ** w
7dc0: 68 69 63 68 20 74 68 65 20 6c 69 6e 6b 20 69 73  hich the link is
7dd0: 20 61 74 74 61 63 68 65 64 2e 20 2a 2f 0a 20 20   attached. */.  
7de0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
7df0: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
7e00: 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
7e10: 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f  orted[i];.    fo
7e20: 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20  r(cfp=stp->cfp; 
7e30: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
7e40: 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e  xt){.      cfp->
7e50: 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 7d  stp = stp;.    }
7e60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  .  }..  /* Conve
7e70: 72 74 20 61 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73  rt all backlinks
7e80: 20 69 6e 74 6f 20 66 6f 72 77 61 72 64 20 6c 69   into forward li
7e90: 6e 6b 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66  nks.  Only the f
7ea0: 6f 72 77 61 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b  orward.  ** link
7eb0: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
7ec0: 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d  e follow-set com
7ed0: 70 75 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66  putation. */.  f
7ee0: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
7ef0: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
7f00: 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
7f10: 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  rted[i];.    for
7f20: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
7f30: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
7f40: 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 6c  t){.      for(pl
7f50: 70 3d 63 66 70 2d 3e 62 70 6c 70 3b 20 70 6c 70  p=cfp->bplp; plp
7f60: 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29  ; plp=plp->next)
7f70: 7b 0a 20 20 20 20 20 20 20 20 6f 74 68 65 72 20  {.        other 
7f80: 3d 20 70 6c 70 2d 3e 63 66 70 3b 0a 20 20 20 20  = plp->cfp;.    
7f90: 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6f      Plink_add(&o
7fa0: 74 68 65 72 2d 3e 66 70 6c 70 2c 63 66 70 29 3b  ther->fplp,cfp);
7fb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7fc0: 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65   }.}../* Compute
7fd0: 20 61 6c 6c 20 66 6f 6c 6c 6f 77 73 65 74 73 2e   all followsets.
7fe0: 0a 2a 2a 0a 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73  .**.** A follows
7ff0: 65 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66  et is the set of
8000: 20 61 6c 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69   all symbols whi
8010: 63 68 20 63 61 6e 20 63 6f 6d 65 20 69 6d 6d 65  ch can come imme
8020: 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72  diately.** after
8030: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
8040: 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 6f  ..*/.void FindFo
8050: 6c 6c 6f 77 53 65 74 73 28 73 74 72 75 63 74 20  llowSets(struct 
8060: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
8070: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
8080: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20   config *cfp;.  
8090: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c  struct plink *pl
80a0: 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73  p;.  int progres
80b0: 73 3b 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 3b  s;.  int change;
80c0: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ..  for(i=0; i<l
80d0: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
80e0: 29 7b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 6c  ){.    for(cfp=l
80f0: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e  emp->sorted[i]->
8100: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
8110: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
8120: 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e  cfp->status = IN
8130: 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 7d 0a  COMPLETE;.    }.
8140: 20 20 7d 0a 20 20 0a 20 20 64 6f 7b 0a 20 20 20    }.  .  do{.   
8150: 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20   progress = 0;. 
8160: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
8170: 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
8180: 7b 0a 20 20 20 20 20 20 66 6f 72 28 63 66 70 3d  {.      for(cfp=
8190: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d  lemp->sorted[i]-
81a0: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
81b0: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
81c0: 20 20 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74     if( cfp->stat
81d0: 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63  us==COMPLETE ) c
81e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
81f0: 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 66 70   for(plp=cfp->fp
8200: 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70  lp; plp; plp=plp
8210: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
8220: 20 20 20 63 68 61 6e 67 65 20 3d 20 53 65 74 55     change = SetU
8230: 6e 69 6f 6e 28 70 6c 70 2d 3e 63 66 70 2d 3e 66  nion(plp->cfp->f
8240: 77 73 2c 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20  ws,cfp->fws);.  
8250: 20 20 20 20 20 20 20 20 69 66 28 20 63 68 61 6e          if( chan
8260: 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
8270: 20 20 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 61 74    plp->cfp->stat
8280: 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b  us = INCOMPLETE;
8290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f  .            pro
82a0: 67 72 65 73 73 20 3d 20 31 3b 0a 09 20 20 7d 0a  gress = 1;..  }.
82b0: 09 7d 0a 20 20 20 20 20 20 20 20 63 66 70 2d 3e  .}.        cfp->
82c0: 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54  status = COMPLET
82d0: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
82e0: 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72  .  }while( progr
82f0: 65 73 73 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  ess );.}..static
8300: 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f 6e   int resolve_con
8310: 66 6c 69 63 74 28 73 74 72 75 63 74 20 61 63 74  flict(struct act
8320: 69 6f 6e 20 2a 2c 73 74 72 75 63 74 20 61 63 74  ion *,struct act
8330: 69 6f 6e 20 2a 2c 20 73 74 72 75 63 74 20 73 79  ion *, struct sy
8340: 6d 62 6f 6c 20 2a 29 3b 0a 0a 2f 2a 20 43 6f 6d  mbol *);../* Com
8350: 70 75 74 65 20 74 68 65 20 72 65 64 75 63 65 20  pute the reduce 
8360: 61 63 74 69 6f 6e 73 2c 20 61 6e 64 20 72 65 73  actions, and res
8370: 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73 2e 0a  olve conflicts..
8380: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 41 63 74 69  */.void FindActi
8390: 6f 6e 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ons(struct lemon
83a0: 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20   *lemp).{.  int 
83b0: 69 2c 6a 3b 0a 20 20 73 74 72 75 63 74 20 63 6f  i,j;.  struct co
83c0: 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72  nfig *cfp;.  str
83d0: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
83e0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
83f0: 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75  *sp;.  struct ru
8400: 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f 2a 20 41 64  le *rp;..  /* Ad
8410: 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 64  d all of the red
8420: 75 63 65 20 61 63 74 69 6f 6e 73 20 0a 20 20 2a  uce actions .  *
8430: 2a 20 41 20 72 65 64 75 63 65 20 61 63 74 69 6f  * A reduce actio
8440: 6e 20 69 73 20 61 64 64 65 64 20 66 6f 72 20 65  n is added for e
8450: 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ach element of t
8460: 68 65 20 66 6f 6c 6c 6f 77 73 65 74 20 6f 66 0a  he followset of.
8470: 20 20 2a 2a 20 61 20 63 6f 6e 66 69 67 75 72 61    ** a configura
8480: 74 69 6f 6e 20 77 68 69 63 68 20 68 61 73 20 69  tion which has i
8490: 74 73 20 64 6f 74 20 61 74 20 74 68 65 20 65 78  ts dot at the ex
84a0: 74 72 65 6d 65 20 72 69 67 68 74 2e 0a 20 20 2a  treme right..  *
84b0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
84c0: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
84d0: 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  ){   /* Loop ove
84e0: 72 20 61 6c 6c 20 73 74 61 74 65 73 20 2a 2f 0a  r all states */.
84f0: 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
8500: 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66  sorted[i];.    f
8510: 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b  or(cfp=stp->cfp;
8520: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
8530: 65 78 74 29 7b 20 20 2f 2a 20 4c 6f 6f 70 20 6f  ext){  /* Loop o
8540: 76 65 72 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72  ver all configur
8550: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ations */.      
8560: 69 66 28 20 63 66 70 2d 3e 72 70 2d 3e 6e 72 68  if( cfp->rp->nrh
8570: 73 3d 3d 63 66 70 2d 3e 64 6f 74 20 29 7b 20 20  s==cfp->dot ){  
8580: 20 20 20 20 20 20 2f 2a 20 49 73 20 64 6f 74 20        /* Is dot 
8590: 61 74 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  at extreme right
85a0: 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  ? */.        for
85b0: 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74  (j=0; j<lemp->nt
85c0: 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20  erminal; j++){. 
85d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 53 65 74           if( Set
85e0: 46 69 6e 64 28 63 66 70 2d 3e 66 77 73 2c 6a 29  Find(cfp->fws,j)
85f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8600: 2f 2a 20 41 64 64 20 61 20 72 65 64 75 63 65 20  /* Add a reduce 
8610: 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 73 74  action to the st
8620: 61 74 65 20 22 73 74 70 22 20 77 68 69 63 68 20  ate "stp" which 
8630: 77 69 6c 6c 20 72 65 64 75 63 65 20 62 79 20 74  will reduce by t
8640: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
8650: 2a 20 72 75 6c 65 20 22 63 66 70 2d 3e 72 70 22  * rule "cfp->rp"
8660: 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   if the lookahea
8670: 64 20 73 79 6d 62 6f 6c 20 69 73 20 22 6c 65 6d  d symbol is "lem
8680: 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 22 20 2a  p->symbols[j]" *
8690: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 63  /.            Ac
86a0: 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61  tion_add(&stp->a
86b0: 70 2c 52 45 44 55 43 45 2c 6c 65 6d 70 2d 3e 73  p,REDUCE,lemp->s
86c0: 79 6d 62 6f 6c 73 5b 6a 5d 2c 28 63 68 61 72 20  ymbols[j],(char 
86d0: 2a 29 63 66 70 2d 3e 72 70 29 3b 0a 20 20 20 20  *)cfp->rp);.    
86e0: 20 20 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 20        }..}.     
86f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
8700: 2f 2a 20 41 64 64 20 74 68 65 20 61 63 63 65 70  /* Add the accep
8710: 74 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  ting token */.  
8720: 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20  if( lemp->start 
8730: 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62  ){.    sp = Symb
8740: 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74  ol_find(lemp->st
8750: 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70  art);.    if( sp
8760: 3d 3d 30 20 29 20 73 70 20 3d 20 6c 65 6d 70 2d  ==0 ) sp = lemp-
8770: 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65  >rule->lhs;.  }e
8780: 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65  lse{.    sp = le
8790: 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20  mp->rule->lhs;. 
87a0: 20 7d 0a 20 20 2f 2a 20 41 64 64 20 74 6f 20 74   }.  /* Add to t
87b0: 68 65 20 66 69 72 73 74 20 73 74 61 74 65 20 28  he first state (
87c0: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20  which is always 
87d0: 74 68 65 20 73 74 61 72 74 69 6e 67 20 73 74 61  the starting sta
87e0: 74 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  te of the.  ** f
87f0: 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68  inite state mach
8800: 69 6e 65 29 20 61 6e 20 61 63 74 69 6f 6e 20 74  ine) an action t
8810: 6f 20 41 43 43 45 50 54 20 69 66 20 74 68 65 20  o ACCEPT if the 
8820: 6c 6f 6f 6b 61 68 65 61 64 20 69 73 20 74 68 65  lookahead is the
8830: 0a 20 20 2a 2a 20 73 74 61 72 74 20 6e 6f 6e 74  .  ** start nont
8840: 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f 0a 20 20 41  erminal.  */.  A
8850: 63 74 69 6f 6e 5f 61 64 64 28 26 6c 65 6d 70 2d  ction_add(&lemp-
8860: 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e 61 70 2c 41  >sorted[0]->ap,A
8870: 43 43 45 50 54 2c 73 70 2c 30 29 3b 0a 0a 20 20  CCEPT,sp,0);..  
8880: 2f 2a 20 52 65 73 6f 6c 76 65 20 63 6f 6e 66 6c  /* Resolve confl
8890: 69 63 74 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  icts */.  for(i=
88a0: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
88b0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  e; i++){.    str
88c0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20  uct action *ap, 
88d0: 2a 6e 61 70 3b 0a 20 20 20 20 73 74 72 75 63 74  *nap;.    struct
88e0: 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 20   state *stp;.   
88f0: 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
8900: 74 65 64 5b 69 5d 3b 0a 20 20 20 20 2f 2a 20 61  ted[i];.    /* a
8910: 73 73 65 72 74 28 20 73 74 70 2d 3e 61 70 20 29  ssert( stp->ap )
8920: 3b 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 61 70  ; */.    stp->ap
8930: 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73   = Action_sort(s
8940: 74 70 2d 3e 61 70 29 3b 0a 20 20 20 20 66 6f 72  tp->ap);.    for
8950: 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 20  (ap=stp->ap; ap 
8960: 26 26 20 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3d  && ap->next; ap=
8970: 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
8980: 20 66 6f 72 28 6e 61 70 3d 61 70 2d 3e 6e 65 78   for(nap=ap->nex
8990: 74 3b 20 6e 61 70 20 26 26 20 6e 61 70 2d 3e 73  t; nap && nap->s
89a0: 70 3d 3d 61 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e  p==ap->sp; nap=n
89b0: 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
89c0: 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 61      /* The two a
89d0: 63 74 69 6f 6e 73 20 22 61 70 22 20 61 6e 64 20  ctions "ap" and 
89e0: 22 6e 61 70 22 20 68 61 76 65 20 74 68 65 20 73  "nap" have the s
89f0: 61 6d 65 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20  ame lookahead.. 
8a00: 20 20 20 20 20 20 20 20 2a 2a 20 46 69 67 75 72          ** Figur
8a10: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
8a20: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 2a  should be used *
8a30: 2f 0a 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d  /.         lemp-
8a40: 3e 6e 63 6f 6e 66 6c 69 63 74 20 2b 3d 20 72 65  >nconflict += re
8a50: 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61  solve_conflict(a
8a60: 70 2c 6e 61 70 2c 6c 65 6d 70 2d 3e 65 72 72 73  p,nap,lemp->errs
8a70: 79 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ym);.      }.   
8a80: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
8a90: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 66 6f 72  ort an error for
8aa0: 20 65 61 63 68 20 72 75 6c 65 20 74 68 61 74 20   each rule that 
8ab0: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 72 65 64  can never be red
8ac0: 75 63 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 72  uced. */.  for(r
8ad0: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
8ae0: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 20 72  ; rp=rp->next) r
8af0: 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 4c  p->canReduce = L
8b00: 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 66 6f  EMON_FALSE;.  fo
8b10: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
8b20: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
8b30: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
8b40: 61 70 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 6c  ap;.    for(ap=l
8b50: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e  emp->sorted[i]->
8b60: 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
8b70: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
8b80: 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  ap->type==REDUCE
8b90: 20 29 20 61 70 2d 3e 78 2e 72 70 2d 3e 63 61 6e   ) ap->x.rp->can
8ba0: 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f 54  Reduce = LEMON_T
8bb0: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  RUE;.    }.  }. 
8bc0: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
8bd0: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
8be0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70  ext){.    if( rp
8bf0: 2d 3e 63 61 6e 52 65 64 75 63 65 20 29 20 63 6f  ->canReduce ) co
8c00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 45 72 72 6f  ntinue;.    Erro
8c10: 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
8c20: 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65  ame,rp->ruleline
8c30: 2c 22 54 68 69 73 20 72 75 6c 65 20 63 61 6e 20  ,"This rule can 
8c40: 6e 6f 74 20 62 65 20 72 65 64 75 63 65 64 2e 5c  not be reduced.\
8c50: 6e 22 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65  n");.    lemp->e
8c60: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d  rrorcnt++;.  }.}
8c70: 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61 20 63  ../* Resolve a c
8c80: 6f 6e 66 6c 69 63 74 20 62 65 74 77 65 65 6e 20  onflict between 
8c90: 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20 61 63  the two given ac
8ca0: 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 0a 2a  tions.  If the.*
8cb0: 2a 20 63 6f 6e 66 6c 69 63 74 20 63 61 6e 27 74  * conflict can't
8cc0: 20 62 65 20 72 65 73 6f 6c 76 65 64 2c 20 72 65   be resolved, re
8cd0: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
8ce0: 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47 45 52 20 54  *.** NO LONGER T
8cf0: 52 55 45 3a 0a 2a 2a 20 20 20 54 6f 20 72 65 73  RUE:.**   To res
8d00: 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 2c  olve a conflict,
8d10: 20 66 69 72 73 74 20 6c 6f 6f 6b 20 74 6f 20 73   first look to s
8d20: 65 65 20 69 66 20 65 69 74 68 65 72 20 61 63 74  ee if either act
8d30: 69 6f 6e 0a 2a 2a 20 20 20 69 73 20 6f 6e 20 61  ion.**   is on a
8d40: 6e 20 65 72 72 6f 72 20 72 75 6c 65 2e 20 20 49  n error rule.  I
8d50: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 61 6b  n that case, tak
8d60: 65 20 74 68 65 20 61 63 74 69 6f 6e 20 77 68 69  e the action whi
8d70: 63 68 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20 61  ch.**   is not a
8d80: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
8d90: 68 65 20 65 72 72 6f 72 20 72 75 6c 65 2e 20 20  he error rule.  
8da0: 49 66 20 6e 65 69 74 68 65 72 20 6f 72 20 62 6f  If neither or bo
8db0: 74 68 0a 2a 2a 20 20 20 61 63 74 69 6f 6e 73 20  th.**   actions 
8dc0: 61 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  are associated w
8dd0: 69 74 68 20 61 6e 20 65 72 72 6f 72 20 72 75 6c  ith an error rul
8de0: 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 0a 2a  e, then try to.*
8df0: 2a 20 20 20 75 73 65 20 70 72 65 63 65 64 65 6e  *   use preceden
8e00: 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68  ce to resolve th
8e10: 65 20 63 6f 6e 66 6c 69 63 74 2e 0a 2a 2a 0a 2a  e conflict..**.*
8e20: 2a 20 49 66 20 65 69 74 68 65 72 20 61 63 74 69  * If either acti
8e30: 6f 6e 20 69 73 20 61 20 53 48 49 46 54 2c 20 74  on is a SHIFT, t
8e40: 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20 61  hen it must be a
8e50: 70 78 2e 20 20 54 68 69 73 0a 2a 2a 20 66 75 6e  px.  This.** fun
8e60: 63 74 69 6f 6e 20 77 6f 6e 27 74 20 77 6f 72 6b  ction won't work
8e70: 20 69 66 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52   if apx->type==R
8e80: 45 44 55 43 45 20 61 6e 64 20 61 70 79 2d 3e 74  EDUCE and apy->t
8e90: 79 70 65 3d 3d 53 48 49 46 54 2e 0a 2a 2f 0a 73  ype==SHIFT..*/.s
8ea0: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76  tatic int resolv
8eb0: 65 5f 63 6f 6e 66 6c 69 63 74 28 0a 20 20 73 74  e_conflict(.  st
8ec0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 78  ruct action *apx
8ed0: 2c 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ,.  struct actio
8ee0: 6e 20 2a 61 70 79 2c 0a 20 20 73 74 72 75 63 74  n *apy,.  struct
8ef0: 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 20   symbol *errsym 
8f00: 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 73    /* The error s
8f10: 79 6d 62 6f 6c 20 28 69 66 20 64 65 66 69 6e 65  ymbol (if define
8f20: 64 2e 20 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69  d.  NULL otherwi
8f30: 73 65 29 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  se) */.){.  stru
8f40: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 78 2c 20  ct symbol *spx, 
8f50: 2a 73 70 79 3b 0a 20 20 69 6e 74 20 65 72 72 63  *spy;.  int errc
8f60: 6e 74 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  nt = 0;.  assert
8f70: 28 20 61 70 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e  ( apx->sp==apy->
8f80: 73 70 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77  sp );  /* Otherw
8f90: 69 73 65 20 74 68 65 72 65 20 77 6f 75 6c 64 20  ise there would 
8fa0: 62 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 20 2a  be no conflict *
8fb0: 2f 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79 70  /.  if( apx->typ
8fc0: 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79 2d  e==SHIFT && apy-
8fd0: 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a  >type==SHIFT ){.
8fe0: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
8ff0: 53 53 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20  SSCONFLICT;.    
9000: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  errcnt++;.  }.  
9010: 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53  if( apx->type==S
9020: 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70  HIFT && apy->typ
9030: 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20  e==REDUCE ){.   
9040: 20 73 70 78 20 3d 20 61 70 78 2d 3e 73 70 3b 0a   spx = apx->sp;.
9050: 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78      spy = apy->x
9060: 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20  .rp->precsym;.  
9070: 20 20 69 66 28 20 73 70 79 3d 3d 30 20 7c 7c 20    if( spy==0 || 
9080: 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73  spx->prec<0 || s
9090: 70 79 2d 3e 70 72 65 63 3c 30 20 29 7b 0a 20 20  py->prec<0 ){.  
90a0: 20 20 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f 75 67      /* Not enoug
90b0: 68 20 70 72 65 63 65 64 65 6e 63 65 20 69 6e 66  h precedence inf
90c0: 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  ormation. */.   
90d0: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 53     apy->type = S
90e0: 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20  RCONFLICT;.     
90f0: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d   errcnt++;.    }
9100: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
9110: 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 20  ec>spy->prec ){ 
9120: 20 20 20 2f 2a 20 68 69 67 68 65 72 20 70 72 65     /* higher pre
9130: 63 65 64 65 6e 63 65 20 77 69 6e 73 20 2a 2f 0a  cedence wins */.
9140: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20        apy->type 
9150: 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = RD_RESOLVED;. 
9160: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78     }else if( spx
9170: 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63  ->prec<spy->prec
9180: 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ){.      apx->t
9190: 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45  ype = SH_RESOLVE
91a0: 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  D;.    }else if(
91b0: 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d   spx->prec==spy-
91c0: 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73  >prec && spx->as
91d0: 73 6f 63 3d 3d 52 49 47 48 54 20 29 7b 20 2f 2a  soc==RIGHT ){ /*
91e0: 20 55 73 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f   Use operator */
91f0: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
9200: 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 20   = RD_RESOLVED; 
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
9230: 73 73 6f 63 69 61 74 69 76 69 74 79 20 2a 2f 0a  ssociativity */.
9240: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
9250: 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72  x->prec==spy->pr
9260: 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63  ec && spx->assoc
9270: 3d 3d 4c 45 46 54 20 29 7b 20 20 2f 2a 20 74 6f  ==LEFT ){  /* to
9280: 20 62 72 65 61 6b 20 74 69 65 20 2a 2f 0a 20 20   break tie */.  
9290: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20      apx->type = 
92a0: 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20  SH_RESOLVED;.   
92b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
92c0: 73 65 72 74 28 20 73 70 78 2d 3e 70 72 65 63 3d  sert( spx->prec=
92d0: 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70  =spy->prec && sp
92e0: 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20 29  x->assoc==NONE )
92f0: 3b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  ;.      apy->typ
9300: 65 20 3d 20 53 52 43 4f 4e 46 4c 49 43 54 3b 0a  e = SRCONFLICT;.
9310: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
9320: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
9330: 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44  ( apx->type==RED
9340: 55 43 45 20 26 26 20 61 70 79 2d 3e 74 79 70 65  UCE && apy->type
9350: 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  ==REDUCE ){.    
9360: 73 70 78 20 3d 20 61 70 78 2d 3e 78 2e 72 70 2d  spx = apx->x.rp-
9370: 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 73 70  >precsym;.    sp
9380: 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70  y = apy->x.rp->p
9390: 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28 20  recsym;.    if( 
93a0: 73 70 78 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d 30  spx==0 || spy==0
93b0: 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20   || spx->prec<0 
93c0: 7c 7c 0a 20 20 20 20 73 70 79 2d 3e 70 72 65 63  ||.    spy->prec
93d0: 3c 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3d  <0 || spx->prec=
93e0: 3d 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20  =spy->prec ){.  
93f0: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
9400: 52 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20  RRCONFLICT;.    
9410: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20    errcnt++;.    
9420: 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70  }else if( spx->p
9430: 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b  rec>spy->prec ){
9440: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
9450: 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a   = RD_RESOLVED;.
9460: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
9470: 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65  x->prec<spy->pre
9480: 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e  c ){.      apx->
9490: 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56  type = RD_RESOLV
94a0: 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ED;.    }.  }els
94b0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 0a  e{.    assert( .
94c0: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d        apx->type=
94d0: 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a  =SH_RESOLVED ||.
94e0: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d        apx->type=
94f0: 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a  =RD_RESOLVED ||.
9500: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d        apx->type=
9510: 3d 53 53 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20  =SSCONFLICT ||. 
9520: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d       apx->type==
9530: 53 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20  SRCONFLICT ||.  
9540: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52      apx->type==R
9550: 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20  RCONFLICT ||.   
9560: 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48     apy->type==SH
9570: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
9580: 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 44     apy->type==RD
9590: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
95a0: 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 53     apy->type==SS
95b0: 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20  CONFLICT ||.    
95c0: 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 52 43    apy->type==SRC
95d0: 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20  ONFLICT ||.     
95e0: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 52 43 4f   apy->type==RRCO
95f0: 4e 46 4c 49 43 54 0a 20 20 20 20 29 3b 0a 20 20  NFLICT.    );.  
9600: 20 20 2f 2a 20 54 68 65 20 52 45 44 55 43 45 2f    /* The REDUCE/
9610: 53 48 49 46 54 20 63 61 73 65 20 63 61 6e 6e 6f  SHIFT case canno
9620: 74 20 68 61 70 70 65 6e 20 62 65 63 61 75 73 65  t happen because
9630: 20 53 48 49 46 54 73 20 63 6f 6d 65 20 62 65 66   SHIFTs come bef
9640: 6f 72 65 0a 20 20 20 20 2a 2a 20 52 45 44 55 43  ore.    ** REDUC
9650: 45 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 20  Es on the list. 
9660: 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
9670: 73 20 70 6f 69 6e 74 20 69 74 20 6d 75 73 74 20  s point it must 
9680: 62 65 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a  be because.    *
9690: 2a 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * the parser con
96a0: 66 6c 69 63 74 20 68 61 64 20 61 6c 72 65 61 64  flict had alread
96b0: 79 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  y been resolved.
96c0: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
96d0: 20 65 72 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a   errcnt;.}./****
96e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96f0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
9700: 22 63 6f 6e 66 69 67 6c 69 73 74 2e 63 22 20 2a  "configlist.c" *
9710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9720: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
9730: 52 6f 75 74 69 6e 65 73 20 74 6f 20 70 72 6f 63  Routines to proc
9740: 65 73 73 69 6e 67 20 61 20 63 6f 6e 66 69 67 75  essing a configu
9750: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20  ration list and 
9760: 62 75 69 6c 64 69 6e 67 20 61 20 73 74 61 74 65  building a state
9770: 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  .** in the LEMON
9780: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
9790: 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 73 74  r..*/..static st
97a0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 66 72 65  ruct config *fre
97b0: 65 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20  elist = 0;      
97c0: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20  /* List of free 
97d0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a  configurations *
97e0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
97f0: 63 6f 6e 66 69 67 20 2a 63 75 72 72 65 6e 74 20  config *current 
9800: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f  = 0;       /* To
9810: 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 63 6f 6e  p of list of con
9820: 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  figurations */.s
9830: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
9840: 66 69 67 20 2a 2a 63 75 72 72 65 6e 74 65 6e 64  fig **currentend
9850: 20 3d 20 30 3b 20 20 20 2f 2a 20 4c 61 73 74 20   = 0;   /* Last 
9860: 6f 6e 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69  on list of confi
9870: 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  gs */.static str
9880: 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 61 73 69  uct config *basi
9890: 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  s = 0;         /
98a0: 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66  * Top of list of
98b0: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a   basis configs *
98c0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
98d0: 63 6f 6e 66 69 67 20 2a 2a 62 61 73 69 73 65 6e  config **basisen
98e0: 64 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 45 6e  d = 0;     /* En
98f0: 64 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73  d of list of bas
9900: 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 0a 2f  is configs */../
9910: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
9920: 65 72 20 74 6f 20 61 20 6e 65 77 20 63 6f 6e 66  er to a new conf
9930: 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49  iguration */.PRI
9940: 56 41 54 45 20 73 74 72 75 63 74 20 63 6f 6e 66  VATE struct conf
9950: 69 67 20 2a 6e 65 77 63 6f 6e 66 69 67 28 29 7b  ig *newconfig(){
9960: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
9970: 20 2a 6e 65 77 63 66 67 3b 0a 20 20 69 66 28 20   *newcfg;.  if( 
9980: 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
9990: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
99a0: 74 20 61 6d 74 20 3d 20 33 3b 0a 20 20 20 20 66  t amt = 3;.    f
99b0: 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63  reelist = (struc
99c0: 74 20 63 6f 6e 66 69 67 20 2a 29 63 61 6c 6c 6f  t config *)callo
99d0: 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73  c( amt, sizeof(s
99e0: 74 72 75 63 74 20 63 6f 6e 66 69 67 29 20 29 3b  truct config) );
99f0: 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c 69 73  .    if( freelis
9a00: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  t==0 ){.      fp
9a10: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e  rintf(stderr,"Un
9a20: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
9a30: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65   memory for a ne
9a40: 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  w configuration.
9a50: 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
9a60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
9a70: 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69  (i=0; i<amt-1; i
9a80: 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e  ++) freelist[i].
9a90: 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69 73 74  next = &freelist
9aa0: 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c  [i+1];.    freel
9ab0: 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20  ist[amt-1].next 
9ac0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 63 66  = 0;.  }.  newcf
9ad0: 67 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20  g = freelist;.  
9ae0: 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65 65 6c  freelist = freel
9af0: 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74  ist->next;.  ret
9b00: 75 72 6e 20 6e 65 77 63 66 67 3b 0a 7d 0a 0a 2f  urn newcfg;.}../
9b10: 2a 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61 74  * The configurat
9b20: 69 6f 6e 20 22 6f 6c 64 22 20 69 73 20 6e 6f 20  ion "old" is no 
9b30: 6c 6f 6e 67 65 72 20 75 73 65 64 20 2a 2f 0a 50  longer used */.P
9b40: 52 49 56 41 54 45 20 76 6f 69 64 20 64 65 6c 65  RIVATE void dele
9b50: 74 65 63 6f 6e 66 69 67 28 73 74 72 75 63 74 20  teconfig(struct 
9b60: 63 6f 6e 66 69 67 20 2a 6f 6c 64 29 0a 7b 0a 20  config *old).{. 
9b70: 20 6f 6c 64 2d 3e 6e 65 78 74 20 3d 20 66 72 65   old->next = fre
9b80: 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73  elist;.  freelis
9b90: 74 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49  t = old;.}../* I
9ba0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63  nitialized the c
9bb0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
9bc0: 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69  t builder */.voi
9bd0: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69  d Configlist_ini
9be0: 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d  t(){.  current =
9bf0: 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64   0;.  currentend
9c00: 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20 62   = &current;.  b
9c10: 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69  asis = 0;.  basi
9c20: 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a 20  send = &basis;. 
9c30: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69   Configtable_ini
9c40: 74 28 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  t();.  return;.}
9c50: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64  ../* Initialized
9c60: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
9c70: 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20  on list builder 
9c80: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
9c90: 73 74 5f 72 65 73 65 74 28 29 7b 0a 20 20 63 75  st_reset(){.  cu
9ca0: 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72  rrent = 0;.  cur
9cb0: 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65  rentend = &curre
9cc0: 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b  nt;.  basis = 0;
9cd0: 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62  .  basisend = &b
9ce0: 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61  asis;.  Configta
9cf0: 62 6c 65 5f 63 6c 65 61 72 28 30 29 3b 0a 20 20  ble_clear(0);.  
9d00: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64  return;.}../* Ad
9d10: 64 20 61 6e 6f 74 68 65 72 20 63 6f 6e 66 69 67  d another config
9d20: 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63  uration to the c
9d30: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
9d40: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
9d50: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61  ig *Configlist_a
9d60: 64 64 28 0a 20 20 73 74 72 75 63 74 20 72 75 6c  dd(.  struct rul
9d70: 65 20 2a 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  e *rp,    /* The
9d80: 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64   rule */.  int d
9d90: 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ot             /
9da0: 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  * Index into the
9db0: 20 52 48 53 20 6f 66 20 74 68 65 20 72 75 6c 65   RHS of the rule
9dc0: 20 77 68 65 72 65 20 74 68 65 20 64 6f 74 20 67   where the dot g
9dd0: 6f 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  oes */.){.  stru
9de0: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20  ct config *cfp, 
9df0: 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74  model;..  assert
9e00: 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20  ( currentend!=0 
9e10: 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20  );.  model.rp = 
9e20: 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20  rp;.  model.dot 
9e30: 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43  = dot;.  cfp = C
9e40: 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28  onfigtable_find(
9e50: 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20 63  &model);.  if( c
9e60: 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66 70  fp==0 ){.    cfp
9e70: 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a   = newconfig();.
9e80: 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20 72 70      cfp->rp = rp
9e90: 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d  ;.    cfp->dot =
9ea0: 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66   dot;.    cfp->f
9eb0: 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20  ws = SetNew();. 
9ec0: 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b     cfp->stp = 0;
9ed0: 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d  .    cfp->fplp =
9ee0: 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a   cfp->bplp = 0;.
9ef0: 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20      cfp->next = 
9f00: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70 20 3d  0;.    cfp->bp =
9f10: 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e 74   0;.    *current
9f20: 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 63  end = cfp;.    c
9f30: 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 66 70  urrentend = &cfp
9f40: 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 43 6f 6e 66  ->next;.    Conf
9f50: 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 63  igtable_insert(c
9f60: 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fp);.  }.  retur
9f70: 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64  n cfp;.}../* Add
9f80: 20 61 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75   a basis configu
9f90: 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f  ration to the co
9fa0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
9fb0: 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69   */.struct confi
9fc0: 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  g *Configlist_ad
9fd0: 64 62 61 73 69 73 28 73 74 72 75 63 74 20 72 75  dbasis(struct ru
9fe0: 6c 65 20 2a 72 70 2c 20 69 6e 74 20 64 6f 74 29  le *rp, int dot)
9ff0: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
a000: 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a  ig *cfp, model;.
a010: 0a 20 20 61 73 73 65 72 74 28 20 62 61 73 69 73  .  assert( basis
a020: 65 6e 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  end!=0 );.  asse
a030: 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d  rt( currentend!=
a040: 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20  0 );.  model.rp 
a050: 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f  = rp;.  model.do
a060: 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d  t = dot;.  cfp =
a070: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e   Configtable_fin
a080: 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28  d(&model);.  if(
a090: 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63   cfp==0 ){.    c
a0a0: 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29  fp = newconfig()
a0b0: 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20  ;.    cfp->rp = 
a0c0: 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74  rp;.    cfp->dot
a0d0: 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d   = dot;.    cfp-
a0e0: 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b  >fws = SetNew();
a0f0: 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20  .    cfp->stp = 
a100: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70  0;.    cfp->fplp
a110: 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30   = cfp->bplp = 0
a120: 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20  ;.    cfp->next 
a130: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70  = 0;.    cfp->bp
a140: 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65   = 0;.    *curre
a150: 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20  ntend = cfp;.   
a160: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63   currentend = &c
a170: 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 2a 62  fp->next;.    *b
a180: 61 73 69 73 65 6e 64 20 3d 20 63 66 70 3b 0a 20  asisend = cfp;. 
a190: 20 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 63     basisend = &c
a1a0: 66 70 2d 3e 62 70 3b 0a 20 20 20 20 43 6f 6e 66  fp->bp;.    Conf
a1b0: 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 63  igtable_insert(c
a1c0: 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fp);.  }.  retur
a1d0: 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  n cfp;.}../* Com
a1e0: 70 75 74 65 20 74 68 65 20 63 6c 6f 73 75 72 65  pute the closure
a1f0: 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72   of the configur
a200: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f  ation list */.vo
a210: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c  id Configlist_cl
a220: 6f 73 75 72 65 28 73 74 72 75 63 74 20 6c 65 6d  osure(struct lem
a230: 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74  on *lemp).{.  st
a240: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
a250: 2c 20 2a 6e 65 77 63 66 70 3b 0a 20 20 73 74 72  , *newcfp;.  str
a260: 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 6e  uct rule *rp, *n
a270: 65 77 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73  ewrp;.  struct s
a280: 79 6d 62 6f 6c 20 2a 73 70 2c 20 2a 78 73 70 3b  ymbol *sp, *xsp;
a290: 0a 20 20 69 6e 74 20 69 2c 20 64 6f 74 3b 0a 0a  .  int i, dot;..
a2a0: 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e    assert( curren
a2b0: 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 66 6f 72  tend!=0 );.  for
a2c0: 28 63 66 70 3d 63 75 72 72 65 6e 74 3b 20 63 66  (cfp=current; cf
a2d0: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
a2e0: 29 7b 0a 20 20 20 20 72 70 20 3d 20 63 66 70 2d  ){.    rp = cfp-
a2f0: 3e 72 70 3b 0a 20 20 20 20 64 6f 74 20 3d 20 63  >rp;.    dot = c
a300: 66 70 2d 3e 64 6f 74 3b 0a 20 20 20 20 69 66 28  fp->dot;.    if(
a310: 20 64 6f 74 3e 3d 72 70 2d 3e 6e 72 68 73 20 29   dot>=rp->nrhs )
a320: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73   continue;.    s
a330: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 64 6f 74 5d  p = rp->rhs[dot]
a340: 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  ;.    if( sp->ty
a350: 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe==NONTERMINAL 
a360: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d  ){.      if( sp-
a370: 3e 72 75 6c 65 3d 3d 30 20 26 26 20 73 70 21 3d  >rule==0 && sp!=
a380: 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a  lemp->errsym ){.
a390: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
a3a0: 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
a3b0: 72 70 2d 3e 6c 69 6e 65 2c 22 4e 6f 6e 74 65 72  rp->line,"Nonter
a3c0: 6d 69 6e 61 6c 20 5c 22 25 73 5c 22 20 68 61 73  minal \"%s\" has
a3d0: 20 6e 6f 20 72 75 6c 65 73 2e 22 2c 0a 20 20 20   no rules.",.   
a3e0: 20 20 20 20 20 20 20 73 70 2d 3e 6e 61 6d 65 29         sp->name)
a3f0: 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e  ;.        lemp->
a400: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
a410: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 65    }.      for(ne
a420: 77 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 6e 65  wrp=sp->rule; ne
a430: 77 72 70 3b 20 6e 65 77 72 70 3d 6e 65 77 72 70  wrp; newrp=newrp
a440: 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20  ->nextlhs){.    
a450: 20 20 20 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e      newcfp = Con
a460: 66 69 67 6c 69 73 74 5f 61 64 64 28 6e 65 77 72  figlist_add(newr
a470: 70 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  p,0);.        fo
a480: 72 28 69 3d 64 6f 74 2b 31 3b 20 69 3c 72 70 2d  r(i=dot+1; i<rp-
a490: 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
a4a0: 20 20 20 20 20 20 20 78 73 70 20 3d 20 72 70 2d         xsp = rp-
a4b0: 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  >rhs[i];.       
a4c0: 20 20 20 69 66 28 20 78 73 70 2d 3e 74 79 70 65     if( xsp->type
a4d0: 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ==TERMINAL ){.  
a4e0: 20 20 20 20 20 20 20 20 20 20 53 65 74 41 64 64            SetAdd
a4f0: 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70  (newcfp->fws,xsp
a500: 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
a510: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a520: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
a530: 20 78 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54   xsp->type==MULT
a540: 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
a550: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
a560: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
a570: 6b 3d 30 3b 20 6b 3c 78 73 70 2d 3e 6e 73 75 62  k=0; k<xsp->nsub
a580: 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  sym; k++){.     
a590: 20 20 20 20 20 20 20 20 20 53 65 74 41 64 64 28           SetAdd(
a5a0: 6e 65 77 63 66 70 2d 3e 66 77 73 2c 20 78 73 70  newcfp->fws, xsp
a5b0: 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 69 6e 64  ->subsym[k]->ind
a5c0: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ex);.           
a5d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62   }.            b
a5e0: 72 65 61 6b 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a  reak;..  }else{.
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74 55              SetU
a600: 6e 69 6f 6e 28 6e 65 77 63 66 70 2d 3e 66 77 73  nion(newcfp->fws
a610: 2c 78 73 70 2d 3e 66 69 72 73 74 73 65 74 29 3b  ,xsp->firstset);
a620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
a630: 20 78 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45   xsp->lambda==LE
a640: 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61  MON_FALSE ) brea
a650: 6b 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20  k;..  }..}.     
a660: 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72     if( i==rp->nr
a670: 68 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28 26  hs ) Plink_add(&
a680: 63 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66 70  cfp->fplp,newcfp
a690: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a6a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
a6b0: 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f  ../* Sort the co
a6c0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
a6d0: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
a6e0: 69 73 74 5f 73 6f 72 74 28 29 7b 0a 20 20 63 75  ist_sort(){.  cu
a6f0: 72 72 65 6e 74 20 3d 20 28 73 74 72 75 63 74 20  rrent = (struct 
a700: 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74 28 28  config *)msort((
a710: 63 68 61 72 20 2a 29 63 75 72 72 65 6e 74 2c 28  char *)current,(
a720: 63 68 61 72 20 2a 2a 29 26 28 63 75 72 72 65 6e  char **)&(curren
a730: 74 2d 3e 6e 65 78 74 29 2c 43 6f 6e 66 69 67 63  t->next),Configc
a740: 6d 70 29 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e  mp);.  currenten
a750: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
a760: 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20  .}../* Sort the 
a770: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
a780: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ion list */.void
a790: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74   Configlist_sort
a7a0: 62 61 73 69 73 28 29 7b 0a 20 20 62 61 73 69 73  basis(){.  basis
a7b0: 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69   = (struct confi
a7c0: 67 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20  g *)msort((char 
a7d0: 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72 20  *)current,(char 
a7e0: 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 62 70  **)&(current->bp
a7f0: 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20  ),Configcmp);.  
a800: 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20  basisend = 0;.  
a810: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65  return;.}../* Re
a820: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a830: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
a840: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
a850: 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65  list and.** rese
a860: 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74  t the list */.st
a870: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
a880: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29  figlist_return()
a890: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
a8a0: 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20  g *old;.  old = 
a8b0: 63 75 72 72 65 6e 74 3b 0a 20 20 63 75 72 72 65  current;.  curre
a8c0: 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e  nt = 0;.  curren
a8d0: 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  tend = 0;.  retu
a8e0: 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 52 65  rn old;.}../* Re
a8f0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a900: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
a910: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
a920: 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65  list and.** rese
a930: 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74  t the list */.st
a940: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
a950: 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29 7b  figlist_basis(){
a960: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
a970: 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 62   *old;.  old = b
a980: 61 73 69 73 3b 0a 20 20 62 61 73 69 73 20 3d 20  asis;.  basis = 
a990: 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20  0;.  basisend = 
a9a0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b  0;.  return old;
a9b0: 0a 7d 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20  .}../* Free all 
a9c0: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
a9d0: 67 69 76 65 6e 20 63 6f 6e 66 69 67 75 72 61 74  given configurat
a9e0: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ion list */.void
a9f0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28   Configlist_eat(
aa00: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
aa10: 66 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63  fp).{.  struct c
aa20: 6f 6e 66 69 67 20 2a 6e 65 78 74 63 66 70 3b 0a  onfig *nextcfp;.
aa30: 20 20 66 6f 72 28 3b 20 63 66 70 3b 20 63 66 70    for(; cfp; cfp
aa40: 3d 6e 65 78 74 63 66 70 29 7b 0a 20 20 20 20 6e  =nextcfp){.    n
aa50: 65 78 74 63 66 70 20 3d 20 63 66 70 2d 3e 6e 65  extcfp = cfp->ne
aa60: 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  xt;.    assert( 
aa70: 63 66 70 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a  cfp->fplp==0 );.
aa80: 20 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d      assert( cfp-
aa90: 3e 62 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20  >bplp==0 );.    
aaa0: 69 66 28 20 63 66 70 2d 3e 66 77 73 20 29 20 53  if( cfp->fws ) S
aab0: 65 74 46 72 65 65 28 63 66 70 2d 3e 66 77 73 29  etFree(cfp->fws)
aac0: 3b 0a 20 20 20 20 64 65 6c 65 74 65 63 6f 6e 66  ;.    deleteconf
aad0: 69 67 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72  ig(cfp);.  }.  r
aae0: 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  eturn;.}./******
aaf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
ab00: 20 74 68 65 20 66 69 6c 65 20 22 65 72 72 6f 72   the file "error
ab10: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
ab20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ab30: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64  *****/./*.** Cod
ab40: 65 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 65  e for printing e
ab50: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f  rror message..*/
ab60: 0a 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28  ..void ErrorMsg(
ab70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
ab80: 6e 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  name, int lineno
ab90: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f  , const char *fo
aba0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
abb0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 66 70 72 69  _list ap;.  fpri
abc0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
abd0: 25 64 3a 20 22 2c 20 66 69 6c 65 6e 61 6d 65 2c  %d: ", filename,
abe0: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 76 61 5f 73   lineno);.  va_s
abf0: 74 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29  tart(ap, format)
ac00: 3b 0a 20 20 76 66 70 72 69 6e 74 66 28 73 74 64  ;.  vfprintf(std
ac10: 65 72 72 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a  err,format,ap);.
ac20: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
ac30: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
ac40: 22 5c 6e 22 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  "\n");.}./******
ac50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
ac60: 74 68 65 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63  the file "main.c
ac70: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
ac80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac90: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61  ******/./*.** Ma
aca0: 69 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c 65 20  in program file 
acb0: 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
acc0: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
acd0: 2a 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e  */../* Report an
ace0: 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63   out-of-memory c
acf0: 6f 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f  ondition and abo
ad00: 72 74 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  rt.  This functi
ad10: 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f  on.** is used mo
ad20: 73 74 6c 79 20 62 79 20 74 68 65 20 22 4d 65 6d  stly by the "Mem
ad30: 6f 72 79 43 68 65 63 6b 22 20 6d 61 63 72 6f 20  oryCheck" macro 
ad40: 69 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76  in struct.h.*/.v
ad50: 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72  oid memory_error
ad60: 28 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  (){.  fprintf(st
ad70: 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d  derr,"Out of mem
ad80: 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e  ory.  Aborting..
ad90: 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29  .\n");.  exit(1)
ada0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
adb0: 6e 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 20 20  nDefine = 0;    
adc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 2d    /* Number of -
add0: 44 20 6f 70 74 69 6f 6e 73 20 6f 6e 20 74 68 65  D options on the
ade0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f   command line */
adf0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 61  .static char **a
ae00: 7a 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 2f 2a  zDefine = 0;  /*
ae10: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 2d 44 20   Name of the -D 
ae20: 6d 61 63 72 6f 73 20 2a 2f 0a 0a 2f 2a 20 54 68  macros */../* Th
ae30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
ae40: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 61 72  lled with the ar
ae50: 67 75 6d 65 6e 74 20 74 6f 20 65 61 63 68 20 2d  gument to each -
ae60: 44 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  D command-line o
ae70: 70 74 69 6f 6e 2e 0a 2a 2a 20 41 64 64 20 74 68  ption..** Add th
ae80: 65 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 20  e macro defined 
ae90: 74 6f 20 74 68 65 20 61 7a 44 65 66 69 6e 65 20  to the azDefine 
aea0: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
aeb0: 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f 44 5f 6f   void handle_D_o
aec0: 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a  ption(char *z){.
aed0: 20 20 63 68 61 72 20 2a 2a 70 61 7a 3b 0a 20 20    char **paz;.  
aee0: 6e 44 65 66 69 6e 65 2b 2b 3b 0a 20 20 61 7a 44  nDefine++;.  azD
aef0: 65 66 69 6e 65 20 3d 20 28 63 68 61 72 20 2a 2a  efine = (char **
af00: 29 20 72 65 61 6c 6c 6f 63 28 61 7a 44 65 66 69  ) realloc(azDefi
af10: 6e 65 2c 20 73 69 7a 65 6f 66 28 61 7a 44 65 66  ne, sizeof(azDef
af20: 69 6e 65 5b 30 5d 29 2a 6e 44 65 66 69 6e 65 29  ine[0])*nDefine)
af30: 3b 0a 20 20 69 66 28 20 61 7a 44 65 66 69 6e 65  ;.  if( azDefine
af40: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
af50: 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20 6f  tf(stderr,"out o
af60: 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
af70: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
af80: 20 70 61 7a 20 3d 20 26 61 7a 44 65 66 69 6e 65   paz = &azDefine
af90: 5b 6e 44 65 66 69 6e 65 2d 31 5d 3b 0a 20 20 2a  [nDefine-1];.  *
afa0: 70 61 7a 20 3d 20 28 63 68 61 72 20 2a 29 20 6d  paz = (char *) m
afb0: 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
afc0: 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28  en(z)+1 );.  if(
afd0: 20 2a 70 61 7a 3d 3d 30 20 29 7b 0a 20 20 20 20   *paz==0 ){.    
afe0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
aff0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
b000: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
b010: 20 20 7d 0a 20 20 73 74 72 63 70 79 28 2a 70 61    }.  strcpy(*pa
b020: 7a 2c 20 7a 29 3b 0a 20 20 66 6f 72 28 7a 3d 2a  z, z);.  for(z=*
b030: 70 61 7a 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27  paz; *z && *z!='
b040: 3d 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 2a 7a 20  ='; z++){}.  *z 
b050: 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  = 0;.}..static c
b060: 68 61 72 20 2a 75 73 65 72 5f 74 65 6d 70 6c 61  har *user_templa
b070: 74 65 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 73  tename = NULL;.s
b080: 74 61 74 69 63 20 76 6f 69 64 20 68 61 6e 64 6c  tatic void handl
b090: 65 5f 54 5f 6f 70 74 69 6f 6e 28 63 68 61 72 20  e_T_option(char 
b0a0: 2a 7a 29 7b 0a 20 20 75 73 65 72 5f 74 65 6d 70  *z){.  user_temp
b0b0: 6c 61 74 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  latename = (char
b0c0: 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f   *) malloc( lemo
b0d0: 6e 53 74 72 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a  nStrlen(z)+1 );.
b0e0: 20 20 69 66 28 20 75 73 65 72 5f 74 65 6d 70 6c    if( user_templ
b0f0: 61 74 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  atename==0 ){.  
b100: 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29    memory_error()
b110: 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 75  ;.  }.  strcpy(u
b120: 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ser_templatename
b130: 2c 20 7a 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  , z);.}../* The 
b140: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 20 50  main program.  P
b150: 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64  arse the command
b160: 20 6c 69 6e 65 20 61 6e 64 20 64 6f 20 69 74 2e   line and do it.
b170: 2e 2e 20 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28 69  .. */.int main(i
b180: 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
b190: 61 72 67 76 29 0a 7b 0a 20 20 73 74 61 74 69 63  argv).{.  static
b1a0: 20 69 6e 74 20 76 65 72 73 69 6f 6e 20 3d 20 30   int version = 0
b1b0: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 72  ;.  static int r
b1c0: 70 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  pflag = 0;.  sta
b1d0: 74 69 63 20 69 6e 74 20 62 61 73 69 73 66 6c 61  tic int basisfla
b1e0: 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  g = 0;.  static 
b1f0: 69 6e 74 20 63 6f 6d 70 72 65 73 73 20 3d 20 30  int compress = 0
b200: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 71  ;.  static int q
b210: 75 69 65 74 20 3d 20 30 3b 0a 20 20 73 74 61 74  uiet = 0;.  stat
b220: 69 63 20 69 6e 74 20 73 74 61 74 69 73 74 69 63  ic int statistic
b230: 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  s = 0;.  static 
b240: 69 6e 74 20 6d 68 66 6c 61 67 20 3d 20 30 3b 0a  int mhflag = 0;.
b250: 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c    static int nol
b260: 69 6e 65 6e 6f 73 66 6c 61 67 20 3d 20 30 3b 0a  inenosflag = 0;.
b270: 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 52    static int noR
b280: 65 73 6f 72 74 20 3d 20 30 3b 0a 20 20 73 74 61  esort = 0;.  sta
b290: 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74  tic struct s_opt
b2a0: 69 6f 6e 73 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d  ions options[] =
b2b0: 20 7b 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47   {.    {OPT_FLAG
b2c0: 2c 20 22 62 22 2c 20 28 63 68 61 72 2a 29 26 62  , "b", (char*)&b
b2d0: 61 73 69 73 66 6c 61 67 2c 20 22 50 72 69 6e 74  asisflag, "Print
b2e0: 20 6f 6e 6c 79 20 74 68 65 20 62 61 73 69 73 20   only the basis 
b2f0: 69 6e 20 72 65 70 6f 72 74 2e 22 7d 2c 0a 20 20  in report."},.  
b300: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 63 22    {OPT_FLAG, "c"
b310: 2c 20 28 63 68 61 72 2a 29 26 63 6f 6d 70 72 65  , (char*)&compre
b320: 73 73 2c 20 22 44 6f 6e 27 74 20 63 6f 6d 70 72  ss, "Don't compr
b330: 65 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20 74  ess the action t
b340: 61 62 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  able."},.    {OP
b350: 54 5f 46 53 54 52 2c 20 22 44 22 2c 20 28 63 68  T_FSTR, "D", (ch
b360: 61 72 2a 29 68 61 6e 64 6c 65 5f 44 5f 6f 70 74  ar*)handle_D_opt
b370: 69 6f 6e 2c 20 22 44 65 66 69 6e 65 20 61 6e 20  ion, "Define an 
b380: 25 69 66 64 65 66 20 6d 61 63 72 6f 2e 22 7d 2c  %ifdef macro."},
b390: 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20  .    {OPT_FSTR, 
b3a0: 22 54 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64  "T", (char*)hand
b3b0: 6c 65 5f 54 5f 6f 70 74 69 6f 6e 2c 20 22 53 70  le_T_option, "Sp
b3c0: 65 63 69 66 79 20 61 20 74 65 6d 70 6c 61 74 65  ecify a template
b3d0: 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f   file."},.    {O
b3e0: 50 54 5f 46 4c 41 47 2c 20 22 67 22 2c 20 28 63  PT_FLAG, "g", (c
b3f0: 68 61 72 2a 29 26 72 70 66 6c 61 67 2c 20 22 50  har*)&rpflag, "P
b400: 72 69 6e 74 20 67 72 61 6d 6d 61 72 20 77 69 74  rint grammar wit
b410: 68 6f 75 74 20 61 63 74 69 6f 6e 73 2e 22 7d 2c  hout actions."},
b420: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
b430: 22 6d 22 2c 20 28 63 68 61 72 2a 29 26 6d 68 66  "m", (char*)&mhf
b440: 6c 61 67 2c 20 22 4f 75 74 70 75 74 20 61 20 6d  lag, "Output a m
b450: 61 6b 65 68 65 61 64 65 72 73 20 63 6f 6d 70 61  akeheaders compa
b460: 74 69 62 6c 65 20 66 69 6c 65 2e 22 7d 2c 0a 20  tible file."},. 
b470: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6c     {OPT_FLAG, "l
b480: 22 2c 20 28 63 68 61 72 2a 29 26 6e 6f 6c 69 6e  ", (char*)&nolin
b490: 65 6e 6f 73 66 6c 61 67 2c 20 22 44 6f 20 6e 6f  enosflag, "Do no
b4a0: 74 20 70 72 69 6e 74 20 23 6c 69 6e 65 20 73 74  t print #line st
b4b0: 61 74 65 6d 65 6e 74 73 2e 22 7d 2c 0a 20 20 20  atements."},.   
b4c0: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 70 22 2c   {OPT_FLAG, "p",
b4d0: 20 28 63 68 61 72 2a 29 26 73 68 6f 77 50 72 65   (char*)&showPre
b4e0: 63 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63 74 2c  cedenceConflict,
b4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b500: 20 20 20 20 20 22 53 68 6f 77 20 63 6f 6e 66 6c       "Show confl
b510: 69 63 74 73 20 72 65 73 6f 6c 76 65 64 20 62 79  icts resolved by
b520: 20 70 72 65 63 65 64 65 6e 63 65 20 72 75 6c 65   precedence rule
b530: 73 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  s"},.    {OPT_FL
b540: 41 47 2c 20 22 71 22 2c 20 28 63 68 61 72 2a 29  AG, "q", (char*)
b550: 26 71 75 69 65 74 2c 20 22 28 51 75 69 65 74 29  &quiet, "(Quiet)
b560: 20 44 6f 6e 27 74 20 70 72 69 6e 74 20 74 68 65   Don't print the
b570: 20 72 65 70 6f 72 74 20 66 69 6c 65 2e 22 7d 2c   report file."},
b580: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
b590: 22 72 22 2c 20 28 63 68 61 72 2a 29 26 6e 6f 52  "r", (char*)&noR
b5a0: 65 73 6f 72 74 2c 20 22 44 6f 20 6e 6f 74 20 73  esort, "Do not s
b5b0: 6f 72 74 20 6f 72 20 72 65 6e 75 6d 62 65 72 20  ort or renumber 
b5c0: 73 74 61 74 65 73 22 7d 2c 0a 20 20 20 20 7b 4f  states"},.    {O
b5d0: 50 54 5f 46 4c 41 47 2c 20 22 73 22 2c 20 28 63  PT_FLAG, "s", (c
b5e0: 68 61 72 2a 29 26 73 74 61 74 69 73 74 69 63 73  har*)&statistics
b5f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b610: 20 20 20 20 20 22 50 72 69 6e 74 20 70 61 72 73       "Print pars
b620: 65 72 20 73 74 61 74 73 20 74 6f 20 73 74 61 6e  er stats to stan
b630: 64 61 72 64 20 6f 75 74 70 75 74 2e 22 7d 2c 0a  dard output."},.
b640: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
b650: 78 22 2c 20 28 63 68 61 72 2a 29 26 76 65 72 73  x", (char*)&vers
b660: 69 6f 6e 2c 20 22 50 72 69 6e 74 20 74 68 65 20  ion, "Print the 
b670: 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 2e 22  version number."
b680: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
b690: 2c 30 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69  ,0,0,0}.  };.  i
b6a0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 69 74  nt i;.  int exit
b6b0: 63 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 6c  code;.  struct l
b6c0: 65 6d 6f 6e 20 6c 65 6d 3b 0a 0a 20 20 4f 70 74  emon lem;..  Opt
b6d0: 49 6e 69 74 28 61 72 67 76 2c 6f 70 74 69 6f 6e  Init(argv,option
b6e0: 73 2c 73 74 64 65 72 72 29 3b 0a 20 20 69 66 28  s,stderr);.  if(
b6f0: 20 76 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20   version ){.    
b700: 20 70 72 69 6e 74 66 28 22 4c 65 6d 6f 6e 20 76   printf("Lemon v
b710: 65 72 73 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b 0a  ersion 1.0\n");.
b720: 20 20 20 20 20 65 78 69 74 28 30 29 3b 20 0a 20       exit(0); . 
b730: 20 7d 0a 20 20 69 66 28 20 4f 70 74 4e 41 72 67   }.  if( OptNArg
b740: 73 28 29 21 3d 31 20 29 7b 0a 20 20 20 20 66 70  s()!=1 ){.    fp
b750: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 78  rintf(stderr,"Ex
b760: 61 63 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e 61  actly one filena
b770: 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72  me argument is r
b780: 65 71 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20 20  equired.\n");.  
b790: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
b7a0: 20 6d 65 6d 73 65 74 28 26 6c 65 6d 2c 20 30 2c   memset(&lem, 0,
b7b0: 20 73 69 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a 20   sizeof(lem));. 
b7c0: 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d 20   lem.errorcnt = 
b7d0: 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  0;..  /* Initial
b7e0: 69 7a 65 20 74 68 65 20 6d 61 63 68 69 6e 65 20  ize the machine 
b7f0: 2a 2f 0a 20 20 53 74 72 73 61 66 65 5f 69 6e 69  */.  Strsafe_ini
b800: 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e  t();.  Symbol_in
b810: 69 74 28 29 3b 0a 20 20 53 74 61 74 65 5f 69 6e  it();.  State_in
b820: 69 74 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67 76  it();.  lem.argv
b830: 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6c  0 = argv[0];.  l
b840: 65 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f 70  em.filename = Op
b850: 74 41 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e 62  tArg(0);.  lem.b
b860: 61 73 69 73 66 6c 61 67 20 3d 20 62 61 73 69 73  asisflag = basis
b870: 66 6c 61 67 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c 69  flag;.  lem.noli
b880: 6e 65 6e 6f 73 66 6c 61 67 20 3d 20 6e 6f 6c 69  nenosflag = noli
b890: 6e 65 6e 6f 73 66 6c 61 67 3b 0a 20 20 53 79 6d  nenosflag;.  Sym
b8a0: 62 6f 6c 5f 6e 65 77 28 22 24 22 29 3b 0a 20 20  bol_new("$");.  
b8b0: 6c 65 6d 2e 65 72 72 73 79 6d 20 3d 20 53 79 6d  lem.errsym = Sym
b8c0: 62 6f 6c 5f 6e 65 77 28 22 65 72 72 6f 72 22 29  bol_new("error")
b8d0: 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 2d 3e  ;.  lem.errsym->
b8e0: 75 73 65 43 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f  useCnt = 0;..  /
b8f0: 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75  * Parse the inpu
b900: 74 20 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72 73  t file */.  Pars
b910: 65 28 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20 6c  e(&lem);.  if( l
b920: 65 6d 2e 65 72 72 6f 72 63 6e 74 20 29 20 65 78  em.errorcnt ) ex
b930: 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 29  it(lem.errorcnt)
b940: 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 72 75 6c  ;.  if( lem.nrul
b950: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  e==0 ){.    fpri
b960: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 6d 70 74  ntf(stderr,"Empt
b970: 79 20 67 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a  y grammar.\n");.
b980: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
b990: 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 61 6e 64  ..  /* Count and
b9a0: 20 69 6e 64 65 78 20 74 68 65 20 73 79 6d 62 6f   index the symbo
b9b0: 6c 73 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  ls of the gramma
b9c0: 72 20 2a 2f 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62  r */.  lem.nsymb
b9d0: 6f 6c 20 3d 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e  ol = Symbol_coun
b9e0: 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65  t();.  Symbol_ne
b9f0: 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a  w("{default}");.
ba00: 20 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20    lem.symbols = 
ba10: 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29  Symbol_arrayof()
ba20: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
ba30: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  lem.nsymbol; i++
ba40: 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d  ) lem.symbols[i]
ba50: 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 71  ->index = i;.  q
ba60: 73 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73  sort(lem.symbols
ba70: 2c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2b 31 2c 73  ,lem.nsymbol+1,s
ba80: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
ba90: 62 6f 6c 2a 29 2c 20 53 79 6d 62 6f 6c 63 6d 70  bol*), Symbolcmp
baa0: 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  p);.  for(i=0; i
bab0: 3c 3d 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69  <=lem.nsymbol; i
bac0: 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b  ++) lem.symbols[
bad0: 69 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20  i]->index = i;. 
bae0: 20 66 6f 72 28 69 3d 31 3b 20 69 73 75 70 70 65   for(i=1; isuppe
baf0: 72 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d  r(lem.symbols[i]
bb00: 2d 3e 6e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29  ->name[0]); i++)
bb10: 3b 0a 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61  ;.  lem.ntermina
bb20: 6c 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 47 65 6e  l = i;..  /* Gen
bb30: 65 72 61 74 65 20 61 20 72 65 70 72 69 6e 74 20  erate a reprint 
bb40: 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2c 20  of the grammar, 
bb50: 69 66 20 72 65 71 75 65 73 74 65 64 20 6f 6e 20  if requested on 
bb60: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
bb70: 20 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c 61 67   */.  if( rpflag
bb80: 20 29 7b 0a 20 20 20 20 52 65 70 72 69 6e 74 28   ){.    Reprint(
bb90: 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  &lem);.  }else{.
bba0: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
bbb0: 65 20 74 68 65 20 73 69 7a 65 20 66 6f 72 20 61  e the size for a
bbc0: 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 66 69  ll follow and fi
bbd0: 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 20 20  rst sets */.    
bbe0: 53 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74 65 72  SetSize(lem.nter
bbf0: 6d 69 6e 61 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f  minal+1);..    /
bc00: 2a 20 46 69 6e 64 20 74 68 65 20 70 72 65 63 65  * Find the prece
bc10: 64 65 6e 63 65 20 66 6f 72 20 65 76 65 72 79 20  dence for every 
bc20: 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20  production rule 
bc30: 28 74 68 61 74 20 68 61 73 20 6f 6e 65 29 20 2a  (that has one) *
bc40: 2f 0a 20 20 20 20 46 69 6e 64 52 75 6c 65 50 72  /.    FindRulePr
bc50: 65 63 65 64 65 6e 63 65 73 28 26 6c 65 6d 29 3b  ecedences(&lem);
bc60: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
bc70: 20 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74   the lambda-nont
bc80: 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74 68 65  erminals and the
bc90: 20 66 69 72 73 74 2d 73 65 74 73 20 66 6f 72 20   first-sets for 
bca0: 65 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e  every.    ** non
bcb0: 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20 20  terminal */.    
bcc0: 46 69 6e 64 46 69 72 73 74 53 65 74 73 28 26 6c  FindFirstSets(&l
bcd0: 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  em);..    /* Com
bce0: 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73  pute all LR(0) s
bcf0: 74 61 74 65 73 2e 20 20 41 6c 73 6f 20 72 65 63  tates.  Also rec
bd00: 6f 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70  ord follow-set p
bd10: 72 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20 20 2a  ropagation.    *
bd20: 2a 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61 74 20  * links so that 
bd30: 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63  the follow-set c
bd40: 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c  an be computed l
bd50: 61 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e  ater */.    lem.
bd60: 6e 73 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  nstate = 0;.    
bd70: 46 69 6e 64 53 74 61 74 65 73 28 26 6c 65 6d 29  FindStates(&lem)
bd80: 3b 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74 65 64  ;.    lem.sorted
bd90: 20 3d 20 53 74 61 74 65 5f 61 72 72 61 79 6f 66   = State_arrayof
bda0: 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69 65 20  ();..    /* Tie 
bdb0: 75 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20 6f 6e  up loose ends on
bdc0: 20 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e   the propagation
bdd0: 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20 46 69   links */.    Fi
bde0: 6e 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a  ndLinks(&lem);..
bdf0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
be00: 68 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20 6f 66  he follow set of
be10: 20 65 76 65 72 79 20 72 65 64 75 63 69 62 6c 65   every reducible
be20: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a   configuration *
be30: 2f 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c 6f 77  /.    FindFollow
be40: 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  Sets(&lem);..   
be50: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
be60: 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f  action tables */
be70: 0a 20 20 20 20 46 69 6e 64 41 63 74 69 6f 6e 73  .    FindActions
be80: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
be90: 43 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63 74  Compress the act
bea0: 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ion tables */.  
beb0: 20 20 69 66 28 20 63 6f 6d 70 72 65 73 73 3d 3d    if( compress==
bec0: 30 20 29 20 43 6f 6d 70 72 65 73 73 54 61 62 6c  0 ) CompressTabl
bed0: 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  es(&lem);..    /
bee0: 2a 20 52 65 6f 72 64 65 72 20 61 6e 64 20 72 65  * Reorder and re
bef0: 6e 75 6d 62 65 72 20 74 68 65 20 73 74 61 74 65  number the state
bf00: 73 20 73 6f 20 74 68 61 74 20 73 74 61 74 65 73  s so that states
bf10: 20 77 69 74 68 20 66 65 77 65 72 20 63 68 6f 69   with fewer choi
bf20: 63 65 73 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72  ces.    ** occur
bf30: 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
bf40: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
bf50: 61 74 69 6f 6e 20 74 68 61 74 20 68 65 6c 70 73  ation that helps
bf60: 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a   make the.    **
bf70: 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
bf80: 72 20 74 61 62 6c 65 73 20 73 6d 61 6c 6c 65 72  r tables smaller
bf90: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 6f 52  . */.    if( noR
bfa0: 65 73 6f 72 74 3d 3d 30 20 29 20 52 65 73 6f 72  esort==0 ) Resor
bfb0: 74 53 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a 0a  tStates(&lem);..
bfc0: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
bfd0: 61 20 72 65 70 6f 72 74 20 6f 66 20 74 68 65 20  a report of the 
bfe0: 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 65 64  parser generated
bff0: 2e 20 20 28 74 68 65 20 22 79 2e 6f 75 74 70 75  .  (the "y.outpu
c000: 74 22 20 66 69 6c 65 29 20 2a 2f 0a 20 20 20 20  t" file) */.    
c010: 69 66 28 20 21 71 75 69 65 74 20 29 20 52 65 70  if( !quiet ) Rep
c020: 6f 72 74 4f 75 74 70 75 74 28 26 6c 65 6d 29 3b  ortOutput(&lem);
c030: 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
c040: 65 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64  e the source cod
c050: 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72  e for the parser
c060: 20 2a 2f 0a 20 20 20 20 52 65 70 6f 72 74 54 61   */.    ReportTa
c070: 62 6c 65 28 26 6c 65 6d 2c 20 6d 68 66 6c 61 67  ble(&lem, mhflag
c080: 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 64 75  );..    /* Produ
c090: 63 65 20 61 20 68 65 61 64 65 72 20 66 69 6c 65  ce a header file
c0a0: 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20   for use by the 
c0b0: 73 63 61 6e 6e 65 72 2e 20 20 28 54 68 69 73 20  scanner.  (This 
c0c0: 73 74 65 70 20 69 73 0a 20 20 20 20 2a 2a 20 6f  step is.    ** o
c0d0: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 22 2d  mitted if the "-
c0e0: 6d 22 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65  m" option is use
c0f0: 64 20 62 65 63 61 75 73 65 20 6d 61 6b 65 68 65  d because makehe
c100: 61 64 65 72 73 20 77 69 6c 6c 0a 20 20 20 20 2a  aders will.    *
c110: 2a 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 66  * generate the f
c120: 69 6c 65 20 66 6f 72 20 75 73 2e 29 20 2a 2f 0a  ile for us.) */.
c130: 20 20 20 20 69 66 28 20 21 6d 68 66 6c 61 67 20      if( !mhflag 
c140: 29 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 26  ) ReportHeader(&
c150: 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lem);.  }.  if( 
c160: 73 74 61 74 69 73 74 69 63 73 20 29 7b 0a 20 20  statistics ){.  
c170: 20 20 70 72 69 6e 74 66 28 22 50 61 72 73 65 72    printf("Parser
c180: 20 73 74 61 74 69 73 74 69 63 73 3a 20 25 64 20   statistics: %d 
c190: 74 65 72 6d 69 6e 61 6c 73 2c 20 25 64 20 6e 6f  terminals, %d no
c1a0: 6e 74 65 72 6d 69 6e 61 6c 73 2c 20 25 64 20 72  nterminals, %d r
c1b0: 75 6c 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 6c  ules\n",.      l
c1c0: 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c 20 6c 65  em.nterminal, le
c1d0: 6d 2e 6e 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d 2e  m.nsymbol - lem.
c1e0: 6e 74 65 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e 6e  nterminal, lem.n
c1f0: 72 75 6c 65 29 3b 0a 20 20 20 20 70 72 69 6e 74  rule);.    print
c200: 66 28 22 20 20 20 20 20 20 20 20 20 20 20 20 20  f("             
c210: 20 20 20 20 20 20 25 64 20 73 74 61 74 65 73 2c        %d states,
c220: 20 25 64 20 70 61 72 73 65 72 20 74 61 62 6c 65   %d parser table
c230: 20 65 6e 74 72 69 65 73 2c 20 25 64 20 63 6f 6e   entries, %d con
c240: 66 6c 69 63 74 73 5c 6e 22 2c 0a 20 20 20 20 20  flicts\n",.     
c250: 20 6c 65 6d 2e 6e 73 74 61 74 65 2c 20 6c 65 6d   lem.nstate, lem
c260: 2e 74 61 62 6c 65 73 69 7a 65 2c 20 6c 65 6d 2e  .tablesize, lem.
c270: 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d 0a  nconflict);.  }.
c280: 20 20 69 66 28 20 6c 65 6d 2e 6e 63 6f 6e 66 6c    if( lem.nconfl
c290: 69 63 74 20 3e 20 30 20 29 7b 0a 20 20 20 20 66  ict > 0 ){.    f
c2a0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25  printf(stderr,"%
c2b0: 64 20 70 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69  d parsing confli
c2c0: 63 74 73 2e 5c 6e 22 2c 6c 65 6d 2e 6e 63 6f 6e  cts.\n",lem.ncon
c2d0: 66 6c 69 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  flict);.  }..  /
c2e0: 2a 20 72 65 74 75 72 6e 20 30 20 6f 6e 20 73 75  * return 0 on su
c2f0: 63 63 65 73 73 2c 20 31 20 6f 6e 20 66 61 69 6c  ccess, 1 on fail
c300: 75 72 65 2e 20 2a 2f 0a 20 20 65 78 69 74 63 6f  ure. */.  exitco
c310: 64 65 20 3d 20 28 28 6c 65 6d 2e 65 72 72 6f 72  de = ((lem.error
c320: 63 6e 74 20 3e 20 30 29 20 7c 7c 20 28 6c 65 6d  cnt > 0) || (lem
c330: 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e 20 30 29 29  .nconflict > 0))
c340: 20 3f 20 31 20 3a 20 30 3b 0a 20 20 65 78 69 74   ? 1 : 0;.  exit
c350: 28 65 78 69 74 63 6f 64 65 29 3b 0a 20 20 72 65  (exitcode);.  re
c360: 74 75 72 6e 20 28 65 78 69 74 63 6f 64 65 29 3b  turn (exitcode);
c370: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
c380: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
c390: 65 20 66 69 6c 65 20 22 6d 73 6f 72 74 2e 63 22  e file "msort.c"
c3a0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
c3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3c0: 2f 0a 2f 2a 0a 2a 2a 20 41 20 67 65 6e 65 72 69  /./*.** A generi
c3d0: 63 20 6d 65 72 67 65 2d 73 6f 72 74 20 70 72 6f  c merge-sort pro
c3e0: 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 55 53 41 47  gram..**.** USAG
c3f0: 45 3a 0a 2a 2a 20 4c 65 74 20 22 70 74 72 22 20  E:.** Let "ptr" 
c400: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
c410: 73 6f 6d 65 20 73 74 72 75 63 74 75 72 65 20 77  some structure w
c420: 68 69 63 68 20 69 73 20 61 74 20 74 68 65 20 68  hich is at the h
c430: 65 61 64 20 6f 66 0a 2a 2a 20 61 20 6e 75 6c 6c  ead of.** a null
c440: 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 73 74  -terminated list
c450: 2e 20 20 54 68 65 6e 20 74 6f 20 73 6f 72 74 20  .  Then to sort 
c460: 74 68 65 20 6c 69 73 74 20 63 61 6c 6c 3a 0a 2a  the list call:.*
c470: 2a 0a 2a 2a 20 20 20 20 20 70 74 72 20 3d 20 6d  *.**     ptr = m
c480: 73 6f 72 74 28 70 74 72 2c 26 28 70 74 72 2d 3e  sort(ptr,&(ptr->
c490: 6e 65 78 74 29 2c 63 6d 70 66 6e 63 29 3b 0a 2a  next),cmpfnc);.*
c4a0: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 6f 76  *.** In the abov
c4b0: 65 2c 20 22 63 6d 70 66 6e 63 22 20 69 73 20 61  e, "cmpfnc" is a
c4c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
c4d0: 6e 63 74 69 6f 6e 20 77 68 69 63 68 20 63 6f 6d  nction which com
c4e0: 70 61 72 65 73 0a 2a 2a 20 74 77 6f 20 69 6e 73  pares.** two ins
c4f0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 73 74  tances of the st
c500: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
c510: 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20  rns an integer, 
c520: 61 73 20 69 6e 0a 2a 2a 20 73 74 72 63 6d 70 2e  as in.** strcmp.
c530: 20 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67    The second arg
c540: 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
c550: 65 72 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  er to the pointe
c560: 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 65 63 6f  r to the.** seco
c570: 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  nd element of th
c580: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20  e linked list.  
c590: 54 68 69 73 20 61 64 64 72 65 73 73 20 69 73 20  This address is 
c5a0: 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 0a  used to compute.
c5b0: 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  ** the offset to
c5c0: 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c   the "next" fiel
c5d0: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 72  d within the str
c5e0: 75 63 74 75 72 65 2e 20 20 54 68 65 20 6f 66 66  ucture.  The off
c5f0: 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 22 6e  set to.** the "n
c600: 65 78 74 22 20 66 69 65 6c 64 20 6d 75 73 74 20  ext" field must 
c610: 62 65 20 63 6f 6e 73 74 61 6e 74 20 66 6f 72 20  be constant for 
c620: 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69  all structures i
c630: 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  n the list..**.*
c640: 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72  * The function r
c650: 65 74 75 72 6e 73 20 61 20 6e 65 77 20 70 6f 69  eturns a new poi
c660: 6e 74 65 72 20 77 68 69 63 68 20 69 73 20 74 68  nter which is th
c670: 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 6c 69  e head of the li
c680: 73 74 0a 2a 2a 20 61 66 74 65 72 20 73 6f 72 74  st.** after sort
c690: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47 4f 52  ing..**.** ALGOR
c6a0: 49 54 48 4d 3a 0a 2a 2a 20 4d 65 72 67 65 2d 73  ITHM:.** Merge-s
c6b0: 6f 72 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  ort..*/../*.** R
c6c0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
c6d0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 72 75  to the next stru
c6e0: 63 74 75 72 65 20 69 6e 20 74 68 65 20 6c 69 6e  cture in the lin
c6f0: 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 23 64 65  ked list..*/.#de
c700: 66 69 6e 65 20 4e 45 58 54 28 41 29 20 28 2a 28  fine NEXT(A) (*(
c710: 63 68 61 72 2a 2a 29 28 28 28 75 6e 73 69 67 6e  char**)(((unsign
c720: 65 64 20 6c 6f 6e 67 29 41 29 2b 6f 66 66 73 65  ed long)A)+offse
c730: 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74  t))../*.** Input
c740: 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20 20  s:.**   a:      
c750: 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d   A sorted, null-
c760: 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65  terminated linke
c770: 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65  d list.  (May be
c780: 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a 20   null)..**   b: 
c790: 20 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c 20        A sorted, 
c7a0: 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20  null-terminated 
c7b0: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d  linked list.  (M
c7c0: 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20  ay be null)..** 
c7d0: 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70 6f 69    cmp:     A poi
c7e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6d 70  nter to the comp
c7f0: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  arison function.
c800: 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20 20 4f  .**   offset:  O
c810: 66 66 73 65 74 20 69 6e 20 74 68 65 20 73 74 72  ffset in the str
c820: 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 22 6e  ucture to the "n
c830: 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a  ext" field..**.*
c840: 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a  * Return Value:.
c850: 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74  **   A pointer t
c860: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61 20  o the head of a 
c870: 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e 74  sorted list cont
c880: 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d 65  aining the eleme
c890: 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74 68  nts.**   of both
c8a0: 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a 20   a and b..**.** 
c8b0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a  Side effects:.**
c8c0: 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70 6f     The "next" po
c8d0: 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d 65  inters for eleme
c8e0: 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74 73  nts in the lists
c8f0: 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a 20   a and b are.** 
c900: 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74    changed..*/.st
c910: 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72 67 65  atic char *merge
c920: 28 0a 20 20 63 68 61 72 20 2a 61 2c 0a 20 20 63  (.  char *a,.  c
c930: 68 61 72 20 2a 62 2c 0a 20 20 69 6e 74 20 28 2a  har *b,.  int (*
c940: 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  cmp)(const char*
c950: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 0a 20  ,const char*),. 
c960: 20 69 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a 20   int offset.){. 
c970: 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68 65 61   char *ptr, *hea
c980: 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20 29  d;..  if( a==0 )
c990: 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62 3b 0a  {.    head = b;.
c9a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d 30    }else if( b==0
c9b0: 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 61   ){.    head = a
c9c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
c9d0: 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c 3d  f( (*cmp)(a,b)<=
c9e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20 3d  0 ){.      ptr =
c9f0: 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e 45   a;.      a = NE
ca00: 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65  XT(a);.    }else
ca10: 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b  {.      ptr = b;
ca20: 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28  .      b = NEXT(
ca30: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 65  b);.    }.    he
ca40: 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77 68  ad = ptr;.    wh
ca50: 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a 20  ile( a && b ){. 
ca60: 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29 28       if( (*cmp)(
ca70: 61 2c 62 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20  a,b)<=0 ){.     
ca80: 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61     NEXT(ptr) = a
ca90: 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d 20  ;.        ptr = 
caa0: 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 4e  a;.        a = N
cab0: 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d 65  EXT(a);.      }e
cac0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45 58  lse{.        NEX
cad0: 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20 20  T(ptr) = b;.    
cae0: 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20      ptr = b;.   
caf0: 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29       b = NEXT(b)
cb00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
cb10: 20 20 20 20 69 66 28 20 61 20 29 20 4e 45 58 54      if( a ) NEXT
cb20: 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 65  (ptr) = a;.    e
cb30: 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74 72 29  lse    NEXT(ptr)
cb40: 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = b;.  }.  retu
cb50: 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn head;.}../*.*
cb60: 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c  * Inputs:.**   l
cb70: 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65  ist:      Pointe
cb80: 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69  r to a singly-li
cb90: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74 72  nked list of str
cba0: 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65  uctures..**   ne
cbb0: 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72  xt:      Pointer
cbc0: 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20 74   to pointer to t
cbd0: 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  he second elemen
cbe0: 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a  t of the list..*
cbf0: 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20 41  *   cmp:       A
cc00: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
cc10: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tion..**.** Retu
cc20: 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41  rn Value:.**   A
cc30: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
cc40: 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64  head of a sorted
cc50: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
cc60: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a   the elements.**
cc70: 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20     orginally in 
cc80: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65  list..**.** Side
cc90: 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54   effects:.**   T
cca0: 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65  he "next" pointe
ccb0: 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20  rs for elements 
ccc0: 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61 6e  in list are chan
ccd0: 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ged..*/.#define 
cce0: 4c 49 53 54 53 49 5a 45 20 33 30 0a 73 74 61 74  LISTSIZE 30.stat
ccf0: 69 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 0a  ic char *msort(.
cd00: 20 20 63 68 61 72 20 2a 6c 69 73 74 2c 0a 20 20    char *list,.  
cd10: 63 68 61 72 20 2a 2a 6e 65 78 74 2c 0a 20 20 69  char **next,.  i
cd20: 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20  nt (*cmp)(const 
cd30: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
cd40: 2a 29 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  *).){.  unsigned
cd50: 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20 20   long offset;.  
cd60: 63 68 61 72 20 2a 65 70 3b 0a 20 20 63 68 61 72  char *ep;.  char
cd70: 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d 3b   *set[LISTSIZE];
cd80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66 73  .  int i;.  offs
cd90: 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c  et = (unsigned l
cda0: 6f 6e 67 29 6e 65 78 74 20 2d 20 28 75 6e 73 69  ong)next - (unsi
cdb0: 67 6e 65 64 20 6c 6f 6e 67 29 6c 69 73 74 3b 0a  gned long)list;.
cdc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53    for(i=0; i<LIS
cdd0: 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65 74 5b  TSIZE; i++) set[
cde0: 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  i] = 0;.  while(
cdf0: 20 6c 69 73 74 20 29 7b 0a 20 20 20 20 65 70 20   list ){.    ep 
ce00: 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69 73 74  = list;.    list
ce10: 20 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b 0a 20   = NEXT(list);. 
ce20: 20 20 20 4e 45 58 54 28 65 70 29 20 3d 20 30 3b     NEXT(ep) = 0;
ce30: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
ce40: 4c 49 53 54 53 49 5a 45 2d 31 20 26 26 20 73 65  LISTSIZE-1 && se
ce50: 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  t[i]!=0; i++){. 
ce60: 20 20 20 20 20 65 70 20 3d 20 6d 65 72 67 65 28       ep = merge(
ce70: 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66  ep,set[i],cmp,of
ce80: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 65 74  fset);.      set
ce90: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
cea0: 20 20 20 73 65 74 5b 69 5d 20 3d 20 65 70 3b 0a     set[i] = ep;.
ceb0: 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a 20 20    }.  ep = 0;.  
cec0: 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53  for(i=0; i<LISTS
ced0: 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20 73 65  IZE; i++) if( se
cee0: 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65 72 67  t[i] ) ep = merg
cef0: 65 28 73 65 74 5b 69 5d 2c 65 70 2c 63 6d 70 2c  e(set[i],ep,cmp,
cf00: 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74 75 72  offset);.  retur
cf10: 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  n ep;.}./*******
cf20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf30: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
cf40: 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a  "option.c" *****
cf50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf60: 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 63 68  *****/.static ch
cf70: 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61 74 69  ar **argv;.stati
cf80: 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  c struct s_optio
cf90: 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63 20 46  ns *op;.static F
cfa0: 49 4c 45 20 2a 65 72 72 73 74 72 65 61 6d 3b 0a  ILE *errstream;.
cfb0: 0a 23 64 65 66 69 6e 65 20 49 53 4f 50 54 28 58  .#define ISOPT(X
cfc0: 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c  ) ((X)[0]=='-'||
cfd0: 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72  (X)[0]=='+'||str
cfe0: 63 68 72 28 28 58 29 2c 27 3d 27 29 21 3d 30 29  chr((X),'=')!=0)
cff0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  ../*.** Print th
d000: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77  e command line w
d010: 69 74 68 20 61 20 63 61 72 72 6f 74 20 70 6f 69  ith a carrot poi
d020: 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6b 2d 74  nting to the k-t
d030: 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f  h character.** o
d040: 66 20 74 68 65 20 6e 2d 74 68 20 66 69 65 6c 64  f the n-th field
d050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d060: 20 65 72 72 6c 69 6e 65 28 69 6e 74 20 6e 2c 20   errline(int n, 
d070: 69 6e 74 20 6b 2c 20 46 49 4c 45 20 2a 65 72 72  int k, FILE *err
d080: 29 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e 74 2c  ).{.  int spcnt,
d090: 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76 5b 30   i;.  if( argv[0
d0a0: 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c  ] ) fprintf(err,
d0b0: 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20  "%s",argv[0]);. 
d0c0: 20 73 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e 53 74   spcnt = lemonSt
d0d0: 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20  rlen(argv[0]) + 
d0e0: 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  1;.  for(i=1; i<
d0f0: 6e 20 26 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b  n && argv[i]; i+
d100: 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  +){.    fprintf(
d110: 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69  err," %s",argv[i
d120: 5d 29 3b 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d  ]);.    spcnt +=
d130: 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67   lemonStrlen(arg
d140: 76 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20 73  v[i])+1;.  }.  s
d150: 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72  pcnt += k;.  for
d160: 28 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29  (; argv[i]; i++)
d170: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 20 25   fprintf(err," %
d180: 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 69  s",argv[i]);.  i
d190: 66 28 20 73 70 63 6e 74 3c 32 30 20 29 7b 0a 20  f( spcnt<20 ){. 
d1a0: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
d1b0: 5c 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e 22  \n%*s^-- here\n"
d1c0: 2c 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20 7d 65  ,spcnt,"");.  }e
d1d0: 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
d1e0: 28 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72 65 20  (err,"\n%*shere 
d1f0: 2d 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c 22  --^\n",spcnt-7,"
d200: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
d210: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
d220: 78 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 6e 6f  x of the N-th no
d230: 6e 2d 73 77 69 74 63 68 20 61 72 67 75 6d 65 6e  n-switch argumen
d240: 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  t.  Return -1.**
d250: 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20   if N is out of 
d260: 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  range..*/.static
d270: 20 69 6e 74 20 61 72 67 69 6e 64 65 78 28 69 6e   int argindex(in
d280: 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  t n).{.  int i;.
d290: 20 20 69 6e 74 20 64 61 73 68 64 61 73 68 20 3d    int dashdash =
d2a0: 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d   0;.  if( argv!=
d2b0: 30 20 26 26 20 2a 61 72 67 76 21 3d 30 20 29 7b  0 && *argv!=0 ){
d2c0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72  .    for(i=1; ar
d2d0: 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  gv[i]; i++){.   
d2e0: 20 20 20 69 66 28 20 64 61 73 68 64 61 73 68 20     if( dashdash 
d2f0: 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69  || !ISOPT(argv[i
d300: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]) ){.        if
d310: 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( n==0 ) return 
d320: 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a  i;.        n--;.
d330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d340: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d  ( strcmp(argv[i]
d350: 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68  ,"--")==0 ) dash
d360: 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  dash = 1;.    }.
d370: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
d380: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20  .}..static char 
d390: 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e  emsg[] = "Comman
d3a0: 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20 65 72  d line syntax er
d3b0: 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50  ror: ";../*.** P
d3c0: 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20 63 6f  rocess a flag co
d3d0: 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d  mmand line argum
d3e0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
d3f0: 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73 28 69  nt handleflags(i
d400: 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72 72 29  nt i, FILE *err)
d410: 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e  .{.  int v;.  in
d420: 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20  t errcnt = 0;.  
d430: 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30  int j;.  for(j=0
d440: 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a  ; op[j].label; j
d450: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
d460: 6e 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b 31 5d  ncmp(&argv[i][1]
d470: 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c 65 6d  ,op[j].label,lem
d480: 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d 2e 6c  onStrlen(op[j].l
d490: 61 62 65 6c 29 29 3d 3d 30 20 29 20 62 72 65 61  abel))==0 ) brea
d4a0: 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61 72 67  k;.  }.  v = arg
d4b0: 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31  v[i][0]=='-' ? 1
d4c0: 20 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70 5b 6a   : 0;.  if( op[j
d4d0: 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20  ].label==0 ){.  
d4e0: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
d4f0: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
d500: 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69  %sundefined opti
d510: 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20  on.\n",emsg);.  
d520: 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c      errline(i,1,
d530: 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  err);.    }.    
d540: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73  errcnt++;.  }els
d550: 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65  e if( op[j].type
d560: 3d 3d 4f 50 54 5f 46 4c 41 47 20 29 7b 0a 20 20  ==OPT_FLAG ){.  
d570: 20 20 2a 28 28 69 6e 74 2a 29 6f 70 5b 6a 5d 2e    *((int*)op[j].
d580: 61 72 67 29 20 3d 20 76 3b 0a 20 20 7d 65 6c 73  arg) = v;.  }els
d590: 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65  e if( op[j].type
d5a0: 3d 3d 4f 50 54 5f 46 46 4c 41 47 20 29 7b 0a 20  ==OPT_FFLAG ){. 
d5b0: 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 69 6e     (*(void(*)(in
d5c0: 74 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28  t))(op[j].arg))(
d5d0: 76 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  v);.  }else if( 
d5e0: 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f  op[j].type==OPT_
d5f0: 46 53 54 52 20 29 7b 0a 20 20 20 20 28 2a 28 76  FSTR ){.    (*(v
d600: 6f 69 64 28 2a 29 28 63 68 61 72 20 2a 29 29 28  oid(*)(char *))(
d610: 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 26 61 72 67  op[j].arg))(&arg
d620: 76 5b 69 5d 5b 32 5d 29 3b 0a 20 20 7d 65 6c 73  v[i][2]);.  }els
d630: 65 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20 29  e{.    if( err )
d640: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
d650: 65 72 72 2c 22 25 73 6d 69 73 73 69 6e 67 20 61  err,"%smissing a
d660: 72 67 75 6d 65 6e 74 20 6f 6e 20 73 77 69 74 63  rgument on switc
d670: 68 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20  h.\n",emsg);.   
d680: 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65     errline(i,1,e
d690: 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  rr);.    }.    e
d6a0: 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72  rrcnt++;.  }.  r
d6b0: 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a  eturn errcnt;.}.
d6c0: 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61  ./*.** Process a
d6d0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 77   command line sw
d6e0: 69 74 63 68 20 77 68 69 63 68 20 68 61 73 20 61  itch which has a
d6f0: 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  n argument..*/.s
d700: 74 61 74 69 63 20 69 6e 74 20 68 61 6e 64 6c 65  tatic int handle
d710: 73 77 69 74 63 68 28 69 6e 74 20 69 2c 20 46 49  switch(int i, FI
d720: 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74  LE *err).{.  int
d730: 20 6c 76 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c   lv = 0;.  doubl
d740: 65 20 64 76 20 3d 20 30 2e 30 3b 0a 20 20 63 68  e dv = 0.0;.  ch
d750: 61 72 20 2a 73 76 20 3d 20 30 2c 20 2a 65 6e 64  ar *sv = 0, *end
d760: 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20  ;.  char *cp;.  
d770: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 65 72 72  int j;.  int err
d780: 63 6e 74 20 3d 20 30 3b 0a 20 20 63 70 20 3d 20  cnt = 0;.  cp = 
d790: 73 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27  strchr(argv[i],'
d7a0: 3d 27 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  =');.  assert( c
d7b0: 70 21 3d 30 20 29 3b 0a 20 20 2a 63 70 20 3d 20  p!=0 );.  *cp = 
d7c0: 30 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70  0;.  for(j=0; op
d7d0: 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b  [j].label; j++){
d7e0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
d7f0: 61 72 67 76 5b 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61  argv[i],op[j].la
d800: 62 65 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  bel)==0 ) break;
d810: 0a 20 20 7d 0a 20 20 2a 63 70 20 3d 20 27 3d 27  .  }.  *cp = '='
d820: 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61  ;.  if( op[j].la
d830: 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  bel==0 ){.    if
d840: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66  ( err ){.      f
d850: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75 6e  printf(err,"%sun
d860: 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c  defined option.\
d870: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
d880: 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29  errline(i,0,err)
d890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63  ;.    }.    errc
d8a0: 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nt++;.  }else{. 
d8b0: 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 73 77 69     cp++;.    swi
d8c0: 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 20  tch( op[j].type 
d8d0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
d8e0: 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61  T_FLAG:.      ca
d8f0: 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20  se OPT_FFLAG:.  
d900: 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b        if( err ){
d910: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
d920: 74 66 28 65 72 72 2c 22 25 73 6f 70 74 69 6f 6e  tf(err,"%soption
d930: 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67   requires an arg
d940: 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b  ument.\n",emsg);
d950: 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 6c 69  .          errli
d960: 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20  ne(i,0,err);.   
d970: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65       }.        e
d980: 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  rrcnt++;.       
d990: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
d9a0: 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20  se OPT_DBL:.    
d9b0: 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a    case OPT_FDBL:
d9c0: 0a 20 20 20 20 20 20 20 20 64 76 20 3d 20 73 74  .        dv = st
d9d0: 72 74 6f 64 28 63 70 2c 26 65 6e 64 29 3b 0a 20  rtod(cp,&end);. 
d9e0: 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64 20         if( *end 
d9f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
da00: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20   err ){.        
da10: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
da20: 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72 61  "%sillegal chara
da30: 63 74 65 72 20 69 6e 20 66 6c 6f 61 74 69 6e 67  cter in floating
da40: 2d 70 6f 69 6e 74 20 61 72 67 75 6d 65 6e 74 2e  -point argument.
da50: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
da60: 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69         errline(i
da70: 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ,((unsigned long
da80: 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64 20  )end)-(unsigned 
da90: 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72 72  long)argv[i],err
daa0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
dab0: 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b           errcnt+
dac0: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
dad0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dae0: 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a    case OPT_INT:.
daf0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
db00: 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 76 20  INT:.        lv 
db10: 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26 65 6e 64  = strtol(cp,&end
db20: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,0);.        if(
db30: 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20   *end ){.       
db40: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
db50: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
db60: 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c  f(err,"%sillegal
db70: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 69 6e   character in in
db80: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 5c  teger argument.\
db90: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
dba0: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
dbb0: 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
dbc0: 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64 20 6c  end)-(unsigned l
dbd0: 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72 72 29  ong)argv[i],err)
dbe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
dbf0: 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b          errcnt++
dc00: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dc10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
dc20: 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20   case OPT_STR:. 
dc30: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53       case OPT_FS
dc40: 54 52 3a 0a 20 20 20 20 20 20 20 20 73 76 20 3d  TR:.        sv =
dc50: 20 63 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65   cp;.        bre
dc60: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  ak;.    }.    sw
dc70: 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65  itch( op[j].type
dc80: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
dc90: 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63  PT_FLAG:.      c
dca0: 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20  ase OPT_FFLAG:. 
dcb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
dcc0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
dcd0: 3a 0a 20 20 20 20 20 20 20 20 2a 28 64 6f 75 62  :.        *(doub
dce0: 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20  le*)(op[j].arg) 
dcf0: 3d 20 64 76 3b 0a 20 20 20 20 20 20 20 20 62 72  = dv;.        br
dd00: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
dd10: 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20  OPT_FDBL:.      
dd20: 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 64 6f 75    (*(void(*)(dou
dd30: 62 6c 65 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  ble))(op[j].arg)
dd40: 29 28 64 76 29 3b 0a 20 20 20 20 20 20 20 20 62  )(dv);.        b
dd50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
dd60: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
dd70: 20 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e    *(int*)(op[j].
dd80: 61 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20  arg) = lv;.     
dd90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
dda0: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
ddb0: 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a         (*(void(*
ddc0: 29 28 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e 61 72  )(int))(op[j].ar
ddd0: 67 29 29 28 28 69 6e 74 29 6c 76 29 3b 0a 20 20  g))((int)lv);.  
dde0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ddf0: 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a     case OPT_STR:
de00: 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a  .        *(char*
de10: 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20  *)(op[j].arg) = 
de20: 73 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  sv;.        brea
de30: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
de40: 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20  T_FSTR:.        
de50: 28 2a 28 76 6f 69 64 28 2a 29 28 63 68 61 72 20  (*(void(*)(char 
de60: 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28  *))(op[j].arg))(
de70: 73 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  sv);.        bre
de80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
de90: 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d  return errcnt;.}
dea0: 0a 0a 69 6e 74 20 4f 70 74 49 6e 69 74 28 63 68  ..int OptInit(ch
deb0: 61 72 20 2a 2a 61 2c 20 73 74 72 75 63 74 20 73  ar **a, struct s
dec0: 5f 6f 70 74 69 6f 6e 73 20 2a 6f 2c 20 46 49 4c  _options *o, FIL
ded0: 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74 20  E *err).{.  int 
dee0: 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72  errcnt = 0;.  ar
def0: 67 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f  gv = a;.  op = o
df00: 3b 0a 20 20 65 72 72 73 74 72 65 61 6d 20 3d 20  ;.  errstream = 
df10: 65 72 72 3b 0a 20 20 69 66 28 20 61 72 67 76 20  err;.  if( argv 
df20: 26 26 20 2a 61 72 67 76 20 26 26 20 6f 70 20 29  && *argv && op )
df30: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
df40: 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69   for(i=1; argv[i
df50: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
df60: 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27  f( argv[i][0]=='
df70: 2b 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d  +' || argv[i][0]
df80: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
df90: 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c   errcnt += handl
dfa0: 65 66 6c 61 67 73 28 69 2c 65 72 72 29 3b 0a 20  eflags(i,err);. 
dfb0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
dfc0: 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d  trchr(argv[i],'=
dfd0: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72  ') ){.        er
dfe0: 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77  rcnt += handlesw
dff0: 69 74 63 68 28 69 2c 65 72 72 29 3b 0a 20 20 20  itch(i,err);.   
e000: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
e010: 20 69 66 28 20 65 72 72 63 6e 74 3e 30 20 29 7b   if( errcnt>0 ){
e020: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
e030: 2c 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20  ,"Valid command 
e040: 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72  line options for
e050: 20 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c   \"%s\" are:\n",
e060: 2a 61 29 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e  *a);.    OptPrin
e070: 74 28 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  t();.    exit(1)
e080: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
e090: 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67  ;.}..int OptNArg
e0a0: 73 28 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  s(){.  int cnt =
e0b0: 20 30 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61   0;.  int dashda
e0c0: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
e0d0: 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26  .  if( argv!=0 &
e0e0: 26 20 61 72 67 76 5b 30 5d 21 3d 30 20 29 7b 0a  & argv[0]!=0 ){.
e0f0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67      for(i=1; arg
e100: 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  v[i]; i++){.    
e110: 20 20 69 66 28 20 64 61 73 68 64 61 73 68 20 7c    if( dashdash |
e120: 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d  | !ISOPT(argv[i]
e130: 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  ) ) cnt++;.     
e140: 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
e150: 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64  [i],"--")==0 ) d
e160: 61 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20  ashdash = 1;.   
e170: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
e180: 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70  cnt;.}..char *Op
e190: 74 41 72 67 28 69 6e 74 20 6e 29 0a 7b 0a 20 20  tArg(int n).{.  
e1a0: 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67  int i;.  i = arg
e1b0: 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72 65 74 75  index(n);.  retu
e1c0: 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67 76 5b 69  rn i>=0 ? argv[i
e1d0: 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 4f  ] : 0;.}..void O
e1e0: 70 74 45 72 72 28 69 6e 74 20 6e 29 0a 7b 0a 20  ptErr(int n).{. 
e1f0: 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72   int i;.  i = ar
e200: 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 69 66 28  gindex(n);.  if(
e210: 20 69 3e 3d 30 20 29 20 65 72 72 6c 69 6e 65 28   i>=0 ) errline(
e220: 69 2c 30 2c 65 72 72 73 74 72 65 61 6d 29 3b 0a  i,0,errstream);.
e230: 7d 0a 0a 76 6f 69 64 20 4f 70 74 50 72 69 6e 74  }..void OptPrint
e240: 28 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  (){.  int i;.  i
e250: 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b 0a 20 20 6d  nt max, len;.  m
e260: 61 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ax = 0;.  for(i=
e270: 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20  0; op[i].label; 
e280: 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20  i++){.    len = 
e290: 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69  lemonStrlen(op[i
e2a0: 5d 2e 6c 61 62 65 6c 29 20 2b 20 31 3b 0a 20 20  ].label) + 1;.  
e2b0: 20 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e    switch( op[i].
e2c0: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
e2d0: 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20  se OPT_FLAG:.   
e2e0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41     case OPT_FFLA
e2f0: 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  G:.        break
e300: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
e310: 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65  _INT:.      case
e320: 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20   OPT_FINT:.     
e330: 20 20 20 6c 65 6e 20 2b 3d 20 39 3b 20 20 20 20     len += 9;    
e340: 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20     /* length of 
e350: 22 3c 69 6e 74 65 67 65 72 3e 22 20 2a 2f 0a 20  "<integer>" */. 
e360: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e370: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
e380: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
e390: 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 6c  _FDBL:.        l
e3a0: 65 6e 20 2b 3d 20 36 3b 20 20 20 20 20 20 20 2f  en += 6;       /
e3b0: 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 72 65  * length of "<re
e3c0: 61 6c 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  al>" */.        
e3d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
e3e0: 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20  e OPT_STR:.     
e3f0: 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a   case OPT_FSTR:.
e400: 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 38          len += 8
e410: 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74  ;       /* lengt
e420: 68 20 6f 66 20 22 3c 73 74 72 69 6e 67 3e 22 20  h of "<string>" 
e430: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
e440: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e450: 6c 65 6e 3e 6d 61 78 20 29 20 6d 61 78 20 3d 20  len>max ) max = 
e460: 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  len;.  }.  for(i
e470: 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b  =0; op[i].label;
e480: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63   i++){.    switc
e490: 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b  h( op[i].type ){
e4a0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
e4b0: 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65  FLAG:.      case
e4c0: 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20   OPT_FFLAG:.    
e4d0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73      fprintf(errs
e4e0: 74 72 65 61 6d 2c 22 20 20 2d 25 2d 2a 73 20 20  tream,"  -%-*s  
e4f0: 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e  %s\n",max,op[i].
e500: 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73  label,op[i].mess
e510: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
e520: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
e530: 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63  OPT_INT:.      c
e540: 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20  ase OPT_FINT:.  
e550: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
e560: 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 69  rstream,"  %s=<i
e570: 6e 74 65 67 65 72 3e 25 2a 73 20 20 25 73 5c 6e  nteger>%*s  %s\n
e580: 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20  ",op[i].label,. 
e590: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d           (int)(m
e5a0: 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f  ax-lemonStrlen(o
e5b0: 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 39 29 2c 22  p[i].label)-9),"
e5c0: 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29  ",op[i].message)
e5d0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
e5e0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
e5f0: 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  DBL:.      case 
e600: 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20  OPT_FDBL:.      
e610: 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72    fprintf(errstr
e620: 65 61 6d 2c 22 20 20 25 73 3d 3c 72 65 61 6c 3e  eam,"  %s=<real>
e630: 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d  %*s  %s\n",op[i]
e640: 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20  .label,.        
e650: 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f    (int)(max-lemo
e660: 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61  nStrlen(op[i].la
e670: 62 65 6c 29 2d 36 29 2c 22 22 2c 6f 70 5b 69 5d  bel)-6),"",op[i]
e680: 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20  .message);.     
e690: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e6a0: 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20  case OPT_STR:.  
e6b0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54      case OPT_FST
e6c0: 52 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  R:.        fprin
e6d0: 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20  tf(errstream,"  
e6e0: 25 73 3d 3c 73 74 72 69 6e 67 3e 25 2a 73 20 20  %s=<string>%*s  
e6f0: 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65  %s\n",op[i].labe
e700: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e  l,.          (in
e710: 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c  t)(max-lemonStrl
e720: 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d  en(op[i].label)-
e730: 38 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73  8),"",op[i].mess
e740: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
e750: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
e760: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
e770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
e780: 68 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e 63  he file "parse.c
e790: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
e7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
e7b0: 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65  /*.** Input file
e7c0: 20 70 61 72 73 65 72 20 66 6f 72 20 74 68 65 20   parser for the 
e7d0: 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
e7e0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54  erator..*/../* T
e7f0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
e800: 70 61 72 73 65 72 20 2a 2f 0a 65 6e 75 6d 20 65  parser */.enum e
e810: 5f 73 74 61 74 65 20 7b 0a 20 20 49 4e 49 54 49  _state {.  INITI
e820: 41 4c 49 5a 45 2c 0a 20 20 57 41 49 54 49 4e 47  ALIZE,.  WAITING
e830: 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
e840: 45 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  E,.  WAITING_FOR
e850: 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20  _DECL_KEYWORD,. 
e860: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
e870: 4c 5f 41 52 47 2c 0a 20 20 57 41 49 54 49 4e 47  L_ARG,.  WAITING
e880: 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f  _FOR_PRECEDENCE_
e890: 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e  SYMBOL,.  WAITIN
e8a0: 47 5f 46 4f 52 5f 41 52 52 4f 57 2c 0a 20 20 49  G_FOR_ARROW,.  I
e8b0: 4e 5f 52 48 53 2c 0a 20 20 4c 48 53 5f 41 4c 49  N_RHS,.  LHS_ALI
e8c0: 41 53 5f 31 2c 0a 20 20 4c 48 53 5f 41 4c 49 41  AS_1,.  LHS_ALIA
e8d0: 53 5f 32 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53  S_2,.  LHS_ALIAS
e8e0: 5f 33 2c 0a 20 20 52 48 53 5f 41 4c 49 41 53 5f  _3,.  RHS_ALIAS_
e8f0: 31 2c 0a 20 20 52 48 53 5f 41 4c 49 41 53 5f 32  1,.  RHS_ALIAS_2
e900: 2c 0a 20 20 50 52 45 43 45 44 45 4e 43 45 5f 4d  ,.  PRECEDENCE_M
e910: 41 52 4b 5f 31 2c 0a 20 20 50 52 45 43 45 44 45  ARK_1,.  PRECEDE
e920: 4e 43 45 5f 4d 41 52 4b 5f 32 2c 0a 20 20 52 45  NCE_MARK_2,.  RE
e930: 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
e940: 45 52 52 4f 52 2c 0a 20 20 52 45 53 59 4e 43 5f  ERROR,.  RESYNC_
e950: 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
e960: 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ,.  WAITING_FOR_
e970: 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f  DESTRUCTOR_SYMBO
e980: 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  L,.  WAITING_FOR
e990: 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c  _DATATYPE_SYMBOL
e9a0: 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ,.  WAITING_FOR_
e9b0: 46 41 4c 4c 42 41 43 4b 5f 49 44 2c 0a 20 20 57  FALLBACK_ID,.  W
e9c0: 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43  AITING_FOR_WILDC
e9d0: 41 52 44 5f 49 44 0a 7d 3b 0a 73 74 72 75 63 74  ARD_ID.};.struct
e9e0: 20 70 73 74 61 74 65 20 7b 0a 20 20 63 68 61 72   pstate {.  char
e9f0: 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20   *filename;     
ea00: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
ea10: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
ea20: 20 69 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e 6f   int tokenlineno
ea30: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75  ;      /* Linenu
ea40: 6d 62 65 72 20 61 74 20 77 68 69 63 68 20 63 75  mber at which cu
ea50: 72 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74 61 72  rrent token star
ea60: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f  ts */.  int erro
ea70: 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  rcnt;         /*
ea80: 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
ea90: 73 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68  s so far */.  ch
eaa0: 61 72 20 2a 74 6f 6b 65 6e 73 74 61 72 74 3b 20  ar *tokenstart; 
eab0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 63      /* Text of c
eac0: 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a  urrent token */.
ead0: 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a    struct lemon *
eae0: 67 70 3b 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61  gp;     /* Globa
eaf0: 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 2a  l state vector *
eb00: 2f 0a 20 20 65 6e 75 6d 20 65 5f 73 74 61 74 65  /.  enum e_state
eb10: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 2f   state;        /
eb20: 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74  * The state of t
eb30: 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 73  he parser */.  s
eb40: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61  truct symbol *fa
eb50: 6c 6c 62 61 63 6b 3b 20 20 20 2f 2a 20 54 68 65  llback;   /* The
eb60: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20   fallback token 
eb70: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
eb80: 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 20 20  ol *lhs;        
eb90: 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64  /* Left-hand sid
eba0: 65 20 6f 66 20 63 75 72 72 65 6e 74 20 72 75 6c  e of current rul
ebb0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
ebc0: 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20  r *lhsalias;    
ebd0: 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74    /* Alias for t
ebe0: 68 65 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  he LHS */.  int 
ebf0: 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20 20  nrhs;           
ec00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ec10: 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 73   of right-hand s
ec20: 69 64 65 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e  ide symbols seen
ec30: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
ec40: 62 6f 6c 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d  bol *rhs[MAXRHS]
ec50: 3b 20 20 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c  ;  /* RHS symbol
ec60: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
ec70: 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d  r *alias[MAXRHS]
ec80: 3b 20 2f 2a 20 41 6c 69 61 73 65 73 20 66 6f 72  ; /* Aliases for
ec90: 20 65 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c   each RHS symbol
eca0: 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
ecb0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 72 65  struct rule *pre
ecc0: 76 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72  vrule;     /* Pr
ecd0: 65 76 69 6f 75 73 20 72 75 6c 65 20 70 61 72 73  evious rule pars
ece0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
ecf0: 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b  ar *declkeyword;
ed00: 20 20 20 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66     /* Keyword of
ed10: 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a   a declaration *
ed20: 2f 0a 20 20 63 68 61 72 20 2a 2a 64 65 63 6c 61  /.  char **decla
ed30: 72 67 73 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f  rgslot;        /
ed40: 2a 20 57 68 65 72 65 20 74 68 65 20 64 65 63 6c  * Where the decl
ed50: 61 72 61 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  aration argument
ed60: 20 73 68 6f 75 6c 64 20 62 65 20 70 75 74 20 2a   should be put *
ed70: 2f 0a 20 20 69 6e 74 20 69 6e 73 65 72 74 4c 69  /.  int insertLi
ed80: 6e 65 4d 61 63 72 6f 3b 20 20 20 20 20 20 20 2f  neMacro;       /
ed90: 2a 20 41 64 64 20 23 6c 69 6e 65 20 62 65 66 6f  * Add #line befo
eda0: 72 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69  re declaration i
edb0: 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  nsert */.  int *
edc0: 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20  decllinenoslot; 
edd0: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
ede0: 6f 20 77 72 69 74 65 20 64 65 63 6c 61 72 61 74  o write declarat
edf0: 69 6f 6e 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ion line number 
ee00: 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f  */.  enum e_asso
ee10: 63 20 64 65 63 6c 61 73 73 6f 63 3b 20 20 20 20  c declassoc;    
ee20: 2f 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20 61  /* Assign this a
ee30: 73 73 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64 65  ssociation to de
ee40: 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  cl arguments */.
ee50: 20 20 69 6e 74 20 70 72 65 63 63 6f 75 6e 74 65    int preccounte
ee60: 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
ee70: 41 73 73 69 67 6e 20 74 68 69 73 20 70 72 65 63  Assign this prec
ee80: 65 64 65 6e 63 65 20 74 6f 20 64 65 63 6c 20 61  edence to decl a
ee90: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74  rguments */.  st
eea0: 72 75 63 74 20 72 75 6c 65 20 2a 66 69 72 73 74  ruct rule *first
eeb0: 72 75 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e  rule;    /* Poin
eec0: 74 65 72 20 74 6f 20 66 69 72 73 74 20 72 75 6c  ter to first rul
eed0: 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72  e in the grammar
eee0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
eef0: 65 20 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20 20  e *lastrule;    
ef00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
ef10: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
ef20: 20 70 61 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a   parsed rule */.
ef30: 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20 73  };../* Parse a s
ef40: 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73  ingle token */.s
ef50: 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73 65  tatic void parse
ef60: 6f 6e 65 74 6f 6b 65 6e 28 73 74 72 75 63 74 20  onetoken(struct 
ef70: 70 73 74 61 74 65 20 2a 70 73 70 29 0a 7b 0a 20  pstate *psp).{. 
ef80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 3b 0a   const char *x;.
ef90: 20 20 78 20 3d 20 53 74 72 73 61 66 65 28 70 73    x = Strsafe(ps
efa0: 70 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20  p->tokenstart); 
efb0: 20 20 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20      /* Save the 
efc0: 74 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c  token permanentl
efd0: 79 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72 69  y */.#if 0.  pri
efe0: 6e 74 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65  ntf("%s:%d: Toke
eff0: 6e 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25 64 5c  n=[%s] state=%d\
f000: 6e 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  n",psp->filename
f010: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f020: 6f 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73 74  o,.    x,psp->st
f030: 61 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ate);.#endif.  s
f040: 77 69 74 63 68 28 20 70 73 70 2d 3e 73 74 61 74  witch( psp->stat
f050: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 49 4e  e ){.    case IN
f060: 49 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20  ITIALIZE:.      
f070: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20  psp->prevrule = 
f080: 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72  0;.      psp->pr
f090: 65 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20  eccounter = 0;. 
f0a0: 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72       psp->firstr
f0b0: 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72  ule = psp->lastr
f0c0: 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ule = 0;.      p
f0d0: 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20  sp->gp->nrule = 
f0e0: 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  0;.      /* Fall
f0f0: 20 74 68 72 75 20 74 6f 20 6e 65 78 74 20 63 61   thru to next ca
f100: 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 57  se */.    case W
f110: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
f120: 4f 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20 69  OR_RULE:.      i
f130: 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a  f( x[0]=='%' ){.
f140: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
f150: 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
f160: 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20  _DECL_KEYWORD;. 
f170: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
f180: 73 6c 6f 77 65 72 28 78 5b 30 5d 29 20 29 7b 0a  slower(x[0]) ){.
f190: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
f1a0: 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
f1b0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e  ;.        psp->n
f1c0: 72 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rhs = 0;.       
f1d0: 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d   psp->lhsalias =
f1e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
f1f0: 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
f200: 5f 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20  _FOR_ARROW;.    
f210: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
f220: 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='{' ){.       
f230: 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75   if( psp->prevru
f240: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
f250: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
f260: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
f270: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65  okenlineno,."The
f280: 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72  re is no prior r
f290: 75 6c 65 20 6f 70 6f 6e 20 77 68 69 63 68 20 74  ule opon which t
f2a0: 6f 20 61 74 74 61 63 68 20 74 68 65 20 63 6f 64  o attach the cod
f2b0: 65 20 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68 69  e \.fragment whi
f2c0: 63 68 20 62 65 67 69 6e 73 20 6f 6e 20 74 68 69  ch begins on thi
f2d0: 73 20 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20  s line.");.     
f2e0: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
f2f0: 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69 66 28  nt++;..}else if(
f300: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e   psp->prevrule->
f310: 63 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  code!=0 ){.     
f320: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
f330: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f340: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43  >tokenlineno,."C
f350: 6f 64 65 20 66 72 61 67 6d 65 6e 74 20 62 65 67  ode fragment beg
f360: 69 6e 6e 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c  inning on this l
f370: 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 65 20 66  ine is not the f
f380: 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77  irst \.to follow
f390: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 75   the previous ru
f3a0: 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  le.");.         
f3b0: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f3c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
f3d0: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
f3e0: 70 72 65 76 72 75 6c 65 2d 3e 6c 69 6e 65 20 3d  prevrule->line =
f3f0: 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
f400: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  o;.          psp
f410: 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65  ->prevrule->code
f420: 20 3d 20 26 78 5b 31 5d 3b 0a 09 7d 0a 20 20 20   = &x[1];..}.   
f430: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30     }else if( x[0
f440: 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  ]=='[' ){.      
f450: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50    psp->state = P
f460: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31  RECEDENCE_MARK_1
f470: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f480: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f490: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f4a0: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f4b0: 20 20 20 20 20 20 20 20 20 20 22 54 6f 6b 65 6e            "Token
f4c0: 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62   \"%s\" should b
f4d0: 65 20 65 69 74 68 65 72 20 5c 22 25 25 5c 22 20  e either \"%%\" 
f4e0: 6f 72 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  or a nonterminal
f4f0: 20 6e 61 6d 65 2e 22 2c 0a 20 20 20 20 20 20 20   name.",.       
f500: 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70     x);.        p
f510: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
f520: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
f530: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52  eak;.    case PR
f540: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a  ECEDENCE_MARK_1:
f550: 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 75 70  .      if( !isup
f560: 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  per(x[0]) ){.   
f570: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
f580: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f590: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
f5a0: 20 20 20 20 20 20 20 20 22 54 68 65 20 70 72 65          "The pre
f5b0: 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6d  cedence symbol m
f5c0: 75 73 74 20 62 65 20 61 20 74 65 72 6d 69 6e 61  ust be a termina
f5d0: 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  l.");.        ps
f5e0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f5f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
f600: 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20  sp->prevrule==0 
f610: 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
f620: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
f630: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
f640: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54  no,.          "T
f650: 68 65 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72  here is no prior
f660: 20 72 75 6c 65 20 74 6f 20 61 73 73 69 67 6e 20   rule to assign 
f670: 70 72 65 63 65 64 65 6e 63 65 20 5c 22 5b 25 73  precedence \"[%s
f680: 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  ]\".",x);.      
f690: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
f6a0: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
f6b0: 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65  f( psp->prevrule
f6c0: 2d 3e 70 72 65 63 73 79 6d 21 3d 30 20 29 7b 0a  ->precsym!=0 ){.
f6d0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
f6e0: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
f6f0: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
f700: 0a 22 50 72 65 63 65 64 65 6e 63 65 20 6d 61 72  ."Precedence mar
f710: 6b 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69  k on this line i
f720: 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 20  s not the first 
f730: 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20  \.to follow the 
f740: 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22 29  previous rule.")
f750: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f760: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f780: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70  psp->prevrule->p
f790: 72 65 63 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f  recsym = Symbol_
f7a0: 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a  new(x);.      }.
f7b0: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
f7c0: 20 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41   = PRECEDENCE_MA
f7d0: 52 4b 5f 32 3b 0a 20 20 20 20 20 20 62 72 65 61  RK_2;.      brea
f7e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45 43  k;.    case PREC
f7f0: 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20  EDENCE_MARK_2:. 
f800: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 21 3d 27       if( x[0]!='
f810: 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]' ){.        Er
f820: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
f830: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
f840: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
f850: 20 22 4d 69 73 73 69 6e 67 20 5c 22 5d 5c 22 20   "Missing \"]\" 
f860: 6f 6e 20 70 72 65 63 65 64 65 6e 63 65 20 6d 61  on precedence ma
f870: 72 6b 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  rk.");.        p
f880: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
f890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 73        }.      ps
f8a0: 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
f8b0: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
f8c0: 55 4c 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ULE;.      break
f8d0: 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
f8e0: 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3a 0a 20 20  NG_FOR_ARROW:.  
f8f0: 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a      if( x[0]==':
f900: 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26  ' && x[1]==':' &
f910: 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20  & x[2]=='=' ){. 
f920: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f930: 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20  e = IN_RHS;.    
f940: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
f950: 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20  =='(' ){.       
f960: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48   psp->state = LH
f970: 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20  S_ALIAS_1;.     
f980: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f990: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
f9a0: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
f9b0: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
f9c0: 20 20 20 22 45 78 70 65 63 74 65 64 20 74 6f 20     "Expected to 
f9d0: 73 65 65 20 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c  see a \":\" foll
f9e0: 6f 77 69 6e 67 20 74 68 65 20 4c 48 53 20 73 79  owing the LHS sy
f9f0: 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a 20  mbol \"%s\".",. 
fa00: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68           psp->lh
fa10: 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  s->name);.      
fa20: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
fa30: 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
fa40: 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
fa50: 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
fa60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
fa70: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c  reak;.    case L
fa80: 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20  HS_ALIAS_1:.    
fa90: 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b    if( isalpha(x[
faa0: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
fab0: 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 78  sp->lhsalias = x
fac0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
fad0: 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53  tate = LHS_ALIAS
fae0: 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _2;.      }else{
faf0: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
fb00: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
fb10: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
fb20: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 25  ,.          "\"%
fb30: 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  s\" is not a val
fb40: 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  id alias for the
fb50: 20 4c 48 53 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a   LHS \"%s\"\n",.
fb60: 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d            x,psp-
fb70: 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  >lhs->name);.   
fb80: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
fb90: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
fba0: 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
fbb0: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
fbc0: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
fbd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
fbe0: 65 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20  e LHS_ALIAS_2:. 
fbf0: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
fc00: 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  )' ){.        ps
fc10: 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41  p->state = LHS_A
fc20: 4c 49 41 53 5f 33 3b 0a 20 20 20 20 20 20 7d 65  LIAS_3;.      }e
fc30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
fc40: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
fc50: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
fc60: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
fc70: 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20 66  "Missing \")\" f
fc80: 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69  ollowing LHS ali
fc90: 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22  as name \"%s\"."
fca0: 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b  ,psp->lhsalias);
fcb0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
fcc0: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
fcd0: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
fce0: 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
fcf0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
fd00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fd10: 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f   case LHS_ALIAS_
fd20: 33 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  3:.      if( x[0
fd30: 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d  ]==':' && x[1]==
fd40: 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27  ':' && x[2]=='='
fd50: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
fd60: 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b  >state = IN_RHS;
fd70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fd80: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
fd90: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
fda0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
fdb0: 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
fdc0: 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69  g \"->\" followi
fdd0: 6e 67 3a 20 5c 22 25 73 28 25 73 29 5c 22 2e 22  ng: \"%s(%s)\"."
fde0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 73 70  ,.           psp
fdf0: 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d  ->lhs->name,psp-
fe00: 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20  >lhsalias);.    
fe10: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
fe20: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
fe30: 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
fe40: 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
fe50: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
fe60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
fe70: 20 49 4e 5f 52 48 53 3a 0a 20 20 20 20 20 20 69   IN_RHS:.      i
fe80: 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  f( x[0]=='.' ){.
fe90: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 72          struct r
fea0: 75 6c 65 20 2a 72 70 3b 0a 20 20 20 20 20 20 20  ule *rp;.       
feb0: 20 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75   rp = (struct ru
fec0: 6c 65 20 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a  le *)calloc( siz
fed0: 65 6f 66 28 73 74 72 75 63 74 20 72 75 6c 65 29  eof(struct rule)
fee0: 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   + .            
fef0: 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
ff00: 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68  ymbol*)*psp->nrh
ff10: 73 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 2a  s + sizeof(char*
ff20: 29 2a 70 73 70 2d 3e 6e 72 68 73 2c 20 31 29 3b  )*psp->nrhs, 1);
ff30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70 3d  .        if( rp=
ff40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
ff50: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
ff60: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
ff70: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
ff80: 20 20 20 20 20 22 43 61 6e 27 74 20 61 6c 6c 6f       "Can't allo
ff90: 63 61 74 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f  cate enough memo
ffa0: 72 79 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65  ry for this rule
ffb0: 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  .");.          p
ffc0: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
ffd0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
ffe0: 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 09 7d 65  revrule = 0;..}e
fff0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
10000 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
10010 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 20 3d 20 70  rp->ruleline = p
10020 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b  sp->tokenlineno;
10030 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72  .          rp->r
10040 68 73 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d  hs = (struct sym
10050 62 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b 0a 20 20  bol**)&rp[1];.  
10060 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61          rp->rhsa
10070 6c 69 61 73 20 3d 20 28 63 6f 6e 73 74 20 63 68  lias = (const ch
10080 61 72 2a 2a 29 26 28 72 70 2d 3e 72 68 73 5b 70  ar**)&(rp->rhs[p
10090 73 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20 20 20 20  sp->nrhs]);.    
100a0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
100b0 3c 70 73 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  <psp->nrhs; i++)
100c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70  {.            rp
100d0 2d 3e 72 68 73 5b 69 5d 20 3d 20 70 73 70 2d 3e  ->rhs[i] = psp->
100e0 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  rhs[i];.        
100f0 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73      rp->rhsalias
10100 5b 69 5d 20 3d 20 70 73 70 2d 3e 61 6c 69 61 73  [i] = psp->alias
10110 5b 69 5d 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20  [i];..  }.      
10120 20 20 20 20 72 70 2d 3e 6c 68 73 20 3d 20 70 73      rp->lhs = ps
10130 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 20 20  p->lhs;.        
10140 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d    rp->lhsalias =
10150 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a   psp->lhsalias;.
10160 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 72            rp->nr
10170 68 73 20 3d 20 70 73 70 2d 3e 6e 72 68 73 3b 0a  hs = psp->nrhs;.
10180 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 63 6f            rp->co
10190 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
101a0 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20    rp->precsym = 
101b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  0;.          rp-
101c0 3e 69 6e 64 65 78 20 3d 20 70 73 70 2d 3e 67 70  >index = psp->gp
101d0 2d 3e 6e 72 75 6c 65 2b 2b 3b 0a 20 20 20 20 20  ->nrule++;.     
101e0 20 20 20 20 20 72 70 2d 3e 6e 65 78 74 6c 68 73       rp->nextlhs
101f0 20 3d 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65   = rp->lhs->rule
10200 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
10210 6c 68 73 2d 3e 72 75 6c 65 20 3d 20 72 70 3b 0a  lhs->rule = rp;.
10220 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 65            rp->ne
10230 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
10240 20 20 69 66 28 20 70 73 70 2d 3e 66 69 72 73 74    if( psp->first
10250 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rule==0 ){.     
10260 20 20 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73         psp->firs
10270 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73  trule = psp->las
10280 74 72 75 6c 65 20 3d 20 72 70 3b 0a 09 20 20 7d  trule = rp;..  }
10290 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
102a0 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 2d    psp->lastrule-
102b0 3e 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20 20 20  >next = rp;.    
102c0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73          psp->las
102d0 74 72 75 6c 65 20 3d 20 72 70 3b 0a 09 20 20 7d  trule = rp;..  }
102e0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
102f0 70 72 65 76 72 75 6c 65 20 3d 20 72 70 3b 0a 09  prevrule = rp;..
10300 7d 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  }.        psp->s
10310 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
10320 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
10330 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
10340 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29   isalpha(x[0]) )
10350 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  {.        if( ps
10360 70 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20  p->nrhs>=MAXRHS 
10370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
10380 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
10390 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
103a0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
103b0 20 20 22 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62    "Too many symb
103c0 6f 6c 73 20 6f 6e 20 52 48 53 20 6f 66 20 72 75  ols on RHS of ru
103d0 6c 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  le beginning at 
103e0 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20  \"%s\".",.      
103f0 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20        x);.      
10400 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
10410 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t++;.          p
10420 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
10430 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
10440 52 4f 52 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20  ROR;..}else{.   
10450 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b         psp->rhs[
10460 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 53 79 6d  psp->nrhs] = Sym
10470 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
10480 20 20 20 20 20 20 70 73 70 2d 3e 61 6c 69 61 73        psp->alias
10490 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 30 3b  [psp->nrhs] = 0;
104a0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
104b0 6e 72 68 73 2b 2b 3b 0a 09 7d 0a 20 20 20 20 20  nrhs++;..}.     
104c0 20 7d 65 6c 73 65 20 69 66 28 20 28 78 5b 30 5d   }else if( (x[0]
104d0 3d 3d 27 7c 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27  =='|' || x[0]=='
104e0 2f 27 29 20 26 26 20 70 73 70 2d 3e 6e 72 68 73  /') && psp->nrhs
104f0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  >0 ){.        st
10500 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70  ruct symbol *msp
10510 20 3d 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d   = psp->rhs[psp-
10520 3e 6e 72 68 73 2d 31 5d 3b 0a 20 20 20 20 20 20  >nrhs-1];.      
10530 20 20 69 66 28 20 6d 73 70 2d 3e 74 79 70 65 21    if( msp->type!
10540 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
10550 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
10560 63 74 20 73 79 6d 62 6f 6c 20 2a 6f 72 69 67 73  ct symbol *origs
10570 70 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20  p = msp;.       
10580 20 20 20 6d 73 70 20 3d 20 28 73 74 72 75 63 74     msp = (struct
10590 20 73 79 6d 62 6f 6c 20 2a 29 20 63 61 6c 6c 6f   symbol *) callo
105a0 63 28 31 2c 73 69 7a 65 6f 66 28 2a 6d 73 70 29  c(1,sizeof(*msp)
105b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
105c0 73 65 74 28 6d 73 70 2c 20 30 2c 20 73 69 7a 65  set(msp, 0, size
105d0 6f 66 28 2a 6d 73 70 29 29 3b 0a 20 20 20 20 20  of(*msp));.     
105e0 20 20 20 20 20 6d 73 70 2d 3e 74 79 70 65 20 3d       msp->type =
105f0 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 3b 0a   MULTITERMINAL;.
10600 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e            msp->n
10610 73 75 62 73 79 6d 20 3d 20 31 3b 0a 20 20 20 20  subsym = 1;.    
10620 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79        msp->subsy
10630 6d 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  m = (struct symb
10640 6f 6c 20 2a 2a 29 20 63 61 6c 6c 6f 63 28 31 2c  ol **) calloc(1,
10650 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79  sizeof(struct sy
10660 6d 62 6f 6c 2a 29 29 3b 0a 20 20 20 20 20 20 20  mbol*));.       
10670 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30     msp->subsym[0
10680 5d 20 3d 20 6f 72 69 67 73 70 3b 0a 20 20 20 20  ] = origsp;.    
10690 20 20 20 20 20 20 6d 73 70 2d 3e 6e 61 6d 65 20        msp->name 
106a0 3d 20 6f 72 69 67 73 70 2d 3e 6e 61 6d 65 3b 0a  = origsp->name;.
106b0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72            psp->r
106c0 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20  hs[psp->nrhs-1] 
106d0 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 7d  = msp;.        }
106e0 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73  .        msp->ns
106f0 75 62 73 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  ubsym++;.       
10700 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28   msp->subsym = (
10710 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
10720 29 20 72 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73  ) realloc(msp->s
10730 75 62 73 79 6d 2c 0a 20 20 20 20 20 20 20 20 20  ubsym,.         
10740 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
10750 79 6d 62 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75  ymbol*)*msp->nsu
10760 62 73 79 6d 29 3b 0a 20 20 20 20 20 20 20 20 6d  bsym);.        m
10770 73 70 2d 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e  sp->subsym[msp->
10780 6e 73 75 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d  nsubsym-1] = Sym
10790 62 6f 6c 5f 6e 65 77 28 26 78 5b 31 5d 29 3b 0a  bol_new(&x[1]);.
107a0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 6c 6f          if( islo
107b0 77 65 72 28 78 5b 31 5d 29 20 7c 7c 20 69 73 6c  wer(x[1]) || isl
107c0 6f 77 65 72 28 6d 73 70 2d 3e 73 75 62 73 79 6d  ower(msp->subsym
107d0 5b 30 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 20 29 7b  [0]->name[0]) ){
107e0 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
107f0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
10800 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
10810 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
10820 22 43 61 6e 6e 6f 74 20 66 6f 72 6d 20 61 20 63  "Cannot form a c
10830 6f 6d 70 6f 75 6e 64 20 63 6f 6e 74 61 69 6e 69  ompound containi
10840 6e 67 20 61 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  ng a non-termina
10850 6c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  l");.          p
10860 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
10870 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10880 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d  }else if( x[0]==
10890 27 28 27 20 26 26 20 70 73 70 2d 3e 6e 72 68 73  '(' && psp->nrhs
108a0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  >0 ){.        ps
108b0 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41  p->state = RHS_A
108c0 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65  LIAS_1;.      }e
108d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
108e0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
108f0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
10900 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
10910 22 49 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74  "Illegal charact
10920 65 72 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c  er on RHS of rul
10930 65 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a  e: \"%s\".",x);.
10940 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
10950 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
10960 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
10970 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
10980 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
10990 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
109a0 63 61 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 31  case RHS_ALIAS_1
109b0 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73 61 6c  :.      if( isal
109c0 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  pha(x[0]) ){.   
109d0 20 20 20 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b       psp->alias[
109e0 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 78  psp->nrhs-1] = x
109f0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
10a00 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53  tate = RHS_ALIAS
10a10 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _2;.      }else{
10a20 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
10a30 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
10a40 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
10a50 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 25  ,.          "\"%
10a60 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  s\" is not a val
10a70 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  id alias for the
10a80 20 52 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73   RHS symbol \"%s
10a90 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  \"\n",.         
10aa0 20 78 2c 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d   x,psp->rhs[psp-
10ab0 3e 6e 72 68 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b  >nrhs-1]->name);
10ac0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
10ad0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
10ae0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
10af0 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
10b00 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
10b10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10b20 20 63 61 73 65 20 52 48 53 5f 41 4c 49 41 53 5f   case RHS_ALIAS_
10b30 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  2:.      if( x[0
10b40 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20  ]==')' ){.      
10b50 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49    psp->state = I
10b60 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c  N_RHS;.      }el
10b70 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
10b80 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
10b90 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
10ba0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
10bb0 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f  Missing \")\" fo
10bc0 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61  llowing LHS alia
10bd0 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c  s name \"%s\".",
10be0 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a  psp->lhsalias);.
10bf0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
10c00 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
10c10 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
10c20 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
10c30 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
10c40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10c50 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
10c60 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20  _DECL_KEYWORD:. 
10c70 20 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61       if( isalpha
10c80 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
10c90 20 20 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f    psp->declkeywo
10ca0 72 64 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  rd = x;.        
10cb0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
10cc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
10cd0 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f  p->decllinenoslo
10ce0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
10cf0 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
10d00 63 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  cro = 1;.       
10d10 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
10d20 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
10d30 52 47 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  RG;.        if( 
10d40 73 74 72 63 6d 70 28 78 2c 22 6e 61 6d 65 22 29  strcmp(x,"name")
10d50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10d60 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10d70 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6e  t = &(psp->gp->n
10d80 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
10d90 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
10da0 61 63 72 6f 20 3d 20 30 3b 0a 09 7d 65 6c 73 65  acro = 0;..}else
10db0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 69   if( strcmp(x,"i
10dc0 6e 63 6c 75 64 65 22 29 3d 3d 30 20 29 7b 0a 20  nclude")==0 ){. 
10dd0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
10de0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
10df0 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 29 3b  p->gp->include);
10e00 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
10e10 6d 70 28 78 2c 22 63 6f 64 65 22 29 3d 3d 30 20  mp(x,"code")==0 
10e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10e30 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10e40 26 28 70 73 70 2d 3e 67 70 2d 3e 65 78 74 72 61  &(psp->gp->extra
10e50 63 6f 64 65 29 3b 0a 09 7d 65 6c 73 65 20 69 66  code);..}else if
10e60 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
10e70 6e 5f 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d  n_destructor")==
10e80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10e90 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
10ea0 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65  = &psp->gp->toke
10eb0 6e 64 65 73 74 3b 0a 09 7d 65 6c 73 65 20 69 66  ndest;..}else if
10ec0 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61  ( strcmp(x,"defa
10ed0 75 6c 74 5f 64 65 73 74 72 75 63 74 6f 72 22 29  ult_destructor")
10ee0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10ef0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10f00 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 76 61  t = &psp->gp->va
10f10 72 64 65 73 74 3b 0a 09 7d 65 6c 73 65 20 69 66  rdest;..}else if
10f20 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
10f30 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30 20 29 7b  n_prefix")==0 ){
10f40 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10f50 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70  declargslot = &p
10f60 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65  sp->gp->tokenpre
10f70 66 69 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70  fix;.          p
10f80 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
10f90 63 72 6f 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 20  cro = 0;..}else 
10fa0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 79  if( strcmp(x,"sy
10fb0 6e 74 61 78 5f 65 72 72 6f 72 22 29 3d 3d 30 20  ntax_error")==0 
10fc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10fd0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10fe0 26 28 70 73 70 2d 3e 67 70 2d 3e 65 72 72 6f 72  &(psp->gp->error
10ff0 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  );..}else if( st
11000 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 61 63  rcmp(x,"parse_ac
11010 63 65 70 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  cept")==0 ){.   
11020 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
11030 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
11040 3e 67 70 2d 3e 61 63 63 65 70 74 29 3b 0a 09 7d  >gp->accept);..}
11050 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11060 78 2c 22 70 61 72 73 65 5f 66 61 69 6c 75 72 65  x,"parse_failure
11070 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
11080 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
11090 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
110a0 3e 66 61 69 6c 75 72 65 29 3b 0a 09 7d 65 6c 73  >failure);..}els
110b0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
110c0 73 74 61 63 6b 5f 6f 76 65 72 66 6c 6f 77 22 29  stack_overflow")
110d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
110e0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
110f0 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6f  t = &(psp->gp->o
11100 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20  verflow);.      
11110 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
11120 6d 70 28 78 2c 22 65 78 74 72 61 5f 61 72 67 75  mp(x,"extra_argu
11130 6d 65 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ment")==0 ){.   
11140 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
11150 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
11160 3e 67 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 20  >gp->arg);.     
11170 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74       psp->insert
11180 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20  LineMacro = 0;. 
11190 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
111a0 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e   strcmp(x,"token
111b0 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20  _type")==0 ){.  
111c0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
111d0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
111e0 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29  ->gp->tokentype)
111f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
11200 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
11210 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
11220 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11230 2c 22 64 65 66 61 75 6c 74 5f 74 79 70 65 22 29  ,"default_type")
11240 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11250 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
11260 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 76  t = &(psp->gp->v
11270 61 72 74 79 70 65 29 3b 0a 20 20 20 20 20 20 20  artype);.       
11280 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
11290 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20  neMacro = 0;.   
112a0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
112b0 74 72 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f 73  trcmp(x,"stack_s
112c0 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
112d0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
112e0 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
112f0 67 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 0a  gp->stacksize);.
11300 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69            psp->i
11310 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
11320 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
11330 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
11340 73 74 61 72 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d  start_symbol")==
11350 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
11360 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
11370 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61  = &(psp->gp->sta
11380 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  rt);.          p
11390 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
113a0 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
113b0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
113c0 70 28 78 2c 22 6c 65 66 74 22 29 3d 3d 30 20 29  p(x,"left")==0 )
113d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
113e0 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a  >preccounter++;.
113f0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
11400 65 63 6c 61 73 73 6f 63 20 3d 20 4c 45 46 54 3b  eclassoc = LEFT;
11410 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11420 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
11430 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53  FOR_PRECEDENCE_S
11440 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
11450 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11460 78 2c 22 72 69 67 68 74 22 29 3d 3d 30 20 29 7b  x,"right")==0 ){
11470 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11480 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  preccounter++;. 
11490 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
114a0 63 6c 61 73 73 6f 63 20 3d 20 52 49 47 48 54 3b  classoc = RIGHT;
114b0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
114c0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
114d0 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53  FOR_PRECEDENCE_S
114e0 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
114f0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11500 78 2c 22 6e 6f 6e 61 73 73 6f 63 22 29 3d 3d 30  x,"nonassoc")==0
11510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
11520 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b  p->preccounter++
11530 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
11540 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e  >declassoc = NON
11550 45 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  E;.          psp
11560 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
11570 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
11580 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20  _SYMBOL;..}else 
11590 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65  if( strcmp(x,"de
115a0 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b  structor")==0 ){
115b0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
115c0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
115d0 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53  FOR_DESTRUCTOR_S
115e0 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69 66  YMBOL;..}else if
115f0 28 20 73 74 72 63 6d 70 28 78 2c 22 74 79 70 65  ( strcmp(x,"type
11600 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
11610 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
11620 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41  WAITING_FOR_DATA
11630 54 59 50 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20  TYPE_SYMBOL;.   
11640 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
11650 74 72 63 6d 70 28 78 2c 22 66 61 6c 6c 62 61 63  trcmp(x,"fallbac
11660 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  k")==0 ){.      
11670 20 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63      psp->fallbac
11680 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  k = 0;.         
11690 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
116a0 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41  ITING_FOR_FALLBA
116b0 43 4b 5f 49 44 3b 0a 20 20 20 20 20 20 20 20 7d  CK_ID;.        }
116c0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
116d0 78 2c 22 77 69 6c 64 63 61 72 64 22 29 3d 3d 30  x,"wildcard")==0
116e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
116f0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11700 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f  NG_FOR_WILDCARD_
11710 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ID;.        }els
11720 65 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  e{.          Err
11730 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11740 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
11750 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
11760 20 20 22 55 6e 6b 6e 6f 77 6e 20 64 65 63 6c 61    "Unknown decla
11770 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20  ration keyword: 
11780 5c 22 25 25 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  \"%%%s\".",x);. 
11790 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
117a0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
117b0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
117c0 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
117d0 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20  CL_ERROR;..}.   
117e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
117f0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11800 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11810 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11820 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 64 65       "Illegal de
11830 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72  claration keywor
11840 64 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a  d: \"%s\".",x);.
11850 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11860 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
11870 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
11880 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
11890 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
118a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
118b0 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
118c0 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42  _DESTRUCTOR_SYMB
118d0 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69  OL:.      if( !i
118e0 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a  salpha(x[0]) ){.
118f0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11900 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11910 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11920 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62  .          "Symb
11930 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20  ol name missing 
11940 61 66 74 65 72 20 25 25 64 65 73 74 72 75 63 74  after %%destruct
11950 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20  or keyword");.  
11960 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
11970 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
11980 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
11990 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
119a0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
119b0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
119c0 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79   symbol *sp = Sy
119d0 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
119e0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
119f0 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73  gslot = &sp->des
11a00 74 72 75 63 74 6f 72 3b 0a 20 20 20 20 20 20 20  tructor;.       
11a10 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f   psp->decllineno
11a20 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74  slot = &sp->dest
11a30 4c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20  Lineno;.        
11a40 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
11a50 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  acro = 1;.      
11a60 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
11a70 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
11a80 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ARG;.      }.   
11a90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
11aa0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44  se WAITING_FOR_D
11ab0 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a  ATATYPE_SYMBOL:.
11ac0 20 20 20 20 20 20 69 66 28 20 21 69 73 61 6c 70        if( !isalp
11ad0 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ha(x[0]) ){.    
11ae0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
11af0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
11b00 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
11b10 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e         "Symbol n
11b20 61 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65  ame missing afte
11b30 72 20 25 25 74 79 70 65 20 6b 65 79 77 6f 72 64  r %%type keyword
11b40 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ");.        psp-
11b50 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11b60 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11b70 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
11b80 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
11b90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11ba0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
11bb0 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  p = Symbol_find(
11bc0 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 28  x);.        if((
11bd0 73 70 29 20 26 26 20 28 73 70 2d 3e 64 61 74 61  sp) && (sp->data
11be0 74 79 70 65 29 29 7b 0a 20 20 20 20 20 20 20 20  type)){.        
11bf0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11c00 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11c10 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11c20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 25         "Symbol %
11c30 25 74 79 70 65 20 5c 22 25 73 5c 22 20 61 6c 72  %type \"%s\" alr
11c40 65 61 64 79 20 64 65 66 69 6e 65 64 22 2c 20 78  eady defined", x
11c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
11c60 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
11c70 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11c80 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
11c90 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
11ca0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11cb0 20 20 20 20 20 20 20 69 66 20 28 21 73 70 29 7b         if (!sp){
11cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 70 20  .            sp 
11cd0 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
11ce0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
11cf0 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
11d00 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64  argslot = &sp->d
11d10 61 74 61 74 79 70 65 3b 0a 20 20 20 20 20 20 20  atatype;.       
11d20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
11d30 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20  neMacro = 0;.   
11d40 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11d50 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11d60 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20  DECL_ARG;.      
11d70 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11d80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11d90 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52  e WAITING_FOR_PR
11da0 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a  ECEDENCE_SYMBOL:
11db0 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
11dc0 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
11dd0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
11de0 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
11df0 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  _RULE;.      }el
11e00 73 65 20 69 66 28 20 69 73 75 70 70 65 72 28 78  se if( isupper(x
11e10 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
11e20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
11e30 70 3b 0a 20 20 20 20 20 20 20 20 73 70 20 3d 20  p;.        sp = 
11e40 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
11e50 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 70         if( sp->p
11e60 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rec>=0 ){.      
11e70 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
11e80 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
11e90 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
11ea0 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c           "Symbol
11eb0 20 5c 22 25 73 5c 22 20 68 61 73 20 61 6c 72 65   \"%s\" has alre
11ec0 61 64 79 20 62 65 20 67 69 76 65 6e 20 61 20 70  ady be given a p
11ed0 72 65 63 65 64 65 6e 63 65 2e 22 2c 78 29 3b 0a  recedence.",x);.
11ee0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
11ef0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73  rrorcnt++;..}els
11f00 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d  e{.          sp-
11f10 3e 70 72 65 63 20 3d 20 70 73 70 2d 3e 70 72 65  >prec = psp->pre
11f20 63 63 6f 75 6e 74 65 72 3b 0a 20 20 20 20 20 20  ccounter;.      
11f30 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20      sp->assoc = 
11f40 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 3b 0a  psp->declassoc;.
11f50 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .}.      }else{.
11f60 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11f70 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11f80 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11f90 0a 20 20 20 20 20 20 20 20 20 20 22 43 61 6e 27  .          "Can'
11fa0 74 20 61 73 73 69 67 6e 20 61 20 70 72 65 63 65  t assign a prece
11fb0 64 65 6e 63 65 20 74 6f 20 5c 22 25 73 5c 22 2e  dence to \"%s\".
11fc0 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ",x);.        ps
11fd0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
11fe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
11ff0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
12000 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52  TING_FOR_DECL_AR
12010 47 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  G:.      if( x[0
12020 5d 3d 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d  ]=='{' || x[0]==
12030 27 5c 22 27 20 7c 7c 20 69 73 61 6c 6e 75 6d 28  '\"' || isalnum(
12040 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
12050 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 6c   const char *zOl
12060 64 2c 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 20 20  d, *zNew;.      
12070 20 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 2a 7a    char *zBuf, *z
12080 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4f  ;.        int nO
12090 6c 64 2c 20 6e 2c 20 6e 4c 69 6e 65 2c 20 6e 4e  ld, n, nLine, nN
120a0 65 77 2c 20 6e 42 61 63 6b 3b 0a 20 20 20 20 20  ew, nBack;.     
120b0 20 20 20 69 6e 74 20 61 64 64 4c 69 6e 65 4d 61     int addLineMa
120c0 63 72 6f 3b 0a 20 20 20 20 20 20 20 20 63 68 61  cro;.        cha
120d0 72 20 7a 4c 69 6e 65 5b 35 30 5d 3b 0a 20 20 20  r zLine[50];.   
120e0 20 20 20 20 20 7a 4e 65 77 20 3d 20 78 3b 0a 20       zNew = x;. 
120f0 20 20 20 20 20 20 20 69 66 28 20 7a 4e 65 77 5b         if( zNew[
12100 30 5d 3d 3d 27 22 27 20 7c 7c 20 7a 4e 65 77 5b  0]=='"' || zNew[
12110 30 5d 3d 3d 27 7b 27 20 29 20 7a 4e 65 77 2b 2b  0]=='{' ) zNew++
12120 3b 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d  ;.        nNew =
12130 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4e 65   lemonStrlen(zNe
12140 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
12150 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f  *psp->declargslo
12160 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  t ){.          z
12170 4f 6c 64 20 3d 20 2a 70 73 70 2d 3e 64 65 63 6c  Old = *psp->decl
12180 61 72 67 73 6c 6f 74 3b 0a 20 20 20 20 20 20 20  argslot;.       
12190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
121a0 20 20 7a 4f 6c 64 20 3d 20 22 22 3b 0a 20 20 20    zOld = "";.   
121b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
121c0 4f 6c 64 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  Old = lemonStrle
121d0 6e 28 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20  n(zOld);.       
121e0 20 6e 20 3d 20 6e 4f 6c 64 20 2b 20 6e 4e 65 77   n = nOld + nNew
121f0 20 2b 20 32 30 3b 0a 20 20 20 20 20 20 20 20 61   + 20;.        a
12200 64 64 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 21 70  ddLineMacro = !p
12210 73 70 2d 3e 67 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f  sp->gp->nolineno
12220 73 66 6c 61 67 20 26 26 20 70 73 70 2d 3e 69 6e  sflag && psp->in
12230 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 26 26  sertLineMacro &&
12240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12250 20 20 20 20 20 20 20 20 20 28 70 73 70 2d 3e 64           (psp->d
12260 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3d 3d 30  ecllinenoslot==0
12270 20 7c 7c 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e   || psp->decllin
12280 65 6e 6f 73 6c 6f 74 5b 30 5d 21 3d 30 29 3b 0a  enoslot[0]!=0);.
12290 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 4c          if( addL
122a0 69 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20  ineMacro ){.    
122b0 20 20 20 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d        for(z=psp-
122c0 3e 66 69 6c 65 6e 61 6d 65 2c 20 6e 42 61 63 6b  >filename, nBack
122d0 3d 30 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20  =0; *z; z++){.  
122e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a            if( *z
122f0 3d 3d 27 5c 5c 27 20 29 20 6e 42 61 63 6b 2b 2b  =='\\' ) nBack++
12300 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
12310 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
12320 7a 4c 69 6e 65 2c 20 22 23 6c 69 6e 65 20 25 64  zLine, "#line %d
12330 20 22 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69   ", psp->tokenli
12340 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  neno);.         
12350 20 6e 4c 69 6e 65 20 3d 20 6c 65 6d 6f 6e 53 74   nLine = lemonSt
12360 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20  rlen(zLine);.   
12370 20 20 20 20 20 20 20 6e 20 2b 3d 20 6e 4c 69 6e         n += nLin
12380 65 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  e + lemonStrlen(
12390 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b  psp->filename) +
123a0 20 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20   nBack;.        
123b0 7d 0a 20 20 20 20 20 20 20 20 2a 70 73 70 2d 3e  }.        *psp->
123c0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 28 63  declargslot = (c
123d0 68 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63 28 2a  har *) realloc(*
123e0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
123f0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 7a 42  , n);.        zB
12400 75 66 20 3d 20 2a 70 73 70 2d 3e 64 65 63 6c 61  uf = *psp->decla
12410 72 67 73 6c 6f 74 20 2b 20 6e 4f 6c 64 3b 0a 20  rgslot + nOld;. 
12420 20 20 20 20 20 20 20 69 66 28 20 61 64 64 4c 69         if( addLi
12430 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20 20  neMacro ){.     
12440 20 20 20 20 20 69 66 28 20 6e 4f 6c 64 20 26 26       if( nOld &&
12450 20 7a 42 75 66 5b 2d 31 5d 21 3d 27 5c 6e 27 20   zBuf[-1]!='\n' 
12460 29 7b 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 27 5c 6e 27 3b  (zBuf++) = '\n';
12480 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
12490 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42         memcpy(zB
124a0 75 66 2c 20 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65  uf, zLine, nLine
124b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 42 75  );.          zBu
124c0 66 20 2b 3d 20 6e 4c 69 6e 65 3b 0a 20 20 20 20  f += nLine;.    
124d0 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20        *(zBuf++) 
124e0 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20 20  = '"';.         
124f0 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65   for(z=psp->file
12500 6e 61 6d 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a  name; *z; z++){.
12510 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12520 2a 7a 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20  *z=='\\' ){.    
12530 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66            *(zBuf
12540 2b 2b 29 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20  ++) = '\\';.    
12550 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12560 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20        *(zBuf++) 
12570 3d 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20  = *z;.          
12580 7d 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42  }.          *(zB
12590 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20  uf++) = '"';.   
125a0 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29         *(zBuf++)
125b0 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20   = '\n';.       
125c0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
125d0 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
125e0 6f 74 20 26 26 20 70 73 70 2d 3e 64 65 63 6c 6c  ot && psp->decll
125f0 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 3d 3d 30 20  inenoslot[0]==0 
12600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
12610 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74  ->decllinenoslot
12620 5b 30 5d 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e  [0] = psp->token
12630 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20  lineno;.        
12640 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  }.        memcpy
12650 28 7a 42 75 66 2c 20 7a 4e 65 77 2c 20 6e 4e 65  (zBuf, zNew, nNe
12660 77 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66  w);.        zBuf
12670 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20   += nNew;.      
12680 20 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20 20 20    *zBuf = 0;.   
12690 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
126a0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
126b0 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20  CL_OR_RULE;.    
126c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
126d0 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
126e0 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
126f0 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
12700 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 61 72 67      "Illegal arg
12710 75 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a 20 25  ument to %%%s: %
12720 73 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77  s",psp->declkeyw
12730 6f 72 64 2c 78 29 3b 0a 20 20 20 20 20 20 20 20  ord,x);.        
12740 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
12750 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
12760 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
12770 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
12780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
12790 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
127a0 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43  TING_FOR_FALLBAC
127b0 4b 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20  K_ID:.      if( 
127c0 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  x[0]=='.' ){.   
127d0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
127e0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
127f0 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20  CL_OR_RULE;.    
12800 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 75    }else if( !isu
12810 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20  pper(x[0]) ){.  
12820 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
12830 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73  sp->filename, ps
12840 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
12850 20 20 20 20 20 20 20 20 20 20 22 25 25 66 61 6c            "%%fal
12860 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 5c  lback argument \
12870 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20  "%s\" should be 
12880 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20  a token", x);.  
12890 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
128a0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
128b0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  se{.        stru
128c0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
128d0 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
128e0 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e         if( psp->
128f0 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20  fallback==0 ){. 
12900 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 61           psp->fa
12910 6c 6c 62 61 63 6b 20 3d 20 73 70 3b 0a 20 20 20  llback = sp;.   
12920 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
12930 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  p->fallback ){. 
12940 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
12950 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
12960 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
12970 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  o,.            "
12980 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 66 61  More than one fa
12990 6c 6c 62 61 63 6b 20 61 73 73 69 67 6e 65 64 20  llback assigned 
129a0 74 6f 20 74 6f 6b 65 6e 20 25 73 22 2c 20 78 29  to token %s", x)
129b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
129c0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
129d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
129e0 20 20 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61        sp->fallba
129f0 63 6b 20 3d 20 70 73 70 2d 3e 66 61 6c 6c 62 61  ck = psp->fallba
12a00 63 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ck;.          ps
12a10 70 2d 3e 67 70 2d 3e 68 61 73 5f 66 61 6c 6c 62  p->gp->has_fallb
12a20 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ack = 1;.       
12a30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
12a40 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
12a50 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c   WAITING_FOR_WIL
12a60 44 43 41 52 44 5f 49 44 3a 0a 20 20 20 20 20 20  DCARD_ID:.      
12a70 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b  if( x[0]=='.' ){
12a80 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
12a90 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
12aa0 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
12ab0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12ac0 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29  !isupper(x[0]) )
12ad0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
12ae0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
12af0 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  , psp->tokenline
12b00 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25  no,.          "%
12b10 25 77 69 6c 64 63 61 72 64 20 61 72 67 75 6d 65  %wildcard argume
12b20 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64  nt \"%s\" should
12b30 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29   be a token", x)
12b40 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
12b50 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
12b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12b70 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
12b80 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  p = Symbol_new(x
12b90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
12ba0 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61 72 64  sp->gp->wildcard
12bb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12bc0 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61   psp->gp->wildca
12bd0 72 64 20 3d 20 73 70 3b 0a 20 20 20 20 20 20 20  rd = sp;.       
12be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12bf0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
12c00 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74  filename, psp->t
12c10 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
12c20 20 20 20 20 20 20 20 20 22 45 78 74 72 61 20 77          "Extra w
12c30 69 6c 64 63 61 72 64 20 74 6f 20 74 6f 6b 65 6e  ildcard to token
12c40 3a 20 25 73 22 2c 20 78 29 3b 0a 20 20 20 20 20  : %s", x);.     
12c50 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
12c60 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nt++;.        }.
12c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
12c80 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45  eak;.    case RE
12c90 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
12ca0 45 52 52 4f 52 3a 0a 2f 2a 20 20 20 20 20 20 69  ERROR:./*      i
12cb0 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70  f( x[0]=='.' ) p
12cc0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
12cd0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
12ce0 52 55 4c 45 3b 0a 2a 2a 20 20 20 20 20 20 62 72  RULE;.**      br
12cf0 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65  eak; */.    case
12d00 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
12d10 43 4c 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  CL_ERROR:.      
12d20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20  if( x[0]=='.' ) 
12d30 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
12d40 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
12d50 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 69 66 28  _RULE;.      if(
12d60 20 78 5b 30 5d 3d 3d 27 25 27 20 29 20 70 73 70   x[0]=='%' ) psp
12d70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
12d80 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f  G_FOR_DECL_KEYWO
12d90 52 44 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  RD;.      break;
12da0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 74  .  }.}../* Run t
12db0 68 65 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20  he preprocessor 
12dc0 6f 76 65 72 20 74 68 65 20 69 6e 70 75 74 20 66  over the input f
12dd0 69 6c 65 20 74 65 78 74 2e 20 20 54 68 65 20 67  ile text.  The g
12de0 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 0a  lobal variables.
12df0 2a 2a 20 61 7a 44 65 66 69 6e 65 5b 30 5d 20 74  ** azDefine[0] t
12e00 68 72 6f 75 67 68 20 61 7a 44 65 66 69 6e 65 5b  hrough azDefine[
12e10 6e 44 65 66 69 6e 65 2d 31 5d 20 63 6f 6e 74 61  nDefine-1] conta
12e20 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ins the names of
12e30 20 61 6c 6c 20 64 65 66 69 6e 65 64 0a 2a 2a 20   all defined.** 
12e40 6d 61 63 72 6f 73 2e 20 20 54 68 69 73 20 72 6f  macros.  This ro
12e50 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20  utine looks for 
12e60 22 25 69 66 64 65 66 22 20 61 6e 64 20 22 25 69  "%ifdef" and "%i
12e70 66 6e 64 65 66 22 20 61 6e 64 20 22 25 65 6e 64  fndef" and "%end
12e80 69 66 22 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d 65  if" and.** comme
12e90 6e 74 73 20 74 68 65 6d 20 6f 75 74 2e 20 20 54  nts them out.  T
12ea0 65 78 74 20 69 6e 20 62 65 74 77 65 65 6e 20 69  ext in between i
12eb0 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64  s also commented
12ec0 20 6f 75 74 20 61 73 20 61 70 70 72 6f 70 72 69   out as appropri
12ed0 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ate..*/.static v
12ee0 6f 69 64 20 70 72 65 70 72 6f 63 65 73 73 5f 69  oid preprocess_i
12ef0 6e 70 75 74 28 63 68 61 72 20 2a 7a 29 7b 0a 20  nput(char *z){. 
12f00 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b   int i, j, k, n;
12f10 0a 20 20 69 6e 74 20 65 78 63 6c 75 64 65 20 3d  .  int exclude =
12f20 20 30 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20   0;.  int start 
12f30 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e  = 0;.  int linen
12f40 6f 20 3d 20 31 3b 0a 20 20 69 6e 74 20 73 74 61  o = 1;.  int sta
12f50 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20  rt_lineno = 1;. 
12f60 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20   for(i=0; z[i]; 
12f70 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  i++){.    if( z[
12f80 69 5d 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e  i]=='\n' ) linen
12f90 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69  o++;.    if( z[i
12fa0 5d 21 3d 27 25 27 20 7c 7c 20 28 69 3e 30 20 26  ]!='%' || (i>0 &
12fb0 26 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29 20  & z[i-1]!='\n') 
12fc0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
12fd0 69 66 28 20 73 74 72 6e 63 6d 70 28 26 7a 5b 69  if( strncmp(&z[i
12fe0 5d 2c 22 25 65 6e 64 69 66 22 2c 36 29 3d 3d 30  ],"%endif",6)==0
12ff0 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69 2b   && isspace(z[i+
13000 36 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  6]) ){.      if(
13010 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20   exclude ){.    
13020 20 20 20 20 65 78 63 6c 75 64 65 2d 2d 3b 0a 20      exclude--;. 
13030 20 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75         if( exclu
13040 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  de==0 ){.       
13050 20 20 20 66 6f 72 28 6a 3d 73 74 61 72 74 3b 20     for(j=start; 
13060 6a 3c 69 3b 20 6a 2b 2b 29 20 69 66 28 20 7a 5b  j<i; j++) if( z[
13070 6a 5d 21 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d 20  j]!='\n' ) z[j] 
13080 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d  = ' ';.        }
13090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
130a0 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20  or(j=i; z[j] && 
130b0 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29  z[j]!='\n'; j++)
130c0 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20   z[j] = ' ';.   
130d0 20 7d 65 6c 73 65 20 69 66 28 20 28 73 74 72 6e   }else if( (strn
130e0 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 64 65  cmp(&z[i],"%ifde
130f0 66 22 2c 36 29 3d 3d 30 20 26 26 20 69 73 73 70  f",6)==0 && issp
13100 61 63 65 28 7a 5b 69 2b 36 5d 29 29 0a 20 20 20  ace(z[i+6])).   
13110 20 20 20 20 20 20 20 7c 7c 20 28 73 74 72 6e 63         || (strnc
13120 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 6e 64 65  mp(&z[i],"%ifnde
13130 66 22 2c 37 29 3d 3d 30 20 26 26 20 69 73 73 70  f",7)==0 && issp
13140 61 63 65 28 7a 5b 69 2b 37 5d 29 29 20 29 7b 0a  ace(z[i+7])) ){.
13150 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64        if( exclud
13160 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78 63  e ){.        exc
13170 6c 75 64 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  lude++;.      }e
13180 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
13190 28 6a 3d 69 2b 37 3b 20 69 73 73 70 61 63 65 28  (j=i+7; isspace(
131a0 7a 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20  z[j]); j++){}.  
131b0 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a        for(n=0; z
131c0 5b 6a 2b 6e 5d 20 26 26 20 21 69 73 73 70 61 63  [j+n] && !isspac
131d0 65 28 7a 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b  e(z[j+n]); n++){
131e0 7d 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64  }.        exclud
131f0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66  e = 1;.        f
13200 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69 6e  or(k=0; k<nDefin
13210 65 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; k++){.       
13220 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61     if( strncmp(a
13230 7a 44 65 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d  zDefine[k],&z[j]
13240 2c 6e 29 3d 3d 30 20 26 26 20 6c 65 6d 6f 6e 53  ,n)==0 && lemonS
13250 74 72 6c 65 6e 28 61 7a 44 65 66 69 6e 65 5b 6b  trlen(azDefine[k
13260 5d 29 3d 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20  ])==n ){.       
13270 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d 20 30       exclude = 0
13280 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
13290 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
132a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
132b0 20 20 20 69 66 28 20 7a 5b 69 2b 33 5d 3d 3d 27     if( z[i+3]=='
132c0 6e 27 20 29 20 65 78 63 6c 75 64 65 20 3d 20 21  n' ) exclude = !
132d0 65 78 63 6c 75 64 65 3b 0a 20 20 20 20 20 20 20  exclude;.       
132e0 20 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a   if( exclude ){.
132f0 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 20            start 
13300 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = i;.          s
13310 74 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 6c 69  tart_lineno = li
13320 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a  neno;.        }.
13330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
13340 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a  r(j=i; z[j] && z
13350 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20  [j]!='\n'; j++) 
13360 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  z[j] = ' ';.    
13370 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 78 63 6c  }.  }.  if( excl
13380 75 64 65 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ude ){.    fprin
13390 74 66 28 73 74 64 65 72 72 2c 22 75 6e 74 65 72  tf(stderr,"unter
133a0 6d 69 6e 61 74 65 64 20 25 25 69 66 64 65 66 20  minated %%ifdef 
133b0 73 74 61 72 74 69 6e 67 20 6f 6e 20 6c 69 6e 65  starting on line
133c0 20 25 64 5c 6e 22 2c 20 73 74 61 72 74 5f 6c 69   %d\n", start_li
133d0 6e 65 6e 6f 29 3b 0a 20 20 20 20 65 78 69 74 28  neno);.    exit(
133e0 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e  1);.  }.}../* In
133f0 20 73 70 69 74 65 20 6f 66 20 69 74 73 20 6e 61   spite of its na
13400 6d 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  me, this functio
13410 6e 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63  n is really a sc
13420 61 6e 6e 65 72 2e 20 20 49 74 20 72 65 61 64 0a  anner.  It read.
13430 2a 2a 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65  ** in the entire
13440 20 69 6e 70 75 74 20 66 69 6c 65 20 28 61 6c 6c   input file (all
13450 20 61 74 20 6f 6e 63 65 29 20 74 68 65 6e 20 74   at once) then t
13460 6f 6b 65 6e 69 7a 65 73 20 69 74 2e 20 20 45 61  okenizes it.  Ea
13470 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69 73 20 70  ch.** token is p
13480 61 73 73 65 64 20 74 6f 20 74 68 65 20 66 75 6e  assed to the fun
13490 63 74 69 6f 6e 20 22 70 61 72 73 65 6f 6e 65 74  ction "parseonet
134a0 6f 6b 65 6e 22 20 77 68 69 63 68 20 62 75 69 6c  oken" which buil
134b0 64 73 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 61 70  ds all.** the ap
134c0 70 72 6f 70 72 69 61 74 65 20 64 61 74 61 20 73  propriate data s
134d0 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
134e0 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65   global state ve
134f0 63 74 6f 72 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f  ctor "gp"..*/.vo
13500 69 64 20 50 61 72 73 65 28 73 74 72 75 63 74 20  id Parse(struct 
13510 6c 65 6d 6f 6e 20 2a 67 70 29 0a 7b 0a 20 20 73  lemon *gp).{.  s
13520 74 72 75 63 74 20 70 73 74 61 74 65 20 70 73 3b  truct pstate ps;
13530 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63  .  FILE *fp;.  c
13540 68 61 72 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20  har *filebuf;.  
13550 69 6e 74 20 66 69 6c 65 73 69 7a 65 3b 0a 20 20  int filesize;.  
13560 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a 20 20 69 6e  int lineno;.  in
13570 74 20 63 3b 0a 20 20 63 68 61 72 20 2a 63 70 2c  t c;.  char *cp,
13580 20 2a 6e 65 78 74 63 70 3b 0a 20 20 69 6e 74 20   *nextcp;.  int 
13590 73 74 61 72 74 6c 69 6e 65 20 3d 20 30 3b 0a 0a  startline = 0;..
135a0 20 20 6d 65 6d 73 65 74 28 26 70 73 2c 20 27 5c    memset(&ps, '\
135b0 30 27 2c 20 73 69 7a 65 6f 66 28 70 73 29 29 3b  0', sizeof(ps));
135c0 0a 20 20 70 73 2e 67 70 20 3d 20 67 70 3b 0a 20  .  ps.gp = gp;. 
135d0 20 70 73 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 67   ps.filename = g
135e0 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b 0a 20 20 70  p->filename;.  p
135f0 73 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a  s.errorcnt = 0;.
13600 20 20 70 73 2e 73 74 61 74 65 20 3d 20 49 4e 49    ps.state = INI
13610 54 49 41 4c 49 5a 45 3b 0a 0a 20 20 2f 2a 20 42  TIALIZE;..  /* B
13620 65 67 69 6e 20 62 79 20 72 65 61 64 69 6e 67 20  egin by reading 
13630 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  the input file *
13640 2f 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 70  /.  fp = fopen(p
13650 73 2e 66 69 6c 65 6e 61 6d 65 2c 22 72 62 22 29  s.filename,"rb")
13660 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 29 7b  ;.  if( fp==0 ){
13670 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73  .    ErrorMsg(ps
13680 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e  .filename,0,"Can
13690 27 74 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c  't open this fil
136a0 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 22 29  e for reading.")
136b0 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63  ;.    gp->errorc
136c0 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
136d0 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28 66 70  ;.  }.  fseek(fp
136e0 2c 30 2c 32 29 3b 0a 20 20 66 69 6c 65 73 69 7a  ,0,2);.  filesiz
136f0 65 20 3d 20 66 74 65 6c 6c 28 66 70 29 3b 0a 20  e = ftell(fp);. 
13700 20 72 65 77 69 6e 64 28 66 70 29 3b 0a 20 20 66   rewind(fp);.  f
13710 69 6c 65 62 75 66 20 3d 20 28 63 68 61 72 20 2a  ilebuf = (char *
13720 29 6d 61 6c 6c 6f 63 28 20 66 69 6c 65 73 69 7a  )malloc( filesiz
13730 65 2b 31 20 29 3b 0a 20 20 69 66 28 20 66 69 6c  e+1 );.  if( fil
13740 65 62 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 45  ebuf==0 ){.    E
13750 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e  rrorMsg(ps.filen
13760 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 61 6c 6c  ame,0,"Can't all
13770 6f 63 61 74 65 20 25 64 20 6f 66 20 6d 65 6d 6f  ocate %d of memo
13780 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 69 73 20  ry to hold this 
13790 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66 69  file.",.      fi
137a0 6c 65 73 69 7a 65 2b 31 29 3b 0a 20 20 20 20 67  lesize+1);.    g
137b0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
137c0 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20     fclose(fp);. 
137d0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
137e0 20 69 66 28 20 66 72 65 61 64 28 66 69 6c 65 62   if( fread(fileb
137f0 75 66 2c 31 2c 66 69 6c 65 73 69 7a 65 2c 66 70  uf,1,filesize,fp
13800 29 21 3d 66 69 6c 65 73 69 7a 65 20 29 7b 0a 20  )!=filesize ){. 
13810 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66     ErrorMsg(ps.f
13820 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74  ilename,0,"Can't
13830 20 72 65 61 64 20 69 6e 20 61 6c 6c 20 25 64 20   read in all %d 
13840 62 79 74 65 73 20 6f 66 20 74 68 69 73 20 66 69  bytes of this fi
13850 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66 69 6c 65  le.",.      file
13860 73 69 7a 65 29 3b 0a 20 20 20 20 66 72 65 65 28  size);.    free(
13870 66 69 6c 65 62 75 66 29 3b 0a 20 20 20 20 67 70  filebuf);.    gp
13880 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
13890 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20    fclose(fp);.  
138a0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
138b0 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 66 69  fclose(fp);.  fi
138c0 6c 65 62 75 66 5b 66 69 6c 65 73 69 7a 65 5d 20  lebuf[filesize] 
138d0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  = 0;..  /* Make 
138e0 61 6e 20 69 6e 69 74 69 61 6c 20 70 61 73 73 20  an initial pass 
138f0 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65  through the file
13900 20 74 6f 20 68 61 6e 64 6c 65 20 25 69 66 64 65   to handle %ifde
13910 66 20 61 6e 64 20 25 69 66 6e 64 65 66 20 2a 2f  f and %ifndef */
13920 0a 20 20 70 72 65 70 72 6f 63 65 73 73 5f 69 6e  .  preprocess_in
13930 70 75 74 28 66 69 6c 65 62 75 66 29 3b 0a 0a 20  put(filebuf);.. 
13940 20 2f 2a 20 4e 6f 77 20 73 63 61 6e 20 74 68 65   /* Now scan the
13950 20 74 65 78 74 20 6f 66 20 74 68 65 20 69 6e 70   text of the inp
13960 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 6c 69 6e  ut file */.  lin
13970 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28 63  eno = 1;.  for(c
13980 70 3d 66 69 6c 65 62 75 66 3b 20 28 63 3d 20 2a  p=filebuf; (c= *
13990 63 70 29 21 3d 30 3b 20 29 7b 0a 20 20 20 20 69  cp)!=0; ){.    i
139a0 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
139b0 65 6e 6f 2b 2b 3b 20 20 20 20 20 20 20 20 20 20  eno++;          
139c0 20 20 20 20 2f 2a 20 4b 65 65 70 20 74 72 61 63      /* Keep trac
139d0 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e 75  k of the line nu
139e0 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  mber */.    if( 
139f0 69 73 73 70 61 63 65 28 63 29 20 29 7b 20 63 70  isspace(c) ){ cp
13a00 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 20  ++; continue; } 
13a10 20 2f 2a 20 53 6b 69 70 20 61 6c 6c 20 77 68 69   /* Skip all whi
13a20 74 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  te space */.    
13a30 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70  if( c=='/' && cp
13a40 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 20 20 20  [1]=='/' ){     
13a50 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b       /* Skip C++
13a60 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20   style comments 
13a70 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a  */.      cp+=2;.
13a80 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
13a90 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27   *cp)!=0 && c!='
13aa0 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20  \n' ) cp++;.    
13ab0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
13ac0 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f 27  }.    if( c=='/'
13ad0 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29   && cp[1]=='*' )
13ae0 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b  {          /* Sk
13af0 69 70 20 43 20 73 74 79 6c 65 20 63 6f 6d 6d 65  ip C style comme
13b00 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  nts */.      cp+
13b10 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  =2;.      while(
13b20 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
13b30 28 63 21 3d 27 2f 27 20 7c 7c 20 63 70 5b 2d 31  (c!='/' || cp[-1
13b40 5d 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20  ]!='*') ){.     
13b50 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
13b60 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
13b70 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d     cp++;.      }
13b80 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 20 63  .      if( c ) c
13b90 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  p++;.      conti
13ba0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nue;.    }.    p
13bb0 73 2e 74 6f 6b 65 6e 73 74 61 72 74 20 3d 20 63  s.tokenstart = c
13bc0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13bd0 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 62 65    /* Mark the be
13be0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74  ginning of the t
13bf0 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 73 2e 74  oken */.    ps.t
13c00 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e  okenlineno = lin
13c10 65 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  eno;           /
13c20 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 6f 6e 20  * Linenumber on 
13c30 77 68 69 63 68 20 74 6f 6b 65 6e 20 62 65 67 69  which token begi
13c40 6e 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d  ns */.    if( c=
13c50 3d 27 5c 22 27 20 29 7b 20 20 20 20 20 20 20 20  ='\"' ){        
13c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13c70 53 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 20  String literals 
13c80 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  */.      cp++;. 
13c90 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20       while( (c= 
13ca0 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  *cp)!=0 && c!='\
13cb0 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  "' ){.        if
13cc0 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  ( c=='\n' ) line
13cd0 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70  no++;.        cp
13ce0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
13cf0 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
13d00 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
13d10 73 2e 66 69 6c 65 6e 61 6d 65 2c 73 74 61 72 74  s.filename,start
13d20 6c 69 6e 65 2c 0a 22 53 74 72 69 6e 67 20 73 74  line,."String st
13d30 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c  arting on this l
13d40 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69  ine is not termi
13d50 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74 68 65  nated before the
13d60 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
13d70 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e  .");.        ps.
13d80 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
13d90 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
13da0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13db0 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
13dc0 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p+1;.      }.   
13dd0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b   }else if( c=='{
13de0 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ' ){            
13df0 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20 6f 66     /* A block of
13e00 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   C code */.     
13e10 20 69 6e 74 20 6c 65 76 65 6c 3b 0a 20 20 20 20   int level;.    
13e20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 66 6f    cp++;.      fo
13e30 72 28 6c 65 76 65 6c 3d 31 3b 20 28 63 3d 20 2a  r(level=1; (c= *
13e40 63 70 29 21 3d 30 20 26 26 20 28 6c 65 76 65 6c  cp)!=0 && (level
13e50 3e 31 20 7c 7c 20 63 21 3d 27 7d 27 29 3b 20 63  >1 || c!='}'); c
13e60 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  p++){.        if
13e70 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  ( c=='\n' ) line
13e80 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c  no++;.        el
13e90 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 20  se if( c=='{' ) 
13ea0 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  level++;.       
13eb0 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7d 27   else if( c=='}'
13ec0 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20   ) level--;.    
13ed0 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d      else if( c==
13ee0 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a  '/' && cp[1]=='*
13ef0 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 63 6f  ' ){  /* Skip co
13f00 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  mments */.      
13f10 20 20 20 20 69 6e 74 20 70 72 65 76 63 3b 0a 20      int prevc;. 
13f20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26 63           cp = &c
13f30 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  p[2];.          
13f40 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20  prevc = 0;.     
13f50 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20       while( (c= 
13f60 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27  *cp)!=0 && (c!='
13f70 2f 27 20 7c 7c 20 70 72 65 76 63 21 3d 27 2a 27  /' || prevc!='*'
13f80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
13f90 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
13fa0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
13fb0 20 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a       prevc = c;.
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 63 70 2b 2b              cp++
13fd0 3b 0a 09 20 20 7d 0a 09 7d 65 6c 73 65 20 69 66  ;..  }..}else if
13fe0 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31  ( c=='/' && cp[1
13ff0 5d 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20 53 6b  ]=='/' ){  /* Sk
14000 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d  ip C++ style com
14010 6d 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20 20 20  ments too */.   
14020 20 20 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b         cp = &cp[
14030 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68  2];.          wh
14040 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
14050 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70   && c!='\n' ) cp
14060 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ++;.          if
14070 28 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ( c ) lineno++;.
14080 09 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c  .}else if( c=='\
14090 27 27 20 7c 7c 20 63 3d 3d 27 5c 22 27 20 29 7b  '' || c=='\"' ){
140a0 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 61 20      /* String a 
140b0 63 68 61 72 61 63 74 65 72 20 6c 69 74 65 72 61  character litera
140c0 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ls */.          
140d0 69 6e 74 20 73 74 61 72 74 63 68 61 72 2c 20 70  int startchar, p
140e0 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20 20 20  revc;.          
140f0 73 74 61 72 74 63 68 61 72 20 3d 20 63 3b 0a 20  startchar = c;. 
14100 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d           prevc =
14110 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
14120 72 28 63 70 2b 2b 3b 20 28 63 3d 20 2a 63 70 29  r(cp++; (c= *cp)
14130 21 3d 30 20 26 26 20 28 63 21 3d 73 74 61 72 74  !=0 && (c!=start
14140 63 68 61 72 20 7c 7c 20 70 72 65 76 63 3d 3d 27  char || prevc=='
14150 5c 5c 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20  \\'); cp++){.   
14160 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
14170 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
14180 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
14190 20 70 72 65 76 63 3d 3d 27 5c 5c 27 20 29 20 70   prevc=='\\' ) p
141a0 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  revc = 0;.      
141b0 20 20 20 20 20 20 65 6c 73 65 20 20 20 20 20 20        else      
141c0 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20          prevc = 
141d0 63 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20  c;..  }..}.     
141e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
141f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  0 ){.        Err
14200 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
14210 65 2c 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  e,ps.tokenlineno
14220 2c 0a 22 43 20 63 6f 64 65 20 73 74 61 72 74 69  ,."C code starti
14230 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20  ng on this line 
14240 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  is not terminate
14250 64 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64  d before the end
14260 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b   of the file.");
14270 0a 20 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f  .        ps.erro
14280 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
14290 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20  nextcp = cp;.   
142a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
142b0 20 20 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b    nextcp = cp+1;
142c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
142d0 73 65 20 69 66 28 20 69 73 61 6c 6e 75 6d 28 63  se if( isalnum(c
142e0 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a  ) ){          /*
142f0 20 49 64 65 6e 74 69 66 69 65 72 73 20 2a 2f 0a   Identifiers */.
14300 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
14310 20 2a 63 70 29 21 3d 30 20 26 26 20 28 69 73 61   *cp)!=0 && (isa
14320 6c 6e 75 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f  lnum(c) || c=='_
14330 27 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20  ') ) cp++;.     
14340 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20   nextcp = cp;.  
14350 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
14360 3a 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 3a 27  :' && cp[1]==':'
14370 20 26 26 20 63 70 5b 32 5d 3d 3d 27 3d 27 20 29   && cp[2]=='=' )
14380 7b 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 6f  { /* The operato
14390 72 20 22 3a 3a 3d 22 20 2a 2f 0a 20 20 20 20 20  r "::=" */.     
143a0 20 63 70 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20   cp += 3;.      
143b0 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20  nextcp = cp;.   
143c0 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
143d0 2f 27 20 7c 7c 20 63 3d 3d 27 7c 27 29 20 26 26  /' || c=='|') &&
143e0 20 69 73 61 6c 70 68 61 28 63 70 5b 31 5d 29 20   isalpha(cp[1]) 
143f0 29 7b 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 32  ){.      cp += 2
14400 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  ;.      while( (
14410 63 20 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  c = *cp)!=0 && (
14420 69 73 61 6c 6e 75 6d 28 63 29 20 7c 7c 20 63 3d  isalnum(c) || c=
14430 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20 20  ='_') ) cp++;.  
14440 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
14450 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 20  .    }else{     
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14470 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65       /* All othe
14480 72 20 28 6f 6e 65 20 63 68 61 72 61 63 74 65 72  r (one character
14490 29 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  ) operators */. 
144a0 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
144b0 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20   nextcp = cp;.  
144c0 20 20 7d 0a 20 20 20 20 63 20 3d 20 2a 63 70 3b    }.    c = *cp;
144d0 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 20 20 20  .    *cp = 0;   
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144f0 20 20 20 20 20 2f 2a 20 4e 75 6c 6c 20 74 65 72       /* Null ter
14500 6d 69 6e 61 74 65 20 74 68 65 20 74 6f 6b 65 6e  minate the token
14510 20 2a 2f 0a 20 20 20 20 70 61 72 73 65 6f 6e 65   */.    parseone
14520 74 6f 6b 65 6e 28 26 70 73 29 3b 20 20 20 20 20  token(&ps);     
14530 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
14540 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20   the token */.  
14550 20 20 2a 63 70 20 3d 20 63 3b 20 20 20 20 20 20    *cp = c;      
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
14580 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 63   buffer */.    c
14590 70 20 3d 20 6e 65 78 74 63 70 3b 0a 20 20 7d 0a  p = nextcp;.  }.
145a0 20 20 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b    free(filebuf);
145b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145c0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
145d0 68 65 20 62 75 66 66 65 72 20 61 66 74 65 72 20  he buffer after 
145e0 70 61 72 73 69 6e 67 20 2a 2f 0a 20 20 67 70 2d  parsing */.  gp-
145f0 3e 72 75 6c 65 20 3d 20 70 73 2e 66 69 72 73 74  >rule = ps.first
14600 72 75 6c 65 3b 0a 20 20 67 70 2d 3e 65 72 72 6f  rule;.  gp->erro
14610 72 63 6e 74 20 3d 20 70 73 2e 65 72 72 6f 72 63  rcnt = ps.errorc
14620 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  nt;.}./*********
14630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14640 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
14650 20 22 70 6c 69 6e 6b 2e 63 22 20 2a 2a 2a 2a 2a   "plink.c" *****
14660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14670 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  /./*.** Routines
14680 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 66   processing conf
14690 69 67 75 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77  iguration follow
146a0 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  -set propagation
146b0 20 6c 69 6e 6b 73 0a 2a 2a 20 69 6e 20 74 68 65   links.** in the
146c0 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
146d0 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  nerator..*/.stat
146e0 69 63 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  ic struct plink 
146f0 2a 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20  *plink_freelist 
14700 3d 20 30 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  = 0;../* Allocat
14710 65 20 61 20 6e 65 77 20 70 6c 69 6e 6b 20 2a 2f  e a new plink */
14720 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 50  .struct plink *P
14730 6c 69 6e 6b 5f 6e 65 77 28 29 7b 0a 20 20 73 74  link_new(){.  st
14740 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 6c  ruct plink *newl
14750 69 6e 6b 3b 0a 0a 20 20 69 66 28 20 70 6c 69 6e  ink;..  if( plin
14760 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b  k_freelist==0 ){
14770 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
14780 69 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b 0a 20  int amt = 100;. 
14790 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73     plink_freelis
147a0 74 20 3d 20 28 73 74 72 75 63 74 20 70 6c 69 6e  t = (struct plin
147b0 6b 20 2a 29 63 61 6c 6c 6f 63 28 20 61 6d 74 2c  k *)calloc( amt,
147c0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 70   sizeof(struct p
147d0 6c 69 6e 6b 29 20 29 3b 0a 20 20 20 20 69 66 28  link) );.    if(
147e0 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d   plink_freelist=
147f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
14800 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20  ntf(stderr,.    
14810 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c    "Unable to all
14820 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
14830 20 61 20 6e 65 77 20 66 6f 6c 6c 6f 77 2d 73 65   a new follow-se
14840 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69  t propagation li
14850 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65  nk.\n");.      e
14860 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
14870 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74    for(i=0; i<amt
14880 2d 31 3b 20 69 2b 2b 29 20 70 6c 69 6e 6b 5f 66  -1; i++) plink_f
14890 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20  reelist[i].next 
148a0 3d 20 26 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  = &plink_freelis
148b0 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 70 6c 69 6e  t[i+1];.    plin
148c0 6b 5f 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31  k_freelist[amt-1
148d0 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a  ].next = 0;.  }.
148e0 20 20 6e 65 77 6c 69 6e 6b 20 3d 20 70 6c 69 6e    newlink = plin
148f0 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 70 6c  k_freelist;.  pl
14900 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70  ink_freelist = p
14910 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d 3e 6e  link_freelist->n
14920 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65  ext;.  return ne
14930 77 6c 69 6e 6b 3b 0a 7d 0a 0a 2f 2a 20 41 64 64  wlink;.}../* Add
14940 20 61 20 70 6c 69 6e 6b 20 74 6f 20 61 20 70 6c   a plink to a pl
14950 69 6e 6b 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ink list */.void
14960 20 50 6c 69 6e 6b 5f 61 64 64 28 73 74 72 75 63   Plink_add(struc
14970 74 20 70 6c 69 6e 6b 20 2a 2a 70 6c 70 70 2c 20  t plink **plpp, 
14980 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
14990 66 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 70  fp).{.  struct p
149a0 6c 69 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 20  link *newlink;. 
149b0 20 6e 65 77 6c 69 6e 6b 20 3d 20 50 6c 69 6e 6b   newlink = Plink
149c0 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 6c 69 6e  _new();.  newlin
149d0 6b 2d 3e 6e 65 78 74 20 3d 20 2a 70 6c 70 70 3b  k->next = *plpp;
149e0 0a 20 20 2a 70 6c 70 70 20 3d 20 6e 65 77 6c 69  .  *plpp = newli
149f0 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b 2d 3e 63  nk;.  newlink->c
14a00 66 70 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20  fp = cfp;.}../* 
14a10 54 72 61 6e 73 66 65 72 20 65 76 65 72 79 20 70  Transfer every p
14a20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74  link on the list
14a30 20 22 66 72 6f 6d 22 20 74 6f 20 74 68 65 20 6c   "from" to the l
14a40 69 73 74 20 22 74 6f 22 20 2a 2f 0a 76 6f 69 64  ist "to" */.void
14a50 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74 72 75   Plink_copy(stru
14a60 63 74 20 70 6c 69 6e 6b 20 2a 2a 74 6f 2c 20 73  ct plink **to, s
14a70 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 72 6f  truct plink *fro
14a80 6d 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  m).{.  struct pl
14a90 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 20 20 77  ink *nextpl;.  w
14aa0 68 69 6c 65 28 20 66 72 6f 6d 20 29 7b 0a 20 20  hile( from ){.  
14ab0 20 20 6e 65 78 74 70 6c 20 3d 20 66 72 6f 6d 2d    nextpl = from-
14ac0 3e 6e 65 78 74 3b 0a 20 20 20 20 66 72 6f 6d 2d  >next;.    from-
14ad0 3e 6e 65 78 74 20 3d 20 2a 74 6f 3b 0a 20 20 20  >next = *to;.   
14ae0 20 2a 74 6f 20 3d 20 66 72 6f 6d 3b 0a 20 20 20   *to = from;.   
14af0 20 66 72 6f 6d 20 3d 20 6e 65 78 74 70 6c 3b 0a   from = nextpl;.
14b00 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65 6c 65 74 65    }.}../* Delete
14b10 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20   every plink on 
14b20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  the list */.void
14b30 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 73 74   Plink_delete(st
14b40 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 29  ruct plink *plp)
14b50 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  .{.  struct plin
14b60 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20 77 68  k *nextpl;..  wh
14b70 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20  ile( plp ){.    
14b80 6e 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e 6e 65  nextpl = plp->ne
14b90 78 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e 65 78  xt;.    plp->nex
14ba0 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  t = plink_freeli
14bb0 73 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72  st;.    plink_fr
14bc0 65 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a 20 20  eelist = plp;.  
14bd0 20 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c 3b 0a    plp = nextpl;.
14be0 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a    }.}./*********
14bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
14c00 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65  rom the file "re
14c10 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  port.c" ********
14c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c30 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 64  **/./*.** Proced
14c40 75 72 65 73 20 66 6f 72 20 67 65 6e 65 72 61 74  ures for generat
14c50 69 6e 67 20 72 65 70 6f 72 74 73 20 61 6e 64 20  ing reports and 
14c60 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45  tables in the LE
14c70 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
14c80 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e  ator..*/../* Gen
14c90 65 72 61 74 65 20 61 20 66 69 6c 65 6e 61 6d 65  erate a filename
14ca0 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
14cb0 73 75 66 66 69 78 2e 20 20 53 70 61 63 65 20 74  suffix.  Space t
14cc0 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 6e 61  o hold the.** na
14cd0 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20 6d 61  me comes from ma
14ce0 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
14cf0 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
14d00 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
14d10 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ion..*/.PRIVATE 
14d20 63 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b 65 6e  char *file_maken
14d30 61 6d 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ame(struct lemon
14d40 20 2a 6c 65 6d 70 2c 20 63 6f 6e 73 74 20 63 68   *lemp, const ch
14d50 61 72 20 2a 73 75 66 66 69 78 29 0a 7b 0a 20 20  ar *suffix).{.  
14d60 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 63 68  char *name;.  ch
14d70 61 72 20 2a 63 70 3b 0a 0a 20 20 6e 61 6d 65 20  ar *cp;..  name 
14d80 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28  = (char*)malloc(
14d90 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d   lemonStrlen(lem
14da0 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b 20 6c  p->filename) + l
14db0 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 75 66 66 69  emonStrlen(suffi
14dc0 78 29 20 2b 20 35 20 29 3b 0a 20 20 69 66 28 20  x) + 5 );.  if( 
14dd0 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66  name==0 ){.    f
14de0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
14df0 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 73 70  an't allocate sp
14e00 61 63 65 20 66 6f 72 20 61 20 66 69 6c 65 6e 61  ace for a filena
14e10 6d 65 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  me.\n");.    exi
14e20 74 28 31 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63  t(1);.  }.  strc
14e30 70 79 28 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 66 69  py(name,lemp->fi
14e40 6c 65 6e 61 6d 65 29 3b 0a 20 20 63 70 20 3d 20  lename);.  cp = 
14e50 73 74 72 72 63 68 72 28 6e 61 6d 65 2c 27 2e 27  strrchr(name,'.'
14e60 29 3b 0a 20 20 69 66 28 20 63 70 20 29 20 2a 63  );.  if( cp ) *c
14e70 70 20 3d 20 30 3b 0a 20 20 73 74 72 63 61 74 28  p = 0;.  strcat(
14e80 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b 0a 20 20  name,suffix);.  
14e90 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d 0a 0a  return name;.}..
14ea0 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 77  /* Open a file w
14eb0 69 74 68 20 61 20 6e 61 6d 65 20 62 61 73 65 64  ith a name based
14ec0 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   on the name of 
14ed0 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 2c 0a  the input file,.
14ee0 2a 2a 20 62 75 74 20 77 69 74 68 20 61 20 64 69  ** but with a di
14ef0 66 66 65 72 65 6e 74 20 28 73 70 65 63 69 66 69  fferent (specifi
14f00 65 64 29 20 73 75 66 66 69 78 2c 20 61 6e 64 20  ed) suffix, and 
14f10 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
14f20 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 72 65 61  .** to the strea
14f30 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49 4c  m */.PRIVATE FIL
14f40 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28 0a 20 20  E *file_open(.  
14f50 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
14f60 6d 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  mp,.  const char
14f70 20 2a 73 75 66 66 69 78 2c 0a 20 20 63 6f 6e 73   *suffix,.  cons
14f80 74 20 63 68 61 72 20 2a 6d 6f 64 65 0a 29 7b 0a  t char *mode.){.
14f90 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 69    FILE *fp;..  i
14fa0 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  f( lemp->outname
14fb0 20 29 20 66 72 65 65 28 6c 65 6d 70 2d 3e 6f 75   ) free(lemp->ou
14fc0 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d 70 2d 3e  tname);.  lemp->
14fd0 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d  outname = file_m
14fe0 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 73 75  akename(lemp, su
14ff0 66 66 69 78 29 3b 0a 20 20 66 70 20 3d 20 66 6f  ffix);.  fp = fo
15000 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  pen(lemp->outnam
15010 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66 28 20 66  e,mode);.  if( f
15020 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65 3d 3d 27  p==0 && *mode=='
15030 77 27 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  w' ){.    fprint
15040 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
15050 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73 5c 22  open file \"%s\"
15060 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  .\n",lemp->outna
15070 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65  me);.    lemp->e
15080 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72  rrorcnt++;.    r
15090 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
150a0 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a 20  eturn fp;.}../* 
150b0 44 75 70 6c 69 63 61 74 65 20 74 68 65 20 69 6e  Duplicate the in
150c0 70 75 74 20 66 69 6c 65 20 77 69 74 68 6f 75 74  put file without
150d0 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64 20 77 69   comments and wi
150e0 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 20 0a 2a  thout actions .*
150f0 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a 76 6f  * on rules */.vo
15100 69 64 20 52 65 70 72 69 6e 74 28 73 74 72 75 63  id Reprint(struc
15110 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
15120 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
15130 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  rp;.  struct sym
15140 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69  bol *sp;.  int i
15150 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c 65 6e  , j, maxlen, len
15160 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b 69 70  , ncolumns, skip
15170 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f 2f 20 52  ;.  printf("// R
15180 65 70 72 69 6e 74 20 6f 66 20 69 6e 70 75 74 20  eprint of input 
15190 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 2f 2f  file \"%s\".\n//
151a0 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d   Symbols:\n",lem
151b0 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
151c0 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a 20 20 66  maxlen = 10;.  f
151d0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
151e0 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
151f0 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79     sp = lemp->sy
15200 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 6c 65  mbols[i];.    le
15210 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  n = lemonStrlen(
15220 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69  sp->name);.    i
15230 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29 20  f( len>maxlen ) 
15240 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20  maxlen = len;.  
15250 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 37  }.  ncolumns = 7
15260 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b 0a 20 20  6/(maxlen+5);.  
15270 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c 31 20 29  if( ncolumns<1 )
15280 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20   ncolumns = 1;. 
15290 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70 2d 3e 6e   skip = (lemp->n
152a0 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c 75 6d 6e  symbol + ncolumn
152b0 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d 6e 73 3b  s - 1)/ncolumns;
152c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 6b  .  for(i=0; i<sk
152d0 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 72  ip; i++){.    pr
152e0 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20 20 20 20  intf("//");.    
152f0 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65 6d 70 2d  for(j=i; j<lemp-
15300 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d 73 6b 69  >nsymbol; j+=ski
15310 70 29 7b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c  p){.      sp = l
15320 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b  emp->symbols[j];
15330 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
15340 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29 3b 0a 20  p->index==j );. 
15350 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 33       printf(" %3
15360 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61 78 6c  d %-*.*s",j,maxl
15370 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d 3e 6e 61  en,maxlen,sp->na
15380 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
15390 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
153a0 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
153b0 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
153c0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 70 72 69 6e  >next){.    prin
153d0 74 66 28 22 25 73 22 2c 72 70 2d 3e 6c 68 73 2d  tf("%s",rp->lhs-
153e0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20 20  >name);.    /*  
153f0 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69    if( rp->lhsali
15400 61 73 20 29 20 70 72 69 6e 74 66 28 22 28 25 73  as ) printf("(%s
15410 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29  )",rp->lhsalias)
15420 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28  ; */.    printf(
15430 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20 66 6f 72  " ::=");.    for
15440 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
15450 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 70  ; i++){.      sp
15460 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
15470 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 73       printf(" %s
15480 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ", sp->name);.  
15490 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
154a0 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
154b0 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  ){.        for(j
154c0 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79  =1; j<sp->nsubsy
154d0 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; j++){.       
154e0 20 20 20 70 72 69 6e 74 66 28 22 7c 25 73 22 2c     printf("|%s",
154f0 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e   sp->subsym[j]->
15500 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
15510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
15520 2a 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69  * if( rp->rhsali
15530 61 73 5b 69 5d 20 29 20 70 72 69 6e 74 66 28 22  as[i] ) printf("
15540 28 25 73 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69  (%s)",rp->rhsali
15550 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20 20 20 7d  as[i]); */.    }
15560 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2e 22 29  .    printf(".")
15570 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72  ;.    if( rp->pr
15580 65 63 73 79 6d 20 29 20 70 72 69 6e 74 66 28 22  ecsym ) printf("
15590 20 5b 25 73 5d 22 2c 72 70 2d 3e 70 72 65 63 73   [%s]",rp->precs
155a0 79 6d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f  ym->name);.    /
155b0 2a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29  * if( rp->code )
155c0 20 70 72 69 6e 74 66 28 22 5c 6e 20 20 20 20 25   printf("\n    %
155d0 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 20 2a 2f  s",rp->code); */
155e0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22  .    printf("\n"
155f0 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 43  );.  }.}..void C
15600 6f 6e 66 69 67 50 72 69 6e 74 28 46 49 4c 45 20  onfigPrint(FILE 
15610 2a 66 70 2c 20 73 74 72 75 63 74 20 63 6f 6e 66  *fp, struct conf
15620 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73 74 72  ig *cfp).{.  str
15630 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
15640 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
15650 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  p;.  int i, j;. 
15660 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20   rp = cfp->rp;. 
15670 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 73 20   fprintf(fp,"%s 
15680 3a 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61  ::=",rp->lhs->na
15690 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  me);.  for(i=0; 
156a0 69 3c 3d 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b  i<=rp->nrhs; i++
156b0 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 63 66  ){.    if( i==cf
156c0 70 2d 3e 64 6f 74 20 29 20 66 70 72 69 6e 74 66  p->dot ) fprintf
156d0 28 66 70 2c 22 20 2a 22 29 3b 0a 20 20 20 20 69  (fp," *");.    i
156e0 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29  f( i==rp->nrhs )
156f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 70 20 3d   break;.    sp =
15700 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
15710 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73   fprintf(fp," %s
15720 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ", sp->name);.  
15730 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
15740 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
15750 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  .      for(j=1; 
15760 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a  j<sp->nsubsym; j
15770 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
15780 69 6e 74 66 28 66 70 2c 22 7c 25 73 22 2c 73 70  intf(fp,"|%s",sp
15790 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d  ->subsym[j]->nam
157a0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
157b0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64 65 66  }.  }.}../* #def
157c0 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69 66 20  ine TEST */.#if 
157d0 30 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 65 74  0./* Print a set
157e0 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64   */.PRIVATE void
157f0 20 53 65 74 50 72 69 6e 74 28 6f 75 74 2c 73 65   SetPrint(out,se
15800 74 2c 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75  t,lemp).FILE *ou
15810 74 3b 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73 74  t;.char *set;.st
15820 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
15830 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  ;.{.  int i;.  c
15840 68 61 72 20 2a 73 70 61 63 65 72 3b 0a 20 20 73  har *spacer;.  s
15850 70 61 63 65 72 20 3d 20 22 22 3b 0a 20 20 66 70  pacer = "";.  fp
15860 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 5b  rintf(out,"%12s[
15870 22 2c 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ","");.  for(i=0
15880 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; i<lemp->ntermi
15890 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nal; i++){.    i
158a0 66 28 20 53 65 74 46 69 6e 64 28 73 65 74 2c 69  f( SetFind(set,i
158b0 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ) ){.      fprin
158c0 74 66 28 6f 75 74 2c 22 25 73 25 73 22 2c 73 70  tf(out,"%s%s",sp
158d0 61 63 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  acer,lemp->symbo
158e0 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ls[i]->name);.  
158f0 20 20 20 20 73 70 61 63 65 72 20 3d 20 22 20 22      spacer = " "
15900 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
15910 72 69 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29  rintf(out,"]\n")
15920 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20  ;.}../* Print a 
15930 70 6c 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50  plink chain */.P
15940 52 49 56 41 54 45 20 76 6f 69 64 20 50 6c 69 6e  RIVATE void Plin
15950 6b 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74  kPrint(out,plp,t
15960 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73  ag).FILE *out;.s
15970 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70  truct plink *plp
15980 3b 0a 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20  ;.char *tag;.{. 
15990 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20   while( plp ){. 
159a0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
159b0 25 31 32 73 25 73 20 28 73 74 61 74 65 20 25 32  %12s%s (state %2
159c0 64 29 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d  d) ","",tag,plp-
159d0 3e 63 66 70 2d 3e 73 74 70 2d 3e 73 74 61 74 65  >cfp->stp->state
159e0 6e 75 6d 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67  num);.    Config
159f0 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e 63  Print(out,plp->c
15a00 66 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  fp);.    fprintf
15a10 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  (out,"\n");.    
15a20 70 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b  plp = plp->next;
15a30 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
15a40 2a 20 50 72 69 6e 74 20 61 6e 20 61 63 74 69 6f  * Print an actio
15a50 6e 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  n to the given f
15a60 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
15a70 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
15a80 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 77 61 73 20  .** nothing was 
15a90 61 63 74 75 61 6c 6c 79 20 70 72 69 6e 74 65 64  actually printed
15aa0 2e 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e 74 41 63  ..*/.int PrintAc
15ab0 74 69 6f 6e 28 73 74 72 75 63 74 20 61 63 74 69  tion(struct acti
15ac0 6f 6e 20 2a 61 70 2c 20 46 49 4c 45 20 2a 66 70  on *ap, FILE *fp
15ad0 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20  , int indent){. 
15ae0 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 31 3b   int result = 1;
15af0 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74  .  switch( ap->t
15b00 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
15b10 53 48 49 46 54 3a 0a 20 20 20 20 20 20 66 70 72  SHIFT:.      fpr
15b20 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69  intf(fp,"%*s shi
15b30 66 74 20 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61  ft  %d",indent,a
15b40 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e  p->sp->name,ap->
15b50 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29  x.stp->statenum)
15b60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15b70 20 20 20 63 61 73 65 20 52 45 44 55 43 45 3a 0a     case REDUCE:.
15b80 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
15b90 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25 64 22  ,"%*s reduce %d"
15ba0 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
15bb0 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69  name,ap->x.rp->i
15bc0 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  ndex);.      bre
15bd0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43  ak;.    case ACC
15be0 45 50 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  EPT:.      fprin
15bf0 74 66 28 66 70 2c 22 25 2a 73 20 61 63 63 65 70  tf(fp,"%*s accep
15c00 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70  t",indent,ap->sp
15c10 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  ->name);.      b
15c20 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45  reak;.    case E
15c30 52 52 4f 52 3a 0a 20 20 20 20 20 20 66 70 72 69  RROR:.      fpri
15c40 6e 74 66 28 66 70 2c 22 25 2a 73 20 65 72 72 6f  ntf(fp,"%*s erro
15c50 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70  r",indent,ap->sp
15c60 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  ->name);.      b
15c70 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
15c80 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 63  RCONFLICT:.    c
15c90 61 73 65 20 52 52 43 4f 4e 46 4c 49 43 54 3a 0a  ase RRCONFLICT:.
15ca0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
15cb0 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25 2d 33  ,"%*s reduce %-3
15cc0 64 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e  d ** Parsing con
15cd0 66 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20  flict **",.     
15ce0 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70     indent,ap->sp
15cf0 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d  ->name,ap->x.rp-
15d00 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62  >index);.      b
15d10 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
15d20 53 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20  SCONFLICT:.     
15d30 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
15d40 20 73 68 69 66 74 20 20 25 2d 33 64 20 2a 2a 20   shift  %-3d ** 
15d50 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74  Parsing conflict
15d60 20 2a 2a 22 2c 20 0a 20 20 20 20 20 20 20 20 69   **", .        i
15d70 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
15d80 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74  me,ap->x.stp->st
15d90 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62  atenum);.      b
15da0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
15db0 48 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20  H_RESOLVED:.    
15dc0 20 20 69 66 28 20 73 68 6f 77 50 72 65 63 65 64    if( showPreced
15dd0 65 6e 63 65 43 6f 6e 66 6c 69 63 74 20 29 7b 0a  enceConflict ){.
15de0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
15df0 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20 25  fp,"%*s shift  %
15e00 2d 33 64 20 2d 2d 20 64 72 6f 70 70 65 64 20 62  -3d -- dropped b
15e10 79 20 70 72 65 63 65 64 65 6e 63 65 22 2c 0a 20  y precedence",. 
15e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
15e30 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
15e40 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74  me,ap->x.stp->st
15e50 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20 7d  atenum);.      }
15e60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
15e70 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sult = 0;.      
15e80 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
15e90 20 20 20 63 61 73 65 20 52 44 5f 52 45 53 4f 4c     case RD_RESOL
15ea0 56 45 44 3a 0a 20 20 20 20 20 20 69 66 28 20 73  VED:.      if( s
15eb0 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e  howPrecedenceCon
15ec0 66 6c 69 63 74 20 29 7b 0a 20 20 20 20 20 20 20  flict ){.       
15ed0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
15ee0 20 72 65 64 75 63 65 20 25 2d 33 64 20 2d 2d 20   reduce %-3d -- 
15ef0 64 72 6f 70 70 65 64 20 62 79 20 70 72 65 63 65  dropped by prece
15f00 64 65 6e 63 65 22 2c 0a 20 20 20 20 20 20 20 20  dence",.        
15f10 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74 2c 61          indent,a
15f20 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e  p->sp->name,ap->
15f30 78 2e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20  x.rp->index);.  
15f40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15f50 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20     result = 0;. 
15f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
15f70 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4e 4f 54  ak;.    case NOT
15f80 5f 55 53 45 44 3a 0a 20 20 20 20 20 20 72 65 73  _USED:.      res
15f90 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  ult = 0;.      b
15fa0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
15fb0 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a  rn result;.}../*
15fc0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 22 79   Generate the "y
15fd0 2e 6f 75 74 70 75 74 22 20 6c 6f 67 20 66 69 6c  .output" log fil
15fe0 65 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74  e */.void Report
15ff0 4f 75 74 70 75 74 28 73 74 72 75 63 74 20 6c 65  Output(struct le
16000 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69  mon *lemp).{.  i
16010 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
16020 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
16030 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
16040 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
16050 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66 70   *ap;.  FILE *fp
16060 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f 6f  ;..  fp = file_o
16070 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c  pen(lemp,".out",
16080 22 77 62 22 29 3b 0a 20 20 69 66 28 20 66 70 3d  "wb");.  if( fp=
16090 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
160a0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
160b0 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
160c0 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
160d0 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 70 72  rted[i];.    fpr
160e0 69 6e 74 66 28 66 70 2c 22 53 74 61 74 65 20 25  intf(fp,"State %
160f0 64 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74 61 74 65  d:\n",stp->state
16100 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 6c 65  num);.    if( le
16110 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29 20  mp->basisflag ) 
16120 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20 20  cfp=stp->bp;.   
16130 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20   else           
16140 20 20 20 20 20 20 20 63 66 70 3d 73 74 70 2d 3e         cfp=stp->
16150 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  cfp;.    while( 
16160 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63 68 61  cfp ){.      cha
16170 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20 20  r buf[20];.     
16180 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d 63   if( cfp->dot==c
16190 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b 0a  fp->rp->nrhs ){.
161a0 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
161b0 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d 3e  buf,"(%d)",cfp->
161c0 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  rp->index);.    
161d0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
161e0 20 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b 0a      %5s ",buf);.
161f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16200 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
16210 22 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a 20  "          ");. 
16220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f 6e       }.      Con
16230 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70 29  figPrint(fp,cfp)
16240 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
16250 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20 30 0a  fp,"\n");.#if 0.
16260 20 20 20 20 20 20 53 65 74 50 72 69 6e 74 28 66        SetPrint(f
16270 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70 29  p,cfp->fws,lemp)
16280 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69  ;.      PlinkPri
16290 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70 2c  nt(fp,cfp->fplp,
162a0 22 54 6f 20 20 22 29 3b 0a 20 20 20 20 20 20 50  "To  ");.      P
162b0 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70  linkPrint(fp,cfp
162c0 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b 0a  ->bplp,"From");.
162d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
162e0 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67   lemp->basisflag
162f0 20 29 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b 0a   ) cfp=cfp->bp;.
16300 20 20 20 20 20 20 65 6c 73 65 20 20 20 20 20 20        else      
16310 20 20 20 20 20 20 20 20 20 20 20 20 63 66 70 3d              cfp=
16320 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d  cfp->next;.    }
16330 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
16340 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 61  "\n");.    for(a
16350 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
16360 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
16370 20 20 20 69 66 28 20 50 72 69 6e 74 41 63 74 69     if( PrintActi
16380 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20 29 20 66  on(ap,fp,30) ) f
16390 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b  printf(fp,"\n");
163a0 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
163b0 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d  tf(fp,"\n");.  }
163c0 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22  .  fprintf(fp, "
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 2d 2d  ----------------
163f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16400 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70 72 69  ----\n");.  fpri
16410 6e 74 66 28 66 70 2c 20 22 53 79 6d 62 6f 6c 73  ntf(fp, "Symbols
16420 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  :\n");.  for(i=0
16430 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
16440 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  l; i++){.    int
16450 20 6a 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   j;.    struct s
16460 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 20 20  ymbol *sp;..    
16470 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
16480 6c 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e  ls[i];.    fprin
16490 74 66 28 66 70 2c 20 22 20 20 25 33 64 3a 20 25  tf(fp, "  %3d: %
164a0 73 22 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d 65 29  s", i, sp->name)
164b0 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  ;.    if( sp->ty
164c0 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe==NONTERMINAL 
164d0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
164e0 28 66 70 2c 20 22 3a 22 29 3b 0a 20 20 20 20 20  (fp, ":");.     
164f0 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61 20   if( sp->lambda 
16500 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
16510 74 66 28 66 70 2c 20 22 20 3c 6c 61 6d 62 64 61  tf(fp, " <lambda
16520 3e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >");.      }.   
16530 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65     for(j=0; j<le
16540 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a  mp->nterminal; j
16550 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
16560 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20 26 26   sp->firstset &&
16570 20 53 65 74 46 69 6e 64 28 73 70 2d 3e 66 69 72   SetFind(sp->fir
16580 73 74 73 65 74 2c 20 6a 29 20 29 7b 0a 20 20 20  stset, j) ){.   
16590 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
165a0 70 2c 20 22 20 25 73 22 2c 20 6c 65 6d 70 2d 3e  p, " %s", lemp->
165b0 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d 65  symbols[j]->name
165c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
165d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
165e0 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 6e 22 29  printf(fp, "\n")
165f0 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  ;.  }.  fclose(f
16600 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  p);.  return;.}.
16610 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74  ./* Search for t
16620 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20 77  he file "name" w
16630 68 69 63 68 20 69 73 20 69 6e 20 74 68 65 20 73  hich is in the s
16640 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
16650 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61 62  .** the exacutab
16660 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63 68  le */.PRIVATE ch
16670 61 72 20 2a 70 61 74 68 73 65 61 72 63 68 28 63  ar *pathsearch(c
16680 68 61 72 20 2a 61 72 67 76 30 2c 20 63 68 61 72  har *argv0, char
16690 20 2a 6e 61 6d 65 2c 20 69 6e 74 20 6d 6f 64 65   *name, int mode
166a0 6d 61 73 6b 29 0a 7b 0a 20 20 63 6f 6e 73 74 20  mask).{.  const 
166b0 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b 0a  char *pathlist;.
166c0 20 20 63 68 61 72 20 2a 70 61 74 68 62 75 66 70    char *pathbufp
166d0 74 72 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68  tr;.  char *path
166e0 62 75 66 3b 0a 20 20 63 68 61 72 20 2a 70 61 74  buf;.  char *pat
166f0 68 2c 2a 63 70 3b 0a 20 20 63 68 61 72 20 63 3b  h,*cp;.  char c;
16700 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33 32  ..#ifdef __WIN32
16710 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  __.  cp = strrch
16720 72 28 61 72 67 76 30 2c 27 5c 5c 27 29 3b 0a 23  r(argv0,'\\');.#
16730 65 6c 73 65 0a 20 20 63 70 20 3d 20 73 74 72 72  else.  cp = strr
16740 63 68 72 28 61 72 67 76 30 2c 27 2f 27 29 3b 0a  chr(argv0,'/');.
16750 23 65 6e 64 69 66 0a 20 20 69 66 28 20 63 70 20  #endif.  if( cp 
16760 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a  ){.    c = *cp;.
16770 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20      *cp = 0;.   
16780 20 70 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29   path = (char *)
16790 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72  malloc( lemonStr
167a0 6c 65 6e 28 61 72 67 76 30 29 20 2b 20 6c 65 6d  len(argv0) + lem
167b0 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29 20 2b  onStrlen(name) +
167c0 20 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61   2 );.    if( pa
167d0 74 68 20 29 20 73 70 72 69 6e 74 66 28 70 61 74  th ) sprintf(pat
167e0 68 2c 22 25 73 2f 25 73 22 2c 61 72 67 76 30 2c  h,"%s/%s",argv0,
167f0 6e 61 6d 65 29 3b 0a 20 20 20 20 2a 63 70 20 3d  name);.    *cp =
16800 20 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   c;.  }else{.   
16810 20 70 61 74 68 6c 69 73 74 20 3d 20 67 65 74 65   pathlist = gete
16820 6e 76 28 22 50 41 54 48 22 29 3b 0a 20 20 20 20  nv("PATH");.    
16830 69 66 28 20 70 61 74 68 6c 69 73 74 3d 3d 30 20  if( pathlist==0 
16840 29 20 70 61 74 68 6c 69 73 74 20 3d 20 22 2e 3a  ) pathlist = ".:
16850 2f 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a  /bin:/usr/bin";.
16860 20 20 20 20 70 61 74 68 62 75 66 20 3d 20 28 63      pathbuf = (c
16870 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c  har *) malloc( l
16880 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c  emonStrlen(pathl
16890 69 73 74 29 20 2b 20 31 20 29 3b 0a 20 20 20 20  ist) + 1 );.    
168a0 70 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d  path = (char *)m
168b0 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
168c0 65 6e 28 70 61 74 68 6c 69 73 74 29 2b 6c 65 6d  en(pathlist)+lem
168d0 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29 2b 32  onStrlen(name)+2
168e0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 61 74   );.    if( (pat
168f0 68 62 75 66 20 21 3d 20 30 29 20 26 26 20 28 70  hbuf != 0) && (p
16900 61 74 68 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  ath!=0) ){.     
16910 20 70 61 74 68 62 75 66 70 74 72 20 3d 20 70 61   pathbufptr = pa
16920 74 68 62 75 66 3b 0a 20 20 20 20 20 20 73 74 72  thbuf;.      str
16930 63 70 79 28 70 61 74 68 62 75 66 2c 20 70 61 74  cpy(pathbuf, pat
16940 68 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  hlist);.      wh
16950 69 6c 65 28 20 2a 70 61 74 68 62 75 66 20 29 7b  ile( *pathbuf ){
16960 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20 73 74  .        cp = st
16970 72 63 68 72 28 70 61 74 68 62 75 66 2c 27 3a 27  rchr(pathbuf,':'
16980 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
16990 70 3d 3d 30 20 29 20 63 70 20 3d 20 26 70 61 74  p==0 ) cp = &pat
169a0 68 62 75 66 5b 6c 65 6d 6f 6e 53 74 72 6c 65 6e  hbuf[lemonStrlen
169b0 28 70 61 74 68 62 75 66 29 5d 3b 0a 20 20 20 20  (pathbuf)];.    
169c0 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20      c = *cp;.   
169d0 20 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20       *cp = 0;.  
169e0 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 70 61        sprintf(pa
169f0 74 68 2c 22 25 73 2f 25 73 22 2c 70 61 74 68 62  th,"%s/%s",pathb
16a00 75 66 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  uf,name);.      
16a10 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 20 20 20    *cp = c;.     
16a20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 70 61     if( c==0 ) pa
16a30 74 68 62 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20  thbuf[0] = 0;.  
16a40 20 20 20 20 20 20 65 6c 73 65 20 70 61 74 68 62        else pathb
16a50 75 66 20 3d 20 26 63 70 5b 31 5d 3b 0a 20 20 20  uf = &cp[1];.   
16a60 20 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28       if( access(
16a70 70 61 74 68 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d  path,modemask)==
16a80 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
16a90 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28 70 61   }.      free(pa
16aa0 74 68 62 75 66 70 74 72 29 3b 0a 20 20 20 20 7d  thbufptr);.    }
16ab0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 61  .  }.  return pa
16ac0 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69 76 65 6e 20  th;.}../* Given 
16ad0 61 6e 20 61 63 74 69 6f 6e 2c 20 63 6f 6d 70 75  an action, compu
16ae0 74 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  te the integer v
16af0 61 6c 75 65 20 66 6f 72 20 74 68 61 74 20 61 63  alue for that ac
16b00 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 69 73  tion.** which is
16b10 20 74 6f 20 62 65 20 70 75 74 20 69 6e 20 74 68   to be put in th
16b20 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f  e action table o
16b30 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
16b40 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 52 65 74 75  machine..** Retu
16b50 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66 20 6e  rn negative if n
16b60 6f 20 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  o action should 
16b70 62 65 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f  be generated..*/
16b80 0a 50 52 49 56 41 54 45 20 69 6e 74 20 63 6f 6d  .PRIVATE int com
16b90 70 75 74 65 5f 61 63 74 69 6f 6e 28 73 74 72 75  pute_action(stru
16ba0 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20  ct lemon *lemp, 
16bb0 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
16bc0 70 29 0a 7b 0a 20 20 69 6e 74 20 61 63 74 3b 0a  p).{.  int act;.
16bd0 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79    switch( ap->ty
16be0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  pe ){.    case S
16bf0 48 49 46 54 3a 20 20 61 63 74 20 3d 20 61 70 2d  HIFT:  act = ap-
16c00 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d  >x.stp->statenum
16c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
16c20 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44  ak;.    case RED
16c30 55 43 45 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78  UCE: act = ap->x
16c40 2e 72 70 2d 3e 69 6e 64 65 78 20 2b 20 6c 65 6d  .rp->index + lem
16c50 70 2d 3e 6e 73 74 61 74 65 3b 20 62 72 65 61 6b  p->nstate; break
16c60 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f 52  ;.    case ERROR
16c70 3a 20 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e  :  act = lemp->n
16c80 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72  state + lemp->nr
16c90 75 6c 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ule;     break;.
16ca0 20 20 20 20 63 61 73 65 20 41 43 43 45 50 54 3a      case ACCEPT:
16cb0 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74   act = lemp->nst
16cc0 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  ate + lemp->nrul
16cd0 65 20 2b 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20  e + 1; break;.  
16ce0 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 61    default:     a
16cf0 63 74 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a  ct = -1; break;.
16d00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 63 74    }.  return act
16d10 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e  ;.}..#define LIN
16d20 45 53 49 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68  ESIZE 1000./* Th
16d30 65 20 6e 65 78 74 20 63 6c 75 73 74 65 72 20 6f  e next cluster o
16d40 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 66  f routines are f
16d50 6f 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 74  or reading the t
16d60 65 6d 70 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20  emplate file.** 
16d70 61 6e 64 20 77 72 69 74 69 6e 67 20 74 68 65 20  and writing the 
16d80 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 67  results to the g
16d90 65 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 20  enerated parser 
16da0 2a 2f 0a 2f 2a 20 54 68 65 20 66 69 72 73 74 20  */./* The first 
16db0 66 75 6e 63 74 69 6f 6e 20 74 72 61 6e 73 66 65  function transfe
16dc0 72 73 20 64 61 74 61 20 66 72 6f 6d 20 22 69 6e  rs data from "in
16dd0 22 20 74 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c  " to "out" until
16de0 0a 2a 2a 20 61 20 6c 69 6e 65 20 69 73 20 73 65  .** a line is se
16df0 65 6e 20 77 68 69 63 68 20 62 65 67 69 6e 73 20  en which begins 
16e00 77 69 74 68 20 22 25 25 22 2e 20 20 54 68 65 20  with "%%".  The 
16e10 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  line number is.*
16e20 2a 20 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a  * tracked..**.**
16e30 20 69 66 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65   if name!=0, the
16e40 6e 20 61 6e 79 20 77 6f 72 64 20 74 68 61 74 20  n any word that 
16e50 62 65 67 69 6e 20 77 69 74 68 20 22 50 61 72 73  begin with "Pars
16e60 65 22 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  e" is changed to
16e70 0a 2a 2a 20 62 65 67 69 6e 20 77 69 74 68 20 2a  .** begin with *
16e80 6e 61 6d 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f  name instead..*/
16e90 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 70  .PRIVATE void tp
16ea0 6c 74 5f 78 66 65 72 28 63 68 61 72 20 2a 6e 61  lt_xfer(char *na
16eb0 6d 65 2c 20 46 49 4c 45 20 2a 69 6e 2c 20 46 49  me, FILE *in, FI
16ec0 4c 45 20 2a 6f 75 74 2c 20 69 6e 74 20 2a 6c 69  LE *out, int *li
16ed0 6e 65 6e 6f 29 0a 7b 0a 20 20 69 6e 74 20 69 2c  neno).{.  int i,
16ee0 20 69 53 74 61 72 74 3b 0a 20 20 63 68 61 72 20   iStart;.  char 
16ef0 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a  line[LINESIZE];.
16f00 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 6c    while( fgets(l
16f10 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29  ine,LINESIZE,in)
16f20 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21 3d 27 25   && (line[0]!='%
16f30 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d 27 25  ' || line[1]!='%
16f40 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c 69 6e 65  ') ){.    (*line
16f50 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53 74 61 72  no)++;.    iStar
16f60 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e  t = 0;.    if( n
16f70 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ame ){.      for
16f80 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b 20 69  (i=0; line[i]; i
16f90 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
16fa0 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27 20 26 26   line[i]=='P' &&
16fb0 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e 65 5b 69   strncmp(&line[i
16fc0 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d 3d 30 0a  ],"Parse",5)==0.
16fd0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69 3d            && (i=
16fe0 3d 30 20 7c 7c 20 21 69 73 61 6c 70 68 61 28 6c  =0 || !isalpha(l
16ff0 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20 20 20 20  ine[i-1])).     
17000 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
17010 69 66 28 20 69 3e 69 53 74 61 72 74 20 29 20 66  if( i>iStart ) f
17020 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73  printf(out,"%.*s
17030 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c 69 6e 65  ",i-iStart,&line
17040 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 20 20 20  [iStart]);.     
17050 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
17060 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a 20 20 20  ,"%s",name);.   
17070 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20         i += 4;. 
17080 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20           iStart 
17090 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d  = i+1;.        }
170a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
170b0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
170c0 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74  %s",&line[iStart
170d0 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 54 68  ]);.  }.}../* Th
170e0 65 20 6e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20  e next function 
170f0 66 69 6e 64 73 20 74 68 65 20 74 65 6d 70 6c 61  finds the templa
17100 74 65 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  te file and open
17110 73 20 69 74 2c 20 72 65 74 75 72 6e 69 6e 67 0a  s it, returning.
17120 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
17130 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 2e  the opened file.
17140 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49 4c 45   */.PRIVATE FILE
17150 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 73 74 72 75   *tplt_open(stru
17160 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
17170 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
17180 74 65 6d 70 6c 61 74 65 6e 61 6d 65 5b 5d 20 3d  templatename[] =
17190 20 22 6c 65 6d 70 61 72 2e 63 22 3b 0a 20 20 63   "lempar.c";.  c
171a0 68 61 72 20 62 75 66 5b 31 30 30 30 5d 3b 0a 20  har buf[1000];. 
171b0 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61   FILE *in;.  cha
171c0 72 20 2a 74 70 6c 74 6e 61 6d 65 3b 0a 20 20 63  r *tpltname;.  c
171d0 68 61 72 20 2a 63 70 3b 0a 0a 20 20 2f 2a 20 66  har *cp;..  /* f
171e0 69 72 73 74 2c 20 73 65 65 20 69 66 20 75 73 65  irst, see if use
171f0 72 20 73 70 65 63 69 66 69 65 64 20 61 20 74 65  r specified a te
17200 6d 70 6c 61 74 65 20 66 69 6c 65 6e 61 6d 65 20  mplate filename 
17210 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
17220 69 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28 75 73  ine. */.  if (us
17230 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20  er_templatename 
17240 21 3d 20 30 29 20 7b 0a 20 20 20 20 69 66 28 20  != 0) {.    if( 
17250 61 63 63 65 73 73 28 75 73 65 72 5f 74 65 6d 70  access(user_temp
17260 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29 3d 3d 2d  latename,004)==-
17270 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  1 ){.      fprin
17280 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74  tf(stderr,"Can't
17290 20 66 69 6e 64 20 74 68 65 20 70 61 72 73 65 72   find the parser
172a0 20 64 72 69 76 65 72 20 74 65 6d 70 6c 61 74 65   driver template
172b0 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22   file \"%s\".\n"
172c0 2c 0a 20 20 20 20 20 20 20 20 75 73 65 72 5f 74  ,.        user_t
172d0 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20  emplatename);.  
172e0 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
172f0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75  nt++;.      retu
17300 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
17310 69 6e 20 3d 20 66 6f 70 65 6e 28 75 73 65 72 5f  in = fopen(user_
17320 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 22 72 62  templatename,"rb
17330 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d  ");.    if( in==
17340 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
17350 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74  tf(stderr,"Can't
17360 20 6f 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61   open the templa
17370 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c  te file \"%s\".\
17380 6e 22 2c 75 73 65 72 5f 74 65 6d 70 6c 61 74 65  n",user_template
17390 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d  name);.      lem
173a0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
173b0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
173c0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
173d0 69 6e 3b 0a 20 20 7d 0a 0a 20 20 63 70 20 3d 20  in;.  }..  cp = 
173e0 73 74 72 72 63 68 72 28 6c 65 6d 70 2d 3e 66 69  strrchr(lemp->fi
173f0 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69  lename,'.');.  i
17400 66 28 20 63 70 20 29 7b 0a 20 20 20 20 73 70 72  f( cp ){.    spr
17410 69 6e 74 66 28 62 75 66 2c 22 25 2e 2a 73 2e 6c  intf(buf,"%.*s.l
17420 74 22 2c 28 69 6e 74 29 28 63 70 2d 6c 65 6d 70  t",(int)(cp-lemp
17430 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c 6c 65 6d 70  ->filename),lemp
17440 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  ->filename);.  }
17450 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74  else{.    sprint
17460 66 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65  f(buf,"%s.lt",le
17470 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
17480 20 7d 0a 20 20 69 66 28 20 61 63 63 65 73 73 28   }.  if( access(
17490 62 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20  buf,004)==0 ){. 
174a0 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75     tpltname = bu
174b0 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  f;.  }else if( a
174c0 63 63 65 73 73 28 74 65 6d 70 6c 61 74 65 6e 61  ccess(templatena
174d0 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20  me,004)==0 ){.  
174e0 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74 65 6d    tpltname = tem
174f0 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c  platename;.  }el
17500 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65  se{.    tpltname
17510 20 3d 20 70 61 74 68 73 65 61 72 63 68 28 6c 65   = pathsearch(le
17520 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70 6c 61  mp->argv0,templa
17530 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20  tename,0);.  }. 
17540 20 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d 3d 30   if( tpltname==0
17550 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
17560 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69  stderr,"Can't fi
17570 6e 64 20 74 68 65 20 70 61 72 73 65 72 20 64 72  nd the parser dr
17580 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69  iver template fi
17590 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20  le \"%s\".\n",. 
175a0 20 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29     templatename)
175b0 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
175c0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
175d0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d  rn 0;.  }.  in =
175e0 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d 65 2c   fopen(tpltname,
175f0 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d  "rb");.  if( in=
17600 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
17610 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
17620 6f 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  open the templat
17630 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e  e file \"%s\".\n
17640 22 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b  ",templatename);
17650 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
17660 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
17670 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
17680 6e 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e  n in;.}../* Prin
17690 74 20 61 20 23 6c 69 6e 65 20 64 69 72 65 63 74  t a #line direct
176a0 69 76 65 20 6c 69 6e 65 20 74 6f 20 74 68 65 20  ive line to the 
176b0 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 2a 2f 0a  output file. */.
176c0 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c  PRIVATE void tpl
176d0 74 5f 6c 69 6e 65 64 69 72 28 46 49 4c 45 20 2a  t_linedir(FILE *
176e0 6f 75 74 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c  out, int lineno,
176f0 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 29   char *filename)
17700 0a 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .{.  fprintf(out
17710 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 22 2c 6c  ,"#line %d \"",l
17720 69 6e 65 6e 6f 29 3b 0a 20 20 77 68 69 6c 65 28  ineno);.  while(
17730 20 2a 66 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20   *filename ){.  
17740 20 20 69 66 28 20 2a 66 69 6c 65 6e 61 6d 65 20    if( *filename 
17750 3d 3d 20 27 5c 5c 27 20 29 20 70 75 74 63 28 27  == '\\' ) putc('
17760 5c 5c 27 2c 6f 75 74 29 3b 0a 20 20 20 20 70 75  \\',out);.    pu
17770 74 63 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f 75 74  tc(*filename,out
17780 29 3b 0a 20 20 20 20 66 69 6c 65 6e 61 6d 65 2b  );.    filename+
17790 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  +;.  }.  fprintf
177a0 28 6f 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a 7d 0a  (out,"\"\n");.}.
177b0 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 74 72 69  ./* Print a stri
177c0 6e 67 20 74 6f 20 74 68 65 20 66 69 6c 65 20 61  ng to the file a
177d0 6e 64 20 6b 65 65 70 20 74 68 65 20 6c 69 6e 65  nd keep the line
177e0 6e 75 6d 62 65 72 20 75 70 20 74 6f 20 64 61 74  number up to dat
177f0 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  e */.PRIVATE voi
17800 64 20 74 70 6c 74 5f 70 72 69 6e 74 28 46 49 4c  d tplt_print(FIL
17810 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 6c  E *out, struct l
17820 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 68 61 72  emon *lemp, char
17830 20 2a 73 74 72 2c 20 69 6e 74 20 2a 6c 69 6e 65   *str, int *line
17840 6e 6f 29 0a 7b 0a 20 20 69 66 28 20 73 74 72 3d  no).{.  if( str=
17850 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
17860 68 69 6c 65 28 20 2a 73 74 72 20 29 7b 0a 20 20  hile( *str ){.  
17870 20 20 70 75 74 63 28 2a 73 74 72 2c 6f 75 74 29    putc(*str,out)
17880 3b 0a 20 20 20 20 69 66 28 20 2a 73 74 72 3d 3d  ;.    if( *str==
17890 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29  '\n' ) (*lineno)
178a0 2b 2b 3b 0a 20 20 20 20 73 74 72 2b 2b 3b 0a 20  ++;.    str++;. 
178b0 20 7d 0a 20 20 69 66 28 20 73 74 72 5b 2d 31 5d   }.  if( str[-1]
178c0 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 70 75  !='\n' ){.    pu
178d0 74 63 28 27 5c 6e 27 2c 6f 75 74 29 3b 0a 20 20  tc('\n',out);.  
178e0 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20    (*lineno)++;. 
178f0 20 7d 0a 20 20 69 66 20 28 21 6c 65 6d 70 2d 3e   }.  if (!lemp->
17900 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b  nolinenosflag) {
17910 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  .    (*lineno)++
17920 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f  ; tplt_linedir(o
17930 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d  ut,*lineno,lemp-
17940 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 20 7d 0a  >outname); .  }.
17950 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
17960 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
17970 20 72 6f 75 74 69 6e 65 20 65 6d 69 74 73 20 63   routine emits c
17980 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65 73 74  ode for the dest
17990 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 0a 2a  ructor for the.*
179a0 2a 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76  * symbol sp.*/.v
179b0 6f 69 64 20 65 6d 69 74 5f 64 65 73 74 72 75 63  oid emit_destruc
179c0 74 6f 72 5f 63 6f 64 65 28 0a 20 20 46 49 4c 45  tor_code(.  FILE
179d0 20 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63 74 20   *out,.  struct 
179e0 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20 73 74  symbol *sp,.  st
179f0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
17a00 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a  ,.  int *lineno.
17a10 29 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d 20 30  ){. char *cp = 0
17a20 3b 0a 0a 20 69 66 28 20 73 70 2d 3e 74 79 70 65  ;.. if( sp->type
17a30 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ==TERMINAL ){.  
17a40 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65   cp = lemp->toke
17a50 6e 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70  ndest;.   if( cp
17a60 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
17a70 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c   fprintf(out,"{\
17a80 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n"); (*lineno)++
17a90 3b 0a 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d  ;. }else if( sp-
17aa0 3e 64 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  >destructor ){. 
17ab0 20 20 63 70 20 3d 20 73 70 2d 3e 64 65 73 74 72    cp = sp->destr
17ac0 75 63 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e 74  uctor;.   fprint
17ad0 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a  f(out,"{\n"); (*
17ae0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66  lineno)++;.   if
17af0 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e   (!lemp->nolinen
17b00 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65  osflag) { (*line
17b10 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65  no)++; tplt_line
17b20 64 69 72 28 6f 75 74 2c 73 70 2d 3e 64 65 73 74  dir(out,sp->dest
17b30 4c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 66 69 6c  Lineno,lemp->fil
17b40 65 6e 61 6d 65 29 3b 20 7d 0a 20 7d 65 6c 73 65  ename); }. }else
17b50 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65   if( lemp->varde
17b60 73 74 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65  st ){.   cp = le
17b70 6d 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20  mp->vardest;.   
17b80 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75  if( cp==0 ) retu
17b90 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  rn;.   fprintf(o
17ba0 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e  ut,"{\n"); (*lin
17bb0 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 7b 0a  eno)++;. }else{.
17bc0 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20     assert( 0 ); 
17bd0 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65   /* Cannot happe
17be0 6e 20 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a  n */. }. for(; *
17bf0 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66  cp; cp++){.   if
17c00 28 20 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70  ( *cp=='$' && cp
17c10 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20  [1]=='$' ){.    
17c20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79   fprintf(out,"(y
17c30 79 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c  ypminor->yy%d)",
17c40 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20  sp->dtnum);.    
17c50 20 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74   cp++;.     cont
17c60 69 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66  inue;.   }.   if
17c70 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a  ( *cp=='\n' ) (*
17c80 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 66 70  lineno)++;.   fp
17c90 75 74 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d  utc(*cp,out);. }
17ca0 0a 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c  . fprintf(out,"\
17cb0 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n"); (*lineno)++
17cc0 3b 0a 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f  ;. if (!lemp->no
17cd0 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 20 0a  linenosflag) { .
17ce0 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20     (*lineno)++; 
17cf0 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74  tplt_linedir(out
17d00 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f  ,*lineno,lemp->o
17d10 75 74 6e 61 6d 65 29 3b 20 0a 20 7d 0a 20 66 70  utname); . }. fp
17d20 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29  rintf(out,"}\n")
17d30 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20  ; (*lineno)++;. 
17d40 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
17d50 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f   Return TRUE (no
17d60 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68 65 20 67  n-zero) if the g
17d70 69 76 65 6e 20 73 79 6d 62 6f 6c 20 68 61 73 20  iven symbol has 
17d80 61 20 64 65 73 74 72 75 63 74 6f 72 2e 0a 2a 2f  a destructor..*/
17d90 0a 69 6e 74 20 68 61 73 5f 64 65 73 74 72 75 63  .int has_destruc
17da0 74 6f 72 28 73 74 72 75 63 74 20 73 79 6d 62 6f  tor(struct symbo
17db0 6c 20 2a 73 70 2c 20 73 74 72 75 63 74 20 6c 65  l *sp, struct le
17dc0 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69  mon *lemp).{.  i
17dd0 6e 74 20 72 65 74 3b 0a 20 20 69 66 28 20 73 70  nt ret;.  if( sp
17de0 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
17df0 20 29 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65   ){.    ret = le
17e00 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 21 3d 30  mp->tokendest!=0
17e10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
17e20 65 74 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 64 65  et = lemp->varde
17e30 73 74 21 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73  st!=0 || sp->des
17e40 74 72 75 63 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a  tructor!=0;.  }.
17e50 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
17e60 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65  ./*.** Append te
17e70 78 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61  xt to a dynamica
17e80 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 74  lly allocated st
17e90 72 69 6e 67 2e 20 20 49 66 20 7a 54 65 78 74 20  ring.  If zText 
17ea0 69 73 20 30 20 74 68 65 6e 0a 2a 2a 20 72 65 73  is 0 then.** res
17eb0 65 74 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f  et the string to
17ec0 20 62 65 20 65 6d 70 74 79 20 61 67 61 69 6e 2e   be empty again.
17ed0 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
17ee0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
17ef0 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 69  t.** of the stri
17f00 6e 67 20 28 77 68 69 63 68 20 69 73 20 6f 76 65  ng (which is ove
17f10 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 65 61  rwritten with ea
17f20 63 68 20 63 61 6c 6c 29 2e 0a 2a 2a 0a 2a 2a 20  ch call)..**.** 
17f30 6e 20 62 79 74 65 73 20 6f 66 20 7a 54 65 78 74  n bytes of zText
17f40 20 61 72 65 20 73 74 6f 72 65 64 2e 20 20 49 66   are stored.  If
17f50 20 6e 3d 3d 30 20 74 68 65 6e 20 61 6c 6c 20 6f   n==0 then all o
17f60 66 20 7a 54 65 78 74 20 75 70 20 74 6f 20 74 68  f zText up to th
17f70 65 20 66 69 72 73 74 0a 2a 2a 20 5c 30 30 30 20  e first.** \000 
17f80 74 65 72 6d 69 6e 61 74 6f 72 20 69 73 20 73 74  terminator is st
17f90 6f 72 65 64 2e 20 20 7a 54 65 78 74 20 63 61 6e  ored.  zText can
17fa0 20 63 6f 6e 74 61 69 6e 20 75 70 20 74 6f 20 74   contain up to t
17fb0 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 0a  wo instances of.
17fc0 2a 2a 20 25 64 2e 20 20 54 68 65 20 76 61 6c 75  ** %d.  The valu
17fd0 65 73 20 6f 66 20 70 31 20 61 6e 64 20 70 32 20  es of p1 and p2 
17fe0 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
17ff0 20 74 68 65 20 66 69 72 73 74 20 61 6e 64 20 73   the first and s
18000 65 63 6f 6e 64 0a 2a 2a 20 25 64 2e 0a 2a 2a 0a  econd.** %d..**.
18010 2a 2a 20 49 66 20 6e 3d 3d 2d 31 2c 20 74 68 65  ** If n==-1, the
18020 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  n the previous c
18030 68 61 72 61 63 74 65 72 20 69 73 20 6f 76 65 72  haracter is over
18040 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 50 52 49 56  written..*/.PRIV
18050 41 54 45 20 63 68 61 72 20 2a 61 70 70 65 6e 64  ATE char *append
18060 5f 73 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20  _str(const char 
18070 2a 7a 54 65 78 74 2c 20 69 6e 74 20 6e 2c 20 69  *zText, int n, i
18080 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a  nt p1, int p2){.
18090 20 20 73 74 61 74 69 63 20 63 68 61 72 20 65 6d    static char em
180a0 70 74 79 5b 31 5d 20 3d 20 7b 20 30 20 7d 3b 0a  pty[1] = { 0 };.
180b0 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a    static char *z
180c0 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
180d0 6e 74 20 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a  nt alloced = 0;.
180e0 20 20 73 74 61 74 69 63 20 69 6e 74 20 75 73 65    static int use
180f0 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 3b 0a  d = 0;.  int c;.
18100 20 20 63 68 61 72 20 7a 49 6e 74 5b 34 30 5d 3b    char zInt[40];
18110 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30 20  .  if( zText==0 
18120 29 7b 0a 20 20 20 20 75 73 65 64 20 3d 20 30 3b  ){.    used = 0;
18130 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 3b 0a 20  .    return z;. 
18140 20 7d 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b   }.  if( n<=0 ){
18150 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a  .    if( n<0 ){.
18160 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6e 3b        used += n;
18170 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75  .      assert( u
18180 73 65 64 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  sed>=0 );.    }.
18190 20 20 20 20 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72      n = lemonStr
181a0 6c 65 6e 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a  len(zText);.  }.
181b0 20 20 69 66 28 20 28 69 6e 74 29 20 28 6e 2b 73    if( (int) (n+s
181c0 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 2b 75 73  izeof(zInt)*2+us
181d0 65 64 29 20 3e 3d 20 61 6c 6c 6f 63 65 64 20 29  ed) >= alloced )
181e0 7b 0a 20 20 20 20 61 6c 6c 6f 63 65 64 20 3d 20  {.    alloced = 
181f0 6e 20 2b 20 73 69 7a 65 6f 66 28 7a 49 6e 74 29  n + sizeof(zInt)
18200 2a 32 20 2b 20 75 73 65 64 20 2b 20 32 30 30 3b  *2 + used + 200;
18210 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a  .    z = (char *
18220 29 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20 61 6c  ) realloc(z,  al
18230 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20 69 66  loced);.  }.  if
18240 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( z==0 ) return 
18250 65 6d 70 74 79 3b 0a 20 20 77 68 69 6c 65 28 20  empty;.  while( 
18260 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 63  n-- > 0 ){.    c
18270 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b 0a 20   = *(zText++);. 
18280 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26     if( c=='%' &&
18290 20 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b 30 5d   n>0 && zText[0]
182a0 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20 20 73  =='d' ){.      s
182b0 70 72 69 6e 74 66 28 7a 49 6e 74 2c 20 22 25 64  printf(zInt, "%d
182c0 22 2c 20 70 31 29 3b 0a 20 20 20 20 20 20 70 31  ", p1);.      p1
182d0 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 73 74 72   = p2;.      str
182e0 63 70 79 28 26 7a 5b 75 73 65 64 5d 2c 20 7a 49  cpy(&z[used], zI
182f0 6e 74 29 3b 0a 20 20 20 20 20 20 75 73 65 64 20  nt);.      used 
18300 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 26  += lemonStrlen(&
18310 7a 5b 75 73 65 64 5d 29 3b 0a 20 20 20 20 20 20  z[used]);.      
18320 7a 54 65 78 74 2b 2b 3b 0a 20 20 20 20 20 20 6e  zText++;.      n
18330 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  --;.    }else{. 
18340 20 20 20 20 20 7a 5b 75 73 65 64 2b 2b 5d 20 3d       z[used++] =
18350 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   c;.    }.  }.  
18360 7a 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20 20 72  z[used] = 0;.  r
18370 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
18380 2a 20 7a 43 6f 64 65 20 69 73 20 61 20 73 74 72  * zCode is a str
18390 69 6e 67 20 74 68 61 74 20 69 73 20 74 68 65 20  ing that is the 
183a0 61 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  action associate
183b0 64 20 77 69 74 68 20 61 20 72 75 6c 65 2e 20 20  d with a rule.  
183c0 45 78 70 61 6e 64 0a 2a 2a 20 74 68 65 20 73 79  Expand.** the sy
183d0 6d 62 6f 6c 73 20 69 6e 20 74 68 69 73 20 73 74  mbols in this st
183e0 72 69 6e 67 20 73 6f 20 74 68 61 74 20 74 68 65  ring so that the
183f0 20 72 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e   refer to elemen
18400 74 73 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  ts of the parser
18410 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a 50 52  .** stack..*/.PR
18420 49 56 41 54 45 20 76 6f 69 64 20 74 72 61 6e 73  IVATE void trans
18430 6c 61 74 65 5f 63 6f 64 65 28 73 74 72 75 63 74  late_code(struct
18440 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74   lemon *lemp, st
18450 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a  ruct rule *rp){.
18460 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 78 70 3b    char *cp, *xp;
18470 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
18480 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 20 20 20   lhsused = 0;   
18490 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
184a0 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68 61 73 20  LHS element has 
184b0 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 63  been used */.  c
184c0 68 61 72 20 75 73 65 64 5b 4d 41 58 52 48 53 5d  har used[MAXRHS]
184d0 3b 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20  ;   /* True for 
184e0 65 61 63 68 20 52 48 53 20 65 6c 65 6d 65 6e 74  each RHS element
184f0 20 77 68 69 63 68 20 69 73 20 75 73 65 64 20 2a   which is used *
18500 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  /..  for(i=0; i<
18510 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75  rp->nrhs; i++) u
18520 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 6c 68  sed[i] = 0;.  lh
18530 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66  sused = 0;..  if
18540 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 7b  ( rp->code==0 ){
18550 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72  .    static char
18560 20 6e 65 77 6c 69 6e 65 73 74 72 5b 32 5d 20 3d   newlinestr[2] =
18570 20 7b 20 27 5c 6e 27 2c 20 27 5c 30 27 20 7d 3b   { '\n', '\0' };
18580 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20  .    rp->code = 
18590 6e 65 77 6c 69 6e 65 73 74 72 3b 0a 20 20 20 20  newlinestr;.    
185a0 72 70 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d 3e 72  rp->line = rp->r
185b0 75 6c 65 6c 69 6e 65 3b 0a 20 20 7d 0a 0a 20 20  uleline;.  }..  
185c0 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30  append_str(0,0,0
185d0 2c 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  ,0);..  /* This 
185e0 63 6f 6e 73 74 20 63 61 73 74 20 69 73 20 77 72  const cast is wr
185f0 6f 6e 67 20 62 75 74 20 68 61 72 6d 6c 65 73 73  ong but harmless
18600 2c 20 69 66 20 77 65 27 72 65 20 63 61 72 65 66  , if we're caref
18610 75 6c 2e 20 2a 2f 0a 20 20 66 6f 72 28 63 70 3d  ul. */.  for(cp=
18620 28 63 68 61 72 20 2a 29 72 70 2d 3e 63 6f 64 65  (char *)rp->code
18630 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20  ; *cp; cp++){.  
18640 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 2a 63    if( isalpha(*c
18650 70 29 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63  p) && (cp==rp->c
18660 6f 64 65 20 7c 7c 20 28 21 69 73 61 6c 6e 75 6d  ode || (!isalnum
18670 28 63 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d  (cp[-1]) && cp[-
18680 31 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20  1]!='_')) ){.   
18690 20 20 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20     char saved;. 
186a0 20 20 20 20 20 66 6f 72 28 78 70 3d 20 26 63 70       for(xp= &cp
186b0 5b 31 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a 78 70  [1]; isalnum(*xp
186c0 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20 78  ) || *xp=='_'; x
186d0 70 2b 2b 29 3b 0a 20 20 20 20 20 20 73 61 76 65  p++);.      save
186e0 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20 2a  d = *xp;.      *
186f0 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  xp = 0;.      if
18700 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26  ( rp->lhsalias &
18710 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e  & strcmp(cp,rp->
18720 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a  lhsalias)==0 ){.
18730 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73          append_s
18740 74 72 28 22 79 79 67 6f 74 6f 6d 69 6e 6f 72 2e  tr("yygotominor.
18750 79 79 25 64 22 2c 30 2c 72 70 2d 3e 6c 68 73 2d  yy%d",0,rp->lhs-
18760 3e 64 74 6e 75 6d 2c 30 29 3b 0a 20 20 20 20 20  >dtnum,0);.     
18770 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20     cp = xp;.    
18780 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20 31 3b      lhsused = 1;
18790 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
187a0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
187b0 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
187c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
187d0 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26  p->rhsalias[i] &
187e0 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e  & strcmp(cp,rp->
187f0 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20  rhsalias[i])==0 
18800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
18810 66 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64 65 20  f( cp!=rp->code 
18820 26 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27 20 29  && cp[-1]=='@' )
18830 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
18840 2f 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d 65  /* If the argume
18850 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
18860 6d 20 40 58 20 74 68 65 6e 20 73 75 62 73 74 69  m @X then substi
18870 74 75 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  tuted.          
18880 20 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b 65 6e      ** the token
18890 20 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20 6e 6f   number of X, no
188a0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 58  t the value of X
188b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
188c0 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79    append_str("yy
188d0 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22 2c 2d  msp[%d].major",-
188e0 31 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 30  1,i-rp->nrhs+1,0
188f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
18900 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
18910 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
18920 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b  l *sp = rp->rhs[
18930 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
18940 20 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20 20 20    int dtnum;.   
18950 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
18960 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
18970 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
18980 20 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20            dtnum 
18990 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d  = sp->subsym[0]-
189a0 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  >dtnum;.        
189b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
189c0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e               dtn
189d0 75 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d 3b 0a  um = sp->dtnum;.
189e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
189f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
18a00 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73 70 5b  pend_str("yymsp[
18a10 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c  %d].minor.yy%d",
18a20 30 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 20  0,i-rp->nrhs+1, 
18a30 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  dtnum);.        
18a40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
18a50 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20    cp = xp;.     
18a60 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d         used[i] =
18a70 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
18a80 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
18a90 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
18aa0 20 20 20 7d 0a 20 20 20 20 20 20 2a 78 70 20 3d     }.      *xp =
18ab0 20 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a 20 20   saved;.    }.  
18ac0 20 20 61 70 70 65 6e 64 5f 73 74 72 28 63 70 2c    append_str(cp,
18ad0 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 20 2f   1, 0, 0);.  } /
18ae0 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  * End loop */.. 
18af0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   /* Check to mak
18b00 65 20 73 75 72 65 20 74 68 65 20 4c 48 53 20 68  e sure the LHS h
18b10 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a  as been used */.
18b20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69    if( rp->lhsali
18b30 61 73 20 26 26 20 21 6c 68 73 75 73 65 64 20 29  as && !lhsused )
18b40 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c  {.    ErrorMsg(l
18b50 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70  emp->filename,rp
18b60 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20  ->ruleline,.    
18b70 20 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c 22 20    "Label \"%s\" 
18b80 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69  for \"%s(%s)\" i
18b90 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a  s never used.",.
18ba0 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61          rp->lhsa
18bb0 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61  lias,rp->lhs->na
18bc0 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29  me,rp->lhsalias)
18bd0 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
18be0 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  rcnt++;.  }..  /
18bf0 2a 20 47 65 6e 65 72 61 74 65 20 64 65 73 74 72  * Generate destr
18c00 75 63 74 6f 72 20 63 6f 64 65 20 66 6f 72 20 52  uctor code for R
18c10 48 53 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68  HS symbols which
18c20 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
18c30 20 74 68 65 0a 20 20 2a 2a 20 72 65 64 75 63 65   the.  ** reduce
18c40 20 63 6f 64 65 20 2a 2f 0a 20 20 66 6f 72 28 69   code */.  for(i
18c50 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
18c60 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 70  i++){.    if( rp
18c70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26  ->rhsalias[i] &&
18c80 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20   !used[i] ){.   
18c90 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
18ca0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72  ->filename,rp->r
18cb0 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20  uleline,.       
18cc0 20 22 4c 61 62 65 6c 20 25 73 20 66 6f 72 20 5c   "Label %s for \
18cd0 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76  "%s(%s)\" is nev
18ce0 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20  er used.",.     
18cf0 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b     rp->rhsalias[
18d00 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e  i],rp->rhs[i]->n
18d10 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  ame,rp->rhsalias
18d20 5b 69 5d 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70  [i]);.      lemp
18d30 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
18d40 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70 2d 3e    }else if( rp->
18d50 72 68 73 61 6c 69 61 73 5b 69 5d 3d 3d 30 20 29  rhsalias[i]==0 )
18d60 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 5f  {.      if( has_
18d70 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d 3e 72  destructor(rp->r
18d80 68 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20  hs[i],lemp) ){. 
18d90 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74         append_st
18da0 72 28 22 20 20 79 79 5f 64 65 73 74 72 75 63 74  r("  yy_destruct
18db0 6f 72 28 79 79 70 50 61 72 73 65 72 2c 25 64 2c  or(yypParser,%d,
18dc0 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72  &yymsp[%d].minor
18dd0 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20  );\n", 0,.      
18de0 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d       rp->rhs[i]-
18df0 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72 68  >index,i-rp->nrh
18e00 73 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  s+1);.      }els
18e10 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  e{.        /* No
18e20 20 64 65 73 74 72 75 63 74 6f 72 20 64 65 66 69   destructor defi
18e30 6e 65 64 20 66 6f 72 20 74 68 69 73 20 74 65 72  ned for this ter
18e40 6d 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  m */.      }.   
18e50 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 70 2d   }.  }.  if( rp-
18e60 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 70 20  >code ){.    cp 
18e70 3d 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30  = append_str(0,0
18e80 2c 30 2c 30 29 3b 0a 20 20 20 20 72 70 2d 3e 63  ,0,0);.    rp->c
18e90 6f 64 65 20 3d 20 53 74 72 73 61 66 65 28 63 70  ode = Strsafe(cp
18ea0 3f 63 70 3a 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  ?cp:"");.  }.}..
18eb0 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  /* .** Generate 
18ec0 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
18ed0 74 65 73 20 77 68 65 6e 20 74 68 65 20 72 75 6c  tes when the rul
18ee0 65 20 22 72 70 22 20 69 73 20 72 65 64 75 63 65  e "rp" is reduce
18ef0 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65  d.  Write.** the
18f00 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22 2e 20   code to "out". 
18f10 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e 65 6e   Make sure linen
18f20 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d 64 61  o stays up-to-da
18f30 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  te..*/.PRIVATE v
18f40 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28 0a 20  oid emit_code(. 
18f50 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20 20 73 74   FILE *out,.  st
18f60 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 0a 20  ruct rule *rp,. 
18f70 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c   struct lemon *l
18f80 65 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e 65  emp,.  int *line
18f90 6e 6f 0a 29 7b 0a 20 63 6f 6e 73 74 20 63 68 61  no.){. const cha
18fa0 72 20 2a 63 70 3b 0a 0a 20 2f 2a 20 47 65 6e 65  r *cp;.. /* Gene
18fb0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f 20  rate code to do 
18fc0 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f  the reduce actio
18fd0 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f  n */. if( rp->co
18fe0 64 65 20 29 7b 0a 20 20 20 69 66 20 28 21 6c 65  de ){.   if (!le
18ff0 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  mp->nolinenosfla
19000 67 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  g) { (*lineno)++
19010 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f  ; tplt_linedir(o
19020 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70  ut,rp->line,lemp
19030 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 20 7d 0a 20  ->filename); }. 
19040 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b    fprintf(out,"{
19050 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 0a 20  %s",rp->code);. 
19060 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64    for(cp=rp->cod
19070 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20  e; *cp; cp++){. 
19080 20 20 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e      if( *cp=='\n
19090 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ' ) (*lineno)++;
190a0 0a 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f  .   } /* End loo
190b0 70 20 2a 2f 0a 20 20 20 66 70 72 69 6e 74 66 28  p */.   fprintf(
190c0 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69  out,"}\n"); (*li
190d0 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 20 28  neno)++;.   if (
190e0 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73  !lemp->nolinenos
190f0 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f  flag) { (*lineno
19100 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69  )++; tplt_linedi
19110 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65  r(out,*lineno,le
19120 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 7d 0a  mp->outname); }.
19130 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 72 70   } /* End if( rp
19140 2d 3e 63 6f 64 65 20 29 20 2a 2f 0a 0a 20 72 65  ->code ) */.. re
19150 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  turn;.}../*.** P
19160 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e 69 74  rint the definit
19170 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f 6e  ion of the union
19180 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 70 61   used for the pa
19190 72 73 65 72 27 73 20 64 61 74 61 20 73 74 61 63  rser's data stac
191a0 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f 6e  k..** This union
191b0 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64 73   contains fields
191c0 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69   for every possi
191d0 62 6c 65 20 64 61 74 61 20 74 79 70 65 20 66 6f  ble data type fo
191e0 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20  r tokens.** and 
191f0 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20 49  nonterminals.  I
19200 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  n the process of
19210 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20 70   computing and p
19220 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a 20  rinting this.** 
19230 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74 20  union, also set 
19240 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65  the ".dtnum" fie
19250 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65 72 6d  ld of every term
19260 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d  inal and nonterm
19270 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a  inal.** symbol..
19280 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73 74  */.void print_st
19290 61 63 6b 5f 75 6e 69 6f 6e 28 0a 20 20 46 49 4c  ack_union(.  FIL
192a0 45 20 2a 6f 75 74 2c 20 20 20 20 20 20 20 20 20  E *out,         
192b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
192c0 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20 2a 2f  output stream */
192d0 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
192e0 2a 6c 65 6d 70 2c 20 20 20 20 20 20 20 20 20 2f  *lemp,         /
192f0 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66 6f 20  * The main info 
19300 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
19310 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 69  is parser */.  i
19320 6e 74 20 2a 70 6c 69 6e 65 6e 6f 2c 20 20 20 20  nt *plineno,    
19330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
19340 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 69 6e  inter to the lin
19350 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
19360 74 20 6d 68 66 6c 61 67 20 20 20 20 20 20 20 20  t mhflag        
19370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
19380 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e 67 20  e if generating 
19390 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75 74 70  makeheaders outp
193a0 75 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6c  ut */.){.  int l
193b0 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f  ineno = *plineno
193c0 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65  ;    /* The line
193d0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6f   number of the o
193e0 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61 72 20  utput */.  char 
193f0 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20 20 20  **types;        
19400 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68 20 74       /* A hash t
19410 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65  able of datatype
19420 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61 79  s */.  int array
19430 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
19440 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
19450 22 74 79 70 65 73 22 20 61 72 72 61 79 20 2a 2f  "types" array */
19460 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65 6e 67  .  int maxdtleng
19470 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  th;          /* 
19480 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f  Maximum length o
19490 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79 70 65  f any ".datatype
194a0 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 63 68  " field. */.  ch
194b0 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20 20 20  ar *stddt;      
194c0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 6e 64          /* Stand
194d0 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66 6f 72  ardized name for
194e0 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f 0a 20   a datatype */. 
194f0 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20 20 20   int i,j;       
19500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
19510 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
19520 20 69 6e 74 20 68 61 73 68 3b 20 20 20 20 20 20   int hash;      
19530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
19540 72 20 68 61 73 68 69 6e 67 20 74 68 65 20 6e 61  r hashing the na
19550 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a 2f 0a  me of a type */.
19560 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61    const char *na
19570 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  me;         /* N
19580 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72 73 65  ame of the parse
19590 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  r */..  /* Alloc
195a0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
195b0 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64 20 61  ze types[] and a
195c0 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b 5d 20  llocate stddt[] 
195d0 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65 20 3d  */.  arraysize =
195e0 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a   lemp->nsymbol *
195f0 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20 28 63   2;.  types = (c
19600 68 61 72 2a 2a 29 63 61 6c 6c 6f 63 28 20 61 72  har**)calloc( ar
19610 72 61 79 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28  raysize, sizeof(
19620 63 68 61 72 2a 29 20 29 3b 0a 20 20 69 66 28 20  char*) );.  if( 
19630 74 79 70 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  types==0 ){.    
19640 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
19650 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e  Out of memory.\n
19660 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
19670 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
19680 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b  i<arraysize; i++
19690 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30 3b 0a  ) types[i] = 0;.
196a0 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20    maxdtlength = 
196b0 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76  0;.  if( lemp->v
196c0 61 72 74 79 70 65 20 29 7b 0a 20 20 20 20 6d 61  artype ){.    ma
196d0 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6d 6f  xdtlength = lemo
196e0 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61  nStrlen(lemp->va
196f0 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  rtype);.  }.  fo
19700 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
19710 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
19720 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 73    int len;.    s
19730 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
19740 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
19750 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d  [i];.    if( sp-
19760 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29 20 63  >datatype==0 ) c
19770 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c 65 6e  ontinue;.    len
19780 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73   = lemonStrlen(s
19790 70 2d 3e 64 61 74 61 74 79 70 65 29 3b 0a 20 20  p->datatype);.  
197a0 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 64 74 6c    if( len>maxdtl
197b0 65 6e 67 74 68 20 29 20 6d 61 78 64 74 6c 65 6e  ength ) maxdtlen
197c0 67 74 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20  gth = len;.  }. 
197d0 20 73 74 64 64 74 20 3d 20 28 63 68 61 72 2a 29   stddt = (char*)
197e0 6d 61 6c 6c 6f 63 28 20 6d 61 78 64 74 6c 65 6e  malloc( maxdtlen
197f0 67 74 68 2a 32 20 2b 20 31 20 29 3b 0a 20 20 69  gth*2 + 1 );.  i
19800 66 28 20 73 74 64 64 74 3d 3d 30 20 29 7b 0a 20  f( stddt==0 ){. 
19810 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
19820 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
19830 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  .\n");.    exit(
19840 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75  1);.  }..  /* Bu
19850 69 6c 64 20 61 20 68 61 73 68 20 74 61 62 6c 65  ild a hash table
19860 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20 54   of datatypes. T
19870 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c  he ".dtnum" fiel
19880 64 20 6f 66 20 65 61 63 68 20 73 79 6d 62 6f 6c  d of each symbol
19890 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20  .  ** is filled 
198a0 69 6e 20 77 69 74 68 20 74 68 65 20 68 61 73 68  in with the hash
198b0 20 69 6e 64 65 78 20 70 6c 75 73 20 31 2e 20 20   index plus 1.  
198c0 41 20 22 2e 64 74 6e 75 6d 22 20 76 61 6c 75 65  A ".dtnum" value
198d0 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a 20 75 73   of 0 is.  ** us
198e0 65 64 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 20  ed for terminal 
198f0 73 79 6d 62 6f 6c 73 2e 20 20 49 66 20 74 68 65  symbols.  If the
19900 72 65 20 69 73 20 6e 6f 20 25 64 65 66 61 75 6c  re is no %defaul
19910 74 5f 74 79 70 65 20 64 65 66 69 6e 65 64 20 74  t_type defined t
19920 68 65 6e 0a 20 20 2a 2a 20 30 20 69 73 20 61 6c  hen.  ** 0 is al
19930 73 6f 20 75 73 65 64 20 61 73 20 74 68 65 20 2e  so used as the .
19940 64 74 6e 75 6d 20 76 61 6c 75 65 20 66 6f 72 20  dtnum value for 
19950 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69  nonterminals whi
19960 63 68 20 64 6f 20 6e 6f 74 20 73 70 65 63 69 66  ch do not specif
19970 79 0a 20 20 2a 2a 20 61 20 64 61 74 61 74 79 70  y.  ** a datatyp
19980 65 20 75 73 69 6e 67 20 74 68 65 20 25 74 79 70  e using the %typ
19990 65 20 64 69 72 65 63 74 69 76 65 2e 0a 20 20 2a  e directive..  *
199a0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
199b0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
199c0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73  +){.    struct s
199d0 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
199e0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
199f0 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 20 20    char *cp;.    
19a00 69 66 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e 65 72  if( sp==lemp->er
19a10 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 73 70  rsym ){.      sp
19a20 2d 3e 64 74 6e 75 6d 20 3d 20 61 72 72 61 79 73  ->dtnum = arrays
19a30 69 7a 65 2b 31 3b 0a 20 20 20 20 20 20 63 6f 6e  ize+1;.      con
19a40 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
19a50 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21 3d 4e   if( sp->type!=N
19a60 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 28 73  ONTERMINAL || (s
19a70 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 26  p->datatype==0 &
19a80 26 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3d  & lemp->vartype=
19a90 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 70 2d  =0) ){.      sp-
19aa0 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20  >dtnum = 0;.    
19ab0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
19ac0 7d 0a 20 20 20 20 63 70 20 3d 20 73 70 2d 3e 64  }.    cp = sp->d
19ad0 61 74 61 74 79 70 65 3b 0a 20 20 20 20 69 66 28  atatype;.    if(
19ae0 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20 6c 65   cp==0 ) cp = le
19af0 6d 70 2d 3e 76 61 72 74 79 70 65 3b 0a 20 20 20  mp->vartype;.   
19b00 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c   j = 0;.    whil
19b10 65 28 20 69 73 73 70 61 63 65 28 2a 63 70 29 20  e( isspace(*cp) 
19b20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c  ) cp++;.    whil
19b30 65 28 20 2a 63 70 20 29 20 73 74 64 64 74 5b 6a  e( *cp ) stddt[j
19b40 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20 20 20  ++] = *cp++;.   
19b50 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 69   while( j>0 && i
19b60 73 73 70 61 63 65 28 73 74 64 64 74 5b 6a 2d 31  sspace(stddt[j-1
19b70 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 73 74  ]) ) j--;.    st
19b80 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  ddt[j] = 0;.    
19b90 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74  if( lemp->tokent
19ba0 79 70 65 20 26 26 20 73 74 72 63 6d 70 28 73 74  ype && strcmp(st
19bb0 64 64 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  ddt, lemp->token
19bc0 74 79 70 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  type)==0 ){.    
19bd0 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b    sp->dtnum = 0;
19be0 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
19bf0 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20  .    }.    hash 
19c00 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  = 0;.    for(j=0
19c10 3b 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29  ; stddt[j]; j++)
19c20 7b 0a 20 20 20 20 20 20 68 61 73 68 20 3d 20 68  {.      hash = h
19c30 61 73 68 2a 35 33 20 2b 20 73 74 64 64 74 5b 6a  ash*53 + stddt[j
19c40 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73  ];.    }.    has
19c50 68 20 3d 20 28 68 61 73 68 20 26 20 30 78 37 66  h = (hash & 0x7f
19c60 66 66 66 66 66 66 29 25 61 72 72 61 79 73 69 7a  ffffff)%arraysiz
19c70 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 74 79  e;.    while( ty
19c80 70 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20 20 20  pes[hash] ){.   
19c90 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 74 79     if( strcmp(ty
19ca0 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29  pes[hash],stddt)
19cb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
19cc0 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20  p->dtnum = hash 
19cd0 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  + 1;.        bre
19ce0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
19cf0 20 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20 20 20    hash++;.      
19d00 69 66 28 20 68 61 73 68 3e 3d 61 72 72 61 79 73  if( hash>=arrays
19d10 69 7a 65 20 29 20 68 61 73 68 20 3d 20 30 3b 0a  ize ) hash = 0;.
19d20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 79      }.    if( ty
19d30 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a  pes[hash]==0 ){.
19d40 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20        sp->dtnum 
19d50 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20 20 20  = hash + 1;.    
19d60 20 20 74 79 70 65 73 5b 68 61 73 68 5d 20 3d 20    types[hash] = 
19d70 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6c  (char*)malloc( l
19d80 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 74 64 64 74  emonStrlen(stddt
19d90 29 2b 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  )+1 );.      if(
19da0 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20   types[hash]==0 
19db0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
19dc0 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f  tf(stderr,"Out o
19dd0 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20  f memory.\n");. 
19de0 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a         exit(1);.
19df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
19e00 72 63 70 79 28 74 79 70 65 73 5b 68 61 73 68 5d  rcpy(types[hash]
19e10 2c 73 74 64 64 74 29 3b 0a 20 20 20 20 7d 0a 20  ,stddt);.    }. 
19e20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74 20 6f   }..  /* Print o
19e30 75 74 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ut the definitio
19e40 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54 59 50 45  n of YYTOKENTYPE
19e50 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54 59 50 45   and YYMINORTYPE
19e60 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d   */.  name = lem
19e70 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e  p->name ? lemp->
19e80 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a  name : "Parse";.
19e90 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e    lineno = *plin
19ea0 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61  eno;.  if( mhfla
19eb0 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74  g ){ fprintf(out
19ec0 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c  ,"#if INTERFACE\
19ed0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d  n"); lineno++; }
19ee0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
19ef0 23 64 65 66 69 6e 65 20 25 73 54 4f 4b 45 4e 54  #define %sTOKENT
19f00 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d 65 2c 0a  YPE %s\n",name,.
19f10 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74      lemp->tokent
19f20 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74  ype?lemp->tokent
19f30 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b 20 20 6c  ype:"void*");  l
19f40 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d  ineno++;.  if( m
19f50 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66  hflag ){ fprintf
19f60 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29  (out,"#endif\n")
19f70 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20  ; lineno++; }.  
19f80 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 74 79 70  fprintf(out,"typ
19f90 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e 22 29  edef union {\n")
19fa0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
19fb0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e 74  rintf(out,"  int
19fc0 20 79 79 69 6e 69 74 3b 5c 6e 22 29 3b 20 6c 69   yyinit;\n"); li
19fd0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
19fe0 66 28 6f 75 74 2c 22 20 20 25 73 54 4f 4b 45 4e  f(out,"  %sTOKEN
19ff0 54 59 50 45 20 79 79 30 3b 5c 6e 22 2c 6e 61 6d  TYPE yy0;\n",nam
1a000 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1a010 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79  for(i=0; i<array
1a020 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  size; i++){.    
1a030 69 66 28 20 74 79 70 65 73 5b 69 5d 3d 3d 30 20  if( types[i]==0 
1a040 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1a050 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25  fprintf(out,"  %
1a060 73 20 79 79 25 64 3b 5c 6e 22 2c 74 79 70 65 73  s yy%d;\n",types
1a070 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f  [i],i+1); lineno
1a080 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 74 79 70  ++;.    free(typ
1a090 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66  es[i]);.  }.  if
1a0a0 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e  ( lemp->errsym->
1a0b0 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70  useCnt ){.    fp
1a0c0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e 74  rintf(out,"  int
1a0d0 20 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e   yy%d;\n",lemp->
1a0e0 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20  errsym->dtnum); 
1a0f0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1a100 66 72 65 65 28 73 74 64 64 74 29 3b 0a 20 20 66  free(stddt);.  f
1a110 72 65 65 28 74 79 70 65 73 29 3b 0a 20 20 66 70  ree(types);.  fp
1a120 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20 59 59 4d  rintf(out,"} YYM
1a130 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29 3b 20 6c  INORTYPE;\n"); l
1a140 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c 69 6e  ineno++;.  *plin
1a150 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 7d 0a  eno = lineno;.}.
1a160 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1a170 65 20 6e 61 6d 65 20 6f 66 20 61 20 43 20 64 61  e name of a C da
1a180 74 61 74 79 70 65 20 61 62 6c 65 20 74 6f 20 72  tatype able to r
1a190 65 70 72 65 73 65 6e 74 20 76 61 6c 75 65 73 20  epresent values 
1a1a0 62 65 74 77 65 65 6e 0a 2a 2a 20 6c 77 72 20 61  between.** lwr a
1a1b0 6e 64 20 75 70 72 2c 20 69 6e 63 6c 75 73 69 76  nd upr, inclusiv
1a1c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e..*/.static con
1a1d0 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d 75 6d  st char *minimum
1a1e0 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74 20 6c  _size_type(int l
1a1f0 77 72 2c 20 69 6e 74 20 75 70 72 29 7b 0a 20 20  wr, int upr){.  
1a200 69 66 28 20 6c 77 72 3e 3d 30 20 29 7b 0a 20 20  if( lwr>=0 ){.  
1a210 20 20 69 66 28 20 75 70 72 3c 3d 32 35 35 20 29    if( upr<=255 )
1a220 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22  {.      return "
1a230 75 6e 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a  unsigned char";.
1a240 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75 70      }else if( up
1a250 72 3c 36 35 35 33 35 20 29 7b 0a 20 20 20 20 20  r<65535 ){.     
1a260 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65   return "unsigne
1a270 64 20 73 68 6f 72 74 20 69 6e 74 22 3b 0a 20 20  d short int";.  
1a280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1a290 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65 64 20  eturn "unsigned 
1a2a0 69 6e 74 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  int";.    }.  }e
1a2b0 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d 31 32  lse if( lwr>=-12
1a2c0 37 20 26 26 20 75 70 72 3c 3d 31 32 37 20 29 7b  7 && upr<=127 ){
1a2d0 0a 20 20 20 20 72 65 74 75 72 6e 20 22 73 69 67  .    return "sig
1a2e0 6e 65 64 20 63 68 61 72 22 3b 0a 20 20 7d 65 6c  ned char";.  }el
1a2f0 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d 33 32 37  se if( lwr>=-327
1a300 36 37 20 26 26 20 75 70 72 3c 33 32 37 36 37 20  67 && upr<32767 
1a310 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 73  ){.    return "s
1a320 68 6f 72 74 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  hort";.  }else{.
1a330 20 20 20 20 72 65 74 75 72 6e 20 22 69 6e 74 22      return "int"
1a340 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  ;.  }.}../*.** E
1a350 61 63 68 20 73 74 61 74 65 20 63 6f 6e 74 61 69  ach state contai
1a360 6e 73 20 61 20 73 65 74 20 6f 66 20 74 6f 6b 65  ns a set of toke
1a370 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  n transaction an
1a380 64 20 61 20 73 65 74 20 6f 66 0a 2a 2a 20 6e 6f  d a set of.** no
1a390 6e 74 65 72 6d 69 6e 61 6c 20 74 72 61 6e 73 61  nterminal transa
1a3a0 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 6f 66  ctions.  Each of
1a3b0 20 74 68 65 73 65 20 73 65 74 73 20 6d 61 6b 65   these sets make
1a3c0 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a 2a  s an instance.**
1a3d0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1a3e0 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 41 6e  g structure.  An
1a3f0 20 61 72 72 61 79 20 6f 66 20 74 68 65 73 65 20   array of these 
1a400 73 74 72 75 63 74 75 72 65 73 20 69 73 20 75 73  structures is us
1a410 65 64 0a 2a 2a 20 74 6f 20 6f 72 64 65 72 20 74  ed.** to order t
1a420 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 65  he creation of e
1a430 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 79 79  ntries in the yy
1a440 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e  _action[] table.
1a450 0a 2a 2f 0a 73 74 72 75 63 74 20 61 78 73 65 74  .*/.struct axset
1a460 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74   {.  struct stat
1a470 65 20 2a 73 74 70 3b 20 20 20 2f 2a 20 41 20 70  e *stp;   /* A p
1a480 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74  ointer to a stat
1a490 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 6b 6e  e */.  int isTkn
1a4a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
1a4b0 72 75 65 20 74 6f 20 75 73 65 20 74 6f 6b 65 6e  rue to use token
1a4c0 73 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6e 6f  s.  False for no
1a4d0 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20  n-terminals */. 
1a4e0 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20 20   int nAction;   
1a4f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1a500 6f 66 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  of actions */.  
1a510 69 6e 74 20 69 4f 72 64 65 72 3b 20 20 20 20 20  int iOrder;     
1a520 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
1a530 20 6f 72 64 65 72 20 6f 66 20 61 63 74 69 6f 6e   order of action
1a540 20 73 65 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   sets */.};../*.
1a550 2a 2a 20 43 6f 6d 70 61 72 65 20 74 6f 20 61 78  ** Compare to ax
1a560 73 65 74 20 73 74 72 75 63 74 75 72 65 73 20 66  set structures f
1a570 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f  or sorting purpo
1a580 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ses.*/.static in
1a590 74 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 28  t axset_compare(
1a5a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63  const void *a, c
1a5b0 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20  onst void *b){. 
1a5c0 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 70   struct axset *p
1a5d0 31 20 3d 20 28 73 74 72 75 63 74 20 61 78 73 65  1 = (struct axse
1a5e0 74 2a 29 61 3b 0a 20 20 73 74 72 75 63 74 20 61  t*)a;.  struct a
1a5f0 78 73 65 74 20 2a 70 32 20 3d 20 28 73 74 72 75  xset *p2 = (stru
1a600 63 74 20 61 78 73 65 74 2a 29 62 3b 0a 20 20 69  ct axset*)b;.  i
1a610 6e 74 20 63 3b 0a 20 20 63 20 3d 20 70 32 2d 3e  nt c;.  c = p2->
1a620 6e 41 63 74 69 6f 6e 20 2d 20 70 31 2d 3e 6e 41  nAction - p1->nA
1a630 63 74 69 6f 6e 3b 0a 20 20 69 66 28 20 63 3d 3d  ction;.  if( c==
1a640 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 70 32 2d  0 ){.    c = p2-
1a650 3e 69 4f 72 64 65 72 20 2d 20 70 31 2d 3e 69 4f  >iOrder - p1->iO
1a660 72 64 65 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rder;.  }.  asse
1a670 72 74 28 20 63 21 3d 30 20 7c 7c 20 70 31 3d 3d  rt( c!=0 || p1==
1a680 70 32 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  p2 );.  return c
1a690 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
1a6a0 20 74 65 78 74 20 6f 6e 20 22 6f 75 74 22 20 74   text on "out" t
1a6b0 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
1a6c0 65 20 72 75 6c 65 20 22 72 70 22 2e 0a 2a 2f 0a  e rule "rp"..*/.
1a6d0 73 74 61 74 69 63 20 76 6f 69 64 20 77 72 69 74  static void writ
1a6e0 65 52 75 6c 65 54 65 78 74 28 46 49 4c 45 20 2a  eRuleText(FILE *
1a6f0 6f 75 74 2c 20 73 74 72 75 63 74 20 72 75 6c 65  out, struct rule
1a700 20 2a 72 70 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a   *rp){.  int j;.
1a710 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
1a720 73 20 3a 3a 3d 22 2c 20 72 70 2d 3e 6c 68 73 2d  s ::=", rp->lhs-
1a730 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 6a 3d  >name);.  for(j=
1a740 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b 20 6a  0; j<rp->nrhs; j
1a750 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
1a760 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d  symbol *sp = rp-
1a770 3e 72 68 73 5b 6a 5d 3b 0a 20 20 20 20 66 70 72  >rhs[j];.    fpr
1a780 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 20  intf(out," %s", 
1a790 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69  sp->name);.    i
1a7a0 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c  f( sp->type==MUL
1a7b0 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
1a7c0 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
1a7d0 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 73 70 2d 3e   for(k=1; k<sp->
1a7e0 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20  nsubsym; k++){. 
1a7f0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1a800 75 74 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62  ut,"|%s",sp->sub
1a810 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  sym[k]->name);. 
1a820 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1a830 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  .}.../* Generate
1a840 20 43 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66   C source code f
1a850 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  or the parser */
1a860 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c  .void ReportTabl
1a870 65 28 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  e(.  struct lemo
1a880 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 6d  n *lemp,.  int m
1a890 68 66 6c 61 67 20 20 20 20 20 2f 2a 20 4f 75 74  hflag     /* Out
1a8a0 70 75 74 20 69 6e 20 6d 61 6b 65 68 65 61 64 65  put in makeheade
1a8b0 72 73 20 66 6f 72 6d 61 74 20 69 66 20 74 72 75  rs format if tru
1a8c0 65 20 2a 2f 0a 29 7b 0a 20 20 46 49 4c 45 20 2a  e */.){.  FILE *
1a8d0 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72  out, *in;.  char
1a8e0 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b   line[LINESIZE];
1a8f0 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e 6f 3b 0a  .  int  lineno;.
1a900 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
1a910 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63  stp;.  struct ac
1a920 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74 72 75  tion *ap;.  stru
1a930 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73  ct rule *rp;.  s
1a940 74 72 75 63 74 20 61 63 74 74 61 62 20 2a 70 41  truct acttab *pA
1a950 63 74 74 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  cttab;.  int i, 
1a960 6a 2c 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  j, n;.  const ch
1a970 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e 74 20  ar *name;.  int 
1a980 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e  mnTknOfst, mxTkn
1a990 4f 66 73 74 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74  Ofst;.  int mnNt
1a9a0 4f 66 73 74 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a  Ofst, mxNtOfst;.
1a9b0 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a    struct axset *
1a9c0 61 78 3b 0a 0a 20 20 69 6e 20 3d 20 74 70 6c 74  ax;..  in = tplt
1a9d0 5f 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a 20 20 69  _open(lemp);.  i
1a9e0 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72  f( in==0 ) retur
1a9f0 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f  n;.  out = file_
1aa00 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c 22  open(lemp,".c","
1aa10 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d  wb");.  if( out=
1aa20 3d 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65  =0 ){.    fclose
1aa30 28 69 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (in);.    return
1aa40 3b 0a 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d  ;.  }.  lineno =
1aa50 20 31 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28   1;.  tplt_xfer(
1aa60 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1aa70 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1aa80 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 69  * Generate the i
1aa90 6e 63 6c 75 64 65 20 63 6f 64 65 2c 20 69 66 20  nclude code, if 
1aaa0 61 6e 79 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  any */.  tplt_pr
1aab0 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
1aac0 70 2d 3e 69 6e 63 6c 75 64 65 2c 26 6c 69 6e 65  p->include,&line
1aad0 6e 6f 29 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61  no);.  if( mhfla
1aae0 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 6e  g ){.    char *n
1aaf0 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e  ame = file_maken
1ab00 61 6d 65 28 6c 65 6d 70 2c 20 22 2e 68 22 29 3b  ame(lemp, ".h");
1ab10 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1ab20 2c 22 23 69 6e 63 6c 75 64 65 20 5c 22 25 73 5c  ,"#include \"%s\
1ab30 22 5c 6e 22 2c 20 6e 61 6d 65 29 3b 20 6c 69 6e  "\n", name); lin
1ab40 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28  eno++;.    free(
1ab50 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 74 70 6c  name);.  }.  tpl
1ab60 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1ab70 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1ab80 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1ab90 65 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20 61  e #defines for a
1aba0 6c 6c 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69  ll tokens */.  i
1abb0 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20  f( mhflag ){.   
1abc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 65   const char *pre
1abd0 66 69 78 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  fix;.    fprintf
1abe0 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46  (out,"#if INTERF
1abf0 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ACE\n"); lineno+
1ac00 2b 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d  +;.    if( lemp-
1ac10 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20 70  >tokenprefix ) p
1ac20 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f  refix = lemp->to
1ac30 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 20 20 65  kenprefix;.    e
1ac40 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
1ac50 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20         prefix = 
1ac60 22 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  "";.    for(i=1;
1ac70 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   i<lemp->ntermin
1ac80 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
1ac90 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1aca0 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64  fine %s%-30s %2d
1acb0 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d  \n",prefix,lemp-
1acc0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d  >symbols[i]->nam
1acd0 65 2c 69 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65  e,i);.      line
1ace0 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no++;.    }.    
1acf0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e  fprintf(out,"#en
1ad00 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
1ad10 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
1ad20 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1ad30 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1ad40 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
1ad50 65 20 64 65 66 69 6e 65 73 20 2a 2f 0a 20 20 66  e defines */.  f
1ad60 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1ad70 69 6e 65 20 59 59 43 4f 44 45 54 59 50 45 20 25  ine YYCODETYPE %
1ad80 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75  s\n",.    minimu
1ad90 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c 20 6c  m_size_type(0, l
1ada0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 29 29  emp->nsymbol+1))
1adb0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1adc0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1add0 6e 65 20 59 59 4e 4f 43 4f 44 45 20 25 64 5c 6e  ne YYNOCODE %d\n
1ade0 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b  ",lemp->nsymbol+
1adf0 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  1);  lineno++;. 
1ae00 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1ae10 65 66 69 6e 65 20 59 59 41 43 54 49 4f 4e 54 59  efine YYACTIONTY
1ae20 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69  PE %s\n",.    mi
1ae30 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28  nimum_size_type(
1ae40 30 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b  0, lemp->nstate+
1ae50 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2b 35 29 29 3b  lemp->nrule+5));
1ae60 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66    lineno++;.  if
1ae70 28 20 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64  ( lemp->wildcard
1ae80 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1ae90 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 57  out,"#define YYW
1aea0 49 4c 44 43 41 52 44 20 25 64 5c 6e 22 2c 0a 20  ILDCARD %d\n",. 
1aeb0 20 20 20 20 20 20 6c 65 6d 70 2d 3e 77 69 6c 64        lemp->wild
1aec0 63 61 72 64 2d 3e 69 6e 64 65 78 29 3b 20 6c 69  card->index); li
1aed0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 70 72  neno++;.  }.  pr
1aee0 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28  int_stack_union(
1aef0 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f  out,lemp,&lineno
1af00 2c 6d 68 66 6c 61 67 29 3b 0a 20 20 66 70 72 69  ,mhflag);.  fpri
1af10 6e 74 66 28 6f 75 74 2c 20 22 23 69 66 6e 64 65  ntf(out, "#ifnde
1af20 66 20 59 59 53 54 41 43 4b 44 45 50 54 48 5c 6e  f YYSTACKDEPTH\n
1af30 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1af40 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73  if( lemp->stacks
1af50 69 7a 65 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ize ){.    fprin
1af60 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1af70 59 59 53 54 41 43 4b 44 45 50 54 48 20 25 73 5c  YYSTACKDEPTH %s\
1af80 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69  n",lemp->stacksi
1af90 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ze);  lineno++;.
1afa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
1afb0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1afc0 65 20 59 59 53 54 41 43 4b 44 45 50 54 48 20 31  e YYSTACKDEPTH 1
1afd0 30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b  00\n");  lineno+
1afe0 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  +;.  }.  fprintf
1aff0 28 6f 75 74 2c 20 22 23 65 6e 64 69 66 5c 6e 22  (out, "#endif\n"
1b000 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69  ); lineno++;.  i
1b010 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20  f( mhflag ){.   
1b020 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
1b030 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b  f INTERFACE\n");
1b040 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1b050 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61   name = lemp->na
1b060 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20  me ? lemp->name 
1b070 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 69 66 28  : "Parse";.  if(
1b080 20 6c 65 6d 70 2d 3e 61 72 67 20 26 26 20 6c 65   lemp->arg && le
1b090 6d 70 2d 3e 61 72 67 5b 30 5d 20 29 7b 0a 20 20  mp->arg[0] ){.  
1b0a0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 20 3d    int i;.    i =
1b0b0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d   lemonStrlen(lem
1b0c0 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 77 68 69  p->arg);.    whi
1b0d0 6c 65 28 20 69 3e 3d 31 20 26 26 20 69 73 73 70  le( i>=1 && issp
1b0e0 61 63 65 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d  ace(lemp->arg[i-
1b0f0 31 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 77  1]) ) i--;.    w
1b100 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 28 69  hile( i>=1 && (i
1b110 73 61 6c 6e 75 6d 28 6c 65 6d 70 2d 3e 61 72 67  salnum(lemp->arg
1b120 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d 3e  [i-1]) || lemp->
1b130 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20 29  arg[i-1]=='_') )
1b140 20 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69 6e 74   i--;.    fprint
1b150 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1b160 73 41 52 47 5f 53 44 45 43 4c 20 25 73 3b 5c 6e  sARG_SDECL %s;\n
1b170 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67  ",name,lemp->arg
1b180 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1b190 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1b1a0 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45  define %sARG_PDE
1b1b0 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c 6c  CL ,%s\n",name,l
1b1c0 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65  emp->arg);  line
1b1d0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1b1e0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1b1f0 73 41 52 47 5f 46 45 54 43 48 20 25 73 20 3d 20  sARG_FETCH %s = 
1b200 79 79 70 50 61 72 73 65 72 2d 3e 25 73 5c 6e 22  yypParser->%s\n"
1b210 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b220 20 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72     name,lemp->ar
1b230 67 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29  g,&lemp->arg[i])
1b240 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1b250 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1b260 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f 52  efine %sARG_STOR
1b270 45 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73 20  E yypParser->%s 
1b280 3d 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  = %s\n",.       
1b290 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 26            name,&
1b2a0 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c 26 6c 65  lemp->arg[i],&le
1b2b0 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69  mp->arg[i]);  li
1b2c0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  neno++;.  }else{
1b2d0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1b2e0 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1b2f0 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20  SDECL\n",name); 
1b300 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1b310 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1b320 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43 4c 5c  ine %sARG_PDECL\
1b330 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e  n",name);  linen
1b340 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1b350 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1b360 41 52 47 5f 46 45 54 43 48 5c 6e 22 2c 6e 61 6d  ARG_FETCH\n",nam
1b370 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1b380 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1b390 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f  define %sARG_STO
1b3a0 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e  RE\n",name); lin
1b3b0 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  eno++;.  }.  if(
1b3c0 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 66   mhflag ){.    f
1b3d0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64  printf(out,"#end
1b3e0 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  if\n"); lineno++
1b3f0 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ;.  }.  fprintf(
1b400 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e  out,"#define YYN
1b410 53 54 41 54 45 20 25 64 5c 6e 22 2c 6c 65 6d 70  STATE %d\n",lemp
1b420 2d 3e 6e 73 74 61 74 65 29 3b 20 20 6c 69 6e 65  ->nstate);  line
1b430 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1b440 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e  out,"#define YYN
1b450 52 55 4c 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d  RULE %d\n",lemp-
1b460 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e 65 6e 6f  >nrule);  lineno
1b470 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ++;.  if( lemp->
1b480 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20 29  errsym->useCnt )
1b490 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1b4a0 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52 52  t,"#define YYERR
1b4b0 4f 52 53 59 4d 42 4f 4c 20 25 64 5c 6e 22 2c 6c  ORSYMBOL %d\n",l
1b4c0 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 69 6e 64  emp->errsym->ind
1b4d0 65 78 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ex);  lineno++;.
1b4e0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b4f0 22 23 64 65 66 69 6e 65 20 59 59 45 52 52 53 59  "#define YYERRSY
1b500 4d 44 54 20 79 79 25 64 5c 6e 22 2c 6c 65 6d 70  MDT yy%d\n",lemp
1b510 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29  ->errsym->dtnum)
1b520 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ;  lineno++;.  }
1b530 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73  .  if( lemp->has
1b540 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _fallback ){.   
1b550 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1b560 65 66 69 6e 65 20 59 59 46 41 4c 4c 42 41 43 4b  efine YYFALLBACK
1b570 20 31 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b   1\n");  lineno+
1b580 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
1b590 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1b5a0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1b5b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
1b5c0 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 61  e action table a
1b5d0 6e 64 20 69 74 73 20 61 73 73 6f 63 69 61 74 65  nd its associate
1b5e0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 79 79  s:.  **.  **  yy
1b5f0 5f 61 63 74 69 6f 6e 5b 5d 20 20 20 20 20 20 20  _action[]       
1b600 20 41 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   A single table 
1b610 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 61  containing all a
1b620 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79 79  ctions..  **  yy
1b630 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 20 20 20  _lookahead[]    
1b640 20 41 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e   A table contain
1b650 69 6e 67 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61  ing the lookahea
1b660 64 20 66 6f 72 20 65 61 63 68 20 65 6e 74 72 79  d for each entry
1b670 20 69 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   in.  **        
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 79 79 5f               yy_
1b690 61 63 74 69 6f 6e 2e 20 20 55 73 65 64 20 74 6f  action.  Used to
1b6a0 20 64 65 74 65 63 74 20 68 61 73 68 20 63 6f 6c   detect hash col
1b6b0 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79  lisions..  **  y
1b6c0 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 20  y_shift_ofst[]  
1b6d0 20 20 46 6f 72 20 65 61 63 68 20 73 74 61 74 65    For each state
1b6e0 2c 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74  , the offset int
1b6f0 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a  o yy_action for.
1b700 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1b710 20 20 20 20 20 20 20 20 20 73 68 69 66 74 69 6e           shiftin
1b720 67 20 74 65 72 6d 69 6e 61 6c 73 2e 0a 20 20 2a  g terminals..  *
1b730 2a 20 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73  *  yy_reduce_ofs
1b740 74 5b 5d 20 20 20 46 6f 72 20 65 61 63 68 20 73  t[]   For each s
1b750 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74  tate, the offset
1b760 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20   into yy_action 
1b770 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  for.  **        
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 69               shi
1b790 66 74 69 6e 67 20 6e 6f 6e 2d 74 65 72 6d 69 6e  fting non-termin
1b7a0 61 6c 73 20 61 66 74 65 72 20 61 20 72 65 64 75  als after a redu
1b7b0 63 65 2e 0a 20 20 2a 2a 20 20 79 79 5f 64 65 66  ce..  **  yy_def
1b7c0 61 75 6c 74 5b 5d 20 20 20 20 20 20 20 44 65 66  ault[]       Def
1b7d0 61 75 6c 74 20 61 63 74 69 6f 6e 20 66 6f 72 20  ault action for 
1b7e0 65 61 63 68 20 73 74 61 74 65 2e 0a 20 20 2a 2f  each state..  */
1b7f0 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
1b800 68 65 20 61 63 74 69 6f 6e 73 20 6f 6e 20 61 6c  he actions on al
1b810 6c 20 73 74 61 74 65 73 20 61 6e 64 20 63 6f 75  l states and cou
1b820 6e 74 20 74 68 65 6d 20 75 70 20 2a 2f 0a 20 20  nt them up */.  
1b830 61 78 20 3d 20 28 73 74 72 75 63 74 20 61 78 73  ax = (struct axs
1b840 65 74 20 2a 29 20 63 61 6c 6c 6f 63 28 6c 65 6d  et *) calloc(lem
1b850 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20 73 69 7a  p->nstate*2, siz
1b860 65 6f 66 28 61 78 5b 30 5d 29 29 3b 0a 20 20 69  eof(ax[0]));.  i
1b870 66 28 20 61 78 3d 3d 30 20 29 7b 0a 20 20 20 20  f( ax==0 ){.    
1b880 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
1b890 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22  malloc failed\n"
1b8a0 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
1b8b0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1b8c0 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
1b8d0 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
1b8e0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
1b8f0 20 20 20 20 61 78 5b 69 2a 32 5d 2e 73 74 70 20      ax[i*2].stp 
1b900 3d 20 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a  = stp;.    ax[i*
1b910 32 5d 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a 20 20  2].isTkn = 1;.  
1b920 20 20 61 78 5b 69 2a 32 5d 2e 6e 41 63 74 69 6f    ax[i*2].nActio
1b930 6e 20 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74  n = stp->nTknAct
1b940 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e  ;.    ax[i*2+1].
1b950 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61  stp = stp;.    a
1b960 78 5b 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e 20 3d  x[i*2+1].isTkn =
1b970 20 30 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31   0;.    ax[i*2+1
1b980 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d  ].nAction = stp-
1b990 3e 6e 4e 74 41 63 74 3b 0a 20 20 7d 0a 20 20 6d  >nNtAct;.  }.  m
1b9a0 78 54 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54 6b 6e  xTknOfst = mnTkn
1b9b0 4f 66 73 74 20 3d 20 30 3b 0a 20 20 6d 78 4e 74  Ofst = 0;.  mxNt
1b9c0 4f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20  Ofst = mnNtOfst 
1b9d0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  = 0;..  /* Compu
1b9e0 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  te the action ta
1b9f0 62 6c 65 2e 20 20 49 6e 20 6f 72 64 65 72 20 74  ble.  In order t
1ba00 6f 20 74 72 79 20 74 6f 20 6b 65 65 70 20 74 68  o try to keep th
1ba10 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 20 20  e size of the.  
1ba20 2a 2a 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  ** action table 
1ba30 74 6f 20 61 20 6d 69 6e 69 6d 75 6d 2c 20 74 68  to a minimum, th
1ba40 65 20 68 65 75 72 69 73 74 69 63 20 6f 66 20 70  e heuristic of p
1ba50 6c 61 63 69 6e 67 20 74 68 65 20 6c 61 72 67 65  lacing the large
1ba60 73 74 20 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 73  st action.  ** s
1ba70 65 74 73 20 66 69 72 73 74 20 69 73 20 75 73 65  ets first is use
1ba80 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
1ba90 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
1baa0 65 2a 32 3b 20 69 2b 2b 29 20 61 78 5b 69 5d 2e  e*2; i++) ax[i].
1bab0 69 4f 72 64 65 72 20 3d 20 69 3b 0a 20 20 71 73  iOrder = i;.  qs
1bac0 6f 72 74 28 61 78 2c 20 6c 65 6d 70 2d 3e 6e 73  ort(ax, lemp->ns
1bad0 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61  tate*2, sizeof(a
1bae0 78 5b 30 5d 29 2c 20 61 78 73 65 74 5f 63 6f 6d  x[0]), axset_com
1baf0 70 61 72 65 29 3b 0a 20 20 70 41 63 74 74 61 62  pare);.  pActtab
1bb00 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28   = acttab_alloc(
1bb10 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1bb20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 20 26  lemp->nstate*2 &
1bb30 26 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 3e  & ax[i].nAction>
1bb40 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  0; i++){.    stp
1bb50 20 3d 20 61 78 5b 69 5d 2e 73 74 70 3b 0a 20 20   = ax[i].stp;.  
1bb60 20 20 69 66 28 20 61 78 5b 69 5d 2e 69 73 54 6b    if( ax[i].isTk
1bb70 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 61  n ){.      for(a
1bb80 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
1bb90 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
1bba0 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b       int action;
1bbb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d  .        if( ap-
1bbc0 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d 70  >sp->index>=lemp
1bbd0 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f  ->nterminal ) co
1bbe0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1bbf0 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65  action = compute
1bc00 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70  _action(lemp, ap
1bc10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
1bc20 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e  ction<0 ) contin
1bc30 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74  ue;.        actt
1bc40 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61  ab_action(pActta
1bc50 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  b, ap->sp->index
1bc60 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  , action);.     
1bc70 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 54   }.      stp->iT
1bc80 6b 6e 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f  knOfst = acttab_
1bc90 69 6e 73 65 72 74 28 70 41 63 74 74 61 62 29 3b  insert(pActtab);
1bca0 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e  .      if( stp->
1bcb0 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b 6e 4f 66  iTknOfst<mnTknOf
1bcc0 73 74 20 29 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d  st ) mnTknOfst =
1bcd0 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a   stp->iTknOfst;.
1bce0 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69        if( stp->i
1bcf0 54 6b 6e 4f 66 73 74 3e 6d 78 54 6b 6e 4f 66 73  TknOfst>mxTknOfs
1bd00 74 20 29 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20  t ) mxTknOfst = 
1bd10 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20  stp->iTknOfst;. 
1bd20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bd30 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
1bd40 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
1bd50 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 63  {.        int ac
1bd60 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  tion;.        if
1bd70 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c  ( ap->sp->index<
1bd80 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
1bd90 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1bda0 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e      if( ap->sp->
1bdb0 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e 73 79  index==lemp->nsy
1bdc0 6d 62 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  mbol ) continue;
1bdd0 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 20  .        action 
1bde0 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e  = compute_action
1bdf0 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20  (lemp, ap);.    
1be00 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30      if( action<0
1be10 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1be20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63 74 69       acttab_acti
1be30 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70 2d 3e  on(pActtab, ap->
1be40 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f  sp->index, actio
1be50 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
1be60 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d    stp->iNtOfst =
1be70 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70   acttab_insert(p
1be80 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69  Acttab);.      i
1be90 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3c  f( stp->iNtOfst<
1bea0 6d 6e 4e 74 4f 66 73 74 20 29 20 6d 6e 4e 74 4f  mnNtOfst ) mnNtO
1beb0 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66  fst = stp->iNtOf
1bec0 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  st;.      if( st
1bed0 70 2d 3e 69 4e 74 4f 66 73 74 3e 6d 78 4e 74 4f  p->iNtOfst>mxNtO
1bee0 66 73 74 20 29 20 6d 78 4e 74 4f 66 73 74 20 3d  fst ) mxNtOfst =
1bef0 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20   stp->iNtOfst;. 
1bf00 20 20 20 7d 0a 20 20 7d 0a 20 20 66 72 65 65 28     }.  }.  free(
1bf10 61 78 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  ax);..  /* Outpu
1bf20 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20  t the yy_action 
1bf30 74 61 62 6c 65 20 2a 2f 0a 20 20 6e 20 3d 20 61  table */.  n = a
1bf40 63 74 74 61 62 5f 73 69 7a 65 28 70 41 63 74 74  cttab_size(pActt
1bf50 61 62 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  ab);.  fprintf(o
1bf60 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 41  ut,"#define YY_A
1bf70 43 54 54 41 42 5f 43 4f 55 4e 54 20 28 25 64 29  CTTAB_COUNT (%d)
1bf80 5c 6e 22 2c 20 6e 29 3b 20 6c 69 6e 65 6e 6f 2b  \n", n); lineno+
1bf90 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1bfa0 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59  ,"static const Y
1bfb0 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 61  YACTIONTYPE yy_a
1bfc0 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22 29 3b  ction[] = {\n");
1bfd0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72   lineno++;.  for
1bfe0 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
1bff0 29 7b 0a 20 20 20 20 69 6e 74 20 61 63 74 69 6f  ){.    int actio
1c000 6e 20 3d 20 61 63 74 74 61 62 5f 79 79 61 63 74  n = acttab_yyact
1c010 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 69 29 3b  ion(pActtab, i);
1c020 0a 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c  .    if( action<
1c030 30 20 29 20 61 63 74 69 6f 6e 20 3d 20 6c 65 6d  0 ) action = lem
1c040 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70  p->nstate + lemp
1c050 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b 0a 20 20 20  ->nrule + 2;.   
1c060 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69   if( j==0 ) fpri
1c070 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64  ntf(out," /* %5d
1c080 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66   */ ", i);.    f
1c090 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
1c0a0 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20  d,", action);.  
1c0b0 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d    if( j==9 || i=
1c0c0 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70  =n-1 ){.      fp
1c0d0 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
1c0e0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1c0f0 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c    j = 0;.    }el
1c100 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  se{.      j++;. 
1c110 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e     }.  }.  fprin
1c120 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b  tf(out, "};\n");
1c130 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a   lineno++;..  /*
1c140 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 6c   Output the yy_l
1c150 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c 65 20 2a  ookahead table *
1c160 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
1c170 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59  "static const YY
1c180 43 4f 44 45 54 59 50 45 20 79 79 5f 6c 6f 6f 6b  CODETYPE yy_look
1c190 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e 22 29 3b  ahead[] = {\n");
1c1a0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72   lineno++;.  for
1c1b0 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
1c1c0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61 20 3d 20  ){.    int la = 
1c1d0 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61 68 65  acttab_yylookahe
1c1e0 61 64 28 70 41 63 74 74 61 62 2c 20 69 29 3b 0a  ad(pActtab, i);.
1c1f0 20 20 20 20 69 66 28 20 6c 61 3c 30 20 29 20 6c      if( la<0 ) l
1c200 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  a = lemp->nsymbo
1c210 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20  l;.    if( j==0 
1c220 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20  ) fprintf(out," 
1c230 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b  /* %5d */ ", i);
1c240 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1c250 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61 29 3b 0a  , " %4d,", la);.
1c260 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
1c270 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
1c280 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
1c290 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1c2a0 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
1c2b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
1c2c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
1c2d0 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
1c2e0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
1c2f0 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79  /* Output the yy
1c300 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 74 61  _shift_ofst[] ta
1c310 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ble */.  fprintf
1c320 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
1c330 59 5f 53 48 49 46 54 5f 55 53 45 5f 44 46 4c 54  Y_SHIFT_USE_DFLT
1c340 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f   (%d)\n", mnTknO
1c350 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  fst-1); lineno++
1c360 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73  ;.  n = lemp->ns
1c370 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e  tate;.  while( n
1c380 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74  >0 && lemp->sort
1c390 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e 4f 66 73  ed[n-1]->iTknOfs
1c3a0 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e  t==NO_OFFSET ) n
1c3b0 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  --;.  fprintf(ou
1c3c0 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53  t, "#define YY_S
1c3d0 48 49 46 54 5f 43 4f 55 4e 54 20 28 25 64 29 5c  HIFT_COUNT (%d)\
1c3e0 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f  n", n-1); lineno
1c3f0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1c400 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53  t, "#define YY_S
1c410 48 49 46 54 5f 4d 49 4e 20 20 20 28 25 64 29 5c  HIFT_MIN   (%d)\
1c420 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 29 3b 20  n", mnTknOfst); 
1c430 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1c440 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1c450 65 20 59 59 5f 53 48 49 46 54 5f 4d 41 58 20 20  e YY_SHIFT_MAX  
1c460 20 28 25 64 29 5c 6e 22 2c 20 6d 78 54 6b 6e 4f   (%d)\n", mxTknO
1c470 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  fst); lineno++;.
1c480 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1c490 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73 20  static const %s 
1c4a0 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20  yy_shift_ofst[] 
1c4b0 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  = {\n", .       
1c4c0 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f     minimum_size_
1c4d0 74 79 70 65 28 6d 6e 54 6b 6e 4f 66 73 74 2d 31  type(mnTknOfst-1
1c4e0 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 29 3b 20 6c  , mxTknOfst)); l
1c4f0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69  ineno++;.  for(i
1c500 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
1c510 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20  .    int ofst;. 
1c520 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
1c530 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66  orted[i];.    of
1c540 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66  st = stp->iTknOf
1c550 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66 73 74  st;.    if( ofst
1c560 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66  ==NO_OFFSET ) of
1c570 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 2d  st = mnTknOfst -
1c580 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30   1;.    if( j==0
1c590 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
1c5a0 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
1c5b0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1c5c0 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66 73 74  t, " %4d,", ofst
1c5d0 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
1c5e0 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
1c5f0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1c600 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1c610 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
1c620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
1c630 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1c640 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
1c650 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1c660 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
1c670 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b   yy_reduce_ofst[
1c680 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72  ] table */.  fpr
1c690 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
1c6a0 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 55 53 45  ne YY_REDUCE_USE
1c6b0 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d  _DFLT (%d)\n", m
1c6c0 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65  nNtOfst-1); line
1c6d0 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70  no++;.  n = lemp
1c6e0 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68 69 6c  ->nstate;.  whil
1c6f0 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e  e( n>0 && lemp->
1c700 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 4e 74  sorted[n-1]->iNt
1c710 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  Ofst==NO_OFFSET 
1c720 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66  ) n--;.  fprintf
1c730 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
1c740 59 5f 52 45 44 55 43 45 5f 43 4f 55 4e 54 20 28  Y_REDUCE_COUNT (
1c750 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69  %d)\n", n-1); li
1c760 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1c770 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
1c780 59 59 5f 52 45 44 55 43 45 5f 4d 49 4e 20 20 20  YY_REDUCE_MIN   
1c790 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73  (%d)\n", mnNtOfs
1c7a0 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  t); lineno++;.  
1c7b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
1c7c0 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f  efine YY_REDUCE_
1c7d0 4d 41 58 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d  MAX   (%d)\n", m
1c7e0 78 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f  xNtOfst); lineno
1c7f0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1c800 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74  t, "static const
1c810 20 25 73 20 79 79 5f 72 65 64 75 63 65 5f 6f 66   %s yy_reduce_of
1c820 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20  st[] = {\n", .  
1c830 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f          minimum_
1c840 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e 74 4f 66  size_type(mnNtOf
1c850 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73 74 29 29  st-1, mxNtOfst))
1c860 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
1c870 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
1c880 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74  +){.    int ofst
1c890 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  ;.    stp = lemp
1c8a0 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
1c8b0 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74   ofst = stp->iNt
1c8c0 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66  Ofst;.    if( of
1c8d0 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20  st==NO_OFFSET ) 
1c8e0 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20  ofst = mnNtOfst 
1c8f0 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  - 1;.    if( j==
1c900 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
1c910 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
1c920 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1c930 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66 73  ut, " %4d,", ofs
1c940 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39  t);.    if( j==9
1c950 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20   || i==n-1 ){.  
1c960 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1c970 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   "\n"); lineno++
1c980 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20  ;.      j = 0;. 
1c990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c9a0 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  j++;.    }.  }. 
1c9b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d   fprintf(out, "}
1c9c0 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1c9d0 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
1c9e0 65 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f 6e  e default action
1c9f0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69   table */.  fpri
1ca00 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63  ntf(out, "static
1ca10 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e 54   const YYACTIONT
1ca20 59 50 45 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d  YPE yy_default[]
1ca30 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   = {\n"); lineno
1ca40 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e  ++;.  n = lemp->
1ca50 6e 73 74 61 74 65 3b 0a 20 20 66 6f 72 28 69 3d  nstate;.  for(i=
1ca60 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
1ca70 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
1ca80 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 69  sorted[i];.    i
1ca90 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74  f( j==0 ) fprint
1caa0 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a  f(out," /* %5d *
1cab0 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72  / ", i);.    fpr
1cac0 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c  intf(out, " %4d,
1cad0 22 2c 20 73 74 70 2d 3e 69 44 66 6c 74 29 3b 0a  ", stp->iDflt);.
1cae0 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
1caf0 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
1cb00 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
1cb10 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1cb20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
1cb30 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
1cb40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
1cb50 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
1cb60 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74  ); lineno++;.  t
1cb70 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1cb80 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1cb90 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1cba0 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f 66  ate the table of
1cbb0 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 73   fallback tokens
1cbc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d  ..  */.  if( lem
1cbd0 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20  p->has_fallback 
1cbe0 29 7b 0a 20 20 20 20 69 6e 74 20 6d 78 20 3d 20  ){.    int mx = 
1cbf0 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
1cc00 2d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  - 1;.    while( 
1cc10 6d 78 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 79  mx>0 && lemp->sy
1cc20 6d 62 6f 6c 73 5b 6d 78 5d 2d 3e 66 61 6c 6c 62  mbols[mx]->fallb
1cc30 61 63 6b 3d 3d 30 20 29 7b 20 6d 78 2d 2d 3b 20  ack==0 ){ mx--; 
1cc40 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
1cc50 3c 3d 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <=mx; i++){.    
1cc60 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1cc70 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  *p = lemp->symbo
1cc80 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ls[i];.      if(
1cc90 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20   p->fallback==0 
1cca0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1ccb0 74 66 28 6f 75 74 2c 20 22 20 20 20 20 30 2c 20  tf(out, "    0, 
1ccc0 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e 6f 74 68   /* %10s => noth
1ccd0 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 6e 61  ing */\n", p->na
1cce0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
1ccf0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1cd00 66 28 6f 75 74 2c 20 22 20 20 25 33 64 2c 20 20  f(out, "  %3d,  
1cd10 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73 20 2a 2f  /* %10s => %s */
1cd20 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b  \n", p->fallback
1cd30 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  ->index,.       
1cd40 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70 2d 3e 66     p->name, p->f
1cd50 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65 29 3b 0a  allback->name);.
1cd60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 69        }.      li
1cd70 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
1cd80 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
1cd90 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c 20 6f 75  mp->name, in, ou
1cda0 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  t, &lineno);..  
1cdb0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74 61  /* Generate a ta
1cdc0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
1cdd0 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65  he symbolic name
1cde0 20 6f 66 20 65 76 65 72 79 20 73 79 6d 62 6f 6c   of every symbol
1cdf0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
1ce00 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1ce10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69  ; i++){.    spri
1ce20 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25 73 5c 22  ntf(line,"\"%s\"
1ce30 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ,",lemp->symbols
1ce40 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [i]->name);.    
1ce50 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25  fprintf(out,"  %
1ce60 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a 20 20 20  -15s",line);.   
1ce70 20 69 66 28 20 28 69 26 33 29 3d 3d 33 20 29 7b   if( (i&3)==3 ){
1ce80 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e   fprintf(out,"\n
1ce90 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a  "); lineno++; }.
1cea0 20 20 7d 0a 20 20 69 66 28 20 28 69 26 33 29 21    }.  if( (i&3)!
1ceb0 3d 30 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75  =0 ){ fprintf(ou
1cec0 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  t,"\n"); lineno+
1ced0 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  +; }.  tplt_xfer
1cee0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1cef0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1cf00 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74 61  /* Generate a ta
1cf10 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ble containing a
1cf20 20 74 65 78 74 20 73 74 72 69 6e 67 20 74 68 61   text string tha
1cf30 74 20 64 65 73 63 72 69 62 65 73 20 65 76 65 72  t describes ever
1cf40 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69 6e 20 74  y.  ** rule in t
1cf50 68 65 20 72 75 6c 65 20 73 65 74 20 6f 66 20 74  he rule set of t
1cf60 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 54 68 69  he grammar.  Thi
1cf70 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
1cf80 20 75 73 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20   used.  ** when 
1cf90 74 72 61 63 69 6e 67 20 52 45 44 55 43 45 20 61  tracing REDUCE a
1cfa0 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  ctions..  */.  f
1cfb0 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d  or(i=0, rp=lemp-
1cfc0 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1cfd0 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  ->next, i++){.  
1cfe0 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e 69 6e    assert( rp->in
1cff0 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20 20 66 70  dex==i );.    fp
1d000 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
1d010 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29 3b 0a 20  3d */ \"", i);. 
1d020 20 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74     writeRuleText
1d030 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66  (out, rp);.    f
1d040 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 2c 5c  printf(out,"\",\
1d050 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1d060 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
1d070 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1d080 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1d090 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
1d0a0 68 69 63 68 20 65 78 65 63 75 74 65 73 20 65 76  hich executes ev
1d0b0 65 72 79 20 74 69 6d 65 20 61 20 73 79 6d 62 6f  ery time a symbo
1d0c0 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d  l is popped from
1d0d0 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 20  .  ** the stack 
1d0e0 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
1d0f0 20 65 72 72 6f 72 73 20 6f 72 20 77 68 69 6c 65   errors or while
1d100 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68 65 20   destroying the 
1d110 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a 20 28 49  parser. .  ** (I
1d120 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 67  n other words, g
1d130 65 6e 65 72 61 74 65 20 74 68 65 20 25 64 65 73  enerate the %des
1d140 74 72 75 63 74 6f 72 20 61 63 74 69 6f 6e 73 29  tructor actions)
1d150 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70  .  */.  if( lemp
1d160 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a 20  ->tokendest ){. 
1d170 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b     int once = 1;
1d180 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1d190 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
1d1a0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
1d1b0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
1d1c0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
1d1d0 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30  .      if( sp==0
1d1e0 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54 45   || sp->type!=TE
1d1f0 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75  RMINAL ) continu
1d200 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  e;.      if( onc
1d210 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  e ){.        fpr
1d220 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 20  intf(out, "     
1d230 20 2f 2a 20 54 45 52 4d 49 4e 41 4c 20 44 65 73   /* TERMINAL Des
1d240 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20  tructor */\n"); 
1d250 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
1d260 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20    once = 0;.    
1d270 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
1d280 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20  f(out,"    case 
1d290 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c  %d: /* %s */\n",
1d2a0 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e   sp->index, sp->
1d2b0 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
1d2c0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1d2d0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
1d2e0 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d  bol && lemp->sym
1d2f0 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21 3d 54  bols[i]->type!=T
1d300 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20  ERMINAL; i++);. 
1d310 20 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e     if( i<lemp->n
1d320 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20  symbol ){.      
1d330 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  emit_destructor_
1d340 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73  code(out,lemp->s
1d350 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26  ymbols[i],lemp,&
1d360 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66  lineno);.      f
1d370 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1d380 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69    break;\n"); li
1d390 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
1d3a0 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61  }.  if( lemp->va
1d3b0 72 64 65 73 74 20 29 7b 0a 20 20 20 20 73 74 72  rdest ){.    str
1d3c0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66 6c 74  uct symbol *dflt
1d3d0 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  _sp = 0;.    int
1d3e0 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 66   once = 1;.    f
1d3f0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1d400 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
1d410 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
1d420 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  ol *sp = lemp->s
1d430 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20  ymbols[i];.     
1d440 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70   if( sp==0 || sp
1d450 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
1d460 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 73 70   ||.          sp
1d470 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73 70  ->index<=0 || sp
1d480 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30 20  ->destructor!=0 
1d490 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1d4a0 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20    if( once ){.  
1d4b0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1d4c0 74 2c 20 22 20 20 20 20 20 20 2f 2a 20 44 65 66  t, "      /* Def
1d4d0 61 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49 4e 41  ault NON-TERMINA
1d4e0 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c  L Destructor */\
1d4f0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1d500 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b         once = 0;
1d510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1d520 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1d530 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a  case %d: /* %s *
1d540 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c  /\n", sp->index,
1d550 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65   sp->name); line
1d560 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74  no++;.      dflt
1d570 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a  _sp = sp;.    }.
1d580 20 20 20 20 69 66 28 20 64 66 6c 74 5f 73 70 21      if( dflt_sp!
1d590 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74  =0 ){.      emit
1d5a0 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65  _destructor_code
1d5b0 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d  (out,dflt_sp,lem
1d5c0 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  p,&lineno);.    
1d5d0 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
1d5e0 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c  t,"      break;\
1d5f0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1d600 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1d610 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
1d620 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
1d630 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
1d640 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
1d650 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20     if( sp==0 || 
1d660 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
1d670 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75  AL || sp->destru
1d680 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ctor==0 ) contin
1d690 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ue;.    fprintf(
1d6a0 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64  out,"    case %d
1d6b0 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73  : /* %s */\n", s
1d6c0 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61  p->index, sp->na
1d6d0 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a  me); lineno++;..
1d6e0 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 64      /* Combine d
1d6f0 75 70 6c 69 63 61 74 65 20 64 65 73 74 72 75 63  uplicate destruc
1d700 74 6f 72 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  tors into a sing
1d710 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 66  le case */.    f
1d720 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65 6d 70  or(j=i+1; j<lemp
1d730 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b  ->nsymbol; j++){
1d740 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79  .      struct sy
1d750 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c 65 6d 70  mbol *sp2 = lemp
1d760 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20  ->symbols[j];.  
1d770 20 20 20 20 69 66 28 20 73 70 32 20 26 26 20 73      if( sp2 && s
1d780 70 32 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e  p2->type!=TERMIN
1d790 41 4c 20 26 26 20 73 70 32 2d 3e 64 65 73 74 72  AL && sp2->destr
1d7a0 75 63 74 6f 72 0a 20 20 20 20 20 20 20 20 20 20  uctor.          
1d7b0 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d 3d 3d 73  && sp2->dtnum==s
1d7c0 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20 20 20 20  p->dtnum.       
1d7d0 20 20 20 26 26 20 73 74 72 63 6d 70 28 73 70 2d     && strcmp(sp-
1d7e0 3e 64 65 73 74 72 75 63 74 6f 72 2c 73 70 32 2d  >destructor,sp2-
1d7f0 3e 64 65 73 74 72 75 63 74 6f 72 29 3d 3d 30 20  >destructor)==0 
1d800 29 7b 0a 20 20 20 20 20 20 20 20 20 66 70 72 69  ){.         fpri
1d810 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
1d820 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e  e %d: /* %s */\n
1d830 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1d840 20 20 20 20 73 70 32 2d 3e 69 6e 64 65 78 2c 20      sp2->index, 
1d850 73 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65  sp2->name); line
1d860 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 73  no++;.         s
1d870 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 3d  p2->destructor =
1d880 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1d890 7d 0a 0a 20 20 20 20 65 6d 69 74 5f 64 65 73 74  }..    emit_dest
1d8a0 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c  ructor_code(out,
1d8b0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1d8c0 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  ,lemp,&lineno);.
1d8d0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1d8e0 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22  "      break;\n"
1d8f0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1d900 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1d910 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1d920 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1d930 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
1d940 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e  ch executes when
1d950 65 76 65 72 20 74 68 65 20 70 61 72 73 65 72 20  ever the parser 
1d960 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 73 20  stack overflows 
1d970 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
1d980 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 6f  out,lemp,lemp->o
1d990 76 65 72 66 6c 6f 77 2c 26 6c 69 6e 65 6e 6f 29  verflow,&lineno)
1d9a0 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
1d9b0 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1d9c0 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1d9d0 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 61 62  Generate the tab
1d9e0 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e 66 6f 72  le of rule infor
1d9f0 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a 20 20 2a  mation .  **.  *
1da00 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 63 6f 64  * Note: This cod
1da10 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
1da20 20 66 61 63 74 20 74 68 61 74 20 72 75 6c 65 73   fact that rules
1da30 20 61 72 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a   are number.  **
1da40 20 73 65 71 75 65 6e 74 75 61 6c 6c 79 20 62 65   sequentually be
1da50 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 2e 0a  ginning with 0..
1da60 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65    */.  for(rp=le
1da70 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
1da80 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
1da90 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 7b  fprintf(out,"  {
1daa0 20 25 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c 72 70   %d, %d },\n",rp
1dab0 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c 72 70 2d  ->lhs->index,rp-
1dac0 3e 6e 72 68 73 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >nrhs); lineno++
1dad0 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
1dae0 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1daf0 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1db00 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1db10 65 20 77 68 69 63 68 20 65 78 65 63 75 74 69 6f  e which executio
1db20 6e 20 64 75 72 69 6e 67 20 65 61 63 68 20 52 45  n during each RE
1db30 44 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  DUCE action */. 
1db40 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
1db50 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
1db60 65 78 74 29 7b 0a 20 20 20 20 74 72 61 6e 73 6c  ext){.    transl
1db70 61 74 65 5f 63 6f 64 65 28 6c 65 6d 70 2c 20 72  ate_code(lemp, r
1db80 70 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 72  p);.  }.  /* Fir
1db90 73 74 20 6f 75 74 70 75 74 20 72 75 6c 65 73 20  st output rules 
1dba0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 64  other than the d
1dbb0 65 66 61 75 6c 74 3a 20 72 75 6c 65 20 2a 2f 0a  efault: rule */.
1dbc0 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
1dbd0 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
1dbe0 6e 65 78 74 29 7b 0a 20 20 20 20 73 74 72 75 63  next){.    struc
1dbf0 74 20 72 75 6c 65 20 2a 72 70 32 3b 20 20 20 20  t rule *rp2;    
1dc00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 74             /* Ot
1dc10 68 65 72 20 72 75 6c 65 73 20 77 69 74 68 20 74  her rules with t
1dc20 68 65 20 73 61 6d 65 20 61 63 74 69 6f 6e 20 2a  he same action *
1dc30 2f 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f  /.    if( rp->co
1dc40 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  de==0 ) continue
1dc50 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f  ;.    if( rp->co
1dc60 64 65 5b 30 5d 3d 3d 27 5c 6e 27 20 26 26 20 72  de[0]=='\n' && r
1dc70 70 2d 3e 63 6f 64 65 5b 31 5d 3d 3d 30 20 29 20  p->code[1]==0 ) 
1dc80 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 57 69 6c  continue; /* Wil
1dc90 6c 20 62 65 20 64 65 66 61 75 6c 74 3a 20 2a 2f  l be default: */
1dca0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1dcb0 2c 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a  ,"      case %d:
1dcc0 20 2f 2a 20 22 2c 20 72 70 2d 3e 69 6e 64 65 78   /* ", rp->index
1dcd0 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65  );.    writeRule
1dce0 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20  Text(out, rp);. 
1dcf0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1dd00 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  " */\n"); lineno
1dd10 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 72 70 32 3d  ++;.    for(rp2=
1dd20 72 70 2d 3e 6e 65 78 74 3b 20 72 70 32 3b 20 72  rp->next; rp2; r
1dd30 70 32 3d 72 70 32 2d 3e 6e 65 78 74 29 7b 0a 20  p2=rp2->next){. 
1dd40 20 20 20 20 20 69 66 28 20 72 70 32 2d 3e 63 6f       if( rp2->co
1dd50 64 65 3d 3d 72 70 2d 3e 63 6f 64 65 20 29 7b 0a  de==rp->code ){.
1dd60 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1dd70 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73 65 20  out,"      case 
1dd80 25 64 3a 20 2f 2a 20 22 2c 20 72 70 32 2d 3e 69  %d: /* ", rp2->i
1dd90 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 77  ndex);.        w
1dda0 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74  riteRuleText(out
1ddb0 2c 20 72 70 32 29 3b 0a 20 20 20 20 20 20 20 20  , rp2);.        
1ddc0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2a 2f  fprintf(out," */
1ddd0 20 79 79 74 65 73 74 63 61 73 65 28 79 79 72 75   yytestcase(yyru
1dde0 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72  leno==%d);\n", r
1ddf0 70 32 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65  p2->index); line
1de00 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 70  no++;.        rp
1de10 32 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20  2->code = 0;.   
1de20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65     }.    }.    e
1de30 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72 70 2c  mit_code(out,rp,
1de40 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lemp,&lineno);. 
1de50 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1de60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e          break;\n
1de70 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1de80 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a    rp->code = 0;.
1de90 20 20 7d 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79    }.  /* Finally
1dea0 2c 20 6f 75 74 70 75 74 20 74 68 65 20 64 65 66  , output the def
1deb0 61 75 6c 74 3a 20 72 75 6c 65 2e 20 20 57 65 20  ault: rule.  We 
1dec0 63 68 6f 6f 73 65 20 61 73 20 74 68 65 20 64 65  choose as the de
1ded0 66 61 75 6c 74 3a 20 61 6c 6c 0a 20 20 2a 2a 20  fault: all.  ** 
1dee0 65 6d 70 74 79 20 61 63 74 69 6f 6e 73 2e 20 2a  empty actions. *
1def0 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
1df00 22 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 5c  "      default:\
1df10 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1df20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
1df30 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
1df40 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70  ext){.    if( rp
1df50 2d 3e 63 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74  ->code==0 ) cont
1df60 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
1df70 28 20 72 70 2d 3e 63 6f 64 65 5b 30 5d 3d 3d 27  ( rp->code[0]=='
1df80 5c 6e 27 20 26 26 20 72 70 2d 3e 63 6f 64 65 5b  \n' && rp->code[
1df90 31 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 66 70 72  1]==0 );.    fpr
1dfa0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
1dfb0 2f 2a 20 28 25 64 29 20 22 2c 20 72 70 2d 3e 69  /* (%d) ", rp->i
1dfc0 6e 64 65 78 29 3b 0a 20 20 20 20 77 72 69 74 65  ndex);.    write
1dfd0 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70  RuleText(out, rp
1dfe0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1dff0 75 74 2c 20 22 20 2a 2f 20 79 79 74 65 73 74 63  ut, " */ yytestc
1e000 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d 25 64  ase(yyruleno==%d
1e010 29 3b 5c 6e 22 2c 20 72 70 2d 3e 69 6e 64 65 78  );\n", rp->index
1e020 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1e030 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1e040 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e          break;\n
1e050 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1e060 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1e070 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1e080 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1e090 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
1e0a0 65 78 65 63 75 74 65 73 20 69 66 20 61 20 70 61  executes if a pa
1e0b0 72 73 65 20 66 61 69 6c 73 20 2a 2f 0a 20 20 74  rse fails */.  t
1e0c0 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
1e0d0 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65  mp,lemp->failure
1e0e0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c  ,&lineno);.  tpl
1e0f0 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1e100 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1e110 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1e120 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1e130 63 75 74 65 73 20 77 68 65 6e 20 61 20 73 79 6e  cutes when a syn
1e140 74 61 78 20 65 72 72 6f 72 20 6f 63 63 75 72 73  tax error occurs
1e150 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
1e160 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
1e170 65 72 72 6f 72 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  error,&lineno);.
1e180 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1e190 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1e1a0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1e1b0 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
1e1c0 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20  h executes when 
1e1d0 74 68 65 20 70 61 72 73 65 72 20 61 63 63 65 70  the parser accep
1e1e0 74 73 20 69 74 73 20 69 6e 70 75 74 20 2a 2f 0a  ts its input */.
1e1f0 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
1e200 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61 63 63 65  ,lemp,lemp->acce
1e210 70 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74  pt,&lineno);.  t
1e220 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1e230 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1e240 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  no);..  /* Appen
1e250 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e 20 63  d any addition c
1e260 6f 64 65 20 74 68 65 20 75 73 65 72 20 64 65 73  ode the user des
1e270 69 72 65 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  ires */.  tplt_p
1e280 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
1e290 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65 2c 26 6c  mp->extracode,&l
1e2a0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73  ineno);..  fclos
1e2b0 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28  e(in);.  fclose(
1e2c0 6f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  out);.  return;.
1e2d0 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  }../* Generate a
1e2e0 20 68 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72   header file for
1e2f0 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76   the parser */.v
1e300 6f 69 64 20 52 65 70 6f 72 74 48 65 61 64 65 72  oid ReportHeader
1e310 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
1e320 65 6d 70 29 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f  emp).{.  FILE *o
1e330 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 6f 6e 73 74  ut, *in;.  const
1e340 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20   char *prefix;. 
1e350 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53   char line[LINES
1e360 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70 61 74  IZE];.  char pat
1e370 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a  tern[LINESIZE];.
1e380 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
1e390 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
1e3a0 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d  x ) prefix = lem
1e3b0 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a  p->tokenprefix;.
1e3c0 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
1e3d0 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
1e3e0 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d 20 66 69   = "";.  in = fi
1e3f0 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68  le_open(lemp,".h
1e400 22 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  ","rb");.  if( i
1e410 6e 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  n ){.    for(i=1
1e420 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; i<lemp->ntermi
1e430 6e 61 6c 20 26 26 20 66 67 65 74 73 28 6c 69 6e  nal && fgets(lin
1e440 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 3b 20  e,LINESIZE,in); 
1e450 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 70 72 69  i++){.      spri
1e460 6e 74 66 28 70 61 74 74 65 72 6e 2c 22 23 64 65  ntf(pattern,"#de
1e470 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64  fine %s%-30s %2d
1e480 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d  \n",prefix,lemp-
1e490 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d  >symbols[i]->nam
1e4a0 65 2c 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e,i);.      if( 
1e4b0 73 74 72 63 6d 70 28 6c 69 6e 65 2c 70 61 74 74  strcmp(line,patt
1e4c0 65 72 6e 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ern) ) break;.  
1e4d0 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 69    }.    fclose(i
1e4e0 6e 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6c  n);.    if( i==l
1e4f0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29  emp->nterminal )
1e500 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 68  {.      /* No ch
1e510 61 6e 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  ange in the file
1e520 2e 20 20 44 6f 6e 27 74 20 72 65 77 72 69 74 65  .  Don't rewrite
1e530 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65   it. */.      re
1e540 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
1e550 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65    out = file_ope
1e560 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 77 62 22  n(lemp,".h","wb"
1e570 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  );.  if( out ){.
1e580 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c      for(i=1; i<l
1e590 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
1e5a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69  i++){.      fpri
1e5b0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1e5c0 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c   %s%-30s %2d\n",
1e5d0 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d  prefix,lemp->sym
1e5e0 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29  bols[i]->name,i)
1e5f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f  ;.    }.    fclo
1e600 73 65 28 6f 75 74 29 3b 20 20 0a 20 20 7d 0a 20  se(out);  .  }. 
1e610 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52   return;.}../* R
1e620 65 64 75 63 65 20 74 68 65 20 73 69 7a 65 20 6f  educe the size o
1e630 66 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  f the action tab
1e640 6c 65 73 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  les, if possible
1e650 2c 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 0a  , by making use.
1e660 2a 2a 20 6f 66 20 64 65 66 61 75 6c 74 73 2e 0a  ** of defaults..
1e670 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  **.** In this ve
1e680 72 73 69 6f 6e 2c 20 77 65 20 74 61 6b 65 20 74  rsion, we take t
1e690 68 65 20 6d 6f 73 74 20 66 72 65 71 75 65 6e 74  he most frequent
1e6a0 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 61   REDUCE action a
1e6b0 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68  nd make.** it th
1e6c0 65 20 64 65 66 61 75 6c 74 2e 20 20 45 78 63 65  e default.  Exce
1e6d0 70 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  pt, there is no 
1e6e0 64 65 66 61 75 6c 74 20 69 66 20 74 68 65 20 77  default if the w
1e6f0 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e 0a 2a 2a  ildcard token.**
1e700 20 69 73 20 61 20 70 6f 73 73 69 62 6c 65 20 6c   is a possible l
1e710 6f 6f 6b 2d 61 68 65 61 64 2e 0a 2a 2f 0a 76 6f  ook-ahead..*/.vo
1e720 69 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65  id CompressTable
1e730 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
1e740 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74  lemp).{.  struct
1e750 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73   state *stp;.  s
1e760 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
1e770 2c 20 2a 61 70 32 3b 0a 20 20 73 74 72 75 63 74  , *ap2;.  struct
1e780 20 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c   rule *rp, *rp2,
1e790 20 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e   *rbest;.  int n
1e7a0 62 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69  best, n;.  int i
1e7b0 3b 0a 20 20 69 6e 74 20 75 73 65 73 57 69 6c 64  ;.  int usesWild
1e7c0 63 61 72 64 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  card;..  for(i=0
1e7d0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
1e7e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
1e7f0 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
1e800 5d 3b 0a 20 20 20 20 6e 62 65 73 74 20 3d 20 30  ];.    nbest = 0
1e810 3b 0a 20 20 20 20 72 62 65 73 74 20 3d 20 30 3b  ;.    rbest = 0;
1e820 0a 20 20 20 20 75 73 65 73 57 69 6c 64 63 61 72  .    usesWildcar
1e830 64 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28  d = 0;..    for(
1e840 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
1e850 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
1e860 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
1e870 3d 3d 53 48 49 46 54 20 26 26 20 61 70 2d 3e 73  ==SHIFT && ap->s
1e880 70 3d 3d 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72  p==lemp->wildcar
1e890 64 20 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65  d ){.        use
1e8a0 73 57 69 6c 64 63 61 72 64 20 3d 20 31 3b 0a 20  sWildcard = 1;. 
1e8b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e8c0 20 61 70 2d 3e 74 79 70 65 21 3d 52 45 44 55 43   ap->type!=REDUC
1e8d0 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  E ) continue;.  
1e8e0 20 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72      rp = ap->x.r
1e8f0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d  p;.      if( rp-
1e900 3e 6c 68 73 53 74 61 72 74 20 29 20 63 6f 6e 74  >lhsStart ) cont
1e910 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
1e920 72 70 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74  rp==rbest ) cont
1e930 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20  inue;.      n = 
1e940 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 32  1;.      for(ap2
1e950 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20  =ap->next; ap2; 
1e960 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a  ap2=ap2->next){.
1e970 20 20 20 20 20 20 20 20 69 66 28 20 61 70 32 2d          if( ap2-
1e980 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20 29 20  >type!=REDUCE ) 
1e990 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1e9a0 20 20 72 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72    rp2 = ap2->x.r
1e9b0 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  p;.        if( r
1e9c0 70 32 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74  p2==rbest ) cont
1e9d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1e9e0 28 20 72 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b  ( rp2==rp ) n++;
1e9f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1ea00 66 28 20 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20  f( n>nbest ){.  
1ea10 20 20 20 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b        nbest = n;
1ea20 0a 20 20 20 20 20 20 20 20 72 62 65 73 74 20 3d  .        rbest =
1ea30 20 72 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rp;.      }.   
1ea40 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 44 6f 20 6e   }. .    /* Do n
1ea50 6f 74 20 6d 61 6b 65 20 61 20 64 65 66 61 75 6c  ot make a defaul
1ea60 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t if the number 
1ea70 6f 66 20 72 75 6c 65 73 20 74 6f 20 64 65 66 61  of rules to defa
1ea80 75 6c 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ult.    ** is no
1ea90 74 20 61 74 20 6c 65 61 73 74 20 31 20 6f 72 20  t at least 1 or 
1eaa0 69 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20  if the wildcard 
1eab0 74 6f 6b 65 6e 20 69 73 20 61 20 70 6f 73 73 69  token is a possi
1eac0 62 6c 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 6b 61  ble.    ** looka
1ead0 68 65 61 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  head..    */.   
1eae0 20 69 66 28 20 6e 62 65 73 74 3c 31 20 7c 7c 20   if( nbest<1 || 
1eaf0 75 73 65 73 57 69 6c 64 63 61 72 64 20 29 20 63  usesWildcard ) c
1eb00 6f 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f  ontinue;...    /
1eb10 2a 20 43 6f 6d 62 69 6e 65 20 6d 61 74 63 68 69  * Combine matchi
1eb20 6e 67 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e  ng REDUCE action
1eb30 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
1eb40 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20 66  default */.    f
1eb50 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
1eb60 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
1eb70 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
1eb80 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61  ype==REDUCE && a
1eb90 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29  p->x.rp==rbest )
1eba0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ebb0 20 20 61 73 73 65 72 74 28 20 61 70 20 29 3b 0a    assert( ap );.
1ebc0 20 20 20 20 61 70 2d 3e 73 70 20 3d 20 53 79 6d      ap->sp = Sym
1ebd0 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c  bol_new("{defaul
1ebe0 74 7d 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70  t}");.    for(ap
1ebf0 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61  =ap->next; ap; a
1ec00 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
1ec10 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
1ec20 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78  =REDUCE && ap->x
1ec30 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 61 70 2d  .rp==rbest ) ap-
1ec40 3e 74 79 70 65 20 3d 20 4e 4f 54 5f 55 53 45 44  >type = NOT_USED
1ec50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 70 2d  ;.    }.    stp-
1ec60 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72  >ap = Action_sor
1ec70 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20 7d 0a  t(stp->ap);.  }.
1ec80 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  }.../*.** Compar
1ec90 65 20 74 77 6f 20 73 74 61 74 65 73 20 66 6f 72  e two states for
1eca0 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65   sorting purpose
1ecb0 73 2e 20 20 54 68 65 20 73 6d 61 6c 6c 65 72 20  s.  The smaller 
1ecc0 73 74 61 74 65 20 69 73 20 74 68 65 0a 2a 2a 20  state is the.** 
1ecd0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73  one with the mos
1ece0 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61  t non-terminal a
1ecf0 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 79  ctions.  If they
1ed00 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
1ed10 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f 6e 2d  umber.** of non-
1ed20 74 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73  terminal actions
1ed30 2c 20 74 68 65 6e 20 74 68 65 20 73 6d 61 6c 6c  , then the small
1ed40 65 72 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  er is the one wi
1ed50 74 68 20 74 68 65 20 6d 6f 73 74 0a 2a 2a 20 74  th the most.** t
1ed60 6f 6b 65 6e 20 61 63 74 69 6f 6e 73 2e 0a 2a 2f  oken actions..*/
1ed70 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74  .static int stat
1ed80 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 28 63  eResortCompare(c
1ed90 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f  onst void *a, co
1eda0 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20  nst void *b){.  
1edb0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61  const struct sta
1edc0 74 65 20 2a 70 41 20 3d 20 2a 28 63 6f 6e 73 74  te *pA = *(const
1edd0 20 73 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29   struct state**)
1ede0 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  a;.  const struc
1edf0 74 20 73 74 61 74 65 20 2a 70 42 20 3d 20 2a 28  t state *pB = *(
1ee00 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61  const struct sta
1ee10 74 65 2a 2a 29 62 3b 0a 20 20 69 6e 74 20 6e 3b  te**)b;.  int n;
1ee20 0a 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e 74 41  ..  n = pB->nNtA
1ee30 63 74 20 2d 20 70 41 2d 3e 6e 4e 74 41 63 74 3b  ct - pA->nNtAct;
1ee40 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20  .  if( n==0 ){. 
1ee50 20 20 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b 6e 41     n = pB->nTknA
1ee60 63 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41 63 74  ct - pA->nTknAct
1ee70 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  ;.    if( n==0 )
1ee80 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 42 2d 3e  {.      n = pB->
1ee90 73 74 61 74 65 6e 75 6d 20 2d 20 70 41 2d 3e 73  statenum - pA->s
1eea0 74 61 74 65 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20  tatenum;.    }. 
1eeb0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 21 3d   }.  assert( n!=
1eec0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  0 );.  return n;
1eed0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 75 6d  .}.../*.** Renum
1eee0 62 65 72 20 61 6e 64 20 72 65 73 6f 72 74 20 73  ber and resort s
1eef0 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 73 74  tates so that st
1ef00 61 74 65 73 20 77 69 74 68 20 66 65 77 65 72 20  ates with fewer 
1ef10 63 68 6f 69 63 65 73 0a 2a 2a 20 6f 63 63 75 72  choices.** occur
1ef20 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 45 78   at the end.  Ex
1ef30 63 65 70 74 2c 20 6b 65 65 70 20 73 74 61 74 65  cept, keep state
1ef40 20 30 20 61 73 20 74 68 65 20 66 69 72 73 74 20   0 as the first 
1ef50 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 52  state..*/.void R
1ef60 65 73 6f 72 74 53 74 61 74 65 73 28 73 74 72 75  esortStates(stru
1ef70 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
1ef80 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1ef90 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
1efa0 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
1efb0 2a 61 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  *ap;..  for(i=0;
1efc0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
1efd0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
1efe0 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
1eff0 3b 0a 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41  ;.    stp->nTknA
1f000 63 74 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74  ct = stp->nNtAct
1f010 20 3d 20 30 3b 0a 20 20 20 20 73 74 70 2d 3e 69   = 0;.    stp->i
1f020 44 66 6c 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74  Dflt = lemp->nst
1f030 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  ate + lemp->nrul
1f040 65 3b 0a 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e  e;.    stp->iTkn
1f050 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54  Ofst = NO_OFFSET
1f060 3b 0a 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66  ;.    stp->iNtOf
1f070 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a  st = NO_OFFSET;.
1f080 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
1f090 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
1f0a0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1f0b0 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c  compute_action(l
1f0c0 65 6d 70 2c 61 70 29 3e 3d 30 20 29 7b 0a 20 20  emp,ap)>=0 ){.  
1f0d0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70        if( ap->sp
1f0e0 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74  ->index<lemp->nt
1f0f0 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20  erminal ){.     
1f100 20 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63       stp->nTknAc
1f110 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t++;.        }el
1f120 73 65 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69  se if( ap->sp->i
1f130 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  ndex<lemp->nsymb
1f140 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
1f150 73 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b 3b 0a 20  stp->nNtAct++;. 
1f160 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f170 20 20 20 20 20 20 20 20 73 74 70 2d 3e 69 44 66          stp->iDf
1f180 6c 74 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74  lt = compute_act
1f190 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20  ion(lemp, ap);. 
1f1a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f1b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 71 73 6f  .    }.  }.  qso
1f1c0 72 74 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  rt(&lemp->sorted
1f1d0 5b 31 5d 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  [1], lemp->nstat
1f1e0 65 2d 31 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 70  e-1, sizeof(lemp
1f1f0 2d 3e 73 6f 72 74 65 64 5b 30 5d 29 2c 0a 20 20  ->sorted[0]),.  
1f200 20 20 20 20 20 20 73 74 61 74 65 52 65 73 6f 72        stateResor
1f210 74 43 6f 6d 70 61 72 65 29 3b 0a 20 20 66 6f 72  tCompare);.  for
1f220 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1f230 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
1f240 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d  lemp->sorted[i]-
1f250 3e 73 74 61 74 65 6e 75 6d 20 3d 20 69 3b 0a 20  >statenum = i;. 
1f260 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   }.}.../********
1f270 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
1f280 68 65 20 66 69 6c 65 20 22 73 65 74 2e 63 22 20  he file "set.c" 
1f290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f2b0 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ****/./*.** Set 
1f2c0 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 20 72 6f 75  manipulation rou
1f2d0 74 69 6e 65 73 20 66 6f 72 20 74 68 65 20 4c 45  tines for the LE
1f2e0 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
1f2f0 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ator..*/..static
1f300 20 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b 0a 0a   int size = 0;..
1f310 2f 2a 20 53 65 74 20 74 68 65 20 73 65 74 20 73  /* Set the set s
1f320 69 7a 65 20 2a 2f 0a 76 6f 69 64 20 53 65 74 53  ize */.void SetS
1f330 69 7a 65 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73  ize(int n).{.  s
1f340 69 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a  ize = n+1;.}../*
1f350 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1f360 73 65 74 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74  set */.char *Set
1f370 4e 65 77 28 29 7b 0a 20 20 63 68 61 72 20 2a 73  New(){.  char *s
1f380 3b 0a 20 20 73 20 3d 20 28 63 68 61 72 2a 29 63  ;.  s = (char*)c
1f390 61 6c 6c 6f 63 28 20 73 69 7a 65 2c 20 31 29 3b  alloc( size, 1);
1f3a0 0a 20 20 69 66 28 20 73 3d 3d 30 20 29 7b 0a 20  .  if( s==0 ){. 
1f3b0 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d     extern void m
1f3c0 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20  emory_error();. 
1f3d0 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28     memory_error(
1f3e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1f3f0 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c 6f 63  s;.}../* Dealloc
1f400 61 74 65 20 61 20 73 65 74 20 2a 2f 0a 76 6f 69  ate a set */.voi
1f410 64 20 53 65 74 46 72 65 65 28 63 68 61 72 20 2a  d SetFree(char *
1f420 73 29 0a 7b 0a 20 20 66 72 65 65 28 73 29 3b 0a  s).{.  free(s);.
1f430 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20  }../* Add a new 
1f440 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 73  element to the s
1f450 65 74 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  et.  Return TRUE
1f460 20 69 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 20   if the element 
1f470 77 61 73 20 61 64 64 65 64 0a 2a 2a 20 61 6e 64  was added.** and
1f480 20 46 41 4c 53 45 20 69 66 20 69 74 20 77 61 73   FALSE if it was
1f490 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 2e 20   already there. 
1f4a0 2a 2f 0a 69 6e 74 20 53 65 74 41 64 64 28 63 68  */.int SetAdd(ch
1f4b0 61 72 20 2a 73 2c 20 69 6e 74 20 65 29 0a 7b 0a  ar *s, int e).{.
1f4c0 20 20 69 6e 74 20 72 76 3b 0a 20 20 61 73 73 65    int rv;.  asse
1f4d0 72 74 28 20 65 3e 3d 30 20 26 26 20 65 3c 73 69  rt( e>=0 && e<si
1f4e0 7a 65 20 29 3b 0a 20 20 72 76 20 3d 20 73 5b 65  ze );.  rv = s[e
1f4f0 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20 31 3b 0a 20  ];.  s[e] = 1;. 
1f500 20 72 65 74 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a   return !rv;.}..
1f510 2f 2a 20 41 64 64 20 65 76 65 72 79 20 65 6c 65  /* Add every ele
1f520 6d 65 6e 74 20 6f 66 20 73 32 20 74 6f 20 73 31  ment of s2 to s1
1f530 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
1f540 66 20 73 31 20 63 68 61 6e 67 65 73 2e 20 2a 2f  f s1 changes. */
1f550 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28 63 68  .int SetUnion(ch
1f560 61 72 20 2a 73 31 2c 20 63 68 61 72 20 2a 73 32  ar *s1, char *s2
1f570 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 70 72 6f  ).{.  int i, pro
1f580 67 72 65 73 73 3b 0a 20 20 70 72 6f 67 72 65 73  gress;.  progres
1f590 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  s = 0;.  for(i=0
1f5a0 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a  ; i<size; i++){.
1f5b0 20 20 20 20 69 66 28 20 73 32 5b 69 5d 3d 3d 30      if( s2[i]==0
1f5c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1f5d0 20 69 66 28 20 73 31 5b 69 5d 3d 3d 30 20 29 7b   if( s1[i]==0 ){
1f5e0 0a 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20  .      progress 
1f5f0 3d 20 31 3b 0a 20 20 20 20 20 20 73 31 5b 69 5d  = 1;.      s1[i]
1f600 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
1f610 20 20 72 65 74 75 72 6e 20 70 72 6f 67 72 65 73    return progres
1f620 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s;.}./**********
1f630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
1f640 6d 20 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c  m the file "tabl
1f650 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.c" ***********
1f660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f670 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64  */./*.** All cod
1f680 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  e in this file h
1f690 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61 74 69  as been automati
1f6a0 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 0a  cally generated.
1f6b0 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63 69 66  ** from a specif
1f6c0 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 66  ication in the f
1f6d0 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ile.**          
1f6e0 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a      "table.q".**
1f6f0 20 62 79 20 74 68 65 20 61 73 73 6f 63 69 61 74   by the associat
1f700 69 76 65 20 61 72 72 61 79 20 63 6f 64 65 20 62  ive array code b
1f710 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d 20  uilding program 
1f720 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e  "aagen"..** Do n
1f730 6f 74 20 65 64 69 74 20 74 68 69 73 20 66 69 6c  ot edit this fil
1f740 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65 64 69  e!  Instead, edi
1f750 74 20 74 68 65 20 73 70 65 63 69 66 69 63 61 74  t the specificat
1f760 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  ion.** file, the
1f770 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a  n rerun aagen..*
1f780 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72  /./*.** Code for
1f790 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61 62 6c   processing tabl
1f7a0 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20  es in the LEMON 
1f7b0 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
1f7c0 2e 0a 2a 2f 0a 0a 50 52 49 56 41 54 45 20 69 6e  ..*/..PRIVATE in
1f7d0 74 20 73 74 72 68 61 73 68 28 63 6f 6e 73 74 20  t strhash(const 
1f7e0 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20 69 6e 74  char *x).{.  int
1f7f0 20 68 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   h = 0;.  while(
1f800 20 2a 78 29 20 68 20 3d 20 68 2a 31 33 20 2b 20   *x) h = h*13 + 
1f810 2a 28 78 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e  *(x++);.  return
1f820 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b 73 20   h;.}../* Works 
1f830 6c 69 6b 65 20 73 74 72 64 75 70 2c 20 73 6f 72  like strdup, sor
1f840 74 20 6f 66 2e 20 20 53 61 76 65 20 61 20 73 74  t of.  Save a st
1f850 72 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63 65 64  ring in malloced
1f860 20 6d 65 6d 6f 72 79 2c 20 62 75 74 0a 2a 2a 20   memory, but.** 
1f870 6b 65 65 70 20 73 74 72 69 6e 67 73 20 69 6e 20  keep strings in 
1f880 61 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20  a table so that 
1f890 74 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67 20  the same string 
1f8a0 69 73 20 6e 6f 74 20 69 6e 20 6d 6f 72 65 0a 2a  is not in more.*
1f8b0 2a 20 74 68 61 6e 20 6f 6e 65 20 70 6c 61 63 65  * than one place
1f8c0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
1f8d0 2a 53 74 72 73 61 66 65 28 63 6f 6e 73 74 20 63  *Strsafe(const c
1f8e0 68 61 72 20 2a 79 29 0a 7b 0a 20 20 63 6f 6e 73  har *y).{.  cons
1f8f0 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 68 61  t char *z;.  cha
1f900 72 20 2a 63 70 79 3b 0a 0a 20 20 69 66 28 20 79  r *cpy;..  if( y
1f910 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1f920 20 20 7a 20 3d 20 53 74 72 73 61 66 65 5f 66 69    z = Strsafe_fi
1f930 6e 64 28 79 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  nd(y);.  if( z==
1f940 30 20 26 26 20 28 63 70 79 3d 28 63 68 61 72 20  0 && (cpy=(char 
1f950 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53  *)malloc( lemonS
1f960 74 72 6c 65 6e 28 79 29 2b 31 20 29 29 21 3d 30  trlen(y)+1 ))!=0
1f970 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 63   ){.    strcpy(c
1f980 70 79 2c 79 29 3b 0a 20 20 20 20 7a 20 3d 20 63  py,y);.    z = c
1f990 70 79 3b 0a 20 20 20 20 53 74 72 73 61 66 65 5f  py;.    Strsafe_
1f9a0 69 6e 73 65 72 74 28 7a 29 3b 0a 20 20 7d 0a 20  insert(z);.  }. 
1f9b0 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 7a 29 3b   MemoryCheck(z);
1f9c0 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
1f9d0 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
1f9e0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1f9f0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1fa00 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  ure for each.** 
1fa10 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
1fa20 79 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a  y of type "x1"..
1fa30 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 31 20 7b  */.struct s_x1 {
1fa40 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
1fa50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1fa60 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
1fa70 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a  lable slots. */.
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d            /*   M
1faa0 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
1fab0 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e  f 2 greater than
1fac0 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   or */.         
1fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fae0 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31   /*   equal to 1
1faf0 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b   */.  int count;
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fb10 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65   Number of curre
1fb20 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65  ntly slots fille
1fb30 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  d */.  struct s_
1fb40 78 31 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a  x1node *tbl;  /*
1fb50 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   The data stored
1fb60 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
1fb70 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 68 74 3b  t s_x1node **ht;
1fb80 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
1fb90 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d  for lookups */.}
1fba0 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
1fbb0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
1fbc0 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f  his structure fo
1fbd0 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65  r every data ele
1fbe0 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73  ment.** in an as
1fbf0 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
1fc00 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f  of type "x1"..*/
1fc10 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1fc20 73 5f 78 31 6e 6f 64 65 20 7b 0a 20 20 63 6f 6e  s_x1node {.  con
1fc30 73 74 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  st char *data;  
1fc40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1fc50 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  a */.  struct s_
1fc60 78 31 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x1node *next;   
1fc70 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
1fc80 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
1fc90 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1fca0 31 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  1node **from;  /
1fcb0 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
1fcc0 2a 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x1node;../*
1fcd0 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
1fce0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
1fcf0 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
1fd00 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
1fd10 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
1fd20 74 20 73 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a  t s_x1 *x1a;../*
1fd30 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1fd40 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
1fd50 79 20 2a 2f 0a 76 6f 69 64 20 53 74 72 73 61 66  y */.void Strsaf
1fd60 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20  e_init(){.  if( 
1fd70 78 31 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x1a ) return;.  
1fd80 78 31 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x1a = (struct s_
1fd90 78 31 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x1*)malloc( size
1fda0 6f 66 28 73 74 72 75 63 74 20 73 5f 78 31 29 20  of(struct s_x1) 
1fdb0 29 3b 0a 20 20 69 66 28 20 78 31 61 20 29 7b 0a  );.  if( x1a ){.
1fdc0 20 20 20 20 78 31 61 2d 3e 73 69 7a 65 20 3d 20      x1a->size = 
1fdd0 31 30 32 34 3b 0a 20 20 20 20 78 31 61 2d 3e 63  1024;.    x1a->c
1fde0 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 31  ount = 0;.    x1
1fdf0 61 2d 3e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65  a->tbl = (x1node
1fe00 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20  *)malloc( .     
1fe10 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29   (sizeof(x1node)
1fe20 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65   + sizeof(x1node
1fe30 2a 29 29 2a 31 30 32 34 20 29 3b 0a 20 20 20 20  *))*1024 );.    
1fe40 69 66 28 20 78 31 61 2d 3e 74 62 6c 3d 3d 30 20  if( x1a->tbl==0 
1fe50 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 31  ){.      free(x1
1fe60 61 29 3b 0a 20 20 20 20 20 20 78 31 61 20 3d 20  a);.      x1a = 
1fe70 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1fe80 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1fe90 20 78 31 61 2d 3e 68 74 20 3d 20 28 78 31 6e 6f   x1a->ht = (x1no
1fea0 64 65 2a 2a 29 26 28 78 31 61 2d 3e 74 62 6c 5b  de**)&(x1a->tbl[
1feb0 31 30 32 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f  1024]);.      fo
1fec0 72 28 69 3d 30 3b 20 69 3c 31 30 32 34 3b 20 69  r(i=0; i<1024; i
1fed0 2b 2b 29 20 78 31 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x1a->ht[i] =
1fee0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
1fef0 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
1ff00 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
1ff10 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
1ff20 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
1ff30 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
1ff40 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
1ff50 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
1ff60 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 72  itten */.int Str
1ff70 73 61 66 65 5f 69 6e 73 65 72 74 28 63 6f 6e 73  safe_insert(cons
1ff80 74 20 63 68 61 72 20 2a 64 61 74 61 29 0a 7b 0a  t char *data).{.
1ff90 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20    x1node *np;.  
1ffa0 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b  int h;.  int ph;
1ffb0 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29  ..  if( x1a==0 )
1ffc0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20   return 0;.  ph 
1ffd0 3d 20 73 74 72 68 61 73 68 28 64 61 74 61 29 3b  = strhash(data);
1ffe0 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 31 61  .  h = ph & (x1a
1fff0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
20000 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x1a->ht[h];.  
20010 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
20020 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e   if( strcmp(np->
20030 64 61 74 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b  data,data)==0 ){
20040 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69  .      /* An exi
20050 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68  sting entry with
20060 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
20070 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20   found. */.     
20080 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65   /* Fail because
20090 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f   overwrite is no
200a0 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20  t allows. */.   
200b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
200c0 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e   }.    np = np->
200d0 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  next;.  }.  if( 
200e0 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d 78 31 61 2d  x1a->count>=x1a-
200f0 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  >size ){.    /* 
20100 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  Need to make the
20110 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67   hash table bigg
20120 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  er */.    int i,
20130 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  size;.    struct
20140 20 73 5f 78 31 20 61 72 72 61 79 3b 0a 20 20 20   s_x1 array;.   
20150 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69   array.size = si
20160 7a 65 20 3d 20 78 31 61 2d 3e 73 69 7a 65 2a 32  ze = x1a->size*2
20170 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e  ;.    array.coun
20180 74 20 3d 20 78 31 61 2d 3e 63 6f 75 6e 74 3b 0a  t = x1a->count;.
20190 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20      array.tbl = 
201a0 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x1node*)malloc(
201b0 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
201c0 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  1node) + sizeof(
201d0 78 31 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29  x1node*))*size )
201e0 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e  ;.    if( array.
201f0 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tbl==0 ) return 
20200 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20  0;  /* Fail due 
20210 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  to malloc failur
20220 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68  e */.    array.h
20230 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28  t = (x1node**)&(
20240 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29  array.tbl[size])
20250 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
20260 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
20270 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  y.ht[i] = 0;.   
20280 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61 2d   for(i=0; i<x1a-
20290 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  >count; i++){.  
202a0 20 20 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e      x1node *oldn
202b0 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20  p, *newnp;.     
202c0 20 6f 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d 3e   oldnp = &(x1a->
202d0 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68  tbl[i]);.      h
202e0 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70   = strhash(oldnp
202f0 2d 3e 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d  ->data) & (size-
20300 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20  1);.      newnp 
20310 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d  = &(array.tbl[i]
20320 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72  );.      if( arr
20330 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79  ay.ht[h] ) array
20340 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  .ht[h]->from = &
20350 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  (newnp->next);. 
20360 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74       newnp->next
20370 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a   = array.ht[h];.
20380 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74        newnp->dat
20390 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b  a = oldnp->data;
203a0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72  .      newnp->fr
203b0 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b  om = &(array.ht[
203c0 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79  h]);.      array
203d0 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a  .ht[h] = newnp;.
203e0 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78      }.    free(x
203f0 31 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78  1a->tbl);.    *x
20400 31 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a  1a = array;.  }.
20410 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
20420 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20  new data */.  h 
20430 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a  = ph & (x1a->siz
20440 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78  e-1);.  np = &(x
20450 31 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f 75  1a->tbl[x1a->cou
20460 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61  nt++]);.  np->da
20470 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28  ta = data;.  if(
20480 20 78 31 61 2d 3e 68 74 5b 68 5d 20 29 20 78 31   x1a->ht[h] ) x1
20490 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  a->ht[h]->from =
204a0 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20   &(np->next);.  
204b0 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 31 61 2d 3e  np->next = x1a->
204c0 68 74 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e 68 74  ht[h];.  x1a->ht
204d0 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e  [h] = np;.  np->
204e0 66 72 6f 6d 20 3d 20 26 28 78 31 61 2d 3e 68 74  from = &(x1a->ht
204f0 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  [h]);.  return 1
20500 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
20510 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
20520 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
20530 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74   given key.  Ret
20540 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e  urn NULL.** if n
20550 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 63  o such key. */.c
20560 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61  onst char *Strsa
20570 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68  fe_find(const ch
20580 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 69 6e 74  ar *key).{.  int
20590 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70   h;.  x1node *np
205a0 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20  ;..  if( x1a==0 
205b0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
205c0 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26  = strhash(key) &
205d0 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x1a->size-1);.
205e0 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68    np = x1a->ht[h
205f0 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
20600 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
20610 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d  (np->data,key)==
20620 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e  0 ) break;.    n
20630 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
20640 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20  }.  return np ? 
20650 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a  np->data : 0;.}.
20660 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
20670 6e 74 65 72 20 74 6f 20 74 68 65 20 28 74 65 72  nter to the (ter
20680 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65 72 6d  minal or nonterm
20690 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20 22 78 22  inal) symbol "x"
206a0 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  ..** Create a ne
206b0 77 20 73 79 6d 62 6f 6c 20 69 66 20 74 68 69 73  w symbol if this
206c0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 69   is the first ti
206d0 6d 65 20 22 78 22 20 68 61 73 20 62 65 65 6e 20  me "x" has been 
206e0 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  seen..*/.struct 
206f0 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e  symbol *Symbol_n
20700 65 77 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 78  ew(const char *x
20710 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  ).{.  struct sym
20720 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73 70 20 3d  bol *sp;..  sp =
20730 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b   Symbol_find(x);
20740 0a 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a  .  if( sp==0 ){.
20750 20 20 20 20 73 70 20 3d 20 28 73 74 72 75 63 74      sp = (struct
20760 20 73 79 6d 62 6f 6c 20 2a 29 63 61 6c 6c 6f 63   symbol *)calloc
20770 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63  (1, sizeof(struc
20780 74 20 73 79 6d 62 6f 6c 29 20 29 3b 0a 20 20 20  t symbol) );.   
20790 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 70 29   MemoryCheck(sp)
207a0 3b 0a 20 20 20 20 73 70 2d 3e 6e 61 6d 65 20 3d  ;.    sp->name =
207b0 20 53 74 72 73 61 66 65 28 78 29 3b 0a 20 20 20   Strsafe(x);.   
207c0 20 73 70 2d 3e 74 79 70 65 20 3d 20 69 73 75 70   sp->type = isup
207d0 70 65 72 28 2a 78 29 20 3f 20 54 45 52 4d 49 4e  per(*x) ? TERMIN
207e0 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c  AL : NONTERMINAL
207f0 3b 0a 20 20 20 20 73 70 2d 3e 72 75 6c 65 20 3d  ;.    sp->rule =
20800 20 30 3b 0a 20 20 20 20 73 70 2d 3e 66 61 6c 6c   0;.    sp->fall
20810 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73 70  back = 0;.    sp
20820 2d 3e 70 72 65 63 20 3d 20 2d 31 3b 0a 20 20 20  ->prec = -1;.   
20830 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 55 4e 4b   sp->assoc = UNK
20840 3b 0a 20 20 20 20 73 70 2d 3e 66 69 72 73 74 73  ;.    sp->firsts
20850 65 74 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  et = 0;.    sp->
20860 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46  lambda = LEMON_F
20870 41 4c 53 45 3b 0a 20 20 20 20 73 70 2d 3e 64 65  ALSE;.    sp->de
20880 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20  structor = 0;.  
20890 20 20 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f    sp->destLineno
208a0 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 61   = 0;.    sp->da
208b0 74 61 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  tatype = 0;.    
208c0 73 70 2d 3e 75 73 65 43 6e 74 20 3d 20 30 3b 0a  sp->useCnt = 0;.
208d0 20 20 20 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72      Symbol_inser
208e0 74 28 73 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a  t(sp,sp->name);.
208f0 20 20 7d 0a 20 20 73 70 2d 3e 75 73 65 43 6e 74    }.  sp->useCnt
20900 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 70 3b  ++;.  return sp;
20910 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74  .}../* Compare t
20920 77 6f 20 73 79 6d 62 6f 6c 73 20 66 6f 72 20 77  wo symbols for w
20930 6f 72 6b 69 6e 67 20 70 75 72 70 6f 73 65 73 0a  orking purposes.
20940 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 73 20 74 68  **.** Symbols th
20950 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 75 70  at begin with up
20960 70 65 72 20 63 61 73 65 20 6c 65 74 74 65 72 73  per case letters
20970 20 28 74 65 72 6d 69 6e 61 6c 73 20 6f 72 20 74   (terminals or t
20980 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75 73 74 20 73  okens).** must s
20990 6f 72 74 20 62 65 66 6f 72 65 20 73 79 6d 62 6f  ort before symbo
209a0 6c 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  ls that begin wi
209b0 74 68 20 6c 6f 77 65 72 20 63 61 73 65 20 6c 65  th lower case le
209c0 74 74 65 72 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65  tters.** (non-te
209d0 72 6d 69 6e 61 6c 73 29 2e 20 20 4f 74 68 65 72  rminals).  Other
209e0 20 74 68 61 6e 20 74 68 61 74 2c 20 74 68 65 20   than that, the 
209f0 6f 72 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 6d  order does not m
20a00 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  atter..**.** We 
20a10 66 69 6e 64 20 65 78 70 65 72 69 6d 65 6e 74 61  find experimenta
20a20 6c 6c 79 20 74 68 61 74 20 6c 65 61 76 69 6e 67  lly that leaving
20a30 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 69 6e 20   the symbols in 
20a40 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 0a 2a  their original.*
20a50 2a 20 6f 72 64 65 72 20 28 74 68 65 20 6f 72 64  * order (the ord
20a60 65 72 20 74 68 65 79 20 61 70 70 65 61 72 65 64  er they appeared
20a70 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
20a80 66 69 6c 65 29 20 67 69 76 65 73 20 74 68 65 0a  file) gives the.
20a90 2a 2a 20 73 6d 61 6c 6c 65 73 74 20 70 61 72 73  ** smallest pars
20aa0 65 72 20 74 61 62 6c 65 73 20 69 6e 20 53 51 4c  er tables in SQL
20ab0 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20 53 79 6d 62  ite..*/.int Symb
20ac0 6f 6c 63 6d 70 70 28 63 6f 6e 73 74 20 76 6f 69  olcmpp(const voi
20ad0 64 20 2a 5f 61 2c 20 63 6f 6e 73 74 20 76 6f 69  d *_a, const voi
20ae0 64 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e 73 74  d *_b).{.  const
20af0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
20b00 2a 61 20 3d 20 28 63 6f 6e 73 74 20 73 74 72 75  *a = (const stru
20b10 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 5f 61  ct symbol **) _a
20b20 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  ;.  const struct
20b30 20 73 79 6d 62 6f 6c 20 2a 2a 62 20 3d 20 28 63   symbol **b = (c
20b40 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62  onst struct symb
20b50 6f 6c 20 2a 2a 29 20 5f 62 3b 0a 20 20 69 6e 74  ol **) _b;.  int
20b60 20 69 31 20 3d 20 28 2a 2a 61 29 2e 69 6e 64 65   i1 = (**a).inde
20b70 78 20 2b 20 31 30 30 30 30 30 30 30 2a 28 28 2a  x + 10000000*((*
20b80 2a 61 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 29  *a).name[0]>'Z')
20b90 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 28 2a 2a  ;.  int i2 = (**
20ba0 62 29 2e 69 6e 64 65 78 20 2b 20 31 30 30 30 30  b).index + 10000
20bb0 30 30 30 2a 28 28 2a 2a 62 29 2e 6e 61 6d 65 5b  000*((**b).name[
20bc0 30 5d 3e 27 5a 27 29 3b 0a 20 20 61 73 73 65 72  0]>'Z');.  asser
20bd0 74 28 20 69 31 21 3d 69 32 20 7c 7c 20 73 74 72  t( i1!=i2 || str
20be0 63 6d 70 28 28 2a 2a 61 29 2e 6e 61 6d 65 2c 28  cmp((**a).name,(
20bf0 2a 2a 62 29 2e 6e 61 6d 65 29 3d 3d 30 20 29 3b  **b).name)==0 );
20c00 0a 20 20 72 65 74 75 72 6e 20 69 31 2d 69 32 3b  .  return i1-i2;
20c10 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  .}../* There is 
20c20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
20c30 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
20c40 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
20c50 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20  .** associative 
20c60 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
20c70 32 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f  2"..*/.struct s_
20c80 78 32 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  x2 {.  int size;
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20ca0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
20cb0 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e  available slots.
20cc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
20cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20ce0 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77     Must be a pow
20cf0 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20  er of 2 greater 
20d00 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20  than or */.     
20d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20       /*   equal 
20d30 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  to 1 */.  int co
20d40 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  unt;            
20d50 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
20d60 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66  urrently slots f
20d70 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  illed */.  struc
20d80 74 20 73 5f 78 32 6e 6f 64 65 20 2a 74 62 6c 3b  t s_x2node *tbl;
20d90 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74    /* The data st
20da0 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73  ored here */.  s
20db0 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a  truct s_x2node *
20dc0 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61  *ht;  /* Hash ta
20dd0 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20  ble for lookups 
20de0 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  */.};../* There 
20df0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
20e00 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
20e10 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  e for every data
20e20 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61   element.** in a
20e30 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  n associative ar
20e40 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 32 22  ray of type "x2"
20e50 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
20e60 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 7b 0a 20  uct s_x2node {. 
20e70 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
20e80 64 61 74 61 3b 20 20 20 20 20 2f 2a 20 54 68 65  data;     /* The
20e90 20 64 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74   data */.  const
20ea0 20 63 68 61 72 20 2a 6b 65 79 3b 20 20 20 20 20   char *key;     
20eb0 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
20ec0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
20ed0 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
20ee0 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
20ef0 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
20f00 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  .  struct s_x2no
20f10 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
20f20 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
20f30 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x2node;../* Th
20f40 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
20f50 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
20f60 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
20f70 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
20f80 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
20f90 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c  _x2 *x2a;../* Al
20fa0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
20fb0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
20fc0 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e  /.void Symbol_in
20fd0 69 74 28 29 7b 0a 20 20 69 66 28 20 78 32 61 20  it(){.  if( x2a 
20fe0 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 32 61 20  ) return;.  x2a 
20ff0 3d 20 28 73 74 72 75 63 74 20 73 5f 78 32 2a 29  = (struct s_x2*)
21000 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
21010 74 72 75 63 74 20 73 5f 78 32 29 20 29 3b 0a 20  truct s_x2) );. 
21020 20 69 66 28 20 78 32 61 20 29 7b 0a 20 20 20 20   if( x2a ){.    
21030 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b  x2a->size = 128;
21040 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e 74 20  .    x2a->count 
21050 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e 74 62  = 0;.    x2a->tb
21060 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d 61 6c  l = (x2node*)mal
21070 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a  loc( .      (siz
21080 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69  eof(x2node) + si
21090 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a 31  zeof(x2node*))*1
210a0 32 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78 32  28 );.    if( x2
210b0 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
210c0 20 20 20 66 72 65 65 28 78 32 61 29 3b 0a 20 20     free(x2a);.  
210d0 20 20 20 20 78 32 61 20 3d 20 30 3b 0a 20 20 20      x2a = 0;.   
210e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
210f0 74 20 69 3b 0a 20 20 20 20 20 20 78 32 61 2d 3e  t i;.      x2a->
21100 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26  ht = (x2node**)&
21110 28 78 32 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b  (x2a->tbl[128]);
21120 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
21130 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 32 61 2d  i<128; i++) x2a-
21140 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
21150 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
21160 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
21170 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
21180 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
21190 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
211a0 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
211b0 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
211c0 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
211d0 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .int Symbol_inse
211e0 72 74 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  rt(struct symbol
211f0 20 2a 64 61 74 61 2c 20 63 6f 6e 73 74 20 63 68   *data, const ch
21200 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 78 32 6e  ar *key).{.  x2n
21210 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68  ode *np;.  int h
21220 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69  ;.  int ph;..  i
21230 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75  f( x2a==0 ) retu
21240 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72  rn 0;.  ph = str
21250 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d  hash(key);.  h =
21260 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65   ph & (x2a->size
21270 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d  -1);.  np = x2a-
21280 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
21290 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
212a0 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65  trcmp(np->key,ke
212b0 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  y)==0 ){.      /
212c0 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  * An existing en
212d0 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
212e0 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20  e key is found. 
212f0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  */.      /* Fail
21300 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69   because overwri
21310 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73  te is not allows
21320 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
21330 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
21340 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
21350 7d 0a 20 20 69 66 28 20 78 32 61 2d 3e 63 6f 75  }.  if( x2a->cou
21360 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a 65 20 29 7b  nt>=x2a->size ){
21370 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
21380 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
21390 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20  ble bigger */.  
213a0 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20    int i,size;.  
213b0 20 20 73 74 72 75 63 74 20 73 5f 78 32 20 61 72    struct s_x2 ar
213c0 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73  ray;.    array.s
213d0 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 32 61  ize = size = x2a
213e0 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72  ->size*2;.    ar
213f0 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 32 61 2d  ray.count = x2a-
21400 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61  >count;.    arra
21410 79 2e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a  y.tbl = (x2node*
21420 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28  )malloc(.      (
21430 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b  sizeof(x2node) +
21440 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29   sizeof(x2node*)
21450 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66  )*size );.    if
21460 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29  ( array.tbl==0 )
21470 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46   return 0;  /* F
21480 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f  ail due to mallo
21490 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20  c failure */.   
214a0 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 32 6e   array.ht = (x2n
214b0 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62  ode**)&(array.tb
214c0 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f  l[size]);.    fo
214d0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
214e0 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20  ++) array.ht[i] 
214f0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
21500 3b 20 69 3c 78 32 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x2a->count; 
21510 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 32 6e 6f  i++){.      x2no
21520 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e  de *oldnp, *newn
21530 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d  p;.      oldnp =
21540 20 26 28 78 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b   &(x2a->tbl[i]);
21550 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72 68 61  .      h = strha
21560 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26  sh(oldnp->key) &
21570 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20   (size-1);.     
21580 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
21590 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
215a0 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
215b0 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
215c0 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
215d0 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
215e0 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
215f0 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
21600 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d  np->key = oldnp-
21610 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e  >key;.      newn
21620 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
21630 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
21640 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
21650 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
21660 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
21670 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
21680 66 72 65 65 28 78 32 61 2d 3e 74 62 6c 29 3b 0a  free(x2a->tbl);.
21690 20 20 20 20 2a 78 32 61 20 3d 20 61 72 72 61 79      *x2a = array
216a0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
216b0 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
216c0 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32  /.  h = ph & (x2
216d0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
216e0 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b 78 32   = &(x2a->tbl[x2
216f0 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
21700 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20  np->key = key;. 
21710 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
21720 3b 0a 20 20 69 66 28 20 78 32 61 2d 3e 68 74 5b  ;.  if( x2a->ht[
21730 68 5d 20 29 20 78 32 61 2d 3e 68 74 5b 68 5d 2d  h] ) x2a->ht[h]-
21740 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
21750 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
21760 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x2a->ht[h];.  
21770 78 32 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x2a->ht[h] = np;
21780 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
21790 78 32 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x2a->ht[h]);.  r
217a0 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
217b0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
217c0 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
217d0 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
217e0 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
217f0 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
21800 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d  y. */.struct sym
21810 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64  bol *Symbol_find
21820 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79  (const char *key
21830 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78  ).{.  int h;.  x
21840 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  2node *np;..  if
21850 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x2a==0 ) retur
21860 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61  n 0;.  h = strha
21870 73 68 28 6b 65 79 29 20 26 20 28 78 32 61 2d 3e  sh(key) & (x2a->
21880 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
21890 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x2a->ht[h];.  wh
218a0 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
218b0 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65  f( strcmp(np->ke
218c0 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61  y,key)==0 ) brea
218d0 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e  k;.    np = np->
218e0 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  next;.  }.  retu
218f0 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61  rn np ? np->data
21900 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75   : 0;.}../* Retu
21910 72 6e 20 74 68 65 20 6e 2d 74 68 20 64 61 74 61  rn the n-th data
21920 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
21930 66 20 6e 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f n is out of ra
21940 6e 67 65 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  nge. */.struct s
21950 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74  ymbol *Symbol_Nt
21960 68 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73 74 72  h(int n).{.  str
21970 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61  uct symbol *data
21980 3b 0a 20 20 69 66 28 20 78 32 61 20 26 26 20 6e  ;.  if( x2a && n
21990 3e 30 20 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f  >0 && n<=x2a->co
219a0 75 6e 74 20 29 7b 0a 20 20 20 20 64 61 74 61 20  unt ){.    data 
219b0 3d 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e  = x2a->tbl[n-1].
219c0 64 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  data;.  }else{. 
219d0 20 20 20 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d     data = 0;.  }
219e0 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61 3b 0a  .  return data;.
219f0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
21a00 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
21a10 61 79 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c  ay */.int Symbol
21a20 5f 63 6f 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74  _count().{.  ret
21a30 75 72 6e 20 78 32 61 20 3f 20 78 32 61 2d 3e 63  urn x2a ? x2a->c
21a40 6f 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  ount : 0;.}../* 
21a50 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20  Return an array 
21a60 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  of pointers to a
21a70 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  ll data in the t
21a80 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72  able..** The arr
21a90 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ay is obtained f
21aa0 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74  rom malloc.  Ret
21ab0 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f  urn NULL if memo
21ac0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
21ad0 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66   problems, or if
21ae0 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65 6d   the array is em
21af0 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  pty. */.struct s
21b00 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61  ymbol **Symbol_a
21b10 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72  rrayof().{.  str
21b20 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72  uct symbol **arr
21b30 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65  ay;.  int i,size
21b40 3b 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29  ;.  if( x2a==0 )
21b50 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a   return 0;.  siz
21b60 65 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a  e = x2a->count;.
21b70 20 20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63    array = (struc
21b80 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 63 61 6c 6c  t symbol **)call
21b90 6f 63 28 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28  oc(size, sizeof(
21ba0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29  struct symbol *)
21bb0 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29  );.  if( array )
21bc0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
21bd0 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
21be0 79 5b 69 5d 20 3d 20 78 32 61 2d 3e 74 62 6c 5b  y[i] = x2a->tbl[
21bf0 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72  i].data;.  }.  r
21c00 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a  eturn array;.}..
21c10 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 63  /* Compare two c
21c20 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f  onfigurations */
21c30 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 63  .int Configcmp(c
21c40 6f 6e 73 74 20 63 68 61 72 20 2a 5f 61 2c 63 6f  onst char *_a,co
21c50 6e 73 74 20 63 68 61 72 20 2a 5f 62 29 0a 7b 0a  nst char *_b).{.
21c60 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 63    const struct c
21c70 6f 6e 66 69 67 20 2a 61 20 3d 20 28 73 74 72 75  onfig *a = (stru
21c80 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f 61 3b  ct config *) _a;
21c90 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
21ca0 63 6f 6e 66 69 67 20 2a 62 20 3d 20 28 73 74 72  config *b = (str
21cb0 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f 62  uct config *) _b
21cc0 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78 20 3d  ;.  int x;.  x =
21cd0 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20   a->rp->index - 
21ce0 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20  b->rp->index;.  
21cf0 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 61  if( x==0 ) x = a
21d00 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a  ->dot - b->dot;.
21d10 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f    return x;.}../
21d20 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  * Compare two st
21d30 61 74 65 73 20 2a 2f 0a 50 52 49 56 41 54 45 20  ates */.PRIVATE 
21d40 69 6e 74 20 73 74 61 74 65 63 6d 70 28 73 74 72  int statecmp(str
21d50 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 2c 20 73  uct config *a, s
21d60 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 29  truct config *b)
21d70 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 66  .{.  int rc;.  f
21d80 6f 72 28 72 63 3d 30 3b 20 72 63 3d 3d 30 20 26  or(rc=0; rc==0 &
21d90 26 20 61 20 26 26 20 62 3b 20 20 61 3d 61 2d 3e  & a && b;  a=a->
21da0 62 70 2c 20 62 3d 62 2d 3e 62 70 29 7b 0a 20 20  bp, b=b->bp){.  
21db0 20 20 72 63 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e    rc = a->rp->in
21dc0 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64  dex - b->rp->ind
21dd0 65 78 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ex;.    if( rc==
21de0 30 20 29 20 72 63 20 3d 20 61 2d 3e 64 6f 74 20  0 ) rc = a->dot 
21df0 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20  - b->dot;.  }.  
21e00 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
21e10 20 69 66 28 20 61 20 29 20 72 63 20 3d 20 31 3b   if( a ) rc = 1;
21e20 0a 20 20 20 20 69 66 28 20 62 20 29 20 72 63 20  .    if( b ) rc 
21e30 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
21e40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73  rn rc;.}../* Has
21e50 68 20 61 20 73 74 61 74 65 20 2a 2f 0a 50 52 49  h a state */.PRI
21e60 56 41 54 45 20 69 6e 74 20 73 74 61 74 65 68 61  VATE int stateha
21e70 73 68 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  sh(struct config
21e80 20 2a 61 29 0a 7b 0a 20 20 69 6e 74 20 68 3d 30   *a).{.  int h=0
21e90 3b 0a 20 20 77 68 69 6c 65 28 20 61 20 29 7b 0a  ;.  while( a ){.
21ea0 20 20 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20      h = h*571 + 
21eb0 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20  a->rp->index*37 
21ec0 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 20 20 61 20  + a->dot;.    a 
21ed0 3d 20 61 2d 3e 62 70 3b 0a 20 20 7d 0a 20 20 72  = a->bp;.  }.  r
21ee0 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 41  eturn h;.}../* A
21ef0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 74  llocate a new st
21f00 61 74 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ate structure */
21f10 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53  .struct state *S
21f20 74 61 74 65 5f 6e 65 77 28 29 0a 7b 0a 20 20 73  tate_new().{.  s
21f30 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77  truct state *new
21f40 73 74 61 74 65 3b 0a 20 20 6e 65 77 73 74 61 74  state;.  newstat
21f50 65 20 3d 20 28 73 74 72 75 63 74 20 73 74 61 74  e = (struct stat
21f60 65 20 2a 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69  e *)calloc(1, si
21f70 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74 61 74  zeof(struct stat
21f80 65 29 20 29 3b 0a 20 20 4d 65 6d 6f 72 79 43 68  e) );.  MemoryCh
21f90 65 63 6b 28 6e 65 77 73 74 61 74 65 29 3b 0a 20  eck(newstate);. 
21fa0 20 72 65 74 75 72 6e 20 6e 65 77 73 74 61 74 65   return newstate
21fb0 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  ;.}../* There is
21fc0 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
21fd0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
21fe0 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63  tructure for eac
21ff0 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65  h.** associative
22000 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
22010 78 33 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73  x3"..*/.struct s
22020 5f 78 33 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65  _x3 {.  int size
22030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22040 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
22050 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73   available slots
22060 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22080 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f  *   Must be a po
22090 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72  wer of 2 greater
220a0 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20   than or */.    
220b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220c0 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c        /*   equal
220d0 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63   to 1 */.  int c
220e0 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ount;           
220f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22100 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20  currently slots 
22110 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75  filled */.  stru
22120 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 74 62 6c  ct s_x3node *tbl
22130 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73  ;  /* The data s
22140 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20  tored here */.  
22150 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
22160 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74  **ht;  /* Hash t
22170 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73  able for lookups
22180 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65   */.};../* There
22190 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
221a0 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
221b0 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  re for every dat
221c0 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20  a element.** in 
221d0 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  an associative a
221e0 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 33  rray of type "x3
221f0 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  "..*/.typedef st
22200 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 7b 0a  ruct s_x3node {.
22210 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
22220 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  data;           
22230 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
22240 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63  ta */.  struct c
22250 6f 6e 66 69 67 20 2a 6b 65 79 3b 20 20 20 20 20  onfig *key;     
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22270 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74   The key */.  st
22280 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 6e  ruct s_x3node *n
22290 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65  ext;   /* Next e
222a0 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
222b0 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72  me hash */.  str
222c0 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 66  uct s_x3node **f
222d0 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75  rom;  /* Previou
222e0 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 33 6e 6f  s link */.} x3no
222f0 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  de;../* There is
22300 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e   only one instan
22310 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c  ce of the array,
22320 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f   which is the fo
22330 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69  llowing */.stati
22340 63 20 73 74 72 75 63 74 20 73 5f 78 33 20 2a 78  c struct s_x3 *x
22350 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  3a;../* Allocate
22360 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69   a new associati
22370 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64  ve array */.void
22380 20 53 74 61 74 65 5f 69 6e 69 74 28 29 7b 0a 20   State_init(){. 
22390 20 69 66 28 20 78 33 61 20 29 20 72 65 74 75 72   if( x3a ) retur
223a0 6e 3b 0a 20 20 78 33 61 20 3d 20 28 73 74 72 75  n;.  x3a = (stru
223b0 63 74 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f 63 28  ct s_x3*)malloc(
223c0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
223d0 5f 78 33 29 20 29 3b 0a 20 20 69 66 28 20 78 33  _x3) );.  if( x3
223e0 61 20 29 7b 0a 20 20 20 20 78 33 61 2d 3e 73 69  a ){.    x3a->si
223f0 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 33  ze = 128;.    x3
22400 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
22410 20 20 78 33 61 2d 3e 74 62 6c 20 3d 20 28 78 33    x3a->tbl = (x3
22420 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20  node*)malloc( . 
22430 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 33 6e       (sizeof(x3n
22440 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33  ode) + sizeof(x3
22450 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a 20  node*))*128 );. 
22460 20 20 20 69 66 28 20 78 33 61 2d 3e 74 62 6c 3d     if( x3a->tbl=
22470 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  =0 ){.      free
22480 28 78 33 61 29 3b 0a 20 20 20 20 20 20 78 33 61  (x3a);.      x3a
22490 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
224a0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
224b0 20 20 20 20 78 33 61 2d 3e 68 74 20 3d 20 28 78      x3a->ht = (x
224c0 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d 3e 74  3node**)&(x3a->t
224d0 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20  bl[128]);.      
224e0 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20  for(i=0; i<128; 
224f0 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69 5d 20  i++) x3a->ht[i] 
22500 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
22510 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  ./* Insert a new
22520 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
22530 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
22540 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66  TRUE if successf
22550 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74  ul..** Prior dat
22560 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  a with the same 
22570 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77  key is NOT overw
22580 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74  ritten */.int St
22590 61 74 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63  ate_insert(struc
225a0 74 20 73 74 61 74 65 20 2a 64 61 74 61 2c 20 73  t state *data, s
225b0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
225c0 79 29 0a 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e  y).{.  x3node *n
225d0 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e  p;.  int h;.  in
225e0 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 33 61  t ph;..  if( x3a
225f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
22600 20 20 70 68 20 3d 20 73 74 61 74 65 68 61 73 68    ph = statehash
22610 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20  (key);.  h = ph 
22620 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x3a->size-1);
22630 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b  .  np = x3a->ht[
22640 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
22650 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74 65  ){.    if( state
22660 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29  cmp(np->key,key)
22670 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
22680 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  An existing entr
22690 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
226a0 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f  key is found. */
226b0 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62  .      /* Fail b
226c0 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65  ecause overwrite
226d0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20   is not allows. 
226e0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
226f0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20  0;.    }.    np 
22700 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
22710 20 20 69 66 28 20 78 33 61 2d 3e 63 6f 75 6e 74    if( x3a->count
22720 3e 3d 78 33 61 2d 3e 73 69 7a 65 20 29 7b 0a 20  >=x3a->size ){. 
22730 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61     /* Need to ma
22740 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  ke the hash tabl
22750 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20  e bigger */.    
22760 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20  int i,size;.    
22770 73 74 72 75 63 74 20 73 5f 78 33 20 61 72 72 61  struct s_x3 arra
22780 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
22790 65 20 3d 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e  e = size = x3a->
227a0 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61  size*2;.    arra
227b0 79 2e 63 6f 75 6e 74 20 3d 20 78 33 61 2d 3e 63  y.count = x3a->c
227c0 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e  ount;.    array.
227d0 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d  tbl = (x3node*)m
227e0 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69  alloc(.      (si
227f0 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73  zeof(x3node) + s
22800 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a  izeof(x3node*))*
22810 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  size );.    if( 
22820 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72  array.tbl==0 ) r
22830 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69  eturn 0;  /* Fai
22840 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  l due to malloc 
22850 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61  failure */.    a
22860 72 72 61 79 2e 68 74 20 3d 20 28 78 33 6e 6f 64  rray.ht = (x3nod
22870 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b  e**)&(array.tbl[
22880 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  size]);.    for(
22890 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
228a0 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20  ) array.ht[i] = 
228b0 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
228c0 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b  i<x3a->count; i+
228d0 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64 65  +){.      x3node
228e0 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b   *oldnp, *newnp;
228f0 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26  .      oldnp = &
22900 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20  (x3a->tbl[i]);. 
22910 20 20 20 20 20 68 20 3d 20 73 74 61 74 65 68 61       h = stateha
22920 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26  sh(oldnp->key) &
22930 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20   (size-1);.     
22940 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
22950 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
22960 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
22970 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
22980 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
22990 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
229a0 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
229b0 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
229c0 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d  np->key = oldnp-
229d0 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e  >key;.      newn
229e0 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
229f0 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
22a00 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
22a10 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
22a20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
22a30 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
22a40 66 72 65 65 28 78 33 61 2d 3e 74 62 6c 29 3b 0a  free(x3a->tbl);.
22a50 20 20 20 20 2a 78 33 61 20 3d 20 61 72 72 61 79      *x3a = array
22a60 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
22a70 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
22a80 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33  /.  h = ph & (x3
22a90 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
22aa0 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 78 33   = &(x3a->tbl[x3
22ab0 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
22ac0 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20  np->key = key;. 
22ad0 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
22ae0 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e 68 74 5b  ;.  if( x3a->ht[
22af0 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b 68 5d 2d  h] ) x3a->ht[h]-
22b00 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
22b10 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
22b20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x3a->ht[h];.  
22b30 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x3a->ht[h] = np;
22b40 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
22b50 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x3a->ht[h]);.  r
22b60 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
22b70 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
22b80 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
22b90 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
22ba0 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
22bb0 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
22bc0 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61  y. */.struct sta
22bd0 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 73  te *State_find(s
22be0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
22bf0 79 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  y).{.  int h;.  
22c00 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69  x3node *np;..  i
22c10 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75  f( x3a==0 ) retu
22c20 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 61 74  rn 0;.  h = stat
22c30 65 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 33  ehash(key) & (x3
22c40 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
22c50 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x3a->ht[h];. 
22c60 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
22c70 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e    if( statecmp(n
22c80 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29  p->key,key)==0 )
22c90 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
22ca0 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
22cb0 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
22cc0 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
22cd0 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79   Return an array
22ce0 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
22cf0 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20  all data in the 
22d00 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72  table..** The ar
22d10 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ray is obtained 
22d20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65  from malloc.  Re
22d30 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d  turn NULL if mem
22d40 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
22d50 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69  * problems, or i
22d60 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65  f the array is e
22d70 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20  mpty. */.struct 
22d80 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72  state **State_ar
22d90 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75  rayof().{.  stru
22da0 63 74 20 73 74 61 74 65 20 2a 2a 61 72 72 61 79  ct state **array
22db0 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a  ;.  int i,size;.
22dc0 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72    if( x3a==0 ) r
22dd0 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20  eturn 0;.  size 
22de0 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x3a->count;.  
22df0 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20  array = (struct 
22e00 73 74 61 74 65 20 2a 2a 29 6d 61 6c 6c 6f 63 28  state **)malloc(
22e10 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
22e20 74 61 74 65 20 2a 29 2a 73 69 7a 65 20 29 3b 0a  tate *)*size );.
22e30 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a 20    if( array ){. 
22e40 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
22e50 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69  ze; i++) array[i
22e60 5d 20 3d 20 78 33 61 2d 3e 74 62 6c 5b 69 5d 2e  ] = x3a->tbl[i].
22e70 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75  data;.  }.  retu
22e80 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20  rn array;.}../* 
22e90 48 61 73 68 20 61 20 63 6f 6e 66 69 67 75 72 61  Hash a configura
22ea0 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20  tion */.PRIVATE 
22eb0 69 6e 74 20 63 6f 6e 66 69 67 68 61 73 68 28 73  int confighash(s
22ec0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 29  truct config *a)
22ed0 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b 0a 20 20  .{.  int h=0;.  
22ee0 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72  h = h*571 + a->r
22ef0 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d  p->index*37 + a-
22f00 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 68  >dot;.  return h
22f10 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  ;.}../* There is
22f20 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
22f30 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
22f40 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63  tructure for eac
22f50 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65  h.** associative
22f60 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
22f70 78 34 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73  x4"..*/.struct s
22f80 5f 78 34 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65  _x4 {.  int size
22f90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22fa0 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
22fb0 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73   available slots
22fc0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22fe0 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f  *   Must be a po
22ff0 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72  wer of 2 greater
23000 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20   than or */.    
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23020 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c        /*   equal
23030 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63   to 1 */.  int c
23040 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ount;           
23050 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
23060 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20  currently slots 
23070 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75  filled */.  stru
23080 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 74 62 6c  ct s_x4node *tbl
23090 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73  ;  /* The data s
230a0 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20  tored here */.  
230b0 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
230c0 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74  **ht;  /* Hash t
230d0 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73  able for lookups
230e0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65   */.};../* There
230f0 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
23100 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
23110 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  re for every dat
23120 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20  a element.** in 
23130 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  an associative a
23140 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 34  rray of type "x4
23150 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  "..*/.typedef st
23160 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 7b 0a  ruct s_x4node {.
23170 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
23180 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
23190 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
231a0 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ata */.  struct 
231b0 73 5f 78 34 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x4node *next; 
231c0 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
231d0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
231e0 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
231f0 5f 78 34 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x4node **from; 
23200 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
23210 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a  k */.} x4node;..
23220 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
23230 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
23240 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
23250 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
23260 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
23270 75 63 74 20 73 5f 78 34 20 2a 78 34 61 3b 0a 0a  uct s_x4 *x4a;..
23280 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
23290 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
232a0 72 61 79 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  ray */.void Conf
232b0 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 7b 0a  igtable_init(){.
232c0 20 20 69 66 28 20 78 34 61 20 29 20 72 65 74 75    if( x4a ) retu
232d0 72 6e 3b 0a 20 20 78 34 61 20 3d 20 28 73 74 72  rn;.  x4a = (str
232e0 75 63 74 20 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63  uct s_x4*)malloc
232f0 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
23300 73 5f 78 34 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x4) );.  if( x
23310 34 61 20 29 7b 0a 20 20 20 20 78 34 61 2d 3e 73  4a ){.    x4a->s
23320 69 7a 65 20 3d 20 36 34 3b 0a 20 20 20 20 78 34  ize = 64;.    x4
23330 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
23340 20 20 78 34 61 2d 3e 74 62 6c 20 3d 20 28 78 34    x4a->tbl = (x4
23350 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20  node*)malloc( . 
23360 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 34 6e       (sizeof(x4n
23370 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34  ode) + sizeof(x4
23380 6e 6f 64 65 2a 29 29 2a 36 34 20 29 3b 0a 20 20  node*))*64 );.  
23390 20 20 69 66 28 20 78 34 61 2d 3e 74 62 6c 3d 3d    if( x4a->tbl==
233a0 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
233b0 78 34 61 29 3b 0a 20 20 20 20 20 20 78 34 61 20  x4a);.      x4a 
233c0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
233d0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
233e0 20 20 20 78 34 61 2d 3e 68 74 20 3d 20 28 78 34     x4a->ht = (x4
233f0 6e 6f 64 65 2a 2a 29 26 28 78 34 61 2d 3e 74 62  node**)&(x4a->tb
23400 6c 5b 36 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f  l[64]);.      fo
23410 72 28 69 3d 30 3b 20 69 3c 36 34 3b 20 69 2b 2b  r(i=0; i<64; i++
23420 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x4a->ht[i] = 0
23430 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
23440 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
23450 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
23460 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
23470 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
23480 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
23490 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
234a0 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
234b0 74 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69  ten */.int Confi
234c0 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 73 74  gtable_insert(st
234d0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74  ruct config *dat
234e0 61 29 0a 7b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e  a).{.  x4node *n
234f0 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e  p;.  int h;.  in
23500 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 34 61  t ph;..  if( x4a
23510 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
23520 20 20 70 68 20 3d 20 63 6f 6e 66 69 67 68 61 73    ph = confighas
23530 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70  h(data);.  h = p
23540 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31  h & (x4a->size-1
23550 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68  );.  np = x4a->h
23560 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
23570 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e  p ){.    if( Con
23580 66 69 67 63 6d 70 28 28 63 6f 6e 73 74 20 63 68  figcmp((const ch
23590 61 72 20 2a 29 20 6e 70 2d 3e 64 61 74 61 2c 28  ar *) np->data,(
235a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 64 61  const char *) da
235b0 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ta)==0 ){.      
235c0 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65  /* An existing e
235d0 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
235e0 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e  me key is found.
235f0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   */.      /* Fai
23600 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72  l because overwr
23610 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ite is not allow
23620 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  s. */.      retu
23630 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
23640 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
23650 20 7d 0a 20 20 69 66 28 20 78 34 61 2d 3e 63 6f   }.  if( x4a->co
23660 75 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a 65 20 29  unt>=x4a->size )
23670 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
23680 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
23690 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20  able bigger */. 
236a0 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20     int i,size;. 
236b0 20 20 20 73 74 72 75 63 74 20 73 5f 78 34 20 61     struct s_x4 a
236c0 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e  rray;.    array.
236d0 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 34  size = size = x4
236e0 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61  a->size*2;.    a
236f0 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 34 61  rray.count = x4a
23700 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72  ->count;.    arr
23710 61 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65  ay.tbl = (x4node
23720 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  *)malloc(.      
23730 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20  (sizeof(x4node) 
23740 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a  + sizeof(x4node*
23750 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69  ))*size );.    i
23760 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20  f( array.tbl==0 
23770 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
23780 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c  Fail due to mall
23790 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20  oc failure */.  
237a0 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 34    array.ht = (x4
237b0 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74  node**)&(array.t
237c0 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66  bl[size]);.    f
237d0 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20  or(i=0; i<size; 
237e0 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d  i++) array.ht[i]
237f0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
23800 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b  0; i<x4a->count;
23810 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 34 6e   i++){.      x4n
23820 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77  ode *oldnp, *new
23830 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20  np;.      oldnp 
23840 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 29  = &(x4a->tbl[i])
23850 3b 0a 20 20 20 20 20 20 68 20 3d 20 63 6f 6e 66  ;.      h = conf
23860 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61  ighash(oldnp->da
23870 74 61 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a  ta) & (size-1);.
23880 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28        newnp = &(
23890 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20  array.tbl[i]);. 
238a0 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68       if( array.h
238b0 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b  t[h] ) array.ht[
238c0 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77  h]->from = &(new
238d0 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20  np->next);.     
238e0 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61   newnp->next = a
238f0 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20  rray.ht[h];.    
23900 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20    newnp->data = 
23910 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20  oldnp->data;.   
23920 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d     newnp->from =
23930 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b   &(array.ht[h]);
23940 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b  .      array.ht[
23950 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20  h] = newnp;.    
23960 7d 0a 20 20 20 20 66 72 65 65 28 78 34 61 2d 3e  }.    free(x4a->
23970 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34 61 20 3d  tbl);.    *x4a =
23980 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a   array;.  }.  /*
23990 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
239a0 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68  data */.  h = ph
239b0 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29   & (x4a->size-1)
239c0 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34 61 2d 3e  ;.  np = &(x4a->
239d0 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b  tbl[x4a->count++
239e0 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d  ]);.  np->data =
239f0 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 34 61   data;.  if( x4a
23a00 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61 2d 3e 68  ->ht[h] ) x4a->h
23a10 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
23a20 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e  p->next);.  np->
23a30 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68 74 5b 68  next = x4a->ht[h
23a40 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b 68 5d 20  ];.  x4a->ht[h] 
23a50 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d  = np;.  np->from
23a60 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b 68 5d 29   = &(x4a->ht[h])
23a70 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
23a80 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
23a90 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73  nter to data ass
23aa0 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76  igned to the giv
23ab0 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20  en key.  Return 
23ac0 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75  NULL.** if no su
23ad0 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63  ch key. */.struc
23ae0 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
23af0 74 61 62 6c 65 5f 66 69 6e 64 28 73 74 72 75 63  table_find(struc
23b00 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b  t config *key).{
23b10 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 34 6e 6f  .  int h;.  x4no
23b20 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78  de *np;..  if( x
23b30 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  4a==0 ) return 0
23b40 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61  ;.  h = configha
23b50 73 68 28 6b 65 79 29 20 26 20 28 78 34 61 2d 3e  sh(key) & (x4a->
23b60 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
23b70 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x4a->ht[h];.  wh
23b80 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
23b90 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 28 63 6f  f( Configcmp((co
23ba0 6e 73 74 20 63 68 61 72 20 2a 29 20 6e 70 2d 3e  nst char *) np->
23bb0 64 61 74 61 2c 28 63 6f 6e 73 74 20 63 68 61 72  data,(const char
23bc0 20 2a 29 20 6b 65 79 29 3d 3d 30 20 29 20 62 72   *) key)==0 ) br
23bd0 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70  eak;.    np = np
23be0 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  ->next;.  }.  re
23bf0 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61  turn np ? np->da
23c00 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  ta : 0;.}../* Re
23c10 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61 20 66 72  move all data fr
23c20 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e 20 20 50  om the table.  P
23c30 61 73 73 20 65 61 63 68 20 64 61 74 61 20 74 6f  ass each data to
23c40 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 66   the function "f
23c50 22 0a 2a 2a 20 61 73 20 69 74 20 69 73 20 72 65  ".** as it is re
23c60 6d 6f 76 65 64 2e 20 20 28 22 66 22 20 6d 61 79  moved.  ("f" may
23c70 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61 76 6f 69   be null to avoi
23c80 64 20 74 68 69 73 20 73 74 65 70 2e 29 20 2a 2f  d this step.) */
23c90 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c  .void Configtabl
23ca0 65 5f 63 6c 65 61 72 28 69 6e 74 28 2a 66 29 28  e_clear(int(*f)(
23cb0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
23cc0 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ).{.  int i;.  i
23cd0 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20 78 34 61  f( x4a==0 || x4a
23ce0 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20 72 65 74  ->count==0 ) ret
23cf0 75 72 6e 3b 0a 20 20 69 66 28 20 66 20 29 20 66  urn;.  if( f ) f
23d00 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63  or(i=0; i<x4a->c
23d10 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a 66 29 28  ount; i++) (*f)(
23d20 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61  x4a->tbl[i].data
23d30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
23d40 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29 20  x4a->size; i++) 
23d50 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a  x4a->ht[i] = 0;.
23d60 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x4a->count = 0
23d70 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        ;.  return;.}.