/ Hex Artifact Content
Login

Artifact 90f46af31c92b940fec25b491f39409fd95dcdfa:


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 69 6e 74 20 53 65 74 41 64 64 28 63 68 61 72  .int SetAdd(char
0db0: 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20 20 20  *,int);         
0dc0: 20 20 20 2f 2a 20 41 64 64 20 65 6c 65 6d 65 6e     /* Add elemen
0dd0: 74 20 74 6f 20 61 20 73 65 74 20 2a 2f 0a 69 6e  t to a set */.in
0de0: 74 20 53 65 74 55 6e 69 6f 6e 28 63 68 61 72 20  t SetUnion(char 
0df0: 2a 2c 63 68 61 72 20 2a 29 3b 20 20 20 20 2f 2a  *,char *);    /*
0e00: 20 41 20 3c 2d 20 41 20 55 20 42 2c 20 74 68 72   A <- A U B, thr
0e10: 75 20 65 6c 65 6d 65 6e 74 20 4e 20 2a 2f 0a 23  u element N */.#
0e20: 64 65 66 69 6e 65 20 53 65 74 46 69 6e 64 28 58  define SetFind(X
0e30: 2c 59 29 20 28 58 5b 59 5d 29 20 20 20 20 20 20  ,Y) (X[Y])      
0e40: 20 2f 2a 20 54 72 75 65 20 69 66 20 59 20 69 73   /* True if Y is
0e50: 20 69 6e 20 73 65 74 20 58 20 2a 2f 0a 0a 2f 2a   in set X */../*
0e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
0e70: 68 65 20 66 69 6c 65 20 22 73 74 72 75 63 74 2e  he file "struct.
0e80: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
0e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
0eb0: 50 72 69 6e 63 69 70 61 6c 20 64 61 74 61 20 73  Principal data s
0ec0: 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68  tructures for th
0ed0: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
0ee0: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 74 79  enerator..*/..ty
0ef0: 70 65 64 65 66 20 65 6e 75 6d 20 7b 4c 45 4d 4f  pedef enum {LEMO
0f00: 4e 5f 46 41 4c 53 45 3d 30 2c 20 4c 45 4d 4f 4e  N_FALSE=0, LEMON
0f10: 5f 54 52 55 45 7d 20 42 6f 6f 6c 65 61 6e 3b 0a  _TRUE} Boolean;.
0f20: 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20 28 74 65 72  ./* Symbols (ter
0f30: 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65  minals and nonte
0f40: 72 6d 69 6e 61 6c 73 29 20 6f 66 20 74 68 65 20  rminals) of the 
0f50: 67 72 61 6d 6d 61 72 20 61 72 65 20 73 74 6f 72  grammar are stor
0f60: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c  ed.** in the fol
0f70: 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 65 6e 75 6d 20  lowing: */.enum 
0f80: 73 79 6d 62 6f 6c 5f 74 79 70 65 20 7b 0a 20 20  symbol_type {.  
0f90: 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 4e 4f 4e 54  TERMINAL,.  NONT
0fa0: 45 52 4d 49 4e 41 4c 2c 0a 20 20 4d 55 4c 54 49  ERMINAL,.  MULTI
0fb0: 54 45 52 4d 49 4e 41 4c 0a 7d 3b 0a 65 6e 75 6d  TERMINAL.};.enum
0fc0: 20 65 5f 61 73 73 6f 63 20 7b 0a 20 20 20 20 4c   e_assoc {.    L
0fd0: 45 46 54 2c 0a 20 20 20 20 52 49 47 48 54 2c 0a  EFT,.    RIGHT,.
0fe0: 20 20 20 20 4e 4f 4e 45 2c 0a 20 20 20 20 55 4e      NONE,.    UN
0ff0: 4b 0a 7d 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  K.};.struct symb
1000: 6f 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ol {.  const cha
1010: 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  r *name;        
1020: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
1030: 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  ymbol */.  int i
1040: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
1050: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
1060: 62 65 72 20 66 6f 72 20 74 68 69 73 20 73 79 6d  ber for this sym
1070: 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 73 79  bol */.  enum sy
1080: 6d 62 6f 6c 5f 74 79 70 65 20 74 79 70 65 3b 20  mbol_type type; 
1090: 20 20 2f 2a 20 53 79 6d 62 6f 6c 73 20 61 72 65    /* Symbols are
10a0: 20 61 6c 6c 20 65 69 74 68 65 72 20 54 45 52 4d   all either TERM
10b0: 49 4e 41 4c 53 20 6f 72 20 4e 54 73 20 2a 2f 0a  INALS or NTs */.
10c0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
10d0: 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  ule;       /* Li
10e0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 72 75 6c  nked list of rul
10f0: 65 73 20 6f 66 20 74 68 69 73 20 28 69 66 20 61  es of this (if a
1100: 6e 20 4e 54 29 20 2a 2f 0a 20 20 73 74 72 75 63  n NT) */.  struc
1110: 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61  t symbol *fallba
1120: 63 6b 3b 20 2f 2a 20 66 61 6c 6c 62 61 63 6b 20  ck; /* fallback 
1130: 74 6f 6b 65 6e 20 69 6e 20 63 61 73 65 20 74 68  token in case th
1140: 69 73 20 74 6f 6b 65 6e 20 64 6f 65 73 6e 27 74  is token doesn't
1150: 20 70 61 72 73 65 20 2a 2f 0a 20 20 69 6e 74 20   parse */.  int 
1160: 70 72 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  prec;           
1170: 20 20 20 20 20 2f 2a 20 50 72 65 63 65 64 65 6e       /* Preceden
1180: 63 65 20 69 66 20 64 65 66 69 6e 65 64 20 28 2d  ce if defined (-
1190: 31 20 6f 74 68 65 72 77 69 73 65 29 20 2a 2f 0a  1 otherwise) */.
11a0: 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 61    enum e_assoc a
11b0: 73 73 6f 63 3b 20 20 20 20 20 20 2f 2a 20 41 73  ssoc;      /* As
11c0: 73 6f 63 69 61 74 69 76 69 74 79 20 69 66 20 70  sociativity if p
11d0: 72 65 63 65 64 65 6e 63 65 20 69 73 20 64 65 66  recedence is def
11e0: 69 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ined */.  char *
11f0: 66 69 72 73 74 73 65 74 3b 20 20 20 20 20 20 20  firstset;       
1200: 20 20 20 2f 2a 20 46 69 72 73 74 2d 73 65 74 20     /* First-set 
1210: 66 6f 72 20 61 6c 6c 20 72 75 6c 65 73 20 6f 66  for all rules of
1220: 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a   this symbol */.
1230: 20 20 42 6f 6f 6c 65 61 6e 20 6c 61 6d 62 64 61    Boolean lambda
1240: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
1250: 75 65 20 69 66 20 4e 54 20 61 6e 64 20 63 61 6e  ue if NT and can
1260: 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 6d 70   generate an emp
1270: 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 69  ty string */.  i
1280: 6e 74 20 75 73 65 43 6e 74 3b 20 20 20 20 20 20  nt useCnt;      
1290: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12a0: 72 20 6f 66 20 74 69 6d 65 73 20 75 73 65 64 20  r of times used 
12b0: 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 73 74 72  */.  char *destr
12c0: 75 63 74 6f 72 3b 20 20 20 20 20 20 20 20 2f 2a  uctor;        /*
12d0: 20 43 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   Code which exec
12e0: 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74 68  utes whenever th
12f0: 69 73 20 73 79 6d 62 6f 6c 20 69 73 0a 20 20 20  is symbol is.   
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1310: 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 70 70 65          ** poppe
1320: 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  d from the stack
1330: 20 64 75 72 69 6e 67 20 65 72 72 6f 72 20 70 72   during error pr
1340: 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e  ocessing */.  in
1350: 74 20 64 65 73 74 4c 69 6e 65 6e 6f 3b 20 20 20  t destLineno;   
1360: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
1370: 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72 74 20  umber for start 
1380: 6f 66 20 64 65 73 74 72 75 63 74 6f 72 20 2a 2f  of destructor */
1390: 0a 20 20 63 68 61 72 20 2a 64 61 74 61 74 79 70  .  char *datatyp
13a0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
13b0: 68 65 20 64 61 74 61 20 74 79 70 65 20 6f 66 20  he data type of 
13c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c 64  information held
13d0: 20 62 79 20 74 68 69 73 0a 20 20 20 20 20 20 20   by this.       
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f      ** object. O
1400: 6e 6c 79 20 75 73 65 64 20 69 66 20 74 79 70 65  nly used if type
1410: 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f  ==NONTERMINAL */
1420: 0a 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20 20  .  int dtnum;   
1430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1440: 68 65 20 64 61 74 61 20 74 79 70 65 20 6e 75 6d  he data type num
1450: 62 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61 72  ber.  In the par
1460: 73 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a 20  ser, the value. 
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61            ** sta
1490: 63 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20 20  ck is a union.  
14a0: 54 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65 6e  The .yy%d elemen
14b0: 74 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20 20  t of this.      
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d0: 20 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69 73       ** union is
14e0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 64 61 74   the correct dat
14f0: 61 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20  a type for this 
1500: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a 20 54  object */.  /* T
1510: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1520: 6c 64 73 20 61 72 65 20 75 73 65 64 20 62 79 20  lds are used by 
1530: 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73 20 6f  MULTITERMINALs o
1540: 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 75  nly */.  int nsu
1550: 62 73 79 6d 3b 20 20 20 20 20 20 20 20 20 20 20  bsym;           
1560: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1570: 6f 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62 6f  onstituent symbo
1580: 6c 73 20 69 6e 20 74 68 65 20 4d 55 4c 54 49 20  ls in the MULTI 
1590: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
15a0: 6f 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20 2f 2a  ol **subsym;  /*
15b0: 20 41 72 72 61 79 20 6f 66 20 63 6f 6e 73 74 69   Array of consti
15c0: 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 2a 2f  tuent symbols */
15d0: 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70 72 6f  .};../* Each pro
15e0: 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 69 6e 20  duction rule in 
15f0: 74 68 65 20 67 72 61 6d 6d 61 72 20 69 73 20 73  the grammar is s
1600: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 66 6f 6c  tored in the fol
1610: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  lowing.** struct
1620: 75 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63 74 20  ure.  */.struct 
1630: 72 75 6c 65 20 7b 0a 20 20 73 74 72 75 63 74 20  rule {.  struct 
1640: 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20  symbol *lhs;    
1650: 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73    /* Left-hand s
1660: 69 64 65 20 6f 66 20 74 68 65 20 72 75 6c 65 20  ide of the rule 
1670: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1680: 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 2f 2a  *lhsalias;    /*
1690: 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c   Alias for the L
16a0: 48 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65  HS (NULL if none
16b0: 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73 53 74  ) */.  int lhsSt
16c0: 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  art;            
16d0: 2f 2a 20 54 72 75 65 20 69 66 20 6c 65 66 74 2d  /* True if left-
16e0: 68 61 6e 64 20 73 69 64 65 20 69 73 20 74 68 65  hand side is the
16f0: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f   start symbol */
1700: 0a 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b  .  int ruleline;
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1720: 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ine number for t
1730: 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74  he rule */.  int
1740: 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20   nrhs;          
1750: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1760: 6f 66 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  of RHS symbols *
1770: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
1780: 6c 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20  l **rhs;     /* 
1790: 54 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 73 20  The RHS symbols 
17a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
17b0: 2a 2a 72 68 73 61 6c 69 61 73 3b 20 20 20 2f 2a  **rhsalias;   /*
17c0: 20 41 6e 20 61 6c 69 61 73 20 66 6f 72 20 65 61   An alias for ea
17d0: 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e  ch RHS symbol (N
17e0: 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a  ULL if none) */.
17f0: 20 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20    int line;     
1800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1810: 6e 65 20 6e 75 6d 62 65 72 20 61 74 20 77 68 69  ne number at whi
1820: 63 68 20 63 6f 64 65 20 62 65 67 69 6e 73 20 2a  ch code begins *
1830: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1840: 63 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  code;        /* 
1850: 54 68 65 20 63 6f 64 65 20 65 78 65 63 75 74 65  The code execute
1860: 64 20 77 68 65 6e 20 74 68 69 73 20 72 75 6c 65  d when this rule
1870: 20 69 73 20 72 65 64 75 63 65 64 20 2a 2f 0a 20   is reduced */. 
1880: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1890: 70 72 65 63 73 79 6d 3b 20 20 2f 2a 20 50 72 65  precsym;  /* Pre
18a0: 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 66  cedence symbol f
18b0: 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a  or this rule */.
18c0: 20 20 69 6e 74 20 69 6e 64 65 78 3b 20 20 20 20    int index;    
18d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
18e0: 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f   index number fo
18f0: 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20  r this rule */. 
1900: 20 42 6f 6f 6c 65 61 6e 20 63 61 6e 52 65 64 75   Boolean canRedu
1910: 63 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ce;       /* Tru
1920: 65 20 69 66 20 74 68 69 73 20 72 75 6c 65 20 69  e if this rule i
1930: 73 20 65 76 65 72 20 72 65 64 75 63 65 64 20 2a  s ever reduced *
1940: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
1950: 2a 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20  *nextlhs;    /* 
1960: 4e 65 78 74 20 72 75 6c 65 20 77 69 74 68 20 74  Next rule with t
1970: 68 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20  he same LHS */. 
1980: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65   struct rule *ne
1990: 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  xt;       /* Nex
19a0: 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 6c  t rule in the gl
19b0: 6f 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a  obal list */.};.
19c0: 0a 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72 61 74  ./* A configurat
19d0: 69 6f 6e 20 69 73 20 61 20 70 72 6f 64 75 63 74  ion is a product
19e0: 69 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68 65 20  ion rule of the 
19f0: 67 72 61 6d 6d 61 72 20 74 6f 67 65 74 68 65 72  grammar together
1a00: 20 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20   with.** a mark 
1a10: 28 64 6f 74 29 20 73 68 6f 77 69 6e 67 20 68 6f  (dot) showing ho
1a20: 77 20 6d 75 63 68 20 6f 66 20 74 68 61 74 20 72  w much of that r
1a30: 75 6c 65 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ule has been pro
1a40: 63 65 73 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a  cessed so far..*
1a50: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  * Configurations
1a60: 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20   also contain a 
1a70: 66 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63 68  follow-set which
1a80: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 65   is a list of te
1a90: 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c  rminal.** symbol
1aa0: 73 20 77 68 69 63 68 20 61 72 65 20 61 6c 6c 6f  s which are allo
1ab0: 77 65 64 20 74 6f 20 69 6d 6d 65 64 69 61 74 65  wed to immediate
1ac0: 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e  ly follow the en
1ad0: 64 20 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a  d of the rule..*
1ae0: 2a 20 45 76 65 72 79 20 63 6f 6e 66 69 67 75 72  * Every configur
1af0: 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65  ation is recorde
1b00: 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  d as an instance
1b10: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1b20: 67 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67 73 74  g: */.enum cfgst
1b30: 61 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c 45 54  atus {.  COMPLET
1b40: 45 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54 45 0a  E,.  INCOMPLETE.
1b50: 7d 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  };.struct config
1b60: 20 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65   {.  struct rule
1b70: 20 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a   *rp;         /*
1b80: 20 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77   The rule upon w
1b90: 68 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75  hich the configu
1ba0: 72 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20  ration is based 
1bb0: 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20  */.  int dot;   
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bd0: 20 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74   The parse point
1be0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b   */.  char *fws;
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c00: 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72  * Follow-set for
1c10: 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74   this configurat
1c20: 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ion only */.  st
1c30: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70  ruct plink *fplp
1c40: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ;      /* Follow
1c50: 2d 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f  -set forward pro
1c60: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a  pagation links *
1c70: 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  /.  struct plink
1c80: 20 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20   *bplp;      /* 
1c90: 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77  Follow-set backw
1ca0: 61 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e  ards propagation
1cb0: 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75   links */.  stru
1cc0: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
1cd0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1ce0: 74 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63  to state which c
1cf0: 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a  ontains this */.
1d00: 20 20 65 6e 75 6d 20 63 66 67 73 74 61 74 75 73    enum cfgstatus
1d10: 20 73 74 61 74 75 73 3b 20 20 20 2f 2a 20 75 73   status;   /* us
1d20: 65 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f 77  ed during follow
1d30: 73 65 74 20 61 6e 64 20 73 68 69 66 74 20 63 6f  set and shift co
1d40: 6d 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  mputations */.  
1d50: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
1d60: 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74  ext;     /* Next
1d70: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69   configuration i
1d80: 6e 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a 20  n the state */. 
1d90: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
1da0: 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  bp;       /* The
1db0: 20 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e 66   next basis conf
1dc0: 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a  iguration */.};.
1dd0: 0a 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 7b  .enum e_action {
1de0: 0a 20 20 53 48 49 46 54 2c 0a 20 20 41 43 43 45  .  SHIFT,.  ACCE
1df0: 50 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a 20 20  PT,.  REDUCE,.  
1e00: 45 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e 46 4c  ERROR,.  SSCONFL
1e10: 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  ICT,            
1e20: 20 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68 69    /* A shift/shi
1e30: 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ft conflict */. 
1e40: 20 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20   SRCONFLICT,    
1e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73            /* Was
1e60: 20 61 20 72 65 64 75 63 65 2c 20 62 75 74 20 70   a reduce, but p
1e70: 61 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69 63  art of a conflic
1e80: 74 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c 49 43  t */.  RRCONFLIC
1e90: 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
1ea0: 2f 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c  /* Was a reduce,
1eb0: 20 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63   but part of a c
1ec0: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53 48 5f  onflict */.  SH_
1ed0: 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20  RESOLVED,       
1ee0: 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 73        /* Was a s
1ef0: 68 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e 63  hift.  Precedenc
1f00: 65 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c  e resolved confl
1f10: 69 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45 53 4f  ict */.  RD_RESO
1f20: 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20 20 20  LVED,           
1f30: 20 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65 2e    /* Was reduce.
1f40: 20 20 50 72 65 63 65 64 65 6e 63 65 20 72 65 73    Precedence res
1f50: 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a  olved conflict *
1f60: 2f 0a 20 20 4e 4f 54 5f 55 53 45 44 20 20 20 20  /.  NOT_USED    
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f80: 44 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70 72  Deleted by compr
1f90: 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ession */.};../*
1fa0: 20 45 76 65 72 79 20 73 68 69 66 74 20 6f 72 20   Every shift or 
1fb0: 72 65 64 75 63 65 20 6f 70 65 72 61 74 69 6f 6e  reduce operation
1fc0: 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 6f 6e   is stored as on
1fd0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1fe0: 6e 67 20 2a 2f 0a 73 74 72 75 63 74 20 61 63 74  ng */.struct act
1ff0: 69 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ion {.  struct s
2000: 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 20 20 20  ymbol *sp;      
2010: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 2d 61 68 65   /* The look-ahe
2020: 61 64 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 65  ad symbol */.  e
2030: 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79 70  num e_action typ
2040: 65 3b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  e;.  union {.   
2050: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
2060: 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  tp;     /* The n
2070: 65 77 20 73 74 61 74 65 2c 20 69 66 20 61 20 73  ew state, if a s
2080: 68 69 66 74 20 2a 2f 0a 20 20 20 20 73 74 72 75  hift */.    stru
2090: 63 74 20 72 75 6c 65 20 2a 72 70 3b 20 20 20 20  ct rule *rp;    
20a0: 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 2c 20     /* The rule, 
20b0: 69 66 20 61 20 72 65 64 75 63 65 20 2a 2f 0a 20  if a reduce */. 
20c0: 20 7d 20 78 3b 0a 20 20 73 74 72 75 63 74 20 61   } x;.  struct a
20d0: 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20 20 20  ction *next;    
20e0: 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20   /* Next action 
20f0: 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20 2a  for this state *
2100: 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  /.  struct actio
2110: 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f 2a 20  n *collide;  /* 
2120: 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69 74 68  Next action with
2130: 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
2140: 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 73 74  /.};../* Each st
2150: 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ate of the gener
2160: 61 74 65 64 20 70 61 72 73 65 72 27 73 20 66 69  ated parser's fi
2170: 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69  nite state machi
2180: 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64 65 64  ne.** is encoded
2190: 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   as an instance 
21a0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
21b0: 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 73   structure. */.s
21c0: 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a 20 20  truct state {.  
21d0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
21e0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
21f0: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
2200: 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74  ions for this st
2210: 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
2220: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 20 20  config *cfp;    
2230: 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69 67 75    /* All configu
2240: 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69 73 20  rations in this 
2250: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73 74 61  set */.  int sta
2260: 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  tenum;          
2270: 20 20 2f 2a 20 53 65 71 75 65 6e 74 69 61 6c 20    /* Sequential 
2280: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
2290: 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  state */.  struc
22a0: 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20 20 20  t action *ap;   
22b0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
22c0: 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73  actions for this
22d0: 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20   state */.  int 
22e0: 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63 74 3b  nTknAct, nNtAct;
22f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2300: 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74 65 72  f actions on ter
2310: 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65  minals and nonte
2320: 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e 74  rminals */.  int
2330: 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74 4f 66   iTknOfst, iNtOf
2340: 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63 74 69  st;   /* yy_acti
2350: 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f 72 20  on[] offset for 
2360: 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f  terminals and no
2370: 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  nterms */.  int 
2380: 69 44 66 6c 74 3b 20 20 20 20 20 20 20 20 20 20  iDflt;          
2390: 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20       /* Default 
23a0: 61 63 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 64 65  action */.};.#de
23b0: 66 69 6e 65 20 4e 4f 5f 4f 46 46 53 45 54 20 28  fine NO_OFFSET (
23c0: 2d 32 31 34 37 34 38 33 36 34 37 29 0a 0a 2f 2a  -2147483647)../*
23d0: 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 70 72 6f   A followset pro
23e0: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 20 69 6e  pagation link in
23f0: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
2400: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6f 6e 65   contents of one
2410: 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  .** configuratio
2420: 6e 20 66 6f 6c 6c 6f 77 73 65 74 20 73 68 6f 75  n followset shou
2430: 6c 64 20 62 65 20 70 72 6f 70 61 67 61 74 65 64  ld be propagated
2440: 20 74 6f 20 61 6e 6f 74 68 65 72 20 77 68 65 6e   to another when
2450: 65 76 65 72 0a 2a 2a 20 74 68 65 20 66 69 72 73  ever.** the firs
2460: 74 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 73 74  t changes. */.st
2470: 72 75 63 74 20 70 6c 69 6e 6b 20 7b 0a 20 20 73  ruct plink {.  s
2480: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
2490: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  p;      /* The c
24a0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20  onfiguration to 
24b0: 77 68 69 63 68 20 6c 69 6e 6b 65 64 20 2a 2f 0a  which linked */.
24c0: 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
24d0: 6e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 54 68  next;      /* Th
24e0: 65 20 6e 65 78 74 20 70 72 6f 70 61 67 61 74 65  e next propagate
24f0: 20 6c 69 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20   link */.};../* 
2500: 54 68 65 20 73 74 61 74 65 20 76 65 63 74 6f 72  The state vector
2510: 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20   for the entire 
2520: 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
2530: 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 73 0a   is recorded as.
2540: 2a 2a 20 66 6f 6c 6c 6f 77 73 2e 20 20 28 4c 45  ** follows.  (LE
2550: 4d 4f 4e 20 75 73 65 73 20 6e 6f 20 67 6c 6f 62  MON uses no glob
2560: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64  al variables and
2570: 20 6d 61 6b 65 73 20 6c 69 74 74 6c 65 20 75 73   makes little us
2580: 65 20 6f 66 0a 2a 2a 20 73 74 61 74 69 63 20 76  e of.** static v
2590: 61 72 69 61 62 6c 65 73 2e 20 20 46 69 65 6c 64  ariables.  Field
25a0: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
25b0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  ng structure can
25c0: 20 62 65 20 74 68 6f 75 67 68 74 0a 2a 2a 20 6f   be thought.** o
25d0: 66 20 61 73 20 62 65 67 69 6e 20 67 6c 6f 62 61  f as begin globa
25e0: 6c 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74  l variables in t
25f0: 68 65 20 70 72 6f 67 72 61 6d 2e 29 20 2a 2f 0a  he program.) */.
2600: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 7b 0a 20  struct lemon {. 
2610: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a   struct state **
2620: 73 6f 72 74 65 64 3b 20 20 20 2f 2a 20 54 61 62  sorted;   /* Tab
2630: 6c 65 20 6f 66 20 73 74 61 74 65 73 20 73 6f 72  le of states sor
2640: 74 65 64 20 62 79 20 73 74 61 74 65 20 6e 75 6d  ted by state num
2650: 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ber */.  struct 
2660: 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20 20 20 20  rule *rule;     
2670: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
2680: 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20   rules */.  int 
2690: 6e 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20  nstate;         
26a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26b0: 66 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 69 6e  f states */.  in
26c0: 74 20 6e 72 75 6c 65 3b 20 20 20 20 20 20 20 20  t nrule;        
26d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26e0: 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69   of rules */.  i
26f0: 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20 20 20 20  nt nsymbol;     
2700: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2710: 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 61 6e  r of terminal an
2720: 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 73 79  d nonterminal sy
2730: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  mbols */.  int n
2740: 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20 20  terminal;       
2750: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2760: 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c   terminal symbol
2770: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  s */.  struct sy
2780: 6d 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20  mbol **symbols; 
2790: 2f 2a 20 53 6f 72 74 65 64 20 61 72 72 61 79 20  /* Sorted array 
27a0: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  of pointers to s
27b0: 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20  ymbols */.  int 
27c0: 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20  errorcnt;       
27d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27e0: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 74  f errors */.  st
27f0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72 72  ruct symbol *err
2800: 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20 65 72  sym;   /* The er
2810: 72 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  ror symbol */.  
2820: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 77  struct symbol *w
2830: 69 6c 64 63 61 72 64 3b 20 2f 2a 20 54 6f 6b 65  ildcard; /* Toke
2840: 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 61  n that matches a
2850: 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 63 68 61  nything */.  cha
2860: 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  r *name;        
2870: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2880: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70   the generated p
2890: 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  arser */.  char 
28a0: 2a 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  *arg;           
28b0: 20 20 20 20 2f 2a 20 44 65 63 6c 61 72 61 74 69      /* Declarati
28c0: 6f 6e 20 6f 66 20 74 68 65 20 33 74 68 20 61 72  on of the 3th ar
28d0: 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73 65 72  gument to parser
28e0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65   */.  char *toke
28f0: 6e 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 2f  ntype;         /
2900: 2a 20 54 79 70 65 20 6f 66 20 74 65 72 6d 69 6e  * Type of termin
2910: 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68  al symbols in th
2920: 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a  e parser stack *
2930: 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 74 79 70  /.  char *vartyp
2940: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2950: 54 68 65 20 64 65 66 61 75 6c 74 20 74 79 70 65  The default type
2960: 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c   of non-terminal
2970: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68   symbols */.  ch
2980: 61 72 20 2a 73 74 61 72 74 3b 20 20 20 20 20 20  ar *start;      
2990: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
29a0: 66 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62  f the start symb
29b0: 6f 6c 20 66 6f 72 20 74 68 65 20 67 72 61 6d 6d  ol for the gramm
29c0: 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74  ar */.  char *st
29d0: 61 63 6b 73 69 7a 65 3b 20 20 20 20 20 20 20 20  acksize;        
29e0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
29f0: 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a  parser stack */.
2a00: 20 20 63 68 61 72 20 2a 69 6e 63 6c 75 64 65 3b    char *include;
2a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2a20: 64 65 20 74 6f 20 70 75 74 20 61 74 20 74 68 65  de to put at the
2a30: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 43 20   start of the C 
2a40: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2a50: 65 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20  error;          
2a60: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
2a70: 65 63 75 74 65 20 77 68 65 6e 20 61 6e 20 65 72  ecute when an er
2a80: 72 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  ror is seen */. 
2a90: 20 63 68 61 72 20 2a 6f 76 65 72 66 6c 6f 77 3b   char *overflow;
2aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64            /* Cod
2ab0: 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e 20  e to execute on 
2ac0: 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77  a stack overflow
2ad0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 61 69 6c   */.  char *fail
2ae0: 75 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ure;           /
2af0: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
2b00: 65 20 6f 6e 20 70 61 72 73 65 72 20 66 61 69 6c  e on parser fail
2b10: 75 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ure */.  char *a
2b20: 63 63 65 70 74 3b 20 20 20 20 20 20 20 20 20 20  ccept;          
2b30: 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65    /* Code to exe
2b40: 63 75 74 65 20 77 68 65 6e 20 74 68 65 20 70 61  cute when the pa
2b50: 72 73 65 72 20 65 78 63 65 70 74 73 20 2a 2f 0a  rser excepts */.
2b60: 20 20 63 68 61 72 20 2a 65 78 74 72 61 63 6f 64    char *extracod
2b70: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  e;         /* Co
2b80: 64 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  de appended to t
2b90: 68 65 20 67 65 6e 65 72 61 74 65 64 20 66 69 6c  he generated fil
2ba0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  e */.  char *tok
2bb0: 65 6e 64 65 73 74 3b 20 20 20 20 20 20 20 20 20  endest;         
2bc0: 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75  /* Code to execu
2bd0: 74 65 20 74 6f 20 64 65 73 74 72 6f 79 20 74 6f  te to destroy to
2be0: 6b 65 6e 20 64 61 74 61 20 2a 2f 0a 20 20 63 68  ken data */.  ch
2bf0: 61 72 20 2a 76 61 72 64 65 73 74 3b 20 20 20 20  ar *vardest;    
2c00: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 66         /* Code f
2c10: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 6e  or the default n
2c20: 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64 65 73 74  on-terminal dest
2c30: 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72  ructor */.  char
2c40: 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20   *filename;     
2c50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2c60: 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  the input file *
2c70: 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e 61 6d  /.  char *outnam
2c80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2c90: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72  Name of the curr
2ca0: 65 6e 74 20 6f 75 74 70 75 74 20 66 69 6c 65 20  ent output file 
2cb0: 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e  */.  char *token
2cc0: 70 72 65 66 69 78 3b 20 20 20 20 20 20 20 2f 2a  prefix;       /*
2cd0: 20 41 20 70 72 65 66 69 78 20 61 64 64 65 64 20   A prefix added 
2ce0: 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73 20 69  to token names i
2cf0: 6e 20 74 68 65 20 2e 68 20 66 69 6c 65 20 2a 2f  n the .h file */
2d00: 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69 63 74  .  int nconflict
2d10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
2d20: 75 6d 62 65 72 20 6f 66 20 70 61 72 73 69 6e 67  umber of parsing
2d30: 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20   conflicts */.  
2d40: 69 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b 20 20  int tablesize;  
2d50: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2d60: 20 6f 66 20 74 68 65 20 70 61 72 73 65 20 74 61   of the parse ta
2d70: 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 61  bles */.  int ba
2d80: 73 69 73 66 6c 61 67 3b 20 20 20 20 20 20 20 20  sisflag;        
2d90: 20 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e 6c 79     /* Print only
2da0: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
2db0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 68  tions */.  int h
2dc0: 61 73 5f 66 61 6c 6c 62 61 63 6b 3b 20 20 20 20  as_fallback;    
2dd0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
2de0: 6e 79 20 25 66 61 6c 6c 62 61 63 6b 20 69 73 20  ny %fallback is 
2df0: 73 65 65 6e 20 69 6e 20 74 68 65 20 67 72 61 6d  seen in the gram
2e00: 6d 61 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 6c  mar */.  int nol
2e10: 69 6e 65 6e 6f 73 66 6c 61 67 3b 20 20 20 20 20  inenosflag;     
2e20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 23 6c 69    /* True if #li
2e30: 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 20 73 68  ne statements sh
2e40: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 72 69 6e  ould not be prin
2e50: 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ted */.  char *a
2e60: 72 67 76 30 3b 20 20 20 20 20 20 20 20 20 20 20  rgv0;           
2e70: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2e80: 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a   program */.};..
2e90: 23 64 65 66 69 6e 65 20 4d 65 6d 6f 72 79 43 68  #define MemoryCh
2ea0: 65 63 6b 28 58 29 20 69 66 28 28 58 29 3d 3d 30  eck(X) if((X)==0
2eb0: 29 7b 20 5c 0a 20 20 65 78 74 65 72 6e 20 76 6f  ){ \.  extern vo
2ec0: 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  id memory_error(
2ed0: 29 3b 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f 65 72  ); \.  memory_er
2ee0: 72 6f 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a  ror(); \.}../***
2ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
2f00: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74 61 62  om the file "tab
2f10: 6c 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le.h" **********
2f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f30: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41  *******/./*.** A
2f40: 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20  ll code in this 
2f50: 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75  file has been au
2f60: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
2f70: 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20  rated.** from a 
2f80: 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e  specification in
2f90: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20   the file.**    
2fa0: 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
2fb0: 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73  .q".** by the as
2fc0: 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
2fd0: 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72  code building pr
2fe0: 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a  ogram "aagen"..*
2ff0: 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68  * Do not edit th
3000: 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61  is file!  Instea
3010: 64 2c 20 65 64 69 74 20 74 68 65 20 73 70 65 63  d, edit the spec
3020: 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c  ification.** fil
3030: 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61  e, then rerun aa
3040: 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f  gen..*/./*.** Co
3050: 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  de for processin
3060: 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  g tables in the 
3070: 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
3080: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 2f 2a 20 52 6f  erator..*/./* Ro
3090: 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c  utines for handl
30a0: 69 6e 67 20 61 20 73 74 72 69 6e 67 73 20 2a 2f  ing a strings */
30b0: 0a 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74  ..const char *St
30c0: 72 73 61 66 65 28 63 6f 6e 73 74 20 63 68 61 72  rsafe(const char
30d0: 20 2a 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73 61   *);..void Strsa
30e0: 66 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69  fe_init(void);.i
30f0: 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72  nt Strsafe_inser
3100: 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  t(const char *);
3110: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72  .const char *Str
3120: 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20  safe_find(const 
3130: 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 20 52 6f 75  char *);../* Rou
3140: 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69  tines for handli
3150: 6e 67 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68  ng symbols of th
3160: 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73 74  e grammar */..st
3170: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
3180: 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74 20 63 68  bol_new(const ch
3190: 61 72 20 2a 29 3b 0a 69 6e 74 20 53 79 6d 62 6f  ar *);.int Symbo
31a0: 6c 63 6d 70 70 28 63 6f 6e 73 74 20 76 6f 69 64  lcmpp(const void
31b0: 20 2a 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   *, const void *
31c0: 29 3b 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69  );.void Symbol_i
31d0: 6e 69 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53  nit(void);.int S
31e0: 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72  ymbol_insert(str
31f0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2c 20 63 6f  uct symbol *, co
3200: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72  nst char *);.str
3210: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
3220: 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68  ol_find(const ch
3230: 61 72 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 79  ar *);.struct sy
3240: 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68  mbol *Symbol_Nth
3250: 28 69 6e 74 29 3b 0a 69 6e 74 20 53 79 6d 62 6f  (int);.int Symbo
3260: 6c 5f 63 6f 75 6e 74 28 76 6f 69 64 29 3b 0a 73  l_count(void);.s
3270: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53  truct symbol **S
3280: 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 76 6f  ymbol_arrayof(vo
3290: 69 64 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65  id);../* Routine
32a0: 73 20 74 6f 20 6d 61 6e 61 67 65 20 74 68 65 20  s to manage the 
32b0: 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 0a  state table */..
32c0: 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 63 6f  int Configcmp(co
32d0: 6e 73 74 20 63 68 61 72 20 2a 2c 20 63 6f 6e 73  nst char *, cons
32e0: 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72 75 63  t char *);.struc
32f0: 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e  t state *State_n
3300: 65 77 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 53  ew(void);.void S
3310: 74 61 74 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b  tate_init(void);
3320: 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72  .int State_inser
3330: 74 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  t(struct state *
3340: 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
3350: 2a 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65  *);.struct state
3360: 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 73 74 72   *State_find(str
3370: 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73  uct config *);.s
3380: 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74  truct state **St
3390: 61 74 65 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20  ate_arrayof(/*  
33a0: 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65  */);../* Routine
33b0: 73 20 75 73 65 64 20 66 6f 72 20 65 66 66 69 63  s used for effic
33c0: 69 65 6e 63 79 20 69 6e 20 43 6f 6e 66 69 67 6c  iency in Configl
33d0: 69 73 74 5f 61 64 64 20 2a 2f 0a 0a 76 6f 69 64  ist_add */..void
33e0: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69   Configtable_ini
33f0: 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 43 6f 6e  t(void);.int Con
3400: 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
3410: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
3420: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
3430: 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e  *Configtable_fin
3440: 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  d(struct config 
3450: 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74  *);.void Configt
3460: 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74 28 2a  able_clear(int(*
3470: 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  )(struct config 
3480: 2a 29 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *));../*********
3490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
34a0: 68 65 20 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e  he file "action.
34b0: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
34c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34d0: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  **/./*.** Routin
34e0: 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20 70 61  es processing pa
34f0: 72 73 65 72 20 61 63 74 69 6f 6e 73 20 69 6e 20  rser actions in 
3500: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
3510: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
3520: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
3530: 77 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 20  w parser action 
3540: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
3550: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
3560: 6e 65 77 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  new(void){.  sta
3570: 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69 6f  tic struct actio
3580: 6e 20 2a 66 72 65 65 6c 69 73 74 20 3d 20 30 3b  n *freelist = 0;
3590: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
35a0: 20 2a 6e 65 77 61 63 74 69 6f 6e 3b 0a 0a 20 20   *newaction;..  
35b0: 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20  if( freelist==0 
35c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
35d0: 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b    int amt = 100;
35e0: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20  .    freelist = 
35f0: 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  (struct action *
3600: 29 63 61 6c 6c 6f 63 28 61 6d 74 2c 20 73 69 7a  )calloc(amt, siz
3610: 65 6f 66 28 73 74 72 75 63 74 20 61 63 74 69 6f  eof(struct actio
3620: 6e 29 29 3b 0a 20 20 20 20 69 66 28 20 66 72 65  n));.    if( fre
3630: 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
3640: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
3650: 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  ,"Unable to allo
3660: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
3670: 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63 74  a new parser act
3680: 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65 78  ion.");.      ex
3690: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
36a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d   for(i=0; i<amt-
36b0: 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69 73 74  1; i++) freelist
36c0: 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65 65  [i].next = &free
36d0: 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66  list[i+1];.    f
36e0: 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e  reelist[amt-1].n
36f0: 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ext = 0;.  }.  n
3700: 65 77 61 63 74 69 6f 6e 20 3d 20 66 72 65 65 6c  ewaction = freel
3710: 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20  ist;.  freelist 
3720: 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74  = freelist->next
3730: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 61 63  ;.  return newac
3740: 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70  tion;.}../* Comp
3750: 61 72 65 20 74 77 6f 20 61 63 74 69 6f 6e 73 20  are two actions 
3760: 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70  for sorting purp
3770: 6f 73 65 73 2e 20 20 52 65 74 75 72 6e 20 6e 65  oses.  Return ne
3780: 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
3790: 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 69 66 20  .** positive if 
37a0: 74 68 65 20 66 69 72 73 74 20 61 63 74 69 6f 6e  the first action
37b0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
37c0: 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61  qual to, or grea
37d0: 74 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ter than.** the 
37e0: 66 69 72 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  first.*/.static 
37f0: 69 6e 74 20 61 63 74 69 6f 6e 63 6d 70 28 0a 20  int actioncmp(. 
3800: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
3810: 61 70 31 2c 0a 20 20 73 74 72 75 63 74 20 61 63  ap1,.  struct ac
3820: 74 69 6f 6e 20 2a 61 70 32 0a 29 7b 0a 20 20 69  tion *ap2.){.  i
3830: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 61 70  nt rc;.  rc = ap
3840: 31 2d 3e 73 70 2d 3e 69 6e 64 65 78 20 2d 20 61  1->sp->index - a
3850: 70 32 2d 3e 73 70 2d 3e 69 6e 64 65 78 3b 0a 20  p2->sp->index;. 
3860: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
3870: 20 20 72 63 20 3d 20 28 69 6e 74 29 61 70 31 2d    rc = (int)ap1-
3880: 3e 74 79 70 65 20 2d 20 28 69 6e 74 29 61 70 32  >type - (int)ap2
3890: 2d 3e 74 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66  ->type;.  }.  if
38a0: 28 20 72 63 3d 3d 30 20 26 26 20 61 70 31 2d 3e  ( rc==0 && ap1->
38b0: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a  type==REDUCE ){.
38c0: 20 20 20 20 72 63 20 3d 20 61 70 31 2d 3e 78 2e      rc = ap1->x.
38d0: 72 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d  rp->index - ap2-
38e0: 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20  >x.rp->index;.  
38f0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  }.  if( rc==0 ){
3900: 0a 20 20 20 20 72 63 20 3d 20 28 69 6e 74 29 20  .    rc = (int) 
3910: 28 61 70 32 20 2d 20 61 70 31 29 3b 0a 20 20 7d  (ap2 - ap1);.  }
3920: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3930: 0a 2f 2a 20 53 6f 72 74 20 70 61 72 73 65 72 20  ./* Sort parser 
3940: 61 63 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  actions */.stati
3950: 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  c struct action 
3960: 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 0a 20 20  *Action_sort(.  
3970: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
3980: 70 0a 29 7b 0a 20 20 61 70 20 3d 20 28 73 74 72  p.){.  ap = (str
3990: 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 6d 73 6f  uct action *)mso
39a0: 72 74 28 28 63 68 61 72 20 2a 29 61 70 2c 28 63  rt((char *)ap,(c
39b0: 68 61 72 20 2a 2a 29 26 61 70 2d 3e 6e 65 78 74  har **)&ap->next
39c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39e0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
39f0: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
3a00: 29 61 63 74 69 6f 6e 63 6d 70 29 3b 0a 20 20 72  )actioncmp);.  r
3a10: 65 74 75 72 6e 20 61 70 3b 0a 7d 0a 0a 76 6f 69  eturn ap;.}..voi
3a20: 64 20 41 63 74 69 6f 6e 5f 61 64 64 28 0a 20 20  d Action_add(.  
3a30: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2a  struct action **
3a40: 61 70 70 2c 0a 20 20 65 6e 75 6d 20 65 5f 61 63  app,.  enum e_ac
3a50: 74 69 6f 6e 20 74 79 70 65 2c 0a 20 20 73 74 72  tion type,.  str
3a60: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a  uct symbol *sp,.
3a70: 20 20 63 68 61 72 20 2a 61 72 67 0a 29 7b 0a 20    char *arg.){. 
3a80: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
3a90: 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e 65 77  newaction;.  new
3aa0: 61 63 74 69 6f 6e 20 3d 20 41 63 74 69 6f 6e 5f  action = Action_
3ab0: 6e 65 77 28 29 3b 0a 20 20 6e 65 77 61 63 74 69  new();.  newacti
3ac0: 6f 6e 2d 3e 6e 65 78 74 20 3d 20 2a 61 70 70 3b  on->next = *app;
3ad0: 0a 20 20 2a 61 70 70 20 3d 20 6e 65 77 61 63 74  .  *app = newact
3ae0: 69 6f 6e 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e  ion;.  newaction
3af0: 2d 3e 74 79 70 65 20 3d 20 74 79 70 65 3b 0a 20  ->type = type;. 
3b00: 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 73 70 20 3d   newaction->sp =
3b10: 20 73 70 3b 0a 20 20 69 66 28 20 74 79 70 65 3d   sp;.  if( type=
3b20: 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 6e 65  =SHIFT ){.    ne
3b30: 77 61 63 74 69 6f 6e 2d 3e 78 2e 73 74 70 20 3d  waction->x.stp =
3b40: 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
3b50: 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )arg;.  }else{. 
3b60: 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78 2e     newaction->x.
3b70: 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c  rp = (struct rul
3b80: 65 20 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f  e *)arg;.  }.}./
3b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ba0: 2a 2a 2a 2a 2a 2a 20 4e 65 77 20 63 6f 64 65 20  ****** New code 
3bb0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
3bc0: 20 22 61 63 74 74 61 62 22 20 6d 6f 64 75 6c 65   "acttab" module
3bd0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a   ***********/./*
3be0: 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  .** This module 
3bf0: 69 6d 70 6c 65 6d 65 6e 74 73 20 72 6f 75 74 69  implements routi
3c00: 6e 65 73 20 75 73 65 20 74 6f 20 63 6f 6e 73 74  nes use to const
3c10: 72 75 63 74 20 74 68 65 20 79 79 5f 61 63 74 69  ruct the yy_acti
3c20: 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a  on[] table..*/..
3c30: 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 20  /*.** The state 
3c40: 6f 66 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  of the yy_action
3c50: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
3c60: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6e 20  struction is an 
3c70: 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74  instance of.** t
3c80: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
3c90: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
3ca0: 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c  e yy_action tabl
3cb0: 65 20 6d 61 70 73 20 74 68 65 20 70 61 69 72 20  e maps the pair 
3cc0: 28 73 74 61 74 65 5f 6e 75 6d 62 65 72 2c 20 6c  (state_number, l
3cd0: 6f 6f 6b 61 68 65 61 64 29 20 69 6e 74 6f 20 61  ookahead) into a
3ce0: 6e 0a 2a 2a 20 61 63 74 69 6f 6e 5f 6e 75 6d 62  n.** action_numb
3cf0: 65 72 2e 20 20 54 68 65 20 74 61 62 6c 65 20 69  er.  The table i
3d00: 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e  s an array of in
3d10: 74 65 67 65 72 73 20 70 61 69 72 73 2e 20 20 54  tegers pairs.  T
3d20: 68 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 0a  he state_number.
3d30: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 61 6e  ** determines an
3d40: 20 69 6e 69 74 69 61 6c 20 6f 66 66 73 65 74 20   initial offset 
3d50: 69 6e 74 6f 20 74 68 65 20 79 79 5f 61 63 74 69  into the yy_acti
3d60: 6f 6e 20 61 72 72 61 79 2e 20 20 54 68 65 20 6c  on array.  The l
3d70: 6f 6f 6b 61 68 65 61 64 0a 2a 2a 20 76 61 6c 75  ookahead.** valu
3d80: 65 20 69 73 20 74 68 65 6e 20 61 64 64 65 64 20  e is then added 
3d90: 74 6f 20 74 68 69 73 20 69 6e 69 74 69 61 6c 20  to this initial 
3da0: 6f 66 66 73 65 74 20 74 6f 20 67 65 74 20 61 6e  offset to get an
3db0: 20 69 6e 64 65 78 20 58 20 69 6e 74 6f 20 74 68   index X into th
3dc0: 65 0a 2a 2a 20 79 79 5f 61 63 74 69 6f 6e 20 61  e.** yy_action a
3dd0: 72 72 61 79 2e 20 49 66 20 74 68 65 20 61 41 63  rray. If the aAc
3de0: 74 69 6f 6e 5b 58 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[X].lookahea
3df0: 64 20 65 71 75 61 6c 73 20 74 68 65 20 76 61 6c  d equals the val
3e00: 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 66 20  ue of the.** of 
3e10: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e  the lookahead in
3e20: 70 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  put, then the va
3e30: 6c 75 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f  lue of the actio
3e40: 6e 5f 6e 75 6d 62 65 72 20 6f 75 74 70 75 74 20  n_number output 
3e50: 69 73 0a 2a 2a 20 61 41 63 74 69 6f 6e 5b 58 5d  is.** aAction[X]
3e60: 2e 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  .action.  If the
3e70: 20 6c 6f 6f 6b 61 68 65 61 64 73 20 64 6f 20 6e   lookaheads do n
3e80: 6f 74 20 6d 61 74 63 68 20 74 68 65 6e 20 74 68  ot match then th
3e90: 65 0a 2a 2a 20 64 65 66 61 75 6c 74 20 61 63 74  e.** default act
3ea0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 73 74 61 74  ion for the stat
3eb0: 65 5f 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75  e_number is retu
3ec0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  rned..**.** All 
3ed0: 61 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  actions associat
3ee0: 65 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ed with a single
3ef0: 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 61 72   state_number ar
3f00: 65 20 66 69 72 73 74 20 65 6e 74 65 72 65 64 0a  e first entered.
3f10: 2a 2a 20 69 6e 74 6f 20 61 4c 6f 6f 6b 61 68 65  ** into aLookahe
3f20: 61 64 5b 5d 20 75 73 69 6e 67 20 6d 75 6c 74 69  ad[] using multi
3f30: 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20 61 63 74  ple calls to act
3f40: 74 61 62 5f 61 63 74 69 6f 6e 28 29 2e 20 20 54  tab_action().  T
3f50: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 63 74 69  hen the .** acti
3f60: 6f 6e 73 20 66 6f 72 20 74 68 61 74 20 73 69 6e  ons for that sin
3f70: 67 6c 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72  gle state_number
3f80: 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 74 6f   are placed into
3f90: 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 0a   the aAction[] .
3fa0: 2a 2a 20 61 72 72 61 79 20 77 69 74 68 20 61 20  ** array with a 
3fb0: 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 61  single call to a
3fc0: 63 74 74 61 62 5f 69 6e 73 65 72 74 28 29 2e 20  cttab_insert(). 
3fd0: 20 54 68 65 20 61 63 74 74 61 62 5f 69 6e 73 65   The acttab_inse
3fe0: 72 74 28 29 20 63 61 6c 6c 0a 2a 2a 20 61 6c 73  rt() call.** als
3ff0: 6f 20 72 65 73 65 74 73 20 74 68 65 20 61 4c 6f  o resets the aLo
4000: 6f 6b 61 68 65 61 64 5b 5d 20 61 72 72 61 79 20  okahead[] array 
4010: 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66  in preparation f
4020: 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 73  or the next.** s
4030: 74 61 74 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  tate number..*/.
4040: 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64  struct lookahead
4050: 5f 61 63 74 69 6f 6e 20 7b 0a 20 20 69 6e 74 20  _action {.  int 
4060: 6c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  lookahead;      
4070: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
4080: 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  of the lookahead
4090: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20   token */.  int 
40a0: 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  action;         
40b0: 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e         /* Action
40c0: 20 74 6f 20 74 61 6b 65 20 6f 6e 20 74 68 65 20   to take on the 
40d0: 67 69 76 65 6e 20 6c 6f 6f 6b 61 68 65 61 64 20  given lookahead 
40e0: 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  */.};.typedef st
40f0: 72 75 63 74 20 61 63 74 74 61 62 20 61 63 74 74  ruct acttab actt
4100: 61 62 3b 0a 73 74 72 75 63 74 20 61 63 74 74 61  ab;.struct actta
4110: 62 20 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f  b {.  int nActio
4120: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
4130: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4140: 75 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 41  used slots in aA
4150: 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ction[] */.  int
4160: 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20   nActionAlloc;  
4170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f            /* Slo
4180: 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ts allocated for
4190: 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20   aAction[] */.  
41a0: 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64  struct lookahead
41b0: 5f 61 63 74 69 6f 6e 0a 20 20 20 20 2a 61 41 63  _action.    *aAc
41c0: 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  tion,           
41d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 79 79         /* The yy
41e0: 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20  _action[] table 
41f0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
4200: 6f 6e 20 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b  on */.    *aLook
4210: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
4220: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
4230: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
4240: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e   set */.  int mn
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 2f 2a 20 4d 69 6e 69 6d 75         /* Minimu
4270: 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c  m aLookahead[].l
4280: 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e  ookahead */.  in
4290: 74 20 6d 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20  t mnAction;     
42a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
42b0: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
42c0: 77 69 74 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64  with mnLookahead
42d0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b   */.  int mxLook
42e0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
42f0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 4c     /* Maximum aL
4300: 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61  ookahead[].looka
4310: 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  head */.  int nL
4320: 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20  ookahead;       
4330: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73         /* Used s
4340: 6c 6f 74 73 20 69 6e 20 61 4c 6f 6f 6b 61 68 65  lots in aLookahe
4350: 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  ad[] */.  int nL
4360: 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 3b 20 20  ookaheadAlloc;  
4370: 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20         /* Slots 
4380: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c 6f  allocated in aLo
4390: 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 7d 3b 0a  okahead[] */.};.
43a0: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ./* Return the n
43b0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
43c0: 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f   in the yy_actio
43d0: 6e 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69  n table */.#defi
43e0: 6e 65 20 61 63 74 74 61 62 5f 73 69 7a 65 28 58  ne acttab_size(X
43f0: 29 20 28 28 58 29 2d 3e 6e 41 63 74 69 6f 6e 29  ) ((X)->nAction)
4400: 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66  ../* The value f
4410: 6f 72 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72  or the N-th entr
4420: 79 20 69 6e 20 79 79 5f 61 63 74 69 6f 6e 20 2a  y in yy_action *
4430: 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62  /.#define acttab
4440: 5f 79 79 61 63 74 69 6f 6e 28 58 2c 4e 29 20 20  _yyaction(X,N)  
4450: 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d  ((X)->aAction[N]
4460: 2e 61 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65  .action)../* The
4470: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e   value for the N
4480: 2d 74 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f  -th entry in yy_
4490: 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 23 64 65  lookahead */.#de
44a0: 66 69 6e 65 20 61 63 74 74 61 62 5f 79 79 6c 6f  fine acttab_yylo
44b0: 6f 6b 61 68 65 61 64 28 58 2c 4e 29 20 20 28 28  okahead(X,N)  ((
44c0: 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c  X)->aAction[N].l
44d0: 6f 6f 6b 61 68 65 61 64 29 0a 0a 2f 2a 20 46 72  ookahead)../* Fr
44e0: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  ee all memory as
44f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
4500: 65 20 67 69 76 65 6e 20 61 63 74 74 61 62 20 2a  e given acttab *
4510: 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 66 72  /.void acttab_fr
4520: 65 65 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20  ee(acttab *p){. 
4530: 20 66 72 65 65 28 20 70 2d 3e 61 41 63 74 69 6f   free( p->aActio
4540: 6e 20 29 3b 0a 20 20 66 72 65 65 28 20 70 2d 3e  n );.  free( p->
4550: 61 4c 6f 6f 6b 61 68 65 61 64 20 29 3b 0a 20 20  aLookahead );.  
4560: 66 72 65 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a  free( p );.}../*
4570: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
4580: 61 63 74 74 61 62 20 73 74 72 75 63 74 75 72 65  acttab structure
4590: 20 2a 2f 0a 61 63 74 74 61 62 20 2a 61 63 74 74   */.acttab *actt
45a0: 61 62 5f 61 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a  ab_alloc(void){.
45b0: 20 20 61 63 74 74 61 62 20 2a 70 20 3d 20 28 61    acttab *p = (a
45c0: 63 74 74 61 62 20 2a 29 20 63 61 6c 6c 6f 63 28  cttab *) calloc(
45d0: 20 31 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29   1, sizeof(*p) )
45e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
45f0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
4600: 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c  rr,"Unable to al
4610: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
4620: 72 20 61 20 6e 65 77 20 61 63 74 74 61 62 2e 22  r a new acttab."
4630: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
4640: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
4650: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
4660: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
4670: 2a 20 41 64 64 20 61 20 6e 65 77 20 61 63 74 69  * Add a new acti
4680: 6f 6e 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  on to the curren
4690: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  t transaction se
46a0: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t.  .**.** This 
46b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
46c0: 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
46d0: 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 61 20  lookahead for a 
46e0: 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a 20 73 74  particular.** st
46f0: 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 61 63 74  ate..*/.void act
4700: 74 61 62 5f 61 63 74 69 6f 6e 28 61 63 74 74 61  tab_action(actta
4710: 62 20 2a 70 2c 20 69 6e 74 20 6c 6f 6f 6b 61 68  b *p, int lookah
4720: 65 61 64 2c 20 69 6e 74 20 61 63 74 69 6f 6e 29  ead, int action)
4730: 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b  {.  if( p->nLook
4740: 61 68 65 61 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61  ahead>=p->nLooka
4750: 68 65 61 64 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  headAlloc ){.   
4760: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c   p->nLookaheadAl
4770: 6c 6f 63 20 2b 3d 20 32 35 3b 0a 20 20 20 20 70  loc += 25;.    p
4780: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 28  ->aLookahead = (
4790: 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64  struct lookahead
47a0: 5f 61 63 74 69 6f 6e 20 2a 29 20 72 65 61 6c 6c  _action *) reall
47b0: 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  oc( p->aLookahea
47c0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b 61  sizeof(p->aLooka
47f0: 68 65 61 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f  head[0])*p->nLoo
4800: 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29 3b 0a 20  kaheadAlloc );. 
4810: 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61     if( p->aLooka
4820: 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  head==0 ){.     
4830: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
4840: 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e  "malloc failed\n
4850: 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
4860: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
4870: 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  f( p->nLookahead
4880: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6d 78  ==0 ){.    p->mx
4890: 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b  Lookahead = look
48a0: 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e  ahead;.    p->mn
48b0: 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b  Lookahead = look
48c0: 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e  ahead;.    p->mn
48d0: 41 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b  Action = action;
48e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
48f0: 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64  ( p->mxLookahead
4900: 3c 6c 6f 6f 6b 61 68 65 61 64 20 29 20 70 2d 3e  <lookahead ) p->
4910: 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f  mxLookahead = lo
4920: 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 69 66 28  okahead;.    if(
4930: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3e   p->mnLookahead>
4940: 6c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20  lookahead ){.   
4950: 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61     p->mnLookahea
4960: 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20  d = lookahead;. 
4970: 20 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e       p->mnAction
4980: 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d   = action;.    }
4990: 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61  .  }.  p->aLooka
49a0: 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  head[p->nLookahe
49b0: 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20  ad].lookahead = 
49c0: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 70 2d 3e  lookahead;.  p->
49d0: 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c  aLookahead[p->nL
49e0: 6f 6f 6b 61 68 65 61 64 5d 2e 61 63 74 69 6f 6e  ookahead].action
49f0: 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 70 2d 3e   = action;.  p->
4a00: 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d 0a  nLookahead++;.}.
4a10: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 74  ./*.** Add the t
4a20: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62  ransaction set b
4a30: 75 69 6c 74 20 75 70 20 77 69 74 68 20 70 72 69  uilt up with pri
4a40: 6f 72 20 63 61 6c 6c 73 20 74 6f 20 61 63 74 74  or calls to actt
4a50: 61 62 5f 61 63 74 69 6f 6e 28 29 0a 2a 2a 20 69  ab_action().** i
4a60: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
4a70: 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 54  action table.  T
4a80: 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 74 72  hen reset the tr
4a90: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62 61  ansaction set ba
4aa0: 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20 65 6d 70 74  ck.** to an empt
4ab0: 79 20 73 65 74 20 69 6e 20 70 72 65 70 61 72 61  y set in prepara
4ac0: 74 69 6f 6e 20 66 6f 72 20 61 20 6e 65 77 20 72  tion for a new r
4ad0: 6f 75 6e 64 20 6f 66 20 61 63 74 74 61 62 5f 61  ound of acttab_a
4ae0: 63 74 69 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a 2a  ction() calls..*
4af0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4b00: 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  offset into the 
4b10: 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20  action table of 
4b20: 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61 63 74  the new transact
4b30: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74 74  ion..*/.int actt
4b40: 61 62 5f 69 6e 73 65 72 74 28 61 63 74 74 61 62  ab_insert(acttab
4b50: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a   *p){.  int i, j
4b60: 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74  , k, n;.  assert
4b70: 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e  ( p->nLookahead>
4b80: 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  0 );..  /* Make 
4b90: 73 75 72 65 20 77 65 20 68 61 76 65 20 65 6e 6f  sure we have eno
4ba0: 75 67 68 20 73 70 61 63 65 20 74 6f 20 68 6f 6c  ugh space to hol
4bb0: 64 20 74 68 65 20 65 78 70 61 6e 64 65 64 20 61  d the expanded a
4bc0: 63 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2a  ction table.  **
4bd0: 20 69 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61   in the worst ca
4be0: 73 65 2e 20 20 54 68 65 20 77 6f 72 73 74 20 63  se.  The worst c
4bf0: 61 73 65 20 6f 63 63 75 72 73 20 69 66 20 74 68  ase occurs if th
4c00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  e transaction se
4c10: 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61  t.  ** must be a
4c20: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63  ppended to the c
4c30: 75 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74 61  urrent action ta
4c40: 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 70  ble.  */.  n = p
4c50: 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mxLookahead + 
4c60: 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41 63 74  1;.  if( p->nAct
4c70: 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d 3e 6e 41  ion + n >= p->nA
4c80: 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  ctionAlloc ){.  
4c90: 20 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f 63 20 3d    int oldAlloc =
4ca0: 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63   p->nActionAlloc
4cb0: 3b 0a 20 20 20 20 70 2d 3e 6e 41 63 74 69 6f 6e  ;.    p->nAction
4cc0: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69  Alloc = p->nActi
4cd0: 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63 74  on + n + p->nAct
4ce0: 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a 20  ionAlloc + 20;. 
4cf0: 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 20 3d 20     p->aAction = 
4d00: 28 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61  (struct lookahea
4d10: 64 5f 61 63 74 69 6f 6e 20 2a 29 20 72 65 61 6c  d_action *) real
4d20: 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69 6f 6e 2c  loc( p->aAction,
4d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4d40: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
4d50: 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 29  f(p->aAction[0])
4d60: 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63  *p->nActionAlloc
4d70: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41  );.    if( p->aA
4d80: 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ction==0 ){.    
4d90: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
4da0: 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c  ,"malloc failed\
4db0: 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  n");.      exit(
4dc0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
4dd0: 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b 20 69 3c  r(i=oldAlloc; i<
4de0: 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b  p->nActionAlloc;
4df0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
4e00: 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61  aAction[i].looka
4e10: 68 65 61 64 20 3d 20 2d 31 3b 0a 20 20 20 20 20  head = -1;.     
4e20: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 61   p->aAction[i].a
4e30: 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  ction = -1;.    
4e40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e  }.  }..  /* Scan
4e50: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 61 63   the existing ac
4e60: 74 69 6f 6e 20 74 61 62 6c 65 20 6c 6f 6f 6b 69  tion table looki
4e70: 6e 67 20 66 6f 72 20 61 6e 20 6f 66 66 73 65 74  ng for an offset
4e80: 20 74 68 61 74 20 69 73 20 61 20 0a 20 20 2a 2a   that is a .  **
4e90: 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68   duplicate of th
4ea0: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
4eb0: 63 74 69 6f 6e 20 73 65 74 2e 20 20 46 61 6c 6c  ction set.  Fall
4ec0: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
4ed0: 0a 20 20 2a 2a 20 69 66 20 61 6e 64 20 77 68 65  .  ** if and whe
4ee0: 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  n the duplicate 
4ef0: 69 73 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20  is found..  **. 
4f00: 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
4f10: 65 78 20 69 6e 20 70 2d 3e 61 41 63 74 69 6f 6e  ex in p->aAction
4f20: 5b 5d 20 77 68 65 72 65 20 70 2d 3e 6d 6e 4c 6f  [] where p->mnLo
4f30: 6f 6b 61 68 65 61 64 20 69 73 20 69 6e 73 65 72  okahead is inser
4f40: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ted..  */.  for(
4f50: 69 3d 70 2d 3e 6e 41 63 74 69 6f 6e 2d 31 3b 20  i=p->nAction-1; 
4f60: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
4f70: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69  if( p->aAction[i
4f80: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d 3e  ].lookahead==p->
4f90: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20  mnLookahead ){. 
4fa0: 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6c 6f 6f 6b       /* All look
4fb0: 61 68 65 61 64 73 20 61 6e 64 20 61 63 74 69 6f  aheads and actio
4fc0: 6e 73 20 69 6e 20 74 68 65 20 61 4c 6f 6f 6b 61  ns in the aLooka
4fd0: 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74 69  head[] transacti
4fe0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74  on.      ** must
4ff0: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
5000: 68 65 20 63 61 6e 64 69 64 61 74 65 20 61 41 63  he candidate aAc
5010: 74 69 6f 6e 5b 69 5d 20 65 6e 74 72 79 2e 20 2a  tion[i] entry. *
5020: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  /.      if( p->a
5030: 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e  Action[i].action
5040: 21 3d 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 29 20  !=p->mnAction ) 
5050: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
5060: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c  for(j=0; j<p->nL
5070: 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a  ookahead; j++){.
5080: 20 20 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61          k = p->a
5090: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f  Lookahead[j].loo
50a0: 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f  kahead - p->mnLo
50b0: 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20  okahead + i;.   
50c0: 20 20 20 20 20 69 66 28 20 6b 3c 30 20 7c 7c 20       if( k<0 || 
50d0: 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20  k>=p->nAction ) 
50e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
50f0: 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  f( p->aLookahead
5100: 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 21 3d 70  [j].lookahead!=p
5110: 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f  ->aAction[k].loo
5120: 6b 61 68 65 61 64 20 29 20 62 72 65 61 6b 3b 0a  kahead ) break;.
5130: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
5140: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 61 63 74  Lookahead[j].act
5150: 69 6f 6e 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b  ion!=p->aAction[
5160: 6b 5d 2e 61 63 74 69 6f 6e 20 29 20 62 72 65 61  k].action ) brea
5170: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5180: 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61   if( j<p->nLooka
5190: 68 65 61 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  head ) continue;
51a0: 0a 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 70 6f  ..      /* No po
51b0: 73 73 69 62 6c 65 20 6c 6f 6f 6b 61 68 65 61 64  ssible lookahead
51c0: 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 6e   value that is n
51d0: 6f 74 20 69 6e 20 74 68 65 20 61 4c 6f 6f 6b 61  ot in the aLooka
51e0: 68 65 61 64 5b 5d 0a 20 20 20 20 20 20 2a 2a 20  head[].      ** 
51f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
5200: 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68 20  llowed to match 
5210: 61 41 63 74 69 6f 6e 5b 69 5d 20 2a 2f 0a 20 20  aAction[i] */.  
5220: 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20      n = 0;.     
5230: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
5240: 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Action; j++){.  
5250: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
5260: 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[j].lookahea
5270: 64 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  d<0 ) continue;.
5280: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
5290: 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68  Action[j].lookah
52a0: 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b  ead==j+p->mnLook
52b0: 61 68 65 61 64 2d 69 20 29 20 6e 2b 2b 3b 0a 20  ahead-i ) n++;. 
52c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
52d0: 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61   n==p->nLookahea
52e0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  d ){.        bre
52f0: 61 6b 3b 20 20 2f 2a 20 41 6e 20 65 78 61 63 74  ak;  /* An exact
5300: 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 20   match is found 
5310: 61 74 20 6f 66 66 73 65 74 20 69 20 2a 2f 0a 20  at offset i */. 
5320: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5330: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 78 69  ..  /* If no exi
5340: 73 74 69 6e 67 20 6f 66 66 73 65 74 73 20 65 78  sting offsets ex
5350: 61 63 74 6c 79 20 6d 61 74 63 68 20 74 68 65 20  actly match the 
5360: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
5370: 69 6f 6e 2c 20 66 69 6e 64 20 61 6e 0a 20 20 2a  ion, find an.  *
5380: 2a 20 61 6e 20 65 6d 70 74 79 20 6f 66 66 73 65  * an empty offse
5390: 74 20 69 6e 20 74 68 65 20 61 41 63 74 69 6f 6e  t in the aAction
53a0: 5b 5d 20 74 61 62 6c 65 20 69 6e 20 77 68 69 63  [] table in whic
53b0: 68 20 77 65 20 63 61 6e 20 61 64 64 20 74 68 65  h we can add the
53c0: 0a 20 20 2a 2a 20 61 4c 6f 6f 6b 61 68 65 61 64  .  ** aLookahead
53d0: 5b 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  [] transaction..
53e0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 3c 30 20 29    */.  if( i<0 )
53f0: 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f  {.    /* Look fo
5400: 72 20 68 6f 6c 65 73 20 69 6e 20 74 68 65 20 61  r holes in the a
5410: 41 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 74  Action[] table t
5420: 68 61 74 20 66 69 74 20 74 68 65 20 63 75 72 72  hat fit the curr
5430: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 4c 6f 6f 6b  ent.    ** aLook
5440: 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74  ahead[] transact
5450: 69 6f 6e 2e 20 20 4c 65 61 76 65 20 69 20 73 65  ion.  Leave i se
5460: 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
5470: 6f 66 20 74 68 65 20 68 6f 6c 65 2e 0a 20 20 20  of the hole..   
5480: 20 2a 2a 20 49 66 20 6e 6f 20 68 6f 6c 65 73 20   ** If no holes 
5490: 61 72 65 20 66 6f 75 6e 64 2c 20 69 20 69 73 20  are found, i is 
54a0: 6c 65 66 74 20 61 74 20 70 2d 3e 6e 41 63 74 69  left at p->nActi
54b0: 6f 6e 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  on, which means 
54c0: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
54d0: 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61  action will be a
54e0: 70 70 65 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  ppended. */.    
54f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41  for(i=0; i<p->nA
5500: 63 74 69 6f 6e 41 6c 6c 6f 63 20 2d 20 70 2d 3e  ctionAlloc - p->
5510: 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 69 2b 2b  mxLookahead; i++
5520: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
5530: 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61  aAction[i].looka
5540: 68 65 61 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  head<0 ){.      
5550: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
5560: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29  nLookahead; j++)
5570: 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20  {.          k = 
5580: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
5590: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
55a0: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
55b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6b  .          if( k
55c0: 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <0 ) break;.    
55d0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
55e0: 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[k].lookahea
55f0: 64 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d>=0 ) break;.  
5600: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5610: 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68  if( j<p->nLookah
5620: 65 61 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ead ) continue;.
5630: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
5640: 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a   j<p->nAction; j
5650: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
5660: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d  f( p->aAction[j]
5670: 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d  .lookahead==j+p-
5680: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69 20 29  >mnLookahead-i )
5690: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
56a0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
56b0: 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 7b 0a 20  =p->nAction ){. 
56c0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20           break; 
56d0: 20 2f 2a 20 46 69 74 73 20 69 6e 20 65 6d 70 74   /* Fits in empt
56e0: 79 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 20 20 20  y slots */.     
56f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5700: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65   }.  }.  /* Inse
5710: 72 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  rt transaction s
5720: 65 74 20 61 74 20 69 6e 64 65 78 20 69 2e 20 2a  et at index i. *
5730: 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70  /.  for(j=0; j<p
5740: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b  ->nLookahead; j+
5750: 2b 29 7b 0a 20 20 20 20 6b 20 3d 20 70 2d 3e 61  +){.    k = p->a
5760: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f  Lookahead[j].loo
5770: 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f  kahead - p->mnLo
5780: 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20  okahead + i;.   
5790: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 20 3d   p->aAction[k] =
57a0: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a   p->aLookahead[j
57b0: 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 2d  ];.    if( k>=p-
57c0: 3e 6e 41 63 74 69 6f 6e 20 29 20 70 2d 3e 6e 41  >nAction ) p->nA
57d0: 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a 20 20 7d  ction = k+1;.  }
57e0: 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  .  p->nLookahead
57f0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74 75   = 0;..  /* Retu
5800: 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 74 68  rn the offset th
5810: 61 74 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  at is added to t
5820: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e 20  he lookahead in 
5830: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
5840: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74 6f  .  ** index into
5850: 20 79 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74 68   yy_action of th
5860: 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 65  e action */.  re
5870: 74 75 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c 6f  turn i - p->mnLo
5880: 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 2a 2a  okahead;.}../***
5890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
58a0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
58b0: 65 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a 2a 2a  e "build.c" ****
58c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
58d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
58e0: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 63 6f 6e   Routines to con
58f0: 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66 69  struction the fi
5900: 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69  nite state machi
5910: 6e 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  ne for the LEMON
5920: 0a 2a 2a 20 70 61 72 73 65 72 20 67 65 6e 65 72  .** parser gener
5930: 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e  ator..*/../* Fin
5940: 64 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73  d a precedence s
5950: 79 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79 20 72  ymbol of every r
5960: 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  ule in the gramm
5970: 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f 73 65  ar..** .** Those
5980: 20 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76   rules which hav
5990: 65 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73  e a precedence s
59a0: 79 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e 20 74  ymbol coded in t
59b0: 68 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72 61 6d  he input.** gram
59c0: 6d 61 72 20 75 73 69 6e 67 20 74 68 65 20 22 5b  mar using the "[
59d0: 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74 72 75  symbol]" constru
59e0: 63 74 20 77 69 6c 6c 20 61 6c 72 65 61 64 79 20  ct will already 
59f0: 68 61 76 65 20 74 68 65 0a 2a 2a 20 72 70 2d 3e  have the.** rp->
5a00: 70 72 65 63 73 79 6d 20 66 69 65 6c 64 20 66 69  precsym field fi
5a10: 6c 6c 65 64 2e 20 20 4f 74 68 65 72 20 72 75 6c  lled.  Other rul
5a20: 65 73 20 74 61 6b 65 20 61 73 20 74 68 65 69 72  es take as their
5a30: 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73   precedence.** s
5a40: 79 6d 62 6f 6c 20 74 68 65 20 66 69 72 73 74 20  ymbol the first 
5a50: 52 48 53 20 73 79 6d 62 6f 6c 20 77 69 74 68 20  RHS symbol with 
5a60: 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64  a defined preced
5a70: 65 6e 63 65 2e 20 20 49 66 20 74 68 65 72 65 0a  ence.  If there.
5a80: 2a 2a 20 61 72 65 20 6e 6f 74 20 52 48 53 20 73  ** are not RHS s
5a90: 79 6d 62 6f 6c 73 20 77 69 74 68 20 61 20 64 65  ymbols with a de
5aa0: 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65  fined precedence
5ab0: 2c 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65  , the precedence
5ac0: 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65 6c 64  .** symbol field
5ad0: 20 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b 2e 0a   is left blank..
5ae0: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c 65  */.void FindRule
5af0: 50 72 65 63 65 64 65 6e 63 65 73 28 73 74 72 75  Precedences(stru
5b00: 63 74 20 6c 65 6d 6f 6e 20 2a 78 70 29 0a 7b 0a  ct lemon *xp).{.
5b10: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
5b20: 70 3b 0a 20 20 66 6f 72 28 72 70 3d 78 70 2d 3e  p;.  for(rp=xp->
5b30: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
5b40: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
5b50: 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30 20 29  rp->precsym==0 )
5b60: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  {.      int i, j
5b70: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
5b80: 20 69 3c 72 70 2d 3e 6e 72 68 73 20 26 26 20 72   i<rp->nrhs && r
5b90: 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30 3b 20 69  p->precsym==0; i
5ba0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
5bb0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
5bc0: 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
5bd0: 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70       if( sp->typ
5be0: 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
5bf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
5c00: 72 28 6a 3d 30 3b 20 6a 3c 73 70 2d 3e 6e 73 75  r(j=0; j<sp->nsu
5c10: 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  bsym; j++){.    
5c20: 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e          if( sp->
5c30: 73 75 62 73 79 6d 5b 6a 5d 2d 3e 70 72 65 63 3e  subsym[j]->prec>
5c40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
5c50: 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20      rp->precsym 
5c60: 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 3b  = sp->subsym[j];
5c70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
5c80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
5c90: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
5ca0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
5cb0: 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b  ( sp->prec>=0 ){
5cc0: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70  .          rp->p
5cd0: 72 65 63 73 79 6d 20 3d 20 72 70 2d 3e 72 68 73  recsym = rp->rhs
5ce0: 5b 69 5d 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 0a  [i];..}.      }.
5cf0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5d00: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61  rn;.}../* Find a
5d10: 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20  ll nonterminals 
5d20: 77 68 69 63 68 20 77 69 6c 6c 20 67 65 6e 65 72  which will gener
5d30: 61 74 65 20 74 68 65 20 65 6d 70 74 79 20 73 74  ate the empty st
5d40: 72 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e 20 67 6f  ring..** Then go
5d50: 20 62 61 63 6b 20 61 6e 64 20 63 6f 6d 70 75 74   back and comput
5d60: 65 20 74 68 65 20 66 69 72 73 74 20 73 65 74 73  e the first sets
5d70: 20 6f 66 20 65 76 65 72 79 20 6e 6f 6e 74 65 72   of every nonter
5d80: 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 66 69  minal..** The fi
5d90: 72 73 74 20 73 65 74 20 69 73 20 74 68 65 20 73  rst set is the s
5da0: 65 74 20 6f 66 20 61 6c 6c 20 74 65 72 6d 69 6e  et of all termin
5db0: 61 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68  al symbols which
5dc0: 20 63 61 6e 20 62 65 67 69 6e 0a 2a 2a 20 61 20   can begin.** a 
5dd0: 73 74 72 69 6e 67 20 67 65 6e 65 72 61 74 65 64  string generated
5de0: 20 62 79 20 74 68 61 74 20 6e 6f 6e 74 65 72 6d   by that nonterm
5df0: 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  inal..*/.void Fi
5e00: 6e 64 46 69 72 73 74 53 65 74 73 28 73 74 72 75  ndFirstSets(stru
5e10: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
5e20: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
5e30: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
5e40: 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b  .  int progress;
5e50: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ..  for(i=0; i<l
5e60: 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
5e70: 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79  +){.    lemp->sy
5e80: 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61  mbols[i]->lambda
5e90: 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a   = LEMON_FALSE;.
5ea0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6c 65 6d 70    }.  for(i=lemp
5eb0: 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 3c 6c  ->nterminal; i<l
5ec0: 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
5ed0: 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79  +){.    lemp->sy
5ee0: 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69 72 73 74 73  mbols[i]->firsts
5ef0: 65 74 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20  et = SetNew();. 
5f00: 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 63   }..  /* First c
5f10: 6f 6d 70 75 74 65 20 61 6c 6c 20 6c 61 6d 62 64  ompute all lambd
5f20: 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20  as */.  do{.    
5f30: 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
5f40: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
5f50: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
5f60: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
5f70: 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61   rp->lhs->lambda
5f80: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5f90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
5fa0: 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
5fb0: 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
5fc0: 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68  bol *sp = rp->rh
5fd0: 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  s[i];.        as
5fe0: 73 65 72 74 28 20 73 70 2d 3e 74 79 70 65 3d 3d  sert( sp->type==
5ff0: 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73  NONTERMINAL || s
6000: 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e  p->lambda==LEMON
6010: 5f 46 41 4c 53 45 20 29 3b 0a 20 20 20 20 20 20  _FALSE );.      
6020: 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61    if( sp->lambda
6030: 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20  ==LEMON_FALSE ) 
6040: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6050: 20 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e       if( i==rp->
6060: 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  nrhs ){.        
6070: 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20  rp->lhs->lambda 
6080: 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20  = LEMON_TRUE;.  
6090: 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d        progress =
60a0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
60b0: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67  }.  }while( prog
60c0: 72 65 73 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  ress );..  /* No
60d0: 77 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69  w compute all fi
60e0: 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f  rst sets */.  do
60f0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  {.    struct sym
6100: 62 6f 6c 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20  bol *s1, *s2;.  
6110: 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a    progress = 0;.
6120: 20 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d      for(rp=lemp-
6130: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
6140: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 73  ->next){.      s
6150: 31 20 3d 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20  1 = rp->lhs;.   
6160: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
6170: 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
6180: 20 20 20 20 20 20 73 32 20 3d 20 72 70 2d 3e 72        s2 = rp->r
6190: 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hs[i];.        i
61a0: 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52  f( s2->type==TER
61b0: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
61c0: 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53     progress += S
61d0: 65 74 41 64 64 28 73 31 2d 3e 66 69 72 73 74 73  etAdd(s1->firsts
61e0: 65 74 2c 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20  et,s2->index);. 
61f0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6200: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
6210: 28 20 73 32 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54  ( s2->type==MULT
6220: 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
6230: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
6240: 6a 3c 73 32 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a  j<s2->nsubsym; j
6250: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
6260: 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74   progress += Set
6270: 41 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74  Add(s1->firstset
6280: 2c 73 32 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e  ,s2->subsym[j]->
6290: 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20  index);.        
62a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
62b0: 65 61 6b 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  eak;..}else if( 
62c0: 73 31 3d 3d 73 32 20 29 7b 0a 20 20 20 20 20 20  s1==s2 ){.      
62d0: 20 20 20 20 69 66 28 20 73 31 2d 3e 6c 61 6d 62      if( s1->lamb
62e0: 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20  da==LEMON_FALSE 
62f0: 29 20 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 7b  ) break;..}else{
6300: 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72  .          progr
6310: 65 73 73 20 2b 3d 20 53 65 74 55 6e 69 6f 6e 28  ess += SetUnion(
6320: 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d  s1->firstset,s2-
6330: 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20  >firstset);.    
6340: 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e 6c 61        if( s2->la
6350: 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53  mbda==LEMON_FALS
6360: 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20  E ) break;..}.  
6370: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
6380: 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29  hile( progress )
6390: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
63a0: 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52  * Compute all LR
63b0: 28 30 29 20 73 74 61 74 65 73 20 66 6f 72 20 74  (0) states for t
63c0: 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e  he grammar.  Lin
63d0: 6b 73 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20  ks.** are added 
63e0: 74 6f 20 62 65 74 77 65 65 6e 20 73 6f 6d 65 20  to between some 
63f0: 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 74  states so that t
6400: 68 65 20 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20  he LR(1) follow 
6410: 73 65 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  sets.** can be c
6420: 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a  omputed later..*
6430: 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74  /.PRIVATE struct
6440: 20 73 74 61 74 65 20 2a 67 65 74 73 74 61 74 65   state *getstate
6450: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29  (struct lemon *)
6460: 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64 20 72 65  ;  /* forward re
6470: 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f 69 64 20  ference */.void 
6480: 46 69 6e 64 53 74 61 74 65 73 28 73 74 72 75 63  FindStates(struc
6490: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
64a0: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
64b0: 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20 72   *sp;.  struct r
64c0: 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 43 6f 6e 66  ule *rp;..  Conf
64d0: 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 3b 0a 0a  iglist_init();..
64e0: 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 74    /* Find the st
64f0: 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  art symbol */.  
6500: 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20  if( lemp->start 
6510: 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62  ){.    sp = Symb
6520: 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74  ol_find(lemp->st
6530: 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70  art);.    if( sp
6540: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 72 72  ==0 ){.      Err
6550: 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
6560: 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 70 65  name,0,."The spe
6570: 63 69 66 69 65 64 20 73 74 61 72 74 20 73 79 6d  cified start sym
6580: 62 6f 6c 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f  bol \"%s\" is no
6590: 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e 74 65 72 6d  t \.in a nonterm
65a0: 69 6e 61 6c 20 6f 66 20 74 68 65 20 67 72 61 6d  inal of the gram
65b0: 6d 61 72 2e 20 20 5c 22 25 73 5c 22 20 77 69 6c  mar.  \"%s\" wil
65c0: 6c 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65  l be used as the
65d0: 20 73 74 61 72 74 20 5c 0a 73 79 6d 62 6f 6c 20   start \.symbol 
65e0: 69 6e 73 74 65 61 64 2e 22 2c 6c 65 6d 70 2d 3e  instead.",lemp->
65f0: 73 74 61 72 74 2c 6c 65 6d 70 2d 3e 72 75 6c 65  start,lemp->rule
6600: 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ->lhs->name);.  
6610: 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
6620: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 70 20 3d  nt++;.      sp =
6630: 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73   lemp->rule->lhs
6640: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
6650: 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
6660: 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 0a  rule->lhs;.  }..
6670: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
6680: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
6690: 64 6f 65 73 6e 27 74 20 6f 63 63 75 72 20 6f 6e  doesn't occur on
66a0: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
66b0: 73 69 64 65 20 6f 66 0a 20 20 2a 2a 20 61 6e 79  side of.  ** any
66c0: 20 72 75 6c 65 2e 20 20 52 65 70 6f 72 74 20 61   rule.  Report a
66d0: 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20 64 6f  n error if it do
66e0: 65 73 2e 20 20 28 59 41 43 43 20 77 6f 75 6c 64  es.  (YACC would
66f0: 20 67 65 6e 65 72 61 74 65 20 61 20 6e 65 77 0a   generate a new.
6700: 20 20 2a 2a 20 73 74 61 72 74 20 73 79 6d 62 6f    ** start symbo
6710: 6c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 29  l in this case.)
6720: 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d   */.  for(rp=lem
6730: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
6740: 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69  rp->next){.    i
6750: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
6760: 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
6770: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  ++){.      if( r
6780: 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73 70 20 29 7b  p->rhs[i]==sp ){
6790: 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 44     /* FIX ME:  D
67a0: 65 61 6c 20 77 69 74 68 20 6d 75 6c 74 69 74 65  eal with multite
67b0: 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 20 20 20  rminals */.     
67c0: 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
67d0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54  ->filename,0,."T
67e0: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
67f0: 5c 22 25 73 5c 22 20 6f 63 63 75 72 73 20 6f 6e  \"%s\" occurs on
6800: 20 74 68 65 20 5c 0a 72 69 67 68 74 2d 68 61 6e   the \.right-han
6810: 64 20 73 69 64 65 20 6f 66 20 61 20 72 75 6c 65  d side of a rule
6820: 2e 20 54 68 69 73 20 77 69 6c 6c 20 72 65 73 75  . This will resu
6830: 6c 74 20 69 6e 20 61 20 70 61 72 73 65 72 20 77  lt in a parser w
6840: 68 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f 74 20  hich \.does not 
6850: 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e 22 2c  work properly.",
6860: 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
6870: 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
6880: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
6890: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
68a0: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
68b0: 74 69 6f 6e 20 73 65 74 20 66 6f 72 20 74 68 65  tion set for the
68c0: 20 66 69 72 73 74 20 73 74 61 74 65 0a 20 20 2a   first state.  *
68d0: 2a 20 69 73 20 61 6c 6c 20 72 75 6c 65 73 20 77  * is all rules w
68e0: 68 69 63 68 20 68 61 76 65 20 74 68 65 20 73 74  hich have the st
68f0: 61 72 74 20 73 79 6d 62 6f 6c 20 61 73 20 74 68  art symbol as th
6900: 65 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d 68 61  eir.  ** left-ha
6910: 6e 64 20 73 69 64 65 20 2a 2f 0a 20 20 66 6f 72  nd side */.  for
6920: 28 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 72 70  (rp=sp->rule; rp
6930: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c 68 73  ; rp=rp->nextlhs
6940: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f  ){.    struct co
6950: 6e 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a 20 20  nfig *newcfp;.  
6960: 20 20 72 70 2d 3e 6c 68 73 53 74 61 72 74 20 3d    rp->lhsStart =
6970: 20 31 3b 0a 20 20 20 20 6e 65 77 63 66 70 20 3d   1;.    newcfp =
6980: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62   Configlist_addb
6990: 61 73 69 73 28 72 70 2c 30 29 3b 0a 20 20 20 20  asis(rp,0);.    
69a0: 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66  SetAdd(newcfp->f
69b0: 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ws,0);.  }..  /*
69c0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72   Compute the fir
69d0: 73 74 20 73 74 61 74 65 2e 20 20 41 6c 6c 20 6f  st state.  All o
69e0: 74 68 65 72 20 73 74 61 74 65 73 20 77 69 6c 6c  ther states will
69f0: 20 62 65 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65   be.  ** compute
6a00: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
6a10: 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 70 75  during the compu
6a20: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  tation of the fi
6a30: 72 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54 68  rst one..  ** Th
6a40: 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
6a50: 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
6a60: 73 74 61 74 65 20 69 73 20 6e 6f 74 20 75 73 65  state is not use
6a70: 64 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  d. */.  (void)ge
6a80: 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 20 20  tstate(lemp);.  
6a90: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65  return;.}../* Re
6aa0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6ab0: 6f 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  o a state which 
6ac0: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
6ad0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
6ae0: 6e 0a 2a 2a 20 6c 69 73 74 20 77 68 69 63 68 20  n.** list which 
6af0: 68 61 73 20 62 65 65 6e 20 62 75 69 6c 74 20 66  has been built f
6b00: 72 6f 6d 20 63 61 6c 6c 73 20 74 6f 20 43 6f 6e  rom calls to Con
6b10: 66 69 67 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f 0a  figlist_add..*/.
6b20: 50 52 49 56 41 54 45 20 76 6f 69 64 20 62 75 69  PRIVATE void bui
6b30: 6c 64 73 68 69 66 74 73 28 73 74 72 75 63 74 20  ldshifts(struct 
6b40: 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72 75 63 74 20  lemon *, struct 
6b50: 73 74 61 74 65 20 2a 29 3b 20 2f 2a 20 46 6f 72  state *); /* For
6b60: 77 64 20 72 65 66 20 2a 2f 0a 50 52 49 56 41 54  wd ref */.PRIVAT
6b70: 45 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  E struct state *
6b80: 67 65 74 73 74 61 74 65 28 73 74 72 75 63 74 20  getstate(struct 
6b90: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
6ba0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
6bb0: 63 66 70 2c 20 2a 62 70 3b 0a 20 20 73 74 72 75  cfp, *bp;.  stru
6bc0: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 0a  ct state *stp;..
6bd0: 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
6be0: 20 73 6f 72 74 65 64 20 62 61 73 69 73 20 6f 66   sorted basis of
6bf0: 20 74 68 65 20 6e 65 77 20 73 74 61 74 65 2e 20   the new state. 
6c00: 20 54 68 65 20 62 61 73 69 73 20 77 61 73 20 63   The basis was c
6c10: 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20  onstructed.  ** 
6c20: 62 79 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74  by prior calls t
6c30: 6f 20 22 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  o "Configlist_ad
6c40: 64 62 61 73 69 73 28 29 22 2e 20 2a 2f 0a 20 20  dbasis()". */.  
6c50: 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62  Configlist_sortb
6c60: 61 73 69 73 28 29 3b 0a 20 20 62 70 20 3d 20 43  asis();.  bp = C
6c70: 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28  onfiglist_basis(
6c80: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 73  );..  /* Get a s
6c90: 74 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61  tate with the sa
6ca0: 6d 65 20 62 61 73 69 73 20 2a 2f 0a 20 20 73 74  me basis */.  st
6cb0: 70 20 3d 20 53 74 61 74 65 5f 66 69 6e 64 28 62  p = State_find(b
6cc0: 70 29 3b 0a 20 20 69 66 28 20 73 74 70 20 29 7b  p);.  if( stp ){
6cd0: 0a 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65 20  .    /* A state 
6ce0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 62 61  with the same ba
6cf0: 73 69 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  sis already exis
6d00: 74 73 21 20 20 43 6f 70 79 20 61 6c 6c 20 74 68  ts!  Copy all th
6d10: 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20 20  e follow-set.   
6d20: 20 2a 2a 20 70 72 6f 70 61 67 61 74 69 6f 6e 20   ** propagation 
6d30: 6c 69 6e 6b 73 20 66 72 6f 6d 20 74 68 65 20 73  links from the s
6d40: 74 61 74 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  tate under const
6d50: 72 75 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  ruction into the
6d60: 0a 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74  .    ** preexist
6d70: 69 6e 67 20 73 74 61 74 65 2c 20 74 68 65 6e 20  ing state, then 
6d80: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
6d90: 20 74 6f 20 74 68 65 20 70 72 65 65 78 69 73 74   to the preexist
6da0: 69 6e 67 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  ing state */.   
6db0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
6dc0: 78 2c 20 2a 79 3b 0a 20 20 20 20 66 6f 72 28 78  x, *y;.    for(x
6dd0: 3d 62 70 2c 20 79 3d 73 74 70 2d 3e 62 70 3b 20  =bp, y=stp->bp; 
6de0: 78 20 26 26 20 79 3b 20 78 3d 78 2d 3e 62 70 2c  x && y; x=x->bp,
6df0: 20 79 3d 79 2d 3e 62 70 29 7b 0a 20 20 20 20 20   y=y->bp){.     
6e00: 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 26 79 2d 3e   Plink_copy(&y->
6e10: 62 70 6c 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a 20  bplp,x->bplp);. 
6e20: 20 20 20 20 20 50 6c 69 6e 6b 5f 64 65 6c 65 74       Plink_delet
6e30: 65 28 78 2d 3e 66 70 6c 70 29 3b 0a 20 20 20 20  e(x->fplp);.    
6e40: 20 20 78 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e 62    x->fplp = x->b
6e50: 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  plp = 0;.    }. 
6e60: 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c     cfp = Configl
6e70: 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 0a 20 20  ist_return();.  
6e80: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74    Configlist_eat
6e90: 28 63 66 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (cfp);.  }else{.
6ea0: 20 20 20 20 2f 2a 20 54 68 69 73 20 72 65 61 6c      /* This real
6eb0: 6c 79 20 69 73 20 61 20 6e 65 77 20 73 74 61 74  ly is a new stat
6ec0: 65 2e 20 20 43 6f 6e 73 74 72 75 63 74 20 61 6c  e.  Construct al
6ed0: 6c 20 74 68 65 20 64 65 74 61 69 6c 73 20 2a 2f  l the details */
6ee0: 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  .    Configlist_
6ef0: 63 6c 6f 73 75 72 65 28 6c 65 6d 70 29 3b 20 20  closure(lemp);  
6f00: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
6f10: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
6f20: 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 43 6f  losure */.    Co
6f30: 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29 3b  nfiglist_sort();
6f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
6f50: 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  rt the configura
6f60: 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a  tion closure */.
6f70: 20 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67      cfp = Config
6f80: 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 20 20  list_return();  
6f90: 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65   /* Get a pointe
6fa0: 72 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 20  r to the config 
6fb0: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 70 20  list */.    stp 
6fc0: 3d 20 53 74 61 74 65 5f 6e 65 77 28 29 3b 20 20  = State_new();  
6fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65           /* A ne
6fe0: 77 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72  w state structur
6ff0: 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 6f 72 79 43  e */.    MemoryC
7000: 68 65 63 6b 28 73 74 70 29 3b 0a 20 20 20 20 73  heck(stp);.    s
7010: 74 70 2d 3e 62 70 20 3d 20 62 70 3b 20 20 20 20  tp->bp = bp;    
7020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
7030: 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66  emember the conf
7040: 69 67 75 72 61 74 69 6f 6e 20 62 61 73 69 73 20  iguration basis 
7050: 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 63 66 70 20  */.    stp->cfp 
7060: 3d 20 63 66 70 3b 20 20 20 20 20 20 20 20 20 20  = cfp;          
7070: 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20      /* Remember 
7080: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
7090: 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20  n closure */.   
70a0: 20 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 20 3d   stp->statenum =
70b0: 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b   lemp->nstate++;
70c0: 20 2f 2a 20 45 76 65 72 79 20 73 74 61 74 65 20   /* Every state 
70d0: 67 65 74 73 20 61 20 73 65 71 75 65 6e 63 65 20  gets a sequence 
70e0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 73 74  number */.    st
70f0: 70 2d 3e 61 70 20 3d 20 30 3b 20 20 20 20 20 20  p->ap = 0;      
7100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
7110: 20 61 63 74 69 6f 6e 73 2c 20 79 65 74 2e 20 2a   actions, yet. *
7120: 2f 0a 20 20 20 20 53 74 61 74 65 5f 69 6e 73 65  /.    State_inse
7130: 72 74 28 73 74 70 2c 73 74 70 2d 3e 62 70 29 3b  rt(stp,stp->bp);
7140: 20 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65     /* Add to the
7150: 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a   state table */.
7160: 20 20 20 20 62 75 69 6c 64 73 68 69 66 74 73 28      buildshifts(
7170: 6c 65 6d 70 2c 73 74 70 29 3b 20 20 20 20 20 20  lemp,stp);      
7180: 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20   /* Recursively 
7190: 63 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 6f  compute successo
71a0: 72 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 7d 0a  r states */.  }.
71b0: 20 20 72 65 74 75 72 6e 20 73 74 70 3b 0a 7d 0a    return stp;.}.
71c0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
71d0: 75 65 20 69 66 20 74 77 6f 20 73 79 6d 62 6f 6c  ue if two symbol
71e0: 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 0a  s are the same..
71f0: 2a 2f 0a 69 6e 74 20 73 61 6d 65 5f 73 79 6d 62  */.int same_symb
7200: 6f 6c 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  ol(struct symbol
7210: 20 2a 61 2c 20 73 74 72 75 63 74 20 73 79 6d 62   *a, struct symb
7220: 6f 6c 20 2a 62 29 0a 7b 0a 20 20 69 6e 74 20 69  ol *b).{.  int i
7230: 3b 0a 20 20 69 66 28 20 61 3d 3d 62 20 29 20 72  ;.  if( a==b ) r
7240: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 61  eturn 1;.  if( a
7250: 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52  ->type!=MULTITER
7260: 4d 49 4e 41 4c 20 29 20 72 65 74 75 72 6e 20 30  MINAL ) return 0
7270: 3b 0a 20 20 69 66 28 20 62 2d 3e 74 79 70 65 21  ;.  if( b->type!
7280: 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
7290: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
72a0: 20 61 2d 3e 6e 73 75 62 73 79 6d 21 3d 62 2d 3e   a->nsubsym!=b->
72b0: 6e 73 75 62 73 79 6d 20 29 20 72 65 74 75 72 6e  nsubsym ) return
72c0: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
72d0: 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b  <a->nsubsym; i++
72e0: 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 73 75  ){.    if( a->su
72f0: 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e 73 75 62 73  bsym[i]!=b->subs
7300: 79 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30  ym[i] ) return 0
7310: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
7320: 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63  ;.}../* Construc
7330: 74 20 61 6c 6c 20 73 75 63 63 65 73 73 6f 72 20  t all successor 
7340: 73 74 61 74 65 73 20 74 6f 20 74 68 65 20 67 69  states to the gi
7350: 76 65 6e 20 73 74 61 74 65 2e 20 20 41 20 22 73  ven state.  A "s
7360: 75 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74 61  uccessor".** sta
7370: 74 65 20 69 73 20 61 6e 79 20 73 74 61 74 65 20  te is any state 
7380: 77 68 69 63 68 20 63 61 6e 20 62 65 20 72 65 61  which can be rea
7390: 63 68 65 64 20 62 79 20 61 20 73 68 69 66 74 20  ched by a shift 
73a0: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41  action..*/.PRIVA
73b0: 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69  TE void buildshi
73c0: 66 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  fts(struct lemon
73d0: 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 73   *lemp, struct s
73e0: 74 61 74 65 20 2a 73 74 70 29 0a 7b 0a 20 20 73  tate *stp).{.  s
73f0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
7400: 70 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  p;  /* For loopi
7410: 6e 67 20 74 68 72 75 20 74 68 65 20 63 6f 6e 66  ng thru the conf
7420: 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73  ig closure of "s
7430: 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  tp" */.  struct 
7440: 63 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20 2f 2a  config *bcfp; /*
7450: 20 46 6f 72 20 74 68 65 20 69 6e 6e 65 72 20 6c   For the inner l
7460: 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20 63 6c  oop on config cl
7470: 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a  osure of "stp" *
7480: 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  /.  struct confi
7490: 67 20 2a 6e 65 77 63 66 67 3b 20 20 2f 2a 20 2a  g *newcfg;  /* *
74a0: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
74b0: 6c 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62  l *sp;   /* Symb
74c0: 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ol following the
74d0: 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72   dot in configur
74e0: 61 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20  ation "cfp" */. 
74f0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
7500: 62 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20  bsp;  /* Symbol 
7510: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f  following the do
7520: 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69  t in configurati
7530: 6f 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20 20 73  on "bcfp" */.  s
7540: 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77  truct state *new
7550: 73 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65  stp; /* A pointe
7560: 72 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72  r to a successor
7570: 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20   state */..  /* 
7580: 45 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69  Each configurati
7590: 6f 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c  on becomes compl
75a0: 65 74 65 20 61 66 74 65 72 20 69 74 20 63 6f 6e  ete after it con
75b0: 74 69 62 75 74 65 73 20 74 6f 20 61 20 73 75 63  tibutes to a suc
75c0: 63 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74  cessor.  ** stat
75d0: 65 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61  e.  Initially, a
75e0: 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ll configuration
75f0: 73 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65  s are incomplete
7600: 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74   */.  for(cfp=st
7610: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
7620: 3d 63 66 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d  =cfp->next) cfp-
7630: 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50  >status = INCOMP
7640: 4c 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  LETE;..  /* Loop
7650: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e   through all con
7660: 66 69 67 75 72 61 74 69 6f 6e 73 20 6f 66 20 74  figurations of t
7670: 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20 2a  he state "stp" *
7680: 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d  /.  for(cfp=stp-
7690: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
76a0: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69  fp->next){.    i
76b0: 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d  f( cfp->status==
76c0: 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69  COMPLETE ) conti
76d0: 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61  nue;    /* Alrea
76e0: 64 79 20 75 73 65 64 20 62 79 20 69 6e 6e 65 72  dy used by inner
76f0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28   loop */.    if(
7700: 20 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e   cfp->dot>=cfp->
7710: 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69  rp->nrhs ) conti
7720: 6e 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73  nue;  /* Can't s
7730: 68 69 66 74 20 74 68 69 73 20 63 6f 6e 66 69 67  hift this config
7740: 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69   */.    Configli
7750: 73 74 5f 72 65 73 65 74 28 29 3b 20 20 20 20 20  st_reset();     
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7770: 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6e 65   /* Reset the ne
7780: 77 20 63 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a  w config set */.
7790: 20 20 20 20 73 70 20 3d 20 63 66 70 2d 3e 72 70      sp = cfp->rp
77a0: 2d 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b  ->rhs[cfp->dot];
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
77c0: 53 79 6d 62 6f 6c 20 61 66 74 65 72 20 74 68 65  Symbol after the
77d0: 20 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   dot */..    /* 
77e0: 46 6f 72 20 65 76 65 72 79 20 63 6f 6e 66 69 67  For every config
77f0: 75 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  uration in the s
7800: 74 61 74 65 20 22 73 74 70 22 20 77 68 69 63 68  tate "stp" which
7810: 20 68 61 73 20 74 68 65 20 73 79 6d 62 6f 6c 20   has the symbol 
7820: 22 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c  "sp".    ** foll
7830: 6f 77 69 6e 67 20 69 74 73 20 64 6f 74 2c 20 61  owing its dot, a
7840: 64 64 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 66  dd the same conf
7850: 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65  iguration to the
7860: 20 62 61 73 69 73 20 73 65 74 20 75 6e 64 65 72   basis set under
7870: 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63  .    ** construc
7880: 74 69 6f 6e 20 62 75 74 20 77 69 74 68 20 74 68  tion but with th
7890: 65 20 64 6f 74 20 73 68 69 66 74 65 64 20 6f 6e  e dot shifted on
78a0: 65 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20  e symbol to the 
78b0: 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f  right. */.    fo
78c0: 72 28 62 63 66 70 3d 63 66 70 3b 20 62 63 66 70  r(bcfp=cfp; bcfp
78d0: 3b 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78  ; bcfp=bcfp->nex
78e0: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 63  t){.      if( bc
78f0: 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50  fp->status==COMP
7900: 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LETE ) continue;
7910: 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75      /* Already u
7920: 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  sed */.      if(
7930: 20 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70   bcfp->dot>=bcfp
7940: 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e  ->rp->nrhs ) con
7950: 74 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20  tinue; /* Can't 
7960: 73 68 69 66 74 20 74 68 69 73 20 6f 6e 65 20 2a  shift this one *
7970: 2f 0a 20 20 20 20 20 20 62 73 70 20 3d 20 62 63  /.      bsp = bc
7980: 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70  fp->rp->rhs[bcfp
7990: 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20  ->dot];         
79a0: 20 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20    /* Get symbol 
79b0: 61 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20  after dot */.   
79c0: 20 20 20 69 66 28 20 21 73 61 6d 65 5f 73 79 6d     if( !same_sym
79d0: 62 6f 6c 28 62 73 70 2c 73 70 29 20 29 20 63 6f  bol(bsp,sp) ) co
79e0: 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 2f 2a 20  ntinue;      /* 
79f0: 4d 75 73 74 20 62 65 20 73 61 6d 65 20 61 73 20  Must be same as 
7a00: 66 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20 20 20  for "cfp" */.   
7a10: 20 20 20 62 63 66 70 2d 3e 73 74 61 74 75 73 20     bcfp->status 
7a20: 3d 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20  = COMPLETE;     
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7a40: 4d 61 72 6b 20 74 68 69 73 20 63 6f 6e 66 69 67  Mark this config
7a50: 20 61 73 20 75 73 65 64 20 2a 2f 0a 20 20 20 20   as used */.    
7a60: 20 20 6e 65 77 63 66 67 20 3d 20 43 6f 6e 66 69    newcfg = Confi
7a70: 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 62  glist_addbasis(b
7a80: 63 66 70 2d 3e 72 70 2c 62 63 66 70 2d 3e 64 6f  cfp->rp,bcfp->do
7a90: 74 2b 31 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e  t+1);.      Plin
7aa0: 6b 5f 61 64 64 28 26 6e 65 77 63 66 67 2d 3e 62  k_add(&newcfg->b
7ab0: 70 6c 70 2c 62 63 66 70 29 3b 0a 20 20 20 20 7d  plp,bcfp);.    }
7ac0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 20 70  ..    /* Get a p
7ad0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74  ointer to the st
7ae0: 61 74 65 20 64 65 73 63 72 69 62 65 64 20 62 79  ate described by
7af0: 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69   the basis confi
7b00: 67 75 72 61 74 69 6f 6e 20 73 65 74 0a 20 20 20  guration set.   
7b10: 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20   ** constructed 
7b20: 69 6e 20 74 68 65 20 70 72 65 63 65 64 69 6e 67  in the preceding
7b30: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 6e 65 77   loop */.    new
7b40: 73 74 70 20 3d 20 67 65 74 73 74 61 74 65 28 6c  stp = getstate(l
7b50: 65 6d 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  emp);..    /* Th
7b60: 65 20 73 74 61 74 65 20 22 6e 65 77 73 74 70 22  e state "newstp"
7b70: 20 69 73 20 72 65 61 63 68 65 64 20 66 72 6f 6d   is reached from
7b80: 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22   the state "stp"
7b90: 20 62 79 20 61 20 73 68 69 66 74 20 61 63 74 69   by a shift acti
7ba0: 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  on.    ** on the
7bb0: 20 73 79 6d 62 6f 6c 20 22 73 70 22 20 2a 2f 0a   symbol "sp" */.
7bc0: 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
7bd0: 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
7be0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
7bf0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
7c00: 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b  <sp->nsubsym; i+
7c10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 41 63 74 69  +){.        Acti
7c20: 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c  on_add(&stp->ap,
7c30: 53 48 49 46 54 2c 73 70 2d 3e 73 75 62 73 79 6d  SHIFT,sp->subsym
7c40: 5b 69 5d 2c 28 63 68 61 72 2a 29 6e 65 77 73 74  [i],(char*)newst
7c50: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
7c60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 41 63 74  }else{.      Act
7c70: 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70  ion_add(&stp->ap
7c80: 2c 53 48 49 46 54 2c 73 70 2c 28 63 68 61 72 20  ,SHIFT,sp,(char 
7c90: 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20 20 7d  *)newstp);.    }
7ca0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
7cb0: 6e 73 74 72 75 63 74 20 74 68 65 20 70 72 6f 70  nstruct the prop
7cc0: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f  agation links.*/
7cd0: 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28  .void FindLinks(
7ce0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
7cf0: 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp).{.  int i;. 
7d00: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
7d10: 63 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20 20 73  cfp, *other;.  s
7d20: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
7d30: 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  ;.  struct plink
7d40: 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f 75   *plp;..  /* Hou
7d50: 73 65 6b 65 65 70 69 6e 67 20 64 65 74 61 69 6c  sekeeping detail
7d60: 3a 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20 65 76  :.  ** Add to ev
7d70: 65 72 79 20 70 72 6f 70 61 67 61 74 65 20 6c 69  ery propagate li
7d80: 6e 6b 20 61 20 70 6f 69 6e 74 65 72 20 62 61 63  nk a pointer bac
7d90: 6b 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74  k to the state t
7da0: 6f 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65  o.  ** which the
7db0: 20 6c 69 6e 6b 20 69 73 20 61 74 74 61 63 68 65   link is attache
7dc0: 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  d. */.  for(i=0;
7dd0: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
7de0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
7df0: 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
7e00: 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74  ;.    for(cfp=st
7e10: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
7e20: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
7e30: 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 73 74     cfp->stp = st
7e40: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  p;.    }.  }..  
7e50: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 62  /* Convert all b
7e60: 61 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20 66 6f  acklinks into fo
7e70: 72 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20 4f 6e  rward links.  On
7e80: 6c 79 20 74 68 65 20 66 6f 72 77 61 72 64 0a 20  ly the forward. 
7e90: 20 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20 75 73   ** links are us
7ea0: 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ed in the follow
7eb0: 2d 73 65 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e  -set computation
7ec0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
7ed0: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
7ee0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
7ef0: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
7f00: 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70  .    for(cfp=stp
7f10: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
7f20: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
7f30: 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 62    for(plp=cfp->b
7f40: 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c  plp; plp; plp=pl
7f50: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
7f60: 20 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d 3e 63    other = plp->c
7f70: 66 70 3b 0a 20 20 20 20 20 20 20 20 50 6c 69 6e  fp;.        Plin
7f80: 6b 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e 66 70  k_add(&other->fp
7f90: 6c 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20 7d  lp,cfp);.      }
7fa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
7fb0: 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66 6f 6c   Compute all fol
7fc0: 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 41  lowsets..**.** A
7fd0: 20 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20 74 68   followset is th
7fe0: 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 73 79 6d  e set of all sym
7ff0: 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20 63  bols which can c
8000: 6f 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  ome immediately.
8010: 2a 2a 20 61 66 74 65 72 20 61 20 63 6f 6e 66 69  ** after a confi
8020: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  guration..*/.voi
8030: 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73  d FindFollowSets
8040: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
8050: 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp).{.  int i;.
8060: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
8070: 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 70  *cfp;.  struct p
8080: 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e 74  link *plp;.  int
8090: 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 69 6e 74   progress;.  int
80a0: 20 63 68 61 6e 67 65 3b 0a 0a 20 20 66 6f 72 28   change;..  for(
80b0: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
80c0: 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66  ate; i++){.    f
80d0: 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72  or(cfp=lemp->sor
80e0: 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70  ted[i]->cfp; cfp
80f0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
8100: 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61  {.      cfp->sta
8110: 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45  tus = INCOMPLETE
8120: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
8130: 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73   do{.    progres
8140: 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  s = 0;.    for(i
8150: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
8160: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
8170: 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f  for(cfp=lemp->so
8180: 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66  rted[i]->cfp; cf
8190: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
81a0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
81b0: 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50  fp->status==COMP
81c0: 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LETE ) continue;
81d0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 6c 70  .        for(plp
81e0: 3d 63 66 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b  =cfp->fplp; plp;
81f0: 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b   plp=plp->next){
8200: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 67  .          chang
8210: 65 20 3d 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70  e = SetUnion(plp
8220: 2d 3e 63 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e  ->cfp->fws,cfp->
8230: 66 77 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  fws);.          
8240: 69 66 28 20 63 68 61 6e 67 65 20 29 7b 0a 20 20  if( change ){.  
8250: 20 20 20 20 20 20 20 20 20 20 70 6c 70 2d 3e 63            plp->c
8260: 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43  fp->status = INC
8270: 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 20  OMPLETE;.       
8280: 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20       progress = 
8290: 31 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20  1;..  }..}.     
82a0: 20 20 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d     cfp->status =
82b0: 20 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20   COMPLETE;.     
82c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
82d0: 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d  e( progress );.}
82e0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  ..static int res
82f0: 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 73 74  olve_conflict(st
8300: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2c 73 74  ruct action *,st
8310: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a  ruct action *);.
8320: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  ./* Compute the 
8330: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c 20  reduce actions, 
8340: 61 6e 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66  and resolve conf
8350: 6c 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46  licts..*/.void F
8360: 69 6e 64 41 63 74 69 6f 6e 73 28 73 74 72 75 63  indActions(struc
8370: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
8380: 0a 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74  .  int i,j;.  st
8390: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
83a0: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
83b0: 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
83c0: 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74  symbol *sp;.  st
83d0: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a  ruct rule *rp;..
83e0: 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20    /* Add all of 
83f0: 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f  the reduce actio
8400: 6e 73 20 0a 20 20 2a 2a 20 41 20 72 65 64 75 63  ns .  ** A reduc
8410: 65 20 61 63 74 69 6f 6e 20 69 73 20 61 64 64 65  e action is adde
8420: 64 20 66 6f 72 20 65 61 63 68 20 65 6c 65 6d 65  d for each eleme
8430: 6e 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  nt of the follow
8440: 73 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f  set of.  ** a co
8450: 6e 66 69 67 75 72 61 74 69 6f 6e 20 77 68 69 63  nfiguration whic
8460: 68 20 68 61 73 20 69 74 73 20 64 6f 74 20 61 74  h has its dot at
8470: 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
8480: 68 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ht..  */.  for(i
8490: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
84a0: 74 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c  te; i++){   /* L
84b0: 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 74 61  oop over all sta
84c0: 74 65 73 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d  tes */.    stp =
84d0: 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
84e0: 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74  ;.    for(cfp=st
84f0: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
8500: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a  =cfp->next){  /*
8510: 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63   Loop over all c
8520: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f  onfigurations */
8530: 0a 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e  .      if( cfp->
8540: 72 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64  rp->nrhs==cfp->d
8550: 6f 74 20 29 7b 20 20 20 20 20 20 20 20 2f 2a 20  ot ){        /* 
8560: 49 73 20 64 6f 74 20 61 74 20 65 78 74 72 65 6d  Is dot at extrem
8570: 65 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20  e right? */.    
8580: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
8590: 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
85a0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
85b0: 69 66 28 20 53 65 74 46 69 6e 64 28 63 66 70 2d  if( SetFind(cfp-
85c0: 3e 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20  >fws,j) ){.     
85d0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20         /* Add a 
85e0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 74 6f  reduce action to
85f0: 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22   the state "stp"
8600: 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65 64 75   which will redu
8610: 63 65 20 62 79 20 74 68 65 0a 20 20 20 20 20 20  ce by the.      
8620: 20 20 20 20 20 20 2a 2a 20 72 75 6c 65 20 22 63        ** rule "c
8630: 66 70 2d 3e 72 70 22 20 69 66 20 74 68 65 20 6c  fp->rp" if the l
8640: 6f 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f 6c 20  ookahead symbol 
8650: 69 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  is "lemp->symbol
8660: 73 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20  s[j]" */.       
8670: 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28       Action_add(
8680: 26 73 74 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c  &stp->ap,REDUCE,
8690: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d  lemp->symbols[j]
86a0: 2c 28 63 68 61 72 20 2a 29 63 66 70 2d 3e 72 70  ,(char *)cfp->rp
86b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 09  );.          }..
86c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
86d0: 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68    }..  /* Add th
86e0: 65 20 61 63 63 65 70 74 69 6e 67 20 74 6f 6b 65  e accepting toke
86f0: 6e 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d  n */.  if( lemp-
8700: 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73 70  >start ){.    sp
8710: 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c   = Symbol_find(l
8720: 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20  emp->start);.   
8730: 20 69 66 28 20 73 70 3d 3d 30 20 29 20 73 70 20   if( sp==0 ) sp 
8740: 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68  = lemp->rule->lh
8750: 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
8760: 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d  sp = lemp->rule-
8770: 3e 6c 68 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41  >lhs;.  }.  /* A
8780: 64 64 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  dd to the first 
8790: 73 74 61 74 65 20 28 77 68 69 63 68 20 69 73 20  state (which is 
87a0: 61 6c 77 61 79 73 20 74 68 65 20 73 74 61 72 74  always the start
87b0: 69 6e 67 20 73 74 61 74 65 20 6f 66 20 74 68 65  ing state of the
87c0: 0a 20 20 2a 2a 20 66 69 6e 69 74 65 20 73 74 61  .  ** finite sta
87d0: 74 65 20 6d 61 63 68 69 6e 65 29 20 61 6e 20 61  te machine) an a
87e0: 63 74 69 6f 6e 20 74 6f 20 41 43 43 45 50 54 20  ction to ACCEPT 
87f0: 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  if the lookahead
8800: 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 73 74 61   is the.  ** sta
8810: 72 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20  rt nonterminal. 
8820: 20 2a 2f 0a 20 20 41 63 74 69 6f 6e 5f 61 64 64   */.  Action_add
8830: 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30  (&lemp->sorted[0
8840: 5d 2d 3e 61 70 2c 41 43 43 45 50 54 2c 73 70 2c  ]->ap,ACCEPT,sp,
8850: 30 29 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76  0);..  /* Resolv
8860: 65 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20  e conflicts */. 
8870: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
8880: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
8890: 20 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f      struct actio
88a0: 6e 20 2a 61 70 2c 20 2a 6e 61 70 3b 0a 20 20 20  n *ap, *nap;.   
88b0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
88c0: 74 70 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  tp;.    stp = le
88d0: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
88e0: 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 73 74     /* assert( st
88f0: 70 2d 3e 61 70 20 29 3b 20 2a 2f 0a 20 20 20 20  p->ap ); */.    
8900: 73 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e  stp->ap = Action
8910: 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a  _sort(stp->ap);.
8920: 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
8930: 61 70 3b 20 61 70 20 26 26 20 61 70 2d 3e 6e 65  ap; ap && ap->ne
8940: 78 74 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  xt; ap=ap->next)
8950: 7b 0a 20 20 20 20 20 20 66 6f 72 28 6e 61 70 3d  {.      for(nap=
8960: 61 70 2d 3e 6e 65 78 74 3b 20 6e 61 70 20 26 26  ap->next; nap &&
8970: 20 6e 61 70 2d 3e 73 70 3d 3d 61 70 2d 3e 73 70   nap->sp==ap->sp
8980: 3b 20 6e 61 70 3d 6e 61 70 2d 3e 6e 65 78 74 29  ; nap=nap->next)
8990: 7b 0a 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  {.         /* Th
89a0: 65 20 74 77 6f 20 61 63 74 69 6f 6e 73 20 22 61  e two actions "a
89b0: 70 22 20 61 6e 64 20 22 6e 61 70 22 20 68 61 76  p" and "nap" hav
89c0: 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 6f 6b 61  e the same looka
89d0: 68 65 61 64 2e 0a 20 20 20 20 20 20 20 20 20 2a  head..         *
89e0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69  * Figure out whi
89f0: 63 68 20 6f 6e 65 20 73 68 6f 75 6c 64 20 62 65  ch one should be
8a00: 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20   used */.       
8a10: 20 20 6c 65 6d 70 2d 3e 6e 63 6f 6e 66 6c 69 63    lemp->nconflic
8a20: 74 20 2b 3d 20 72 65 73 6f 6c 76 65 5f 63 6f 6e  t += resolve_con
8a30: 66 6c 69 63 74 28 61 70 2c 6e 61 70 29 3b 0a 20  flict(ap,nap);. 
8a40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8a50: 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20 61 6e  ..  /* Report an
8a60: 20 65 72 72 6f 72 20 66 6f 72 20 65 61 63 68 20   error for each 
8a70: 72 75 6c 65 20 74 68 61 74 20 63 61 6e 20 6e 65  rule that can ne
8a80: 76 65 72 20 62 65 20 72 65 64 75 63 65 64 2e 20  ver be reduced. 
8a90: 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
8aa0: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
8ab0: 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 63 61 6e  p->next) rp->can
8ac0: 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f 46  Reduce = LEMON_F
8ad0: 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ALSE;.  for(i=0;
8ae0: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
8af0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
8b00: 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20  t action *ap;.  
8b10: 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e 73    for(ap=lemp->s
8b20: 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20 61 70  orted[i]->ap; ap
8b30: 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
8b40: 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
8b50: 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61 70 2d  pe==REDUCE ) ap-
8b60: 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75 63 65  >x.rp->canReduce
8b70: 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20   = LEMON_TRUE;. 
8b80: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 72     }.  }.  for(r
8b90: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
8ba0: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
8bb0: 20 20 20 20 69 66 28 20 72 70 2d 3e 63 61 6e 52      if( rp->canR
8bc0: 65 64 75 63 65 20 29 20 63 6f 6e 74 69 6e 75 65  educe ) continue
8bd0: 3b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c  ;.    ErrorMsg(l
8be0: 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70  emp->filename,rp
8bf0: 2d 3e 72 75 6c 65 6c 69 6e 65 2c 22 54 68 69 73  ->ruleline,"This
8c00: 20 72 75 6c 65 20 63 61 6e 20 6e 6f 74 20 62 65   rule can not be
8c10: 20 72 65 64 75 63 65 64 2e 5c 6e 22 29 3b 0a 20   reduced.\n");. 
8c20: 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
8c30: 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52  t++;.  }.}../* R
8c40: 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63  esolve a conflic
8c50: 74 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  t between the tw
8c60: 6f 20 67 69 76 65 6e 20 61 63 74 69 6f 6e 73 2e  o given actions.
8c70: 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 66    If the.** conf
8c80: 6c 69 63 74 20 63 61 6e 27 74 20 62 65 20 72 65  lict can't be re
8c90: 73 6f 6c 76 65 64 2c 20 72 65 74 75 72 6e 20 6e  solved, return n
8ca0: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e  on-zero..**.** N
8cb0: 4f 20 4c 4f 4e 47 45 52 20 54 52 55 45 3a 0a 2a  O LONGER TRUE:.*
8cc0: 2a 20 20 20 54 6f 20 72 65 73 6f 6c 76 65 20 61  *   To resolve a
8cd0: 20 63 6f 6e 66 6c 69 63 74 2c 20 66 69 72 73 74   conflict, first
8ce0: 20 6c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20   look to see if 
8cf0: 65 69 74 68 65 72 20 61 63 74 69 6f 6e 0a 2a 2a  either action.**
8d00: 20 20 20 69 73 20 6f 6e 20 61 6e 20 65 72 72 6f     is on an erro
8d10: 72 20 72 75 6c 65 2e 20 20 49 6e 20 74 68 61 74  r rule.  In that
8d20: 20 63 61 73 65 2c 20 74 61 6b 65 20 74 68 65 20   case, take the 
8d30: 61 63 74 69 6f 6e 20 77 68 69 63 68 0a 2a 2a 20  action which.** 
8d40: 20 20 69 73 20 6e 6f 74 20 61 73 73 6f 63 69 61    is not associa
8d50: 74 65 64 20 77 69 74 68 20 74 68 65 20 65 72 72  ted with the err
8d60: 6f 72 20 72 75 6c 65 2e 20 20 49 66 20 6e 65 69  or rule.  If nei
8d70: 74 68 65 72 20 6f 72 20 62 6f 74 68 0a 2a 2a 20  ther or both.** 
8d80: 20 20 61 63 74 69 6f 6e 73 20 61 72 65 20 61 73    actions are as
8d90: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 6e  sociated with an
8da0: 20 65 72 72 6f 72 20 72 75 6c 65 2c 20 74 68 65   error rule, the
8db0: 6e 20 74 72 79 20 74 6f 0a 2a 2a 20 20 20 75 73  n try to.**   us
8dc0: 65 20 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20  e precedence to 
8dd0: 72 65 73 6f 6c 76 65 20 74 68 65 20 63 6f 6e 66  resolve the conf
8de0: 6c 69 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  lict..**.** If e
8df0: 69 74 68 65 72 20 61 63 74 69 6f 6e 20 69 73 20  ither action is 
8e00: 61 20 53 48 49 46 54 2c 20 74 68 65 6e 20 69 74  a SHIFT, then it
8e10: 20 6d 75 73 74 20 62 65 20 61 70 78 2e 20 20 54   must be apx.  T
8e20: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
8e30: 77 6f 6e 27 74 20 77 6f 72 6b 20 69 66 20 61 70  won't work if ap
8e40: 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  x->type==REDUCE 
8e50: 61 6e 64 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53  and apy->type==S
8e60: 48 49 46 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  HIFT..*/.static 
8e70: 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66  int resolve_conf
8e80: 6c 69 63 74 28 0a 20 20 73 74 72 75 63 74 20 61  lict(.  struct a
8e90: 63 74 69 6f 6e 20 2a 61 70 78 2c 0a 20 20 73 74  ction *apx,.  st
8ea0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 79  ruct action *apy
8eb0: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  .){.  struct sym
8ec0: 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70 79 3b 0a  bol *spx, *spy;.
8ed0: 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30    int errcnt = 0
8ee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70 78 2d  ;.  assert( apx-
8ef0: 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20 29 3b 20  >sp==apy->sp ); 
8f00: 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 74 68   /* Otherwise th
8f10: 65 72 65 20 77 6f 75 6c 64 20 62 65 20 6e 6f 20  ere would be no 
8f20: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 66  conflict */.  if
8f30: 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 49  ( apx->type==SHI
8f40: 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d  FT && apy->type=
8f50: 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 61 70  =SHIFT ){.    ap
8f60: 79 2d 3e 74 79 70 65 20 3d 20 53 53 43 4f 4e 46  y->type = SSCONF
8f70: 4c 49 43 54 3b 0a 20 20 20 20 65 72 72 63 6e 74  LICT;.    errcnt
8f80: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 70  ++;.  }.  if( ap
8f90: 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26  x->type==SHIFT &
8fa0: 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44  & apy->type==RED
8fb0: 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d  UCE ){.    spx =
8fc0: 20 61 70 78 2d 3e 73 70 3b 0a 20 20 20 20 73 70   apx->sp;.    sp
8fd0: 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70  y = apy->x.rp->p
8fe0: 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28 20  recsym;.    if( 
8ff0: 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70  spy==0 || spx->p
9000: 72 65 63 3c 30 20 7c 7c 20 73 70 79 2d 3e 70 72  rec<0 || spy->pr
9010: 65 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ec<0 ){.      /*
9020: 20 4e 6f 74 20 65 6e 6f 75 67 68 20 70 72 65 63   Not enough prec
9030: 65 64 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69  edence informati
9040: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 70 79  on. */.      apy
9050: 2d 3e 74 79 70 65 20 3d 20 53 52 43 4f 4e 46 4c  ->type = SRCONFL
9060: 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e  ICT;.      errcn
9070: 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t++;.    }else i
9080: 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73 70 79  f( spx->prec>spy
9090: 2d 3e 70 72 65 63 20 29 7b 20 20 20 20 2f 2a 20  ->prec ){    /* 
90a0: 68 69 67 68 65 72 20 70 72 65 63 65 64 65 6e 63  higher precedenc
90b0: 65 20 77 69 6e 73 20 2a 2f 0a 20 20 20 20 20 20  e wins */.      
90c0: 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52  apy->type = RD_R
90d0: 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c  ESOLVED;.    }el
90e0: 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63  se if( spx->prec
90f0: 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20  <spy->prec ){.  
9100: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20      apx->type = 
9110: 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20  SH_RESOLVED;.   
9120: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
9130: 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20  prec==spy->prec 
9140: 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 52  && spx->assoc==R
9150: 49 47 48 54 20 29 7b 20 2f 2a 20 55 73 65 20 6f  IGHT ){ /* Use o
9160: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20  perator */.     
9170: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f   apy->type = RD_
9180: 52 45 53 4f 4c 56 45 44 3b 20 20 20 20 20 20 20  RESOLVED;       
9190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91a0: 20 20 20 20 20 20 2f 2a 20 61 73 73 6f 63 69 61        /* associa
91b0: 74 69 76 69 74 79 20 2a 2f 0a 20 20 20 20 7d 65  tivity */.    }e
91c0: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
91d0: 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20  c==spy->prec && 
91e0: 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4c 45 46 54  spx->assoc==LEFT
91f0: 20 29 7b 20 20 2f 2a 20 74 6f 20 62 72 65 61 6b   ){  /* to break
9200: 20 74 69 65 20 2a 2f 0a 20 20 20 20 20 20 61 70   tie */.      ap
9210: 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52 45 53  x->type = SH_RES
9220: 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  OLVED;.    }else
9230: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9240: 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e  spx->prec==spy->
9250: 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73  prec && spx->ass
9260: 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a 20 20 20 20  oc==NONE );.    
9270: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 53 52    apy->type = SR
9280: 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20  CONFLICT;.      
9290: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a  errcnt++;.    }.
92a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70 78 2d    }else if( apx-
92b0: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26  >type==REDUCE &&
92c0: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44 55   apy->type==REDU
92d0: 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d 20  CE ){.    spx = 
92e0: 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73  apx->x.rp->precs
92f0: 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d 20 61 70  ym;.    spy = ap
9300: 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d  y->x.rp->precsym
9310: 3b 0a 20 20 20 20 69 66 28 20 73 70 78 3d 3d 30  ;.    if( spx==0
9320: 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70   || spy==0 || sp
9330: 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a 20 20 20  x->prec<0 ||.   
9340: 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 7c 7c 20   spy->prec<0 || 
9350: 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e  spx->prec==spy->
9360: 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70  prec ){.      ap
9370: 79 2d 3e 74 79 70 65 20 3d 20 52 52 43 4f 4e 46  y->type = RRCONF
9380: 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63  LICT;.      errc
9390: 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  nt++;.    }else 
93a0: 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73 70  if( spx->prec>sp
93b0: 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20  y->prec ){.     
93c0: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f   apy->type = RD_
93d0: 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65  RESOLVED;.    }e
93e0: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
93f0: 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  c<spy->prec ){. 
9400: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d       apx->type =
9410: 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   RD_RESOLVED;.  
9420: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
9430: 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
9440: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45  apx->type==SH_RE
9450: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
9460: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45  apx->type==RD_RE
9470: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
9480: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e  apx->type==SSCON
9490: 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61  FLICT ||.      a
94a0: 70 78 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46  px->type==SRCONF
94b0: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
94c0: 78 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c  x->type==RRCONFL
94d0: 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  ICT ||.      apy
94e0: 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c  ->type==SH_RESOL
94f0: 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  VED ||.      apy
9500: 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c  ->type==RD_RESOL
9510: 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  VED ||.      apy
9520: 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49  ->type==SSCONFLI
9530: 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d  CT ||.      apy-
9540: 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43  >type==SRCONFLIC
9550: 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e  T ||.      apy->
9560: 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54  type==RRCONFLICT
9570: 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f 2a 20 54  .    );.    /* T
9580: 68 65 20 52 45 44 55 43 45 2f 53 48 49 46 54 20  he REDUCE/SHIFT 
9590: 63 61 73 65 20 63 61 6e 6e 6f 74 20 68 61 70 70  case cannot happ
95a0: 65 6e 20 62 65 63 61 75 73 65 20 53 48 49 46 54  en because SHIFT
95b0: 73 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a 20 20  s come before.  
95c0: 20 20 2a 2a 20 52 45 44 55 43 45 73 20 6f 6e 20    ** REDUCEs on 
95d0: 74 68 65 20 6c 69 73 74 2e 20 20 49 66 20 77 65  the list.  If we
95e0: 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
95f0: 74 20 69 74 20 6d 75 73 74 20 62 65 20 62 65 63  t it must be bec
9600: 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ause.    ** the 
9610: 70 61 72 73 65 72 20 63 6f 6e 66 6c 69 63 74 20  parser conflict 
9620: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
9630: 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20   resolved. */.  
9640: 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e  }.  return errcn
9650: 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t;.}./**********
9660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
9670: 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69   the file "confi
9680: 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  glist.c" *******
9690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96a0: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  **/./*.** Routin
96b0: 65 73 20 74 6f 20 70 72 6f 63 65 73 73 69 6e 67  es to processing
96c0: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
96d0: 20 6c 69 73 74 20 61 6e 64 20 62 75 69 6c 64 69   list and buildi
96e0: 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a 20 69 6e  ng a state.** in
96f0: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
9700: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
9710: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
9720: 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69 73 74 20  onfig *freelist 
9730: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  = 0;      /* Lis
9740: 74 20 6f 66 20 66 72 65 65 20 63 6f 6e 66 69 67  t of free config
9750: 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  urations */.stat
9760: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
9770: 20 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   *current = 0;  
9780: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c       /* Top of l
9790: 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61  ist of configura
97a0: 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
97b0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a  struct config **
97c0: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 20  currentend = 0; 
97d0: 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c 69 73    /* Last on lis
97e0: 74 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a 2f 0a  t of configs */.
97f0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f  static struct co
9800: 6e 66 69 67 20 2a 62 61 73 69 73 20 3d 20 30 3b  nfig *basis = 0;
9810: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
9820: 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73  of list of basis
9830: 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74   configs */.stat
9840: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
9850: 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20 30 3b   **basisend = 0;
9860: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c       /* End of l
9870: 69 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e  ist of basis con
9880: 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74 75  figs */../* Retu
9890: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
98a0: 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74  a new configurat
98b0: 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 73  ion */.PRIVATE s
98c0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
98d0: 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20 73 74 72  wconfig(){.  str
98e0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63  uct config *newc
98f0: 66 67 3b 0a 20 20 69 66 28 20 66 72 65 65 6c 69  fg;.  if( freeli
9900: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  st==0 ){.    int
9910: 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   i;.    int amt 
9920: 3d 20 33 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  = 3;.    freelis
9930: 74 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  t = (struct conf
9940: 69 67 20 2a 29 63 61 6c 6c 6f 63 28 20 61 6d 74  ig *)calloc( amt
9950: 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  , sizeof(struct 
9960: 63 6f 6e 66 69 67 29 20 29 3b 0a 20 20 20 20 69  config) );.    i
9970: 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29  f( freelist==0 )
9980: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
9990: 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74  stderr,"Unable t
99a0: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
99b0: 79 20 66 6f 72 20 61 20 6e 65 77 20 63 6f 6e 66  y for a new conf
99c0: 69 67 75 72 61 74 69 6f 6e 2e 22 29 3b 0a 20 20  iguration.");.  
99d0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
99e0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
99f0: 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72  i<amt-1; i++) fr
9a00: 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d  eelist[i].next =
9a10: 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b   &freelist[i+1];
9a20: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d  .    freelist[am
9a30: 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20  t-1].next = 0;. 
9a40: 20 7d 0a 20 20 6e 65 77 63 66 67 20 3d 20 66 72   }.  newcfg = fr
9a50: 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69  eelist;.  freeli
9a60: 73 74 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e  st = freelist->n
9a70: 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65  ext;.  return ne
9a80: 77 63 66 67 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  wcfg;.}../* The 
9a90: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 6f  configuration "o
9aa0: 6c 64 22 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  ld" is no longer
9ab0: 20 75 73 65 64 20 2a 2f 0a 50 52 49 56 41 54 45   used */.PRIVATE
9ac0: 20 76 6f 69 64 20 64 65 6c 65 74 65 63 6f 6e 66   void deleteconf
9ad0: 69 67 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ig(struct config
9ae0: 20 2a 6f 6c 64 29 0a 7b 0a 20 20 6f 6c 64 2d 3e   *old).{.  old->
9af0: 6e 65 78 74 20 3d 20 66 72 65 65 6c 69 73 74 3b  next = freelist;
9b00: 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 6f 6c  .  freelist = ol
9b10: 64 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c  d;.}../* Initial
9b20: 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69 67 75  ized the configu
9b30: 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c  ration list buil
9b40: 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  der */.void Conf
9b50: 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 7b 0a 20  iglist_init(){. 
9b60: 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20   current = 0;.  
9b70: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 75  currentend = &cu
9b80: 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d  rrent;.  basis =
9b90: 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d   0;.  basisend =
9ba0: 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69   &basis;.  Confi
9bb0: 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 3b 0a 20  gtable_init();. 
9bc0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49   return;.}../* I
9bd0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63  nitialized the c
9be0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
9bf0: 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69  t builder */.voi
9c00: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73  d Configlist_res
9c10: 65 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20  et(){.  current 
9c20: 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e  = 0;.  currenten
9c30: 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20  d = &current;.  
9c40: 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73  basis = 0;.  bas
9c50: 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a  isend = &basis;.
9c60: 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c    Configtable_cl
9c70: 65 61 72 28 30 29 3b 0a 20 20 72 65 74 75 72 6e  ear(0);.  return
9c80: 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f 74  ;.}../* Add anot
9c90: 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  her configuratio
9ca0: 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75  n to the configu
9cb0: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73  ration list */.s
9cc0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
9cd0: 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 0a 20 20  nfiglist_add(.  
9ce0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
9cf0: 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 20      /* The rule 
9d00: 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 20 20 20 20  */.  int dot    
9d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
9d20: 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53 20 6f  x into the RHS o
9d30: 66 20 74 68 65 20 72 75 6c 65 20 77 68 65 72 65  f the rule where
9d40: 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20 2a 2f   the dot goes */
9d50: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  .){.  struct con
9d60: 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b  fig *cfp, model;
9d70: 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72  ..  assert( curr
9d80: 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d  entend!=0 );.  m
9d90: 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20  odel.rp = rp;.  
9da0: 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b  model.dot = dot;
9db0: 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74  .  cfp = Configt
9dc0: 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c  able_find(&model
9dd0: 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20  );.  if( cfp==0 
9de0: 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77  ){.    cfp = new
9df0: 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66  config();.    cf
9e00: 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20  p->rp = rp;.    
9e10: 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a  cfp->dot = dot;.
9e20: 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53      cfp->fws = S
9e30: 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70  etNew();.    cfp
9e40: 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63  ->stp = 0;.    c
9e50: 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e  fp->fplp = cfp->
9e60: 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66  bplp = 0;.    cf
9e70: 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20  p->next = 0;.   
9e80: 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20   cfp->bp = 0;.  
9e90: 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20    *currentend = 
9ea0: 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74  cfp;.    current
9eb0: 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74  end = &cfp->next
9ec0: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c  ;.    Configtabl
9ed0: 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20  e_insert(cfp);. 
9ee0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b   }.  return cfp;
9ef0: 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62 61 73  .}../* Add a bas
9f00: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
9f10: 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72   to the configur
9f20: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74  ation list */.st
9f30: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
9f40: 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73  figlist_addbasis
9f50: 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70  (struct rule *rp
9f60: 2c 20 69 6e 74 20 64 6f 74 29 0a 7b 0a 20 20 73  , int dot).{.  s
9f70: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
9f80: 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73  p, model;..  ass
9f90: 65 72 74 28 20 62 61 73 69 73 65 6e 64 21 3d 30  ert( basisend!=0
9fa0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
9fb0: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
9fc0: 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a   model.rp = rp;.
9fd0: 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f    model.dot = do
9fe0: 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  t;.  cfp = Confi
9ff0: 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64  gtable_find(&mod
a000: 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d  el);.  if( cfp==
a010: 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e  0 ){.    cfp = n
a020: 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20  ewconfig();.    
a030: 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20  cfp->rp = rp;.  
a040: 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74    cfp->dot = dot
a050: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d  ;.    cfp->fws =
a060: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63   SetNew();.    c
a070: 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20  fp->stp = 0;.   
a080: 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70   cfp->fplp = cfp
a090: 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20  ->bplp = 0;.    
a0a0: 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20  cfp->next = 0;. 
a0b0: 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a     cfp->bp = 0;.
a0c0: 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20      *currentend 
a0d0: 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65  = cfp;.    curre
a0e0: 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65  ntend = &cfp->ne
a0f0: 78 74 3b 0a 20 20 20 20 2a 62 61 73 69 73 65 6e  xt;.    *basisen
a100: 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 62 61 73  d = cfp;.    bas
a110: 69 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e 62 70  isend = &cfp->bp
a120: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c  ;.    Configtabl
a130: 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20  e_insert(cfp);. 
a140: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b   }.  return cfp;
a150: 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74  .}../* Compute t
a160: 68 65 20 63 6c 6f 73 75 72 65 20 6f 66 20 74 68  he closure of th
a170: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
a180: 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  list */.void Con
a190: 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28  figlist_closure(
a1a0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
a1b0: 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63  mp).{.  struct c
a1c0: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6e 65 77  onfig *cfp, *new
a1d0: 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75  cfp;.  struct ru
a1e0: 6c 65 20 2a 72 70 2c 20 2a 6e 65 77 72 70 3b 0a  le *rp, *newrp;.
a1f0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
a200: 2a 73 70 2c 20 2a 78 73 70 3b 0a 20 20 69 6e 74  *sp, *xsp;.  int
a210: 20 69 2c 20 64 6f 74 3b 0a 0a 20 20 61 73 73 65   i, dot;..  asse
a220: 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d  rt( currentend!=
a230: 30 20 29 3b 0a 20 20 66 6f 72 28 63 66 70 3d 63  0 );.  for(cfp=c
a240: 75 72 72 65 6e 74 3b 20 63 66 70 3b 20 63 66 70  urrent; cfp; cfp
a250: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
a260: 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20   rp = cfp->rp;. 
a270: 20 20 20 64 6f 74 20 3d 20 63 66 70 2d 3e 64 6f     dot = cfp->do
a280: 74 3b 0a 20 20 20 20 69 66 28 20 64 6f 74 3e 3d  t;.    if( dot>=
a290: 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69  rp->nrhs ) conti
a2a0: 6e 75 65 3b 0a 20 20 20 20 73 70 20 3d 20 72 70  nue;.    sp = rp
a2b0: 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20 20 20 20  ->rhs[dot];.    
a2c0: 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f  if( sp->type==NO
a2d0: 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  NTERMINAL ){.   
a2e0: 20 20 20 69 66 28 20 73 70 2d 3e 72 75 6c 65 3d     if( sp->rule=
a2f0: 3d 30 20 26 26 20 73 70 21 3d 6c 65 6d 70 2d 3e  =0 && sp!=lemp->
a300: 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20  errsym ){.      
a310: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
a320: 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69  >filename,rp->li
a330: 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20  ne,"Nonterminal 
a340: 5c 22 25 73 5c 22 20 68 61 73 20 6e 6f 20 72 75  \"%s\" has no ru
a350: 6c 65 73 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  les.",.         
a360: 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
a370: 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
a380: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt++;.      }.  
a390: 20 20 20 20 66 6f 72 28 6e 65 77 72 70 3d 73 70      for(newrp=sp
a3a0: 2d 3e 72 75 6c 65 3b 20 6e 65 77 72 70 3b 20 6e  ->rule; newrp; n
a3b0: 65 77 72 70 3d 6e 65 77 72 70 2d 3e 6e 65 78 74  ewrp=newrp->next
a3c0: 6c 68 73 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  lhs){.        ne
a3d0: 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73  wcfp = Configlis
a3e0: 74 5f 61 64 64 28 6e 65 77 72 70 2c 30 29 3b 0a  t_add(newrp,0);.
a3f0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 64 6f          for(i=do
a400: 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  t+1; i<rp->nrhs;
a410: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
a420: 20 78 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   xsp = rp->rhs[i
a430: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
a440: 20 78 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d   xsp->type==TERM
a450: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
a460: 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66      SetAdd(newcf
a470: 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 69 6e 64 65  p->fws,xsp->inde
a480: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x);.            
a490: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
a4a0: 20 7d 65 6c 73 65 20 69 66 28 20 78 73 70 2d 3e   }else if( xsp->
a4b0: 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
a4c0: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
a4d0: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
a4e0: 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
a4f0: 3c 78 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b  <xsp->nsubsym; k
a500: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
a510: 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70     SetAdd(newcfp
a520: 2d 3e 66 77 73 2c 20 78 73 70 2d 3e 73 75 62 73  ->fws, xsp->subs
a530: 79 6d 5b 6b 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20  ym[k]->index);. 
a540: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
a550: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a560: 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20  .  }else{.      
a570: 20 20 20 20 20 20 53 65 74 55 6e 69 6f 6e 28 6e        SetUnion(n
a580: 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e  ewcfp->fws,xsp->
a590: 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20  firstset);.     
a5a0: 20 20 20 20 20 20 20 69 66 28 20 78 73 70 2d 3e         if( xsp->
a5b0: 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41  lambda==LEMON_FA
a5c0: 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 20 20  LSE ) break;..  
a5d0: 7d 0a 09 7d 0a 20 20 20 20 20 20 20 20 69 66 28  }..}.        if(
a5e0: 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 50   i==rp->nrhs ) P
a5f0: 6c 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e 66  link_add(&cfp->f
a600: 70 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20 20  plp,newcfp);.   
a610: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
a620: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53   return;.}../* S
a630: 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ort the configur
a640: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f  ation list */.vo
a650: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f  id Configlist_so
a660: 72 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20  rt(){.  current 
a670: 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  = (struct config
a680: 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a   *)msort((char *
a690: 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72 20 2a  )current,(char *
a6a0: 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 6e 65 78  *)&(current->nex
a6b0: 74 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20  t),Configcmp);. 
a6c0: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b   currentend = 0;
a6d0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
a6e0: 20 53 6f 72 74 20 74 68 65 20 62 61 73 69 73 20   Sort the basis 
a6f0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
a700: 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  st */.void Confi
a710: 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28  glist_sortbasis(
a720: 29 7b 0a 20 20 62 61 73 69 73 20 3d 20 28 73 74  ){.  basis = (st
a730: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73  ruct config *)ms
a740: 6f 72 74 28 28 63 68 61 72 20 2a 29 63 75 72 72  ort((char *)curr
a750: 65 6e 74 2c 28 63 68 61 72 20 2a 2a 29 26 28 63  ent,(char **)&(c
a760: 75 72 72 65 6e 74 2d 3e 62 70 29 2c 43 6f 6e 66  urrent->bp),Conf
a770: 69 67 63 6d 70 29 3b 0a 20 20 62 61 73 69 73 65  igcmp);.  basise
a780: 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  nd = 0;.  return
a790: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
a7a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
a7b0: 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66  head of the conf
a7c0: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  iguration list a
a7d0: 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  nd.** reset the 
a7e0: 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63  list */.struct c
a7f0: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73  onfig *Configlis
a800: 74 5f 72 65 74 75 72 6e 28 29 7b 0a 20 20 73 74  t_return(){.  st
a810: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64  ruct config *old
a820: 3b 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e  ;.  old = curren
a830: 74 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30  t;.  current = 0
a840: 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d  ;.  currentend =
a850: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64   0;.  return old
a860: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
a870: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
a880: 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66  head of the conf
a890: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  iguration list a
a8a0: 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  nd.** reset the 
a8b0: 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63  list */.struct c
a8c0: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73  onfig *Configlis
a8d0: 74 5f 62 61 73 69 73 28 29 7b 0a 20 20 73 74 72  t_basis(){.  str
a8e0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b  uct config *old;
a8f0: 0a 20 20 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a  .  old = basis;.
a900: 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62    basis = 0;.  b
a910: 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72  asisend = 0;.  r
a920: 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a  eturn old;.}../*
a930: 20 46 72 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e   Free all elemen
a940: 74 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ts of the given 
a950: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
a960: 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  st */.void Confi
a970: 67 6c 69 73 74 5f 65 61 74 28 73 74 72 75 63 74  glist_eat(struct
a980: 20 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a   config *cfp).{.
a990: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
a9a0: 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f 72 28  *nextcfp;.  for(
a9b0: 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65 78 74 63  ; cfp; cfp=nextc
a9c0: 66 70 29 7b 0a 20 20 20 20 6e 65 78 74 63 66 70  fp){.    nextcfp
a9d0: 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20   = cfp->next;.  
a9e0: 20 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e 66    assert( cfp->f
a9f0: 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  plp==0 );.    as
aa00: 73 65 72 74 28 20 63 66 70 2d 3e 62 70 6c 70 3d  sert( cfp->bplp=
aa10: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 63 66  =0 );.    if( cf
aa20: 70 2d 3e 66 77 73 20 29 20 53 65 74 46 72 65 65  p->fws ) SetFree
aa30: 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20  (cfp->fws);.    
aa40: 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 63 66 70  deleteconfig(cfp
aa50: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  );.  }.  return;
aa60: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
aa70: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
aa80: 69 6c 65 20 22 65 72 72 6f 72 2e 63 22 20 2a 2a  ile "error.c" **
aa90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aaa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
aab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20  ./*.** Code for 
aac0: 70 72 69 6e 74 69 6e 67 20 65 72 72 6f 72 20 6d  printing error m
aad0: 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 76 6f 69 64  essage..*/..void
aae0: 20 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20   ErrorMsg(const 
aaf0: 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20  char *filename, 
ab00: 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73  int lineno, cons
ab10: 74 20 63 68 61 72 20 2a 66 6f 72 6d 61 74 2c 20  t char *format, 
ab20: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
ab30: 61 70 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  ap;.  fprintf(st
ab40: 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 22 2c  derr, "%s:%d: ",
ab50: 20 66 69 6c 65 6e 61 6d 65 2c 20 6c 69 6e 65 6e   filename, linen
ab60: 6f 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  o);.  va_start(a
ab70: 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20 76 66  p, format);.  vf
ab80: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 66 6f  printf(stderr,fo
ab90: 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76 61 5f 65  rmat,ap);.  va_e
aba0: 6e 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74  nd(ap);.  fprint
abb0: 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b  f(stderr, "\n");
abc0: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
abd0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
abe0: 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a 2a 2a 2a  le "main.c" ****
abf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac10: 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20 70 72 6f  /./*.** Main pro
ac20: 67 72 61 6d 20 66 69 6c 65 20 66 6f 72 20 74 68  gram file for th
ac30: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
ac40: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
ac50: 20 52 65 70 6f 72 74 20 61 6e 20 6f 75 74 2d 6f   Report an out-o
ac60: 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69 74 69  f-memory conditi
ac70: 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e 20 20 54  on and abort.  T
ac80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
ac90: 69 73 20 75 73 65 64 20 6d 6f 73 74 6c 79 20 62  is used mostly b
aca0: 79 20 74 68 65 20 22 4d 65 6d 6f 72 79 43 68 65  y the "MemoryChe
acb0: 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20 73 74 72  ck" macro in str
acc0: 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64 20 6d 65  uct.h.*/.void me
acd0: 6d 6f 72 79 5f 65 72 72 6f 72 28 29 7b 0a 20 20  mory_error(){.  
ace0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
acf0: 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20  Out of memory.  
ad00: 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e 22 29 3b  Aborting...\n");
ad10: 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 73  .  exit(1);.}..s
ad20: 74 61 74 69 63 20 69 6e 74 20 6e 44 65 66 69 6e  tatic int nDefin
ad30: 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  e = 0;      /* N
ad40: 75 6d 62 65 72 20 6f 66 20 2d 44 20 6f 70 74 69  umber of -D opti
ad50: 6f 6e 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  ons on the comma
ad60: 6e 64 20 6c 69 6e 65 20 2a 2f 0a 73 74 61 74 69  nd line */.stati
ad70: 63 20 63 68 61 72 20 2a 2a 61 7a 44 65 66 69 6e  c char **azDefin
ad80: 65 20 3d 20 30 3b 20 20 2f 2a 20 4e 61 6d 65 20  e = 0;  /* Name 
ad90: 6f 66 20 74 68 65 20 2d 44 20 6d 61 63 72 6f 73  of the -D macros
ada0: 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20 72 6f 75   */../* This rou
adb0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
adc0: 69 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e 74  ith the argument
add0: 20 74 6f 20 65 61 63 68 20 2d 44 20 63 6f 6d 6d   to each -D comm
ade0: 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e  and-line option.
adf0: 0a 2a 2a 20 41 64 64 20 74 68 65 20 6d 61 63 72  .** Add the macr
ae00: 6f 20 64 65 66 69 6e 65 64 20 74 6f 20 74 68 65  o defined to the
ae10: 20 61 7a 44 65 66 69 6e 65 20 61 72 72 61 79 2e   azDefine array.
ae20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ae30: 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 28  handle_D_option(
ae40: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72  char *z){.  char
ae50: 20 2a 2a 70 61 7a 3b 0a 20 20 6e 44 65 66 69 6e   **paz;.  nDefin
ae60: 65 2b 2b 3b 0a 20 20 61 7a 44 65 66 69 6e 65 20  e++;.  azDefine 
ae70: 3d 20 28 63 68 61 72 20 2a 2a 29 20 72 65 61 6c  = (char **) real
ae80: 6c 6f 63 28 61 7a 44 65 66 69 6e 65 2c 20 73 69  loc(azDefine, si
ae90: 7a 65 6f 66 28 61 7a 44 65 66 69 6e 65 5b 30 5d  zeof(azDefine[0]
aea0: 29 2a 6e 44 65 66 69 6e 65 29 3b 0a 20 20 69 66  )*nDefine);.  if
aeb0: 28 20 61 7a 44 65 66 69 6e 65 3d 3d 30 20 29 7b  ( azDefine==0 ){
aec0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
aed0: 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  err,"out of memo
aee0: 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ry\n");.    exit
aef0: 28 31 29 3b 0a 20 20 7d 0a 20 20 70 61 7a 20 3d  (1);.  }.  paz =
af00: 20 26 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69   &azDefine[nDefi
af10: 6e 65 2d 31 5d 3b 0a 20 20 2a 70 61 7a 20 3d 20  ne-1];.  *paz = 
af20: 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28  (char *) malloc(
af30: 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b   lemonStrlen(z)+
af40: 31 20 29 3b 0a 20 20 69 66 28 20 2a 70 61 7a 3d  1 );.  if( *paz=
af50: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
af60: 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20 6f 66  f(stderr,"out of
af70: 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
af80: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
af90: 73 74 72 63 70 79 28 2a 70 61 7a 2c 20 7a 29 3b  strcpy(*paz, z);
afa0: 0a 20 20 66 6f 72 28 7a 3d 2a 70 61 7a 3b 20 2a  .  for(z=*paz; *
afb0: 7a 20 26 26 20 2a 7a 21 3d 27 3d 27 3b 20 7a 2b  z && *z!='='; z+
afc0: 2b 29 7b 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d  +){}.  *z = 0;.}
afd0: 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75  ..static char *u
afe0: 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ser_templatename
aff0: 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20   = NULL;.static 
b000: 76 6f 69 64 20 68 61 6e 64 6c 65 5f 54 5f 6f 70  void handle_T_op
b010: 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20  tion(char *z){. 
b020: 20 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61   user_templatena
b030: 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 20 6d 61  me = (char *) ma
b040: 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65  lloc( lemonStrle
b050: 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28 20  n(z)+1 );.  if( 
b060: 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
b070: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 6f  e==0 ){.    memo
b080: 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a  ry_error();.  }.
b090: 20 20 73 74 72 63 70 79 28 75 73 65 72 5f 74 65    strcpy(user_te
b0a0: 6d 70 6c 61 74 65 6e 61 6d 65 2c 20 7a 29 3b 0a  mplatename, z);.
b0b0: 7d 0a 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70  }../* The main p
b0c0: 72 6f 67 72 61 6d 2e 20 20 50 61 72 73 65 20 74  rogram.  Parse t
b0d0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
b0e0: 61 6e 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a  and do it... */.
b0f0: 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67  int main(int arg
b100: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 0a  c, char **argv).
b110: 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 76  {.  static int v
b120: 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74  ersion = 0;.  st
b130: 61 74 69 63 20 69 6e 74 20 72 70 66 6c 61 67 20  atic int rpflag 
b140: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
b150: 74 20 62 61 73 69 73 66 6c 61 67 20 3d 20 30 3b  t basisflag = 0;
b160: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f  .  static int co
b170: 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 73 74  mpress = 0;.  st
b180: 61 74 69 63 20 69 6e 74 20 71 75 69 65 74 20 3d  atic int quiet =
b190: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
b1a0: 20 73 74 61 74 69 73 74 69 63 73 20 3d 20 30 3b   statistics = 0;
b1b0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6d 68  .  static int mh
b1c0: 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74  flag = 0;.  stat
b1d0: 69 63 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73  ic int nolinenos
b1e0: 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74  flag = 0;.  stat
b1f0: 69 63 20 69 6e 74 20 6e 6f 52 65 73 6f 72 74 20  ic int noResort 
b200: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74  = 0;.  static st
b210: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f  ruct s_options o
b220: 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20  ptions[] = {.   
b230: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c   {OPT_FLAG, "b",
b240: 20 28 63 68 61 72 2a 29 26 62 61 73 69 73 66 6c   (char*)&basisfl
b250: 61 67 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20  ag, "Print only 
b260: 74 68 65 20 62 61 73 69 73 20 69 6e 20 72 65 70  the basis in rep
b270: 6f 72 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ort."},.    {OPT
b280: 5f 46 4c 41 47 2c 20 22 63 22 2c 20 28 63 68 61  _FLAG, "c", (cha
b290: 72 2a 29 26 63 6f 6d 70 72 65 73 73 2c 20 22 44  r*)&compress, "D
b2a0: 6f 6e 27 74 20 63 6f 6d 70 72 65 73 73 20 74 68  on't compress th
b2b0: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22  e action table."
b2c0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52  },.    {OPT_FSTR
b2d0: 2c 20 22 44 22 2c 20 28 63 68 61 72 2a 29 68 61  , "D", (char*)ha
b2e0: 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22  ndle_D_option, "
b2f0: 44 65 66 69 6e 65 20 61 6e 20 25 69 66 64 65 66  Define an %ifdef
b300: 20 6d 61 63 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b   macro."},.    {
b310: 4f 50 54 5f 46 53 54 52 2c 20 22 54 22 2c 20 28  OPT_FSTR, "T", (
b320: 63 68 61 72 2a 29 68 61 6e 64 6c 65 5f 54 5f 6f  char*)handle_T_o
b330: 70 74 69 6f 6e 2c 20 22 53 70 65 63 69 66 79 20  ption, "Specify 
b340: 61 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 2e  a template file.
b350: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
b360: 47 2c 20 22 67 22 2c 20 28 63 68 61 72 2a 29 26  G, "g", (char*)&
b370: 72 70 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 67  rpflag, "Print g
b380: 72 61 6d 6d 61 72 20 77 69 74 68 6f 75 74 20 61  rammar without a
b390: 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b  ctions."},.    {
b3a0: 4f 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28  OPT_FLAG, "m", (
b3b0: 63 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22  char*)&mhflag, "
b3c0: 4f 75 74 70 75 74 20 61 20 6d 61 6b 65 68 65 61  Output a makehea
b3d0: 64 65 72 73 20 63 6f 6d 70 61 74 69 62 6c 65 20  ders compatible 
b3e0: 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  file."},.    {OP
b3f0: 54 5f 46 4c 41 47 2c 20 22 6c 22 2c 20 28 63 68  T_FLAG, "l", (ch
b400: 61 72 2a 29 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c  ar*)&nolinenosfl
b410: 61 67 2c 20 22 44 6f 20 6e 6f 74 20 70 72 69 6e  ag, "Do not prin
b420: 74 20 23 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e  t #line statemen
b430: 74 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ts."},.    {OPT_
b440: 46 4c 41 47 2c 20 22 70 22 2c 20 28 63 68 61 72  FLAG, "p", (char
b450: 2a 29 26 73 68 6f 77 50 72 65 63 65 64 65 6e 63  *)&showPrecedenc
b460: 65 43 6f 6e 66 6c 69 63 74 2c 0a 20 20 20 20 20  eConflict,.     
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
b480: 53 68 6f 77 20 63 6f 6e 66 6c 69 63 74 73 20 72  Show conflicts r
b490: 65 73 6f 6c 76 65 64 20 62 79 20 70 72 65 63 65  esolved by prece
b4a0: 64 65 6e 63 65 20 72 75 6c 65 73 22 7d 2c 0a 20  dence rules"},. 
b4b0: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71     {OPT_FLAG, "q
b4c0: 22 2c 20 28 63 68 61 72 2a 29 26 71 75 69 65 74  ", (char*)&quiet
b4d0: 2c 20 22 28 51 75 69 65 74 29 20 44 6f 6e 27 74  , "(Quiet) Don't
b4e0: 20 70 72 69 6e 74 20 74 68 65 20 72 65 70 6f 72   print the repor
b4f0: 74 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b  t file."},.    {
b500: 4f 50 54 5f 46 4c 41 47 2c 20 22 72 22 2c 20 28  OPT_FLAG, "r", (
b510: 63 68 61 72 2a 29 26 6e 6f 52 65 73 6f 72 74 2c  char*)&noResort,
b520: 20 22 44 6f 20 6e 6f 74 20 73 6f 72 74 20 6f 72   "Do not sort or
b530: 20 72 65 6e 75 6d 62 65 72 20 73 74 61 74 65 73   renumber states
b540: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
b550: 47 2c 20 22 73 22 2c 20 28 63 68 61 72 2a 29 26  G, "s", (char*)&
b560: 73 74 61 74 69 73 74 69 63 73 2c 0a 20 20 20 20  statistics,.    
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
b590: 50 72 69 6e 74 20 70 61 72 73 65 72 20 73 74 61  Print parser sta
b5a0: 74 73 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f  ts to standard o
b5b0: 75 74 70 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f  utput."},.    {O
b5c0: 50 54 5f 46 4c 41 47 2c 20 22 78 22 2c 20 28 63  PT_FLAG, "x", (c
b5d0: 68 61 72 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22  har*)&version, "
b5e0: 50 72 69 6e 74 20 74 68 65 20 76 65 72 73 69 6f  Print the versio
b5f0: 6e 20 6e 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20  n number."},.   
b600: 20 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c 30 2c 30   {OPT_FLAG,0,0,0
b610: 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  }.  };.  int i;.
b620: 20 20 69 6e 74 20 65 78 69 74 63 6f 64 65 3b 0a    int exitcode;.
b630: 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 6c    struct lemon l
b640: 65 6d 3b 0a 0a 20 20 4f 70 74 49 6e 69 74 28 61  em;..  OptInit(a
b650: 72 67 76 2c 6f 70 74 69 6f 6e 73 2c 73 74 64 65  rgv,options,stde
b660: 72 72 29 3b 0a 20 20 69 66 28 20 76 65 72 73 69  rr);.  if( versi
b670: 6f 6e 20 29 7b 0a 20 20 20 20 20 70 72 69 6e 74  on ){.     print
b680: 66 28 22 4c 65 6d 6f 6e 20 76 65 72 73 69 6f 6e  f("Lemon version
b690: 20 31 2e 30 5c 6e 22 29 3b 0a 20 20 20 20 20 65   1.0\n");.     e
b6a0: 78 69 74 28 30 29 3b 20 0a 20 20 7d 0a 20 20 69  xit(0); .  }.  i
b6b0: 66 28 20 4f 70 74 4e 41 72 67 73 28 29 21 3d 31  f( OptNArgs()!=1
b6c0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
b6d0: 73 74 64 65 72 72 2c 22 45 78 61 63 74 6c 79 20  stderr,"Exactly 
b6e0: 6f 6e 65 20 66 69 6c 65 6e 61 6d 65 20 61 72 67  one filename arg
b6f0: 75 6d 65 6e 74 20 69 73 20 72 65 71 75 69 72 65  ument is require
b700: 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  d.\n");.    exit
b710: 28 31 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  (1);.  }.  memse
b720: 74 28 26 6c 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  t(&lem, 0, sizeo
b730: 66 28 6c 65 6d 29 29 3b 0a 20 20 6c 65 6d 2e 65  f(lem));.  lem.e
b740: 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 0a 20 20  rrorcnt = 0;..  
b750: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
b760: 65 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 53  e machine */.  S
b770: 74 72 73 61 66 65 5f 69 6e 69 74 28 29 3b 0a 20  trsafe_init();. 
b780: 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 3b 0a   Symbol_init();.
b790: 20 20 53 74 61 74 65 5f 69 6e 69 74 28 29 3b 0a    State_init();.
b7a0: 20 20 6c 65 6d 2e 61 72 67 76 30 20 3d 20 61 72    lem.argv0 = ar
b7b0: 67 76 5b 30 5d 3b 0a 20 20 6c 65 6d 2e 66 69 6c  gv[0];.  lem.fil
b7c0: 65 6e 61 6d 65 20 3d 20 4f 70 74 41 72 67 28 30  ename = OptArg(0
b7d0: 29 3b 0a 20 20 6c 65 6d 2e 62 61 73 69 73 66 6c  );.  lem.basisfl
b7e0: 61 67 20 3d 20 62 61 73 69 73 66 6c 61 67 3b 0a  ag = basisflag;.
b7f0: 20 20 6c 65 6d 2e 6e 6f 6c 69 6e 65 6e 6f 73 66    lem.nolinenosf
b800: 6c 61 67 20 3d 20 6e 6f 6c 69 6e 65 6e 6f 73 66  lag = nolinenosf
b810: 6c 61 67 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65  lag;.  Symbol_ne
b820: 77 28 22 24 22 29 3b 0a 20 20 6c 65 6d 2e 65 72  w("$");.  lem.er
b830: 72 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  rsym = Symbol_ne
b840: 77 28 22 65 72 72 6f 72 22 29 3b 0a 20 20 6c 65  w("error");.  le
b850: 6d 2e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74  m.errsym->useCnt
b860: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50 61 72 73   = 0;..  /* Pars
b870: 65 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  e the input file
b880: 20 2a 2f 0a 20 20 50 61 72 73 65 28 26 6c 65 6d   */.  Parse(&lem
b890: 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 65 72 72  );.  if( lem.err
b8a0: 6f 72 63 6e 74 20 29 20 65 78 69 74 28 6c 65 6d  orcnt ) exit(lem
b8b0: 2e 65 72 72 6f 72 63 6e 74 29 3b 0a 20 20 69 66  .errorcnt);.  if
b8c0: 28 20 6c 65 6d 2e 6e 72 75 6c 65 3d 3d 30 20 29  ( lem.nrule==0 )
b8d0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
b8e0: 64 65 72 72 2c 22 45 6d 70 74 79 20 67 72 61 6d  derr,"Empty gram
b8f0: 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78  mar.\n");.    ex
b900: 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  it(1);.  }..  /*
b910: 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e 64 65 78   Count and index
b920: 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 6f 66 20   the symbols of 
b930: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20  the grammar */. 
b940: 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53   lem.nsymbol = S
b950: 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20  ymbol_count();. 
b960: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65   Symbol_new("{de
b970: 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c 65 6d 2e  fault}");.  lem.
b980: 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d 62 6f 6c  symbols = Symbol
b990: 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20 20 66 6f  _arrayof();.  fo
b9a0: 72 28 69 3d 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73  r(i=0; i<=lem.ns
b9b0: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e  ymbol; i++) lem.
b9c0: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65  symbols[i]->inde
b9d0: 78 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74 28 6c  x = i;.  qsort(l
b9e0: 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65 6d 2e 6e  em.symbols,lem.n
b9f0: 73 79 6d 62 6f 6c 2b 31 2c 73 69 7a 65 6f 66 28  symbol+1,sizeof(
ba00: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2c  struct symbol*),
ba10: 20 53 79 6d 62 6f 6c 63 6d 70 70 29 3b 0a 20 20   Symbolcmpp);.  
ba20: 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6c 65 6d 2e  for(i=0; i<=lem.
ba30: 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65  nsymbol; i++) le
ba40: 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e  m.symbols[i]->in
ba50: 64 65 78 20 3d 20 69 3b 0a 20 20 66 6f 72 28 69  dex = i;.  for(i
ba60: 3d 31 3b 20 69 73 75 70 70 65 72 28 6c 65 6d 2e  =1; isupper(lem.
ba70: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65  symbols[i]->name
ba80: 5b 30 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20 6c 65  [0]); i++);.  le
ba90: 6d 2e 6e 74 65 72 6d 69 6e 61 6c 20 3d 20 69 3b  m.nterminal = i;
baa0: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
bab0: 61 20 72 65 70 72 69 6e 74 20 6f 66 20 74 68 65  a reprint of the
bac0: 20 67 72 61 6d 6d 61 72 2c 20 69 66 20 72 65 71   grammar, if req
bad0: 75 65 73 74 65 64 20 6f 6e 20 74 68 65 20 63 6f  uested on the co
bae0: 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 20 20  mmand line */.  
baf0: 69 66 28 20 72 70 66 6c 61 67 20 29 7b 0a 20 20  if( rpflag ){.  
bb00: 20 20 52 65 70 72 69 6e 74 28 26 6c 65 6d 29 3b    Reprint(&lem);
bb10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
bb20: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
bb30: 73 69 7a 65 20 66 6f 72 20 61 6c 6c 20 66 6f 6c  size for all fol
bb40: 6c 6f 77 20 61 6e 64 20 66 69 72 73 74 20 73 65  low and first se
bb50: 74 73 20 2a 2f 0a 20 20 20 20 53 65 74 53 69 7a  ts */.    SetSiz
bb60: 65 28 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2b  e(lem.nterminal+
bb70: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64  1);..    /* Find
bb80: 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65 20   the precedence 
bb90: 66 6f 72 20 65 76 65 72 79 20 70 72 6f 64 75 63  for every produc
bba0: 74 69 6f 6e 20 72 75 6c 65 20 28 74 68 61 74 20  tion rule (that 
bbb0: 68 61 73 20 6f 6e 65 29 20 2a 2f 0a 20 20 20 20  has one) */.    
bbc0: 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e  FindRulePreceden
bbd0: 63 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ces(&lem);..    
bbe0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c  /* Compute the l
bbf0: 61 6d 62 64 61 2d 6e 6f 6e 74 65 72 6d 69 6e 61  ambda-nontermina
bc00: 6c 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  ls and the first
bc10: 2d 73 65 74 73 20 66 6f 72 20 65 76 65 72 79 0a  -sets for every.
bc20: 20 20 20 20 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e      ** nontermin
bc30: 61 6c 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 69  al */.    FindFi
bc40: 72 73 74 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a  rstSets(&lem);..
bc50: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61      /* Compute a
bc60: 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65 73 2e  ll LR(0) states.
bc70: 20 20 41 6c 73 6f 20 72 65 63 6f 72 64 20 66 6f    Also record fo
bc80: 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
bc90: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b  tion.    ** link
bca0: 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 6f  s so that the fo
bcb0: 6c 6c 6f 77 2d 73 65 74 20 63 61 6e 20 62 65 20  llow-set can be 
bcc0: 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 20 2a  computed later *
bcd0: 2f 0a 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65  /.    lem.nstate
bce0: 20 3d 20 30 3b 0a 20 20 20 20 46 69 6e 64 53 74   = 0;.    FindSt
bcf0: 61 74 65 73 28 26 6c 65 6d 29 3b 0a 20 20 20 20  ates(&lem);.    
bd00: 6c 65 6d 2e 73 6f 72 74 65 64 20 3d 20 53 74 61  lem.sorted = Sta
bd10: 74 65 5f 61 72 72 61 79 6f 66 28 29 3b 0a 0a 20  te_arrayof();.. 
bd20: 20 20 20 2f 2a 20 54 69 65 20 75 70 20 6c 6f 6f     /* Tie up loo
bd30: 73 65 20 65 6e 64 73 20 6f 6e 20 74 68 65 20 70  se ends on the p
bd40: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
bd50: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 4c 69 6e 6b   */.    FindLink
bd60: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
bd70: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 6f 6c   Compute the fol
bd80: 6c 6f 77 20 73 65 74 20 6f 66 20 65 76 65 72 79  low set of every
bd90: 20 72 65 64 75 63 69 62 6c 65 20 63 6f 6e 66 69   reducible confi
bda0: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  guration */.    
bdb0: 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 26  FindFollowSets(&
bdc0: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
bdd0: 6d 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e  mpute the action
bde0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 46   tables */.    F
bdf0: 69 6e 64 41 63 74 69 6f 6e 73 28 26 6c 65 6d 29  indActions(&lem)
be00: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65  ;..    /* Compre
be10: 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  ss the action ta
be20: 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  bles */.    if( 
be30: 63 6f 6d 70 72 65 73 73 3d 3d 30 20 29 20 43 6f  compress==0 ) Co
be40: 6d 70 72 65 73 73 54 61 62 6c 65 73 28 26 6c 65  mpressTables(&le
be50: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6f 72  m);..    /* Reor
be60: 64 65 72 20 61 6e 64 20 72 65 6e 75 6d 62 65 72  der and renumber
be70: 20 74 68 65 20 73 74 61 74 65 73 20 73 6f 20 74   the states so t
be80: 68 61 74 20 73 74 61 74 65 73 20 77 69 74 68 20  hat states with 
be90: 66 65 77 65 72 20 63 68 6f 69 63 65 73 0a 20 20  fewer choices.  
bea0: 20 20 2a 2a 20 6f 63 63 75 72 20 61 74 20 74 68    ** occur at th
beb0: 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20  e end.  This is 
bec0: 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
bed0: 74 68 61 74 20 68 65 6c 70 73 20 6d 61 6b 65 20  that helps make 
bee0: 74 68 65 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72  the.    ** gener
bef0: 61 74 65 64 20 70 61 72 73 65 72 20 74 61 62 6c  ated parser tabl
bf00: 65 73 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 20  es smaller. */. 
bf10: 20 20 20 69 66 28 20 6e 6f 52 65 73 6f 72 74 3d     if( noResort=
bf20: 3d 30 20 29 20 52 65 73 6f 72 74 53 74 61 74 65  =0 ) ResortState
bf30: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
bf40: 20 47 65 6e 65 72 61 74 65 20 61 20 72 65 70 6f   Generate a repo
bf50: 72 74 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  rt of the parser
bf60: 20 67 65 6e 65 72 61 74 65 64 2e 20 20 28 74 68   generated.  (th
bf70: 65 20 22 79 2e 6f 75 74 70 75 74 22 20 66 69 6c  e "y.output" fil
bf80: 65 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 71  e) */.    if( !q
bf90: 75 69 65 74 20 29 20 52 65 70 6f 72 74 4f 75 74  uiet ) ReportOut
bfa0: 70 75 74 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  put(&lem);..    
bfb0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
bfc0: 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20  source code for 
bfd0: 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20 20  the parser */.  
bfe0: 20 20 52 65 70 6f 72 74 54 61 62 6c 65 28 26 6c    ReportTable(&l
bff0: 65 6d 2c 20 6d 68 66 6c 61 67 29 3b 0a 0a 20 20  em, mhflag);..  
c000: 20 20 2f 2a 20 50 72 6f 64 75 63 65 20 61 20 68    /* Produce a h
c010: 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20 75  eader file for u
c020: 73 65 20 62 79 20 74 68 65 20 73 63 61 6e 6e 65  se by the scanne
c030: 72 2e 20 20 28 54 68 69 73 20 73 74 65 70 20 69  r.  (This step i
c040: 73 0a 20 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64  s.    ** omitted
c050: 20 69 66 20 74 68 65 20 22 2d 6d 22 20 6f 70 74   if the "-m" opt
c060: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 65 63 61  ion is used beca
c070: 75 73 65 20 6d 61 6b 65 68 65 61 64 65 72 73 20  use makeheaders 
c080: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65  will.    ** gene
c090: 72 61 74 65 20 74 68 65 20 66 69 6c 65 20 66 6f  rate the file fo
c0a0: 72 20 75 73 2e 29 20 2a 2f 0a 20 20 20 20 69 66  r us.) */.    if
c0b0: 28 20 21 6d 68 66 6c 61 67 20 29 20 52 65 70 6f  ( !mhflag ) Repo
c0c0: 72 74 48 65 61 64 65 72 28 26 6c 65 6d 29 3b 0a  rtHeader(&lem);.
c0d0: 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 69 73    }.  if( statis
c0e0: 74 69 63 73 20 29 7b 0a 20 20 20 20 70 72 69 6e  tics ){.    prin
c0f0: 74 66 28 22 50 61 72 73 65 72 20 73 74 61 74 69  tf("Parser stati
c100: 73 74 69 63 73 3a 20 25 64 20 74 65 72 6d 69 6e  stics: %d termin
c110: 61 6c 73 2c 20 25 64 20 6e 6f 6e 74 65 72 6d 69  als, %d nontermi
c120: 6e 61 6c 73 2c 20 25 64 20 72 75 6c 65 73 5c 6e  nals, %d rules\n
c130: 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 74 65  ",.      lem.nte
c140: 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 73 79 6d  rminal, lem.nsym
c150: 62 6f 6c 20 2d 20 6c 65 6d 2e 6e 74 65 72 6d 69  bol - lem.ntermi
c160: 6e 61 6c 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b  nal, lem.nrule);
c170: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 20  .    printf("   
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 25 64 20 73 74 61 74 65 73 2c 20 25 64 20 70 61  %d states, %d pa
c1a0: 72 73 65 72 20 74 61 62 6c 65 20 65 6e 74 72 69  rser table entri
c1b0: 65 73 2c 20 25 64 20 63 6f 6e 66 6c 69 63 74 73  es, %d conflicts
c1c0: 5c 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e  \n",.      lem.n
c1d0: 73 74 61 74 65 2c 20 6c 65 6d 2e 74 61 62 6c 65  state, lem.table
c1e0: 73 69 7a 65 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c  size, lem.nconfl
c1f0: 69 63 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ict);.  }.  if( 
c200: 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 3e 20  lem.nconflict > 
c210: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
c220: 28 73 74 64 65 72 72 2c 22 25 64 20 70 61 72 73  (stderr,"%d pars
c230: 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e  ing conflicts.\n
c240: 22 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29  ",lem.nconflict)
c250: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 72 65 74 75  ;.  }..  /* retu
c260: 72 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c  rn 0 on success,
c270: 20 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 2a   1 on failure. *
c280: 2f 0a 20 20 65 78 69 74 63 6f 64 65 20 3d 20 28  /.  exitcode = (
c290: 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3e 20  (lem.errorcnt > 
c2a0: 30 29 20 7c 7c 20 28 6c 65 6d 2e 6e 63 6f 6e 66  0) || (lem.nconf
c2b0: 6c 69 63 74 20 3e 20 30 29 29 20 3f 20 31 20 3a  lict > 0)) ? 1 :
c2c0: 20 30 3b 0a 20 20 65 78 69 74 28 65 78 69 74 63   0;.  exit(exitc
c2d0: 6f 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ode);.  return (
c2e0: 65 78 69 74 63 6f 64 65 29 3b 0a 7d 0a 2f 2a 2a  exitcode);.}./**
c2f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c300: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
c310: 20 22 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a   "msort.c" *****
c320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
c340: 2a 20 41 20 67 65 6e 65 72 69 63 20 6d 65 72 67  * A generic merg
c350: 65 2d 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a  e-sort program..
c360: 2a 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20  **.** USAGE:.** 
c370: 4c 65 74 20 22 70 74 72 22 20 62 65 20 61 20 70  Let "ptr" be a p
c380: 6f 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 73  ointer to some s
c390: 74 72 75 63 74 75 72 65 20 77 68 69 63 68 20 69  tructure which i
c3a0: 73 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66  s at the head of
c3b0: 0a 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69  .** a null-termi
c3c0: 6e 61 74 65 64 20 6c 69 73 74 2e 20 20 54 68 65  nated list.  The
c3d0: 6e 20 74 6f 20 73 6f 72 74 20 74 68 65 20 6c 69  n to sort the li
c3e0: 73 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  st call:.**.**  
c3f0: 20 20 20 70 74 72 20 3d 20 6d 73 6f 72 74 28 70     ptr = msort(p
c400: 74 72 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c  tr,&(ptr->next),
c410: 63 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49  cmpfnc);.**.** I
c420: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 22 63 6d  n the above, "cm
c430: 70 66 6e 63 22 20 69 73 20 61 20 70 6f 69 6e 74  pfnc" is a point
c440: 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
c450: 20 77 68 69 63 68 20 63 6f 6d 70 61 72 65 73 0a   which compares.
c460: 2a 2a 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73  ** two instances
c470: 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72   of the structur
c480: 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e  e and returns an
c490: 20 69 6e 74 65 67 65 72 2c 20 61 73 20 69 6e 0a   integer, as in.
c4a0: 2a 2a 20 73 74 72 63 6d 70 2e 20 20 54 68 65 20  ** strcmp.  The 
c4b0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
c4c0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c4d0: 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  the pointer to t
c4e0: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65  he.** second ele
c4f0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b  ment of the link
c500: 65 64 20 6c 69 73 74 2e 20 20 54 68 69 73 20 61  ed list.  This a
c510: 64 64 72 65 73 73 20 69 73 20 75 73 65 64 20 74  ddress is used t
c520: 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65  o compute.** the
c530: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 22   offset to the "
c540: 6e 65 78 74 22 20 66 69 65 6c 64 20 77 69 74 68  next" field with
c550: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
c560: 2e 20 20 54 68 65 20 6f 66 66 73 65 74 20 74 6f  .  The offset to
c570: 0a 2a 2a 20 74 68 65 20 22 6e 65 78 74 22 20 66  .** the "next" f
c580: 69 65 6c 64 20 6d 75 73 74 20 62 65 20 63 6f 6e  ield must be con
c590: 73 74 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74  stant for all st
c5a0: 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
c5b0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
c5c0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
c5d0: 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 77   a new pointer w
c5e0: 68 69 63 68 20 69 73 20 74 68 65 20 68 65 61 64  hich is the head
c5f0: 20 6f 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20   of the list.** 
c600: 61 66 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a  after sorting..*
c610: 2a 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a  *.** ALGORITHM:.
c620: 2a 2a 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a  ** Merge-sort..*
c630: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
c640: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
c650: 20 6e 65 78 74 20 73 74 72 75 63 74 75 72 65 20   next structure 
c660: 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
c670: 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  st..*/.#define N
c680: 45 58 54 28 41 29 20 28 2a 28 63 68 61 72 2a 2a  EXT(A) (*(char**
c690: 29 28 28 28 63 68 61 72 2a 29 41 29 2b 6f 66 66  )(((char*)A)+off
c6a0: 73 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70  set))../*.** Inp
c6b0: 75 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20  uts:.**   a:    
c6c0: 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c     A sorted, nul
c6d0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e  l-terminated lin
c6e0: 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20  ked list.  (May 
c6f0: 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62  be null)..**   b
c700: 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64  :       A sorted
c710: 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65  , null-terminate
c720: 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20  d linked list.  
c730: 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a  (May be null)..*
c740: 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70  *   cmp:     A p
c750: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f  ointer to the co
c760: 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
c770: 6e 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20  n..**   offset: 
c780: 20 4f 66 66 73 65 74 20 69 6e 20 74 68 65 20 73   Offset in the s
c790: 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20  tructure to the 
c7a0: 22 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a  "next" field..**
c7b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65  .** Return Value
c7c0: 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72  :.**   A pointer
c7d0: 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
c7e0: 61 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f  a sorted list co
c7f0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65  ntaining the ele
c800: 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f  ments.**   of bo
c810: 74 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a  th a and b..**.*
c820: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
c830: 2a 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20  **   The "next" 
c840: 70 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65  pointers for ele
c850: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73  ments in the lis
c860: 74 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a  ts a and b are.*
c870: 2a 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  *   changed..*/.
c880: 73 74 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72  static char *mer
c890: 67 65 28 0a 20 20 63 68 61 72 20 2a 61 2c 0a 20  ge(.  char *a,. 
c8a0: 20 63 68 61 72 20 2a 62 2c 0a 20 20 69 6e 74 20   char *b,.  int 
c8b0: 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61  (*cmp)(const cha
c8c0: 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c  r*,const char*),
c8d0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 0a 29 7b  .  int offset.){
c8e0: 0a 20 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68  .  char *ptr, *h
c8f0: 65 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30  ead;..  if( a==0
c900: 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62   ){.    head = b
c910: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d  ;.  }else if( b=
c920: 3d 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d  =0 ){.    head =
c930: 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
c940: 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29   if( (*cmp)(a,b)
c950: 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72  <=0 ){.      ptr
c960: 20 3d 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20   = a;.      a = 
c970: 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c  NEXT(a);.    }el
c980: 73 65 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20  se{.      ptr = 
c990: 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58  b;.      b = NEX
c9a0: 54 28 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  T(b);.    }.    
c9b0: 68 65 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20  head = ptr;.    
c9c0: 77 68 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b  while( a && b ){
c9d0: 0a 20 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70  .      if( (*cmp
c9e0: 29 28 61 2c 62 29 3c 3d 30 20 29 7b 0a 20 20 20  )(a,b)<=0 ){.   
c9f0: 20 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d       NEXT(ptr) =
ca00: 20 61 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20   a;.        ptr 
ca10: 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d  = a;.        a =
ca20: 20 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20   NEXT(a);.      
ca30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e  }else{.        N
ca40: 45 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20  EXT(ptr) = b;.  
ca50: 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20        ptr = b;. 
ca60: 20 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28         b = NEXT(
ca70: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
ca80: 7d 0a 20 20 20 20 69 66 28 20 61 20 29 20 4e 45  }.    if( a ) NE
ca90: 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20  XT(ptr) = a;.   
caa0: 20 65 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74   else    NEXT(pt
cab0: 72 29 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65  r) = b;.  }.  re
cac0: 74 75 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a  turn head;.}../*
cad0: 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20  .** Inputs:.**  
cae0: 20 6c 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e   list:      Poin
caf0: 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d  ter to a singly-
cb00: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73  linked list of s
cb10: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20  tructures..**   
cb20: 6e 65 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74  next:      Point
cb30: 65 72 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f  er to pointer to
cb40: 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d   the second elem
cb50: 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e  ent of the list.
cb60: 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20  .**   cmp:      
cb70: 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75   A comparison fu
cb80: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65  nction..**.** Re
cb90: 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20  turn Value:.**  
cba0: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
cbb0: 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74  e head of a sort
cbc0: 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  ed list containi
cbd0: 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a  ng the elements.
cbe0: 2a 2a 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69  **   orginally i
cbf0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69  n list..**.** Si
cc00: 64 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20  de effects:.**  
cc10: 20 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e   The "next" poin
cc20: 74 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74  ters for element
cc30: 73 20 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68  s in list are ch
cc40: 61 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e  anged..*/.#defin
cc50: 65 20 4c 49 53 54 53 49 5a 45 20 33 30 0a 73 74  e LISTSIZE 30.st
cc60: 61 74 69 63 20 63 68 61 72 20 2a 6d 73 6f 72 74  atic char *msort
cc70: 28 0a 20 20 63 68 61 72 20 2a 6c 69 73 74 2c 0a  (.  char *list,.
cc80: 20 20 63 68 61 72 20 2a 2a 6e 65 78 74 2c 0a 20    char **next,. 
cc90: 20 69 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73   int (*cmp)(cons
cca0: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
ccb0: 61 72 2a 29 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  ar*).){.  unsign
ccc0: 65 64 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a  ed long offset;.
ccd0: 20 20 63 68 61 72 20 2a 65 70 3b 0a 20 20 63 68    char *ep;.  ch
cce0: 61 72 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45  ar *set[LISTSIZE
ccf0: 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66  ];.  int i;.  of
cd00: 66 73 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  fset = (unsigned
cd10: 20 6c 6f 6e 67 29 6e 65 78 74 20 2d 20 28 75 6e   long)next - (un
cd20: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6c 69 73 74  signed long)list
cd30: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c  ;.  for(i=0; i<L
cd40: 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65  ISTSIZE; i++) se
cd50: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c  t[i] = 0;.  whil
cd60: 65 28 20 6c 69 73 74 20 29 7b 0a 20 20 20 20 65  e( list ){.    e
cd70: 70 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69  p = list;.    li
cd80: 73 74 20 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b  st = NEXT(list);
cd90: 0a 20 20 20 20 4e 45 58 54 28 65 70 29 20 3d 20  .    NEXT(ep) = 
cda0: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
cdb0: 69 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26 26 20  i<LISTSIZE-1 && 
cdc0: 73 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b  set[i]!=0; i++){
cdd0: 0a 20 20 20 20 20 20 65 70 20 3d 20 6d 65 72 67  .      ep = merg
cde0: 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c  e(ep,set[i],cmp,
cdf0: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  offset);.      s
ce00: 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  et[i] = 0;.    }
ce10: 0a 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 65 70  .    set[i] = ep
ce20: 3b 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a  ;.  }.  ep = 0;.
ce30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53    for(i=0; i<LIS
ce40: 54 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20  TSIZE; i++) if( 
ce50: 73 65 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65  set[i] ) ep = me
ce60: 72 67 65 28 73 65 74 5b 69 5d 2c 65 70 2c 63 6d  rge(set[i],ep,cm
ce70: 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74  p,offset);.  ret
ce80: 75 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn ep;.}./*****
ce90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cea0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
ceb0: 65 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a  e "option.c" ***
cec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ced0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20  *******/.static 
cee0: 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61  char **argv;.sta
cef0: 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74  tic struct s_opt
cf00: 69 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63  ions *op;.static
cf10: 20 46 49 4c 45 20 2a 65 72 72 73 74 72 65 61 6d   FILE *errstream
cf20: 3b 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f 50 54  ;..#define ISOPT
cf30: 28 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27  (X) ((X)[0]=='-'
cf40: 7c 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73  ||(X)[0]=='+'||s
cf50: 74 72 63 68 72 28 28 58 29 2c 27 3d 27 29 21 3d  trchr((X),'=')!=
cf60: 30 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  0)../*.** Print 
cf70: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
cf80: 20 77 69 74 68 20 61 20 63 61 72 72 6f 74 20 70   with a carrot p
cf90: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6b  ointing to the k
cfa0: 2d 74 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  -th character.**
cfb0: 20 6f 66 20 74 68 65 20 6e 2d 74 68 20 66 69 65   of the n-th fie
cfc0: 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ld..*/.static vo
cfd0: 69 64 20 65 72 72 6c 69 6e 65 28 69 6e 74 20 6e  id errline(int n
cfe0: 2c 20 69 6e 74 20 6b 2c 20 46 49 4c 45 20 2a 65  , int k, FILE *e
cff0: 72 72 29 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e  rr).{.  int spcn
d000: 74 2c 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76  t, i;.  if( argv
d010: 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72  [0] ) fprintf(er
d020: 72 2c 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b  r,"%s",argv[0]);
d030: 0a 20 20 73 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e  .  spcnt = lemon
d040: 53 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20  Strlen(argv[0]) 
d050: 2b 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  + 1;.  for(i=1; 
d060: 69 3c 6e 20 26 26 20 61 72 67 76 5b 69 5d 3b 20  i<n && argv[i]; 
d070: 69 2b 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  i++){.    fprint
d080: 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76  f(err," %s",argv
d090: 5b 69 5d 29 3b 0a 20 20 20 20 73 70 63 6e 74 20  [i]);.    spcnt 
d0a0: 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61  += lemonStrlen(a
d0b0: 72 67 76 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20  rgv[i])+1;.  }. 
d0c0: 20 73 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66   spcnt += k;.  f
d0d0: 6f 72 28 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b  or(; argv[i]; i+
d0e0: 2b 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22  +) fprintf(err,"
d0f0: 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20   %s",argv[i]);. 
d100: 20 69 66 28 20 73 70 63 6e 74 3c 32 30 20 29 7b   if( spcnt<20 ){
d110: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
d120: 2c 22 5c 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c  ,"\n%*s^-- here\
d130: 6e 22 2c 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20  n",spcnt,"");.  
d140: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
d150: 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72  tf(err,"\n%*sher
d160: 65 20 2d 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37  e --^\n",spcnt-7
d170: 2c 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ,"");.  }.}../*.
d180: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
d190: 64 65 78 20 6f 66 20 74 68 65 20 4e 2d 74 68 20  dex of the N-th 
d1a0: 6e 6f 6e 2d 73 77 69 74 63 68 20 61 72 67 75 6d  non-switch argum
d1b0: 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  ent.  Return -1.
d1c0: 2a 2a 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f  ** if N is out o
d1d0: 66 20 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74  f range..*/.stat
d1e0: 69 63 20 69 6e 74 20 61 72 67 69 6e 64 65 78 28  ic int argindex(
d1f0: 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69  int n).{.  int i
d200: 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68  ;.  int dashdash
d210: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76   = 0;.  if( argv
d220: 21 3d 30 20 26 26 20 2a 61 72 67 76 21 3d 30 20  !=0 && *argv!=0 
d230: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
d240: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
d250: 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73       if( dashdas
d260: 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76  h || !ISOPT(argv
d270: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
d280: 69 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72  if( n==0 ) retur
d290: 6e 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d  n i;.        n--
d2a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d2b0: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
d2c0: 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61  i],"--")==0 ) da
d2d0: 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20  shdash = 1;.    
d2e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  }.  }.  return -
d2f0: 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61  1;.}..static cha
d300: 72 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d  r emsg[] = "Comm
d310: 61 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20  and line syntax 
d320: 65 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a  error: ";../*.**
d330: 20 50 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20   Process a flag 
d340: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67  command line arg
d350: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
d360: 20 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73   int handleflags
d370: 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65 72  (int i, FILE *er
d380: 72 29 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20  r).{.  int v;.  
d390: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
d3a0: 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
d3b0: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
d3c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
d3d0: 74 72 6e 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b  trncmp(&argv[i][
d3e0: 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c  1],op[j].label,l
d3f0: 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d  emonStrlen(op[j]
d400: 2e 6c 61 62 65 6c 29 29 3d 3d 30 20 29 20 62 72  .label))==0 ) br
d410: 65 61 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61  eak;.  }.  v = a
d420: 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f  rgv[i][0]=='-' ?
d430: 20 31 20 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70   1 : 0;.  if( op
d440: 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a  [j].label==0 ){.
d450: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
d460: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
d470: 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70  ,"%sundefined op
d480: 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  tion.\n",emsg);.
d490: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
d4a0: 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  1,err);.    }.  
d4b0: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65    errcnt++;.  }e
d4c0: 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79  lse if( op[j].ty
d4d0: 70 65 3d 3d 4f 50 54 5f 46 4c 41 47 20 29 7b 0a  pe==OPT_FLAG ){.
d4e0: 20 20 20 20 2a 28 28 69 6e 74 2a 29 6f 70 5b 6a      *((int*)op[j
d4f0: 5d 2e 61 72 67 29 20 3d 20 76 3b 0a 20 20 7d 65  ].arg) = v;.  }e
d500: 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79  lse if( op[j].ty
d510: 70 65 3d 3d 4f 50 54 5f 46 46 4c 41 47 20 29 7b  pe==OPT_FFLAG ){
d520: 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28  .    (*(void(*)(
d530: 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  int))(op[j].arg)
d540: 29 28 76 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  )(v);.  }else if
d550: 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50  ( op[j].type==OP
d560: 54 5f 46 53 54 52 20 29 7b 0a 20 20 20 20 28 2a  T_FSTR ){.    (*
d570: 28 76 6f 69 64 28 2a 29 28 63 68 61 72 20 2a 29  (void(*)(char *)
d580: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 26 61  )(op[j].arg))(&a
d590: 72 67 76 5b 69 5d 5b 32 5d 29 3b 0a 20 20 7d 65  rgv[i][2]);.  }e
d5a0: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 65 72 72  lse{.    if( err
d5b0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
d5c0: 66 28 65 72 72 2c 22 25 73 6d 69 73 73 69 6e 67  f(err,"%smissing
d5d0: 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 73 77 69   argument on swi
d5e0: 74 63 68 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  tch.\n",emsg);. 
d5f0: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31       errline(i,1
d600: 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ,err);.    }.   
d610: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20   errcnt++;.  }. 
d620: 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a   return errcnt;.
d630: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
d640: 20 61 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20   a command line 
d650: 73 77 69 74 63 68 20 77 68 69 63 68 20 68 61 73  switch which has
d660: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f   an argument..*/
d670: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 6e 64  .static int hand
d680: 6c 65 73 77 69 74 63 68 28 69 6e 74 20 69 2c 20  leswitch(int i, 
d690: 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69  FILE *err).{.  i
d6a0: 6e 74 20 6c 76 20 3d 20 30 3b 0a 20 20 64 6f 75  nt lv = 0;.  dou
d6b0: 62 6c 65 20 64 76 20 3d 20 30 2e 30 3b 0a 20 20  ble dv = 0.0;.  
d6c0: 63 68 61 72 20 2a 73 76 20 3d 20 30 2c 20 2a 65  char *sv = 0, *e
d6d0: 6e 64 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a  nd;.  char *cp;.
d6e0: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 65    int j;.  int e
d6f0: 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 63 70 20  rrcnt = 0;.  cp 
d700: 3d 20 73 74 72 63 68 72 28 61 72 67 76 5b 69 5d  = strchr(argv[i]
d710: 2c 27 3d 27 29 3b 0a 20 20 61 73 73 65 72 74 28  ,'=');.  assert(
d720: 20 63 70 21 3d 30 20 29 3b 0a 20 20 2a 63 70 20   cp!=0 );.  *cp 
d730: 3d 20 30 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  = 0;.  for(j=0; 
d740: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b  op[j].label; j++
d750: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
d760: 70 28 61 72 67 76 5b 69 5d 2c 6f 70 5b 6a 5d 2e  p(argv[i],op[j].
d770: 6c 61 62 65 6c 29 3d 3d 30 20 29 20 62 72 65 61  label)==0 ) brea
d780: 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70 20 3d 20 27  k;.  }.  *cp = '
d790: 3d 27 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e  =';.  if( op[j].
d7a0: 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  label==0 ){.    
d7b0: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
d7c0: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
d7d0: 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e  undefined option
d7e0: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
d7f0: 20 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72    errline(i,0,er
d800: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72  r);.    }.    er
d810: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  rcnt++;.  }else{
d820: 0a 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 73  .    cp++;.    s
d830: 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70  witch( op[j].typ
d840: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
d850: 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
d860: 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
d870: 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20          if( err 
d880: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
d890: 69 6e 74 66 28 65 72 72 2c 22 25 73 6f 70 74 69  intf(err,"%sopti
d8a0: 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61  on requires an a
d8b0: 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67  rgument.\n",emsg
d8c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 72 72  );.          err
d8d0: 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20  line(i,0,err);. 
d8e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d8f0: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20   errcnt++;.     
d900: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d910: 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20  case OPT_DBL:.  
d920: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42      case OPT_FDB
d930: 4c 3a 0a 20 20 20 20 20 20 20 20 64 76 20 3d 20  L:.        dv = 
d940: 73 74 72 74 6f 64 28 63 70 2c 26 65 6e 64 29 3b  strtod(cp,&end);
d950: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e  .        if( *en
d960: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  d ){.          i
d970: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
d980: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
d990: 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61  r,"%sillegal cha
d9a0: 72 61 63 74 65 72 20 69 6e 20 66 6c 6f 61 74 69  racter in floati
d9b0: 6e 67 2d 70 6f 69 6e 74 20 61 72 67 75 6d 65 6e  ng-point argumen
d9c0: 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20  t.\n",emsg);.   
d9d0: 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65           errline
d9e0: 28 69 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  (i,((unsigned lo
d9f0: 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65  ng)end)-(unsigne
da00: 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65  d long)argv[i],e
da10: 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rr);.          }
da20: 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 63 6e  .          errcn
da30: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
da40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
da50: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54      case OPT_INT
da60: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
da70: 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c  _FINT:.        l
da80: 76 20 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26 65  v = strtol(cp,&e
da90: 6e 64 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  nd,0);.        i
daa0: 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20  f( *end ){.     
dab0: 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a       if( err ){.
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
dad0: 6e 74 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67  ntf(err,"%silleg
dae0: 61 6c 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  al character in 
daf0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
db00: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
db10: 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28          errline(
db20: 69 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  i,((unsigned lon
db30: 67 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64  g)end)-(unsigned
db40: 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72   long)argv[i],er
db50: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
db60: 20 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74            errcnt
db70: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
db80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
db90: 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a     case OPT_STR:
dba0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
dbb0: 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 73 76  FSTR:.        sv
dbc0: 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 20 20 62   = cp;.        b
dbd0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
dbe0: 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79  switch( op[j].ty
dbf0: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
dc00: 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20   OPT_FLAG:.     
dc10: 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a   case OPT_FFLAG:
dc20: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
dc30: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44        case OPT_D
dc40: 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28 64 6f  BL:.        *(do
dc50: 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67  uble*)(op[j].arg
dc60: 29 20 3d 20 64 76 3b 0a 20 20 20 20 20 20 20 20  ) = dv;.        
dc70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
dc80: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
dc90: 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 64      (*(void(*)(d
dca0: 6f 75 62 6c 65 29 29 28 6f 70 5b 6a 5d 2e 61 72  ouble))(op[j].ar
dcb0: 67 29 29 28 64 76 29 3b 0a 20 20 20 20 20 20 20  g))(dv);.       
dcc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
dcd0: 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20  se OPT_INT:.    
dce0: 20 20 20 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a      *(int*)(op[j
dcf0: 5d 2e 61 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20  ].arg) = lv;.   
dd00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dd10: 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a    case OPT_FINT:
dd20: 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64  .        (*(void
dd30: 28 2a 29 28 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e  (*)(int))(op[j].
dd40: 61 72 67 29 29 28 28 69 6e 74 29 6c 76 29 3b 0a  arg))((int)lv);.
dd50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
dd60: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54       case OPT_ST
dd70: 52 3a 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61  R:.        *(cha
dd80: 72 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20  r**)(op[j].arg) 
dd90: 3d 20 73 76 3b 0a 20 20 20 20 20 20 20 20 62 72  = sv;.        br
dda0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ddb0: 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20  OPT_FSTR:.      
ddc0: 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 63 68 61    (*(void(*)(cha
ddd0: 72 20 2a 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  r *))(op[j].arg)
dde0: 29 28 73 76 29 3b 0a 20 20 20 20 20 20 20 20 62  )(sv);.        b
ddf0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
de00: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b    return errcnt;
de10: 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69 74 28  .}..int OptInit(
de20: 63 68 61 72 20 2a 2a 61 2c 20 73 74 72 75 63 74  char **a, struct
de30: 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 2c 20 46   s_options *o, F
de40: 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e  ILE *err).{.  in
de50: 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20  t errcnt = 0;.  
de60: 61 72 67 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d  argv = a;.  op =
de70: 20 6f 3b 0a 20 20 65 72 72 73 74 72 65 61 6d 20   o;.  errstream 
de80: 3d 20 65 72 72 3b 0a 20 20 69 66 28 20 61 72 67  = err;.  if( arg
de90: 76 20 26 26 20 2a 61 72 67 76 20 26 26 20 6f 70  v && *argv && op
dea0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
deb0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76     for(i=1; argv
dec0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
ded0: 20 69 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d   if( argv[i][0]=
dee0: 3d 27 2b 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b  ='+' || argv[i][
def0: 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
df00: 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e     errcnt += han
df10: 64 6c 65 66 6c 61 67 73 28 69 2c 65 72 72 29 3b  dleflags(i,err);
df20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
df30: 20 73 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c   strchr(argv[i],
df40: 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '=') ){.        
df50: 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65  errcnt += handle
df60: 73 77 69 74 63 68 28 69 2c 65 72 72 29 3b 0a 20  switch(i,err);. 
df70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
df80: 0a 20 20 69 66 28 20 65 72 72 63 6e 74 3e 30 20  .  if( errcnt>0 
df90: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65  ){.    fprintf(e
dfa0: 72 72 2c 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e  rr,"Valid comman
dfb0: 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66  d line options f
dfc0: 6f 72 20 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e  or \"%s\" are:\n
dfd0: 22 2c 2a 61 29 3b 0a 20 20 20 20 4f 70 74 50 72  ",*a);.    OptPr
dfe0: 69 6e 74 28 29 3b 0a 20 20 20 20 65 78 69 74 28  int();.    exit(
dff0: 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
e000: 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41   0;.}..int OptNA
e010: 72 67 73 28 29 7b 0a 20 20 69 6e 74 20 63 6e 74  rgs(){.  int cnt
e020: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 64 61 73 68   = 0;.  int dash
e030: 64 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  dash = 0;.  int 
e040: 69 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30  i;.  if( argv!=0
e050: 20 26 26 20 61 72 67 76 5b 30 5d 21 3d 30 20 29   && argv[0]!=0 )
e060: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  {.    for(i=1; a
e070: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
e080: 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73 68      if( dashdash
e090: 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b   || !ISOPT(argv[
e0a0: 69 5d 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20  i]) ) cnt++;.   
e0b0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72     if( strcmp(ar
e0c0: 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29  gv[i],"--")==0 )
e0d0: 20 64 61 73 68 64 61 73 68 20 3d 20 31 3b 0a 20   dashdash = 1;. 
e0e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
e0f0: 6e 20 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a  n cnt;.}..char *
e100: 4f 70 74 41 72 67 28 69 6e 74 20 6e 29 0a 7b 0a  OptArg(int n).{.
e110: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61    int i;.  i = a
e120: 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72 65  rgindex(n);.  re
e130: 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67 76  turn i>=0 ? argv
e140: 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64  [i] : 0;.}..void
e150: 20 4f 70 74 45 72 72 28 69 6e 74 20 6e 29 0a 7b   OptErr(int n).{
e160: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
e170: 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 69  argindex(n);.  i
e180: 66 28 20 69 3e 3d 30 20 29 20 65 72 72 6c 69 6e  f( i>=0 ) errlin
e190: 65 28 69 2c 30 2c 65 72 72 73 74 72 65 61 6d 29  e(i,0,errstream)
e1a0: 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50 72 69  ;.}..void OptPri
e1b0: 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nt(){.  int i;. 
e1c0: 20 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b 0a 20   int max, len;. 
e1d0: 20 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28   max = 0;.  for(
e1e0: 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c  i=0; op[i].label
e1f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e 20  ; i++){.    len 
e200: 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70  = lemonStrlen(op
e210: 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b 20 31 3b 0a  [i].label) + 1;.
e220: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 69      switch( op[i
e230: 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ].type ){.      
e240: 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20  case OPT_FLAG:. 
e250: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46       case OPT_FF
e260: 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65  LAG:.        bre
e270: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
e280: 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61  PT_INT:.      ca
e290: 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20  se OPT_FINT:.   
e2a0: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 39 3b 20 20       len += 9;  
e2b0: 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
e2c0: 66 20 22 3c 69 6e 74 65 67 65 72 3e 22 20 2a 2f  f "<integer>" */
e2d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e2e0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44        case OPT_D
e2f0: 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  BL:.      case O
e300: 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20  PT_FDBL:.       
e310: 20 6c 65 6e 20 2b 3d 20 36 3b 20 20 20 20 20 20   len += 6;      
e320: 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c   /* length of "<
e330: 72 65 61 6c 3e 22 20 2a 2f 0a 20 20 20 20 20 20  real>" */.      
e340: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
e350: 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20  ase OPT_STR:.   
e360: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52     case OPT_FSTR
e370: 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d  :.        len +=
e380: 20 38 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e   8;       /* len
e390: 67 74 68 20 6f 66 20 22 3c 73 74 72 69 6e 67 3e  gth of "<string>
e3a0: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  " */.        bre
e3b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
e3c0: 28 20 6c 65 6e 3e 6d 61 78 20 29 20 6d 61 78 20  ( len>max ) max 
e3d0: 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72  = len;.  }.  for
e3e0: 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65  (i=0; op[i].labe
e3f0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69  l; i++){.    swi
e400: 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20  tch( op[i].type 
e410: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
e420: 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61  T_FLAG:.      ca
e430: 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20  se OPT_FFLAG:.  
e440: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
e450: 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 2d 2a 73  rstream,"  -%-*s
e460: 20 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69    %s\n",max,op[i
e470: 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65  ].label,op[i].me
e480: 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
e490: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
e4a0: 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20  e OPT_INT:.     
e4b0: 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a   case OPT_FINT:.
e4c0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
e4d0: 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d  errstream,"  %s=
e4e0: 3c 69 6e 74 65 67 65 72 3e 25 2a 73 20 20 25 73  <integer>%*s  %s
e4f0: 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c  \n",op[i].label,
e500: 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29  .          (int)
e510: 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e  (max-lemonStrlen
e520: 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 39 29  (op[i].label)-9)
e530: 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67  ,"",op[i].messag
e540: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
e550: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
e560: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73  T_DBL:.      cas
e570: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
e580: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73      fprintf(errs
e590: 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 72 65 61  tream,"  %s=<rea
e5a0: 6c 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b  l>%*s  %s\n",op[
e5b0: 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20  i].label,.      
e5c0: 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65      (int)(max-le
e5d0: 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e  monStrlen(op[i].
e5e0: 6c 61 62 65 6c 29 2d 36 29 2c 22 22 2c 6f 70 5b  label)-6),"",op[
e5f0: 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20  i].message);.   
e600: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e610: 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
e620: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
e630: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 66 70 72  STR:.        fpr
e640: 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22  intf(errstream,"
e650: 20 20 25 73 3d 3c 73 74 72 69 6e 67 3e 25 2a 73    %s=<string>%*s
e660: 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61    %s\n",op[i].la
e670: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  bel,.          (
e680: 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74  int)(max-lemonSt
e690: 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c  rlen(op[i].label
e6a0: 29 2d 38 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65  )-8),"",op[i].me
e6b0: 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
e6c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
e6d0: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
e6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
e6f0: 20 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65   the file "parse
e700: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
e710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e720: 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20 66 69  /./*.** Input fi
e730: 6c 65 20 70 61 72 73 65 72 20 66 6f 72 20 74 68  le parser for th
e740: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
e750: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
e760: 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   The state of th
e770: 65 20 70 61 72 73 65 72 20 2a 2f 0a 65 6e 75 6d  e parser */.enum
e780: 20 65 5f 73 74 61 74 65 20 7b 0a 20 20 49 4e 49   e_state {.  INI
e790: 54 49 41 4c 49 5a 45 2c 0a 20 20 57 41 49 54 49  TIALIZE,.  WAITI
e7a0: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
e7b0: 55 4c 45 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  ULE,.  WAITING_F
e7c0: 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 2c  OR_DECL_KEYWORD,
e7d0: 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44  .  WAITING_FOR_D
e7e0: 45 43 4c 5f 41 52 47 2c 0a 20 20 57 41 49 54 49  ECL_ARG,.  WAITI
e7f0: 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43  NG_FOR_PRECEDENC
e800: 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57 41 49 54  E_SYMBOL,.  WAIT
e810: 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 2c 0a 20  ING_FOR_ARROW,. 
e820: 20 49 4e 5f 52 48 53 2c 0a 20 20 4c 48 53 5f 41   IN_RHS,.  LHS_A
e830: 4c 49 41 53 5f 31 2c 0a 20 20 4c 48 53 5f 41 4c  LIAS_1,.  LHS_AL
e840: 49 41 53 5f 32 2c 0a 20 20 4c 48 53 5f 41 4c 49  IAS_2,.  LHS_ALI
e850: 41 53 5f 33 2c 0a 20 20 52 48 53 5f 41 4c 49 41  AS_3,.  RHS_ALIA
e860: 53 5f 31 2c 0a 20 20 52 48 53 5f 41 4c 49 41 53  S_1,.  RHS_ALIAS
e870: 5f 32 2c 0a 20 20 50 52 45 43 45 44 45 4e 43 45  _2,.  PRECEDENCE
e880: 5f 4d 41 52 4b 5f 31 2c 0a 20 20 50 52 45 43 45  _MARK_1,.  PRECE
e890: 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c 0a 20 20  DENCE_MARK_2,.  
e8a0: 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
e8b0: 45 5f 45 52 52 4f 52 2c 0a 20 20 52 45 53 59 4e  E_ERROR,.  RESYN
e8c0: 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
e8d0: 4f 52 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  OR,.  WAITING_FO
e8e0: 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d  R_DESTRUCTOR_SYM
e8f0: 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  BOL,.  WAITING_F
e900: 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42  OR_DATATYPE_SYMB
e910: 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  OL,.  WAITING_FO
e920: 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 2c 0a 20  R_FALLBACK_ID,. 
e930: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c   WAITING_FOR_WIL
e940: 44 43 41 52 44 5f 49 44 0a 7d 3b 0a 73 74 72 75  DCARD_ID.};.stru
e950: 63 74 20 70 73 74 61 74 65 20 7b 0a 20 20 63 68  ct pstate {.  ch
e960: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20  ar *filename;   
e970: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
e980: 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
e990: 0a 20 20 69 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65  .  int tokenline
e9a0: 6e 6f 3b 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65  no;      /* Line
e9b0: 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20  number at which 
e9c0: 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74  current token st
e9d0: 61 72 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72  arts */.  int er
e9e0: 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20  rorcnt;         
e9f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
ea00: 6f 72 73 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  ors so far */.  
ea10: 63 68 61 72 20 2a 74 6f 6b 65 6e 73 74 61 72 74  char *tokenstart
ea20: 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  ;     /* Text of
ea30: 20 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a   current token *
ea40: 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  /.  struct lemon
ea50: 20 2a 67 70 3b 20 20 20 20 20 2f 2a 20 47 6c 6f   *gp;     /* Glo
ea60: 62 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72  bal state vector
ea70: 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 73 74 61   */.  enum e_sta
ea80: 74 65 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  te state;       
ea90: 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66   /* The state of
eaa0: 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20   the parser */. 
eab0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
eac0: 66 61 6c 6c 62 61 63 6b 3b 20 20 20 2f 2a 20 54  fallback;   /* T
ead0: 68 65 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65  he fallback toke
eae0: 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  n */.  struct sy
eaf0: 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20  mbol *lhs;      
eb00: 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73    /* Left-hand s
eb10: 69 64 65 20 6f 66 20 63 75 72 72 65 6e 74 20 72  ide of current r
eb20: 75 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ule */.  const c
eb30: 68 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20  har *lhsalias;  
eb40: 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72      /* Alias for
eb50: 20 74 68 65 20 4c 48 53 20 2a 2f 0a 20 20 69 6e   the LHS */.  in
eb60: 74 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20  t nrhs;         
eb70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
eb80: 65 72 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  er of right-hand
eb90: 20 73 69 64 65 20 73 79 6d 62 6f 6c 73 20 73 65   side symbols se
eba0: 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  en */.  struct s
ebb0: 79 6d 62 6f 6c 20 2a 72 68 73 5b 4d 41 58 52 48  ymbol *rhs[MAXRH
ebc0: 53 5d 3b 20 20 2f 2a 20 52 48 53 20 73 79 6d 62  S];  /* RHS symb
ebd0: 6f 6c 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ols */.  const c
ebe0: 68 61 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48  har *alias[MAXRH
ebf0: 53 5d 3b 20 2f 2a 20 41 6c 69 61 73 65 73 20 66  S]; /* Aliases f
ec00: 6f 72 20 65 61 63 68 20 52 48 53 20 73 79 6d 62  or each RHS symb
ec10: 6f 6c 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ol (or NULL) */.
ec20: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70    struct rule *p
ec30: 72 65 76 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20  revrule;     /* 
ec40: 50 72 65 76 69 6f 75 73 20 72 75 6c 65 20 70 61  Previous rule pa
ec50: 72 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rsed */.  const 
ec60: 63 68 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72  char *declkeywor
ec70: 64 3b 20 20 20 2f 2a 20 4b 65 79 77 6f 72 64 20  d;   /* Keyword 
ec80: 6f 66 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e  of a declaration
ec90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 64 65 63   */.  char **dec
eca0: 6c 61 72 67 73 6c 6f 74 3b 20 20 20 20 20 20 20  largslot;       
ecb0: 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20 64 65   /* Where the de
ecc0: 63 6c 61 72 61 74 69 6f 6e 20 61 72 67 75 6d 65  claration argume
ecd0: 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 70 75 74  nt should be put
ece0: 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 65 72 74   */.  int insert
ecf0: 4c 69 6e 65 4d 61 63 72 6f 3b 20 20 20 20 20 20  LineMacro;      
ed00: 20 2f 2a 20 41 64 64 20 23 6c 69 6e 65 20 62 65   /* Add #line be
ed10: 66 6f 72 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  fore declaration
ed20: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74   insert */.  int
ed30: 20 2a 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74   *decllinenoslot
ed40: 3b 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  ;       /* Where
ed50: 20 74 6f 20 77 72 69 74 65 20 64 65 63 6c 61 72   to write declar
ed60: 61 74 69 6f 6e 20 6c 69 6e 65 20 6e 75 6d 62 65  ation line numbe
ed70: 72 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73  r */.  enum e_as
ed80: 73 6f 63 20 64 65 63 6c 61 73 73 6f 63 3b 20 20  soc declassoc;  
ed90: 20 20 2f 2a 20 41 73 73 69 67 6e 20 74 68 69 73    /* Assign this
eda0: 20 61 73 73 6f 63 69 61 74 69 6f 6e 20 74 6f 20   association to 
edb0: 64 65 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a  decl arguments *
edc0: 2f 0a 20 20 69 6e 74 20 70 72 65 63 63 6f 75 6e  /.  int preccoun
edd0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ter;           /
ede0: 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20 70 72  * Assign this pr
edf0: 65 63 65 64 65 6e 63 65 20 74 6f 20 64 65 63 6c  ecedence to decl
ee00: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
ee10: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 66 69 72  struct rule *fir
ee20: 73 74 72 75 6c 65 3b 20 20 20 20 2f 2a 20 50 6f  strule;    /* Po
ee30: 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 72  inter to first r
ee40: 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  ule in the gramm
ee50: 61 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72  ar */.  struct r
ee60: 75 6c 65 20 2a 6c 61 73 74 72 75 6c 65 3b 20 20  ule *lastrule;  
ee70: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
ee80: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
ee90: 6c 79 20 70 61 72 73 65 64 20 72 75 6c 65 20 2a  ly parsed rule *
eea0: 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61  /.};../* Parse a
eeb0: 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f   single token */
eec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 72  .static void par
eed0: 73 65 6f 6e 65 74 6f 6b 65 6e 28 73 74 72 75 63  seonetoken(struc
eee0: 74 20 70 73 74 61 74 65 20 2a 70 73 70 29 0a 7b  t pstate *psp).{
eef0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 78  .  const char *x
ef00: 3b 0a 20 20 78 20 3d 20 53 74 72 73 61 66 65 28  ;.  x = Strsafe(
ef10: 70 73 70 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29  psp->tokenstart)
ef20: 3b 20 20 20 20 20 2f 2a 20 53 61 76 65 20 74 68  ;     /* Save th
ef30: 65 20 74 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e  e token permanen
ef40: 74 6c 79 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70  tly */.#if 0.  p
ef50: 72 69 6e 74 66 28 22 25 73 3a 25 64 3a 20 54 6f  rintf("%s:%d: To
ef60: 6b 65 6e 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25  ken=[%s] state=%
ef70: 64 5c 6e 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61  d\n",psp->filena
ef80: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
ef90: 65 6e 6f 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e  eno,.    x,psp->
efa0: 73 74 61 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20  state);.#endif. 
efb0: 20 73 77 69 74 63 68 28 20 70 73 70 2d 3e 73 74   switch( psp->st
efc0: 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
efd0: 49 4e 49 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20  INITIALIZE:.    
efe0: 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20    psp->prevrule 
eff0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e  = 0;.      psp->
f000: 70 72 65 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b  preccounter = 0;
f010: 0a 20 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73  .      psp->firs
f020: 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73  trule = psp->las
f030: 74 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  trule = 0;.     
f040: 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20   psp->gp->nrule 
f050: 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  = 0;.      /* Fa
f060: 6c 6c 20 74 68 72 75 20 74 6f 20 6e 65 78 74 20  ll thru to next 
f070: 63 61 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65  case */.    case
f080: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
f090: 4c 5f 4f 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20  L_OR_RULE:.     
f0a0: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29   if( x[0]=='%' )
f0b0: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
f0c0: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
f0d0: 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b  OR_DECL_KEYWORD;
f0e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f0f0: 20 69 73 6c 6f 77 65 72 28 78 5b 30 5d 29 20 29   islower(x[0]) )
f100: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c  {.        psp->l
f110: 68 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  hs = Symbol_new(
f120: 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
f130: 3e 6e 72 68 73 20 3d 20 30 3b 0a 20 20 20 20 20  >nrhs = 0;.     
f140: 20 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73     psp->lhsalias
f150: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
f160: 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
f170: 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20  NG_FOR_ARROW;.  
f180: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b      }else if( x[
f190: 30 5d 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20  0]=='{' ){.     
f1a0: 20 20 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76     if( psp->prev
f1b0: 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rule==0 ){.     
f1c0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
f1d0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f1e0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54  >tokenlineno,."T
f1f0: 68 65 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72  here is no prior
f200: 20 72 75 6c 65 20 75 70 6f 6e 20 77 68 69 63 68   rule upon which
f210: 20 74 6f 20 61 74 74 61 63 68 20 74 68 65 20 63   to attach the c
f220: 6f 64 65 20 5c 0a 66 72 61 67 6d 65 6e 74 20 77  ode \.fragment w
f230: 68 69 63 68 20 62 65 67 69 6e 73 20 6f 6e 20 74  hich begins on t
f240: 68 69 73 20 6c 69 6e 65 2e 22 29 3b 0a 20 20 20  his line.");.   
f250: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
f260: 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69  rcnt++;..}else i
f270: 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65  f( psp->prevrule
f280: 2d 3e 63 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20  ->code!=0 ){.   
f290: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f2a0: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f2b0: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f2c0: 22 43 6f 64 65 20 66 72 61 67 6d 65 6e 74 20 62  "Code fragment b
f2d0: 65 67 69 6e 6e 69 6e 67 20 6f 6e 20 74 68 69 73  eginning on this
f2e0: 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 65   line is not the
f2f0: 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c   first \.to foll
f300: 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ow the previous 
f310: 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  rule.");.       
f320: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
f330: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
f340: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  e{.          psp
f350: 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 6c 69 6e 65  ->prevrule->line
f360: 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e   = psp->tokenlin
f370: 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 70  eno;.          p
f380: 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f  sp->prevrule->co
f390: 64 65 20 3d 20 26 78 5b 31 5d 3b 0a 09 7d 0a 20  de = &x[1];..}. 
f3a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
f3b0: 5b 30 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  [0]=='[' ){.    
f3c0: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
f3d0: 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
f3e0: 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _1;.      }else{
f3f0: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
f400: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
f410: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
f420: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54 6f 6b  ,.          "Tok
f430: 65 6e 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64  en \"%s\" should
f440: 20 62 65 20 65 69 74 68 65 72 20 5c 22 25 25 5c   be either \"%%\
f450: 22 20 6f 72 20 61 20 6e 6f 6e 74 65 72 6d 69 6e  " or a nontermin
f460: 61 6c 20 6e 61 6d 65 2e 22 2c 0a 20 20 20 20 20  al name.",.     
f470: 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20       x);.       
f480: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f490: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f4a0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
f4b0: 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
f4c0: 31 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  1:.      if( !is
f4d0: 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20  upper(x[0]) ){. 
f4e0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f4f0: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f500: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f510: 20 20 20 20 20 20 20 20 20 20 22 54 68 65 20 70            "The p
f520: 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c  recedence symbol
f530: 20 6d 75 73 74 20 62 65 20 61 20 74 65 72 6d 69   must be a termi
f540: 6e 61 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  nal.");.        
f550: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
f560: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f570: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d   psp->prevrule==
f580: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  0 ){.        Err
f590: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
f5a0: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
f5b0: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
f5c0: 22 54 68 65 72 65 20 69 73 20 6e 6f 20 70 72 69  "There is no pri
f5d0: 6f 72 20 72 75 6c 65 20 74 6f 20 61 73 73 69 67  or rule to assig
f5e0: 6e 20 70 72 65 63 65 64 65 6e 63 65 20 5c 22 5b  n precedence \"[
f5f0: 25 73 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20  %s]\".",x);.    
f600: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
f610: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  t++;.      }else
f620: 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75   if( psp->prevru
f630: 6c 65 2d 3e 70 72 65 63 73 79 6d 21 3d 30 20 29  le->precsym!=0 )
f640: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
f650: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
f660: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f670: 6f 2c 0a 22 50 72 65 63 65 64 65 6e 63 65 20 6d  o,."Precedence m
f680: 61 72 6b 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65  ark on this line
f690: 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73   is not the firs
f6a0: 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68  t \.to follow th
f6b0: 65 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e  e previous rule.
f6c0: 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ");.        psp-
f6d0: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
f6e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f6f0: 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d    psp->prevrule-
f700: 3e 70 72 65 63 73 79 6d 20 3d 20 53 79 6d 62 6f  >precsym = Symbo
f710: 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
f720: 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61  }.      psp->sta
f730: 74 65 20 3d 20 50 52 45 43 45 44 45 4e 43 45 5f  te = PRECEDENCE_
f740: 4d 41 52 4b 5f 32 3b 0a 20 20 20 20 20 20 62 72  MARK_2;.      br
f750: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52  eak;.    case PR
f760: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3a  ECEDENCE_MARK_2:
f770: 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 21  .      if( x[0]!
f780: 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =']' ){.        
f790: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
f7a0: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
f7b0: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
f7c0: 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 5d 5c     "Missing \"]\
f7d0: 22 20 6f 6e 20 70 72 65 63 65 64 65 6e 63 65 20  " on precedence 
f7e0: 6d 61 72 6b 2e 22 29 3b 0a 20 20 20 20 20 20 20  mark.");.       
f7f0: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f800: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f810: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
f820: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
f830: 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 62 72 65  _RULE;.      bre
f840: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
f850: 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3a 0a  TING_FOR_ARROW:.
f860: 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
f870: 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27  ':' && x[1]==':'
f880: 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b   && x[2]=='=' ){
f890: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
f8a0: 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20  ate = IN_RHS;.  
f8b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b      }else if( x[
f8c0: 30 5d 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20  0]=='(' ){.     
f8d0: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f8e0: 4c 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20  LHS_ALIAS_1;.   
f8f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f900: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
f910: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
f920: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
f930: 20 20 20 20 20 22 45 78 70 65 63 74 65 64 20 74       "Expected t
f940: 6f 20 73 65 65 20 61 20 5c 22 3a 5c 22 20 66 6f  o see a \":\" fo
f950: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4c 48 53 20  llowing the LHS 
f960: 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e 22 2c  symbol \"%s\".",
f970: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
f980: 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  lhs->name);.    
f990: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
f9a0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
f9b0: 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
f9c0: 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
f9d0: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
f9e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
f9f0: 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20   LHS_ALIAS_1:.  
fa00: 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28      if( isalpha(
fa10: 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
fa20: 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d   psp->lhsalias =
fa30: 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   x;.        psp-
fa40: 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49  >state = LHS_ALI
fa50: 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  AS_2;.      }els
fa60: 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
fa70: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
fa80: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
fa90: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c  no,.          "\
faa0: 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76  "%s\" is not a v
fab0: 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74  alid alias for t
fac0: 68 65 20 4c 48 53 20 5c 22 25 73 5c 22 5c 6e 22  he LHS \"%s\"\n"
fad0: 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70 73  ,.          x,ps
fae0: 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  p->lhs->name);. 
faf0: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
fb00: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
fb10: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
fb20: 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
fb30: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
fb40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
fb50: 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3a  ase LHS_ALIAS_2:
fb60: 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
fb70: 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =')' ){.        
fb80: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53  psp->state = LHS
fb90: 5f 41 4c 49 41 53 5f 33 3b 0a 20 20 20 20 20 20  _ALIAS_3;.      
fba0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
fbb0: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
fbc0: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
fbd0: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
fbe0: 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22    "Missing \")\"
fbf0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61   following LHS a
fc00: 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22  lias name \"%s\"
fc10: 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73  .",psp->lhsalias
fc20: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
fc30: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
fc40: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
fc50: 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
fc60: 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  LE_ERROR;.      
fc70: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
fc80: 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41     case LHS_ALIA
fc90: 53 5f 33 3a 0a 20 20 20 20 20 20 69 66 28 20 78  S_3:.      if( x
fca0: 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d  [0]==':' && x[1]
fcb0: 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27  ==':' && x[2]=='
fcc0: 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  =' ){.        ps
fcd0: 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48  p->state = IN_RH
fce0: 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  S;.      }else{.
fcf0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
fd00: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
fd10: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
fd20: 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73  .          "Miss
fd30: 69 6e 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c 6f  ing \"->\" follo
fd40: 77 69 6e 67 3a 20 5c 22 25 73 28 25 73 29 5c 22  wing: \"%s(%s)\"
fd50: 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  .",.           p
fd60: 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70 73  sp->lhs->name,ps
fd70: 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20  p->lhsalias);.  
fd80: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
fd90: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
fda0: 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
fdb0: 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
fdc0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
fdd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
fde0: 73 65 20 49 4e 5f 52 48 53 3a 0a 20 20 20 20 20  se IN_RHS:.     
fdf0: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
fe00: 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
fe10: 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 20 20 20   rule *rp;.     
fe20: 20 20 20 72 70 20 3d 20 28 73 74 72 75 63 74 20     rp = (struct 
fe30: 72 75 6c 65 20 2a 29 63 61 6c 6c 6f 63 28 20 73  rule *)calloc( s
fe40: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 72 75 6c  izeof(struct rul
fe50: 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20  e) + .          
fe60: 20 20 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74     sizeof(struct
fe70: 20 73 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e   symbol*)*psp->n
fe80: 72 68 73 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  rhs + sizeof(cha
fe90: 72 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 2c 20 31  r*)*psp->nrhs, 1
fea0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
feb0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p==0 ){.        
fec0: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
fed0: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
fee0: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
fef0: 20 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 6c         "Can't al
ff00: 6c 6f 63 61 74 65 20 65 6e 6f 75 67 68 20 6d 65  locate enough me
ff10: 6d 6f 72 79 20 66 6f 72 20 74 68 69 73 20 72 75  mory for this ru
ff20: 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  le.");.         
ff30: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
ff40: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
ff50: 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 09  >prevrule = 0;..
ff60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ff70: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
ff80: 20 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 20 3d    rp->ruleline =
ff90: 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
ffa0: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  o;.          rp-
ffb0: 3e 72 68 73 20 3d 20 28 73 74 72 75 63 74 20 73  >rhs = (struct s
ffc0: 79 6d 62 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b 0a  ymbol**)&rp[1];.
ffd0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
ffe0: 73 61 6c 69 61 73 20 3d 20 28 63 6f 6e 73 74 20  salias = (const 
fff0: 63 68 61 72 2a 2a 29 26 28 72 70 2d 3e 72 68 73  char**)&(rp->rhs
10000 5b 70 73 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20 20  [psp->nrhs]);.  
10010 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
10020 20 69 3c 70 73 70 2d 3e 6e 72 68 73 3b 20 69 2b   i<psp->nrhs; i+
10030 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
10040 72 70 2d 3e 72 68 73 5b 69 5d 20 3d 20 70 73 70  rp->rhs[i] = psp
10050 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
10060 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69        rp->rhsali
10070 61 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 61 6c 69  as[i] = psp->ali
10080 61 73 5b 69 5d 3b 0a 09 20 20 7d 0a 20 20 20 20  as[i];..  }.    
10090 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 20 3d 20        rp->lhs = 
100a0 70 73 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20  psp->lhs;.      
100b0 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73      rp->lhsalias
100c0 20 3d 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73   = psp->lhsalias
100d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
100e0 6e 72 68 73 20 3d 20 70 73 70 2d 3e 6e 72 68 73  nrhs = psp->nrhs
100f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
10100 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  code = 0;.      
10110 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20      rp->precsym 
10120 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
10130 70 2d 3e 69 6e 64 65 78 20 3d 20 70 73 70 2d 3e  p->index = psp->
10140 67 70 2d 3e 6e 72 75 6c 65 2b 2b 3b 0a 20 20 20  gp->nrule++;.   
10150 20 20 20 20 20 20 20 72 70 2d 3e 6e 65 78 74 6c         rp->nextl
10160 68 73 20 3d 20 72 70 2d 3e 6c 68 73 2d 3e 72 75  hs = rp->lhs->ru
10170 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  le;.          rp
10180 2d 3e 6c 68 73 2d 3e 72 75 6c 65 20 3d 20 72 70  ->lhs->rule = rp
10190 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
101a0 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  next = 0;.      
101b0 20 20 20 20 69 66 28 20 70 73 70 2d 3e 66 69 72      if( psp->fir
101c0 73 74 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  strule==0 ){.   
101d0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 69           psp->fi
101e0 72 73 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c  rstrule = psp->l
101f0 61 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 09 20  astrule = rp;.. 
10200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10210 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c      psp->lastrul
10220 65 2d 3e 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20  e->next = rp;.  
10230 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c            psp->l
10240 61 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 09 20  astrule = rp;.. 
10250 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 73 70   }.          psp
10260 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 72 70 3b  ->prevrule = rp;
10270 0a 09 7d 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ..}.        psp-
10280 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
10290 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
102a0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
102b0 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  f( isalpha(x[0])
102c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
102d0 70 73 70 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52 48  psp->nrhs>=MAXRH
102e0 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  S ){.          E
102f0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
10300 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
10310 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
10320 20 20 20 20 22 54 6f 6f 20 6d 61 6e 79 20 73 79      "Too many sy
10330 6d 62 6f 6c 73 20 6f 6e 20 52 48 53 20 6f 66 20  mbols on RHS of 
10340 72 75 6c 65 20 62 65 67 69 6e 6e 69 6e 67 20 61  rule beginning a
10350 74 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20  t \"%s\".",.    
10360 20 20 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20          x);.    
10370 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
10380 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
10390 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
103a0 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
103b0 45 52 52 4f 52 3b 0a 09 7d 65 6c 73 65 7b 0a 20  ERROR;..}else{. 
103c0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68           psp->rh
103d0 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 53  s[psp->nrhs] = S
103e0 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
103f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c 69          psp->ali
10400 61 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20  as[psp->nrhs] = 
10410 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  0;.          psp
10420 2d 3e 6e 72 68 73 2b 2b 3b 0a 09 7d 0a 20 20 20  ->nrhs++;..}.   
10430 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 78 5b     }else if( (x[
10440 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78 5b 30 5d 3d  0]=='|' || x[0]=
10450 3d 27 2f 27 29 20 26 26 20 70 73 70 2d 3e 6e 72  ='/') && psp->nr
10460 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  hs>0 ){.        
10470 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6d  struct symbol *m
10480 73 70 20 3d 20 70 73 70 2d 3e 72 68 73 5b 70 73  sp = psp->rhs[ps
10490 70 2d 3e 6e 72 68 73 2d 31 5d 3b 0a 20 20 20 20  p->nrhs-1];.    
104a0 20 20 20 20 69 66 28 20 6d 73 70 2d 3e 74 79 70      if( msp->typ
104b0 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e!=MULTITERMINAL
104c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
104d0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6f 72 69  ruct symbol *ori
104e0 67 73 70 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20  gsp = msp;.     
104f0 20 20 20 20 20 6d 73 70 20 3d 20 28 73 74 72 75       msp = (stru
10500 63 74 20 73 79 6d 62 6f 6c 20 2a 29 20 63 61 6c  ct symbol *) cal
10510 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28 2a 6d 73  loc(1,sizeof(*ms
10520 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  p));.          m
10530 65 6d 73 65 74 28 6d 73 70 2c 20 30 2c 20 73 69  emset(msp, 0, si
10540 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20 20 20  zeof(*msp));.   
10550 20 20 20 20 20 20 20 6d 73 70 2d 3e 74 79 70 65         msp->type
10560 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c   = MULTITERMINAL
10570 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d  ;.          msp-
10580 3e 6e 73 75 62 73 79 6d 20 3d 20 31 3b 0a 20 20  >nsubsym = 1;.  
10590 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62          msp->sub
105a0 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20 73 79  sym = (struct sy
105b0 6d 62 6f 6c 20 2a 2a 29 20 63 61 6c 6c 6f 63 28  mbol **) calloc(
105c0 31 2c 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  1,sizeof(struct 
105d0 73 79 6d 62 6f 6c 2a 29 29 3b 0a 20 20 20 20 20  symbol*));.     
105e0 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d       msp->subsym
105f0 5b 30 5d 20 3d 20 6f 72 69 67 73 70 3b 0a 20 20  [0] = origsp;.  
10600 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 61 6d          msp->nam
10610 65 20 3d 20 6f 72 69 67 73 70 2d 3e 6e 61 6d 65  e = origsp->name
10620 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10630 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  >rhs[psp->nrhs-1
10640 5d 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20  ] = msp;.       
10650 20 7d 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e   }.        msp->
10660 6e 73 75 62 73 79 6d 2b 2b 3b 0a 20 20 20 20 20  nsubsym++;.     
10670 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d     msp->subsym =
10680 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20   (struct symbol 
10690 2a 2a 29 20 72 65 61 6c 6c 6f 63 28 6d 73 70 2d  **) realloc(msp-
106a0 3e 73 75 62 73 79 6d 2c 0a 20 20 20 20 20 20 20  >subsym,.       
106b0 20 20 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74     sizeof(struct
106c0 20 73 79 6d 62 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e   symbol*)*msp->n
106d0 73 75 62 73 79 6d 29 3b 0a 20 20 20 20 20 20 20  subsym);.       
106e0 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 6d 73 70   msp->subsym[msp
106f0 2d 3e 6e 73 75 62 73 79 6d 2d 31 5d 20 3d 20 53  ->nsubsym-1] = S
10700 79 6d 62 6f 6c 5f 6e 65 77 28 26 78 5b 31 5d 29  ymbol_new(&x[1])
10710 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
10720 6c 6f 77 65 72 28 78 5b 31 5d 29 20 7c 7c 20 69  lower(x[1]) || i
10730 73 6c 6f 77 65 72 28 6d 73 70 2d 3e 73 75 62 73  slower(msp->subs
10740 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 20  ym[0]->name[0]) 
10750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
10760 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
10770 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
10780 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
10790 20 20 22 43 61 6e 6e 6f 74 20 66 6f 72 6d 20 61    "Cannot form a
107a0 20 63 6f 6d 70 6f 75 6e 64 20 63 6f 6e 74 61 69   compound contai
107b0 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 65 72 6d 69  ning a non-termi
107c0 6e 61 6c 22 29 3b 0a 20 20 20 20 20 20 20 20 20  nal");.         
107d0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
107e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
107f0 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
10800 3d 3d 27 28 27 20 26 26 20 70 73 70 2d 3e 6e 72  =='(' && psp->nr
10810 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  hs>0 ){.        
10820 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53  psp->state = RHS
10830 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20 20  _ALIAS_1;.      
10840 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
10850 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
10860 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
10870 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
10880 20 20 22 49 6c 6c 65 67 61 6c 20 63 68 61 72 61    "Illegal chara
10890 63 74 65 72 20 6f 6e 20 52 48 53 20 6f 66 20 72  cter on RHS of r
108a0 75 6c 65 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29  ule: \"%s\".",x)
108b0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
108c0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
108d0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
108e0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
108f0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
10900 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10910 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49 41 53    case RHS_ALIAS
10920 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73  _1:.      if( is
10930 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
10940 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c 69 61         psp->alia
10950 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d  s[psp->nrhs-1] =
10960 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   x;.        psp-
10970 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49  >state = RHS_ALI
10980 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  AS_2;.      }els
10990 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
109a0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
109b0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
109c0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c  no,.          "\
109d0 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76  "%s\" is not a v
109e0 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74  alid alias for t
109f0 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 20 5c 22  he RHS symbol \"
10a00 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s\"\n",.       
10a10 20 20 20 78 2c 70 73 70 2d 3e 72 68 73 5b 70 73     x,psp->rhs[ps
10a20 70 2d 3e 6e 72 68 73 2d 31 5d 2d 3e 6e 61 6d 65  p->nrhs-1]->name
10a30 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
10a40 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
10a50 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
10a60 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
10a70 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  LE_ERROR;.      
10a80 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
10a90 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49 41     case RHS_ALIA
10aa0 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78  S_2:.      if( x
10ab0 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20  [0]==')' ){.    
10ac0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
10ad0 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d   IN_RHS;.      }
10ae0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
10af0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
10b00 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
10b10 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
10b20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20   "Missing \")\" 
10b30 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c  following LHS al
10b40 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e  ias name \"%s\".
10b50 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29  ",psp->lhsalias)
10b60 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
10b70 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
10b80 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
10b90 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
10ba0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
10bb0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10bc0 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
10bd0 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3a  OR_DECL_KEYWORD:
10be0 0a 20 20 20 20 20 20 69 66 28 20 69 73 61 6c 70  .      if( isalp
10bf0 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ha(x[0]) ){.    
10c00 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6b 65 79      psp->declkey
10c10 77 6f 72 64 20 3d 20 78 3b 0a 20 20 20 20 20 20  word = x;.      
10c20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
10c30 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ot = 0;.        
10c40 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73  psp->decllinenos
10c50 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lot = 0;.       
10c60 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
10c70 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20  Macro = 1;.     
10c80 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
10c90 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
10ca0 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20 69 66  _ARG;.        if
10cb0 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 61 6d 65  ( strcmp(x,"name
10cc0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10cd0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10ce0 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
10cf0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
10d00 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e    psp->insertLin
10d10 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 09 7d 65 6c  eMacro = 0;..}el
10d20 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
10d30 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20 29 7b  "include")==0 ){
10d40 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10d50 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
10d60 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65  psp->gp->include
10d70 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  );..}else if( st
10d80 72 63 6d 70 28 78 2c 22 63 6f 64 65 22 29 3d 3d  rcmp(x,"code")==
10d90 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10da0 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
10db0 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 78 74  = &(psp->gp->ext
10dc0 72 61 63 6f 64 65 29 3b 0a 09 7d 65 6c 73 65 20  racode);..}else 
10dd0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f  if( strcmp(x,"to
10de0 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72 22 29  ken_destructor")
10df0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10e00 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10e10 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f  t = &psp->gp->to
10e20 6b 65 6e 64 65 73 74 3b 0a 09 7d 65 6c 73 65 20  kendest;..}else 
10e30 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65  if( strcmp(x,"de
10e40 66 61 75 6c 74 5f 64 65 73 74 72 75 63 74 6f 72  fault_destructor
10e50 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10e60 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10e70 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
10e80 76 61 72 64 65 73 74 3b 0a 09 7d 65 6c 73 65 20  vardest;..}else 
10e90 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f  if( strcmp(x,"to
10ea0 6b 65 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30 20  ken_prefix")==0 
10eb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10ec0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10ed0 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70  &psp->gp->tokenp
10ee0 72 65 66 69 78 3b 0a 20 20 20 20 20 20 20 20 20  refix;.         
10ef0 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
10f00 4d 61 63 72 6f 20 3d 20 30 3b 0a 09 7d 65 6c 73  Macro = 0;..}els
10f10 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10f20 73 79 6e 74 61 78 5f 65 72 72 6f 72 22 29 3d 3d  syntax_error")==
10f30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10f40 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
10f50 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 72 72  = &(psp->gp->err
10f60 6f 72 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  or);..}else if( 
10f70 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f  strcmp(x,"parse_
10f80 61 63 63 65 70 74 22 29 3d 3d 30 20 29 7b 0a 20  accept")==0 ){. 
10f90 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
10fa0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
10fb0 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74 29 3b 0a  p->gp->accept);.
10fc0 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
10fd0 70 28 78 2c 22 70 61 72 73 65 5f 66 61 69 6c 75  p(x,"parse_failu
10fe0 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  re")==0 ){.     
10ff0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
11000 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
11010 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 09 7d 65  p->failure);..}e
11020 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11030 2c 22 73 74 61 63 6b 5f 6f 76 65 72 66 6c 6f 77  ,"stack_overflow
11040 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
11050 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
11060 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
11070 3e 6f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  >overflow);.    
11080 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
11090 72 63 6d 70 28 78 2c 22 65 78 74 72 61 5f 61 72  rcmp(x,"extra_ar
110a0 67 75 6d 65 6e 74 22 29 3d 3d 30 20 29 7b 0a 20  gument")==0 ){. 
110b0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
110c0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
110d0 70 2d 3e 67 70 2d 3e 61 72 67 29 3b 0a 20 20 20  p->gp->arg);.   
110e0 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
110f0 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
11100 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11110 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b  f( strcmp(x,"tok
11120 65 6e 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a  en_type")==0 ){.
11130 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
11140 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
11150 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 74 79 70  sp->gp->tokentyp
11160 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  e);.          ps
11170 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
11180 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
11190 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
111a0 28 78 2c 22 64 65 66 61 75 6c 74 5f 74 79 70 65  (x,"default_type
111b0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
111c0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
111d0 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
111e0 3e 76 61 72 74 79 70 65 29 3b 0a 20 20 20 20 20  >vartype);.     
111f0 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74       psp->insert
11200 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20  LineMacro = 0;. 
11210 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
11220 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63 6b   strcmp(x,"stack
11230 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20  _size")==0 ){.  
11240 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
11250 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
11260 2d 3e 67 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29  ->gp->stacksize)
11270 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
11280 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
11290 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
112a0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
112b0 2c 22 73 74 61 72 74 5f 73 79 6d 62 6f 6c 22 29  ,"start_symbol")
112c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
112d0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
112e0 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73  t = &(psp->gp->s
112f0 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tart);.         
11300 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
11310 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Macro = 0;.     
11320 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
11330 63 6d 70 28 78 2c 22 6c 65 66 74 22 29 3d 3d 30  cmp(x,"left")==0
11340 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
11350 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b  p->preccounter++
11360 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
11370 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4c 45 46  >declassoc = LEF
11380 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  T;.          psp
11390 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
113a0 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
113b0 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20  _SYMBOL;.       
113c0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
113d0 70 28 78 2c 22 72 69 67 68 74 22 29 3d 3d 30 20  p(x,"right")==0 
113e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
113f0 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b  ->preccounter++;
11400 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11410 64 65 63 6c 61 73 73 6f 63 20 3d 20 52 49 47 48  declassoc = RIGH
11420 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  T;.          psp
11430 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
11440 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
11450 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20  _SYMBOL;.       
11460 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11470 70 28 78 2c 22 6e 6f 6e 61 73 73 6f 63 22 29 3d  p(x,"nonassoc")=
11480 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11490 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
114a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
114b0 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4e  p->declassoc = N
114c0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ONE;.          p
114d0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
114e0 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
114f0 43 45 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73  CE_SYMBOL;..}els
11500 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
11510 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20  destructor")==0 
11520 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
11530 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
11540 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52  G_FOR_DESTRUCTOR
11550 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20  _SYMBOL;..}else 
11560 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 79  if( strcmp(x,"ty
11570 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pe")==0 ){.     
11580 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11590 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41  = WAITING_FOR_DA
115a0 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3b 0a 20  TATYPE_SYMBOL;. 
115b0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
115c0 20 73 74 72 63 6d 70 28 78 2c 22 66 61 6c 6c 62   strcmp(x,"fallb
115d0 61 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ack")==0 ){.    
115e0 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62        psp->fallb
115f0 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ack = 0;.       
11600 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
11610 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c  WAITING_FOR_FALL
11620 42 41 43 4b 5f 49 44 3b 0a 20 20 20 20 20 20 20  BACK_ID;.       
11630 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11640 70 28 78 2c 22 77 69 6c 64 63 61 72 64 22 29 3d  p(x,"wildcard")=
11650 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11660 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
11670 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52  TING_FOR_WILDCAR
11680 44 5f 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65  D_ID;.        }e
11690 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 45  lse{.          E
116a0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
116b0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
116c0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
116d0 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 64 65 63      "Unknown dec
116e0 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64  laration keyword
116f0 3a 20 5c 22 25 25 25 73 5c 22 2e 22 2c 78 29 3b  : \"%%%s\".",x);
11700 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11710 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11720 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11730 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
11740 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20  DECL_ERROR;..}. 
11750 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11760 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
11770 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
11780 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
11790 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20         "Illegal 
117a0 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77  declaration keyw
117b0 6f 72 64 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29  ord: \"%s\".",x)
117c0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
117d0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
117e0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
117f0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
11800 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
11810 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11820 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
11830 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59  OR_DESTRUCTOR_SY
11840 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20  MBOL:.      if( 
11850 21 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29  !isalpha(x[0]) )
11860 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
11870 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11880 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11890 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 79  o,.          "Sy
118a0 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e  mbol name missin
118b0 67 20 61 66 74 65 72 20 25 25 64 65 73 74 72 75  g after %%destru
118c0 63 74 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a  ctor keyword");.
118d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
118e0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
118f0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
11900 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
11910 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c  ERROR;.      }el
11920 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  se{.        stru
11930 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
11940 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
11950 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
11960 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64  argslot = &sp->d
11970 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 20 20 20  estructor;.     
11980 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65     psp->declline
11990 6e 6f 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65  noslot = &sp->de
119a0 73 74 4c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  stLineno;.      
119b0 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e    psp->insertLin
119c0 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20 20  eMacro = 1;.    
119d0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
119e0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
119f0 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a 20  L_ARG;.      }. 
11a00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11a10 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
11a20 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c  _DATATYPE_SYMBOL
11a30 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 61  :.      if( !isa
11a40 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20  lpha(x[0]) ){.  
11a50 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11a60 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11a70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11a80 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c           "Symbol
11a90 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61 66   name missing af
11aa0 74 65 72 20 25 25 74 79 70 65 20 6b 65 79 77 6f  ter %%type keywo
11ab0 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  rd");.        ps
11ac0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
11ad0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11ae0 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
11af0 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
11b00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11b10 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
11b20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e  *sp = Symbol_fin
11b30 64 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  d(x);.        if
11b40 28 28 73 70 29 20 26 26 20 28 73 70 2d 3e 64 61  ((sp) && (sp->da
11b50 74 61 74 79 70 65 29 29 7b 0a 20 20 20 20 20 20  tatype)){.      
11b60 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
11b70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
11b80 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
11b90 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c           "Symbol
11ba0 20 25 25 74 79 70 65 20 5c 22 25 73 5c 22 20 61   %%type \"%s\" a
11bb0 6c 72 65 61 64 79 20 64 65 66 69 6e 65 64 22 2c  lready defined",
11bc0 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   x);.          p
11bd0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11be0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
11bf0 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
11c00 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a  TER_DECL_ERROR;.
11c10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
11c20 20 20 20 20 20 20 20 20 20 69 66 20 28 21 73 70           if (!sp
11c30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
11c40 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  p = Symbol_new(x
11c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
11c60 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
11c70 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d  clargslot = &sp-
11c80 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20 20  >datatype;.     
11c90 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74       psp->insert
11ca0 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20  LineMacro = 0;. 
11cb0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
11cc0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
11cd0 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20  R_DECL_ARG;.    
11ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11cf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
11d00 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
11d10 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
11d20 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  L:.      if( x[0
11d30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
11d40 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
11d50 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
11d60 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d  OR_RULE;.      }
11d70 65 6c 73 65 20 69 66 28 20 69 73 75 70 70 65 72  else if( isupper
11d80 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
11d90 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
11da0 2a 73 70 3b 0a 20 20 20 20 20 20 20 20 73 70 20  *sp;.        sp 
11db0 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
11dc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d  .        if( sp-
11dd0 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20  >prec>=0 ){.    
11de0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11df0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11e00 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11e10 20 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62             "Symb
11e20 6f 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 61 6c  ol \"%s\" has al
11e30 72 65 61 64 79 20 62 65 20 67 69 76 65 6e 20 61  ready be given a
11e40 20 70 72 65 63 65 64 65 6e 63 65 2e 22 2c 78 29   precedence.",x)
11e50 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
11e60 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65  >errorcnt++;..}e
11e70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
11e80 70 2d 3e 70 72 65 63 20 3d 20 70 73 70 2d 3e 70  p->prec = psp->p
11e90 72 65 63 63 6f 75 6e 74 65 72 3b 0a 20 20 20 20  reccounter;.    
11ea0 20 20 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20        sp->assoc 
11eb0 3d 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63  = psp->declassoc
11ec0 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65  ;..}.      }else
11ed0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
11ee0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11ef0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11f00 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 61  o,.          "Ca
11f10 6e 27 74 20 61 73 73 69 67 6e 20 61 20 70 72 65  n't assign a pre
11f20 63 65 64 65 6e 63 65 20 74 6f 20 5c 22 25 73 5c  cedence to \"%s\
11f30 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20  ".",x);.        
11f40 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
11f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11f60 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
11f70 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
11f80 41 52 47 3a 0a 20 20 20 20 20 20 69 66 28 20 78  ARG:.      if( x
11f90 5b 30 5d 3d 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d  [0]=='{' || x[0]
11fa0 3d 3d 27 5c 22 27 20 7c 7c 20 69 73 61 6c 6e 75  =='\"' || isalnu
11fb0 6d 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  m(x[0]) ){.     
11fc0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11fd0 4f 6c 64 2c 20 2a 7a 4e 65 77 3b 0a 20 20 20 20  Old, *zNew;.    
11fe0 20 20 20 20 63 68 61 72 20 2a 7a 42 75 66 2c 20      char *zBuf, 
11ff0 2a 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  *z;.        int 
12000 6e 4f 6c 64 2c 20 6e 2c 20 6e 4c 69 6e 65 2c 20  nOld, n, nLine, 
12010 6e 4e 65 77 2c 20 6e 42 61 63 6b 3b 0a 20 20 20  nNew, nBack;.   
12020 20 20 20 20 20 69 6e 74 20 61 64 64 4c 69 6e 65       int addLine
12030 4d 61 63 72 6f 3b 0a 20 20 20 20 20 20 20 20 63  Macro;.        c
12040 68 61 72 20 7a 4c 69 6e 65 5b 35 30 5d 3b 0a 20  har zLine[50];. 
12050 20 20 20 20 20 20 20 7a 4e 65 77 20 3d 20 78 3b         zNew = x;
12060 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 65  .        if( zNe
12070 77 5b 30 5d 3d 3d 27 22 27 20 7c 7c 20 7a 4e 65  w[0]=='"' || zNe
12080 77 5b 30 5d 3d 3d 27 7b 27 20 29 20 7a 4e 65 77  w[0]=='{' ) zNew
12090 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 4e 65 77  ++;.        nNew
120a0 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a   = lemonStrlen(z
120b0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  New);.        if
120c0 28 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73  ( *psp->declargs
120d0 6c 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lot ){.         
120e0 20 7a 4f 6c 64 20 3d 20 2a 70 73 70 2d 3e 64 65   zOld = *psp->de
120f0 63 6c 61 72 67 73 6c 6f 74 3b 0a 20 20 20 20 20  clargslot;.     
12100 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12110 20 20 20 20 7a 4f 6c 64 20 3d 20 22 22 3b 0a 20      zOld = "";. 
12120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12130 20 6e 4f 6c 64 20 3d 20 6c 65 6d 6f 6e 53 74 72   nOld = lemonStr
12140 6c 65 6e 28 7a 4f 6c 64 29 3b 0a 20 20 20 20 20  len(zOld);.     
12150 20 20 20 6e 20 3d 20 6e 4f 6c 64 20 2b 20 6e 4e     n = nOld + nN
12160 65 77 20 2b 20 32 30 3b 0a 20 20 20 20 20 20 20  ew + 20;.       
12170 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 3d 20   addLineMacro = 
12180 21 70 73 70 2d 3e 67 70 2d 3e 6e 6f 6c 69 6e 65  !psp->gp->noline
12190 6e 6f 73 66 6c 61 67 20 26 26 20 70 73 70 2d 3e  nosflag && psp->
121a0 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
121b0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
121c0 20 20 20 20 20 20 20 20 20 20 20 28 70 73 70 2d             (psp-
121d0 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3d  >decllinenoslot=
121e0 3d 30 20 7c 7c 20 70 73 70 2d 3e 64 65 63 6c 6c  =0 || psp->decll
121f0 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 21 3d 30 29  inenoslot[0]!=0)
12200 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
12210 64 4c 69 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20  dLineMacro ){.  
12220 20 20 20 20 20 20 20 20 66 6f 72 28 7a 3d 70 73          for(z=ps
12230 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 6e 42 61  p->filename, nBa
12240 63 6b 3d 30 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a  ck=0; *z; z++){.
12250 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12260 2a 7a 3d 3d 27 5c 5c 27 20 29 20 6e 42 61 63 6b  *z=='\\' ) nBack
12270 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
12280 20 20 20 20 20 20 20 20 20 20 73 70 72 69 6e 74            sprint
12290 66 28 7a 4c 69 6e 65 2c 20 22 23 6c 69 6e 65 20  f(zLine, "#line 
122a0 25 64 20 22 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e  %d ", psp->token
122b0 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 20  lineno);.       
122c0 20 20 20 6e 4c 69 6e 65 20 3d 20 6c 65 6d 6f 6e     nLine = lemon
122d0 53 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20  Strlen(zLine);. 
122e0 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 6e 4c           n += nL
122f0 69 6e 65 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65  ine + lemonStrle
12300 6e 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  n(psp->filename)
12310 20 2b 20 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20   + nBack;.      
12320 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 73 70    }.        *psp
12330 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
12340 28 63 68 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63  (char *) realloc
12350 28 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c  (*psp->declargsl
12360 6f 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  ot, n);.        
12370 7a 42 75 66 20 3d 20 2a 70 73 70 2d 3e 64 65 63  zBuf = *psp->dec
12380 6c 61 72 67 73 6c 6f 74 20 2b 20 6e 4f 6c 64 3b  largslot + nOld;
12390 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
123a0 4c 69 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20  LineMacro ){.   
123b0 20 20 20 20 20 20 20 69 66 28 20 6e 4f 6c 64 20         if( nOld 
123c0 26 26 20 7a 42 75 66 5b 2d 31 5d 21 3d 27 5c 6e  && zBuf[-1]!='\n
123d0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
123e0 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e   *(zBuf++) = '\n
123f0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
12400 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
12410 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 6e 4c 69  zBuf, zLine, nLi
12420 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ne);.          z
12430 42 75 66 20 2b 3d 20 6e 4c 69 6e 65 3b 0a 20 20  Buf += nLine;.  
12440 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b          *(zBuf++
12450 29 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 20  ) = '"';.       
12460 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69     for(z=psp->fi
12470 6c 65 6e 61 6d 65 3b 20 2a 7a 3b 20 7a 2b 2b 29  lename; *z; z++)
12480 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
12490 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  ( *z=='\\' ){.  
124a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42              *(zB
124b0 75 66 2b 2b 29 20 3d 20 27 5c 5c 27 3b 0a 20 20  uf++) = '\\';.  
124c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
124d0 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b          *(zBuf++
124e0 29 20 3d 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20  ) = *z;.        
124f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2a 28    }.          *(
12500 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20  zBuf++) = '"';. 
12510 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b           *(zBuf+
12520 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20  +) = '\n';.     
12530 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
12540 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f   psp->decllineno
12550 73 6c 6f 74 20 26 26 20 70 73 70 2d 3e 64 65 63  slot && psp->dec
12560 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 3d 3d  llinenoslot[0]==
12570 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
12580 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
12590 6f 74 5b 30 5d 20 3d 20 70 73 70 2d 3e 74 6f 6b  ot[0] = psp->tok
125a0 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  enlineno;.      
125b0 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63    }.        memc
125c0 70 79 28 7a 42 75 66 2c 20 7a 4e 65 77 2c 20 6e  py(zBuf, zNew, n
125d0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7a 42  New);.        zB
125e0 75 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  uf += nNew;.    
125f0 20 20 20 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20      *zBuf = 0;. 
12600 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12610 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
12620 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
12630 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12640 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
12650 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
12660 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
12670 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 61        "Illegal a
12680 72 67 75 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a  rgument to %%%s:
12690 20 25 73 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65   %s",psp->declke
126a0 79 77 6f 72 64 2c 78 29 3b 0a 20 20 20 20 20 20  yword,x);.      
126b0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
126c0 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
126d0 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
126e0 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
126f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
12700 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
12710 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42  AITING_FOR_FALLB
12720 41 43 4b 5f 49 44 3a 0a 20 20 20 20 20 20 69 66  ACK_ID:.      if
12730 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
12740 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12750 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
12760 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
12770 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69      }else if( !i
12780 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a  supper(x[0]) ){.
12790 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
127a0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
127b0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
127c0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 25 66  ,.          "%%f
127d0 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74  allback argument
127e0 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62   \"%s\" should b
127f0 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a  e a token", x);.
12800 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
12810 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
12820 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
12830 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
12840 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
12850 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70  .        if( psp
12860 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b  ->fallback==0 ){
12870 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12880 66 61 6c 6c 62 61 63 6b 20 3d 20 73 70 3b 0a 20  fallback = sp;. 
12890 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
128a0 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 29 7b   sp->fallback ){
128b0 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
128c0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
128d0 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
128e0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
128f0 20 22 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20   "More than one 
12900 66 61 6c 6c 62 61 63 6b 20 61 73 73 69 67 6e 65  fallback assigne
12910 64 20 74 6f 20 74 6f 6b 65 6e 20 25 73 22 2c 20  d to token %s", 
12920 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
12930 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
12940 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12950 20 20 20 20 20 20 20 20 73 70 2d 3e 66 61 6c 6c          sp->fall
12960 62 61 63 6b 20 3d 20 70 73 70 2d 3e 66 61 6c 6c  back = psp->fall
12970 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  back;.          
12980 70 73 70 2d 3e 67 70 2d 3e 68 61 73 5f 66 61 6c  psp->gp->has_fal
12990 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  lback = 1;.     
129a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
129b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
129c0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57  se WAITING_FOR_W
129d0 49 4c 44 43 41 52 44 5f 49 44 3a 0a 20 20 20 20  ILDCARD_ID:.    
129e0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
129f0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
12a00 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
12a10 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
12a20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
12a30 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29  ( !isupper(x[0])
12a40 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
12a50 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
12a60 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
12a70 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
12a80 22 25 25 77 69 6c 64 63 61 72 64 20 61 72 67 75  "%%wildcard argu
12a90 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75  ment \"%s\" shou
12aa0 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20  ld be a token", 
12ab0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
12ac0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
12ad0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12ae0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
12af0 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
12b00 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
12b10 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61   psp->gp->wildca
12b20 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rd==0 ){.       
12b30 20 20 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64     psp->gp->wild
12b40 63 61 72 64 20 3d 20 73 70 3b 0a 20 20 20 20 20  card = sp;.     
12b50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12b60 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
12b70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
12b80 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
12b90 20 20 20 20 20 20 20 20 20 20 22 45 78 74 72 61            "Extra
12ba0 20 77 69 6c 64 63 61 72 64 20 74 6f 20 74 6f 6b   wildcard to tok
12bb0 65 6e 3a 20 25 73 22 2c 20 78 29 3b 0a 20 20 20  en: %s", x);.   
12bc0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
12bd0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
12be0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
12bf0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
12c00 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
12c10 45 5f 45 52 52 4f 52 3a 0a 2f 2a 20 20 20 20 20  E_ERROR:./*     
12c20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
12c30 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
12c40 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
12c50 52 5f 52 55 4c 45 3b 0a 2a 2a 20 20 20 20 20 20  R_RULE;.**      
12c60 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 63 61  break; */.    ca
12c70 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f  se RESYNC_AFTER_
12c80 44 45 43 4c 5f 45 52 52 4f 52 3a 0a 20 20 20 20  DECL_ERROR:.    
12c90 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
12ca0 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57  ) psp->state = W
12cb0 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
12cc0 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 69  OR_RULE;.      i
12cd0 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 20 70  f( x[0]=='%' ) p
12ce0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
12cf0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59  ING_FOR_DECL_KEY
12d00 57 4f 52 44 3b 0a 20 20 20 20 20 20 62 72 65 61  WORD;.      brea
12d10 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e  k;.  }.}../* Run
12d20 20 74 68 65 20 70 72 65 70 72 6f 63 65 73 73 6f   the preprocesso
12d30 72 20 6f 76 65 72 20 74 68 65 20 69 6e 70 75 74  r over the input
12d40 20 66 69 6c 65 20 74 65 78 74 2e 20 20 54 68 65   file text.  The
12d50 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
12d60 73 0a 2a 2a 20 61 7a 44 65 66 69 6e 65 5b 30 5d  s.** azDefine[0]
12d70 20 74 68 72 6f 75 67 68 20 61 7a 44 65 66 69 6e   through azDefin
12d80 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 20 63 6f 6e  e[nDefine-1] con
12d90 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20  tains the names 
12da0 6f 66 20 61 6c 6c 20 64 65 66 69 6e 65 64 0a 2a  of all defined.*
12db0 2a 20 6d 61 63 72 6f 73 2e 20 20 54 68 69 73 20  * macros.  This 
12dc0 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f  routine looks fo
12dd0 72 20 22 25 69 66 64 65 66 22 20 61 6e 64 20 22  r "%ifdef" and "
12de0 25 69 66 6e 64 65 66 22 20 61 6e 64 20 22 25 65  %ifndef" and "%e
12df0 6e 64 69 66 22 20 61 6e 64 0a 2a 2a 20 63 6f 6d  ndif" and.** com
12e00 6d 65 6e 74 73 20 74 68 65 6d 20 6f 75 74 2e 20  ments them out. 
12e10 20 54 65 78 74 20 69 6e 20 62 65 74 77 65 65 6e   Text in between
12e20 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74   is also comment
12e30 65 64 20 6f 75 74 20 61 73 20 61 70 70 72 6f 70  ed out as approp
12e40 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
12e50 20 76 6f 69 64 20 70 72 65 70 72 6f 63 65 73 73   void preprocess
12e60 5f 69 6e 70 75 74 28 63 68 61 72 20 2a 7a 29 7b  _input(char *z){
12e70 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20  .  int i, j, k, 
12e80 6e 3b 0a 20 20 69 6e 74 20 65 78 63 6c 75 64 65  n;.  int exclude
12e90 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 74 61 72   = 0;.  int star
12ea0 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 69 6e  t = 0;.  int lin
12eb0 65 6e 6f 20 3d 20 31 3b 0a 20 20 69 6e 74 20 73  eno = 1;.  int s
12ec0 74 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 31 3b  tart_lineno = 1;
12ed0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d  .  for(i=0; z[i]
12ee0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
12ef0 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  z[i]=='\n' ) lin
12f00 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a  eno++;.    if( z
12f10 5b 69 5d 21 3d 27 25 27 20 7c 7c 20 28 69 3e 30  [i]!='%' || (i>0
12f20 20 26 26 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27   && z[i-1]!='\n'
12f30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
12f40 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 26 7a    if( strncmp(&z
12f50 5b 69 5d 2c 22 25 65 6e 64 69 66 22 2c 36 29 3d  [i],"%endif",6)=
12f60 3d 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b  =0 && isspace(z[
12f70 69 2b 36 5d 29 20 29 7b 0a 20 20 20 20 20 20 69  i+6]) ){.      i
12f80 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20  f( exclude ){.  
12f90 20 20 20 20 20 20 65 78 63 6c 75 64 65 2d 2d 3b        exclude--;
12fa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78 63  .        if( exc
12fb0 6c 75 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lude==0 ){.     
12fc0 20 20 20 20 20 66 6f 72 28 6a 3d 73 74 61 72 74       for(j=start
12fd0 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 20 69 66 28 20  ; j<i; j++) if( 
12fe0 7a 5b 6a 5d 21 3d 27 5c 6e 27 20 29 20 7a 5b 6a  z[j]!='\n' ) z[j
12ff0 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
13000 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
13010 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26   for(j=i; z[j] &
13020 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b  & z[j]!='\n'; j+
13030 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20  +) z[j] = ' ';. 
13040 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 73 74     }else if( (st
13050 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66  rncmp(&z[i],"%if
13060 64 65 66 22 2c 36 29 3d 3d 30 20 26 26 20 69 73  def",6)==0 && is
13070 73 70 61 63 65 28 7a 5b 69 2b 36 5d 29 29 0a 20  space(z[i+6])). 
13080 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 74 72           || (str
13090 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 6e  ncmp(&z[i],"%ifn
130a0 64 65 66 22 2c 37 29 3d 3d 30 20 26 26 20 69 73  def",7)==0 && is
130b0 73 70 61 63 65 28 7a 5b 69 2b 37 5d 29 29 20 29  space(z[i+7])) )
130c0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 63 6c  {.      if( excl
130d0 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ude ){.        e
130e0 78 63 6c 75 64 65 2b 2b 3b 0a 20 20 20 20 20 20  xclude++;.      
130f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
13100 6f 72 28 6a 3d 69 2b 37 3b 20 69 73 73 70 61 63  or(j=i+7; isspac
13110 65 28 7a 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a  e(z[j]); j++){}.
13120 20 20 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b          for(n=0;
13130 20 7a 5b 6a 2b 6e 5d 20 26 26 20 21 69 73 73 70   z[j+n] && !issp
13140 61 63 65 28 7a 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b  ace(z[j+n]); n++
13150 29 7b 7d 0a 20 20 20 20 20 20 20 20 65 78 63 6c  ){}.        excl
13160 75 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ude = 1;.       
13170 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 44 65 66   for(k=0; k<nDef
13180 69 6e 65 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  ine; k++){.     
13190 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
131a0 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 2c 26 7a 5b  (azDefine[k],&z[
131b0 6a 5d 2c 6e 29 3d 3d 30 20 26 26 20 6c 65 6d 6f  j],n)==0 && lemo
131c0 6e 53 74 72 6c 65 6e 28 61 7a 44 65 66 69 6e 65  nStrlen(azDefine
131d0 5b 6b 5d 29 3d 3d 6e 20 29 7b 0a 20 20 20 20 20  [k])==n ){.     
131e0 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d         exclude =
131f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
13200 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
13210 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
13220 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 33 5d 3d       if( z[i+3]=
13230 3d 27 6e 27 20 29 20 65 78 63 6c 75 64 65 20 3d  ='n' ) exclude =
13240 20 21 65 78 63 6c 75 64 65 3b 0a 20 20 20 20 20   !exclude;.     
13250 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29     if( exclude )
13260 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72  {.          star
13270 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
13280 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20   start_lineno = 
13290 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20  lineno;.        
132a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
132b0 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26  for(j=i; z[j] &&
132c0 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b   z[j]!='\n'; j++
132d0 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20  ) z[j] = ' ';.  
132e0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 78    }.  }.  if( ex
132f0 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 66 70 72  clude ){.    fpr
13300 69 6e 74 66 28 73 74 64 65 72 72 2c 22 75 6e 74  intf(stderr,"unt
13310 65 72 6d 69 6e 61 74 65 64 20 25 25 69 66 64 65  erminated %%ifde
13320 66 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 6c 69  f starting on li
13330 6e 65 20 25 64 5c 6e 22 2c 20 73 74 61 72 74 5f  ne %d\n", start_
13340 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 65 78 69  lineno);.    exi
13350 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  t(1);.  }.}../* 
13360 49 6e 20 73 70 69 74 65 20 6f 66 20 69 74 73 20  In spite of its 
13370 6e 61 6d 65 2c 20 74 68 69 73 20 66 75 6e 63 74  name, this funct
13380 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ion is really a 
13390 73 63 61 6e 6e 65 72 2e 20 20 49 74 20 72 65 61  scanner.  It rea
133a0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 65 6e 74 69  d.** in the enti
133b0 72 65 20 69 6e 70 75 74 20 66 69 6c 65 20 28 61  re input file (a
133c0 6c 6c 20 61 74 20 6f 6e 63 65 29 20 74 68 65 6e  ll at once) then
133d0 20 74 6f 6b 65 6e 69 7a 65 73 20 69 74 2e 20 20   tokenizes it.  
133e0 45 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69 73  Each.** token is
133f0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 66   passed to the f
13400 75 6e 63 74 69 6f 6e 20 22 70 61 72 73 65 6f 6e  unction "parseon
13410 65 74 6f 6b 65 6e 22 20 77 68 69 63 68 20 62 75  etoken" which bu
13420 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74 68 65 20  ilds all.** the 
13430 61 70 70 72 6f 70 72 69 61 74 65 20 64 61 74 61  appropriate data
13440 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
13450 68 65 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 20  he global state 
13460 76 65 63 74 6f 72 20 22 67 70 22 2e 0a 2a 2f 0a  vector "gp"..*/.
13470 76 6f 69 64 20 50 61 72 73 65 28 73 74 72 75 63  void Parse(struc
13480 74 20 6c 65 6d 6f 6e 20 2a 67 70 29 0a 7b 0a 20  t lemon *gp).{. 
13490 20 73 74 72 75 63 74 20 70 73 74 61 74 65 20 70   struct pstate p
134a0 73 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 20  s;.  FILE *fp;. 
134b0 20 63 68 61 72 20 2a 66 69 6c 65 62 75 66 3b 0a   char *filebuf;.
134c0 20 20 69 6e 74 20 66 69 6c 65 73 69 7a 65 3b 0a    int filesize;.
134d0 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a 20 20    int lineno;.  
134e0 69 6e 74 20 63 3b 0a 20 20 63 68 61 72 20 2a 63  int c;.  char *c
134f0 70 2c 20 2a 6e 65 78 74 63 70 3b 0a 20 20 69 6e  p, *nextcp;.  in
13500 74 20 73 74 61 72 74 6c 69 6e 65 20 3d 20 30 3b  t startline = 0;
13510 0a 0a 20 20 6d 65 6d 73 65 74 28 26 70 73 2c 20  ..  memset(&ps, 
13520 27 5c 30 27 2c 20 73 69 7a 65 6f 66 28 70 73 29  '\0', sizeof(ps)
13530 29 3b 0a 20 20 70 73 2e 67 70 20 3d 20 67 70 3b  );.  ps.gp = gp;
13540 0a 20 20 70 73 2e 66 69 6c 65 6e 61 6d 65 20 3d  .  ps.filename =
13550 20 67 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b 0a 20   gp->filename;. 
13560 20 70 73 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30   ps.errorcnt = 0
13570 3b 0a 20 20 70 73 2e 73 74 61 74 65 20 3d 20 49  ;.  ps.state = I
13580 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a 20 20 2f 2a  NITIALIZE;..  /*
13590 20 42 65 67 69 6e 20 62 79 20 72 65 61 64 69 6e   Begin by readin
135a0 67 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  g the input file
135b0 20 2a 2f 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e   */.  fp = fopen
135c0 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 22 72 62  (ps.filename,"rb
135d0 22 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20  ");.  if( fp==0 
135e0 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28  ){.    ErrorMsg(
135f0 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43  ps.filename,0,"C
13600 61 6e 27 74 20 6f 70 65 6e 20 74 68 69 73 20 66  an't open this f
13610 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
13620 22 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f  ");.    gp->erro
13630 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
13640 72 6e 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28  rn;.  }.  fseek(
13650 66 70 2c 30 2c 32 29 3b 0a 20 20 66 69 6c 65 73  fp,0,2);.  files
13660 69 7a 65 20 3d 20 66 74 65 6c 6c 28 66 70 29 3b  ize = ftell(fp);
13670 0a 20 20 72 65 77 69 6e 64 28 66 70 29 3b 0a 20  .  rewind(fp);. 
13680 20 66 69 6c 65 62 75 66 20 3d 20 28 63 68 61 72   filebuf = (char
13690 20 2a 29 6d 61 6c 6c 6f 63 28 20 66 69 6c 65 73   *)malloc( files
136a0 69 7a 65 2b 31 20 29 3b 0a 20 20 69 66 28 20 66  ize+1 );.  if( f
136b0 69 6c 65 62 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ilebuf==0 ){.   
136c0 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c   ErrorMsg(ps.fil
136d0 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 61  ename,0,"Can't a
136e0 6c 6c 6f 63 61 74 65 20 25 64 20 6f 66 20 6d 65  llocate %d of me
136f0 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 69  mory to hold thi
13700 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20  s file.",.      
13710 66 69 6c 65 73 69 7a 65 2b 31 29 3b 0a 20 20 20  filesize+1);.   
13720 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b   gp->errorcnt++;
13730 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b  .    fclose(fp);
13740 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
13750 0a 20 20 69 66 28 20 66 72 65 61 64 28 66 69 6c  .  if( fread(fil
13760 65 62 75 66 2c 31 2c 66 69 6c 65 73 69 7a 65 2c  ebuf,1,filesize,
13770 66 70 29 21 3d 66 69 6c 65 73 69 7a 65 20 29 7b  fp)!=filesize ){
13780 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73  .    ErrorMsg(ps
13790 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e  .filename,0,"Can
137a0 27 74 20 72 65 61 64 20 69 6e 20 61 6c 6c 20 25  't read in all %
137b0 64 20 62 79 74 65 73 20 6f 66 20 74 68 69 73 20  d bytes of this 
137c0 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66 69  file.",.      fi
137d0 6c 65 73 69 7a 65 29 3b 0a 20 20 20 20 66 72 65  lesize);.    fre
137e0 65 28 66 69 6c 65 62 75 66 29 3b 0a 20 20 20 20  e(filebuf);.    
137f0 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  gp->errorcnt++;.
13800 20 20 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a      fclose(fp);.
13810 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
13820 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20    fclose(fp);.  
13830 66 69 6c 65 62 75 66 5b 66 69 6c 65 73 69 7a 65  filebuf[filesize
13840 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  ] = 0;..  /* Mak
13850 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 70 61 73  e an initial pas
13860 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69  s through the fi
13870 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 25 69 66  le to handle %if
13880 64 65 66 20 61 6e 64 20 25 69 66 6e 64 65 66 20  def and %ifndef 
13890 2a 2f 0a 20 20 70 72 65 70 72 6f 63 65 73 73 5f  */.  preprocess_
138a0 69 6e 70 75 74 28 66 69 6c 65 62 75 66 29 3b 0a  input(filebuf);.
138b0 0a 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e 20 74  .  /* Now scan t
138c0 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 69  he text of the i
138d0 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 6c  nput file */.  l
138e0 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72  ineno = 1;.  for
138f0 28 63 70 3d 66 69 6c 65 62 75 66 3b 20 28 63 3d  (cp=filebuf; (c=
13900 20 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20 20 20   *cp)!=0; ){.   
13910 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
13920 69 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20 20 20  ineno++;        
13930 20 20 20 20 20 20 2f 2a 20 4b 65 65 70 20 74 72        /* Keep tr
13940 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20  ack of the line 
13950 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 66  number */.    if
13960 28 20 69 73 73 70 61 63 65 28 63 29 20 29 7b 20  ( isspace(c) ){ 
13970 63 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20  cp++; continue; 
13980 7d 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c 20 77  }  /* Skip all w
13990 68 69 74 65 20 73 70 61 63 65 20 2a 2f 0a 20 20  hite space */.  
139a0 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20    if( c=='/' && 
139b0 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 20  cp[1]=='/' ){   
139c0 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43         /* Skip C
139d0 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74  ++ style comment
139e0 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32  s */.      cp+=2
139f0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  ;.      while( (
13a00 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21  c= *cp)!=0 && c!
13a10 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20  ='\n' ) cp++;.  
13a20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
13a30 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27    }.    if( c=='
13a40 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27  /' && cp[1]=='*'
13a50 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
13a60 53 6b 69 70 20 43 20 73 74 79 6c 65 20 63 6f 6d  Skip C style com
13a70 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63  ments */.      c
13a80 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c  p+=2;.      whil
13a90 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  e( (c= *cp)!=0 &
13aa0 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63 70 5b  & (c!='/' || cp[
13ab0 2d 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20  -1]!='*') ){.   
13ac0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
13ad0 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20   ) lineno++;.   
13ae0 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
13af0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 20 29   }.      if( c )
13b00 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e   cp++;.      con
13b10 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
13b20 20 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74 20 3d   ps.tokenstart =
13b30 20 63 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   cp;            
13b40 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20      /* Mark the 
13b50 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
13b60 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 73   token */.    ps
13b70 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20 6c  .tokenlineno = l
13b80 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  ineno;          
13b90 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 6f   /* Linenumber o
13ba0 6e 20 77 68 69 63 68 20 74 6f 6b 65 6e 20 62 65  n which token be
13bb0 67 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  gins */.    if( 
13bc0 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 20 20  c=='\"' ){      
13bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13be0 2a 20 53 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  * String literal
13bf0 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b  s */.      cp++;
13c00 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
13c10 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d  = *cp)!=0 && c!=
13c20 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\"' ){.        
13c30 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
13c40 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
13c50 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cp++;.      }.  
13c60 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
13c70 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
13c80 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73 74 61  (ps.filename,sta
13c90 72 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e 67 20  rtline,."String 
13ca0 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73  starting on this
13cb0 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72   line is not ter
13cc0 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74  minated before t
13cd0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
13ce0 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  le.");.        p
13cf0 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  s.errorcnt++;.  
13d00 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
13d10 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  p;.      }else{.
13d20 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d          nextcp =
13d30 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20   cp+1;.      }. 
13d40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
13d50 27 7b 27 20 29 7b 20 20 20 20 20 20 20 20 20 20  '{' ){          
13d60 20 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20       /* A block 
13d70 6f 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 20  of C code */.   
13d80 20 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a 20 20     int level;.  
13d90 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
13da0 66 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28 63 3d  for(level=1; (c=
13db0 20 2a 63 70 29 21 3d 30 20 26 26 20 28 6c 65 76   *cp)!=0 && (lev
13dc0 65 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27 29 3b  el>1 || c!='}');
13dd0 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   cp++){.        
13de0 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
13df0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
13e00 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20  else if( c=='{' 
13e10 29 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20  ) level++;.     
13e20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27     else if( c=='
13e30 7d 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20 20  }' ) level--;.  
13e40 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
13e50 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d  =='/' && cp[1]==
13e60 27 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20  '*' ){  /* Skip 
13e70 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  comments */.    
13e80 20 20 20 20 20 20 69 6e 74 20 70 72 65 76 63 3b        int prevc;
13e90 0a 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20  .          cp = 
13ea0 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  &cp[2];.        
13eb0 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20    prevc = 0;.   
13ec0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
13ed0 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21  = *cp)!=0 && (c!
13ee0 3d 27 2f 27 20 7c 7c 20 70 72 65 76 63 21 3d 27  ='/' || prevc!='
13ef0 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  *') ){.         
13f00 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
13f10 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
13f20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 63         prevc = c
13f30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 70  ;.            cp
13f40 2b 2b 3b 0a 09 20 20 7d 0a 09 7d 65 6c 73 65 20  ++;..  }..}else 
13f50 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70  if( c=='/' && cp
13f60 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20  [1]=='/' ){  /* 
13f70 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63  Skip C++ style c
13f80 6f 6d 6d 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20  omments too */. 
13f90 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26 63           cp = &c
13fa0 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  p[2];.          
13fb0 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
13fc0 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20  =0 && c!='\n' ) 
13fd0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  cp++;.          
13fe0 69 66 28 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b  if( c ) lineno++
13ff0 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  ;..}else if( c==
14000 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 5c 22 27 20  '\'' || c=='\"' 
14010 29 7b 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20  ){    /* String 
14020 61 20 63 68 61 72 61 63 74 65 72 20 6c 69 74 65  a character lite
14030 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rals */.        
14040 20 20 69 6e 74 20 73 74 61 72 74 63 68 61 72 2c    int startchar,
14050 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20   prevc;.        
14060 20 20 73 74 61 72 74 63 68 61 72 20 3d 20 63 3b    startchar = c;
14070 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63  .          prevc
14080 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
14090 66 6f 72 28 63 70 2b 2b 3b 20 28 63 3d 20 2a 63  for(cp++; (c= *c
140a0 70 29 21 3d 30 20 26 26 20 28 63 21 3d 73 74 61  p)!=0 && (c!=sta
140b0 72 74 63 68 61 72 20 7c 7c 20 70 72 65 76 63 3d  rtchar || prevc=
140c0 3d 27 5c 5c 27 29 3b 20 63 70 2b 2b 29 7b 0a 20  ='\\'); cp++){. 
140d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
140e0 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
140f0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  +;.            i
14100 66 28 20 70 72 65 76 63 3d 3d 27 5c 5c 27 20 29  f( prevc=='\\' )
14110 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20   prevc = 0;.    
14120 20 20 20 20 20 20 20 20 65 6c 73 65 20 20 20 20          else    
14130 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20            prevc 
14140 3d 20 63 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20  = c;..  }..}.   
14150 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
14160 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
14170 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e  rrorMsg(ps.filen
14180 61 6d 65 2c 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65  ame,ps.tokenline
14190 6e 6f 2c 0a 22 43 20 63 6f 64 65 20 73 74 61 72  no,."C code star
141a0 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e  ting on this lin
141b0 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61  e is not termina
141c0 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 65  ted before the e
141d0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 22  nd of the file."
141e0 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e 65 72  );.        ps.er
141f0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
14200 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20    nextcp = cp;. 
14210 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14220 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 2b      nextcp = cp+
14230 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
14240 65 6c 73 65 20 69 66 28 20 69 73 61 6c 6e 75 6d  else if( isalnum
14250 28 63 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  (c) ){          
14260 2f 2a 20 49 64 65 6e 74 69 66 69 65 72 73 20 2a  /* Identifiers *
14270 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  /.      while( (
14280 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 69  c= *cp)!=0 && (i
14290 73 61 6c 6e 75 6d 28 63 29 20 7c 7c 20 63 3d 3d  salnum(c) || c==
142a0 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20  '_') ) cp++;.   
142b0 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a     nextcp = cp;.
142c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
142d0 3d 27 3a 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  =':' && cp[1]=='
142e0 3a 27 20 26 26 20 63 70 5b 32 5d 3d 3d 27 3d 27  :' && cp[2]=='='
142f0 20 29 7b 20 2f 2a 20 54 68 65 20 6f 70 65 72 61   ){ /* The opera
14300 74 6f 72 20 22 3a 3a 3d 22 20 2a 2f 0a 20 20 20  tor "::=" */.   
14310 20 20 20 63 70 20 2b 3d 20 33 3b 0a 20 20 20 20     cp += 3;.    
14320 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20    nextcp = cp;. 
14330 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d     }else if( (c=
14340 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27 7c 27 29 20  ='/' || c=='|') 
14350 26 26 20 69 73 61 6c 70 68 61 28 63 70 5b 31 5d  && isalpha(cp[1]
14360 29 20 29 7b 0a 20 20 20 20 20 20 63 70 20 2b 3d  ) ){.      cp +=
14370 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   2;.      while(
14380 20 28 63 20 3d 20 2a 63 70 29 21 3d 30 20 26 26   (c = *cp)!=0 &&
14390 20 28 69 73 61 6c 6e 75 6d 28 63 29 20 7c 7c 20   (isalnum(c) || 
143a0 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a  c=='_') ) cp++;.
143b0 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
143c0 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20  p;.    }else{   
143d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143e0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6f 74         /* All ot
143f0 68 65 72 20 28 6f 6e 65 20 63 68 61 72 61 63 74  her (one charact
14400 65 72 29 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f  er) operators */
14410 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20  .      cp++;.   
14420 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a     nextcp = cp;.
14430 20 20 20 20 7d 0a 20 20 20 20 63 20 3d 20 2a 63      }.    c = *c
14440 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 20  p;.    *cp = 0; 
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14460 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 6c 20 74         /* Null t
14470 65 72 6d 69 6e 61 74 65 20 74 68 65 20 74 6f 6b  erminate the tok
14480 65 6e 20 2a 2f 0a 20 20 20 20 70 61 72 73 65 6f  en */.    parseo
14490 6e 65 74 6f 6b 65 6e 28 26 70 73 29 3b 20 20 20  netoken(&ps);   
144a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
144b0 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a  se the token */.
144c0 20 20 20 20 2a 63 70 20 3d 20 63 3b 20 20 20 20      *cp = c;    
144d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144e0 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74      /* Restore t
144f0 68 65 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  he buffer */.   
14500 20 63 70 20 3d 20 6e 65 78 74 63 70 3b 0a 20 20   cp = nextcp;.  
14510 7d 0a 20 20 66 72 65 65 28 66 69 6c 65 62 75 66  }.  free(filebuf
14520 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
14530 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65        /* Release
14540 20 74 68 65 20 62 75 66 66 65 72 20 61 66 74 65   the buffer afte
14550 72 20 70 61 72 73 69 6e 67 20 2a 2f 0a 20 20 67  r parsing */.  g
14560 70 2d 3e 72 75 6c 65 20 3d 20 70 73 2e 66 69 72  p->rule = ps.fir
14570 73 74 72 75 6c 65 3b 0a 20 20 67 70 2d 3e 65 72  strule;.  gp->er
14580 72 6f 72 63 6e 74 20 3d 20 70 73 2e 65 72 72 6f  rorcnt = ps.erro
14590 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  rcnt;.}./*******
145a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145b0 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
145c0 6c 65 20 22 70 6c 69 6e 6b 2e 63 22 20 2a 2a 2a  le "plink.c" ***
145d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145e0 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  **/./*.** Routin
145f0 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f  es processing co
14600 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f 6c 6c  nfiguration foll
14610 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69  ow-set propagati
14620 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a 20 69 6e 20 74  on links.** in t
14630 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
14640 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74  generator..*/.st
14650 61 74 69 63 20 73 74 72 75 63 74 20 70 6c 69 6e  atic struct plin
14660 6b 20 2a 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  k *plink_freelis
14670 74 20 3d 20 30 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63  t = 0;../* Alloc
14680 61 74 65 20 61 20 6e 65 77 20 70 6c 69 6e 6b 20  ate a new plink 
14690 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  */.struct plink 
146a0 2a 50 6c 69 6e 6b 5f 6e 65 77 28 29 7b 0a 20 20  *Plink_new(){.  
146b0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
146c0 77 6c 69 6e 6b 3b 0a 0a 20 20 69 66 28 20 70 6c  wlink;..  if( pl
146d0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20  ink_freelist==0 
146e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
146f0 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b    int amt = 100;
14700 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  .    plink_freel
14710 69 73 74 20 3d 20 28 73 74 72 75 63 74 20 70 6c  ist = (struct pl
14720 69 6e 6b 20 2a 29 63 61 6c 6c 6f 63 28 20 61 6d  ink *)calloc( am
14730 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  t, sizeof(struct
14740 20 70 6c 69 6e 6b 29 20 29 3b 0a 20 20 20 20 69   plink) );.    i
14750 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  f( plink_freelis
14760 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  t==0 ){.      fp
14770 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
14780 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 61      "Unable to a
14790 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
147a0 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c 6f 77 2d  or a new follow-
147b0 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  set propagation 
147c0 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20 20 20  link.\n");.     
147d0 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
147e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
147f0 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c 69 6e 6b  mt-1; i++) plink
14800 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78  _freelist[i].nex
14810 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72 65 65 6c  t = &plink_freel
14820 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 70 6c  ist[i+1];.    pl
14830 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 61 6d 74  ink_freelist[amt
14840 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  -1].next = 0;.  
14850 7d 0a 20 20 6e 65 77 6c 69 6e 6b 20 3d 20 70 6c  }.  newlink = pl
14860 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20  ink_freelist;.  
14870 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d  plink_freelist =
14880 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d   plink_freelist-
14890 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20  >next;.  return 
148a0 6e 65 77 6c 69 6e 6b 3b 0a 7d 0a 0a 2f 2a 20 41  newlink;.}../* A
148b0 64 64 20 61 20 70 6c 69 6e 6b 20 74 6f 20 61 20  dd a plink to a 
148c0 70 6c 69 6e 6b 20 6c 69 73 74 20 2a 2f 0a 76 6f  plink list */.vo
148d0 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 73 74 72  id Plink_add(str
148e0 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 70 6c 70 70  uct plink **plpp
148f0 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
14900 2a 63 66 70 29 0a 7b 0a 20 20 73 74 72 75 63 74  *cfp).{.  struct
14910 20 70 6c 69 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b   plink *newlink;
14920 0a 20 20 6e 65 77 6c 69 6e 6b 20 3d 20 50 6c 69  .  newlink = Pli
14930 6e 6b 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 6c  nk_new();.  newl
14940 69 6e 6b 2d 3e 6e 65 78 74 20 3d 20 2a 70 6c 70  ink->next = *plp
14950 70 3b 0a 20 20 2a 70 6c 70 70 20 3d 20 6e 65 77  p;.  *plpp = new
14960 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b 2d  link;.  newlink-
14970 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f  >cfp = cfp;.}../
14980 2a 20 54 72 61 6e 73 66 65 72 20 65 76 65 72 79  * Transfer every
14990 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69   plink on the li
149a0 73 74 20 22 66 72 6f 6d 22 20 74 6f 20 74 68 65  st "from" to the
149b0 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a 76 6f   list "to" */.vo
149c0 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74  id Plink_copy(st
149d0 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 74 6f 2c  ruct plink **to,
149e0 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66   struct plink *f
149f0 72 6f 6d 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  rom).{.  struct 
14a00 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 20  plink *nextpl;. 
14a10 20 77 68 69 6c 65 28 20 66 72 6f 6d 20 29 7b 0a   while( from ){.
14a20 20 20 20 20 6e 65 78 74 70 6c 20 3d 20 66 72 6f      nextpl = fro
14a30 6d 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 66 72 6f  m->next;.    fro
14a40 6d 2d 3e 6e 65 78 74 20 3d 20 2a 74 6f 3b 0a 20  m->next = *to;. 
14a50 20 20 20 2a 74 6f 20 3d 20 66 72 6f 6d 3b 0a 20     *to = from;. 
14a60 20 20 20 66 72 6f 6d 20 3d 20 6e 65 78 74 70 6c     from = nextpl
14a70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65 6c 65  ;.  }.}../* Dele
14a80 74 65 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f  te every plink o
14a90 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 76 6f  n the list */.vo
14aa0 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28  id Plink_delete(
14ab0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c  struct plink *pl
14ac0 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  p).{.  struct pl
14ad0 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20  ink *nextpl;..  
14ae0 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20  while( plp ){.  
14af0 20 20 6e 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e    nextpl = plp->
14b00 6e 65 78 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e  next;.    plp->n
14b10 65 78 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65  ext = plink_free
14b20 6c 69 73 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f  list;.    plink_
14b30 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a  freelist = plp;.
14b40 20 20 20 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c      plp = nextpl
14b50 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ;.  }.}./*******
14b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14b70 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
14b80 72 65 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  report.c" ******
14b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14ba0 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  ****/./*.** Proc
14bb0 65 64 75 72 65 73 20 66 6f 72 20 67 65 6e 65 72  edures for gener
14bc0 61 74 69 6e 67 20 72 65 70 6f 72 74 73 20 61 6e  ating reports an
14bd0 64 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  d tables in the 
14be0 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
14bf0 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47  erator..*/../* G
14c00 65 6e 65 72 61 74 65 20 61 20 66 69 6c 65 6e 61  enerate a filena
14c10 6d 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65  me with the give
14c20 6e 20 73 75 66 66 69 78 2e 20 20 53 70 61 63 65  n suffix.  Space
14c30 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
14c40 6e 61 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20  name comes from 
14c50 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  malloc() and mus
14c60 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
14c70 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
14c80 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54  ction..*/.PRIVAT
14c90 45 20 63 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b  E char *file_mak
14ca0 65 6e 61 6d 65 28 73 74 72 75 63 74 20 6c 65 6d  ename(struct lem
14cb0 6f 6e 20 2a 6c 65 6d 70 2c 20 63 6f 6e 73 74 20  on *lemp, const 
14cc0 63 68 61 72 20 2a 73 75 66 66 69 78 29 0a 7b 0a  char *suffix).{.
14cd0 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20    char *name;.  
14ce0 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20 6e 61 6d  char *cp;..  nam
14cf0 65 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f  e = (char*)mallo
14d00 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c  c( lemonStrlen(l
14d10 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b  emp->filename) +
14d20 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 75 66   lemonStrlen(suf
14d30 66 69 78 29 20 2b 20 35 20 29 3b 0a 20 20 69 66  fix) + 5 );.  if
14d40 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  ( name==0 ){.   
14d50 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14d60 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20  "Can't allocate 
14d70 73 70 61 63 65 20 66 6f 72 20 61 20 66 69 6c 65  space for a file
14d80 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  name.\n");.    e
14d90 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 73 74  xit(1);.  }.  st
14da0 72 63 70 79 28 6e 61 6d 65 2c 6c 65 6d 70 2d 3e  rcpy(name,lemp->
14db0 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 63 70 20  filename);.  cp 
14dc0 3d 20 73 74 72 72 63 68 72 28 6e 61 6d 65 2c 27  = strrchr(name,'
14dd0 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29 20  .');.  if( cp ) 
14de0 2a 63 70 20 3d 20 30 3b 0a 20 20 73 74 72 63 61  *cp = 0;.  strca
14df0 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b 0a  t(name,suffix);.
14e00 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d    return name;.}
14e10 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  ../* Open a file
14e20 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62 61 73   with a name bas
14e30 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f  ed on the name o
14e40 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
14e50 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20 61 20  ,.** but with a 
14e60 64 69 66 66 65 72 65 6e 74 20 28 73 70 65 63 69  different (speci
14e70 66 69 65 64 29 20 73 75 66 66 69 78 2c 20 61 6e  fied) suffix, an
14e80 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
14e90 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 72  er.** to the str
14ea0 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20 46  eam */.PRIVATE F
14eb0 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28 0a  ILE *file_open(.
14ec0 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a    struct lemon *
14ed0 6c 65 6d 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  lemp,.  const ch
14ee0 61 72 20 2a 73 75 66 66 69 78 2c 0a 20 20 63 6f  ar *suffix,.  co
14ef0 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 0a 29  nst char *mode.)
14f00 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20  {.  FILE *fp;.. 
14f10 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61   if( lemp->outna
14f20 6d 65 20 29 20 66 72 65 65 28 6c 65 6d 70 2d 3e  me ) free(lemp->
14f30 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d 70  outname);.  lemp
14f40 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c 65  ->outname = file
14f50 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20  _makename(lemp, 
14f60 73 75 66 66 69 78 29 3b 0a 20 20 66 70 20 3d 20  suffix);.  fp = 
14f70 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e  fopen(lemp->outn
14f80 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66 28  ame,mode);.  if(
14f90 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65 3d   fp==0 && *mode=
14fa0 3d 27 77 27 20 29 7b 0a 20 20 20 20 66 70 72 69  ='w' ){.    fpri
14fb0 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27  ntf(stderr,"Can'
14fc0 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73  t open file \"%s
14fd0 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74  \".\n",lemp->out
14fe0 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d  name);.    lemp-
14ff0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
15000 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
15010 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f   return fp;.}../
15020 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68 65 20  * Duplicate the 
15030 69 6e 70 75 74 20 66 69 6c 65 20 77 69 74 68 6f  input file witho
15040 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64 20  ut comments and 
15050 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 20  without actions 
15060 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a  .** on rules */.
15070 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73 74 72  void Reprint(str
15080 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
15090 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  .{.  struct rule
150a0 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73   *rp;.  struct s
150b0 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74  ymbol *sp;.  int
150c0 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c   i, j, maxlen, l
150d0 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b  en, ncolumns, sk
150e0 69 70 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f 2f  ip;.  printf("//
150f0 20 52 65 70 72 69 6e 74 20 6f 66 20 69 6e 70 75   Reprint of inpu
15100 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e  t file \"%s\".\n
15110 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c  // Symbols:\n",l
15120 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a  emp->filename);.
15130 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a 20    maxlen = 10;. 
15140 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
15150 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
15160 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
15170 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
15180 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  len = lemonStrle
15190 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  n(sp->name);.   
151a0 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20   if( len>maxlen 
151b0 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a  ) maxlen = len;.
151c0 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20 3d    }.  ncolumns =
151d0 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b 0a   76/(maxlen+5);.
151e0 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c 31    if( ncolumns<1
151f0 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31 3b   ) ncolumns = 1;
15200 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70 2d  .  skip = (lemp-
15210 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c 75  >nsymbol + ncolu
15220 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d 6e  mns - 1)/ncolumn
15230 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  s;.  for(i=0; i<
15240 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  skip; i++){.    
15250 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20 20  printf("//");.  
15260 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65 6d    for(j=i; j<lem
15270 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d 73  p->nsymbol; j+=s
15280 6b 69 70 29 7b 0a 20 20 20 20 20 20 73 70 20 3d  kip){.      sp =
15290 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a   lemp->symbols[j
152a0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
152b0 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29 3b   sp->index==j );
152c0 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20  .      printf(" 
152d0 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61  %3d %-*.*s",j,ma
152e0 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d 3e  xlen,maxlen,sp->
152f0 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
15300 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
15310 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70   }.  for(rp=lemp
15320 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
15330 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 70 72  p->next){.    pr
15340 69 6e 74 66 28 22 25 73 22 2c 72 70 2d 3e 6c 68  intf("%s",rp->lh
15350 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a  s->name);.    /*
15360 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61      if( rp->lhsa
15370 6c 69 61 73 20 29 20 70 72 69 6e 74 66 28 22 28  lias ) printf("(
15380 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  %s)",rp->lhsalia
15390 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74  s); */.    print
153a0 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20 66  f(" ::=");.    f
153b0 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
153c0 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
153d0 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
153e0 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20  .      printf(" 
153f0 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  %s", sp->name);.
15400 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79        if( sp->ty
15410 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
15420 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  L ){.        for
15430 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62  (j=1; j<sp->nsub
15440 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  sym; j++){.     
15450 20 20 20 20 20 70 72 69 6e 74 66 28 22 7c 25 73       printf("|%s
15460 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d  ", sp->subsym[j]
15470 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
15480 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15490 20 2f 2a 20 69 66 28 20 72 70 2d 3e 72 68 73 61   /* if( rp->rhsa
154a0 6c 69 61 73 5b 69 5d 20 29 20 70 72 69 6e 74 66  lias[i] ) printf
154b0 28 22 28 25 73 29 22 2c 72 70 2d 3e 72 68 73 61  ("(%s)",rp->rhsa
154c0 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20 20  lias[i]); */.   
154d0 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2e   }.    printf(".
154e0 22 29 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  ");.    if( rp->
154f0 70 72 65 63 73 79 6d 20 29 20 70 72 69 6e 74 66  precsym ) printf
15500 28 22 20 5b 25 73 5d 22 2c 72 70 2d 3e 70 72 65  (" [%s]",rp->pre
15510 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  csym->name);.   
15520 20 2f 2a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65   /* if( rp->code
15530 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 20 20 20   ) printf("\n   
15540 20 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 20   %s",rp->code); 
15550 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c  */.    printf("\
15560 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64  n");.  }.}..void
15570 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 46 49 4c   ConfigPrint(FIL
15580 45 20 2a 66 70 2c 20 73 74 72 75 63 74 20 63 6f  E *fp, struct co
15590 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73  nfig *cfp).{.  s
155a0 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
155b0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
155c0 2a 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  *sp;.  int i, j;
155d0 0a 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b  .  rp = cfp->rp;
155e0 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25  .  fprintf(fp,"%
155f0 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e  s ::=",rp->lhs->
15600 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  name);.  for(i=0
15610 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68 73 3b 20 69  ; i<=rp->nrhs; i
15620 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d  ++){.    if( i==
15630 63 66 70 2d 3e 64 6f 74 20 29 20 66 70 72 69 6e  cfp->dot ) fprin
15640 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a 20 20 20  tf(fp," *");.   
15650 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73   if( i==rp->nrhs
15660 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 70   ) break;.    sp
15670 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
15680 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20     fprintf(fp," 
15690 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  %s", sp->name);.
156a0 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
156b0 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
156c0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31  ){.      for(j=1
156d0 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; j<sp->nsubsym;
156e0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   j++){.        f
156f0 70 72 69 6e 74 66 28 66 70 2c 22 7c 25 73 22 2c  printf(fp,"|%s",
15700 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e  sp->subsym[j]->n
15710 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
15720 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64    }.  }.}../* #d
15730 65 66 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69  efine TEST */.#i
15740 66 20 30 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73  f 0./* Print a s
15750 65 74 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  et */.PRIVATE vo
15760 69 64 20 53 65 74 50 72 69 6e 74 28 6f 75 74 2c  id SetPrint(out,
15770 73 65 74 2c 6c 65 6d 70 29 0a 46 49 4c 45 20 2a  set,lemp).FILE *
15780 6f 75 74 3b 0a 63 68 61 72 20 2a 73 65 74 3b 0a  out;.char *set;.
15790 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
157a0 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp;.{.  int i;. 
157b0 20 63 68 61 72 20 2a 73 70 61 63 65 72 3b 0a 20   char *spacer;. 
157c0 20 73 70 61 63 65 72 20 3d 20 22 22 3b 0a 20 20   spacer = "";.  
157d0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32  fprintf(out,"%12
157e0 73 5b 22 2c 22 22 29 3b 0a 20 20 66 6f 72 28 69  s[","");.  for(i
157f0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =0; i<lemp->nter
15800 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  minal; i++){.   
15810 20 69 66 28 20 53 65 74 46 69 6e 64 28 73 65 74   if( SetFind(set
15820 2c 69 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ,i) ){.      fpr
15830 69 6e 74 66 28 6f 75 74 2c 22 25 73 25 73 22 2c  intf(out,"%s%s",
15840 73 70 61 63 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d  spacer,lemp->sym
15850 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a  bols[i]->name);.
15860 20 20 20 20 20 20 73 70 61 63 65 72 20 3d 20 22        spacer = "
15870 20 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   ";.    }.  }.  
15880 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e  fprintf(out,"]\n
15890 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20  ");.}../* Print 
158a0 61 20 70 6c 69 6e 6b 20 63 68 61 69 6e 20 2a 2f  a plink chain */
158b0 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 50 6c  .PRIVATE void Pl
158c0 69 6e 6b 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70  inkPrint(out,plp
158d0 2c 74 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b  ,tag).FILE *out;
158e0 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70  .struct plink *p
158f0 6c 70 3b 0a 63 68 61 72 20 2a 74 61 67 3b 0a 7b  lp;.char *tag;.{
15900 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b  .  while( plp ){
15910 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
15920 2c 22 25 31 32 73 25 73 20 28 73 74 61 74 65 20  ,"%12s%s (state 
15930 25 32 64 29 20 22 2c 22 22 2c 74 61 67 2c 70 6c  %2d) ","",tag,pl
15940 70 2d 3e 63 66 70 2d 3e 73 74 70 2d 3e 73 74 61  p->cfp->stp->sta
15950 74 65 6e 75 6d 29 3b 0a 20 20 20 20 43 6f 6e 66  tenum);.    Conf
15960 69 67 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2d  igPrint(out,plp-
15970 3e 63 66 70 29 3b 0a 20 20 20 20 66 70 72 69 6e  >cfp);.    fprin
15980 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20  tf(out,"\n");.  
15990 20 20 70 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65 78    plp = plp->nex
159a0 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  t;.  }.}.#endif.
159b0 0a 2f 2a 20 50 72 69 6e 74 20 61 6e 20 61 63 74  ./* Print an act
159c0 69 6f 6e 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ion to the given
159d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
159e0 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  .  Return FALSE 
159f0 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 77 61  if.** nothing wa
15a00 73 20 61 63 74 75 61 6c 6c 79 20 70 72 69 6e 74  s actually print
15a10 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e 74  ed..*/.int Print
15a20 41 63 74 69 6f 6e 28 73 74 72 75 63 74 20 61 63  Action(struct ac
15a30 74 69 6f 6e 20 2a 61 70 2c 20 46 49 4c 45 20 2a  tion *ap, FILE *
15a40 66 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b  fp, int indent){
15a50 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20  .  int result = 
15a60 31 3b 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d  1;.  switch( ap-
15a70 3e 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  >type ){.    cas
15a80 65 20 53 48 49 46 54 3a 0a 20 20 20 20 20 20 66  e SHIFT:.      f
15a90 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73  printf(fp,"%*s s
15aa0 68 69 66 74 20 20 25 64 22 2c 69 6e 64 65 6e 74  hift  %d",indent
15ab0 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70  ,ap->sp->name,ap
15ac0 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75  ->x.stp->statenu
15ad0 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
15ae0 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43 45  .    case REDUCE
15af0 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
15b00 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25  fp,"%*s reduce %
15b10 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70  d",indent,ap->sp
15b20 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d  ->name,ap->x.rp-
15b30 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62  >index);.      b
15b40 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41  reak;.    case A
15b50 43 43 45 50 54 3a 0a 20 20 20 20 20 20 66 70 72  CCEPT:.      fpr
15b60 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 61 63 63  intf(fp,"%*s acc
15b70 65 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  ept",indent,ap->
15b80 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
15b90 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
15ba0 20 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 66 70   ERROR:.      fp
15bb0 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 65 72  rintf(fp,"%*s er
15bc0 72 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  ror",indent,ap->
15bd0 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
15be0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
15bf0 20 53 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20   SRCONFLICT:.   
15c00 20 63 61 73 65 20 52 52 43 4f 4e 46 4c 49 43 54   case RRCONFLICT
15c10 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
15c20 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25  fp,"%*s reduce %
15c30 2d 33 64 20 2a 2a 20 50 61 72 73 69 6e 67 20 63  -3d ** Parsing c
15c40 6f 6e 66 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20  onflict **",.   
15c50 20 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e       indent,ap->
15c60 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72  sp->name,ap->x.r
15c70 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  p->index);.     
15c80 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
15c90 20 53 53 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20   SSCONFLICT:.   
15ca0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
15cb0 2a 73 20 73 68 69 66 74 20 20 25 2d 33 64 20 2a  *s shift  %-3d *
15cc0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69  * Parsing confli
15cd0 63 74 20 2a 2a 22 2c 20 0a 20 20 20 20 20 20 20  ct **", .       
15ce0 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
15cf0 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e  name,ap->x.stp->
15d00 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20  statenum);.     
15d10 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
15d20 20 53 48 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20   SH_RESOLVED:.  
15d30 20 20 20 20 69 66 28 20 73 68 6f 77 50 72 65 63      if( showPrec
15d40 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63 74 20 29  edenceConflict )
15d50 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
15d60 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20  f(fp,"%*s shift 
15d70 20 25 2d 33 64 20 2d 2d 20 64 72 6f 70 70 65 64   %-3d -- dropped
15d80 20 62 79 20 70 72 65 63 65 64 65 6e 63 65 22 2c   by precedence",
15d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15da0 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
15db0 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e  name,ap->x.stp->
15dc0 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20  statenum);.     
15dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15de0 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20  result = 0;.    
15df0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
15e00 0a 20 20 20 20 63 61 73 65 20 52 44 5f 52 45 53  .    case RD_RES
15e10 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20 69 66 28  OLVED:.      if(
15e20 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43   showPrecedenceC
15e30 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20 20  onflict ){.     
15e40 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
15e50 2a 73 20 72 65 64 75 63 65 20 25 2d 33 64 20 2d  *s reduce %-3d -
15e60 2d 20 64 72 6f 70 70 65 64 20 62 79 20 70 72 65  - dropped by pre
15e70 63 65 64 65 6e 63 65 22 2c 0a 20 20 20 20 20 20  cedence",.      
15e80 20 20 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74            indent
15e90 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70  ,ap->sp->name,ap
15ea0 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a  ->x.rp->index);.
15eb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15ec0 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b       result = 0;
15ed0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
15ee0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4e  reak;.    case N
15ef0 4f 54 5f 55 53 45 44 3a 0a 20 20 20 20 20 20 72  OT_USED:.      r
15f00 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20  esult = 0;.     
15f10 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
15f20 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a  turn result;.}..
15f30 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
15f40 22 79 2e 6f 75 74 70 75 74 22 20 6c 6f 67 20 66  "y.output" log f
15f50 69 6c 65 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f  ile */.void Repo
15f60 72 74 4f 75 74 70 75 74 28 73 74 72 75 63 74 20  rtOutput(struct 
15f70 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
15f80 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
15f90 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73   state *stp;.  s
15fa0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
15fb0 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p;.  struct acti
15fc0 6f 6e 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a  on *ap;.  FILE *
15fd0 66 70 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65  fp;..  fp = file
15fe0 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74  _open(lemp,".out
15ff0 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 66  ","wb");.  if( f
16000 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
16010 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
16020 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
16030 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
16040 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66  sorted[i];.    f
16050 70 72 69 6e 74 66 28 66 70 2c 22 53 74 61 74 65  printf(fp,"State
16060 20 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74 61   %d:\n",stp->sta
16070 74 65 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  tenum);.    if( 
16080 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20  lemp->basisflag 
16090 29 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20  ) cfp=stp->bp;. 
160a0 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
160b0 20 20 20 20 20 20 20 20 20 63 66 70 3d 73 74 70           cfp=stp
160c0 2d 3e 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65  ->cfp;.    while
160d0 28 20 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63  ( cfp ){.      c
160e0 68 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20  har buf[20];.   
160f0 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d     if( cfp->dot=
16100 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29  =cfp->rp->nrhs )
16110 7b 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74  {.        sprint
16120 66 28 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70  f(buf,"(%d)",cfp
16130 2d 3e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20  ->rp->index);.  
16140 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
16150 2c 22 20 20 20 20 25 35 73 20 22 2c 62 75 66 29  ,"    %5s ",buf)
16160 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16170 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
16180 70 2c 22 20 20 20 20 20 20 20 20 20 20 22 29 3b  p,"          ");
16190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43  .      }.      C
161a0 6f 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66  onfigPrint(fp,cf
161b0 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  p);.      fprint
161c0 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20  f(fp,"\n");.#if 
161d0 30 0a 20 20 20 20 20 20 53 65 74 50 72 69 6e 74  0.      SetPrint
161e0 28 66 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d  (fp,cfp->fws,lem
161f0 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50  p);.      PlinkP
16200 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c  rint(fp,cfp->fpl
16210 70 2c 22 54 6f 20 20 22 29 3b 0a 20 20 20 20 20  p,"To  ");.     
16220 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63   PlinkPrint(fp,c
16230 66 70 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29  fp->bplp,"From")
16240 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
16250 66 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c  f( lemp->basisfl
16260 61 67 20 29 20 63 66 70 3d 63 66 70 2d 3e 62 70  ag ) cfp=cfp->bp
16270 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 20 20 20  ;.      else    
16280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 66                cf
16290 70 3d 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20  p=cfp->next;.   
162a0 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66   }.    fprintf(f
162b0 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72  p,"\n");.    for
162c0 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
162d0 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
162e0 20 20 20 20 20 69 66 28 20 50 72 69 6e 74 41 63       if( PrintAc
162f0 74 69 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20 29  tion(ap,fp,30) )
16300 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22   fprintf(fp,"\n"
16310 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  );.    }.    fpr
16320 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20  intf(fp,"\n");. 
16330 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c   }.  fprintf(fp,
16340 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   "--------------
16350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16370 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70  ------\n");.  fp
16380 72 69 6e 74 66 28 66 70 2c 20 22 53 79 6d 62 6f  rintf(fp, "Symbo
16390 6c 73 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69  ls:\n");.  for(i
163a0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
163b0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  bol; i++){.    i
163c0 6e 74 20 6a 3b 0a 20 20 20 20 73 74 72 75 63 74  nt j;.    struct
163d0 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20   symbol *sp;..  
163e0 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d    sp = lemp->sym
163f0 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72  bols[i];.    fpr
16400 69 6e 74 66 28 66 70 2c 20 22 20 20 25 33 64 3a  intf(fp, "  %3d:
16410 20 25 73 22 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d   %s", i, sp->nam
16420 65 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e  e);.    if( sp->
16430 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41  type==NONTERMINA
16440 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  L ){.      fprin
16450 74 66 28 66 70 2c 20 22 3a 22 29 3b 0a 20 20 20  tf(fp, ":");.   
16460 20 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64     if( sp->lambd
16470 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  a ){.        fpr
16480 69 6e 74 66 28 66 70 2c 20 22 20 3c 6c 61 6d 62  intf(fp, " <lamb
16490 64 61 3e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  da>");.      }. 
164a0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
164b0 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
164c0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
164d0 66 28 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20  f( sp->firstset 
164e0 26 26 20 53 65 74 46 69 6e 64 28 73 70 2d 3e 66  && SetFind(sp->f
164f0 69 72 73 74 73 65 74 2c 20 6a 29 20 29 7b 0a 20  irstset, j) ){. 
16500 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
16510 28 66 70 2c 20 22 20 25 73 22 2c 20 6c 65 6d 70  (fp, " %s", lemp
16520 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61  ->symbols[j]->na
16530 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
16540 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16550 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 6e   fprintf(fp, "\n
16560 22 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  ");.  }.  fclose
16570 28 66 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  (fp);.  return;.
16580 7d 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  }../* Search for
16590 20 74 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22   the file "name"
165a0 20 77 68 69 63 68 20 69 73 20 69 6e 20 74 68 65   which is in the
165b0 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
165c0 61 73 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74  as.** the exacut
165d0 61 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20  able */.PRIVATE 
165e0 63 68 61 72 20 2a 70 61 74 68 73 65 61 72 63 68  char *pathsearch
165f0 28 63 68 61 72 20 2a 61 72 67 76 30 2c 20 63 68  (char *argv0, ch
16600 61 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 20 6d 6f  ar *name, int mo
16610 64 65 6d 61 73 6b 29 0a 7b 0a 20 20 63 6f 6e 73  demask).{.  cons
16620 74 20 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74  t char *pathlist
16630 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68 62 75  ;.  char *pathbu
16640 66 70 74 72 3b 0a 20 20 63 68 61 72 20 2a 70 61  fptr;.  char *pa
16650 74 68 62 75 66 3b 0a 20 20 63 68 61 72 20 2a 70  thbuf;.  char *p
16660 61 74 68 2c 2a 63 70 3b 0a 20 20 63 68 61 72 20  ath,*cp;.  char 
16670 63 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e  c;..#ifdef __WIN
16680 33 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72 72  32__.  cp = strr
16690 63 68 72 28 61 72 67 76 30 2c 27 5c 5c 27 29 3b  chr(argv0,'\\');
166a0 0a 23 65 6c 73 65 0a 20 20 63 70 20 3d 20 73 74  .#else.  cp = st
166b0 72 72 63 68 72 28 61 72 67 76 30 2c 27 2f 27 29  rrchr(argv0,'/')
166c0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 63  ;.#endif.  if( c
166d0 70 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63 70  p ){.    c = *cp
166e0 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20  ;.    *cp = 0;. 
166f0 20 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20     path = (char 
16700 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53  *)malloc( lemonS
16710 74 72 6c 65 6e 28 61 72 67 76 30 29 20 2b 20 6c  trlen(argv0) + l
16720 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29  emonStrlen(name)
16730 20 2b 20 32 20 29 3b 0a 20 20 20 20 69 66 28 20   + 2 );.    if( 
16740 70 61 74 68 20 29 20 73 70 72 69 6e 74 66 28 70  path ) sprintf(p
16750 61 74 68 2c 22 25 73 2f 25 73 22 2c 61 72 67 76  ath,"%s/%s",argv
16760 30 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 2a 63 70  0,name);.    *cp
16770 20 3d 20 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = c;.  }else{. 
16780 20 20 20 70 61 74 68 6c 69 73 74 20 3d 20 67 65     pathlist = ge
16790 74 65 6e 76 28 22 50 41 54 48 22 29 3b 0a 20 20  tenv("PATH");.  
167a0 20 20 69 66 28 20 70 61 74 68 6c 69 73 74 3d 3d    if( pathlist==
167b0 30 20 29 20 70 61 74 68 6c 69 73 74 20 3d 20 22  0 ) pathlist = "
167c0 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22  .:/bin:/usr/bin"
167d0 3b 0a 20 20 20 20 70 61 74 68 62 75 66 20 3d 20  ;.    pathbuf = 
167e0 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28  (char *) malloc(
167f0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74   lemonStrlen(pat
16800 68 6c 69 73 74 29 20 2b 20 31 20 29 3b 0a 20 20  hlist) + 1 );.  
16810 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20 2a    path = (char *
16820 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74  )malloc( lemonSt
16830 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 2b 6c  rlen(pathlist)+l
16840 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29  emonStrlen(name)
16850 2b 32 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  +2 );.    if( (p
16860 61 74 68 62 75 66 20 21 3d 20 30 29 20 26 26 20  athbuf != 0) && 
16870 28 70 61 74 68 21 3d 30 29 20 29 7b 0a 20 20 20  (path!=0) ){.   
16880 20 20 20 70 61 74 68 62 75 66 70 74 72 20 3d 20     pathbufptr = 
16890 70 61 74 68 62 75 66 3b 0a 20 20 20 20 20 20 73  pathbuf;.      s
168a0 74 72 63 70 79 28 70 61 74 68 62 75 66 2c 20 70  trcpy(pathbuf, p
168b0 61 74 68 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  athlist);.      
168c0 77 68 69 6c 65 28 20 2a 70 61 74 68 62 75 66 20  while( *pathbuf 
168d0 29 7b 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20  ){.        cp = 
168e0 73 74 72 63 68 72 28 70 61 74 68 62 75 66 2c 27  strchr(pathbuf,'
168f0 3a 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  :');.        if(
16900 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20 26 70   cp==0 ) cp = &p
16910 61 74 68 62 75 66 5b 6c 65 6d 6f 6e 53 74 72 6c  athbuf[lemonStrl
16920 65 6e 28 70 61 74 68 62 75 66 29 5d 3b 0a 20 20  en(pathbuf)];.  
16930 20 20 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20        c = *cp;. 
16940 20 20 20 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a         *cp = 0;.
16950 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
16960 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 70 61 74  path,"%s/%s",pat
16970 68 62 75 66 2c 6e 61 6d 65 29 3b 0a 20 20 20 20  hbuf,name);.    
16980 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 20      *cp = c;.   
16990 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
169a0 70 61 74 68 62 75 66 5b 30 5d 20 3d 20 30 3b 0a  pathbuf[0] = 0;.
169b0 20 20 20 20 20 20 20 20 65 6c 73 65 20 70 61 74          else pat
169c0 68 62 75 66 20 3d 20 26 63 70 5b 31 5d 3b 0a 20  hbuf = &cp[1];. 
169d0 20 20 20 20 20 20 20 69 66 28 20 61 63 63 65 73         if( acces
169e0 73 28 70 61 74 68 2c 6d 6f 64 65 6d 61 73 6b 29  s(path,modemask)
169f0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
16a00 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28     }.      free(
16a10 70 61 74 68 62 75 66 70 74 72 29 3b 0a 20 20 20  pathbufptr);.   
16a20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
16a30 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69 76 65  path;.}../* Give
16a40 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20 63 6f 6d  n an action, com
16a50 70 75 74 65 20 74 68 65 20 69 6e 74 65 67 65 72  pute the integer
16a60 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61 74 20   value for that 
16a70 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20  action.** which 
16a80 69 73 20 74 6f 20 62 65 20 70 75 74 20 69 6e 20  is to be put in 
16a90 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
16aa0 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
16ab0 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 52 65  d machine..** Re
16ac0 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66  turn negative if
16ad0 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68 6f 75 6c   no action shoul
16ae0 64 20 62 65 20 67 65 6e 65 72 61 74 65 64 2e 0a  d be generated..
16af0 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 63  */.PRIVATE int c
16b00 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 73 74  ompute_action(st
16b10 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
16b20 2c 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  , struct action 
16b30 2a 61 70 29 0a 7b 0a 20 20 69 6e 74 20 61 63 74  *ap).{.  int act
16b40 3b 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e  ;.  switch( ap->
16b50 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
16b60 20 53 48 49 46 54 3a 20 20 61 63 74 20 3d 20 61   SHIFT:  act = a
16b70 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e  p->x.stp->staten
16b80 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  um;            b
16b90 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
16ba0 45 44 55 43 45 3a 20 61 63 74 20 3d 20 61 70 2d  EDUCE: act = ap-
16bb0 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2b 20 6c  >x.rp->index + l
16bc0 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 62 72 65  emp->nstate; bre
16bd0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52  ak;.    case ERR
16be0 4f 52 3a 20 20 61 63 74 20 3d 20 6c 65 6d 70 2d  OR:  act = lemp-
16bf0 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e  >nstate + lemp->
16c00 6e 72 75 6c 65 3b 20 20 20 20 20 62 72 65 61 6b  nrule;     break
16c10 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43 45 50  ;.    case ACCEP
16c20 54 3a 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e  T: act = lemp->n
16c30 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72  state + lemp->nr
16c40 75 6c 65 20 2b 20 31 3b 20 62 72 65 61 6b 3b 0a  ule + 1; break;.
16c50 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
16c60 20 61 63 74 20 3d 20 2d 31 3b 20 62 72 65 61 6b   act = -1; break
16c70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
16c80 63 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4c  ct;.}..#define L
16c90 49 4e 45 53 49 5a 45 20 31 30 30 30 0a 2f 2a 20  INESIZE 1000./* 
16ca0 54 68 65 20 6e 65 78 74 20 63 6c 75 73 74 65 72  The next cluster
16cb0 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
16cc0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68 65   for reading the
16cd0 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 0a 2a   template file.*
16ce0 2a 20 61 6e 64 20 77 72 69 74 69 6e 67 20 74 68  * and writing th
16cf0 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65  e results to the
16d00 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
16d10 72 20 2a 2f 0a 2f 2a 20 54 68 65 20 66 69 72 73  r */./* The firs
16d20 74 20 66 75 6e 63 74 69 6f 6e 20 74 72 61 6e 73  t function trans
16d30 66 65 72 73 20 64 61 74 61 20 66 72 6f 6d 20 22  fers data from "
16d40 69 6e 22 20 74 6f 20 22 6f 75 74 22 20 75 6e 74  in" to "out" unt
16d50 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20 69 73 20  il.** a line is 
16d60 73 65 65 6e 20 77 68 69 63 68 20 62 65 67 69 6e  seen which begin
16d70 73 20 77 69 74 68 20 22 25 25 22 2e 20 20 54 68  s with "%%".  Th
16d80 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73  e line number is
16d90 0a 2a 2a 20 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a  .** tracked..**.
16da0 2a 2a 20 69 66 20 6e 61 6d 65 21 3d 30 2c 20 74  ** if name!=0, t
16db0 68 65 6e 20 61 6e 79 20 77 6f 72 64 20 74 68 61  hen any word tha
16dc0 74 20 62 65 67 69 6e 20 77 69 74 68 20 22 50 61  t begin with "Pa
16dd0 72 73 65 22 20 69 73 20 63 68 61 6e 67 65 64 20  rse" is changed 
16de0 74 6f 0a 2a 2a 20 62 65 67 69 6e 20 77 69 74 68  to.** begin with
16df0 20 2a 6e 61 6d 65 20 69 6e 73 74 65 61 64 2e 0a   *name instead..
16e00 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
16e10 74 70 6c 74 5f 78 66 65 72 28 63 68 61 72 20 2a  tplt_xfer(char *
16e20 6e 61 6d 65 2c 20 46 49 4c 45 20 2a 69 6e 2c 20  name, FILE *in, 
16e30 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74 20 2a  FILE *out, int *
16e40 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20 69 6e 74 20  lineno).{.  int 
16e50 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 63 68 61  i, iStart;.  cha
16e60 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d  r line[LINESIZE]
16e70 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73  ;.  while( fgets
16e80 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69  (line,LINESIZE,i
16e90 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21 3d  n) && (line[0]!=
16ea0 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d  '%' || line[1]!=
16eb0 27 25 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c 69  '%') ){.    (*li
16ec0 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53 74  neno)++;.    iSt
16ed0 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  art = 0;.    if(
16ee0 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 66   name ){.      f
16ef0 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b  or(i=0; line[i];
16f00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
16f10 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27 20  f( line[i]=='P' 
16f20 26 26 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e 65  && strncmp(&line
16f30 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d 3d  [i],"Parse",5)==
16f40 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
16f50 69 3d 3d 30 20 7c 7c 20 21 69 73 61 6c 70 68 61  i==0 || !isalpha
16f60 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20 20  (line[i-1])).   
16f70 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
16f80 20 20 69 66 28 20 69 3e 69 53 74 61 72 74 20 29    if( i>iStart )
16f90 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e   fprintf(out,"%.
16fa0 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c 69  *s",i-iStart,&li
16fb0 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 20  ne[iStart]);.   
16fc0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
16fd0 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a 20  ut,"%s",name);. 
16fe0 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b           i += 4;
16ff0 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72  .          iStar
17000 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20  t = i+1;.       
17010 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
17020 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
17030 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74 61  ,"%s",&line[iSta
17040 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  rt]);.  }.}../* 
17050 54 68 65 20 6e 65 78 74 20 66 75 6e 63 74 69 6f  The next functio
17060 6e 20 66 69 6e 64 73 20 74 68 65 20 74 65 6d 70  n finds the temp
17070 6c 61 74 65 20 66 69 6c 65 20 61 6e 64 20 6f 70  late file and op
17080 65 6e 73 20 69 74 2c 20 72 65 74 75 72 6e 69 6e  ens it, returnin
17090 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  g.** a pointer t
170a0 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c  o the opened fil
170b0 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49  e. */.PRIVATE FI
170c0 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 73 74  LE *tplt_open(st
170d0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
170e0 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  ).{.  static cha
170f0 72 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 5b 5d  r templatename[]
17100 20 3d 20 22 6c 65 6d 70 61 72 2e 63 22 3b 0a 20   = "lempar.c";. 
17110 20 63 68 61 72 20 62 75 66 5b 31 30 30 30 5d 3b   char buf[1000];
17120 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63  .  FILE *in;.  c
17130 68 61 72 20 2a 74 70 6c 74 6e 61 6d 65 3b 0a 20  har *tpltname;. 
17140 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20 2f 2a   char *cp;..  /*
17150 20 66 69 72 73 74 2c 20 73 65 65 20 69 66 20 75   first, see if u
17160 73 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20  ser specified a 
17170 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 6e 61 6d  template filenam
17180 65 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  e on the command
17190 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28   line. */.  if (
171a0 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
171b0 65 20 21 3d 20 30 29 20 7b 0a 20 20 20 20 69 66  e != 0) {.    if
171c0 28 20 61 63 63 65 73 73 28 75 73 65 72 5f 74 65  ( access(user_te
171d0 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29 3d  mplatename,004)=
171e0 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  =-1 ){.      fpr
171f0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
17200 27 74 20 66 69 6e 64 20 74 68 65 20 70 61 72 73  't find the pars
17210 65 72 20 64 72 69 76 65 72 20 74 65 6d 70 6c 61  er driver templa
17220 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c  te file \"%s\".\
17230 6e 22 2c 0a 20 20 20 20 20 20 20 20 75 73 65 72  n",.        user
17240 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a  _templatename);.
17250 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
17260 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65  rcnt++;.      re
17270 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
17280 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 75 73 65    in = fopen(use
17290 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 22  r_templatename,"
172a0 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  rb");.    if( in
172b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
172c0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
172d0 27 74 20 6f 70 65 6e 20 74 68 65 20 74 65 6d 70  't open the temp
172e0 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22  late file \"%s\"
172f0 2e 5c 6e 22 2c 75 73 65 72 5f 74 65 6d 70 6c 61  .\n",user_templa
17300 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c  tename);.      l
17310 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
17320 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
17330 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
17340 6e 20 69 6e 3b 0a 20 20 7d 0a 0a 20 20 63 70 20  n in;.  }..  cp 
17350 3d 20 73 74 72 72 63 68 72 28 6c 65 6d 70 2d 3e  = strrchr(lemp->
17360 66 69 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20  filename,'.');. 
17370 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20 73   if( cp ){.    s
17380 70 72 69 6e 74 66 28 62 75 66 2c 22 25 2e 2a 73  printf(buf,"%.*s
17390 2e 6c 74 22 2c 28 69 6e 74 29 28 63 70 2d 6c 65  .lt",(int)(cp-le
173a0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c 6c 65  mp->filename),le
173b0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
173c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69   }else{.    spri
173d0 6e 74 66 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c  ntf(buf,"%s.lt",
173e0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
173f0 0a 20 20 7d 0a 20 20 69 66 28 20 61 63 63 65 73  .  }.  if( acces
17400 73 28 62 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b  s(buf,004)==0 ){
17410 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20  .    tpltname = 
17420 62 75 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  buf;.  }else if(
17430 20 61 63 63 65 73 73 28 74 65 6d 70 6c 61 74 65   access(template
17440 6e 61 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a  name,004)==0 ){.
17450 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74      tpltname = t
17460 65 6d 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d  emplatename;.  }
17470 65 6c 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61  else{.    tpltna
17480 6d 65 20 3d 20 70 61 74 68 73 65 61 72 63 68 28  me = pathsearch(
17490 6c 65 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70  lemp->argv0,temp
174a0 6c 61 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d  latename,0);.  }
174b0 0a 20 20 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d  .  if( tpltname=
174c0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
174d0 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
174e0 66 69 6e 64 20 74 68 65 20 70 61 72 73 65 72 20  find the parser 
174f0 64 72 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20  driver template 
17500 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c  file \"%s\".\n",
17510 0a 20 20 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d  .    templatenam
17520 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72  e);.    lemp->er
17530 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65  rorcnt++;.    re
17540 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e  turn 0;.  }.  in
17550 20 3d 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d   = fopen(tpltnam
17560 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  e,"rb");.  if( i
17570 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  n==0 ){.    fpri
17580 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27  ntf(stderr,"Can'
17590 74 20 6f 70 65 6e 20 74 68 65 20 74 65 6d 70 6c  t open the templ
175a0 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e  ate file \"%s\".
175b0 5c 6e 22 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65  \n",templatename
175c0 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  );.    lemp->err
175d0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
175e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
175f0 75 72 6e 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72  urn in;.}../* Pr
17600 69 6e 74 20 61 20 23 6c 69 6e 65 20 64 69 72 65  int a #line dire
17610 63 74 69 76 65 20 6c 69 6e 65 20 74 6f 20 74 68  ctive line to th
17620 65 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 2a  e output file. *
17630 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74  /.PRIVATE void t
17640 70 6c 74 5f 6c 69 6e 65 64 69 72 28 46 49 4c 45  plt_linedir(FILE
17650 20 2a 6f 75 74 2c 20 69 6e 74 20 6c 69 6e 65 6e   *out, int linen
17660 6f 2c 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  o, char *filenam
17670 65 29 0a 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f  e).{.  fprintf(o
17680 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 22  ut,"#line %d \""
17690 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 77 68 69 6c  ,lineno);.  whil
176a0 65 28 20 2a 66 69 6c 65 6e 61 6d 65 20 29 7b 0a  e( *filename ){.
176b0 20 20 20 20 69 66 28 20 2a 66 69 6c 65 6e 61 6d      if( *filenam
176c0 65 20 3d 3d 20 27 5c 5c 27 20 29 20 70 75 74 63  e == '\\' ) putc
176d0 28 27 5c 5c 27 2c 6f 75 74 29 3b 0a 20 20 20 20  ('\\',out);.    
176e0 70 75 74 63 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f  putc(*filename,o
176f0 75 74 29 3b 0a 20 20 20 20 66 69 6c 65 6e 61 6d  ut);.    filenam
17700 65 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  e++;.  }.  fprin
17710 74 66 28 6f 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a  tf(out,"\"\n");.
17720 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 74  }../* Print a st
17730 72 69 6e 67 20 74 6f 20 74 68 65 20 66 69 6c 65  ring to the file
17740 20 61 6e 64 20 6b 65 65 70 20 74 68 65 20 6c 69   and keep the li
17750 6e 65 6e 75 6d 62 65 72 20 75 70 20 74 6f 20 64  nenumber up to d
17760 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  ate */.PRIVATE v
17770 6f 69 64 20 74 70 6c 74 5f 70 72 69 6e 74 28 46  oid tplt_print(F
17780 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74  ILE *out, struct
17790 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 68   lemon *lemp, ch
177a0 61 72 20 2a 73 74 72 2c 20 69 6e 74 20 2a 6c 69  ar *str, int *li
177b0 6e 65 6e 6f 29 0a 7b 0a 20 20 69 66 28 20 73 74  neno).{.  if( st
177c0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
177d0 20 77 68 69 6c 65 28 20 2a 73 74 72 20 29 7b 0a   while( *str ){.
177e0 20 20 20 20 70 75 74 63 28 2a 73 74 72 2c 6f 75      putc(*str,ou
177f0 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 74 72  t);.    if( *str
17800 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e  =='\n' ) (*linen
17810 6f 29 2b 2b 3b 0a 20 20 20 20 73 74 72 2b 2b 3b  o)++;.    str++;
17820 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 5b 2d  .  }.  if( str[-
17830 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]!='\n' ){.    
17840 70 75 74 63 28 27 5c 6e 27 2c 6f 75 74 29 3b 0a  putc('\n',out);.
17850 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b      (*lineno)++;
17860 0a 20 20 7d 0a 20 20 69 66 20 28 21 6c 65 6d 70  .  }.  if (!lemp
17870 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29  ->nolinenosflag)
17880 20 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29   {.    (*lineno)
17890 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  ++; tplt_linedir
178a0 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d  (out,*lineno,lem
178b0 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 20  p->outname); .  
178c0 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
178d0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
178e0 6e 67 20 72 6f 75 74 69 6e 65 20 65 6d 69 74 73  ng routine emits
178f0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65   code for the de
17900 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
17910 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f  .** symbol sp.*/
17920 0a 76 6f 69 64 20 65 6d 69 74 5f 64 65 73 74 72  .void emit_destr
17930 75 63 74 6f 72 5f 63 6f 64 65 28 0a 20 20 46 49  uctor_code(.  FI
17940 4c 45 20 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63  LE *out,.  struc
17950 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20  t symbol *sp,.  
17960 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
17970 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e  mp,.  int *linen
17980 6f 0a 29 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d  o.){. char *cp =
17990 20 30 3b 0a 0a 20 69 66 28 20 73 70 2d 3e 74 79   0;.. if( sp->ty
179a0 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
179b0 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f     cp = lemp->to
179c0 6b 65 6e 64 65 73 74 3b 0a 20 20 20 69 66 28 20  kendest;.   if( 
179d0 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  cp==0 ) return;.
179e0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
179f0 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29  {\n"); (*lineno)
17a00 2b 2b 3b 0a 20 7d 65 6c 73 65 20 69 66 28 20 73  ++;. }else if( s
17a10 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 29 7b  p->destructor ){
17a20 0a 20 20 20 63 70 20 3d 20 73 70 2d 3e 64 65 73  .   cp = sp->des
17a30 74 72 75 63 74 6f 72 3b 0a 20 20 20 66 70 72 69  tructor;.   fpri
17a40 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20  ntf(out,"{\n"); 
17a50 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
17a60 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e  if (!lemp->nolin
17a70 65 6e 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69  enosflag) { (*li
17a80 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69  neno)++; tplt_li
17a90 6e 65 64 69 72 28 6f 75 74 2c 73 70 2d 3e 64 65  nedir(out,sp->de
17aa0 73 74 4c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 66  stLineno,lemp->f
17ab0 69 6c 65 6e 61 6d 65 29 3b 20 7d 0a 20 7d 65 6c  ilename); }. }el
17ac0 73 65 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72  se if( lemp->var
17ad0 64 65 73 74 20 29 7b 0a 20 20 20 63 70 20 3d 20  dest ){.   cp = 
17ae0 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20  lemp->vardest;. 
17af0 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65    if( cp==0 ) re
17b00 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66  turn;.   fprintf
17b10 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c  (out,"{\n"); (*l
17b20 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65  ineno)++;. }else
17b30 7b 0a 20 20 20 61 73 73 65 72 74 28 20 30 20 29  {.   assert( 0 )
17b40 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70  ;  /* Cannot hap
17b50 70 65 6e 20 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b  pen */. }. for(;
17b60 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20   *cp; cp++){.   
17b70 69 66 28 20 2a 63 70 3d 3d 27 24 27 20 26 26 20  if( *cp=='$' && 
17b80 63 70 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20  cp[1]=='$' ){.  
17b90 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
17ba0 28 79 79 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29  (yypminor->yy%d)
17bb0 22 2c 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20  ",sp->dtnum);.  
17bc0 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f     cp++;.     co
17bd0 6e 74 69 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20  ntinue;.   }.   
17be0 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20  if( *cp=='\n' ) 
17bf0 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
17c00 66 70 75 74 63 28 2a 63 70 2c 6f 75 74 29 3b 0a  fputc(*cp,out);.
17c10 20 7d 0a 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   }. fprintf(out,
17c20 22 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29  "\n"); (*lineno)
17c30 2b 2b 3b 0a 20 69 66 20 28 21 6c 65 6d 70 2d 3e  ++;. if (!lemp->
17c40 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b  nolinenosflag) {
17c50 20 0a 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b   .   (*lineno)++
17c60 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f  ; tplt_linedir(o
17c70 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d  ut,*lineno,lemp-
17c80 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 7d 0a 20  >outname); . }. 
17c90 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e  fprintf(out,"}\n
17ca0 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
17cb0 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  . return;.}../*.
17cc0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  ** Return TRUE (
17cd0 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68 65  non-zero) if the
17ce0 20 67 69 76 65 6e 20 73 79 6d 62 6f 6c 20 68 61   given symbol ha
17cf0 73 20 61 20 64 65 73 74 72 75 63 74 6f 72 2e 0a  s a destructor..
17d00 2a 2f 0a 69 6e 74 20 68 61 73 5f 64 65 73 74 72  */.int has_destr
17d10 75 63 74 6f 72 28 73 74 72 75 63 74 20 73 79 6d  uctor(struct sym
17d20 62 6f 6c 20 2a 73 70 2c 20 73 74 72 75 63 74 20  bol *sp, struct 
17d30 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
17d40 20 69 6e 74 20 72 65 74 3b 0a 20 20 69 66 28 20   int ret;.  if( 
17d50 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
17d60 41 4c 20 29 7b 0a 20 20 20 20 72 65 74 20 3d 20  AL ){.    ret = 
17d70 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 21  lemp->tokendest!
17d80 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
17d90 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 76 61 72   ret = lemp->var
17da0 64 65 73 74 21 3d 30 20 7c 7c 20 73 70 2d 3e 64  dest!=0 || sp->d
17db0 65 73 74 72 75 63 74 6f 72 21 3d 30 3b 0a 20 20  estructor!=0;.  
17dc0 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
17dd0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
17de0 74 65 78 74 20 74 6f 20 61 20 64 79 6e 61 6d 69  text to a dynami
17df0 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
17e00 73 74 72 69 6e 67 2e 20 20 49 66 20 7a 54 65 78  string.  If zTex
17e10 74 20 69 73 20 30 20 74 68 65 6e 0a 2a 2a 20 72  t is 0 then.** r
17e20 65 73 65 74 20 74 68 65 20 73 74 72 69 6e 67 20  eset the string 
17e30 74 6f 20 62 65 20 65 6d 70 74 79 20 61 67 61 69  to be empty agai
17e40 6e 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  n.  Always retur
17e50 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  n the complete t
17e60 65 78 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 74  ext.** of the st
17e70 72 69 6e 67 20 28 77 68 69 63 68 20 69 73 20 6f  ring (which is o
17e80 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20  verwritten with 
17e90 65 61 63 68 20 63 61 6c 6c 29 2e 0a 2a 2a 0a 2a  each call)..**.*
17ea0 2a 20 6e 20 62 79 74 65 73 20 6f 66 20 7a 54 65  * n bytes of zTe
17eb0 78 74 20 61 72 65 20 73 74 6f 72 65 64 2e 20 20  xt are stored.  
17ec0 49 66 20 6e 3d 3d 30 20 74 68 65 6e 20 61 6c 6c  If n==0 then all
17ed0 20 6f 66 20 7a 54 65 78 74 20 75 70 20 74 6f 20   of zText up to 
17ee0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 5c 30 30  the first.** \00
17ef0 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 69 73 20  0 terminator is 
17f00 73 74 6f 72 65 64 2e 20 20 7a 54 65 78 74 20 63  stored.  zText c
17f10 61 6e 20 63 6f 6e 74 61 69 6e 20 75 70 20 74 6f  an contain up to
17f20 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f   two instances o
17f30 66 0a 2a 2a 20 25 64 2e 20 20 54 68 65 20 76 61  f.** %d.  The va
17f40 6c 75 65 73 20 6f 66 20 70 31 20 61 6e 64 20 70  lues of p1 and p
17f50 32 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  2 are written in
17f60 74 6f 20 74 68 65 20 66 69 72 73 74 20 61 6e 64  to the first and
17f70 20 73 65 63 6f 6e 64 0a 2a 2a 20 25 64 2e 0a 2a   second.** %d..*
17f80 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 2d 31 2c 20 74  *.** If n==-1, t
17f90 68 65 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  hen the previous
17fa0 20 63 68 61 72 61 63 74 65 72 20 69 73 20 6f 76   character is ov
17fb0 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 50 52  erwritten..*/.PR
17fc0 49 56 41 54 45 20 63 68 61 72 20 2a 61 70 70 65  IVATE char *appe
17fd0 6e 64 5f 73 74 72 28 63 6f 6e 73 74 20 63 68 61  nd_str(const cha
17fe0 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 6e 2c  r *zText, int n,
17ff0 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
18000 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
18010 65 6d 70 74 79 5b 31 5d 20 3d 20 7b 20 30 20 7d  empty[1] = { 0 }
18020 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  ;.  static char 
18030 2a 7a 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  *z = 0;.  static
18040 20 69 6e 74 20 61 6c 6c 6f 63 65 64 20 3d 20 30   int alloced = 0
18050 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 75  ;.  static int u
18060 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  sed = 0;.  int c
18070 3b 0a 20 20 63 68 61 72 20 7a 49 6e 74 5b 34 30  ;.  char zInt[40
18080 5d 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d  ];.  if( zText==
18090 30 20 29 7b 0a 20 20 20 20 75 73 65 64 20 3d 20  0 ){.    used = 
180a0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 3b  0;.    return z;
180b0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 3d 30 20  .  }.  if( n<=0 
180c0 29 7b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29  ){.    if( n<0 )
180d0 7b 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20  {.      used += 
180e0 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
180f0 20 75 73 65 64 3e 3d 30 20 29 3b 0a 20 20 20 20   used>=0 );.    
18100 7d 0a 20 20 20 20 6e 20 3d 20 6c 65 6d 6f 6e 53  }.    n = lemonS
18110 74 72 6c 65 6e 28 7a 54 65 78 74 29 3b 0a 20 20  trlen(zText);.  
18120 7d 0a 20 20 69 66 28 20 28 69 6e 74 29 20 28 6e  }.  if( (int) (n
18130 2b 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 2b  +sizeof(zInt)*2+
18140 75 73 65 64 29 20 3e 3d 20 61 6c 6c 6f 63 65 64  used) >= alloced
18150 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 65 64 20   ){.    alloced 
18160 3d 20 6e 20 2b 20 73 69 7a 65 6f 66 28 7a 49 6e  = n + sizeof(zIn
18170 74 29 2a 32 20 2b 20 75 73 65 64 20 2b 20 32 30  t)*2 + used + 20
18180 30 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72  0;.    z = (char
18190 20 2a 29 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20   *) realloc(z,  
181a0 61 6c 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20  alloced);.  }.  
181b0 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
181c0 6e 20 65 6d 70 74 79 3b 0a 20 20 77 68 69 6c 65  n empty;.  while
181d0 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
181e0 20 63 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b   c = *(zText++);
181f0 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20  .    if( c=='%' 
18200 26 26 20 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b  && n>0 && zText[
18210 30 5d 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20  0]=='d' ){.     
18220 20 73 70 72 69 6e 74 66 28 7a 49 6e 74 2c 20 22   sprintf(zInt, "
18230 25 64 22 2c 20 70 31 29 3b 0a 20 20 20 20 20 20  %d", p1);.      
18240 70 31 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 73  p1 = p2;.      s
18250 74 72 63 70 79 28 26 7a 5b 75 73 65 64 5d 2c 20  trcpy(&z[used], 
18260 7a 49 6e 74 29 3b 0a 20 20 20 20 20 20 75 73 65  zInt);.      use
18270 64 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  d += lemonStrlen
18280 28 26 7a 5b 75 73 65 64 5d 29 3b 0a 20 20 20 20  (&z[used]);.    
18290 20 20 7a 54 65 78 74 2b 2b 3b 0a 20 20 20 20 20    zText++;.     
182a0 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   n--;.    }else{
182b0 0a 20 20 20 20 20 20 7a 5b 75 73 65 64 2b 2b 5d  .      z[used++]
182c0 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = c;.    }.  }.
182d0 20 20 7a 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20    z[used] = 0;. 
182e0 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
182f0 0a 2a 2a 20 7a 43 6f 64 65 20 69 73 20 61 20 73  .** zCode is a s
18300 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 74 68  tring that is th
18310 65 20 61 63 74 69 6f 6e 20 61 73 73 6f 63 69 61  e action associa
18320 74 65 64 20 77 69 74 68 20 61 20 72 75 6c 65 2e  ted with a rule.
18330 20 20 45 78 70 61 6e 64 0a 2a 2a 20 74 68 65 20    Expand.** the 
18340 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 69 73 20  symbols in this 
18350 73 74 72 69 6e 67 20 73 6f 20 74 68 61 74 20 74  string so that t
18360 68 65 20 72 65 66 65 72 20 74 6f 20 65 6c 65 6d  he refer to elem
18370 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 72 73  ents of the pars
18380 65 72 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a  er.** stack..*/.
18390 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 72 61  PRIVATE void tra
183a0 6e 73 6c 61 74 65 5f 63 6f 64 65 28 73 74 72 75  nslate_code(stru
183b0 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20  ct lemon *lemp, 
183c0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29  struct rule *rp)
183d0 7b 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 78  {.  char *cp, *x
183e0 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
183f0 61 72 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 20  ar lhsused = 0; 
18400 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
18410 65 20 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68 61  e LHS element ha
18420 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20  s been used */. 
18430 20 63 68 61 72 20 75 73 65 64 5b 4d 41 58 52 48   char used[MAXRH
18440 53 5d 3b 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  S];   /* True fo
18450 72 20 65 61 63 68 20 52 48 53 20 65 6c 65 6d 65  r each RHS eleme
18460 6e 74 20 77 68 69 63 68 20 69 73 20 75 73 65 64  nt which is used
18470 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */..  for(i=0; 
18480 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
18490 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20   used[i] = 0;.  
184a0 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  lhsused = 0;..  
184b0 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20  if( rp->code==0 
184c0 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68  ){.    static ch
184d0 61 72 20 6e 65 77 6c 69 6e 65 73 74 72 5b 32 5d  ar newlinestr[2]
184e0 20 3d 20 7b 20 27 5c 6e 27 2c 20 27 5c 30 27 20   = { '\n', '\0' 
184f0 7d 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20  };.    rp->code 
18500 3d 20 6e 65 77 6c 69 6e 65 73 74 72 3b 0a 20 20  = newlinestr;.  
18510 20 20 72 70 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d    rp->line = rp-
18520 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20 20 7d 0a 0a  >ruleline;.  }..
18530 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30    append_str(0,0
18540 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ,0,0);..  /* Thi
18550 73 20 63 6f 6e 73 74 20 63 61 73 74 20 69 73 20  s const cast is 
18560 77 72 6f 6e 67 20 62 75 74 20 68 61 72 6d 6c 65  wrong but harmle
18570 73 73 2c 20 69 66 20 77 65 27 72 65 20 63 61 72  ss, if we're car
18580 65 66 75 6c 2e 20 2a 2f 0a 20 20 66 6f 72 28 63  eful. */.  for(c
18590 70 3d 28 63 68 61 72 20 2a 29 72 70 2d 3e 63 6f  p=(char *)rp->co
185a0 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a  de; *cp; cp++){.
185b0 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28      if( isalpha(
185c0 2a 63 70 29 20 26 26 20 28 63 70 3d 3d 72 70 2d  *cp) && (cp==rp-
185d0 3e 63 6f 64 65 20 7c 7c 20 28 21 69 73 61 6c 6e  >code || (!isaln
185e0 75 6d 28 63 70 5b 2d 31 5d 29 20 26 26 20 63 70  um(cp[-1]) && cp
185f0 5b 2d 31 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20  [-1]!='_')) ){. 
18600 20 20 20 20 20 63 68 61 72 20 73 61 76 65 64 3b       char saved;
18610 0a 20 20 20 20 20 20 66 6f 72 28 78 70 3d 20 26  .      for(xp= &
18620 63 70 5b 31 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a  cp[1]; isalnum(*
18630 78 70 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b  xp) || *xp=='_';
18640 20 78 70 2b 2b 29 3b 0a 20 20 20 20 20 20 73 61   xp++);.      sa
18650 76 65 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20  ved = *xp;.     
18660 20 2a 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20   *xp = 0;.      
18670 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
18680 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70   && strcmp(cp,rp
18690 2d 3e 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20 29  ->lhsalias)==0 )
186a0 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
186b0 5f 73 74 72 28 22 79 79 67 6f 74 6f 6d 69 6e 6f  _str("yygotomino
186c0 72 2e 79 79 25 64 22 2c 30 2c 72 70 2d 3e 6c 68  r.yy%d",0,rp->lh
186d0 73 2d 3e 64 74 6e 75 6d 2c 30 29 3b 0a 20 20 20  s->dtnum,0);.   
186e0 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20       cp = xp;.  
186f0 20 20 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20        lhsused = 
18700 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
18710 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
18720 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
18730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
18740 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
18750 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70   && strcmp(cp,rp
18760 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d  ->rhsalias[i])==
18770 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
18780 20 69 66 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64   if( cp!=rp->cod
18790 65 20 26 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27  e && cp[-1]=='@'
187a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
187b0 20 20 2f 2a 20 49 66 20 74 68 65 20 61 72 67 75    /* If the argu
187c0 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
187d0 6f 72 6d 20 40 58 20 74 68 65 6e 20 73 75 62 73  orm @X then subs
187e0 74 69 74 75 74 65 64 0a 20 20 20 20 20 20 20 20  tituted.        
187f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b        ** the tok
18800 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20  en number of X, 
18810 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  not the value of
18820 20 58 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   X */.          
18830 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
18840 79 79 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22  yymsp[%d].major"
18850 2c 2d 31 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  ,-1,i-rp->nrhs+1
18860 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,0);.           
18870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18880 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
18890 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68  bol *sp = rp->rh
188a0 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  s[i];.          
188b0 20 20 20 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20      int dtnum;. 
188c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
188d0 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
188e0 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
188f0 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e 75              dtnu
18900 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30  m = sp->subsym[0
18910 5d 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20  ]->dtnum;.      
18920 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
18930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
18940 74 6e 75 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d  tnum = sp->dtnum
18950 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
18960 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
18970 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73  append_str("yyms
18980 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64  p[%d].minor.yy%d
18990 22 2c 30 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  ",0,i-rp->nrhs+1
189a0 2c 20 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  , dtnum);.      
189b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
189c0 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20      cp = xp;.   
189d0 20 20 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d           used[i]
189e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
189f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
18a00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
18a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 78 70       }.      *xp
18a20 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a   = saved;.    }.
18a30 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 63      append_str(c
18a40 70 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  p, 1, 0, 0);.  }
18a50 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a   /* End loop */.
18a60 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  /* Check to m
18a70 61 6b 65 20 73 75 72 65 20 74 68 65 20 4c 48 53  ake sure the LHS
18a80 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a   has been used *
18a90 2f 0a 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61  /.  if( rp->lhsa
18aa0 6c 69 61 73 20 26 26 20 21 6c 68 73 75 73 65 64  lias && !lhsused
18ab0 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67   ){.    ErrorMsg
18ac0 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
18ad0 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20  rp->ruleline,.  
18ae0 20 20 20 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c      "Label \"%s\
18af0 22 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22  " for \"%s(%s)\"
18b00 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22   is never used."
18b10 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68  ,.        rp->lh
18b20 73 61 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e  salias,rp->lhs->
18b30 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  name,rp->lhsalia
18b40 73 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72  s);.    lemp->er
18b50 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20  rorcnt++;.  }.. 
18b60 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 64 65 73   /* Generate des
18b70 74 72 75 63 74 6f 72 20 63 6f 64 65 20 66 6f 72  tructor code for
18b80 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 68 69   RHS symbols whi
18b90 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ch are not used 
18ba0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 72 65 64 75  in the.  ** redu
18bb0 63 65 20 63 6f 64 65 20 2a 2f 0a 20 20 66 6f 72  ce code */.  for
18bc0 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
18bd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
18be0 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20  rp->rhsalias[i] 
18bf0 26 26 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20  && !used[i] ){. 
18c00 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
18c10 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
18c20 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20  >ruleline,.     
18c30 20 20 20 22 4c 61 62 65 6c 20 25 73 20 66 6f 72     "Label %s for
18c40 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e   \"%s(%s)\" is n
18c50 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20  ever used.",.   
18c60 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61       rp->rhsalia
18c70 73 5b 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d  s[i],rp->rhs[i]-
18c80 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69  >name,rp->rhsali
18c90 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 6c 65  as[i]);.      le
18ca0 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
18cb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70      }else if( rp
18cc0 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 3d 3d 30  ->rhsalias[i]==0
18cd0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61   ){.      if( ha
18ce0 73 5f 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d  s_destructor(rp-
18cf0 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b  >rhs[i],lemp) ){
18d00 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f  .        append_
18d10 73 74 72 28 22 20 20 79 79 5f 64 65 73 74 72 75  str("  yy_destru
18d20 63 74 6f 72 28 79 79 70 50 61 72 73 65 72 2c 25  ctor(yypParser,%
18d30 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e  d,&yymsp[%d].min
18d40 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20  or);\n", 0,.    
18d50 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69         rp->rhs[i
18d60 5d 2d 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e  ]->index,i-rp->n
18d70 72 68 73 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  rhs+1);.      }e
18d80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
18d90 4e 6f 20 64 65 73 74 72 75 63 74 6f 72 20 64 65  No destructor de
18da0 66 69 6e 65 64 20 66 6f 72 20 74 68 69 73 20 74  fined for this t
18db0 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  erm */.      }. 
18dc0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
18dd0 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20 63  p->code ){.    c
18de0 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72 28 30  p = append_str(0
18df0 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 72 70 2d  ,0,0,0);.    rp-
18e00 3e 63 6f 64 65 20 3d 20 53 74 72 73 61 66 65 28  >code = Strsafe(
18e10 63 70 3f 63 70 3a 22 22 29 3b 0a 20 20 7d 0a 7d  cp?cp:"");.  }.}
18e20 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74  ../* .** Generat
18e30 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
18e40 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 72  cutes when the r
18e50 75 6c 65 20 22 72 70 22 20 69 73 20 72 65 64 75  ule "rp" is redu
18e60 63 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74  ced.  Write.** t
18e70 68 65 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22  he code to "out"
18e80 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e  .  Make sure lin
18e90 65 6e 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d  eno stays up-to-
18ea0 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  date..*/.PRIVATE
18eb0 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28   void emit_code(
18ec0 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20 20  .  FILE *out,.  
18ed0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
18ee0 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
18ef0 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c 69  *lemp,.  int *li
18f00 6e 65 6e 6f 0a 29 7b 0a 20 63 6f 6e 73 74 20 63  neno.){. const c
18f10 68 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a 20 47 65  har *cp;.. /* Ge
18f20 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64  nerate code to d
18f30 6f 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74  o the reduce act
18f40 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e  ion */. if( rp->
18f50 63 6f 64 65 20 29 7b 0a 20 20 20 69 66 20 28 21  code ){.   if (!
18f60 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66  lemp->nolinenosf
18f70 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29  lag) { (*lineno)
18f80 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  ++; tplt_linedir
18f90 28 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65  (out,rp->line,le
18fa0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 20 7d  mp->filename); }
18fb0 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
18fc0 22 7b 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b  "{%s",rp->code);
18fd0 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63  .   for(cp=rp->c
18fe0 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b  ode; *cp; cp++){
18ff0 0a 20 20 20 20 20 69 66 28 20 2a 63 70 3d 3d 27  .     if( *cp=='
19000 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n' ) (*lineno)+
19010 2b 3b 0a 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c  +;.   } /* End l
19020 6f 6f 70 20 2a 2f 0a 20 20 20 66 70 72 69 6e 74  oop */.   fprint
19030 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a  f(out,"}\n"); (*
19040 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66  lineno)++;.   if
19050 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e   (!lemp->nolinen
19060 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65  osflag) { (*line
19070 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65  no)++; tplt_line
19080 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c  dir(out,*lineno,
19090 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20  lemp->outname); 
190a0 7d 0a 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20  }. } /* End if( 
190b0 72 70 2d 3e 63 6f 64 65 20 29 20 2a 2f 0a 0a 20  rp->code ) */.. 
190c0 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
190d0 20 50 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e   Print the defin
190e0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69  ition of the uni
190f0 6f 6e 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  on used for the 
19100 70 61 72 73 65 72 27 73 20 64 61 74 61 20 73 74  parser's data st
19110 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69  ack..** This uni
19120 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c  on contains fiel
19130 64 73 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73  ds for every pos
19140 73 69 62 6c 65 20 64 61 74 61 20 74 79 70 65 20  sible data type 
19150 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e  for tokens.** an
19160 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20  d nonterminals. 
19170 20 49 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20   In the process 
19180 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64  of computing and
19190 20 70 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a   printing this.*
191a0 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65  * union, also se
191b0 74 20 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66  t the ".dtnum" f
191c0 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65  ield of every te
191d0 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65  rminal and nonte
191e0 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c  rminal.** symbol
191f0 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f  ..*/.void print_
19200 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 0a 20 20 46  stack_union(.  F
19210 49 4c 45 20 2a 6f 75 74 2c 20 20 20 20 20 20 20  ILE *out,       
19220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19230 65 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20  e output stream 
19240 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  */.  struct lemo
19250 6e 20 2a 6c 65 6d 70 2c 20 20 20 20 20 20 20 20  n *lemp,        
19260 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66   /* The main inf
19270 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  o structure for 
19280 74 68 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 20  this parser */. 
19290 20 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 2c 20 20   int *plineno,  
192a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
192b0 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c  Pointer to the l
192c0 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ine number */.  
192d0 69 6e 74 20 6d 68 66 6c 61 67 20 20 20 20 20 20  int mhflag      
192e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
192f0 72 75 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e  rue if generatin
19300 67 20 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75  g makeheaders ou
19310 74 70 75 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tput */.){.  int
19320 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65   lineno = *pline
19330 6e 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69  no;    /* The li
19340 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ne number of the
19350 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61   output */.  cha
19360 72 20 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20  r **types;      
19370 20 20 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68         /* A hash
19380 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79   table of dataty
19390 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72  pes */.  int arr
193a0 61 79 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  aysize;         
193b0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
193c0 65 20 22 74 79 70 65 73 22 20 61 72 72 61 79 20  e "types" array 
193d0 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65  */.  int maxdtle
193e0 6e 67 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f  ngth;          /
193f0 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68  * Maximum length
19400 20 6f 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79   of any ".dataty
19410 70 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  pe" field. */.  
19420 63 68 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20  char *stddt;    
19430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
19440 6e 64 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66  ndardized name f
19450 6f 72 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f  or a datatype */
19460 0a 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20  .  int i,j;     
19470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19480 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
19490 0a 20 20 69 6e 74 20 68 61 73 68 3b 20 20 20 20  .  int hash;    
194a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
194b0 46 6f 72 20 68 61 73 68 69 6e 67 20 74 68 65 20  For hashing the 
194c0 6e 61 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a  name of a type *
194d0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
194e0 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  name;         /*
194f0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72   Name of the par
19500 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ser */..  /* All
19510 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
19520 6c 69 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64  lize types[] and
19530 20 61 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b   allocate stddt[
19540 5d 20 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65  ] */.  arraysize
19550 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   = lemp->nsymbol
19560 20 2a 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20   * 2;.  types = 
19570 28 63 68 61 72 2a 2a 29 63 61 6c 6c 6f 63 28 20  (char**)calloc( 
19580 61 72 72 61 79 73 69 7a 65 2c 20 73 69 7a 65 6f  arraysize, sizeo
19590 66 28 63 68 61 72 2a 29 20 29 3b 0a 20 20 69 66  f(char*) );.  if
195a0 28 20 74 79 70 65 73 3d 3d 30 20 29 7b 0a 20 20  ( types==0 ){.  
195b0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
195c0 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  ,"Out of memory.
195d0 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
195e0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
195f0 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69  ; i<arraysize; i
19600 2b 2b 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30  ++) types[i] = 0
19610 3b 0a 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20  ;.  maxdtlength 
19620 3d 20 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  = 0;.  if( lemp-
19630 3e 76 61 72 74 79 70 65 20 29 7b 0a 20 20 20 20  >vartype ){.    
19640 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65  maxdtlength = le
19650 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e  monStrlen(lemp->
19660 76 61 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20  vartype);.  }.  
19670 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
19680 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
19690 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
196a0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
196b0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
196c0 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73  ls[i];.    if( s
196d0 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29  p->datatype==0 )
196e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c   continue;.    l
196f0 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  en = lemonStrlen
19700 28 73 70 2d 3e 64 61 74 61 74 79 70 65 29 3b 0a  (sp->datatype);.
19710 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 64      if( len>maxd
19720 74 6c 65 6e 67 74 68 20 29 20 6d 61 78 64 74 6c  tlength ) maxdtl
19730 65 6e 67 74 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d  ength = len;.  }
19740 0a 20 20 73 74 64 64 74 20 3d 20 28 63 68 61 72  .  stddt = (char
19750 2a 29 6d 61 6c 6c 6f 63 28 20 6d 61 78 64 74 6c  *)malloc( maxdtl
19760 65 6e 67 74 68 2a 32 20 2b 20 31 20 29 3b 0a 20  ength*2 + 1 );. 
19770 20 69 66 28 20 73 74 64 64 74 3d 3d 30 20 29 7b   if( stddt==0 ){
19780 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
19790 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f  err,"Out of memo
197a0 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ry.\n");.    exi
197b0 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  t(1);.  }..  /* 
197c0 42 75 69 6c 64 20 61 20 68 61 73 68 20 74 61 62  Build a hash tab
197d0 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e  le of datatypes.
197e0 20 54 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69   The ".dtnum" fi
197f0 65 6c 64 20 6f 66 20 65 61 63 68 20 73 79 6d 62  eld of each symb
19800 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c 65  ol.  ** is fille
19810 64 20 69 6e 20 77 69 74 68 20 74 68 65 20 68 61  d in with the ha
19820 73 68 20 69 6e 64 65 78 20 70 6c 75 73 20 31 2e  sh index plus 1.
19830 20 20 41 20 22 2e 64 74 6e 75 6d 22 20 76 61 6c    A ".dtnum" val
19840 75 65 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a 20  ue of 0 is.  ** 
19850 75 73 65 64 20 66 6f 72 20 74 65 72 6d 69 6e 61  used for termina
19860 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66 20 74  l symbols.  If t
19870 68 65 72 65 20 69 73 20 6e 6f 20 25 64 65 66 61  here is no %defa
19880 75 6c 74 5f 74 79 70 65 20 64 65 66 69 6e 65 64  ult_type defined
19890 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69 73 20   then.  ** 0 is 
198a0 61 6c 73 6f 20 75 73 65 64 20 61 73 20 74 68 65  also used as the
198b0 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20 66 6f   .dtnum value fo
198c0 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77  r nonterminals w
198d0 68 69 63 68 20 64 6f 20 6e 6f 74 20 73 70 65 63  hich do not spec
198e0 69 66 79 0a 20 20 2a 2a 20 61 20 64 61 74 61 74  ify.  ** a datat
198f0 79 70 65 20 75 73 69 6e 67 20 74 68 65 20 25 74  ype using the %t
19900 79 70 65 20 64 69 72 65 63 74 69 76 65 2e 0a 20  ype directive.. 
19910 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
19920 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
19930 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
19940 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65   symbol *sp = le
19950 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
19960 20 20 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20      char *cp;.  
19970 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e    if( sp==lemp->
19980 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20  errsym ){.      
19990 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72 72 61  sp->dtnum = arra
199a0 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20 20 63  ysize+1;.      c
199b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
199c0 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21     if( sp->type!
199d0 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20  =NONTERMINAL || 
199e0 28 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30  (sp->datatype==0
199f0 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70   && lemp->vartyp
19a00 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  e==0) ){.      s
19a10 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20  p->dtnum = 0;.  
19a20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
19a30 20 20 7d 0a 20 20 20 20 63 70 20 3d 20 73 70 2d    }.    cp = sp-
19a40 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20 69  >datatype;.    i
19a50 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20  f( cp==0 ) cp = 
19a60 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b 0a 20  lemp->vartype;. 
19a70 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77 68     j = 0;.    wh
19a80 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 63 70  ile( isspace(*cp
19a90 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77 68  ) ) cp++;.    wh
19aa0 69 6c 65 28 20 2a 63 70 20 29 20 73 74 64 64 74  ile( *cp ) stddt
19ab0 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20  [j++] = *cp++;. 
19ac0 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26     while( j>0 &&
19ad0 20 69 73 73 70 61 63 65 28 73 74 64 64 74 5b 6a   isspace(stddt[j
19ae0 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20 20  -1]) ) j--;.    
19af0 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20  stddt[j] = 0;.  
19b00 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65    if( lemp->toke
19b10 6e 74 79 70 65 20 26 26 20 73 74 72 63 6d 70 28  ntype && strcmp(
19b20 73 74 64 64 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b  stddt, lemp->tok
19b30 65 6e 74 79 70 65 29 3d 3d 30 20 29 7b 0a 20 20  entype)==0 ){.  
19b40 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
19b50 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
19b60 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73  e;.    }.    has
19b70 68 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a  h = 0;.    for(j
19b80 3d 30 3b 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b  =0; stddt[j]; j+
19b90 2b 29 7b 0a 20 20 20 20 20 20 68 61 73 68 20 3d  +){.      hash =
19ba0 20 68 61 73 68 2a 35 33 20 2b 20 73 74 64 64 74   hash*53 + stddt
19bb0 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  [j];.    }.    h
19bc0 61 73 68 20 3d 20 28 68 61 73 68 20 26 20 30 78  ash = (hash & 0x
19bd0 37 66 66 66 66 66 66 66 29 25 61 72 72 61 79 73  7fffffff)%arrays
19be0 69 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ize;.    while( 
19bf0 74 79 70 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20  types[hash] ){. 
19c00 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
19c10 74 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64  types[hash],stdd
19c20 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)==0 ){.       
19c30 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73   sp->dtnum = has
19c40 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 62  h + 1;.        b
19c50 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
19c60 20 20 20 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20      hash++;.    
19c70 20 20 69 66 28 20 68 61 73 68 3e 3d 61 72 72 61    if( hash>=arra
19c80 79 73 69 7a 65 20 29 20 68 61 73 68 20 3d 20 30  ysize ) hash = 0
19c90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19ca0 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29  types[hash]==0 )
19cb0 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75  {.      sp->dtnu
19cc0 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20  m = hash + 1;.  
19cd0 20 20 20 20 74 79 70 65 73 5b 68 61 73 68 5d 20      types[hash] 
19ce0 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28  = (char*)malloc(
19cf0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 74 64   lemonStrlen(std
19d00 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20 20 69  dt)+1 );.      i
19d10 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d  f( types[hash]==
19d20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
19d30 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74  intf(stderr,"Out
19d40 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b   of memory.\n");
19d50 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29  .        exit(1)
19d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19d70 73 74 72 63 70 79 28 74 79 70 65 73 5b 68 61 73  strcpy(types[has
19d80 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20 20 7d  h],stddt);.    }
19d90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74  .  }..  /* Print
19da0 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e 69 74   out the definit
19db0 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54 59  ion of YYTOKENTY
19dc0 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54 59  PE and YYMINORTY
19dd0 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c  PE */.  name = l
19de0 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70  emp->name ? lemp
19df0 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22  ->name : "Parse"
19e00 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c  ;.  lineno = *pl
19e10 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68 66  ineno;.  if( mhf
19e20 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  lag ){ fprintf(o
19e30 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
19e40 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
19e50 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
19e60 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f 4b 45  ,"#define %sTOKE
19e70 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d 65  NTYPE %s\n",name
19e80 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65  ,.    lemp->toke
19e90 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65  ntype?lemp->toke
19ea0 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b 20  ntype:"void*"); 
19eb0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28   lineno++;.  if(
19ec0 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e   mhflag ){ fprin
19ed0 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e  tf(out,"#endif\n
19ee0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a  "); lineno++; }.
19ef0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 74    fprintf(out,"t
19f00 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e  ypedef union {\n
19f10 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
19f20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69  fprintf(out,"  i
19f30 6e 74 20 79 79 69 6e 69 74 3b 5c 6e 22 29 3b 20  nt yyinit;\n"); 
19f40 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
19f50 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 54 4f 4b  ntf(out,"  %sTOK
19f60 45 4e 54 59 50 45 20 79 79 30 3b 5c 6e 22 2c 6e  ENTYPE yy0;\n",n
19f70 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
19f80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72    for(i=0; i<arr
19f90 61 79 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  aysize; i++){.  
19fa0 20 20 69 66 28 20 74 79 70 65 73 5b 69 5d 3d 3d    if( types[i]==
19fb0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
19fc0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
19fd0 20 25 73 20 79 79 25 64 3b 5c 6e 22 2c 74 79 70   %s yy%d;\n",typ
19fe0 65 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65  es[i],i+1); line
19ff0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 74  no++;.    free(t
1a000 79 70 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  ypes[i]);.  }.  
1a010 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  if( lemp->errsym
1a020 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20  ->useCnt ){.    
1a030 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69  fprintf(out,"  i
1a040 6e 74 20 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70  nt yy%d;\n",lemp
1a050 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29  ->errsym->dtnum)
1a060 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1a070 20 20 66 72 65 65 28 73 74 64 64 74 29 3b 0a 20    free(stddt);. 
1a080 20 66 72 65 65 28 74 79 70 65 73 29 3b 0a 20 20   free(types);.  
1a090 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20 59  fprintf(out,"} Y
1a0a0 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29 3b  YMINORTYPE;\n");
1a0b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c   lineno++;.  *pl
1a0c0 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a  ineno = lineno;.
1a0d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a0e0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 43 20  the name of a C 
1a0f0 64 61 74 61 74 79 70 65 20 61 62 6c 65 20 74 6f  datatype able to
1a100 20 72 65 70 72 65 73 65 6e 74 20 76 61 6c 75 65   represent value
1a110 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c 77 72  s between.** lwr
1a120 20 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c 75 73   and upr, inclus
1a130 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ive..*/.static c
1a140 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d  onst char *minim
1a150 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74  um_size_type(int
1a160 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 29 7b 0a   lwr, int upr){.
1a170 20 20 69 66 28 20 6c 77 72 3e 3d 30 20 29 7b 0a    if( lwr>=0 ){.
1a180 20 20 20 20 69 66 28 20 75 70 72 3c 3d 32 35 35      if( upr<=255
1a190 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1a1a0 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61 72 22   "unsigned char"
1a1b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1a1c0 75 70 72 3c 36 35 35 33 35 20 29 7b 0a 20 20 20  upr<65535 ){.   
1a1d0 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67     return "unsig
1a1e0 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 22 3b 0a  ned short int";.
1a1f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a200 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65   return "unsigne
1a210 64 20 69 6e 74 22 3b 0a 20 20 20 20 7d 0a 20 20  d int";.    }.  
1a220 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d  }else if( lwr>=-
1a230 31 32 37 20 26 26 20 75 70 72 3c 3d 31 32 37 20  127 && upr<=127 
1a240 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 73  ){.    return "s
1a250 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20 7d  igned char";.  }
1a260 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d 33  else if( lwr>=-3
1a270 32 37 36 37 20 26 26 20 75 70 72 3c 33 32 37 36  2767 && upr<3276
1a280 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  7 ){.    return 
1a290 22 73 68 6f 72 74 22 3b 0a 20 20 7d 65 6c 73 65  "short";.  }else
1a2a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 69 6e  {.    return "in
1a2b0 74 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t";.  }.}../*.**
1a2c0 20 45 61 63 68 20 73 74 61 74 65 20 63 6f 6e 74   Each state cont
1a2d0 61 69 6e 73 20 61 20 73 65 74 20 6f 66 20 74 6f  ains a set of to
1a2e0 6b 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ken transaction 
1a2f0 61 6e 64 20 61 20 73 65 74 20 6f 66 0a 2a 2a 20  and a set of.** 
1a300 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74 72 61 6e  nonterminal tran
1a310 73 61 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20  sactions.  Each 
1a320 6f 66 20 74 68 65 73 65 20 73 65 74 73 20 6d 61  of these sets ma
1a330 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a  kes an instance.
1a340 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
1a350 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
1a360 41 6e 20 61 72 72 61 79 20 6f 66 20 74 68 65 73  An array of thes
1a370 65 20 73 74 72 75 63 74 75 72 65 73 20 69 73 20  e structures is 
1a380 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72 64 65 72  used.** to order
1a390 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
1a3a0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1a3b0 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c  yy_action[] tabl
1a3c0 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 61 78 73  e..*/.struct axs
1a3d0 65 74 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74  et {.  struct st
1a3e0 61 74 65 20 2a 73 74 70 3b 20 20 20 2f 2a 20 41  ate *stp;   /* A
1a3f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
1a400 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  ate */.  int isT
1a410 6b 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  kn;           /*
1a420 20 54 72 75 65 20 74 6f 20 75 73 65 20 74 6f 6b   True to use tok
1a430 65 6e 73 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ens.  False for 
1a440 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 2a 2f  non-terminals */
1a450 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20  .  int nAction; 
1a460 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a470 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 2a 2f 0a  r of actions */.
1a480 20 20 69 6e 74 20 69 4f 72 64 65 72 3b 20 20 20    int iOrder;   
1a490 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
1a4a0 61 6c 20 6f 72 64 65 72 20 6f 66 20 61 63 74 69  al order of acti
1a4b0 6f 6e 20 73 65 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  on sets */.};../
1a4c0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 6f 20  *.** Compare to 
1a4d0 61 78 73 65 74 20 73 74 72 75 63 74 75 72 65 73  axset structures
1a4e0 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72   for sorting pur
1a4f0 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  poses.*/.static 
1a500 69 6e 74 20 61 78 73 65 74 5f 63 6f 6d 70 61 72  int axset_compar
1a510 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c  e(const void *a,
1a520 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b   const void *b){
1a530 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20  .  struct axset 
1a540 2a 70 31 20 3d 20 28 73 74 72 75 63 74 20 61 78  *p1 = (struct ax
1a550 73 65 74 2a 29 61 3b 0a 20 20 73 74 72 75 63 74  set*)a;.  struct
1a560 20 61 78 73 65 74 20 2a 70 32 20 3d 20 28 73 74   axset *p2 = (st
1a570 72 75 63 74 20 61 78 73 65 74 2a 29 62 3b 0a 20  ruct axset*)b;. 
1a580 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 70 32   int c;.  c = p2
1a590 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31 2d 3e  ->nAction - p1->
1a5a0 6e 41 63 74 69 6f 6e 3b 0a 20 20 69 66 28 20 63  nAction;.  if( c
1a5b0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 70  ==0 ){.    c = p
1a5c0 32 2d 3e 69 4f 72 64 65 72 20 2d 20 70 31 2d 3e  2->iOrder - p1->
1a5d0 69 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 61 73  iOrder;.  }.  as
1a5e0 73 65 72 74 28 20 63 21 3d 30 20 7c 7c 20 70 31  sert( c!=0 || p1
1a5f0 3d 3d 70 32 20 29 3b 0a 20 20 72 65 74 75 72 6e  ==p2 );.  return
1a600 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69   c;.}../*.** Wri
1a610 74 65 20 74 65 78 74 20 6f 6e 20 22 6f 75 74 22  te text on "out"
1a620 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1a630 74 68 65 20 72 75 6c 65 20 22 72 70 22 2e 0a 2a  the rule "rp"..*
1a640 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 72  /.static void wr
1a650 69 74 65 52 75 6c 65 54 65 78 74 28 46 49 4c 45  iteRuleText(FILE
1a660 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 72 75   *out, struct ru
1a670 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e 74 20 6a  le *rp){.  int j
1a680 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1a690 22 25 73 20 3a 3a 3d 22 2c 20 72 70 2d 3e 6c 68  "%s ::=", rp->lh
1a6a0 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  s->name);.  for(
1a6b0 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b  j=0; j<rp->nrhs;
1a6c0 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   j++){.    struc
1a6d0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72  t symbol *sp = r
1a6e0 70 2d 3e 72 68 73 5b 6a 5d 3b 0a 20 20 20 20 66  p->rhs[j];.    f
1a6f0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22  printf(out," %s"
1a700 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  , sp->name);.   
1a710 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d   if( sp->type==M
1a720 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
1a730 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
1a740 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 73 70     for(k=1; k<sp
1a750 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b  ->nsubsym; k++){
1a760 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1a770 28 6f 75 74 2c 22 7c 25 73 22 2c 73 70 2d 3e 73  (out,"|%s",sp->s
1a780 75 62 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65 29 3b  ubsym[k]->name);
1a790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a7a0 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72 61   }.}.../* Genera
1a7b0 74 65 20 43 20 73 6f 75 72 63 65 20 63 6f 64 65  te C source code
1a7c0 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20   for the parser 
1a7d0 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61  */.void ReportTa
1a7e0 62 6c 65 28 0a 20 20 73 74 72 75 63 74 20 6c 65  ble(.  struct le
1a7f0 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74  mon *lemp,.  int
1a800 20 6d 68 66 6c 61 67 20 20 20 20 20 2f 2a 20 4f   mhflag     /* O
1a810 75 74 70 75 74 20 69 6e 20 6d 61 6b 65 68 65 61  utput in makehea
1a820 64 65 72 73 20 66 6f 72 6d 61 74 20 69 66 20 74  ders format if t
1a830 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 46 49 4c 45  rue */.){.  FILE
1a840 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68   *out, *in;.  ch
1a850 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45  ar line[LINESIZE
1a860 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e 6f  ];.  int  lineno
1a870 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
1a880 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
1a890 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74  action *ap;.  st
1a8a0 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
1a8b0 20 73 74 72 75 63 74 20 61 63 74 74 61 62 20 2a   struct acttab *
1a8c0 70 41 63 74 74 61 62 3b 0a 20 20 69 6e 74 20 69  pActtab;.  int i
1a8d0 2c 20 6a 2c 20 6e 3b 0a 20 20 63 6f 6e 73 74 20  , j, n;.  const 
1a8e0 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e  char *name;.  in
1a8f0 74 20 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6d 78 54  t mnTknOfst, mxT
1a900 6b 6e 4f 66 73 74 3b 0a 20 20 69 6e 74 20 6d 6e  knOfst;.  int mn
1a910 4e 74 4f 66 73 74 2c 20 6d 78 4e 74 4f 66 73 74  NtOfst, mxNtOfst
1a920 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74  ;.  struct axset
1a930 20 2a 61 78 3b 0a 0a 20 20 69 6e 20 3d 20 74 70   *ax;..  in = tp
1a940 6c 74 5f 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a 20  lt_open(lemp);. 
1a950 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74   if( in==0 ) ret
1a960 75 72 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 69 6c  urn;.  out = fil
1a970 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 63 22  e_open(lemp,".c"
1a980 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75  ,"wb");.  if( ou
1a990 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f  t==0 ){.    fclo
1a9a0 73 65 28 69 6e 29 3b 0a 20 20 20 20 72 65 74 75  se(in);.    retu
1a9b0 72 6e 3b 0a 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f  rn;.  }.  lineno
1a9c0 20 3d 20 31 3b 0a 20 20 74 70 6c 74 5f 78 66 65   = 1;.  tplt_xfe
1a9d0 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1a9e0 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1a9f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
1aa00 20 69 6e 63 6c 75 64 65 20 63 6f 64 65 2c 20 69   include code, i
1aa10 66 20 61 6e 79 20 2a 2f 0a 20 20 74 70 6c 74 5f  f any */.  tplt_
1aa20 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
1aa30 65 6d 70 2d 3e 69 6e 63 6c 75 64 65 2c 26 6c 69  emp->include,&li
1aa40 6e 65 6e 6f 29 3b 0a 20 20 69 66 28 20 6d 68 66  neno);.  if( mhf
1aa50 6c 61 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20  lag ){.    char 
1aa60 2a 6e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b  *name = file_mak
1aa70 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 22 2e 68 22  ename(lemp, ".h"
1aa80 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1aa90 75 74 2c 22 23 69 6e 63 6c 75 64 65 20 5c 22 25  ut,"#include \"%
1aaa0 73 5c 22 5c 6e 22 2c 20 6e 61 6d 65 29 3b 20 6c  s\"\n", name); l
1aab0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65  ineno++;.    fre
1aac0 65 28 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 74  e(name);.  }.  t
1aad0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1aae0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1aaf0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1ab00 61 74 65 20 23 64 65 66 69 6e 65 73 20 66 6f 72  ate #defines for
1ab10 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20   all tokens */. 
1ab20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
1ab30 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
1ab40 72 65 66 69 78 3b 0a 20 20 20 20 66 70 72 69 6e  refix;.    fprin
1ab50 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45  tf(out,"#if INTE
1ab60 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e  RFACE\n"); linen
1ab70 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d  o++;.    if( lem
1ab80 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29  p->tokenprefix )
1ab90 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e   prefix = lemp->
1aba0 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 20  tokenprefix;.   
1abb0 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20   else           
1abc0 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20           prefix 
1abd0 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = "";.    for(i=
1abe0 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  1; i<lemp->nterm
1abf0 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  inal; i++){.    
1ac00 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1ac10 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25  define %s%-30s %
1ac20 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d  2d\n",prefix,lem
1ac30 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
1ac40 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 6c 69  ame,i);.      li
1ac50 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
1ac60 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1ac70 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e  endif\n"); linen
1ac80 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
1ac90 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1aca0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1acb0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1acc0 74 68 65 20 64 65 66 69 6e 65 73 20 2a 2f 0a 20  the defines */. 
1acd0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1ace0 65 66 69 6e 65 20 59 59 43 4f 44 45 54 59 50 45  efine YYCODETYPE
1acf0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69   %s\n",.    mini
1ad00 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c  mum_size_type(0,
1ad10 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31   lemp->nsymbol+1
1ad20 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  )); lineno++;.  
1ad30 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1ad40 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20 25 64  fine YYNOCODE %d
1ad50 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  \n",lemp->nsymbo
1ad60 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  l+1);  lineno++;
1ad70 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1ad80 23 64 65 66 69 6e 65 20 59 59 41 43 54 49 4f 4e  #define YYACTION
1ad90 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20  TYPE %s\n",.    
1ada0 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
1adb0 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  e(0, lemp->nstat
1adc0 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2b 35 29  e+lemp->nrule+5)
1add0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1ade0 69 66 28 20 6c 65 6d 70 2d 3e 77 69 6c 64 63 61  if( lemp->wildca
1adf0 72 64 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  rd ){.    fprint
1ae00 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1ae10 59 57 49 4c 44 43 41 52 44 20 25 64 5c 6e 22 2c  YWILDCARD %d\n",
1ae20 0a 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 77 69  .       lemp->wi
1ae30 6c 64 63 61 72 64 2d 3e 69 6e 64 65 78 29 3b 20  ldcard->index); 
1ae40 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1ae50 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f  print_stack_unio
1ae60 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e 65  n(out,lemp,&line
1ae70 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20 66 70  no,mhflag);.  fp
1ae80 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 69 66 6e  rintf(out, "#ifn
1ae90 64 65 66 20 59 59 53 54 41 43 4b 44 45 50 54 48  def YYSTACKDEPTH
1aea0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1aeb0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 63    if( lemp->stac
1aec0 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20 66 70 72  ksize ){.    fpr
1aed0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1aee0 65 20 59 59 53 54 41 43 4b 44 45 50 54 48 20 25  e YYSTACKDEPTH %
1aef0 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61 63 6b  s\n",lemp->stack
1af00 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  size);  lineno++
1af10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
1af20 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1af30 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48  ine YYSTACKDEPTH
1af40 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e   100\n");  linen
1af50 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  o++;.  }.  fprin
1af60 74 66 28 6f 75 74 2c 20 22 23 65 6e 64 69 66 5c  tf(out, "#endif\
1af70 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1af80 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
1af90 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1afa0 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22  #if INTERFACE\n"
1afb0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1afc0 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e  .  name = lemp->
1afd0 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d  name ? lemp->nam
1afe0 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 69  e : "Parse";.  i
1aff0 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26 26 20  f( lemp->arg && 
1b000 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29 7b 0a  lemp->arg[0] ){.
1b010 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
1b020 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c   = lemonStrlen(l
1b030 65 6d 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 77  emp->arg);.    w
1b040 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 69 73  hile( i>=1 && is
1b050 73 70 61 63 65 28 6c 65 6d 70 2d 3e 61 72 67 5b  space(lemp->arg[
1b060 69 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20  i-1]) ) i--;.   
1b070 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20   while( i>=1 && 
1b080 28 69 73 61 6c 6e 75 6d 28 6c 65 6d 70 2d 3e 61  (isalnum(lemp->a
1b090 72 67 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70  rg[i-1]) || lemp
1b0a0 2d 3e 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29  ->arg[i-1]=='_')
1b0b0 20 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69   ) i--;.    fpri
1b0c0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1b0d0 20 25 73 41 52 47 5f 53 44 45 43 4c 20 25 73 3b   %sARG_SDECL %s;
1b0e0 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61  \n",name,lemp->a
1b0f0 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  rg);  lineno++;.
1b100 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b110 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50  "#define %sARG_P
1b120 44 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65  DECL ,%s\n",name
1b130 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69  ,lemp->arg);  li
1b140 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1b150 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1b160 20 25 73 41 52 47 5f 46 45 54 43 48 20 25 73 20   %sARG_FETCH %s 
1b170 3d 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73 5c  = yypParser->%s\
1b180 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1b190 20 20 20 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e       name,lemp->
1b1a0 61 72 67 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69  arg,&lemp->arg[i
1b1b0 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ]);  lineno++;. 
1b1c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1b1d0 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54  #define %sARG_ST
1b1e0 4f 52 45 20 79 79 70 50 61 72 73 65 72 2d 3e 25  ORE yypParser->%
1b1f0 73 20 3d 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  s = %s\n",.     
1b200 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65              name
1b210 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c 26  ,&lemp->arg[i],&
1b220 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20  lemp->arg[i]);  
1b230 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73  lineno++;.  }els
1b240 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e{.    fprintf(o
1b250 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1b260 47 5f 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29  G_SDECL\n",name)
1b270 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1b280 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1b290 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43  efine %sARG_PDEC
1b2a0 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e  L\n",name);  lin
1b2b0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
1b2c0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1b2d0 25 73 41 52 47 5f 46 45 54 43 48 5c 6e 22 2c 6e  %sARG_FETCH\n",n
1b2e0 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
1b2f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b300 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53  "#define %sARG_S
1b310 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c  TORE\n",name); l
1b320 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69  ineno++;.  }.  i
1b330 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20  f( mhflag ){.   
1b340 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65   fprintf(out,"#e
1b350 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ndif\n"); lineno
1b360 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74  ++;.  }.  fprint
1b370 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1b380 59 4e 53 54 41 54 45 20 25 64 5c 6e 22 2c 6c 65  YNSTATE %d\n",le
1b390 6d 70 2d 3e 6e 73 74 61 74 65 29 3b 20 20 6c 69  mp->nstate);  li
1b3a0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1b3b0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1b3c0 59 4e 52 55 4c 45 20 25 64 5c 6e 22 2c 6c 65 6d  YNRULE %d\n",lem
1b3d0 70 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e 65  p->nrule);  line
1b3e0 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70  no++;.  if( lemp
1b3f0 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74  ->errsym->useCnt
1b400 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1b410 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45  out,"#define YYE
1b420 52 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c 6e 22  RRORSYMBOL %d\n"
1b430 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 69  ,lemp->errsym->i
1b440 6e 64 65 78 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  ndex);  lineno++
1b450 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1b460 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52 52  t,"#define YYERR
1b470 53 59 4d 44 54 20 79 79 25 64 5c 6e 22 2c 6c 65  SYMDT yy%d\n",le
1b480 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75  mp->errsym->dtnu
1b490 6d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  m);  lineno++;. 
1b4a0 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68   }.  if( lemp->h
1b4b0 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  as_fallback ){. 
1b4c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1b4d0 23 64 65 66 69 6e 65 20 59 59 46 41 4c 4c 42 41  #define YYFALLBA
1b4e0 43 4b 20 31 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e  CK 1\n");  linen
1b4f0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
1b500 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1b510 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1b520 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1b530 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
1b540 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63 69 61   and its associa
1b550 74 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  tes:.  **.  **  
1b560 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20 20 20 20  yy_action[]     
1b570 20 20 20 41 20 73 69 6e 67 6c 65 20 74 61 62 6c     A single tabl
1b580 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c  e containing all
1b590 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20   actions..  **  
1b5a0 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 20  yy_lookahead[]  
1b5b0 20 20 20 41 20 74 61 62 6c 65 20 63 6f 6e 74 61     A table conta
1b5c0 69 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 6b 61 68  ining the lookah
1b5d0 65 61 64 20 66 6f 72 20 65 61 63 68 20 65 6e 74  ead for each ent
1b5e0 72 79 20 69 6e 0a 20 20 2a 2a 20 20 20 20 20 20  ry in.  **      
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 79                 y
1b600 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73 65 64 20  y_action.  Used 
1b610 74 6f 20 64 65 74 65 63 74 20 68 61 73 68 20 63  to detect hash c
1b620 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2a 20  ollisions..  ** 
1b630 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d   yy_shift_ofst[]
1b640 20 20 20 20 46 6f 72 20 65 61 63 68 20 73 74 61      For each sta
1b650 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74 20 69  te, the offset i
1b660 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f  nto yy_action fo
1b670 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  r.  **          
1b680 20 20 20 20 20 20 20 20 20 20 20 73 68 69 66 74             shift
1b690 69 6e 67 20 74 65 72 6d 69 6e 61 6c 73 2e 0a 20  ing terminals.. 
1b6a0 20 2a 2a 20 20 79 79 5f 72 65 64 75 63 65 5f 6f   **  yy_reduce_o
1b6b0 66 73 74 5b 5d 20 20 20 46 6f 72 20 65 61 63 68  fst[]   For each
1b6c0 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73   state, the offs
1b6d0 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f  et into yy_actio
1b6e0 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20  n for.  **      
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1b700 68 69 66 74 69 6e 67 20 6e 6f 6e 2d 74 65 72 6d  hifting non-term
1b710 69 6e 61 6c 73 20 61 66 74 65 72 20 61 20 72 65  inals after a re
1b720 64 75 63 65 2e 0a 20 20 2a 2a 20 20 79 79 5f 64  duce..  **  yy_d
1b730 65 66 61 75 6c 74 5b 5d 20 20 20 20 20 20 20 44  efault[]       D
1b740 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 66 6f  efault action fo
1b750 72 20 65 61 63 68 20 73 74 61 74 65 2e 0a 20 20  r each state..  
1b760 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  */..  /* Compute
1b770 20 74 68 65 20 61 63 74 69 6f 6e 73 20 6f 6e 20   the actions on 
1b780 61 6c 6c 20 73 74 61 74 65 73 20 61 6e 64 20 63  all states and c
1b790 6f 75 6e 74 20 74 68 65 6d 20 75 70 20 2a 2f 0a  ount them up */.
1b7a0 20 20 61 78 20 3d 20 28 73 74 72 75 63 74 20 61    ax = (struct a
1b7b0 78 73 65 74 20 2a 29 20 63 61 6c 6c 6f 63 28 6c  xset *) calloc(l
1b7c0 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20 73  emp->nstate*2, s
1b7d0 69 7a 65 6f 66 28 61 78 5b 30 5d 29 29 3b 0a 20  izeof(ax[0]));. 
1b7e0 20 69 66 28 20 61 78 3d 3d 30 20 29 7b 0a 20 20   if( ax==0 ){.  
1b7f0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1b800 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c  ,"malloc failed\
1b810 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
1b820 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1b830 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
1b840 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
1b850 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
1b860 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 73 74  ;.    ax[i*2].st
1b870 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78 5b  p = stp;.    ax[
1b880 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a  i*2].isTkn = 1;.
1b890 20 20 20 20 61 78 5b 69 2a 32 5d 2e 6e 41 63 74      ax[i*2].nAct
1b8a0 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41  ion = stp->nTknA
1b8b0 63 74 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31  ct;.    ax[i*2+1
1b8c0 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20  ].stp = stp;.   
1b8d0 20 61 78 5b 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e   ax[i*2+1].isTkn
1b8e0 20 3d 20 30 3b 0a 20 20 20 20 61 78 5b 69 2a 32   = 0;.    ax[i*2
1b8f0 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74  +1].nAction = st
1b900 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 7d 0a 20  p->nNtAct;.  }. 
1b910 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54   mxTknOfst = mnT
1b920 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a 20 20 6d 78  knOfst = 0;.  mx
1b930 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73  NtOfst = mnNtOfs
1b940 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  t = 0;..  /* Com
1b950 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20  pute the action 
1b960 74 61 62 6c 65 2e 20 20 49 6e 20 6f 72 64 65 72  table.  In order
1b970 20 74 6f 20 74 72 79 20 74 6f 20 6b 65 65 70 20   to try to keep 
1b980 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
1b990 20 20 2a 2a 20 61 63 74 69 6f 6e 20 74 61 62 6c    ** action tabl
1b9a0 65 20 74 6f 20 61 20 6d 69 6e 69 6d 75 6d 2c 20  e to a minimum, 
1b9b0 74 68 65 20 68 65 75 72 69 73 74 69 63 20 6f 66  the heuristic of
1b9c0 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6c 61 72   placing the lar
1b9d0 67 65 73 74 20 61 63 74 69 6f 6e 0a 20 20 2a 2a  gest action.  **
1b9e0 20 73 65 74 73 20 66 69 72 73 74 20 69 73 20 75   sets first is u
1b9f0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  sed..  */.  for(
1ba00 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
1ba10 61 74 65 2a 32 3b 20 69 2b 2b 29 20 61 78 5b 69  ate*2; i++) ax[i
1ba20 5d 2e 69 4f 72 64 65 72 20 3d 20 69 3b 0a 20 20  ].iOrder = i;.  
1ba30 71 73 6f 72 74 28 61 78 2c 20 6c 65 6d 70 2d 3e  qsort(ax, lemp->
1ba40 6e 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66  nstate*2, sizeof
1ba50 28 61 78 5b 30 5d 29 2c 20 61 78 73 65 74 5f 63  (ax[0]), axset_c
1ba60 6f 6d 70 61 72 65 29 3b 0a 20 20 70 41 63 74 74  ompare);.  pActt
1ba70 61 62 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c 6f  ab = acttab_allo
1ba80 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  c();.  for(i=0; 
1ba90 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32  i<lemp->nstate*2
1baa0 20 26 26 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f   && ax[i].nActio
1bab0 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  n>0; i++){.    s
1bac0 74 70 20 3d 20 61 78 5b 69 5d 2e 73 74 70 3b 0a  tp = ax[i].stp;.
1bad0 20 20 20 20 69 66 28 20 61 78 5b 69 5d 2e 69 73      if( ax[i].is
1bae0 54 6b 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  Tkn ){.      for
1baf0 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
1bb00 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
1bb10 20 20 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f         int actio
1bb20 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  n;.        if( a
1bb30 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65  p->sp->index>=le
1bb40 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20  mp->nterminal ) 
1bb50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1bb60 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75    action = compu
1bb70 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20  te_action(lemp, 
1bb80 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ap);.        if(
1bb90 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74   action<0 ) cont
1bba0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63  inue;.        ac
1bbb0 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74  ttab_action(pAct
1bbc0 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64  tab, ap->sp->ind
1bbd0 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20  ex, action);.   
1bbe0 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e     }.      stp->
1bbf0 69 54 6b 6e 4f 66 73 74 20 3d 20 61 63 74 74 61  iTknOfst = actta
1bc00 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61 62  b_insert(pActtab
1bc10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  );.      if( stp
1bc20 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b 6e  ->iTknOfst<mnTkn
1bc30 4f 66 73 74 20 29 20 6d 6e 54 6b 6e 4f 66 73 74  Ofst ) mnTknOfst
1bc40 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74   = stp->iTknOfst
1bc50 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d  ;.      if( stp-
1bc60 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78 54 6b 6e 4f  >iTknOfst>mxTknO
1bc70 66 73 74 20 29 20 6d 78 54 6b 6e 4f 66 73 74 20  fst ) mxTknOfst 
1bc80 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b  = stp->iTknOfst;
1bc90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bca0 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1bcb0 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1bcc0 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
1bcd0 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  action;.        
1bce0 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
1bcf0 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  x<lemp->ntermina
1bd00 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
1bd10 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70        if( ap->sp
1bd20 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e  ->index==lemp->n
1bd30 73 79 6d 62 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  symbol ) continu
1bd40 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f  e;.        actio
1bd50 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69  n = compute_acti
1bd60 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20  on(lemp, ap);.  
1bd70 20 20 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e        if( action
1bd80 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
1bd90 20 20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63         acttab_ac
1bda0 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70  tion(pActtab, ap
1bdb0 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74  ->sp->index, act
1bdc0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ion);.      }.  
1bdd0 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74      stp->iNtOfst
1bde0 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74   = acttab_insert
1bdf0 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20  (pActtab);.     
1be00 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73   if( stp->iNtOfs
1be10 74 3c 6d 6e 4e 74 4f 66 73 74 20 29 20 6d 6e 4e  t<mnNtOfst ) mnN
1be20 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74  tOfst = stp->iNt
1be30 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Ofst;.      if( 
1be40 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3e 6d 78 4e  stp->iNtOfst>mxN
1be50 74 4f 66 73 74 20 29 20 6d 78 4e 74 4f 66 73 74  tOfst ) mxNtOfst
1be60 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b   = stp->iNtOfst;
1be70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 72 65  .    }.  }.  fre
1be80 65 28 61 78 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74  e(ax);..  /* Out
1be90 70 75 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f  put the yy_actio
1bea0 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6e 20 3d  n table */.  n =
1beb0 20 61 63 74 74 61 62 5f 73 69 7a 65 28 70 41 63   acttab_size(pAc
1bec0 74 74 61 62 29 3b 0a 20 20 66 70 72 69 6e 74 66  ttab);.  fprintf
1bed0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1bee0 5f 41 43 54 54 41 42 5f 43 4f 55 4e 54 20 28 25  _ACTTAB_COUNT (%
1bef0 64 29 5c 6e 22 2c 20 6e 29 3b 20 6c 69 6e 65 6e  d)\n", n); linen
1bf00 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1bf10 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74  ut,"static const
1bf20 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79   YYACTIONTYPE yy
1bf30 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22  _action[] = {\n"
1bf40 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1bf50 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
1bf60 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 63 74  ++){.    int act
1bf70 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79 79 61  ion = acttab_yya
1bf80 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 69  ction(pActtab, i
1bf90 29 3b 0a 20 20 20 20 69 66 28 20 61 63 74 69 6f  );.    if( actio
1bfa0 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d 20 6c  n<0 ) action = l
1bfb0 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65  emp->nstate + le
1bfc0 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b 0a 20  mp->nrule + 2;. 
1bfd0 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70     if( j==0 ) fp
1bfe0 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
1bff0 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20  5d */ ", i);.   
1c000 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1c010 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b 0a  %4d,", action);.
1c020 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
1c030 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
1c040 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
1c050 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1c060 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
1c070 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
1c080 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
1c090 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
1c0a0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
1c0b0 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79  /* Output the yy
1c0c0 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c 65  _lookahead table
1c0d0 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1c0e0 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20  t,"static const 
1c0f0 59 59 43 4f 44 45 54 59 50 45 20 79 79 5f 6c 6f  YYCODETYPE yy_lo
1c100 6f 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e 22  okahead[] = {\n"
1c110 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1c120 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
1c130 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61 20  ++){.    int la 
1c140 3d 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61  = acttab_yylooka
1c150 68 65 61 64 28 70 41 63 74 74 61 62 2c 20 69 29  head(pActtab, i)
1c160 3b 0a 20 20 20 20 69 66 28 20 6c 61 3c 30 20 29  ;.    if( la<0 )
1c170 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d   la = lemp->nsym
1c180 62 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  bol;.    if( j==
1c190 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
1c1a0 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
1c1b0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1c1c0 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61 29  ut, " %4d,", la)
1c1d0 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c  ;.    if( j==9 |
1c1e0 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20  | i==n-1 ){.    
1c1f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1c200 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1c210 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
1c220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b   }else{.      j+
1c230 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  +;.    }.  }.  f
1c240 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c  printf(out, "};\
1c250 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a  n"); lineno++;..
1c260 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
1c270 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20  yy_shift_ofst[] 
1c280 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e  table */.  fprin
1c290 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65  tf(out, "#define
1c2a0 20 59 59 5f 53 48 49 46 54 5f 55 53 45 5f 44 46   YY_SHIFT_USE_DF
1c2b0 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b  LT (%d)\n", mnTk
1c2c0 6e 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f  nOfst-1); lineno
1c2d0 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e  ++;.  n = lemp->
1c2e0 6e 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28  nstate;.  while(
1c2f0 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f   n>0 && lemp->so
1c300 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e 4f  rted[n-1]->iTknO
1c310 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
1c320 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28   n--;.  fprintf(
1c330 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
1c340 5f 53 48 49 46 54 5f 43 4f 55 4e 54 20 28 25 64  _SHIFT_COUNT (%d
1c350 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65  )\n", n-1); line
1c360 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1c370 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
1c380 5f 53 48 49 46 54 5f 4d 49 4e 20 20 20 28 25 64  _SHIFT_MIN   (%d
1c390 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 29  )\n", mnTknOfst)
1c3a0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1c3b0 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
1c3c0 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 41 58  ine YY_SHIFT_MAX
1c3d0 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 78 54 6b     (%d)\n", mxTk
1c3e0 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  nOfst); lineno++
1c3f0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1c400 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25   "static const %
1c410 73 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b  s yy_shift_ofst[
1c420 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20  ] = {\n", .     
1c430 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a       minimum_siz
1c440 65 5f 74 79 70 65 28 6d 6e 54 6b 6e 4f 66 73 74  e_type(mnTknOfst
1c450 2d 31 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 29 3b  -1, mxTknOfst));
1c460 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72   lineno++;.  for
1c470 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
1c480 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b  ){.    int ofst;
1c490 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
1c4a0 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
1c4b0 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e  ofst = stp->iTkn
1c4c0 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66  Ofst;.    if( of
1c4d0 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20  st==NO_OFFSET ) 
1c4e0 6f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74  ofst = mnTknOfst
1c4f0 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d   - 1;.    if( j=
1c500 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
1c510 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
1c520 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
1c530 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66  out, " %4d,", of
1c540 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  st);.    if( j==
1c550 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
1c560 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1c570 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
1c580 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
1c590 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c5a0 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
1c5b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1c5c0 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
1c5d0 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
1c5e0 68 65 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73  he yy_reduce_ofs
1c5f0 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  t[] table */.  f
1c600 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65  printf(out, "#de
1c610 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 55  fine YY_REDUCE_U
1c620 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c  SE_DFLT (%d)\n",
1c630 20 6d 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c 69   mnNtOfst-1); li
1c640 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65  neno++;.  n = le
1c650 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68  mp->nstate;.  wh
1c660 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70  ile( n>0 && lemp
1c670 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69  ->sorted[n-1]->i
1c680 4e 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45  NtOfst==NO_OFFSE
1c690 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e  T ) n--;.  fprin
1c6a0 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65  tf(out, "#define
1c6b0 20 59 59 5f 52 45 44 55 43 45 5f 43 4f 55 4e 54   YY_REDUCE_COUNT
1c6c0 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20   (%d)\n", n-1); 
1c6d0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1c6e0 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1c6f0 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 49 4e 20  e YY_REDUCE_MIN 
1c700 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f    (%d)\n", mnNtO
1c710 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  fst); lineno++;.
1c720 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1c730 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43  #define YY_REDUC
1c740 45 5f 4d 41 58 20 20 20 28 25 64 29 5c 6e 22 2c  E_MAX   (%d)\n",
1c750 20 6d 78 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65   mxNtOfst); line
1c760 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1c770 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e  out, "static con
1c780 73 74 20 25 73 20 79 79 5f 72 65 64 75 63 65 5f  st %s yy_reduce_
1c790 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a  ofst[] = {\n", .
1c7a0 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75            minimu
1c7b0 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e 74  m_size_type(mnNt
1c7c0 4f 66 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73 74  Ofst-1, mxNtOfst
1c7d0 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  )); lineno++;.  
1c7e0 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1c7f0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66  i++){.    int of
1c800 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  st;.    stp = le
1c810 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
1c820 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69     ofst = stp->i
1c830 4e 74 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20  NtOfst;.    if( 
1c840 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  ofst==NO_OFFSET 
1c850 29 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73  ) ofst = mnNtOfs
1c860 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a  t - 1;.    if( j
1c870 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75  ==0 ) fprintf(ou
1c880 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c  t," /* %5d */ ",
1c890 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   i);.    fprintf
1c8a0 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f  (out, " %4d,", o
1c8b0 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  fst);.    if( j=
1c8c0 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
1c8d0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1c8e0 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
1c8f0 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
1c900 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c910 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1c920 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1c930 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
1c940 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  +;..  /* Output 
1c950 74 68 65 20 64 65 66 61 75 6c 74 20 61 63 74 69  the default acti
1c960 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70  on table */.  fp
1c970 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74  rintf(out, "stat
1c980 69 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f  ic const YYACTIO
1c990 4e 54 59 50 45 20 79 79 5f 64 65 66 61 75 6c 74  NTYPE yy_default
1c9a0 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65  [] = {\n"); line
1c9b0 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70  no++;.  n = lemp
1c9c0 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 66 6f 72 28  ->nstate;.  for(
1c9d0 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
1c9e0 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
1c9f0 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
1ca00 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69   if( j==0 ) fpri
1ca10 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64  ntf(out," /* %5d
1ca20 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66   */ ", i);.    f
1ca30 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
1ca40 64 2c 22 2c 20 73 74 70 2d 3e 69 44 66 6c 74 29  d,", stp->iDflt)
1ca50 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c  ;.    if( j==9 |
1ca60 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20  | i==n-1 ){.    
1ca70 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1ca80 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1ca90 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
1caa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b   }else{.      j+
1cab0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  +;.    }.  }.  f
1cac0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c  printf(out, "};\
1cad0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1cae0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1caf0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1cb00 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1cb10 65 72 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  erate the table 
1cb20 6f 66 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65  of fallback toke
1cb30 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ns..  */.  if( l
1cb40 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63  emp->has_fallbac
1cb50 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 78 20  k ){.    int mx 
1cb60 3d 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  = lemp->ntermina
1cb70 6c 20 2d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65  l - 1;.    while
1cb80 28 20 6d 78 3e 30 20 26 26 20 6c 65 6d 70 2d 3e  ( mx>0 && lemp->
1cb90 73 79 6d 62 6f 6c 73 5b 6d 78 5d 2d 3e 66 61 6c  symbols[mx]->fal
1cba0 6c 62 61 63 6b 3d 3d 30 20 29 7b 20 6d 78 2d 2d  lback==0 ){ mx--
1cbb0 3b 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ; }.    for(i=0;
1cbc0 20 69 3c 3d 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20   i<=mx; i++){.  
1cbd0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
1cbe0 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d  l *p = lemp->sym
1cbf0 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69  bols[i];.      i
1cc00 66 28 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d  f( p->fallback==
1cc10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
1cc20 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 30  intf(out, "    0
1cc30 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e 6f  ,  /* %10s => no
1cc40 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d 3e  thing */\n", p->
1cc50 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
1cc60 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  se{.        fpri
1cc70 6e 74 66 28 6f 75 74 2c 20 22 20 20 25 33 64 2c  ntf(out, "  %3d,
1cc80 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73 20    /* %10s => %s 
1cc90 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62 61  */\n", p->fallba
1cca0 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20 20  ck->index,.     
1ccb0 20 20 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70 2d       p->name, p-
1ccc0 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65 29  >fallback->name)
1ccd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cce0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
1ccf0 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1cd00 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c 20  lemp->name, in, 
1cd10 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  out, &lineno);..
1cd20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1cd30 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1cd40 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61   the symbolic na
1cd50 6d 65 20 6f 66 20 65 76 65 72 79 20 73 79 6d 62  me of every symb
1cd60 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ol.  */.  for(i=
1cd70 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
1cd80 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70  ol; i++){.    sp
1cd90 72 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25 73  rintf(line,"\"%s
1cda0 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  \",",lemp->symbo
1cdb0 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ls[i]->name);.  
1cdc0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1cdd0 20 25 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a 20   %-15s",line);. 
1cde0 20 20 20 69 66 28 20 28 69 26 33 29 3d 3d 33 20     if( (i&3)==3 
1cdf0 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ){ fprintf(out,"
1ce00 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n"); lineno++; 
1ce10 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 26 33  }.  }.  if( (i&3
1ce20 29 21 3d 30 20 29 7b 20 66 70 72 69 6e 74 66 28  )!=0 ){ fprintf(
1ce30 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  out,"\n"); linen
1ce40 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78 66  o++; }.  tplt_xf
1ce50 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1ce60 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1ce70 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1ce80 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1ce90 20 61 20 74 65 78 74 20 73 74 72 69 6e 67 20 74   a text string t
1cea0 68 61 74 20 64 65 73 63 72 69 62 65 73 20 65 76  hat describes ev
1ceb0 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69 6e  ery.  ** rule in
1cec0 20 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f 66   the rule set of
1ced0 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 54   the grammar.  T
1cee0 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
1cef0 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68 65  is used.  ** whe
1cf00 6e 20 74 72 61 63 69 6e 67 20 52 45 44 55 43 45  n tracing REDUCE
1cf10 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20   actions..  */. 
1cf20 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d   for(i=0, rp=lem
1cf30 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
1cf40 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a  rp->next, i++){.
1cf50 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e      assert( rp->
1cf60 69 6e 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20 20  index==i );.    
1cf70 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
1cf80 20 25 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29 3b   %3d */ \"", i);
1cf90 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65  .    writeRuleTe
1cfa0 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20  xt(out, rp);.   
1cfb0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22   fprintf(out,"\"
1cfc0 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ,\n"); lineno++;
1cfd0 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1cfe0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1cff0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1d000 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1d010 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
1d020 65 76 65 72 79 20 74 69 6d 65 20 61 20 73 79 6d  every time a sym
1d030 62 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72  bol is popped fr
1d040 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63  om.  ** the stac
1d050 6b 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  k while processi
1d060 6e 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68 69  ng errors or whi
1d070 6c 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68  le destroying th
1d080 65 20 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a 20  e parser. .  ** 
1d090 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
1d0a0 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 25 64   generate the %d
1d0b0 65 73 74 72 75 63 74 6f 72 20 61 63 74 69 6f 6e  estructor action
1d0c0 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65  s).  */.  if( le
1d0d0 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b  mp->tokendest ){
1d0e0 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20  .    int once = 
1d0f0 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  1;.    for(i=0; 
1d100 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
1d110 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
1d120 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
1d130 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
1d140 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d  ];.      if( sp=
1d150 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d  =0 || sp->type!=
1d160 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69  TERMINAL ) conti
1d170 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  nue;.      if( o
1d180 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66  nce ){.        f
1d190 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20  printf(out, "   
1d1a0 20 20 20 2f 2a 20 54 45 52 4d 49 4e 41 4c 20 44     /* TERMINAL D
1d1b0 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29  estructor */\n")
1d1c0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1d1d0 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
1d1e0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
1d1f0 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
1d200 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e  e %d: /* %s */\n
1d210 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70  ", sp->index, sp
1d220 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ->name); lineno+
1d230 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  +;.    }.    for
1d240 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1d250 79 6d 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73  ymbol && lemp->s
1d260 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21  ymbols[i]->type!
1d270 3d 54 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b  =TERMINAL; i++);
1d280 0a 20 20 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d  .    if( i<lemp-
1d290 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20  >nsymbol ){.    
1d2a0 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f    emit_destructo
1d2b0 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d  r_code(out,lemp-
1d2c0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70  >symbols[i],lemp
1d2d0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  ,&lineno);.     
1d2e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1d2f0 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20      break;\n"); 
1d300 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
1d310 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e    }.  if( lemp->
1d320 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20 73  vardest ){.    s
1d330 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66  truct symbol *df
1d340 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20 69  lt_sp = 0;.    i
1d350 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20  nt once = 1;.   
1d360 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1d370 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
1d380 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79  .      struct sy
1d390 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
1d3a0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
1d3b0 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20     if( sp==0 || 
1d3c0 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
1d3d0 41 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  AL ||.          
1d3e0 73 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20  sp->index<=0 || 
1d3f0 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d  sp->destructor!=
1d400 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1d410 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a      if( once ){.
1d420 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1d430 6f 75 74 2c 20 22 20 20 20 20 20 20 2f 2a 20 44  out, "      /* D
1d440 65 66 61 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49  efault NON-TERMI
1d450 4e 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a  NAL Destructor *
1d460 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  /\n"); lineno++;
1d470 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20  .        once = 
1d480 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1d490 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1d4a0 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73    case %d: /* %s
1d4b0 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65   */\n", sp->inde
1d4c0 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69  x, sp->name); li
1d4d0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66  neno++;.      df
1d4e0 6c 74 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20 20  lt_sp = sp;.    
1d4f0 7d 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5f 73  }.    if( dflt_s
1d500 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 6d  p!=0 ){.      em
1d510 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
1d520 64 65 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c  de(out,dflt_sp,l
1d530 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  emp,&lineno);.  
1d540 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
1d550 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b  out,"      break
1d560 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1d570 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1d580 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
1d590 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
1d5a0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
1d5b0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
1d5c0 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c  .    if( sp==0 |
1d5d0 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  | sp->type==TERM
1d5e0 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73 74  INAL || sp->dest
1d5f0 72 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e 74  ructor==0 ) cont
1d600 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74  inue;.    fprint
1d610 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20  f(out,"    case 
1d620 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c  %d: /* %s */\n",
1d630 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e   sp->index, sp->
1d640 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
1d650 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65  ..    /* Combine
1d660 20 64 75 70 6c 69 63 61 74 65 20 64 65 73 74 72   duplicate destr
1d670 75 63 74 6f 72 73 20 69 6e 74 6f 20 61 20 73 69  uctors into a si
1d680 6e 67 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20 20  ngle case */.   
1d690 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65   for(j=i+1; j<le
1d6a0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b  mp->nsymbol; j++
1d6b0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1d6c0 73 79 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c 65  symbol *sp2 = le
1d6d0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a  mp->symbols[j];.
1d6e0 20 20 20 20 20 20 69 66 28 20 73 70 32 20 26 26        if( sp2 &&
1d6f0 20 73 70 32 2d 3e 74 79 70 65 21 3d 54 45 52 4d   sp2->type!=TERM
1d700 49 4e 41 4c 20 26 26 20 73 70 32 2d 3e 64 65 73  INAL && sp2->des
1d710 74 72 75 63 74 6f 72 0a 20 20 20 20 20 20 20 20  tructor.        
1d720 20 20 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d 3d    && sp2->dtnum=
1d730 3d 73 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20 20  =sp->dtnum.     
1d740 20 20 20 20 20 26 26 20 73 74 72 63 6d 70 28 73       && strcmp(s
1d750 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 2c 73 70  p->destructor,sp
1d760 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 29 3d 3d  2->destructor)==
1d770 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 66 70  0 ){.         fp
1d780 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63  rintf(out,"    c
1d790 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f  ase %d: /* %s */
1d7a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1d7b0 20 20 20 20 20 20 73 70 32 2d 3e 69 6e 64 65 78        sp2->index
1d7c0 2c 20 73 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c 69  , sp2->name); li
1d7d0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
1d7e0 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72   sp2->destructor
1d7f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1d800 20 20 7d 0a 0a 20 20 20 20 65 6d 69 74 5f 64 65    }..    emit_de
1d810 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75  structor_code(ou
1d820 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  t,lemp->symbols[
1d830 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  i],lemp,&lineno)
1d840 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1d850 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c  t,"      break;\
1d860 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1d870 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
1d880 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1d890 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1d8a0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
1d8b0 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
1d8c0 65 6e 65 76 65 72 20 74 68 65 20 70 61 72 73 65  enever the parse
1d8d0 72 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77  r stack overflow
1d8e0 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  s */.  tplt_prin
1d8f0 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
1d900 3e 6f 76 65 72 66 6c 6f 77 2c 26 6c 69 6e 65 6e  >overflow,&linen
1d910 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  o);.  tplt_xfer(
1d920 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1d930 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1d940 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74  * Generate the t
1d950 61 62 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e 66  able of rule inf
1d960 6f 72 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a 20  ormation .  **. 
1d970 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 63   ** Note: This c
1d980 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
1d990 68 65 20 66 61 63 74 20 74 68 61 74 20 72 75 6c  he fact that rul
1d9a0 65 73 20 61 72 65 20 6e 75 6d 62 65 72 0a 20 20  es are number.  
1d9b0 2a 2a 20 73 65 71 75 65 6e 74 75 61 6c 6c 79 20  ** sequentually 
1d9c0 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30  beginning with 0
1d9d0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d  ..  */.  for(rp=
1d9e0 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
1d9f0 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
1da00 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1da10 20 7b 20 25 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c   { %d, %d },\n",
1da20 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c 72  rp->lhs->index,r
1da30 70 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e 65 6e 6f  p->nrhs); lineno
1da40 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  ++;.  }.  tplt_x
1da50 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1da60 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1da70 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1da80 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
1da90 69 6f 6e 20 64 75 72 69 6e 67 20 65 61 63 68 20  ion during each 
1daa0 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f  REDUCE action */
1dab0 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
1dac0 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
1dad0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 74 72 61 6e  >next){.    tran
1dae0 73 6c 61 74 65 5f 63 6f 64 65 28 6c 65 6d 70 2c  slate_code(lemp,
1daf0 20 72 70 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46   rp);.  }.  /* F
1db00 69 72 73 74 20 6f 75 74 70 75 74 20 72 75 6c 65  irst output rule
1db10 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  s other than the
1db20 20 64 65 66 61 75 6c 74 3a 20 72 75 6c 65 20 2a   default: rule *
1db30 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  /.  for(rp=lemp-
1db40 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1db50 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 73 74 72  ->next){.    str
1db60 75 63 74 20 72 75 6c 65 20 2a 72 70 32 3b 20 20  uct rule *rp2;  
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1db80 4f 74 68 65 72 20 72 75 6c 65 73 20 77 69 74 68  Other rules with
1db90 20 74 68 65 20 73 61 6d 65 20 61 63 74 69 6f 6e   the same action
1dba0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 70 2d 3e   */.    if( rp->
1dbb0 63 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  code==0 ) contin
1dbc0 75 65 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  ue;.    if( rp->
1dbd0 63 6f 64 65 5b 30 5d 3d 3d 27 5c 6e 27 20 26 26  code[0]=='\n' &&
1dbe0 20 72 70 2d 3e 63 6f 64 65 5b 31 5d 3d 3d 30 20   rp->code[1]==0 
1dbf0 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 57  ) continue; /* W
1dc00 69 6c 6c 20 62 65 20 64 65 66 61 75 6c 74 3a 20  ill be default: 
1dc10 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  */.    fprintf(o
1dc20 75 74 2c 22 20 20 20 20 20 20 63 61 73 65 20 25  ut,"      case %
1dc30 64 3a 20 2f 2a 20 22 2c 20 72 70 2d 3e 69 6e 64  d: /* ", rp->ind
1dc40 65 78 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75  ex);.    writeRu
1dc50 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b  leText(out, rp);
1dc60 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1dc70 2c 20 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65  , " */\n"); line
1dc80 6e 6f 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 72 70  no++;.    for(rp
1dc90 32 3d 72 70 2d 3e 6e 65 78 74 3b 20 72 70 32 3b  2=rp->next; rp2;
1dca0 20 72 70 32 3d 72 70 32 2d 3e 6e 65 78 74 29 7b   rp2=rp2->next){
1dcb0 0a 20 20 20 20 20 20 69 66 28 20 72 70 32 2d 3e  .      if( rp2->
1dcc0 63 6f 64 65 3d 3d 72 70 2d 3e 63 6f 64 65 20 29  code==rp->code )
1dcd0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1dce0 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73  f(out,"      cas
1dcf0 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70 32 2d  e %d: /* ", rp2-
1dd00 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20  >index);.       
1dd10 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f   writeRuleText(o
1dd20 75 74 2c 20 72 70 32 29 3b 0a 20 20 20 20 20 20  ut, rp2);.      
1dd30 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1dd40 2a 2f 20 79 79 74 65 73 74 63 61 73 65 28 79 79  */ yytestcase(yy
1dd50 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c  ruleno==%d);\n",
1dd60 20 72 70 32 2d 3e 69 6e 64 65 78 29 3b 20 6c 69   rp2->index); li
1dd70 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
1dd80 72 70 32 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20  rp2->code = 0;. 
1dd90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1dda0 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72   emit_code(out,r
1ddb0 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b  p,lemp,&lineno);
1ddc0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1ddd0 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ,"        break;
1dde0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1ddf0 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30      rp->code = 0
1de00 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 6e 61 6c  ;.  }.  /* Final
1de10 6c 79 2c 20 6f 75 74 70 75 74 20 74 68 65 20 64  ly, output the d
1de20 65 66 61 75 6c 74 3a 20 72 75 6c 65 2e 20 20 57  efault: rule.  W
1de30 65 20 63 68 6f 6f 73 65 20 61 73 20 74 68 65 20  e choose as the 
1de40 64 65 66 61 75 6c 74 3a 20 61 6c 6c 0a 20 20 2a  default: all.  *
1de50 2a 20 65 6d 70 74 79 20 61 63 74 69 6f 6e 73 2e  * empty actions.
1de60 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1de70 74 2c 22 20 20 20 20 20 20 64 65 66 61 75 6c 74  t,"      default
1de80 3a 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  :\n"); lineno++;
1de90 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
1dea0 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
1deb0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
1dec0 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 20 63 6f  rp->code==0 ) co
1ded0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
1dee0 72 74 28 20 72 70 2d 3e 63 6f 64 65 5b 30 5d 3d  rt( rp->code[0]=
1def0 3d 27 5c 6e 27 20 26 26 20 72 70 2d 3e 63 6f 64  ='\n' && rp->cod
1df00 65 5b 31 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 66  e[1]==0 );.    f
1df10 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1df20 20 20 2f 2a 20 28 25 64 29 20 22 2c 20 72 70 2d    /* (%d) ", rp-
1df30 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 77 72 69  >index);.    wri
1df40 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20  teRuleText(out, 
1df50 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  rp);.    fprintf
1df60 28 6f 75 74 2c 20 22 20 2a 2f 20 79 79 74 65 73  (out, " */ yytes
1df70 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d  tcase(yyruleno==
1df80 25 64 29 3b 5c 6e 22 2c 20 72 70 2d 3e 69 6e 64  %d);\n", rp->ind
1df90 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ex); lineno++;. 
1dfa0 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
1dfb0 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ,"        break;
1dfc0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1dfd0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1dfe0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1dff0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1e000 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
1e010 68 20 65 78 65 63 75 74 65 73 20 69 66 20 61 20  h executes if a 
1e020 70 61 72 73 65 20 66 61 69 6c 73 20 2a 2f 0a 20  parse fails */. 
1e030 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
1e040 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75  lemp,lemp->failu
1e050 72 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74  re,&lineno);.  t
1e060 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1e070 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1e080 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1e090 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
1e0a0 78 65 63 75 74 65 73 20 77 68 65 6e 20 61 20 73  xecutes when a s
1e0b0 79 6e 74 61 78 20 65 72 72 6f 72 20 6f 63 63 75  yntax error occu
1e0c0 72 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  rs */.  tplt_pri
1e0d0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1e0e0 2d 3e 65 72 72 6f 72 2c 26 6c 69 6e 65 6e 6f 29  ->error,&lineno)
1e0f0 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
1e100 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1e110 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1e120 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
1e130 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65  ich executes whe
1e140 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 63 63  n the parser acc
1e150 65 70 74 73 20 69 74 73 20 69 6e 70 75 74 20 2a  epts its input *
1e160 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  /.  tplt_print(o
1e170 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61 63  ut,lemp,lemp->ac
1e180 63 65 70 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  cept,&lineno);. 
1e190 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1e1a0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1e1b0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41 70 70  neno);..  /* App
1e1c0 65 6e 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e  end any addition
1e1d0 20 63 6f 64 65 20 74 68 65 20 75 73 65 72 20 64   code the user d
1e1e0 65 73 69 72 65 73 20 2a 2f 0a 20 20 74 70 6c 74  esires */.  tplt
1e1f0 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
1e200 6c 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65 2c  lemp->extracode,
1e210 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63 6c  &lineno);..  fcl
1e220 6f 73 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f 73  ose(in);.  fclos
1e230 65 28 6f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e  e(out);.  return
1e240 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  ;.}../* Generate
1e250 20 61 20 68 65 61 64 65 72 20 66 69 6c 65 20 66   a header file f
1e260 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  or the parser */
1e270 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65 61 64  .void ReportHead
1e280 65 72 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  er(struct lemon 
1e290 2a 6c 65 6d 70 29 0a 7b 0a 20 20 46 49 4c 45 20  *lemp).{.  FILE 
1e2a0 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 6f 6e  *out, *in;.  con
1e2b0 73 74 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b  st char *prefix;
1e2c0 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e  .  char line[LIN
1e2d0 45 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70  ESIZE];.  char p
1e2e0 61 74 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d  attern[LINESIZE]
1e2f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
1e300 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65  ( lemp->tokenpre
1e310 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c  fix ) prefix = l
1e320 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78  emp->tokenprefix
1e330 3b 0a 20 20 65 6c 73 65 20 20 20 20 20 20 20 20  ;.  else        
1e340 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66              pref
1e350 69 78 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d 20  ix = "";.  in = 
1e360 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22  file_open(lemp,"
1e370 2e 68 22 2c 22 72 62 22 29 3b 0a 20 20 69 66 28  .h","rb");.  if(
1e380 20 69 6e 20 29 7b 0a 20 20 20 20 66 6f 72 28 69   in ){.    for(i
1e390 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =1; i<lemp->nter
1e3a0 6d 69 6e 61 6c 20 26 26 20 66 67 65 74 73 28 6c  minal && fgets(l
1e3b0 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29  ine,LINESIZE,in)
1e3c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 70  ; i++){.      sp
1e3d0 72 69 6e 74 66 28 70 61 74 74 65 72 6e 2c 22 23  rintf(pattern,"#
1e3e0 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25  define %s%-30s %
1e3f0 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d  2d\n",prefix,lem
1e400 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
1e410 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 69 66  ame,i);.      if
1e420 28 20 73 74 72 63 6d 70 28 6c 69 6e 65 2c 70 61  ( strcmp(line,pa
1e430 74 74 65 72 6e 29 20 29 20 62 72 65 61 6b 3b 0a  ttern) ) break;.
1e440 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65      }.    fclose
1e450 28 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 69 3d  (in);.    if( i=
1e460 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  =lemp->nterminal
1e470 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20   ){.      /* No 
1e480 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20 66 69  change in the fi
1e490 6c 65 2e 20 20 44 6f 6e 27 74 20 72 65 77 72 69  le.  Don't rewri
1e4a0 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  te it. */.      
1e4b0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
1e4c0 7d 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f  }.  out = file_o
1e4d0 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 77  pen(lemp,".h","w
1e4e0 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29  b");.  if( out )
1e4f0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  {.    for(i=1; i
1e500 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
1e510 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70  ; i++){.      fp
1e520 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1e530 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e  ne %s%-30s %2d\n
1e540 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73  ",prefix,lemp->s
1e550 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c  ymbols[i]->name,
1e560 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 63  i);.    }.    fc
1e570 6c 6f 73 65 28 6f 75 74 29 3b 20 20 0a 20 20 7d  lose(out);  .  }
1e580 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
1e590 20 52 65 64 75 63 65 20 74 68 65 20 73 69 7a 65   Reduce the size
1e5a0 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20 74   of the action t
1e5b0 61 62 6c 65 73 2c 20 69 66 20 70 6f 73 73 69 62  ables, if possib
1e5c0 6c 65 2c 20 62 79 20 6d 61 6b 69 6e 67 20 75 73  le, by making us
1e5d0 65 0a 2a 2a 20 6f 66 20 64 65 66 61 75 6c 74 73  e.** of defaults
1e5e0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ..**.** In this 
1e5f0 76 65 72 73 69 6f 6e 2c 20 77 65 20 74 61 6b 65  version, we take
1e600 20 74 68 65 20 6d 6f 73 74 20 66 72 65 71 75 65   the most freque
1e610 6e 74 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e  nt REDUCE action
1e620 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69 74 20   and make.** it 
1e630 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 45 78  the default.  Ex
1e640 63 65 70 74 2c 20 74 68 65 72 65 20 69 73 20 6e  cept, there is n
1e650 6f 20 64 65 66 61 75 6c 74 20 69 66 20 74 68 65  o default if the
1e660 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e 0a   wildcard token.
1e670 2a 2a 20 69 73 20 61 20 70 6f 73 73 69 62 6c 65  ** is a possible
1e680 20 6c 6f 6f 6b 2d 61 68 65 61 64 2e 0a 2a 2f 0a   look-ahead..*/.
1e690 76 6f 69 64 20 43 6f 6d 70 72 65 73 73 54 61 62  void CompressTab
1e6a0 6c 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  les(struct lemon
1e6b0 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75   *lemp).{.  stru
1e6c0 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
1e6d0 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
1e6e0 61 70 2c 20 2a 61 70 32 3b 0a 20 20 73 74 72 75  ap, *ap2;.  stru
1e6f0 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70  ct rule *rp, *rp
1e700 32 2c 20 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74  2, *rbest;.  int
1e710 20 6e 62 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74   nbest, n;.  int
1e720 20 69 3b 0a 20 20 69 6e 74 20 75 73 65 73 57 69   i;.  int usesWi
1e730 6c 64 63 61 72 64 3b 0a 0a 20 20 66 6f 72 28 69  ldcard;..  for(i
1e740 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
1e750 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
1e760 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
1e770 5b 69 5d 3b 0a 20 20 20 20 6e 62 65 73 74 20 3d  [i];.    nbest =
1e780 20 30 3b 0a 20 20 20 20 72 62 65 73 74 20 3d 20   0;.    rbest = 
1e790 30 3b 0a 20 20 20 20 75 73 65 73 57 69 6c 64 63  0;.    usesWildc
1e7a0 61 72 64 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f  ard = 0;..    fo
1e7b0 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1e7c0 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1e7d0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
1e7e0 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 2d  pe==SHIFT && ap-
1e7f0 3e 73 70 3d 3d 6c 65 6d 70 2d 3e 77 69 6c 64 63  >sp==lemp->wildc
1e800 61 72 64 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ard ){.        u
1e810 73 65 73 57 69 6c 64 63 61 72 64 20 3d 20 31 3b  sesWildcard = 1;
1e820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1e830 66 28 20 61 70 2d 3e 74 79 70 65 21 3d 52 45 44  f( ap->type!=RED
1e840 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UCE ) continue;.
1e850 20 20 20 20 20 20 72 70 20 3d 20 61 70 2d 3e 78        rp = ap->x
1e860 2e 72 70 3b 0a 20 20 20 20 20 20 69 66 28 20 72  .rp;.      if( r
1e870 70 2d 3e 6c 68 73 53 74 61 72 74 20 29 20 63 6f  p->lhsStart ) co
1e880 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1e890 28 20 72 70 3d 3d 72 62 65 73 74 20 29 20 63 6f  ( rp==rbest ) co
1e8a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20  ntinue;.      n 
1e8b0 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 61  = 1;.      for(a
1e8c0 70 32 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 32  p2=ap->next; ap2
1e8d0 3b 20 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29  ; ap2=ap2->next)
1e8e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  {.        if( ap
1e8f0 32 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20  2->type!=REDUCE 
1e900 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1e910 20 20 20 20 72 70 32 20 3d 20 61 70 32 2d 3e 78      rp2 = ap2->x
1e920 2e 72 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  .rp;.        if(
1e930 20 72 70 32 3d 3d 72 62 65 73 74 20 29 20 63 6f   rp2==rbest ) co
1e940 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1e950 69 66 28 20 72 70 32 3d 3d 72 70 20 29 20 6e 2b  if( rp2==rp ) n+
1e960 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
1e970 20 69 66 28 20 6e 3e 6e 62 65 73 74 20 29 7b 0a   if( n>nbest ){.
1e980 20 20 20 20 20 20 20 20 6e 62 65 73 74 20 3d 20          nbest = 
1e990 6e 3b 0a 20 20 20 20 20 20 20 20 72 62 65 73 74  n;.        rbest
1e9a0 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 7d 0a 20   = rp;.      }. 
1e9b0 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 44 6f     }. .    /* Do
1e9c0 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 65 66 61   not make a defa
1e9d0 75 6c 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65  ult if the numbe
1e9e0 72 20 6f 66 20 72 75 6c 65 73 20 74 6f 20 64 65  r of rules to de
1e9f0 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 69 73 20  fault.    ** is 
1ea00 6e 6f 74 20 61 74 20 6c 65 61 73 74 20 31 20 6f  not at least 1 o
1ea10 72 20 69 66 20 74 68 65 20 77 69 6c 64 63 61 72  r if the wildcar
1ea20 64 20 74 6f 6b 65 6e 20 69 73 20 61 20 70 6f 73  d token is a pos
1ea30 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f  sible.    ** loo
1ea40 6b 61 68 65 61 64 2e 0a 20 20 20 20 2a 2f 0a 20  kahead..    */. 
1ea50 20 20 20 69 66 28 20 6e 62 65 73 74 3c 31 20 7c     if( nbest<1 |
1ea60 7c 20 75 73 65 73 57 69 6c 64 63 61 72 64 20 29  | usesWildcard )
1ea70 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20 20   continue;...   
1ea80 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 6d 61 74 63   /* Combine matc
1ea90 68 69 6e 67 20 52 45 44 55 43 45 20 61 63 74 69  hing REDUCE acti
1eaa0 6f 6e 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ons into a singl
1eab0 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20  e default */.   
1eac0 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
1ead0 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
1eae0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  ){.      if( ap-
1eaf0 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26  >type==REDUCE &&
1eb00 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74   ap->x.rp==rbest
1eb10 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
1eb20 20 20 20 20 61 73 73 65 72 74 28 20 61 70 20 29      assert( ap )
1eb30 3b 0a 20 20 20 20 61 70 2d 3e 73 70 20 3d 20 53  ;.    ap->sp = S
1eb40 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61  ymbol_new("{defa
1eb50 75 6c 74 7d 22 29 3b 0a 20 20 20 20 66 6f 72 28  ult}");.    for(
1eb60 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3b  ap=ap->next; ap;
1eb70 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
1eb80 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
1eb90 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d  e==REDUCE && ap-
1eba0 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 61  >x.rp==rbest ) a
1ebb0 70 2d 3e 74 79 70 65 20 3d 20 4e 4f 54 5f 55 53  p->type = NOT_US
1ebc0 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  ED;.    }.    st
1ebd0 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73  p->ap = Action_s
1ebe0 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20  ort(stp->ap);.  
1ebf0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  }.}.../*.** Comp
1ec00 61 72 65 20 74 77 6f 20 73 74 61 74 65 73 20 66  are two states f
1ec10 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f  or sorting purpo
1ec20 73 65 73 2e 20 20 54 68 65 20 73 6d 61 6c 6c 65  ses.  The smalle
1ec30 72 20 73 74 61 74 65 20 69 73 20 74 68 65 0a 2a  r state is the.*
1ec40 2a 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d  * one with the m
1ec50 6f 73 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  ost non-terminal
1ec60 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68   actions.  If th
1ec70 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
1ec80 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f   number.** of no
1ec90 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f  n-terminal actio
1eca0 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 73 6d 61  ns, then the sma
1ecb0 6c 6c 65 72 20 69 73 20 74 68 65 20 6f 6e 65 20  ller is the one 
1ecc0 77 69 74 68 20 74 68 65 20 6d 6f 73 74 0a 2a 2a  with the most.**
1ecd0 20 74 6f 6b 65 6e 20 61 63 74 69 6f 6e 73 2e 0a   token actions..
1ece0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74  */.static int st
1ecf0 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65  ateResortCompare
1ed00 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20  (const void *a, 
1ed10 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a  const void *b){.
1ed20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
1ed30 74 61 74 65 20 2a 70 41 20 3d 20 2a 28 63 6f 6e  tate *pA = *(con
1ed40 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65 2a  st struct state*
1ed50 2a 29 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72  *)a;.  const str
1ed60 75 63 74 20 73 74 61 74 65 20 2a 70 42 20 3d 20  uct state *pB = 
1ed70 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73  *(const struct s
1ed80 74 61 74 65 2a 2a 29 62 3b 0a 20 20 69 6e 74 20  tate**)b;.  int 
1ed90 6e 3b 0a 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e  n;..  n = pB->nN
1eda0 74 41 63 74 20 2d 20 70 41 2d 3e 6e 4e 74 41 63  tAct - pA->nNtAc
1edb0 74 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  t;.  if( n==0 ){
1edc0 0a 20 20 20 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b  .    n = pB->nTk
1edd0 6e 41 63 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41  nAct - pA->nTknA
1ede0 63 74 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30  ct;.    if( n==0
1edf0 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 42   ){.      n = pB
1ee00 2d 3e 73 74 61 74 65 6e 75 6d 20 2d 20 70 41 2d  ->statenum - pA-
1ee10 3e 73 74 61 74 65 6e 75 6d 3b 0a 20 20 20 20 7d  >statenum;.    }
1ee20 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
1ee30 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1ee40 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e  n;.}.../*.** Ren
1ee50 75 6d 62 65 72 20 61 6e 64 20 72 65 73 6f 72 74  umber and resort
1ee60 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20   states so that 
1ee70 73 74 61 74 65 73 20 77 69 74 68 20 66 65 77 65  states with fewe
1ee80 72 20 63 68 6f 69 63 65 73 0a 2a 2a 20 6f 63 63  r choices.** occ
1ee90 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ur at the end.  
1eea0 45 78 63 65 70 74 2c 20 6b 65 65 70 20 73 74 61  Except, keep sta
1eeb0 74 65 20 30 20 61 73 20 74 68 65 20 66 69 72 73  te 0 as the firs
1eec0 74 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64  t state..*/.void
1eed0 20 52 65 73 6f 72 74 53 74 61 74 65 73 28 73 74   ResortStates(st
1eee0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
1eef0 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  ).{.  int i;.  s
1ef00 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
1ef10 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
1ef20 6e 20 2a 61 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  n *ap;..  for(i=
1ef30 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
1ef40 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
1ef50 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
1ef60 69 5d 3b 0a 20 20 20 20 73 74 70 2d 3e 6e 54 6b  i];.    stp->nTk
1ef70 6e 41 63 74 20 3d 20 73 74 70 2d 3e 6e 4e 74 41  nAct = stp->nNtA
1ef80 63 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 70 2d  ct = 0;.    stp-
1ef90 3e 69 44 66 6c 74 20 3d 20 6c 65 6d 70 2d 3e 6e  >iDflt = lemp->n
1efa0 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72  state + lemp->nr
1efb0 75 6c 65 3b 0a 20 20 20 20 73 74 70 2d 3e 69 54  ule;.    stp->iT
1efc0 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53  knOfst = NO_OFFS
1efd0 45 54 3b 0a 20 20 20 20 73 74 70 2d 3e 69 4e 74  ET;.    stp->iNt
1efe0 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54  Ofst = NO_OFFSET
1eff0 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  ;.    for(ap=stp
1f000 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
1f010 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
1f020 28 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e  ( compute_action
1f030 28 6c 65 6d 70 2c 61 70 29 3e 3d 30 20 29 7b 0a  (lemp,ap)>=0 ){.
1f040 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e          if( ap->
1f050 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e  sp->index<lemp->
1f060 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20  nterminal ){.   
1f070 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e         stp->nTkn
1f080 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Act++;.        }
1f090 65 6c 73 65 20 69 66 28 20 61 70 2d 3e 73 70 2d  else if( ap->sp-
1f0a0 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73 79  >index<lemp->nsy
1f0b0 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  mbol ){.        
1f0c0 20 20 73 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b 3b    stp->nNtAct++;
1f0d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1f0e0 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e 69            stp->i
1f0f0 44 66 6c 74 20 3d 20 63 6f 6d 70 75 74 65 5f 61  Dflt = compute_a
1f100 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b  ction(lemp, ap);
1f110 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f120 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 71   }.    }.  }.  q
1f130 73 6f 72 74 28 26 6c 65 6d 70 2d 3e 73 6f 72 74  sort(&lemp->sort
1f140 65 64 5b 31 5d 2c 20 6c 65 6d 70 2d 3e 6e 73 74  ed[1], lemp->nst
1f150 61 74 65 2d 31 2c 20 73 69 7a 65 6f 66 28 6c 65  ate-1, sizeof(le
1f160 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 29 2c 0a  mp->sorted[0]),.
1f170 20 20 20 20 20 20 20 20 73 74 61 74 65 52 65 73          stateRes
1f180 6f 72 74 43 6f 6d 70 61 72 65 29 3b 0a 20 20 66  ortCompare);.  f
1f190 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1f1a0 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
1f1b0 20 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69    lemp->sorted[i
1f1c0 5d 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20 69 3b  ]->statenum = i;
1f1d0 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  .  }.}.../******
1f1e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
1f1f0 20 74 68 65 20 66 69 6c 65 20 22 73 65 74 2e 63   the file "set.c
1f200 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
1f210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f220 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65  ******/./*.** Se
1f230 74 20 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 20 72  t manipulation r
1f240 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 68 65 20  outines for the 
1f250 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
1f260 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74  erator..*/..stat
1f270 69 63 20 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b  ic int size = 0;
1f280 0a 0a 2f 2a 20 53 65 74 20 74 68 65 20 73 65 74  ../* Set the set
1f290 20 73 69 7a 65 20 2a 2f 0a 76 6f 69 64 20 53 65   size */.void Se
1f2a0 74 53 69 7a 65 28 69 6e 74 20 6e 29 0a 7b 0a 20  tSize(int n).{. 
1f2b0 20 73 69 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a   size = n+1;.}..
1f2c0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
1f2d0 77 20 73 65 74 20 2a 2f 0a 63 68 61 72 20 2a 53  w set */.char *S
1f2e0 65 74 4e 65 77 28 29 7b 0a 20 20 63 68 61 72 20  etNew(){.  char 
1f2f0 2a 73 3b 0a 20 20 73 20 3d 20 28 63 68 61 72 2a  *s;.  s = (char*
1f300 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 2c 20 31  )calloc( size, 1
1f310 29 3b 0a 20 20 69 66 28 20 73 3d 3d 30 20 29 7b  );.  if( s==0 ){
1f320 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64  .    extern void
1f330 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b   memory_error();
1f340 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  .    memory_erro
1f350 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r();.  }.  retur
1f360 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c  n s;.}../* Deall
1f370 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f 0a 76  ocate a set */.v
1f380 6f 69 64 20 53 65 74 46 72 65 65 28 63 68 61 72  oid SetFree(char
1f390 20 2a 73 29 0a 7b 0a 20 20 66 72 65 65 28 73 29   *s).{.  free(s)
1f3a0 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65  ;.}../* Add a ne
1f3b0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
1f3c0 20 73 65 74 2e 20 20 52 65 74 75 72 6e 20 54 52   set.  Return TR
1f3d0 55 45 20 69 66 20 74 68 65 20 65 6c 65 6d 65 6e  UE if the elemen
1f3e0 74 20 77 61 73 20 61 64 64 65 64 0a 2a 2a 20 61  t was added.** a
1f3f0 6e 64 20 46 41 4c 53 45 20 69 66 20 69 74 20 77  nd FALSE if it w
1f400 61 73 20 61 6c 72 65 61 64 79 20 74 68 65 72 65  as already there
1f410 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 41 64 64 28  . */.int SetAdd(
1f420 63 68 61 72 20 2a 73 2c 20 69 6e 74 20 65 29 0a  char *s, int e).
1f430 7b 0a 20 20 69 6e 74 20 72 76 3b 0a 20 20 61 73  {.  int rv;.  as
1f440 73 65 72 74 28 20 65 3e 3d 30 20 26 26 20 65 3c  sert( e>=0 && e<
1f450 73 69 7a 65 20 29 3b 0a 20 20 72 76 20 3d 20 73  size );.  rv = s
1f460 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20 31 3b  [e];.  s[e] = 1;
1f470 0a 20 20 72 65 74 75 72 6e 20 21 72 76 3b 0a 7d  .  return !rv;.}
1f480 0a 0a 2f 2a 20 41 64 64 20 65 76 65 72 79 20 65  ../* Add every e
1f490 6c 65 6d 65 6e 74 20 6f 66 20 73 32 20 74 6f 20  lement of s2 to 
1f4a0 73 31 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  s1.  Return TRUE
1f4b0 20 69 66 20 73 31 20 63 68 61 6e 67 65 73 2e 20   if s1 changes. 
1f4c0 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28  */.int SetUnion(
1f4d0 63 68 61 72 20 2a 73 31 2c 20 63 68 61 72 20 2a  char *s1, char *
1f4e0 73 32 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 70  s2).{.  int i, p
1f4f0 72 6f 67 72 65 73 73 3b 0a 20 20 70 72 6f 67 72  rogress;.  progr
1f500 65 73 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ess = 0;.  for(i
1f510 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
1f520 7b 0a 20 20 20 20 69 66 28 20 73 32 5b 69 5d 3d  {.    if( s2[i]=
1f530 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1f540 20 20 20 69 66 28 20 73 31 5b 69 5d 3d 3d 30 20     if( s1[i]==0 
1f550 29 7b 0a 20 20 20 20 20 20 70 72 6f 67 72 65 73  ){.      progres
1f560 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 31 5b  s = 1;.      s1[
1f570 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  i] = 1;.    }.  
1f580 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 6f 67 72  }.  return progr
1f590 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ess;.}./********
1f5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
1f5b0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74 61  rom the file "ta
1f5c0 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ble.c" *********
1f5d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f5e0 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63  ***/./*.** All c
1f5f0 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
1f600 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61   has been automa
1f610 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
1f620 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63  d.** from a spec
1f630 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65  ification in the
1f640 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20   file.**        
1f650 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a        "table.q".
1f660 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69  ** by the associ
1f670 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65  ative array code
1f680 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61   building progra
1f690 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f  m "aagen"..** Do
1f6a0 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66   not edit this f
1f6b0 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65  ile!  Instead, e
1f6c0 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63  dit the specific
1f6d0 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74  ation.** file, t
1f6e0 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e  hen rerun aagen.
1f6f0 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66  .*/./*.** Code f
1f700 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61  or processing ta
1f710 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  bles in the LEMO
1f720 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
1f730 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56 41 54 45 20  or..*/..PRIVATE 
1f740 69 6e 74 20 73 74 72 68 61 73 68 28 63 6f 6e 73  int strhash(cons
1f750 74 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20 69  t char *x).{.  i
1f760 6e 74 20 68 20 3d 20 30 3b 0a 20 20 77 68 69 6c  nt h = 0;.  whil
1f770 65 28 20 2a 78 29 20 68 20 3d 20 68 2a 31 33 20  e( *x) h = h*13 
1f780 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20 72 65 74 75  + *(x++);.  retu
1f790 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b  rn h;.}../* Work
1f7a0 73 20 6c 69 6b 65 20 73 74 72 64 75 70 2c 20 73  s like strdup, s
1f7b0 6f 72 74 20 6f 66 2e 20 20 53 61 76 65 20 61 20  ort of.  Save a 
1f7c0 73 74 72 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63  string in malloc
1f7d0 65 64 20 6d 65 6d 6f 72 79 2c 20 62 75 74 0a 2a  ed memory, but.*
1f7e0 2a 20 6b 65 65 70 20 73 74 72 69 6e 67 73 20 69  * keep strings i
1f7f0 6e 20 61 20 74 61 62 6c 65 20 73 6f 20 74 68 61  n a table so tha
1f800 74 20 74 68 65 20 73 61 6d 65 20 73 74 72 69 6e  t the same strin
1f810 67 20 69 73 20 6e 6f 74 20 69 6e 20 6d 6f 72 65  g is not in more
1f820 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 70 6c 61  .** than one pla
1f830 63 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ce..*/.const cha
1f840 72 20 2a 53 74 72 73 61 66 65 28 63 6f 6e 73 74  r *Strsafe(const
1f850 20 63 68 61 72 20 2a 79 29 0a 7b 0a 20 20 63 6f   char *y).{.  co
1f860 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63  nst char *z;.  c
1f870 68 61 72 20 2a 63 70 79 3b 0a 0a 20 20 69 66 28  har *cpy;..  if(
1f880 20 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   y==0 ) return 0
1f890 3b 0a 20 20 7a 20 3d 20 53 74 72 73 61 66 65 5f  ;.  z = Strsafe_
1f8a0 66 69 6e 64 28 79 29 3b 0a 20 20 69 66 28 20 7a  find(y);.  if( z
1f8b0 3d 3d 30 20 26 26 20 28 63 70 79 3d 28 63 68 61  ==0 && (cpy=(cha
1f8c0 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f  r *)malloc( lemo
1f8d0 6e 53 74 72 6c 65 6e 28 79 29 2b 31 20 29 29 21  nStrlen(y)+1 ))!
1f8e0 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79  =0 ){.    strcpy
1f8f0 28 63 70 79 2c 79 29 3b 0a 20 20 20 20 7a 20 3d  (cpy,y);.    z =
1f900 20 63 70 79 3b 0a 20 20 20 20 53 74 72 73 61 66   cpy;.    Strsaf
1f910 65 5f 69 6e 73 65 72 74 28 7a 29 3b 0a 20 20 7d  e_insert(z);.  }
1f920 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 7a  .  MemoryCheck(z
1f930 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
1f940 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
1f950 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
1f960 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1f970 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a  cture for each.*
1f980 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  * associative ar
1f990 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 31 22  ray of type "x1"
1f9a0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 31  ..*/.struct s_x1
1f9b0 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20   {.  int size;  
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f9d0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  The number of av
1f9e0 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a  ailable slots. *
1f9f0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
1fa10 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   Must be a power
1fa20 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68   of 2 greater th
1fa30 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  an or */.       
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f     /*   equal to
1fa60 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e   1 */.  int coun
1fa70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1fa80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
1fa90 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c  rently slots fil
1faa0 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  led */.  struct 
1fab0 73 5f 78 31 6e 6f 64 65 20 2a 74 62 6c 3b 20 20  s_x1node *tbl;  
1fac0 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72  /* The data stor
1fad0 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  ed here */.  str
1fae0 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 68  uct s_x1node **h
1faf0 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c  t;  /* Hash tabl
1fb00 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f  e for lookups */
1fb10 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  .};../* There is
1fb20 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
1fb30 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
1fb40 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65  for every data e
1fb50 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20  lement.** in an 
1fb60 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
1fb70 79 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a  y of type "x1"..
1fb80 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1fb90 74 20 73 5f 78 31 6e 6f 64 65 20 7b 0a 20 20 63  t s_x1node {.  c
1fba0 6f 6e 73 74 20 63 68 61 72 20 2a 64 61 74 61 3b  onst char *data;
1fbb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1fbc0 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ata */.  struct 
1fbd0 73 5f 78 31 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x1node *next; 
1fbe0 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
1fbf0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
1fc00 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
1fc10 5f 78 31 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x1node **from; 
1fc20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
1fc30 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a  k */.} x1node;..
1fc40 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
1fc50 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
1fc60 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
1fc70 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
1fc80 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
1fc90 75 63 74 20 73 5f 78 31 20 2a 78 31 61 3b 0a 0a  uct s_x1 *x1a;..
1fca0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
1fcb0 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
1fcc0 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 72 73  ray */.void Strs
1fcd0 61 66 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66  afe_init(){.  if
1fce0 28 20 78 31 61 20 29 20 72 65 74 75 72 6e 3b 0a  ( x1a ) return;.
1fcf0 20 20 78 31 61 20 3d 20 28 73 74 72 75 63 74 20    x1a = (struct 
1fd00 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  s_x1*)malloc( si
1fd10 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 31  zeof(struct s_x1
1fd20 29 20 29 3b 0a 20 20 69 66 28 20 78 31 61 20 29  ) );.  if( x1a )
1fd30 7b 0a 20 20 20 20 78 31 61 2d 3e 73 69 7a 65 20  {.    x1a->size 
1fd40 3d 20 31 30 32 34 3b 0a 20 20 20 20 78 31 61 2d  = 1024;.    x1a-
1fd50 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  >count = 0;.    
1fd60 78 31 61 2d 3e 74 62 6c 20 3d 20 28 78 31 6e 6f  x1a->tbl = (x1no
1fd70 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20  de*)malloc( .   
1fd80 20 20 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f 64     (sizeof(x1nod
1fd90 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f  e) + sizeof(x1no
1fda0 64 65 2a 29 29 2a 31 30 32 34 20 29 3b 0a 20 20  de*))*1024 );.  
1fdb0 20 20 69 66 28 20 78 31 61 2d 3e 74 62 6c 3d 3d    if( x1a->tbl==
1fdc0 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
1fdd0 78 31 61 29 3b 0a 20 20 20 20 20 20 78 31 61 20  x1a);.      x1a 
1fde0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1fdf0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1fe00 20 20 20 78 31 61 2d 3e 68 74 20 3d 20 28 78 31     x1a->ht = (x1
1fe10 6e 6f 64 65 2a 2a 29 26 28 78 31 61 2d 3e 74 62  node**)&(x1a->tb
1fe20 6c 5b 31 30 32 34 5d 29 3b 0a 20 20 20 20 20 20  l[1024]);.      
1fe30 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30 32 34 3b  for(i=0; i<1024;
1fe40 20 69 2b 2b 29 20 78 31 61 2d 3e 68 74 5b 69 5d   i++) x1a->ht[i]
1fe50 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1fe60 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
1fe70 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
1fe80 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
1fe90 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
1fea0 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
1feb0 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
1fec0 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
1fed0 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53  written */.int S
1fee0 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 63 6f  trsafe_insert(co
1fef0 6e 73 74 20 63 68 61 72 20 2a 64 61 74 61 29 0a  nst char *data).
1ff00 7b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a  {.  x1node *np;.
1ff10 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70    int h;.  int p
1ff20 68 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30  h;..  if( x1a==0
1ff30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
1ff40 68 20 3d 20 73 74 72 68 61 73 68 28 64 61 74 61  h = strhash(data
1ff50 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
1ff60 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  1a->size-1);.  n
1ff70 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x1a->ht[h];.
1ff80 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
1ff90 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70     if( strcmp(np
1ffa0 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d 30 20  ->data,data)==0 
1ffb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ){.      /* An e
1ffc0 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69  xisting entry wi
1ffd0 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
1ffe0 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20  is found. */.   
1fff0 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75     /* Fail becau
20000 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20  se overwrite is 
20010 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20  not allows. */. 
20020 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
20030 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70     }.    np = np
20040 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  ->next;.  }.  if
20050 28 20 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d 78 31  ( x1a->count>=x1
20060 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f  a->size ){.    /
20070 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74  * Need to make t
20080 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69  he hash table bi
20090 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  gger */.    int 
200a0 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75  i,size;.    stru
200b0 63 74 20 73 5f 78 31 20 61 72 72 61 79 3b 0a 20  ct s_x1 array;. 
200c0 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20     array.size = 
200d0 73 69 7a 65 20 3d 20 78 31 61 2d 3e 73 69 7a 65  size = x1a->size
200e0 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f  *2;.    array.co
200f0 75 6e 74 20 3d 20 78 31 61 2d 3e 63 6f 75 6e 74  unt = x1a->count
20100 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20  ;.    array.tbl 
20110 3d 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f  = (x1node*)mallo
20120 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66  c(.      (sizeof
20130 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x1node) + sizeo
20140 66 28 78 31 6e 6f 64 65 2a 29 29 2a 73 69 7a 65  f(x1node*))*size
20150 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61   );.    if( arra
20160 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72  y.tbl==0 ) retur
20170 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75  n 0;  /* Fail du
20180 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e to malloc fail
20190 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79  ure */.    array
201a0 2e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29  .ht = (x1node**)
201b0 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65  &(array.tbl[size
201c0 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
201d0 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72   i<size; i++) ar
201e0 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  ray.ht[i] = 0;. 
201f0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 31     for(i=0; i<x1
20200 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a  a->count; i++){.
20210 20 20 20 20 20 20 78 31 6e 6f 64 65 20 2a 6f 6c        x1node *ol
20220 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20  dnp, *newnp;.   
20230 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 31 61     oldnp = &(x1a
20240 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  ->tbl[i]);.     
20250 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64   h = strhash(old
20260 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 73 69 7a  np->data) & (siz
20270 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
20280 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
20290 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
202a0 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
202b0 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
202c0 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
202d0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
202e0 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
202f0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
20300 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
20310 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
20320 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
20330 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
20340 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
20350 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
20360 28 78 31 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x1a->tbl);.    
20370 2a 78 31 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x1a = array;.  
20380 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
20390 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
203a0 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73  h = ph & (x1a->s
203b0 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
203c0 28 78 31 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63  (x1a->tbl[x1a->c
203d0 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
203e0 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
203f0 66 28 20 78 31 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x1a->ht[h] ) 
20400 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x1a->ht[h]->from
20410 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
20420 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 31 61    np->next = x1a
20430 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e  ->ht[h];.  x1a->
20440 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
20450 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 31 61 2d 3e  ->from = &(x1a->
20460 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
20470 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
20480 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
20490 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
204a0 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
204b0 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
204c0 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
204d0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72  .const char *Str
204e0 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73 74 20  safe_find(const 
204f0 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 69  char *key).{.  i
20500 6e 74 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20 2a  nt h;.  x1node *
20510 6e 70 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d  np;..  if( x1a==
20520 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
20530 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29  h = strhash(key)
20540 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29   & (x1a->size-1)
20550 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74  ;.  np = x1a->ht
20560 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
20570 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
20580 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29  mp(np->data,key)
20590 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
205a0 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
205b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20    }.  return np 
205c0 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a  ? np->data : 0;.
205d0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
205e0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 28 74  ointer to the (t
205f0 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65  erminal or nonte
20600 72 6d 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20 22  rminal) symbol "
20610 78 22 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  x"..** Create a 
20620 6e 65 77 20 73 79 6d 62 6f 6c 20 69 66 20 74 68  new symbol if th
20630 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
20640 74 69 6d 65 20 22 78 22 20 68 61 73 20 62 65 65  time "x" has bee
20650 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63  n seen..*/.struc
20660 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c  t symbol *Symbol
20670 5f 6e 65 77 28 63 6f 6e 73 74 20 63 68 61 72 20  _new(const char 
20680 2a 78 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  *x).{.  struct s
20690 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73 70  ymbol *sp;..  sp
206a0 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78   = Symbol_find(x
206b0 29 3b 0a 20 20 69 66 28 20 73 70 3d 3d 30 20 29  );.  if( sp==0 )
206c0 7b 0a 20 20 20 20 73 70 20 3d 20 28 73 74 72 75  {.    sp = (stru
206d0 63 74 20 73 79 6d 62 6f 6c 20 2a 29 63 61 6c 6c  ct symbol *)call
206e0 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72  oc(1, sizeof(str
206f0 75 63 74 20 73 79 6d 62 6f 6c 29 20 29 3b 0a 20  uct symbol) );. 
20700 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73     MemoryCheck(s
20710 70 29 3b 0a 20 20 20 20 73 70 2d 3e 6e 61 6d 65  p);.    sp->name
20720 20 3d 20 53 74 72 73 61 66 65 28 78 29 3b 0a 20   = Strsafe(x);. 
20730 20 20 20 73 70 2d 3e 74 79 70 65 20 3d 20 69 73     sp->type = is
20740 75 70 70 65 72 28 2a 78 29 20 3f 20 54 45 52 4d  upper(*x) ? TERM
20750 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e  INAL : NONTERMIN
20760 41 4c 3b 0a 20 20 20 20 73 70 2d 3e 72 75 6c 65  AL;.    sp->rule
20770 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 66 61   = 0;.    sp->fa
20780 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20  llback = 0;.    
20790 73 70 2d 3e 70 72 65 63 20 3d 20 2d 31 3b 0a 20  sp->prec = -1;. 
207a0 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 55     sp->assoc = U
207b0 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e 66 69 72 73  NK;.    sp->firs
207c0 74 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 73 70  tset = 0;.    sp
207d0 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e  ->lambda = LEMON
207e0 5f 46 41 4c 53 45 3b 0a 20 20 20 20 73 70 2d 3e  _FALSE;.    sp->
207f0 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a  destructor = 0;.
20800 20 20 20 20 73 70 2d 3e 64 65 73 74 4c 69 6e 65      sp->destLine
20810 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  no = 0;.    sp->
20820 64 61 74 61 74 79 70 65 20 3d 20 30 3b 0a 20 20  datatype = 0;.  
20830 20 20 73 70 2d 3e 75 73 65 43 6e 74 20 3d 20 30    sp->useCnt = 0
20840 3b 0a 20 20 20 20 53 79 6d 62 6f 6c 5f 69 6e 73  ;.    Symbol_ins
20850 65 72 74 28 73 70 2c 73 70 2d 3e 6e 61 6d 65 29  ert(sp,sp->name)
20860 3b 0a 20 20 7d 0a 20 20 73 70 2d 3e 75 73 65 43  ;.  }.  sp->useC
20870 6e 74 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73  nt++;.  return s
20880 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65  p;.}../* Compare
20890 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 66 6f 72   two symbols for
208a0 20 77 6f 72 6b 69 6e 67 20 70 75 72 70 6f 73 65   working purpose
208b0 73 0a 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 73 20  s.**.** Symbols 
208c0 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
208d0 75 70 70 65 72 20 63 61 73 65 20 6c 65 74 74 65  upper case lette
208e0 72 73 20 28 74 65 72 6d 69 6e 61 6c 73 20 6f 72  rs (terminals or
208f0 20 74 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75 73 74   tokens).** must
20900 20 73 6f 72 74 20 62 65 66 6f 72 65 20 73 79 6d   sort before sym
20910 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69 6e 20  bols that begin 
20920 77 69 74 68 20 6c 6f 77 65 72 20 63 61 73 65 20  with lower case 
20930 6c 65 74 74 65 72 73 0a 2a 2a 20 28 6e 6f 6e 2d  letters.** (non-
20940 74 65 72 6d 69 6e 61 6c 73 29 2e 20 20 4f 74 68  terminals).  Oth
20950 65 72 20 74 68 61 6e 20 74 68 61 74 2c 20 74 68  er than that, th
20960 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6e 6f 74  e order does not
20970 20 6d 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   matter..**.** W
20980 65 20 66 69 6e 64 20 65 78 70 65 72 69 6d 65 6e  e find experimen
20990 74 61 6c 6c 79 20 74 68 61 74 20 6c 65 61 76 69  tally that leavi
209a0 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 69  ng the symbols i
209b0 6e 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c  n their original
209c0 0a 2a 2a 20 6f 72 64 65 72 20 28 74 68 65 20 6f  .** order (the o
209d0 72 64 65 72 20 74 68 65 79 20 61 70 70 65 61 72  rder they appear
209e0 65 64 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  ed in the gramma
209f0 72 20 66 69 6c 65 29 20 67 69 76 65 73 20 74 68  r file) gives th
20a00 65 0a 2a 2a 20 73 6d 61 6c 6c 65 73 74 20 70 61  e.** smallest pa
20a10 72 73 65 72 20 74 61 62 6c 65 73 20 69 6e 20 53  rser tables in S
20a20 51 4c 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20 53 79  QLite..*/.int Sy
20a30 6d 62 6f 6c 63 6d 70 70 28 63 6f 6e 73 74 20 76  mbolcmpp(const v
20a40 6f 69 64 20 2a 5f 61 2c 20 63 6f 6e 73 74 20 76  oid *_a, const v
20a50 6f 69 64 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e  oid *_b).{.  con
20a60 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  st struct symbol
20a70 20 2a 2a 61 20 3d 20 28 63 6f 6e 73 74 20 73 74   **a = (const st
20a80 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20  ruct symbol **) 
20a90 5f 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  _a;.  const stru
20aa0 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 62 20 3d 20  ct symbol **b = 
20ab0 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79  (const struct sy
20ac0 6d 62 6f 6c 20 2a 2a 29 20 5f 62 3b 0a 20 20 69  mbol **) _b;.  i
20ad0 6e 74 20 69 31 20 3d 20 28 2a 2a 61 29 2e 69 6e  nt i1 = (**a).in
20ae0 64 65 78 20 2b 20 31 30 30 30 30 30 30 30 2a 28  dex + 10000000*(
20af0 28 2a 2a 61 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a  (**a).name[0]>'Z
20b00 27 29 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 28  ');.  int i2 = (
20b10 2a 2a 62 29 2e 69 6e 64 65 78 20 2b 20 31 30 30  **b).index + 100
20b20 30 30 30 30 30 2a 28 28 2a 2a 62 29 2e 6e 61 6d  00000*((**b).nam
20b30 65 5b 30 5d 3e 27 5a 27 29 3b 0a 20 20 61 73 73  e[0]>'Z');.  ass
20b40 65 72 74 28 20 69 31 21 3d 69 32 20 7c 7c 20 73  ert( i1!=i2 || s
20b50 74 72 63 6d 70 28 28 2a 2a 61 29 2e 6e 61 6d 65  trcmp((**a).name
20b60 2c 28 2a 2a 62 29 2e 6e 61 6d 65 29 3d 3d 30 20  ,(**b).name)==0 
20b70 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 31 2d 69  );.  return i1-i
20b80 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  2;.}../* There i
20b90 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
20ba0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
20bb0 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
20bc0 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
20bd0 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
20be0 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x2"..*/.struct 
20bf0 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x2 {.  int siz
20c00 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
20c10 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
20c20 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
20c30 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
20c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c50 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
20c60 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
20c70 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c90 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
20ca0 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
20cb0 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
20cc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20cd0 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
20ce0 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
20cf0 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 74 62  uct s_x2node *tb
20d00 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
20d10 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
20d20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
20d30 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
20d40 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
20d50 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
20d60 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
20d70 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
20d80 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
20d90 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
20da0 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
20db0 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
20dc0 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  2"..*/.typedef s
20dd0 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 7b  truct s_x2node {
20de0 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
20df0 20 2a 64 61 74 61 3b 20 20 20 20 20 2f 2a 20 54   *data;     /* T
20e00 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 63 6f 6e  he data */.  con
20e10 73 74 20 63 68 61 72 20 2a 6b 65 79 3b 20 20 20  st char *key;   
20e20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79        /* The key
20e30 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
20e40 32 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f  2node *next;   /
20e50 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74  * Next entry wit
20e60 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20  h the same hash 
20e70 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32  */.  struct s_x2
20e80 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a  node **from;  /*
20e90 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a   Previous link *
20ea0 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20  /.} x2node;../* 
20eb0 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e  There is only on
20ec0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
20ed0 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69  e array, which i
20ee0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
20ef0 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
20f00 20 73 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20   s_x2 *x2a;../* 
20f10 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61  Allocate a new a
20f20 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
20f30 20 2a 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f   */.void Symbol_
20f40 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 32  init(){.  if( x2
20f50 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 32  a ) return;.  x2
20f60 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 32  a = (struct s_x2
20f70 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
20f80 28 73 74 72 75 63 74 20 73 5f 78 32 29 20 29 3b  (struct s_x2) );
20f90 0a 20 20 69 66 28 20 78 32 61 20 29 7b 0a 20 20  .  if( x2a ){.  
20fa0 20 20 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32    x2a->size = 12
20fb0 38 3b 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e  8;.    x2a->coun
20fc0 74 20 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e  t = 0;.    x2a->
20fd0 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d  tbl = (x2node*)m
20fe0 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73  alloc( .      (s
20ff0 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20  izeof(x2node) + 
21000 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29  sizeof(x2node*))
21010 2a 31 32 38 20 29 3b 0a 20 20 20 20 69 66 28 20  *128 );.    if( 
21020 78 32 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20  x2a->tbl==0 ){. 
21030 20 20 20 20 20 66 72 65 65 28 78 32 61 29 3b 0a       free(x2a);.
21040 20 20 20 20 20 20 78 32 61 20 3d 20 30 3b 0a 20        x2a = 0;. 
21050 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21060 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 32 61  int i;.      x2a
21070 2d 3e 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a  ->ht = (x2node**
21080 29 26 28 78 32 61 2d 3e 74 62 6c 5b 31 32 38 5d  )&(x2a->tbl[128]
21090 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
210a0 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 32  ; i<128; i++) x2
210b0 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
210c0 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73    }.  }.}./* Ins
210d0 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
210e0 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e   into the array.
210f0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
21100 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20   successful..** 
21110 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20  Prior data with 
21120 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
21130 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20  NOT overwritten 
21140 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e  */.int Symbol_in
21150 73 65 72 74 28 73 74 72 75 63 74 20 73 79 6d 62  sert(struct symb
21160 6f 6c 20 2a 64 61 74 61 2c 20 63 6f 6e 73 74 20  ol *data, const 
21170 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 78  char *key).{.  x
21180 32 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74  2node *np;.  int
21190 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20   h;.  int ph;.. 
211a0 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65   if( x2a==0 ) re
211b0 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73  turn 0;.  ph = s
211c0 74 72 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68  trhash(key);.  h
211d0 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69   = ph & (x2a->si
211e0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32  ze-1);.  np = x2
211f0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
21200 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
21210 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c   strcmp(np->key,
21220 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  key)==0 ){.     
21230 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
21240 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
21250 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64  ame key is found
21260 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61  . */.      /* Fa
21270 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77  il because overw
21280 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  rite is not allo
21290 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ws. */.      ret
212a0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
212b0 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
212c0 20 20 7d 0a 20 20 69 66 28 20 78 32 61 2d 3e 63    }.  if( x2a->c
212d0 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a 65 20  ount>=x2a->size 
212e0 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  ){.    /* Need t
212f0 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
21300 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a  table bigger */.
21310 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a      int i,size;.
21320 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 32 20      struct s_x2 
21330 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79  array;.    array
21340 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78  .size = size = x
21350 32 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20  2a->size*2;.    
21360 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 32  array.count = x2
21370 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72  a->count;.    ar
21380 72 61 79 2e 74 62 6c 20 3d 20 28 78 32 6e 6f 64  ray.tbl = (x2nod
21390 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e*)malloc(.     
213a0 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29   (sizeof(x2node)
213b0 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65   + sizeof(x2node
213c0 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20  *))*size );.    
213d0 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30  if( array.tbl==0
213e0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
213f0 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c   Fail due to mal
21400 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  loc failure */. 
21410 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78     array.ht = (x
21420 32 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e  2node**)&(array.
21430 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20  tbl[size]);.    
21440 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
21450 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69   i++) array.ht[i
21460 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  ] = 0;.    for(i
21470 3d 30 3b 20 69 3c 78 32 61 2d 3e 63 6f 75 6e 74  =0; i<x2a->count
21480 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 32  ; i++){.      x2
21490 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65  node *oldnp, *ne
214a0 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70  wnp;.      oldnp
214b0 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b 69 5d   = &(x2a->tbl[i]
214c0 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72  );.      h = str
214d0 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29  hash(oldnp->key)
214e0 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20   & (size-1);.   
214f0 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72     newnp = &(arr
21500 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  ay.tbl[i]);.    
21510 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68    if( array.ht[h
21520 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d  ] ) array.ht[h]-
21530 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d  >from = &(newnp-
21540 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65  >next);.      ne
21550 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61  wnp->next = arra
21560 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e  y.ht[h];.      n
21570 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e  ewnp->key = oldn
21580 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65  p->key;.      ne
21590 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e  wnp->data = oldn
215a0 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e  p->data;.      n
215b0 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61  ewnp->from = &(a
215c0 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20  rray.ht[h]);.   
215d0 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d     array.ht[h] =
215e0 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20   newnp;.    }.  
215f0 20 20 66 72 65 65 28 78 32 61 2d 3e 74 62 6c 29    free(x2a->tbl)
21600 3b 0a 20 20 20 20 2a 78 32 61 20 3d 20 61 72 72  ;.    *x2a = arr
21610 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73  ay;.  }.  /* Ins
21620 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61  ert the new data
21630 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28   */.  h = ph & (
21640 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x2a->size-1);.  
21650 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b  np = &(x2a->tbl[
21660 78 32 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a  x2a->count++]);.
21670 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b    np->key = key;
21680 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61  .  np->data = da
21690 74 61 3b 0a 20 20 69 66 28 20 78 32 61 2d 3e 68  ta;.  if( x2a->h
216a0 74 5b 68 5d 20 29 20 78 32 61 2d 3e 68 74 5b 68  t[h] ) x2a->ht[h
216b0 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e  ]->from = &(np->
216c0 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78  next);.  np->nex
216d0 74 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a  t = x2a->ht[h];.
216e0 20 20 78 32 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e    x2a->ht[h] = n
216f0 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20  p;.  np->from = 
21700 26 28 78 32 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20  &(x2a->ht[h]);. 
21710 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
21720 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
21730 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e  r to data assign
21740 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  ed to the given 
21750 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  key.  Return NUL
21760 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20  L.** if no such 
21770 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  key. */.struct s
21780 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69  ymbol *Symbol_fi
21790 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b  nd(const char *k
217a0 65 79 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20  ey).{.  int h;. 
217b0 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20   x2node *np;..  
217c0 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74  if( x2a==0 ) ret
217d0 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72  urn 0;.  h = str
217e0 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 32 61  hash(key) & (x2a
217f0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
21800 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x2a->ht[h];.  
21810 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
21820 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e   if( strcmp(np->
21830 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72  key,key)==0 ) br
21840 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70  eak;.    np = np
21850 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  ->next;.  }.  re
21860 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61  turn np ? np->da
21870 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  ta : 0;.}../* Re
21880 74 75 72 6e 20 74 68 65 20 6e 2d 74 68 20 64 61  turn the n-th da
21890 74 61 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ta.  Return NULL
218a0 20 69 66 20 6e 20 69 73 20 6f 75 74 20 6f 66 20   if n is out of 
218b0 72 61 6e 67 65 2e 20 2a 2f 0a 73 74 72 75 63 74  range. */.struct
218c0 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
218d0 4e 74 68 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73  Nth(int n).{.  s
218e0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61  truct symbol *da
218f0 74 61 3b 0a 20 20 69 66 28 20 78 32 61 20 26 26  ta;.  if( x2a &&
21900 20 6e 3e 30 20 26 26 20 6e 3c 3d 78 32 61 2d 3e   n>0 && n<=x2a->
21910 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20 64 61 74  count ){.    dat
21920 61 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31  a = x2a->tbl[n-1
21930 5d 2e 64 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b  ].data;.  }else{
21940 0a 20 20 20 20 64 61 74 61 20 3d 20 30 3b 0a 20  .    data = 0;. 
21950 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61   }.  return data
21960 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
21970 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
21980 72 72 61 79 20 2a 2f 0a 69 6e 74 20 53 79 6d 62  rray */.int Symb
21990 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b 0a 20 20 72  ol_count().{.  r
219a0 65 74 75 72 6e 20 78 32 61 20 3f 20 78 32 61 2d  eturn x2a ? x2a-
219b0 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f  >count : 0;.}../
219c0 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61  * Return an arra
219d0 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  y of pointers to
219e0 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65   all data in the
219f0 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61   table..** The a
21a00 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64  rray is obtained
21a10 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52   from malloc.  R
21a20 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65  eturn NULL if me
21a30 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
21a40 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20  ** problems, or 
21a50 69 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  if the array is 
21a60 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74  empty. */.struct
21a70 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c   symbol **Symbol
21a80 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73  _arrayof().{.  s
21a90 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61  truct symbol **a
21aa0 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69  rray;.  int i,si
21ab0 7a 65 3b 0a 20 20 69 66 28 20 78 32 61 3d 3d 30  ze;.  if( x2a==0
21ac0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
21ad0 69 7a 65 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74  ize = x2a->count
21ae0 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74 72  ;.  array = (str
21af0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 63 61  uct symbol **)ca
21b00 6c 6c 6f 63 28 73 69 7a 65 2c 20 73 69 7a 65 6f  lloc(size, sizeo
21b10 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  f(struct symbol 
21b20 2a 29 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79  *));.  if( array
21b30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
21b40 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72   i<size; i++) ar
21b50 72 61 79 5b 69 5d 20 3d 20 78 32 61 2d 3e 74 62  ray[i] = x2a->tb
21b60 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20  l[i].data;.  }. 
21b70 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d   return array;.}
21b80 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  ../* Compare two
21b90 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
21ba0 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70  */.int Configcmp
21bb0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f 61 2c  (const char *_a,
21bc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 5f 62 29 0a  const char *_b).
21bd0 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  {.  const struct
21be0 20 63 6f 6e 66 69 67 20 2a 61 20 3d 20 28 73 74   config *a = (st
21bf0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 5f  ruct config *) _
21c00 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  a;.  const struc
21c10 74 20 63 6f 6e 66 69 67 20 2a 62 20 3d 20 28 73  t config *b = (s
21c20 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20  truct config *) 
21c30 5f 62 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78  _b;.  int x;.  x
21c40 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20   = a->rp->index 
21c50 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a  - b->rp->index;.
21c60 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d    if( x==0 ) x =
21c70 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74   a->dot - b->dot
21c80 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a  ;.  return x;.}.
21c90 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
21ca0 73 74 61 74 65 73 20 2a 2f 0a 50 52 49 56 41 54  states */.PRIVAT
21cb0 45 20 69 6e 74 20 73 74 61 74 65 63 6d 70 28 73  E int statecmp(s
21cc0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 2c  truct config *a,
21cd0 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
21ce0 62 29 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  b).{.  int rc;. 
21cf0 20 66 6f 72 28 72 63 3d 30 3b 20 72 63 3d 3d 30   for(rc=0; rc==0
21d00 20 26 26 20 61 20 26 26 20 62 3b 20 20 61 3d 61   && a && b;  a=a
21d10 2d 3e 62 70 2c 20 62 3d 62 2d 3e 62 70 29 7b 0a  ->bp, b=b->bp){.
21d20 20 20 20 20 72 63 20 3d 20 61 2d 3e 72 70 2d 3e      rc = a->rp->
21d30 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69  index - b->rp->i
21d40 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 72 63  ndex;.    if( rc
21d50 3d 3d 30 20 29 20 72 63 20 3d 20 61 2d 3e 64 6f  ==0 ) rc = a->do
21d60 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d 0a  t - b->dot;.  }.
21d70 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
21d80 20 20 20 69 66 28 20 61 20 29 20 72 63 20 3d 20     if( a ) rc = 
21d90 31 3b 0a 20 20 20 20 69 66 28 20 62 20 29 20 72  1;.    if( b ) r
21da0 63 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  c = -1;.  }.  re
21db0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 48  turn rc;.}../* H
21dc0 61 73 68 20 61 20 73 74 61 74 65 20 2a 2f 0a 50  ash a state */.P
21dd0 52 49 56 41 54 45 20 69 6e 74 20 73 74 61 74 65  RIVATE int state
21de0 68 61 73 68 28 73 74 72 75 63 74 20 63 6f 6e 66  hash(struct conf
21df0 69 67 20 2a 61 29 0a 7b 0a 20 20 69 6e 74 20 68  ig *a).{.  int h
21e00 3d 30 3b 0a 20 20 77 68 69 6c 65 28 20 61 20 29  =0;.  while( a )
21e10 7b 0a 20 20 20 20 68 20 3d 20 68 2a 35 37 31 20  {.    h = h*571 
21e20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33  + a->rp->index*3
21e30 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 20 20  7 + a->dot;.    
21e40 61 20 3d 20 61 2d 3e 62 70 3b 0a 20 20 7d 0a 20  a = a->bp;.  }. 
21e50 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a   return h;.}../*
21e60 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
21e70 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20  state structure 
21e80 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  */.struct state 
21e90 2a 53 74 61 74 65 5f 6e 65 77 28 29 0a 7b 0a 20  *State_new().{. 
21ea0 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e   struct state *n
21eb0 65 77 73 74 61 74 65 3b 0a 20 20 6e 65 77 73 74  ewstate;.  newst
21ec0 61 74 65 20 3d 20 28 73 74 72 75 63 74 20 73 74  ate = (struct st
21ed0 61 74 65 20 2a 29 63 61 6c 6c 6f 63 28 31 2c 20  ate *)calloc(1, 
21ee0 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74  sizeof(struct st
21ef0 61 74 65 29 20 29 3b 0a 20 20 4d 65 6d 6f 72 79  ate) );.  Memory
21f00 43 68 65 63 6b 28 6e 65 77 73 74 61 74 65 29 3b  Check(newstate);
21f10 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 73 74 61  .  return newsta
21f20 74 65 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20  te;.}../* There 
21f30 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
21f40 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
21f50 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
21f60 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
21f70 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
21f80 20 22 78 33 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x3"..*/.struct
21f90 20 73 5f 78 33 20 7b 0a 20 20 69 6e 74 20 73 69   s_x3 {.  int si
21fa0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
21fb0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
21fc0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
21fd0 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
21fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ff0 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
22000 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
22010 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
22020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22030 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
22040 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
22050 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
22060 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22070 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
22080 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
22090 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 74  ruct s_x3node *t
220a0 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
220b0 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
220c0 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
220d0 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
220e0 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
220f0 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
22100 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
22110 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
22120 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
22130 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
22140 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
22150 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
22160 78 33 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x3"..*/.typedef 
22170 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
22180 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
22190 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
221a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
221b0 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74  data */.  struct
221c0 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 20 20 20   config *key;   
221d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221e0 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
221f0 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
22200 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74  *next;   /* Next
22210 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
22220 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73  same hash */.  s
22230 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a  truct s_x3node *
22240 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69  *from;  /* Previ
22250 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 33  ous link */.} x3
22260 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  node;../* There 
22270 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74  is only one inst
22280 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61  ance of the arra
22290 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  y, which is the 
222a0 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61  following */.sta
222b0 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 33 20  tic struct s_x3 
222c0 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  *x3a;../* Alloca
222d0 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61  te a new associa
222e0 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f  tive array */.vo
222f0 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28 29 7b  id State_init(){
22300 0a 20 20 69 66 28 20 78 33 61 20 29 20 72 65 74  .  if( x3a ) ret
22310 75 72 6e 3b 0a 20 20 78 33 61 20 3d 20 28 73 74  urn;.  x3a = (st
22320 72 75 63 74 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f  ruct s_x3*)mallo
22330 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
22340 20 73 5f 78 33 29 20 29 3b 0a 20 20 69 66 28 20   s_x3) );.  if( 
22350 78 33 61 20 29 7b 0a 20 20 20 20 78 33 61 2d 3e  x3a ){.    x3a->
22360 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20  size = 128;.    
22370 78 33 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x3a->count = 0;.
22380 20 20 20 20 78 33 61 2d 3e 74 62 6c 20 3d 20 28      x3a->tbl = (
22390 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20  x3node*)malloc( 
223a0 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
223b0 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  3node) + sizeof(
223c0 78 33 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b  x3node*))*128 );
223d0 0a 20 20 20 20 69 66 28 20 78 33 61 2d 3e 74 62  .    if( x3a->tb
223e0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  l==0 ){.      fr
223f0 65 65 28 78 33 61 29 3b 0a 20 20 20 20 20 20 78  ee(x3a);.      x
22400 33 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  3a = 0;.    }els
22410 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
22420 20 20 20 20 20 20 78 33 61 2d 3e 68 74 20 3d 20        x3a->ht = 
22430 28 78 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d  (x3node**)&(x3a-
22440 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20  >tbl[128]);.    
22450 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38    for(i=0; i<128
22460 3b 20 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69  ; i++) x3a->ht[i
22470 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
22480 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e  .}./* Insert a n
22490 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
224a0 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  he array.  Retur
224b0 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73  n TRUE if succes
224c0 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64  sful..** Prior d
224d0 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d  ata with the sam
224e0 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65  e key is NOT ove
224f0 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20  rwritten */.int 
22500 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74 72  State_insert(str
22510 75 63 74 20 73 74 61 74 65 20 2a 64 61 74 61 2c  uct state *data,
22520 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
22530 6b 65 79 29 0a 7b 0a 20 20 78 33 6e 6f 64 65 20  key).{.  x3node 
22540 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  *np;.  int h;.  
22550 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78  int ph;..  if( x
22560 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  3a==0 ) return 0
22570 3b 0a 20 20 70 68 20 3d 20 73 74 61 74 65 68 61  ;.  ph = stateha
22580 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70  sh(key);.  h = p
22590 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31  h & (x3a->size-1
225a0 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68  );.  np = x3a->h
225b0 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
225c0 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61  p ){.    if( sta
225d0 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65  tecmp(np->key,ke
225e0 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  y)==0 ){.      /
225f0 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  * An existing en
22600 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
22610 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20  e key is found. 
22620 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  */.      /* Fail
22630 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69   because overwri
22640 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73  te is not allows
22650 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
22660 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
22670 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
22680 7d 0a 20 20 69 66 28 20 78 33 61 2d 3e 63 6f 75  }.  if( x3a->cou
22690 6e 74 3e 3d 78 33 61 2d 3e 73 69 7a 65 20 29 7b  nt>=x3a->size ){
226a0 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
226b0 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
226c0 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20  ble bigger */.  
226d0 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20    int i,size;.  
226e0 20 20 73 74 72 75 63 74 20 73 5f 78 33 20 61 72    struct s_x3 ar
226f0 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73  ray;.    array.s
22700 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 33 61  ize = size = x3a
22710 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72  ->size*2;.    ar
22720 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 33 61 2d  ray.count = x3a-
22730 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61  >count;.    arra
22740 79 2e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a  y.tbl = (x3node*
22750 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28  )malloc(.      (
22760 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b  sizeof(x3node) +
22770 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29   sizeof(x3node*)
22780 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66  )*size );.    if
22790 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29  ( array.tbl==0 )
227a0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46   return 0;  /* F
227b0 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f  ail due to mallo
227c0 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20  c failure */.   
227d0 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 33 6e   array.ht = (x3n
227e0 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62  ode**)&(array.tb
227f0 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f  l[size]);.    fo
22800 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
22810 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20  ++) array.ht[i] 
22820 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
22830 3b 20 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x3a->count; 
22840 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e 6f  i++){.      x3no
22850 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e  de *oldnp, *newn
22860 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d  p;.      oldnp =
22870 20 26 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b   &(x3a->tbl[i]);
22880 0a 20 20 20 20 20 20 68 20 3d 20 73 74 61 74 65  .      h = state
22890 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29  hash(oldnp->key)
228a0 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20   & (size-1);.   
228b0 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72     newnp = &(arr
228c0 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  ay.tbl[i]);.    
228d0 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68    if( array.ht[h
228e0 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d  ] ) array.ht[h]-
228f0 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d  >from = &(newnp-
22900 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65  >next);.      ne
22910 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61  wnp->next = arra
22920 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e  y.ht[h];.      n
22930 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e  ewnp->key = oldn
22940 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65  p->key;.      ne
22950 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e  wnp->data = oldn
22960 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e  p->data;.      n
22970 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61  ewnp->from = &(a
22980 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20  rray.ht[h]);.   
22990 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d     array.ht[h] =
229a0 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20   newnp;.    }.  
229b0 20 20 66 72 65 65 28 78 33 61 2d 3e 74 62 6c 29    free(x3a->tbl)
229c0 3b 0a 20 20 20 20 2a 78 33 61 20 3d 20 61 72 72  ;.    *x3a = arr
229d0 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73  ay;.  }.  /* Ins
229e0 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61  ert the new data
229f0 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28   */.  h = ph & (
22a00 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x3a->size-1);.  
22a10 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b  np = &(x3a->tbl[
22a20 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a  x3a->count++]);.
22a30 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b    np->key = key;
22a40 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61  .  np->data = da
22a50 74 61 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e 68  ta;.  if( x3a->h
22a60 74 5b 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b 68  t[h] ) x3a->ht[h
22a70 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e  ]->from = &(np->
22a80 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78  next);.  np->nex
22a90 74 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a  t = x3a->ht[h];.
22aa0 20 20 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e    x3a->ht[h] = n
22ab0 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20  p;.  np->from = 
22ac0 26 28 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20  &(x3a->ht[h]);. 
22ad0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
22ae0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
22af0 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e  r to data assign
22b00 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  ed to the given 
22b10 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  key.  Return NUL
22b20 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20  L.** if no such 
22b30 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  key. */.struct s
22b40 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64  tate *State_find
22b50 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
22b60 6b 65 79 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a  key).{.  int h;.
22b70 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20    x3node *np;.. 
22b80 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65   if( x3a==0 ) re
22b90 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74  turn 0;.  h = st
22ba0 61 74 65 68 61 73 68 28 6b 65 79 29 20 26 20 28  atehash(key) & (
22bb0 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x3a->size-1);.  
22bc0 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b  np = x3a->ht[h];
22bd0 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
22be0 20 20 20 20 69 66 28 20 73 74 61 74 65 63 6d 70      if( statecmp
22bf0 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30  (np->key,key)==0
22c00 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
22c10 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
22c20 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
22c30 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
22c40 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72  /* Return an arr
22c50 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  ay of pointers t
22c60 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68  o all data in th
22c70 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20  e table..** The 
22c80 61 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65  array is obtaine
22c90 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20  d from malloc.  
22ca0 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d  Return NULL if m
22cb0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
22cc0 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72  .** problems, or
22cd0 20 69 66 20 74 68 65 20 61 72 72 61 79 20 69 73   if the array is
22ce0 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63   empty. */.struc
22cf0 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f  t state **State_
22d00 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74  arrayof().{.  st
22d10 72 75 63 74 20 73 74 61 74 65 20 2a 2a 61 72 72  ruct state **arr
22d20 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65  ay;.  int i,size
22d30 3b 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29  ;.  if( x3a==0 )
22d40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a   return 0;.  siz
22d50 65 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a  e = x3a->count;.
22d60 20 20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63    array = (struc
22d70 74 20 73 74 61 74 65 20 2a 2a 29 6d 61 6c 6c 6f  t state **)mallo
22d80 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
22d90 20 73 74 61 74 65 20 2a 29 2a 73 69 7a 65 20 29   state *)*size )
22da0 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b  ;.  if( array ){
22db0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
22dc0 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  size; i++) array
22dd0 5b 69 5d 20 3d 20 78 33 61 2d 3e 74 62 6c 5b 69  [i] = x3a->tbl[i
22de0 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65  ].data;.  }.  re
22df0 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f  turn array;.}../
22e00 2a 20 48 61 73 68 20 61 20 63 6f 6e 66 69 67 75  * Hash a configu
22e10 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54  ration */.PRIVAT
22e20 45 20 69 6e 74 20 63 6f 6e 66 69 67 68 61 73 68  E int confighash
22e30 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
22e40 61 29 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b 0a  a).{.  int h=0;.
22e50 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d    h = h*571 + a-
22e60 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20  >rp->index*37 + 
22e70 61 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e  a->dot;.  return
22e80 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20   h;.}../* There 
22e90 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
22ea0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
22eb0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
22ec0 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
22ed0 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
22ee0 20 22 78 34 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x4"..*/.struct
22ef0 20 73 5f 78 34 20 7b 0a 20 20 69 6e 74 20 73 69   s_x4 {.  int si
22f00 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
22f10 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
22f20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
22f30 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f50 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
22f60 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
22f70 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f90 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
22fa0 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
22fb0 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
22fc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22fd0 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
22fe0 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
22ff0 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 74  ruct s_x4node *t
23000 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
23010 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
23020 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64    struct s_x4nod
23030 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
23040 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
23050 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
23060 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
23070 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
23080 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
23090 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
230a0 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
230b0 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
230c0 78 34 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x4"..*/.typedef 
230d0 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
230e0 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
230f0 67 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  g *data;        
23100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23110 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63   data */.  struc
23120 74 20 73 5f 78 34 6e 6f 64 65 20 2a 6e 65 78 74  t s_x4node *next
23130 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ;   /* Next entr
23140 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
23150 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74  hash */.  struct
23160 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 66 72 6f 6d   s_x4node **from
23170 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c  ;  /* Previous l
23180 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65 3b  ink */.} x4node;
23190 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
231a0 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  ly one instance 
231b0 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68  of the array, wh
231c0 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f  ich is the follo
231d0 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73  wing */.static s
231e0 74 72 75 63 74 20 73 5f 78 34 20 2a 78 34 61 3b  truct s_x4 *x4a;
231f0 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
23200 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20  new associative 
23210 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 43 6f  array */.void Co
23220 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 29  nfigtable_init()
23230 7b 0a 20 20 69 66 28 20 78 34 61 20 29 20 72 65  {.  if( x4a ) re
23240 74 75 72 6e 3b 0a 20 20 78 34 61 20 3d 20 28 73  turn;.  x4a = (s
23250 74 72 75 63 74 20 73 5f 78 34 2a 29 6d 61 6c 6c  truct s_x4*)mall
23260 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
23270 74 20 73 5f 78 34 29 20 29 3b 0a 20 20 69 66 28  t s_x4) );.  if(
23280 20 78 34 61 20 29 7b 0a 20 20 20 20 78 34 61 2d   x4a ){.    x4a-
23290 3e 73 69 7a 65 20 3d 20 36 34 3b 0a 20 20 20 20  >size = 64;.    
232a0 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x4a->count = 0;.
232b0 20 20 20 20 78 34 61 2d 3e 74 62 6c 20 3d 20 28      x4a->tbl = (
232c0 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20  x4node*)malloc( 
232d0 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
232e0 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  4node) + sizeof(
232f0 78 34 6e 6f 64 65 2a 29 29 2a 36 34 20 29 3b 0a  x4node*))*64 );.
23300 20 20 20 20 69 66 28 20 78 34 61 2d 3e 74 62 6c      if( x4a->tbl
23310 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65  ==0 ){.      fre
23320 65 28 78 34 61 29 3b 0a 20 20 20 20 20 20 78 34  e(x4a);.      x4
23330 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
23340 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
23350 20 20 20 20 20 78 34 61 2d 3e 68 74 20 3d 20 28       x4a->ht = (
23360 78 34 6e 6f 64 65 2a 2a 29 26 28 78 34 61 2d 3e  x4node**)&(x4a->
23370 74 62 6c 5b 36 34 5d 29 3b 0a 20 20 20 20 20 20  tbl[64]);.      
23380 66 6f 72 28 69 3d 30 3b 20 69 3c 36 34 3b 20 69  for(i=0; i<64; i
23390 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x4a->ht[i] =
233a0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
233b0 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
233c0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
233d0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
233e0 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
233f0 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
23400 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
23410 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
23420 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f 6e  itten */.int Con
23430 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
23440 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64  struct config *d
23450 61 74 61 29 0a 7b 0a 20 20 78 34 6e 6f 64 65 20  ata).{.  x4node 
23460 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  *np;.  int h;.  
23470 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78  int ph;..  if( x
23480 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  4a==0 ) return 0
23490 3b 0a 20 20 70 68 20 3d 20 63 6f 6e 66 69 67 68  ;.  ph = configh
234a0 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d  ash(data);.  h =
234b0 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65   ph & (x4a->size
234c0 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d  -1);.  np = x4a-
234d0 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
234e0 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43   np ){.    if( C
234f0 6f 6e 66 69 67 63 6d 70 28 28 63 6f 6e 73 74 20  onfigcmp((const 
23500 63 68 61 72 20 2a 29 20 6e 70 2d 3e 64 61 74 61  char *) np->data
23510 2c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20  ,(const char *) 
23520 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20  data)==0 ){.    
23530 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
23540 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
23550 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e  same key is foun
23560 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46  d. */.      /* F
23570 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72  ail because over
23580 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c  write is not all
23590 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ows. */.      re
235a0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
235b0 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
235c0 0a 20 20 7d 0a 20 20 69 66 28 20 78 34 61 2d 3e  .  }.  if( x4a->
235d0 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a 65  count>=x4a->size
235e0 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20   ){.    /* Need 
235f0 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68  to make the hash
23600 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f   table bigger */
23610 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b  .    int i,size;
23620 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 34  .    struct s_x4
23630 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61   array;.    arra
23640 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20  y.size = size = 
23650 78 34 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20  x4a->size*2;.   
23660 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78   array.count = x
23670 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61  4a->count;.    a
23680 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f  rray.tbl = (x4no
23690 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20  de*)malloc(.    
236a0 20 20 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65    (sizeof(x4node
236b0 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64  ) + sizeof(x4nod
236c0 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20  e*))*size );.   
236d0 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d   if( array.tbl==
236e0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
236f0 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61  * Fail due to ma
23700 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a  lloc failure */.
23710 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28      array.ht = (
23720 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79  x4node**)&(array
23730 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20  .tbl[size]);.   
23740 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
23750 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b  ; i++) array.ht[
23760 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  i] = 0;.    for(
23770 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e  i=0; i<x4a->coun
23780 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78  t; i++){.      x
23790 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e  4node *oldnp, *n
237a0 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e  ewnp;.      oldn
237b0 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69  p = &(x4a->tbl[i
237c0 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 63 6f  ]);.      h = co
237d0 6e 66 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e  nfighash(oldnp->
237e0 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d 31 29  data) & (size-1)
237f0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20  ;.      newnp = 
23800 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b  &(array.tbl[i]);
23810 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79  .      if( array
23820 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68  .ht[h] ) array.h
23830 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
23840 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  ewnp->next);.   
23850 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d     newnp->next =
23860 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20   array.ht[h];.  
23870 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
23880 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
23890 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
238a0 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
238b0 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
238c0 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
238d0 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 34 61    }.    free(x4a
238e0 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34 61  ->tbl);.    *x4a
238f0 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
23900 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
23910 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
23920 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d  ph & (x4a->size-
23930 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34 61  1);.  np = &(x4a
23940 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74  ->tbl[x4a->count
23950 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61  ++]);.  np->data
23960 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78   = data;.  if( x
23970 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61 2d  4a->ht[h] ) x4a-
23980 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  >ht[h]->from = &
23990 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70  (np->next);.  np
239a0 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68 74  ->next = x4a->ht
239b0 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b 68  [h];.  x4a->ht[h
239c0 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72  ] = np;.  np->fr
239d0 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b 68  om = &(x4a->ht[h
239e0 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ]);.  return 1;.
239f0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
23a00 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61  ointer to data a
23a10 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67  ssigned to the g
23a20 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72  iven key.  Retur
23a30 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20  n NULL.** if no 
23a40 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72  such key. */.str
23a50 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
23a60 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 73 74 72  igtable_find(str
23a70 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29  uct config *key)
23a80 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 34  .{.  int h;.  x4
23a90 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28  node *np;..  if(
23aa0 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x4a==0 ) return
23ab0 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69 67   0;.  h = config
23ac0 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 34 61  hash(key) & (x4a
23ad0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
23ae0 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x4a->ht[h];.  
23af0 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
23b00 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 28   if( Configcmp((
23b10 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6e 70  const char *) np
23b20 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20 63 68  ->data,(const ch
23b30 61 72 20 2a 29 20 6b 65 79 29 3d 3d 30 20 29 20  ar *) key)==0 ) 
23b40 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20  break;.    np = 
23b50 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
23b60 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e  return np ? np->
23b70 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  data : 0;.}../* 
23b80 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61 20  Remove all data 
23b90 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e 20  from the table. 
23ba0 20 50 61 73 73 20 65 61 63 68 20 64 61 74 61 20   Pass each data 
23bb0 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
23bc0 22 66 22 0a 2a 2a 20 61 73 20 69 74 20 69 73 20  "f".** as it is 
23bd0 72 65 6d 6f 76 65 64 2e 20 20 28 22 66 22 20 6d  removed.  ("f" m
23be0 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61 76  ay be null to av
23bf0 6f 69 64 20 74 68 69 73 20 73 74 65 70 2e 29 20  oid this step.) 
23c00 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  */.void Configta
23c10 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74 28 2a 66  ble_clear(int(*f
23c20 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  )(struct config 
23c30 2a 29 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *)).{.  int i;. 
23c40 20 69 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20 78   if( x4a==0 || x
23c50 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20 72  4a->count==0 ) r
23c60 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 66 20 29  eturn;.  if( f )
23c70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d   for(i=0; i<x4a-
23c80 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a 66  >count; i++) (*f
23c90 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61  )(x4a->tbl[i].da
23ca0 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ta);.  for(i=0; 
23cb0 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b  i<x4a->size; i++
23cc0 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x4a->ht[i] = 0
23cd0 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d  ;.  x4a->count =
23ce0 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.